fireball/lib/whs.js
2018-12-25 17:29:22 +03:30

62444 lines
5.7 MiB

/* WhitestormJS Framework v2.2.0-beta.2 */
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
typeof define === 'function' && define.amd ? define(['exports'], factory) :
(factory((global.WHS = {})));
}(this, (function (exports) { 'use strict';
function createCommonjsModule(fn, module) {
return module = { exports: {} }, fn(module, module.exports), module.exports;
}
var runtime = createCommonjsModule(function (module) {
/**
* Copyright (c) 2014-present, Facebook, Inc.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
!(function(global) {
var Op = Object.prototype;
var hasOwn = Op.hasOwnProperty;
var undefined; // More compressible than void 0.
var $Symbol = typeof Symbol === "function" ? Symbol : {};
var iteratorSymbol = $Symbol.iterator || "@@iterator";
var asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator";
var toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag";
var inModule = 'object' === "object";
var runtime = global.regeneratorRuntime;
if (runtime) {
if (inModule) {
// If regeneratorRuntime is defined globally and we're in a module,
// make the exports object identical to regeneratorRuntime.
module.exports = runtime;
}
// Don't bother evaluating the rest of this file if the runtime was
// already defined globally.
return;
}
// Define the runtime globally (as expected by generated code) as either
// module.exports (if we're in a module) or a new, empty object.
runtime = global.regeneratorRuntime = inModule ? module.exports : {};
function wrap(innerFn, outerFn, self, tryLocsList) {
// If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.
var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;
var generator = Object.create(protoGenerator.prototype);
var context = new Context(tryLocsList || []);
// The ._invoke method unifies the implementations of the .next,
// .throw, and .return methods.
generator._invoke = makeInvokeMethod(innerFn, self, context);
return generator;
}
runtime.wrap = wrap;
// Try/catch helper to minimize deoptimizations. Returns a completion
// record like context.tryEntries[i].completion. This interface could
// have been (and was previously) designed to take a closure to be
// invoked without arguments, but in all the cases we care about we
// already have an existing method we want to call, so there's no need
// to create a new function object. We can even get away with assuming
// the method takes exactly one argument, since that happens to be true
// in every case, so we don't have to touch the arguments object. The
// only additional allocation required is the completion record, which
// has a stable shape and so hopefully should be cheap to allocate.
function tryCatch(fn, obj, arg) {
try {
return { type: "normal", arg: fn.call(obj, arg) };
} catch (err) {
return { type: "throw", arg: err };
}
}
var GenStateSuspendedStart = "suspendedStart";
var GenStateSuspendedYield = "suspendedYield";
var GenStateExecuting = "executing";
var GenStateCompleted = "completed";
// Returning this object from the innerFn has the same effect as
// breaking out of the dispatch switch statement.
var ContinueSentinel = {};
// Dummy constructor functions that we use as the .constructor and
// .constructor.prototype properties for functions that return Generator
// objects. For full spec compliance, you may wish to configure your
// minifier not to mangle the names of these two functions.
function Generator() {}
function GeneratorFunction() {}
function GeneratorFunctionPrototype() {}
// This is a polyfill for %IteratorPrototype% for environments that
// don't natively support it.
var IteratorPrototype = {};
IteratorPrototype[iteratorSymbol] = function () {
return this;
};
var getProto = Object.getPrototypeOf;
var NativeIteratorPrototype = getProto && getProto(getProto(values([])));
if (NativeIteratorPrototype &&
NativeIteratorPrototype !== Op &&
hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {
// This environment has a native %IteratorPrototype%; use it instead
// of the polyfill.
IteratorPrototype = NativeIteratorPrototype;
}
var Gp = GeneratorFunctionPrototype.prototype =
Generator.prototype = Object.create(IteratorPrototype);
GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;
GeneratorFunctionPrototype.constructor = GeneratorFunction;
GeneratorFunctionPrototype[toStringTagSymbol] =
GeneratorFunction.displayName = "GeneratorFunction";
// Helper for defining the .next, .throw, and .return methods of the
// Iterator interface in terms of a single ._invoke method.
function defineIteratorMethods(prototype) {
["next", "throw", "return"].forEach(function(method) {
prototype[method] = function(arg) {
return this._invoke(method, arg);
};
});
}
runtime.isGeneratorFunction = function(genFun) {
var ctor = typeof genFun === "function" && genFun.constructor;
return ctor
? ctor === GeneratorFunction ||
// For the native GeneratorFunction constructor, the best we can
// do is to check its .name property.
(ctor.displayName || ctor.name) === "GeneratorFunction"
: false;
};
runtime.mark = function(genFun) {
if (Object.setPrototypeOf) {
Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);
} else {
genFun.__proto__ = GeneratorFunctionPrototype;
if (!(toStringTagSymbol in genFun)) {
genFun[toStringTagSymbol] = "GeneratorFunction";
}
}
genFun.prototype = Object.create(Gp);
return genFun;
};
// Within the body of any async function, `await x` is transformed to
// `yield regeneratorRuntime.awrap(x)`, so that the runtime can test
// `hasOwn.call(value, "__await")` to determine if the yielded value is
// meant to be awaited.
runtime.awrap = function(arg) {
return { __await: arg };
};
function AsyncIterator(generator) {
function invoke(method, arg, resolve, reject) {
var record = tryCatch(generator[method], generator, arg);
if (record.type === "throw") {
reject(record.arg);
} else {
var result = record.arg;
var value = result.value;
if (value &&
typeof value === "object" &&
hasOwn.call(value, "__await")) {
return Promise.resolve(value.__await).then(function(value) {
invoke("next", value, resolve, reject);
}, function(err) {
invoke("throw", err, resolve, reject);
});
}
return Promise.resolve(value).then(function(unwrapped) {
// When a yielded Promise is resolved, its final value becomes
// the .value of the Promise<{value,done}> result for the
// current iteration. If the Promise is rejected, however, the
// result for this iteration will be rejected with the same
// reason. Note that rejections of yielded Promises are not
// thrown back into the generator function, as is the case
// when an awaited Promise is rejected. This difference in
// behavior between yield and await is important, because it
// allows the consumer to decide what to do with the yielded
// rejection (swallow it and continue, manually .throw it back
// into the generator, abandon iteration, whatever). With
// await, by contrast, there is no opportunity to examine the
// rejection reason outside the generator function, so the
// only option is to throw it from the await expression, and
// let the generator function handle the exception.
result.value = unwrapped;
resolve(result);
}, reject);
}
}
var previousPromise;
function enqueue(method, arg) {
function callInvokeWithMethodAndArg() {
return new Promise(function(resolve, reject) {
invoke(method, arg, resolve, reject);
});
}
return previousPromise =
// If enqueue has been called before, then we want to wait until
// all previous Promises have been resolved before calling invoke,
// so that results are always delivered in the correct order. If
// enqueue has not been called before, then it is important to
// call invoke immediately, without waiting on a callback to fire,
// so that the async generator function has the opportunity to do
// any necessary setup in a predictable way. This predictability
// is why the Promise constructor synchronously invokes its
// executor callback, and why async functions synchronously
// execute code before the first await. Since we implement simple
// async functions in terms of async generators, it is especially
// important to get this right, even though it requires care.
previousPromise ? previousPromise.then(
callInvokeWithMethodAndArg,
// Avoid propagating failures to Promises returned by later
// invocations of the iterator.
callInvokeWithMethodAndArg
) : callInvokeWithMethodAndArg();
}
// Define the unified helper method that is used to implement .next,
// .throw, and .return (see defineIteratorMethods).
this._invoke = enqueue;
}
defineIteratorMethods(AsyncIterator.prototype);
AsyncIterator.prototype[asyncIteratorSymbol] = function () {
return this;
};
runtime.AsyncIterator = AsyncIterator;
// Note that simple async functions are implemented on top of
// AsyncIterator objects; they just return a Promise for the value of
// the final result produced by the iterator.
runtime.async = function(innerFn, outerFn, self, tryLocsList) {
var iter = new AsyncIterator(
wrap(innerFn, outerFn, self, tryLocsList)
);
return runtime.isGeneratorFunction(outerFn)
? iter // If outerFn is a generator, return the full iterator.
: iter.next().then(function(result) {
return result.done ? result.value : iter.next();
});
};
function makeInvokeMethod(innerFn, self, context) {
var state = GenStateSuspendedStart;
return function invoke(method, arg) {
if (state === GenStateExecuting) {
throw new Error("Generator is already running");
}
if (state === GenStateCompleted) {
if (method === "throw") {
throw arg;
}
// Be forgiving, per 25.3.3.3.3 of the spec:
// https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume
return doneResult();
}
context.method = method;
context.arg = arg;
while (true) {
var delegate = context.delegate;
if (delegate) {
var delegateResult = maybeInvokeDelegate(delegate, context);
if (delegateResult) {
if (delegateResult === ContinueSentinel) continue;
return delegateResult;
}
}
if (context.method === "next") {
// Setting context._sent for legacy support of Babel's
// function.sent implementation.
context.sent = context._sent = context.arg;
} else if (context.method === "throw") {
if (state === GenStateSuspendedStart) {
state = GenStateCompleted;
throw context.arg;
}
context.dispatchException(context.arg);
} else if (context.method === "return") {
context.abrupt("return", context.arg);
}
state = GenStateExecuting;
var record = tryCatch(innerFn, self, context);
if (record.type === "normal") {
// If an exception is thrown from innerFn, we leave state ===
// GenStateExecuting and loop back for another invocation.
state = context.done
? GenStateCompleted
: GenStateSuspendedYield;
if (record.arg === ContinueSentinel) {
continue;
}
return {
value: record.arg,
done: context.done
};
} else if (record.type === "throw") {
state = GenStateCompleted;
// Dispatch the exception by looping back around to the
// context.dispatchException(context.arg) call above.
context.method = "throw";
context.arg = record.arg;
}
}
};
}
// Call delegate.iterator[context.method](context.arg) and handle the
// result, either by returning a { value, done } result from the
// delegate iterator, or by modifying context.method and context.arg,
// setting context.delegate to null, and returning the ContinueSentinel.
function maybeInvokeDelegate(delegate, context) {
var method = delegate.iterator[context.method];
if (method === undefined) {
// A .throw or .return when the delegate iterator has no .throw
// method always terminates the yield* loop.
context.delegate = null;
if (context.method === "throw") {
if (delegate.iterator.return) {
// If the delegate iterator has a return method, give it a
// chance to clean up.
context.method = "return";
context.arg = undefined;
maybeInvokeDelegate(delegate, context);
if (context.method === "throw") {
// If maybeInvokeDelegate(context) changed context.method from
// "return" to "throw", let that override the TypeError below.
return ContinueSentinel;
}
}
context.method = "throw";
context.arg = new TypeError(
"The iterator does not provide a 'throw' method");
}
return ContinueSentinel;
}
var record = tryCatch(method, delegate.iterator, context.arg);
if (record.type === "throw") {
context.method = "throw";
context.arg = record.arg;
context.delegate = null;
return ContinueSentinel;
}
var info = record.arg;
if (! info) {
context.method = "throw";
context.arg = new TypeError("iterator result is not an object");
context.delegate = null;
return ContinueSentinel;
}
if (info.done) {
// Assign the result of the finished delegate to the temporary
// variable specified by delegate.resultName (see delegateYield).
context[delegate.resultName] = info.value;
// Resume execution at the desired location (see delegateYield).
context.next = delegate.nextLoc;
// If context.method was "throw" but the delegate handled the
// exception, let the outer generator proceed normally. If
// context.method was "next", forget context.arg since it has been
// "consumed" by the delegate iterator. If context.method was
// "return", allow the original .return call to continue in the
// outer generator.
if (context.method !== "return") {
context.method = "next";
context.arg = undefined;
}
} else {
// Re-yield the result returned by the delegate method.
return info;
}
// The delegate iterator is finished, so forget it and continue with
// the outer generator.
context.delegate = null;
return ContinueSentinel;
}
// Define Generator.prototype.{next,throw,return} in terms of the
// unified ._invoke helper method.
defineIteratorMethods(Gp);
Gp[toStringTagSymbol] = "Generator";
// A Generator should always return itself as the iterator object when the
// @@iterator function is called on it. Some browsers' implementations of the
// iterator prototype chain incorrectly implement this, causing the Generator
// object to not be returned from this call. This ensures that doesn't happen.
// See https://github.com/facebook/regenerator/issues/274 for more details.
Gp[iteratorSymbol] = function() {
return this;
};
Gp.toString = function() {
return "[object Generator]";
};
function pushTryEntry(locs) {
var entry = { tryLoc: locs[0] };
if (1 in locs) {
entry.catchLoc = locs[1];
}
if (2 in locs) {
entry.finallyLoc = locs[2];
entry.afterLoc = locs[3];
}
this.tryEntries.push(entry);
}
function resetTryEntry(entry) {
var record = entry.completion || {};
record.type = "normal";
delete record.arg;
entry.completion = record;
}
function Context(tryLocsList) {
// The root entry object (effectively a try statement without a catch
// or a finally block) gives us a place to store values thrown from
// locations where there is no enclosing try statement.
this.tryEntries = [{ tryLoc: "root" }];
tryLocsList.forEach(pushTryEntry, this);
this.reset(true);
}
runtime.keys = function(object) {
var keys = [];
for (var key in object) {
keys.push(key);
}
keys.reverse();
// Rather than returning an object with a next method, we keep
// things simple and return the next function itself.
return function next() {
while (keys.length) {
var key = keys.pop();
if (key in object) {
next.value = key;
next.done = false;
return next;
}
}
// To avoid creating an additional object, we just hang the .value
// and .done properties off the next function object itself. This
// also ensures that the minifier will not anonymize the function.
next.done = true;
return next;
};
};
function values(iterable) {
if (iterable) {
var iteratorMethod = iterable[iteratorSymbol];
if (iteratorMethod) {
return iteratorMethod.call(iterable);
}
if (typeof iterable.next === "function") {
return iterable;
}
if (!isNaN(iterable.length)) {
var i = -1, next = function next() {
while (++i < iterable.length) {
if (hasOwn.call(iterable, i)) {
next.value = iterable[i];
next.done = false;
return next;
}
}
next.value = undefined;
next.done = true;
return next;
};
return next.next = next;
}
}
// Return an iterator with no values.
return { next: doneResult };
}
runtime.values = values;
function doneResult() {
return { value: undefined, done: true };
}
Context.prototype = {
constructor: Context,
reset: function(skipTempReset) {
this.prev = 0;
this.next = 0;
// Resetting context._sent for legacy support of Babel's
// function.sent implementation.
this.sent = this._sent = undefined;
this.done = false;
this.delegate = null;
this.method = "next";
this.arg = undefined;
this.tryEntries.forEach(resetTryEntry);
if (!skipTempReset) {
for (var name in this) {
// Not sure about the optimal order of these conditions:
if (name.charAt(0) === "t" &&
hasOwn.call(this, name) &&
!isNaN(+name.slice(1))) {
this[name] = undefined;
}
}
}
},
stop: function() {
this.done = true;
var rootEntry = this.tryEntries[0];
var rootRecord = rootEntry.completion;
if (rootRecord.type === "throw") {
throw rootRecord.arg;
}
return this.rval;
},
dispatchException: function(exception) {
if (this.done) {
throw exception;
}
var context = this;
function handle(loc, caught) {
record.type = "throw";
record.arg = exception;
context.next = loc;
if (caught) {
// If the dispatched exception was caught by a catch block,
// then let that catch block handle the exception normally.
context.method = "next";
context.arg = undefined;
}
return !! caught;
}
for (var i = this.tryEntries.length - 1; i >= 0; --i) {
var entry = this.tryEntries[i];
var record = entry.completion;
if (entry.tryLoc === "root") {
// Exception thrown outside of any try block that could handle
// it, so set the completion value of the entire function to
// throw the exception.
return handle("end");
}
if (entry.tryLoc <= this.prev) {
var hasCatch = hasOwn.call(entry, "catchLoc");
var hasFinally = hasOwn.call(entry, "finallyLoc");
if (hasCatch && hasFinally) {
if (this.prev < entry.catchLoc) {
return handle(entry.catchLoc, true);
} else if (this.prev < entry.finallyLoc) {
return handle(entry.finallyLoc);
}
} else if (hasCatch) {
if (this.prev < entry.catchLoc) {
return handle(entry.catchLoc, true);
}
} else if (hasFinally) {
if (this.prev < entry.finallyLoc) {
return handle(entry.finallyLoc);
}
} else {
throw new Error("try statement without catch or finally");
}
}
}
},
abrupt: function(type, arg) {
for (var i = this.tryEntries.length - 1; i >= 0; --i) {
var entry = this.tryEntries[i];
if (entry.tryLoc <= this.prev &&
hasOwn.call(entry, "finallyLoc") &&
this.prev < entry.finallyLoc) {
var finallyEntry = entry;
break;
}
}
if (finallyEntry &&
(type === "break" ||
type === "continue") &&
finallyEntry.tryLoc <= arg &&
arg <= finallyEntry.finallyLoc) {
// Ignore the finally entry if control is not jumping to a
// location outside the try/catch block.
finallyEntry = null;
}
var record = finallyEntry ? finallyEntry.completion : {};
record.type = type;
record.arg = arg;
if (finallyEntry) {
this.method = "next";
this.next = finallyEntry.finallyLoc;
return ContinueSentinel;
}
return this.complete(record);
},
complete: function(record, afterLoc) {
if (record.type === "throw") {
throw record.arg;
}
if (record.type === "break" ||
record.type === "continue") {
this.next = record.arg;
} else if (record.type === "return") {
this.rval = this.arg = record.arg;
this.method = "return";
this.next = "end";
} else if (record.type === "normal" && afterLoc) {
this.next = afterLoc;
}
return ContinueSentinel;
},
finish: function(finallyLoc) {
for (var i = this.tryEntries.length - 1; i >= 0; --i) {
var entry = this.tryEntries[i];
if (entry.finallyLoc === finallyLoc) {
this.complete(entry.completion, entry.afterLoc);
resetTryEntry(entry);
return ContinueSentinel;
}
}
},
"catch": function(tryLoc) {
for (var i = this.tryEntries.length - 1; i >= 0; --i) {
var entry = this.tryEntries[i];
if (entry.tryLoc === tryLoc) {
var record = entry.completion;
if (record.type === "throw") {
var thrown = record.arg;
resetTryEntry(entry);
}
return thrown;
}
}
// The context.catch method must only be called with a location
// argument that corresponds to a known catch block.
throw new Error("illegal catch attempt");
},
delegateYield: function(iterable, resultName, nextLoc) {
this.delegate = {
iterator: values(iterable),
resultName: resultName,
nextLoc: nextLoc
};
if (this.method === "next") {
// Deliberately forget the last sent value so that we don't
// accidentally pass it on to the delegate.
this.arg = undefined;
}
return ContinueSentinel;
}
};
})(
// In sloppy mode, unbound `this` refers to the global object, fallback to
// Function constructor if we're in global strict mode. That is sadly a form
// of indirect eval which violates Content Security Policy.
(function() { return this })() || Function("return this")()
);
});
/**
* Copyright (c) 2014-present, Facebook, Inc.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
// This method of obtaining a reference to the global object needs to be
// kept identical to the way it is obtained in runtime.js
var g = (function() { return this })() || Function("return this")();
// Use `getOwnPropertyNames` because not all browsers support calling
// `hasOwnProperty` on the global `self` object in a worker. See #183.
var hadRuntime = g.regeneratorRuntime &&
Object.getOwnPropertyNames(g).indexOf("regeneratorRuntime") >= 0;
// Save the old regeneratorRuntime in case it needs to be restored later.
var oldRuntime = hadRuntime && g.regeneratorRuntime;
// Force reevalutation of runtime.js.
g.regeneratorRuntime = undefined;
var runtimeModule = runtime;
if (hadRuntime) {
// Restore the original runtime.
g.regeneratorRuntime = oldRuntime;
} else {
// Remove the global property added by runtime.js.
try {
delete g.regeneratorRuntime;
} catch(e) {
g.regeneratorRuntime = undefined;
}
}
var regenerator = runtimeModule;
// 7.1.4 ToInteger
var ceil = Math.ceil;
var floor = Math.floor;
var _toInteger = function (it) {
return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);
};
// 7.2.1 RequireObjectCoercible(argument)
var _defined = function (it) {
if (it == undefined) throw TypeError("Can't call method on " + it);
return it;
};
// true -> String#at
// false -> String#codePointAt
var _stringAt = function (TO_STRING) {
return function (that, pos) {
var s = String(_defined(that));
var i = _toInteger(pos);
var l = s.length;
var a, b;
if (i < 0 || i >= l) return TO_STRING ? '' : undefined;
a = s.charCodeAt(i);
return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff
? TO_STRING ? s.charAt(i) : a
: TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;
};
};
var _library = true;
var _global = createCommonjsModule(function (module) {
// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028
var global = module.exports = typeof window != 'undefined' && window.Math == Math
? window : typeof self != 'undefined' && self.Math == Math ? self
// eslint-disable-next-line no-new-func
: Function('return this')();
if (typeof __g == 'number') __g = global; // eslint-disable-line no-undef
});
var _core = createCommonjsModule(function (module) {
var core = module.exports = { version: '2.5.6' };
if (typeof __e == 'number') __e = core; // eslint-disable-line no-undef
});
var _core_1 = _core.version;
var _aFunction = function (it) {
if (typeof it != 'function') throw TypeError(it + ' is not a function!');
return it;
};
// optional / simple context binding
var _ctx = function (fn, that, length) {
_aFunction(fn);
if (that === undefined) return fn;
switch (length) {
case 1: return function (a) {
return fn.call(that, a);
};
case 2: return function (a, b) {
return fn.call(that, a, b);
};
case 3: return function (a, b, c) {
return fn.call(that, a, b, c);
};
}
return function (/* ...args */) {
return fn.apply(that, arguments);
};
};
var _isObject = function (it) {
return typeof it === 'object' ? it !== null : typeof it === 'function';
};
var _anObject = function (it) {
if (!_isObject(it)) throw TypeError(it + ' is not an object!');
return it;
};
var _fails = function (exec) {
try {
return !!exec();
} catch (e) {
return true;
}
};
// Thank's IE8 for his funny defineProperty
var _descriptors = !_fails(function () {
return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;
});
var document$1 = _global.document;
// typeof document.createElement is 'object' in old IE
var is = _isObject(document$1) && _isObject(document$1.createElement);
var _domCreate = function (it) {
return is ? document$1.createElement(it) : {};
};
var _ie8DomDefine = !_descriptors && !_fails(function () {
return Object.defineProperty(_domCreate('div'), 'a', { get: function () { return 7; } }).a != 7;
});
// 7.1.1 ToPrimitive(input [, PreferredType])
// instead of the ES6 spec version, we didn't implement @@toPrimitive case
// and the second argument - flag - preferred type is a string
var _toPrimitive = function (it, S) {
if (!_isObject(it)) return it;
var fn, val;
if (S && typeof (fn = it.toString) == 'function' && !_isObject(val = fn.call(it))) return val;
if (typeof (fn = it.valueOf) == 'function' && !_isObject(val = fn.call(it))) return val;
if (!S && typeof (fn = it.toString) == 'function' && !_isObject(val = fn.call(it))) return val;
throw TypeError("Can't convert object to primitive value");
};
var dP = Object.defineProperty;
var f = _descriptors ? Object.defineProperty : function defineProperty(O, P, Attributes) {
_anObject(O);
P = _toPrimitive(P, true);
_anObject(Attributes);
if (_ie8DomDefine) try {
return dP(O, P, Attributes);
} catch (e) { /* empty */ }
if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!');
if ('value' in Attributes) O[P] = Attributes.value;
return O;
};
var _objectDp = {
f: f
};
var _propertyDesc = function (bitmap, value) {
return {
enumerable: !(bitmap & 1),
configurable: !(bitmap & 2),
writable: !(bitmap & 4),
value: value
};
};
var _hide = _descriptors ? function (object, key, value) {
return _objectDp.f(object, key, _propertyDesc(1, value));
} : function (object, key, value) {
object[key] = value;
return object;
};
var hasOwnProperty = {}.hasOwnProperty;
var _has = function (it, key) {
return hasOwnProperty.call(it, key);
};
var PROTOTYPE = 'prototype';
var $export = function (type, name, source) {
var IS_FORCED = type & $export.F;
var IS_GLOBAL = type & $export.G;
var IS_STATIC = type & $export.S;
var IS_PROTO = type & $export.P;
var IS_BIND = type & $export.B;
var IS_WRAP = type & $export.W;
var exports = IS_GLOBAL ? _core : _core[name] || (_core[name] = {});
var expProto = exports[PROTOTYPE];
var target = IS_GLOBAL ? _global : IS_STATIC ? _global[name] : (_global[name] || {})[PROTOTYPE];
var key, own, out;
if (IS_GLOBAL) source = name;
for (key in source) {
// contains in native
own = !IS_FORCED && target && target[key] !== undefined;
if (own && _has(exports, key)) continue;
// export native or passed
out = own ? target[key] : source[key];
// prevent global pollution for namespaces
exports[key] = IS_GLOBAL && typeof target[key] != 'function' ? source[key]
// bind timers to global for call from export context
: IS_BIND && own ? _ctx(out, _global)
// wrap global constructors for prevent change them in library
: IS_WRAP && target[key] == out ? (function (C) {
var F = function (a, b, c) {
if (this instanceof C) {
switch (arguments.length) {
case 0: return new C();
case 1: return new C(a);
case 2: return new C(a, b);
} return new C(a, b, c);
} return C.apply(this, arguments);
};
F[PROTOTYPE] = C[PROTOTYPE];
return F;
// make static versions for prototype methods
})(out) : IS_PROTO && typeof out == 'function' ? _ctx(Function.call, out) : out;
// export proto methods to core.%CONSTRUCTOR%.methods.%NAME%
if (IS_PROTO) {
(exports.virtual || (exports.virtual = {}))[key] = out;
// export proto methods to core.%CONSTRUCTOR%.prototype.%NAME%
if (type & $export.R && expProto && !expProto[key]) _hide(expProto, key, out);
}
}
};
// type bitmap
$export.F = 1; // forced
$export.G = 2; // global
$export.S = 4; // static
$export.P = 8; // proto
$export.B = 16; // bind
$export.W = 32; // wrap
$export.U = 64; // safe
$export.R = 128; // real proto method for `library`
var _export = $export;
var _redefine = _hide;
var _iterators = {};
var toString = {}.toString;
var _cof = function (it) {
return toString.call(it).slice(8, -1);
};
// fallback for non-array-like ES3 and non-enumerable old V8 strings
// eslint-disable-next-line no-prototype-builtins
var _iobject = Object('z').propertyIsEnumerable(0) ? Object : function (it) {
return _cof(it) == 'String' ? it.split('') : Object(it);
};
// to indexed object, toObject with fallback for non-array-like ES3 strings
var _toIobject = function (it) {
return _iobject(_defined(it));
};
// 7.1.15 ToLength
var min = Math.min;
var _toLength = function (it) {
return it > 0 ? min(_toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991
};
var max = Math.max;
var min$1 = Math.min;
var _toAbsoluteIndex = function (index, length) {
index = _toInteger(index);
return index < 0 ? max(index + length, 0) : min$1(index, length);
};
// false -> Array#indexOf
// true -> Array#includes
var _arrayIncludes = function (IS_INCLUDES) {
return function ($this, el, fromIndex) {
var O = _toIobject($this);
var length = _toLength(O.length);
var index = _toAbsoluteIndex(fromIndex, length);
var value;
// Array#includes uses SameValueZero equality algorithm
// eslint-disable-next-line no-self-compare
if (IS_INCLUDES && el != el) while (length > index) {
value = O[index++];
// eslint-disable-next-line no-self-compare
if (value != value) return true;
// Array#indexOf ignores holes, Array#includes - not
} else for (;length > index; index++) if (IS_INCLUDES || index in O) {
if (O[index] === el) return IS_INCLUDES || index || 0;
} return !IS_INCLUDES && -1;
};
};
var _shared = createCommonjsModule(function (module) {
var SHARED = '__core-js_shared__';
var store = _global[SHARED] || (_global[SHARED] = {});
(module.exports = function (key, value) {
return store[key] || (store[key] = value !== undefined ? value : {});
})('versions', []).push({
version: _core.version,
mode: _library ? 'pure' : 'global',
copyright: '© 2018 Denis Pushkarev (zloirock.ru)'
});
});
var id = 0;
var px = Math.random();
var _uid = function (key) {
return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));
};
var shared = _shared('keys');
var _sharedKey = function (key) {
return shared[key] || (shared[key] = _uid(key));
};
var arrayIndexOf = _arrayIncludes(false);
var IE_PROTO = _sharedKey('IE_PROTO');
var _objectKeysInternal = function (object, names) {
var O = _toIobject(object);
var i = 0;
var result = [];
var key;
for (key in O) if (key != IE_PROTO) _has(O, key) && result.push(key);
// Don't enum bug & hidden keys
while (names.length > i) if (_has(O, key = names[i++])) {
~arrayIndexOf(result, key) || result.push(key);
}
return result;
};
// IE 8- don't enum bug keys
var _enumBugKeys = (
'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'
).split(',');
// 19.1.2.14 / 15.2.3.14 Object.keys(O)
var _objectKeys = Object.keys || function keys(O) {
return _objectKeysInternal(O, _enumBugKeys);
};
var _objectDps = _descriptors ? Object.defineProperties : function defineProperties(O, Properties) {
_anObject(O);
var keys = _objectKeys(Properties);
var length = keys.length;
var i = 0;
var P;
while (length > i) _objectDp.f(O, P = keys[i++], Properties[P]);
return O;
};
var document$2 = _global.document;
var _html = document$2 && document$2.documentElement;
// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])
var IE_PROTO$1 = _sharedKey('IE_PROTO');
var Empty = function () { /* empty */ };
var PROTOTYPE$1 = 'prototype';
// Create object with fake `null` prototype: use iframe Object with cleared prototype
var createDict = function () {
// Thrash, waste and sodomy: IE GC bug
var iframe = _domCreate('iframe');
var i = _enumBugKeys.length;
var lt = '<';
var gt = '>';
var iframeDocument;
iframe.style.display = 'none';
_html.appendChild(iframe);
iframe.src = 'javascript:'; // eslint-disable-line no-script-url
// createDict = iframe.contentWindow.Object;
// html.removeChild(iframe);
iframeDocument = iframe.contentWindow.document;
iframeDocument.open();
iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt);
iframeDocument.close();
createDict = iframeDocument.F;
while (i--) delete createDict[PROTOTYPE$1][_enumBugKeys[i]];
return createDict();
};
var _objectCreate = Object.create || function create(O, Properties) {
var result;
if (O !== null) {
Empty[PROTOTYPE$1] = _anObject(O);
result = new Empty();
Empty[PROTOTYPE$1] = null;
// add "__proto__" for Object.getPrototypeOf polyfill
result[IE_PROTO$1] = O;
} else result = createDict();
return Properties === undefined ? result : _objectDps(result, Properties);
};
var _wks = createCommonjsModule(function (module) {
var store = _shared('wks');
var Symbol = _global.Symbol;
var USE_SYMBOL = typeof Symbol == 'function';
var $exports = module.exports = function (name) {
return store[name] || (store[name] =
USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : _uid)('Symbol.' + name));
};
$exports.store = store;
});
var def = _objectDp.f;
var TAG = _wks('toStringTag');
var _setToStringTag = function (it, tag, stat) {
if (it && !_has(it = stat ? it : it.prototype, TAG)) def(it, TAG, { configurable: true, value: tag });
};
var IteratorPrototype = {};
// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()
_hide(IteratorPrototype, _wks('iterator'), function () { return this; });
var _iterCreate = function (Constructor, NAME, next) {
Constructor.prototype = _objectCreate(IteratorPrototype, { next: _propertyDesc(1, next) });
_setToStringTag(Constructor, NAME + ' Iterator');
};
// 7.1.13 ToObject(argument)
var _toObject = function (it) {
return Object(_defined(it));
};
// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)
var IE_PROTO$2 = _sharedKey('IE_PROTO');
var ObjectProto = Object.prototype;
var _objectGpo = Object.getPrototypeOf || function (O) {
O = _toObject(O);
if (_has(O, IE_PROTO$2)) return O[IE_PROTO$2];
if (typeof O.constructor == 'function' && O instanceof O.constructor) {
return O.constructor.prototype;
} return O instanceof Object ? ObjectProto : null;
};
var ITERATOR = _wks('iterator');
var BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next`
var FF_ITERATOR = '@@iterator';
var KEYS = 'keys';
var VALUES = 'values';
var returnThis = function () { return this; };
var _iterDefine = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) {
_iterCreate(Constructor, NAME, next);
var getMethod = function (kind) {
if (!BUGGY && kind in proto) return proto[kind];
switch (kind) {
case KEYS: return function keys() { return new Constructor(this, kind); };
case VALUES: return function values() { return new Constructor(this, kind); };
} return function entries() { return new Constructor(this, kind); };
};
var TAG = NAME + ' Iterator';
var DEF_VALUES = DEFAULT == VALUES;
var VALUES_BUG = false;
var proto = Base.prototype;
var $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT];
var $default = $native || getMethod(DEFAULT);
var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined;
var $anyNative = NAME == 'Array' ? proto.entries || $native : $native;
var methods, key, IteratorPrototype;
// Fix native
if ($anyNative) {
IteratorPrototype = _objectGpo($anyNative.call(new Base()));
if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) {
// Set @@toStringTag to native iterators
_setToStringTag(IteratorPrototype, TAG, true);
// fix for some old engines
if (!_library && typeof IteratorPrototype[ITERATOR] != 'function') _hide(IteratorPrototype, ITERATOR, returnThis);
}
}
// fix Array#{values, @@iterator}.name in V8 / FF
if (DEF_VALUES && $native && $native.name !== VALUES) {
VALUES_BUG = true;
$default = function values() { return $native.call(this); };
}
// Define iterator
if ((!_library || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) {
_hide(proto, ITERATOR, $default);
}
// Plug for library
_iterators[NAME] = $default;
_iterators[TAG] = returnThis;
if (DEFAULT) {
methods = {
values: DEF_VALUES ? $default : getMethod(VALUES),
keys: IS_SET ? $default : getMethod(KEYS),
entries: $entries
};
if (FORCED) for (key in methods) {
if (!(key in proto)) _redefine(proto, key, methods[key]);
} else _export(_export.P + _export.F * (BUGGY || VALUES_BUG), NAME, methods);
}
return methods;
};
var $at = _stringAt(true);
// 21.1.3.27 String.prototype[@@iterator]()
_iterDefine(String, 'String', function (iterated) {
this._t = String(iterated); // target
this._i = 0; // next index
// 21.1.5.2.1 %StringIteratorPrototype%.next()
}, function () {
var O = this._t;
var index = this._i;
var point;
if (index >= O.length) return { value: undefined, done: true };
point = $at(O, index);
this._i += point.length;
return { value: point, done: false };
});
var _iterStep = function (done, value) {
return { value: value, done: !!done };
};
// 22.1.3.4 Array.prototype.entries()
// 22.1.3.13 Array.prototype.keys()
// 22.1.3.29 Array.prototype.values()
// 22.1.3.30 Array.prototype[@@iterator]()
var es6_array_iterator = _iterDefine(Array, 'Array', function (iterated, kind) {
this._t = _toIobject(iterated); // target
this._i = 0; // next index
this._k = kind; // kind
// 22.1.5.2.1 %ArrayIteratorPrototype%.next()
}, function () {
var O = this._t;
var kind = this._k;
var index = this._i++;
if (!O || index >= O.length) {
this._t = undefined;
return _iterStep(1);
}
if (kind == 'keys') return _iterStep(0, index);
if (kind == 'values') return _iterStep(0, O[index]);
return _iterStep(0, [index, O[index]]);
}, 'values');
// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7)
_iterators.Arguments = _iterators.Array;
var TO_STRING_TAG = _wks('toStringTag');
var DOMIterables = ('CSSRuleList,CSSStyleDeclaration,CSSValueList,ClientRectList,DOMRectList,DOMStringList,' +
'DOMTokenList,DataTransferItemList,FileList,HTMLAllCollection,HTMLCollection,HTMLFormElement,HTMLSelectElement,' +
'MediaList,MimeTypeArray,NamedNodeMap,NodeList,PaintRequestList,Plugin,PluginArray,SVGLengthList,SVGNumberList,' +
'SVGPathSegList,SVGPointList,SVGStringList,SVGTransformList,SourceBufferList,StyleSheetList,TextTrackCueList,' +
'TextTrackList,TouchList').split(',');
for (var i = 0; i < DOMIterables.length; i++) {
var NAME = DOMIterables[i];
var Collection = _global[NAME];
var proto = Collection && Collection.prototype;
if (proto && !proto[TO_STRING_TAG]) _hide(proto, TO_STRING_TAG, NAME);
_iterators[NAME] = _iterators.Array;
}
// getting tag from 19.1.3.6 Object.prototype.toString()
var TAG$1 = _wks('toStringTag');
// ES3 wrong here
var ARG = _cof(function () { return arguments; }()) == 'Arguments';
// fallback for IE11 Script Access Denied error
var tryGet = function (it, key) {
try {
return it[key];
} catch (e) { /* empty */ }
};
var _classof = function (it) {
var O, T, B;
return it === undefined ? 'Undefined' : it === null ? 'Null'
// @@toStringTag case
: typeof (T = tryGet(O = Object(it), TAG$1)) == 'string' ? T
// builtinTag case
: ARG ? _cof(O)
// ES3 arguments fallback
: (B = _cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B;
};
var _anInstance = function (it, Constructor, name, forbiddenField) {
if (!(it instanceof Constructor) || (forbiddenField !== undefined && forbiddenField in it)) {
throw TypeError(name + ': incorrect invocation!');
} return it;
};
// call something on iterator step with safe closing on error
var _iterCall = function (iterator, fn, value, entries) {
try {
return entries ? fn(_anObject(value)[0], value[1]) : fn(value);
// 7.4.6 IteratorClose(iterator, completion)
} catch (e) {
var ret = iterator['return'];
if (ret !== undefined) _anObject(ret.call(iterator));
throw e;
}
};
// check on default Array iterator
var ITERATOR$1 = _wks('iterator');
var ArrayProto = Array.prototype;
var _isArrayIter = function (it) {
return it !== undefined && (_iterators.Array === it || ArrayProto[ITERATOR$1] === it);
};
var ITERATOR$2 = _wks('iterator');
var core_getIteratorMethod = _core.getIteratorMethod = function (it) {
if (it != undefined) return it[ITERATOR$2]
|| it['@@iterator']
|| _iterators[_classof(it)];
};
var _forOf = createCommonjsModule(function (module) {
var BREAK = {};
var RETURN = {};
var exports = module.exports = function (iterable, entries, fn, that, ITERATOR) {
var iterFn = ITERATOR ? function () { return iterable; } : core_getIteratorMethod(iterable);
var f = _ctx(fn, that, entries ? 2 : 1);
var index = 0;
var length, step, iterator, result;
if (typeof iterFn != 'function') throw TypeError(iterable + ' is not iterable!');
// fast case for arrays with default iterator
if (_isArrayIter(iterFn)) for (length = _toLength(iterable.length); length > index; index++) {
result = entries ? f(_anObject(step = iterable[index])[0], step[1]) : f(iterable[index]);
if (result === BREAK || result === RETURN) return result;
} else for (iterator = iterFn.call(iterable); !(step = iterator.next()).done;) {
result = _iterCall(iterator, f, step.value, entries);
if (result === BREAK || result === RETURN) return result;
}
};
exports.BREAK = BREAK;
exports.RETURN = RETURN;
});
// 7.3.20 SpeciesConstructor(O, defaultConstructor)
var SPECIES = _wks('species');
var _speciesConstructor = function (O, D) {
var C = _anObject(O).constructor;
var S;
return C === undefined || (S = _anObject(C)[SPECIES]) == undefined ? D : _aFunction(S);
};
// fast apply, http://jsperf.lnkit.com/fast-apply/5
var _invoke = function (fn, args, that) {
var un = that === undefined;
switch (args.length) {
case 0: return un ? fn()
: fn.call(that);
case 1: return un ? fn(args[0])
: fn.call(that, args[0]);
case 2: return un ? fn(args[0], args[1])
: fn.call(that, args[0], args[1]);
case 3: return un ? fn(args[0], args[1], args[2])
: fn.call(that, args[0], args[1], args[2]);
case 4: return un ? fn(args[0], args[1], args[2], args[3])
: fn.call(that, args[0], args[1], args[2], args[3]);
} return fn.apply(that, args);
};
var process = _global.process;
var setTask = _global.setImmediate;
var clearTask = _global.clearImmediate;
var MessageChannel = _global.MessageChannel;
var Dispatch = _global.Dispatch;
var counter = 0;
var queue = {};
var ONREADYSTATECHANGE = 'onreadystatechange';
var defer, channel, port;
var run = function () {
var id = +this;
// eslint-disable-next-line no-prototype-builtins
if (queue.hasOwnProperty(id)) {
var fn = queue[id];
delete queue[id];
fn();
}
};
var listener = function (event) {
run.call(event.data);
};
// Node.js 0.9+ & IE10+ has setImmediate, otherwise:
if (!setTask || !clearTask) {
setTask = function setImmediate(fn) {
var args = [];
var i = 1;
while (arguments.length > i) args.push(arguments[i++]);
queue[++counter] = function () {
// eslint-disable-next-line no-new-func
_invoke(typeof fn == 'function' ? fn : Function(fn), args);
};
defer(counter);
return counter;
};
clearTask = function clearImmediate(id) {
delete queue[id];
};
// Node.js 0.8-
if (_cof(process) == 'process') {
defer = function (id) {
process.nextTick(_ctx(run, id, 1));
};
// Sphere (JS game engine) Dispatch API
} else if (Dispatch && Dispatch.now) {
defer = function (id) {
Dispatch.now(_ctx(run, id, 1));
};
// Browsers with MessageChannel, includes WebWorkers
} else if (MessageChannel) {
channel = new MessageChannel();
port = channel.port2;
channel.port1.onmessage = listener;
defer = _ctx(port.postMessage, port, 1);
// Browsers with postMessage, skip WebWorkers
// IE8 has postMessage, but it's sync & typeof its postMessage is 'object'
} else if (_global.addEventListener && typeof postMessage == 'function' && !_global.importScripts) {
defer = function (id) {
_global.postMessage(id + '', '*');
};
_global.addEventListener('message', listener, false);
// IE8-
} else if (ONREADYSTATECHANGE in _domCreate('script')) {
defer = function (id) {
_html.appendChild(_domCreate('script'))[ONREADYSTATECHANGE] = function () {
_html.removeChild(this);
run.call(id);
};
};
// Rest old browsers
} else {
defer = function (id) {
setTimeout(_ctx(run, id, 1), 0);
};
}
}
var _task = {
set: setTask,
clear: clearTask
};
var macrotask = _task.set;
var Observer = _global.MutationObserver || _global.WebKitMutationObserver;
var process$1 = _global.process;
var Promise$1 = _global.Promise;
var isNode = _cof(process$1) == 'process';
var _microtask = function () {
var head, last, notify;
var flush = function () {
var parent, fn;
if (isNode && (parent = process$1.domain)) parent.exit();
while (head) {
fn = head.fn;
head = head.next;
try {
fn();
} catch (e) {
if (head) notify();
else last = undefined;
throw e;
}
} last = undefined;
if (parent) parent.enter();
};
// Node.js
if (isNode) {
notify = function () {
process$1.nextTick(flush);
};
// browsers with MutationObserver, except iOS Safari - https://github.com/zloirock/core-js/issues/339
} else if (Observer && !(_global.navigator && _global.navigator.standalone)) {
var toggle = true;
var node = document.createTextNode('');
new Observer(flush).observe(node, { characterData: true }); // eslint-disable-line no-new
notify = function () {
node.data = toggle = !toggle;
};
// environments with maybe non-completely correct, but existent Promise
} else if (Promise$1 && Promise$1.resolve) {
// Promise.resolve without an argument throws an error in LG WebOS 2
var promise = Promise$1.resolve(undefined);
notify = function () {
promise.then(flush);
};
// for other environments - macrotask based on:
// - setImmediate
// - MessageChannel
// - window.postMessag
// - onreadystatechange
// - setTimeout
} else {
notify = function () {
// strange IE + webpack dev server bug - use .call(global)
macrotask.call(_global, flush);
};
}
return function (fn) {
var task = { fn: fn, next: undefined };
if (last) last.next = task;
if (!head) {
head = task;
notify();
} last = task;
};
};
// 25.4.1.5 NewPromiseCapability(C)
function PromiseCapability(C) {
var resolve, reject;
this.promise = new C(function ($$resolve, $$reject) {
if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor');
resolve = $$resolve;
reject = $$reject;
});
this.resolve = _aFunction(resolve);
this.reject = _aFunction(reject);
}
var f$1 = function (C) {
return new PromiseCapability(C);
};
var _newPromiseCapability = {
f: f$1
};
var _perform = function (exec) {
try {
return { e: false, v: exec() };
} catch (e) {
return { e: true, v: e };
}
};
var navigator = _global.navigator;
var _userAgent = navigator && navigator.userAgent || '';
var _promiseResolve = function (C, x) {
_anObject(C);
if (_isObject(x) && x.constructor === C) return x;
var promiseCapability = _newPromiseCapability.f(C);
var resolve = promiseCapability.resolve;
resolve(x);
return promiseCapability.promise;
};
var _redefineAll = function (target, src, safe) {
for (var key in src) {
if (safe && target[key]) target[key] = src[key];
else _hide(target, key, src[key]);
} return target;
};
var SPECIES$1 = _wks('species');
var _setSpecies = function (KEY) {
var C = typeof _core[KEY] == 'function' ? _core[KEY] : _global[KEY];
if (_descriptors && C && !C[SPECIES$1]) _objectDp.f(C, SPECIES$1, {
configurable: true,
get: function () { return this; }
});
};
var ITERATOR$3 = _wks('iterator');
var SAFE_CLOSING = false;
try {
var riter = [7][ITERATOR$3]();
riter['return'] = function () { SAFE_CLOSING = true; };
} catch (e) { /* empty */ }
var _iterDetect = function (exec, skipClosing) {
if (!skipClosing && !SAFE_CLOSING) return false;
var safe = false;
try {
var arr = [7];
var iter = arr[ITERATOR$3]();
iter.next = function () { return { done: safe = true }; };
arr[ITERATOR$3] = function () { return iter; };
exec(arr);
} catch (e) { /* empty */ }
return safe;
};
var task = _task.set;
var microtask = _microtask();
var PROMISE = 'Promise';
var TypeError$1 = _global.TypeError;
var process$2 = _global.process;
var versions = process$2 && process$2.versions;
var v8 = versions && versions.v8 || '';
var $Promise = _global[PROMISE];
var isNode$1 = _classof(process$2) == 'process';
var empty = function () { /* empty */ };
var Internal, newGenericPromiseCapability, OwnPromiseCapability, Wrapper;
var newPromiseCapability = newGenericPromiseCapability = _newPromiseCapability.f;
var USE_NATIVE = !!function () {
try {
// correct subclassing with @@species support
var promise = $Promise.resolve(1);
var FakePromise = (promise.constructor = {})[_wks('species')] = function (exec) {
exec(empty, empty);
};
// unhandled rejections tracking support, NodeJS Promise without it fails @@species test
return (isNode$1 || typeof PromiseRejectionEvent == 'function')
&& promise.then(empty) instanceof FakePromise
// v8 6.6 (Node 10 and Chrome 66) have a bug with resolving custom thenables
// https://bugs.chromium.org/p/chromium/issues/detail?id=830565
// we can't detect it synchronously, so just check versions
&& v8.indexOf('6.6') !== 0
&& _userAgent.indexOf('Chrome/66') === -1;
} catch (e) { /* empty */ }
}();
// helpers
var isThenable = function (it) {
var then;
return _isObject(it) && typeof (then = it.then) == 'function' ? then : false;
};
var notify = function (promise, isReject) {
if (promise._n) return;
promise._n = true;
var chain = promise._c;
microtask(function () {
var value = promise._v;
var ok = promise._s == 1;
var i = 0;
var run = function (reaction) {
var handler = ok ? reaction.ok : reaction.fail;
var resolve = reaction.resolve;
var reject = reaction.reject;
var domain = reaction.domain;
var result, then, exited;
try {
if (handler) {
if (!ok) {
if (promise._h == 2) onHandleUnhandled(promise);
promise._h = 1;
}
if (handler === true) result = value;
else {
if (domain) domain.enter();
result = handler(value); // may throw
if (domain) {
domain.exit();
exited = true;
}
}
if (result === reaction.promise) {
reject(TypeError$1('Promise-chain cycle'));
} else if (then = isThenable(result)) {
then.call(result, resolve, reject);
} else resolve(result);
} else reject(value);
} catch (e) {
if (domain && !exited) domain.exit();
reject(e);
}
};
while (chain.length > i) run(chain[i++]); // variable length - can't use forEach
promise._c = [];
promise._n = false;
if (isReject && !promise._h) onUnhandled(promise);
});
};
var onUnhandled = function (promise) {
task.call(_global, function () {
var value = promise._v;
var unhandled = isUnhandled(promise);
var result, handler, console;
if (unhandled) {
result = _perform(function () {
if (isNode$1) {
process$2.emit('unhandledRejection', value, promise);
} else if (handler = _global.onunhandledrejection) {
handler({ promise: promise, reason: value });
} else if ((console = _global.console) && console.error) {
console.error('Unhandled promise rejection', value);
}
});
// Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should
promise._h = isNode$1 || isUnhandled(promise) ? 2 : 1;
} promise._a = undefined;
if (unhandled && result.e) throw result.v;
});
};
var isUnhandled = function (promise) {
return promise._h !== 1 && (promise._a || promise._c).length === 0;
};
var onHandleUnhandled = function (promise) {
task.call(_global, function () {
var handler;
if (isNode$1) {
process$2.emit('rejectionHandled', promise);
} else if (handler = _global.onrejectionhandled) {
handler({ promise: promise, reason: promise._v });
}
});
};
var $reject = function (value) {
var promise = this;
if (promise._d) return;
promise._d = true;
promise = promise._w || promise; // unwrap
promise._v = value;
promise._s = 2;
if (!promise._a) promise._a = promise._c.slice();
notify(promise, true);
};
var $resolve = function (value) {
var promise = this;
var then;
if (promise._d) return;
promise._d = true;
promise = promise._w || promise; // unwrap
try {
if (promise === value) throw TypeError$1("Promise can't be resolved itself");
if (then = isThenable(value)) {
microtask(function () {
var wrapper = { _w: promise, _d: false }; // wrap
try {
then.call(value, _ctx($resolve, wrapper, 1), _ctx($reject, wrapper, 1));
} catch (e) {
$reject.call(wrapper, e);
}
});
} else {
promise._v = value;
promise._s = 1;
notify(promise, false);
}
} catch (e) {
$reject.call({ _w: promise, _d: false }, e); // wrap
}
};
// constructor polyfill
if (!USE_NATIVE) {
// 25.4.3.1 Promise(executor)
$Promise = function Promise(executor) {
_anInstance(this, $Promise, PROMISE, '_h');
_aFunction(executor);
Internal.call(this);
try {
executor(_ctx($resolve, this, 1), _ctx($reject, this, 1));
} catch (err) {
$reject.call(this, err);
}
};
// eslint-disable-next-line no-unused-vars
Internal = function Promise(executor) {
this._c = []; // <- awaiting reactions
this._a = undefined; // <- checked in isUnhandled reactions
this._s = 0; // <- state
this._d = false; // <- done
this._v = undefined; // <- value
this._h = 0; // <- rejection state, 0 - default, 1 - handled, 2 - unhandled
this._n = false; // <- notify
};
Internal.prototype = _redefineAll($Promise.prototype, {
// 25.4.5.3 Promise.prototype.then(onFulfilled, onRejected)
then: function then(onFulfilled, onRejected) {
var reaction = newPromiseCapability(_speciesConstructor(this, $Promise));
reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true;
reaction.fail = typeof onRejected == 'function' && onRejected;
reaction.domain = isNode$1 ? process$2.domain : undefined;
this._c.push(reaction);
if (this._a) this._a.push(reaction);
if (this._s) notify(this, false);
return reaction.promise;
},
// 25.4.5.1 Promise.prototype.catch(onRejected)
'catch': function (onRejected) {
return this.then(undefined, onRejected);
}
});
OwnPromiseCapability = function () {
var promise = new Internal();
this.promise = promise;
this.resolve = _ctx($resolve, promise, 1);
this.reject = _ctx($reject, promise, 1);
};
_newPromiseCapability.f = newPromiseCapability = function (C) {
return C === $Promise || C === Wrapper
? new OwnPromiseCapability(C)
: newGenericPromiseCapability(C);
};
}
_export(_export.G + _export.W + _export.F * !USE_NATIVE, { Promise: $Promise });
_setToStringTag($Promise, PROMISE);
_setSpecies(PROMISE);
Wrapper = _core[PROMISE];
// statics
_export(_export.S + _export.F * !USE_NATIVE, PROMISE, {
// 25.4.4.5 Promise.reject(r)
reject: function reject(r) {
var capability = newPromiseCapability(this);
var $$reject = capability.reject;
$$reject(r);
return capability.promise;
}
});
_export(_export.S + _export.F * (_library || !USE_NATIVE), PROMISE, {
// 25.4.4.6 Promise.resolve(x)
resolve: function resolve(x) {
return _promiseResolve(_library && this === Wrapper ? $Promise : this, x);
}
});
_export(_export.S + _export.F * !(USE_NATIVE && _iterDetect(function (iter) {
$Promise.all(iter)['catch'](empty);
})), PROMISE, {
// 25.4.4.1 Promise.all(iterable)
all: function all(iterable) {
var C = this;
var capability = newPromiseCapability(C);
var resolve = capability.resolve;
var reject = capability.reject;
var result = _perform(function () {
var values = [];
var index = 0;
var remaining = 1;
_forOf(iterable, false, function (promise) {
var $index = index++;
var alreadyCalled = false;
values.push(undefined);
remaining++;
C.resolve(promise).then(function (value) {
if (alreadyCalled) return;
alreadyCalled = true;
values[$index] = value;
--remaining || resolve(values);
}, reject);
});
--remaining || resolve(values);
});
if (result.e) reject(result.v);
return capability.promise;
},
// 25.4.4.4 Promise.race(iterable)
race: function race(iterable) {
var C = this;
var capability = newPromiseCapability(C);
var reject = capability.reject;
var result = _perform(function () {
_forOf(iterable, false, function (promise) {
C.resolve(promise).then(capability.resolve, reject);
});
});
if (result.e) reject(result.v);
return capability.promise;
}
});
_export(_export.P + _export.R, 'Promise', { 'finally': function (onFinally) {
var C = _speciesConstructor(this, _core.Promise || _global.Promise);
var isFunction = typeof onFinally == 'function';
return this.then(
isFunction ? function (x) {
return _promiseResolve(C, onFinally()).then(function () { return x; });
} : onFinally,
isFunction ? function (e) {
return _promiseResolve(C, onFinally()).then(function () { throw e; });
} : onFinally
);
} });
// https://github.com/tc39/proposal-promise-try
_export(_export.S, 'Promise', { 'try': function (callbackfn) {
var promiseCapability = _newPromiseCapability.f(this);
var result = _perform(callbackfn);
(result.e ? promiseCapability.reject : promiseCapability.resolve)(result.v);
return promiseCapability.promise;
} });
var promise = _core.Promise;
var promise$1 = promise;
function _asyncToGenerator(fn) {
return function () {
var self = this,
args = arguments;
return new promise$1(function (resolve, reject) {
var gen = fn.apply(self, args);
function step(key, arg) {
try {
var info = gen[key](arg);
var value = info.value;
} catch (error) {
reject(error);
return;
}
if (info.done) {
resolve(value);
} else {
promise$1.resolve(value).then(_next, _throw);
}
}
function _next(value) {
step("next", value);
}
function _throw(err) {
step("throw", err);
}
_next();
});
};
}
var asyncToGenerator = _asyncToGenerator;
var f$2 = {}.propertyIsEnumerable;
var _objectPie = {
f: f$2
};
var gOPD = Object.getOwnPropertyDescriptor;
var f$3 = _descriptors ? gOPD : function getOwnPropertyDescriptor(O, P) {
O = _toIobject(O);
P = _toPrimitive(P, true);
if (_ie8DomDefine) try {
return gOPD(O, P);
} catch (e) { /* empty */ }
if (_has(O, P)) return _propertyDesc(!_objectPie.f.call(O, P), O[P]);
};
var _objectGopd = {
f: f$3
};
// most Object methods by ES6 should accept primitives
var _objectSap = function (KEY, exec) {
var fn = (_core.Object || {})[KEY] || Object[KEY];
var exp = {};
exp[KEY] = exec(fn);
_export(_export.S + _export.F * _fails(function () { fn(1); }), 'Object', exp);
};
// 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)
var $getOwnPropertyDescriptor = _objectGopd.f;
_objectSap('getOwnPropertyDescriptor', function () {
return function getOwnPropertyDescriptor(it, key) {
return $getOwnPropertyDescriptor(_toIobject(it), key);
};
});
var $Object = _core.Object;
var getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key) {
return $Object.getOwnPropertyDescriptor(it, key);
};
var getOwnPropertyDescriptor$1 = getOwnPropertyDescriptor;
var _meta = createCommonjsModule(function (module) {
var META = _uid('meta');
var setDesc = _objectDp.f;
var id = 0;
var isExtensible = Object.isExtensible || function () {
return true;
};
var FREEZE = !_fails(function () {
return isExtensible(Object.preventExtensions({}));
});
var setMeta = function (it) {
setDesc(it, META, { value: {
i: 'O' + ++id, // object ID
w: {} // weak collections IDs
} });
};
var fastKey = function (it, create) {
// return primitive with prefix
if (!_isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;
if (!_has(it, META)) {
// can't set metadata to uncaught frozen object
if (!isExtensible(it)) return 'F';
// not necessary to add metadata
if (!create) return 'E';
// add missing metadata
setMeta(it);
// return object ID
} return it[META].i;
};
var getWeak = function (it, create) {
if (!_has(it, META)) {
// can't set metadata to uncaught frozen object
if (!isExtensible(it)) return true;
// not necessary to add metadata
if (!create) return false;
// add missing metadata
setMeta(it);
// return hash weak collections IDs
} return it[META].w;
};
// add metadata on freeze-family methods calling
var onFreeze = function (it) {
if (FREEZE && meta.NEED && isExtensible(it) && !_has(it, META)) setMeta(it);
return it;
};
var meta = module.exports = {
KEY: META,
NEED: false,
fastKey: fastKey,
getWeak: getWeak,
onFreeze: onFreeze
};
});
var _meta_1 = _meta.KEY;
var _meta_2 = _meta.NEED;
var _meta_3 = _meta.fastKey;
var _meta_4 = _meta.getWeak;
var _meta_5 = _meta.onFreeze;
var f$4 = _wks;
var _wksExt = {
f: f$4
};
var defineProperty = _objectDp.f;
var _wksDefine = function (name) {
var $Symbol = _core.Symbol || (_core.Symbol = _library ? {} : _global.Symbol || {});
if (name.charAt(0) != '_' && !(name in $Symbol)) defineProperty($Symbol, name, { value: _wksExt.f(name) });
};
var f$5 = Object.getOwnPropertySymbols;
var _objectGops = {
f: f$5
};
// all enumerable object keys, includes symbols
var _enumKeys = function (it) {
var result = _objectKeys(it);
var getSymbols = _objectGops.f;
if (getSymbols) {
var symbols = getSymbols(it);
var isEnum = _objectPie.f;
var i = 0;
var key;
while (symbols.length > i) if (isEnum.call(it, key = symbols[i++])) result.push(key);
} return result;
};
// 7.2.2 IsArray(argument)
var _isArray = Array.isArray || function isArray(arg) {
return _cof(arg) == 'Array';
};
// 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O)
var hiddenKeys = _enumBugKeys.concat('length', 'prototype');
var f$6 = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {
return _objectKeysInternal(O, hiddenKeys);
};
var _objectGopn = {
f: f$6
};
// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window
var gOPN = _objectGopn.f;
var toString$1 = {}.toString;
var windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames
? Object.getOwnPropertyNames(window) : [];
var getWindowNames = function (it) {
try {
return gOPN(it);
} catch (e) {
return windowNames.slice();
}
};
var f$7 = function getOwnPropertyNames(it) {
return windowNames && toString$1.call(it) == '[object Window]' ? getWindowNames(it) : gOPN(_toIobject(it));
};
var _objectGopnExt = {
f: f$7
};
// ECMAScript 6 symbols shim
var META = _meta.KEY;
var gOPD$1 = _objectGopd.f;
var dP$1 = _objectDp.f;
var gOPN$1 = _objectGopnExt.f;
var $Symbol = _global.Symbol;
var $JSON = _global.JSON;
var _stringify = $JSON && $JSON.stringify;
var PROTOTYPE$2 = 'prototype';
var HIDDEN = _wks('_hidden');
var TO_PRIMITIVE = _wks('toPrimitive');
var isEnum = {}.propertyIsEnumerable;
var SymbolRegistry = _shared('symbol-registry');
var AllSymbols = _shared('symbols');
var OPSymbols = _shared('op-symbols');
var ObjectProto$1 = Object[PROTOTYPE$2];
var USE_NATIVE$1 = typeof $Symbol == 'function';
var QObject = _global.QObject;
// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173
var setter = !QObject || !QObject[PROTOTYPE$2] || !QObject[PROTOTYPE$2].findChild;
// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687
var setSymbolDesc = _descriptors && _fails(function () {
return _objectCreate(dP$1({}, 'a', {
get: function () { return dP$1(this, 'a', { value: 7 }).a; }
})).a != 7;
}) ? function (it, key, D) {
var protoDesc = gOPD$1(ObjectProto$1, key);
if (protoDesc) delete ObjectProto$1[key];
dP$1(it, key, D);
if (protoDesc && it !== ObjectProto$1) dP$1(ObjectProto$1, key, protoDesc);
} : dP$1;
var wrap = function (tag) {
var sym = AllSymbols[tag] = _objectCreate($Symbol[PROTOTYPE$2]);
sym._k = tag;
return sym;
};
var isSymbol = USE_NATIVE$1 && typeof $Symbol.iterator == 'symbol' ? function (it) {
return typeof it == 'symbol';
} : function (it) {
return it instanceof $Symbol;
};
var $defineProperty = function defineProperty(it, key, D) {
if (it === ObjectProto$1) $defineProperty(OPSymbols, key, D);
_anObject(it);
key = _toPrimitive(key, true);
_anObject(D);
if (_has(AllSymbols, key)) {
if (!D.enumerable) {
if (!_has(it, HIDDEN)) dP$1(it, HIDDEN, _propertyDesc(1, {}));
it[HIDDEN][key] = true;
} else {
if (_has(it, HIDDEN) && it[HIDDEN][key]) it[HIDDEN][key] = false;
D = _objectCreate(D, { enumerable: _propertyDesc(0, false) });
} return setSymbolDesc(it, key, D);
} return dP$1(it, key, D);
};
var $defineProperties = function defineProperties(it, P) {
_anObject(it);
var keys = _enumKeys(P = _toIobject(P));
var i = 0;
var l = keys.length;
var key;
while (l > i) $defineProperty(it, key = keys[i++], P[key]);
return it;
};
var $create = function create(it, P) {
return P === undefined ? _objectCreate(it) : $defineProperties(_objectCreate(it), P);
};
var $propertyIsEnumerable = function propertyIsEnumerable(key) {
var E = isEnum.call(this, key = _toPrimitive(key, true));
if (this === ObjectProto$1 && _has(AllSymbols, key) && !_has(OPSymbols, key)) return false;
return E || !_has(this, key) || !_has(AllSymbols, key) || _has(this, HIDDEN) && this[HIDDEN][key] ? E : true;
};
var $getOwnPropertyDescriptor$1 = function getOwnPropertyDescriptor(it, key) {
it = _toIobject(it);
key = _toPrimitive(key, true);
if (it === ObjectProto$1 && _has(AllSymbols, key) && !_has(OPSymbols, key)) return;
var D = gOPD$1(it, key);
if (D && _has(AllSymbols, key) && !(_has(it, HIDDEN) && it[HIDDEN][key])) D.enumerable = true;
return D;
};
var $getOwnPropertyNames = function getOwnPropertyNames(it) {
var names = gOPN$1(_toIobject(it));
var result = [];
var i = 0;
var key;
while (names.length > i) {
if (!_has(AllSymbols, key = names[i++]) && key != HIDDEN && key != META) result.push(key);
} return result;
};
var $getOwnPropertySymbols = function getOwnPropertySymbols(it) {
var IS_OP = it === ObjectProto$1;
var names = gOPN$1(IS_OP ? OPSymbols : _toIobject(it));
var result = [];
var i = 0;
var key;
while (names.length > i) {
if (_has(AllSymbols, key = names[i++]) && (IS_OP ? _has(ObjectProto$1, key) : true)) result.push(AllSymbols[key]);
} return result;
};
// 19.4.1.1 Symbol([description])
if (!USE_NATIVE$1) {
$Symbol = function Symbol() {
if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor!');
var tag = _uid(arguments.length > 0 ? arguments[0] : undefined);
var $set = function (value) {
if (this === ObjectProto$1) $set.call(OPSymbols, value);
if (_has(this, HIDDEN) && _has(this[HIDDEN], tag)) this[HIDDEN][tag] = false;
setSymbolDesc(this, tag, _propertyDesc(1, value));
};
if (_descriptors && setter) setSymbolDesc(ObjectProto$1, tag, { configurable: true, set: $set });
return wrap(tag);
};
_redefine($Symbol[PROTOTYPE$2], 'toString', function toString() {
return this._k;
});
_objectGopd.f = $getOwnPropertyDescriptor$1;
_objectDp.f = $defineProperty;
_objectGopn.f = _objectGopnExt.f = $getOwnPropertyNames;
_objectPie.f = $propertyIsEnumerable;
_objectGops.f = $getOwnPropertySymbols;
if (_descriptors && !_library) {
_redefine(ObjectProto$1, 'propertyIsEnumerable', $propertyIsEnumerable, true);
}
_wksExt.f = function (name) {
return wrap(_wks(name));
};
}
_export(_export.G + _export.W + _export.F * !USE_NATIVE$1, { Symbol: $Symbol });
for (var es6Symbols = (
// 19.4.2.2, 19.4.2.3, 19.4.2.4, 19.4.2.6, 19.4.2.8, 19.4.2.9, 19.4.2.10, 19.4.2.11, 19.4.2.12, 19.4.2.13, 19.4.2.14
'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables'
).split(','), j = 0; es6Symbols.length > j;)_wks(es6Symbols[j++]);
for (var wellKnownSymbols = _objectKeys(_wks.store), k = 0; wellKnownSymbols.length > k;) _wksDefine(wellKnownSymbols[k++]);
_export(_export.S + _export.F * !USE_NATIVE$1, 'Symbol', {
// 19.4.2.1 Symbol.for(key)
'for': function (key) {
return _has(SymbolRegistry, key += '')
? SymbolRegistry[key]
: SymbolRegistry[key] = $Symbol(key);
},
// 19.4.2.5 Symbol.keyFor(sym)
keyFor: function keyFor(sym) {
if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol!');
for (var key in SymbolRegistry) if (SymbolRegistry[key] === sym) return key;
},
useSetter: function () { setter = true; },
useSimple: function () { setter = false; }
});
_export(_export.S + _export.F * !USE_NATIVE$1, 'Object', {
// 19.1.2.2 Object.create(O [, Properties])
create: $create,
// 19.1.2.4 Object.defineProperty(O, P, Attributes)
defineProperty: $defineProperty,
// 19.1.2.3 Object.defineProperties(O, Properties)
defineProperties: $defineProperties,
// 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)
getOwnPropertyDescriptor: $getOwnPropertyDescriptor$1,
// 19.1.2.7 Object.getOwnPropertyNames(O)
getOwnPropertyNames: $getOwnPropertyNames,
// 19.1.2.8 Object.getOwnPropertySymbols(O)
getOwnPropertySymbols: $getOwnPropertySymbols
});
// 24.3.2 JSON.stringify(value [, replacer [, space]])
$JSON && _export(_export.S + _export.F * (!USE_NATIVE$1 || _fails(function () {
var S = $Symbol();
// MS Edge converts symbol values to JSON as {}
// WebKit converts symbol values to JSON as null
// V8 throws on boxed symbols
return _stringify([S]) != '[null]' || _stringify({ a: S }) != '{}' || _stringify(Object(S)) != '{}';
})), 'JSON', {
stringify: function stringify(it) {
var args = [it];
var i = 1;
var replacer, $replacer;
while (arguments.length > i) args.push(arguments[i++]);
$replacer = replacer = args[1];
if (!_isObject(replacer) && it === undefined || isSymbol(it)) return; // IE8 returns string on undefined
if (!_isArray(replacer)) replacer = function (key, value) {
if (typeof $replacer == 'function') value = $replacer.call(this, key, value);
if (!isSymbol(value)) return value;
};
args[1] = replacer;
return _stringify.apply($JSON, args);
}
});
// 19.4.3.4 Symbol.prototype[@@toPrimitive](hint)
$Symbol[PROTOTYPE$2][TO_PRIMITIVE] || _hide($Symbol[PROTOTYPE$2], TO_PRIMITIVE, $Symbol[PROTOTYPE$2].valueOf);
// 19.4.3.5 Symbol.prototype[@@toStringTag]
_setToStringTag($Symbol, 'Symbol');
// 20.2.1.9 Math[@@toStringTag]
_setToStringTag(Math, 'Math', true);
// 24.3.3 JSON[@@toStringTag]
_setToStringTag(_global.JSON, 'JSON', true);
var getOwnPropertySymbols = _core.Object.getOwnPropertySymbols;
var getOwnPropertySymbols$1 = getOwnPropertySymbols;
// 19.1.2.14 Object.keys(O)
_objectSap('keys', function () {
return function keys(it) {
return _objectKeys(_toObject(it));
};
});
var keys = _core.Object.keys;
var keys$1 = keys;
// 19.1.2.4 / 15.2.3.6 Object.defineProperty(O, P, Attributes)
_export(_export.S + _export.F * !_descriptors, 'Object', { defineProperty: _objectDp.f });
var $Object$1 = _core.Object;
var defineProperty$1 = function defineProperty(it, key, desc) {
return $Object$1.defineProperty(it, key, desc);
};
var defineProperty$2 = defineProperty$1;
function _defineProperty(obj, key, value) {
if (key in obj) {
defineProperty$2(obj, key, {
value: value,
enumerable: true,
configurable: true,
writable: true
});
} else {
obj[key] = value;
}
return obj;
}
var defineProperty$3 = _defineProperty;
function _objectSpread(target) {
for (var i = 1; i < arguments.length; i++) {
var source = arguments[i] != null ? arguments[i] : {};
var ownKeys = keys$1(source);
if (typeof getOwnPropertySymbols$1 === 'function') {
ownKeys = ownKeys.concat(getOwnPropertySymbols$1(source).filter(function (sym) {
return getOwnPropertyDescriptor$1(source, sym).enumerable;
}));
}
ownKeys.forEach(function (key) {
defineProperty$3(target, key, source[key]);
});
}
return target;
}
var objectSpread = _objectSpread;
function _classCallCheck(instance, Constructor) {
if (!(instance instanceof Constructor)) {
throw new TypeError("Cannot call a class as a function");
}
}
var classCallCheck = _classCallCheck;
// Works with __proto__ only. Old v8 can't work with null proto objects.
/* eslint-disable no-proto */
var check = function (O, proto) {
_anObject(O);
if (!_isObject(proto) && proto !== null) throw TypeError(proto + ": can't set as prototype!");
};
var _setProto = {
set: Object.setPrototypeOf || ('__proto__' in {} ? // eslint-disable-line
function (test, buggy, set) {
try {
set = _ctx(Function.call, _objectGopd.f(Object.prototype, '__proto__').set, 2);
set(test, []);
buggy = !(test instanceof Array);
} catch (e) { buggy = true; }
return function setPrototypeOf(O, proto) {
check(O, proto);
if (buggy) O.__proto__ = proto;
else set(O, proto);
return O;
};
}({}, false) : undefined),
check: check
};
// 19.1.3.19 Object.setPrototypeOf(O, proto)
_export(_export.S, 'Object', { setPrototypeOf: _setProto.set });
var setPrototypeOf = _core.Object.setPrototypeOf;
var setPrototypeOf$1 = setPrototypeOf;
var setPrototypeOf$2 = createCommonjsModule(function (module) {
function _setPrototypeOf(o, p) {
module.exports = _setPrototypeOf = setPrototypeOf$1 || function _setPrototypeOf(o, p) {
o.__proto__ = p;
return o;
};
return _setPrototypeOf(o, p);
}
module.exports = _setPrototypeOf;
});
function _inherits(subClass, superClass) {
if (typeof superClass !== "function" && superClass !== null) {
throw new TypeError("Super expression must either be null or a function");
}
setPrototypeOf$2(subClass.prototype, superClass && superClass.prototype);
if (superClass) setPrototypeOf$2(subClass, superClass);
}
var inherits = _inherits;
function _defineProperties(target, props) {
for (var i = 0; i < props.length; i++) {
var descriptor = props[i];
descriptor.enumerable = descriptor.enumerable || false;
descriptor.configurable = true;
if ("value" in descriptor) descriptor.writable = true;
defineProperty$2(target, descriptor.key, descriptor);
}
}
function _createClass(Constructor, protoProps, staticProps) {
if (protoProps) _defineProperties(Constructor.prototype, protoProps);
if (staticProps) _defineProperties(Constructor, staticProps);
return Constructor;
}
var createClass = _createClass;
var iterator = _wksExt.f('iterator');
var iterator$1 = iterator;
_wksDefine('asyncIterator');
_wksDefine('observable');
var symbol = _core.Symbol;
var symbol$1 = symbol;
var _typeof_1 = createCommonjsModule(function (module) {
function _typeof2(obj) { if (typeof symbol$1 === "function" && typeof iterator$1 === "symbol") { _typeof2 = function _typeof2(obj) { return typeof obj; }; } else { _typeof2 = function _typeof2(obj) { return obj && typeof symbol$1 === "function" && obj.constructor === symbol$1 && obj !== symbol$1.prototype ? "symbol" : typeof obj; }; } return _typeof2(obj); }
function _typeof(obj) {
if (typeof symbol$1 === "function" && _typeof2(iterator$1) === "symbol") {
module.exports = _typeof = function _typeof(obj) {
return _typeof2(obj);
};
} else {
module.exports = _typeof = function _typeof(obj) {
return obj && typeof symbol$1 === "function" && obj.constructor === symbol$1 && obj !== symbol$1.prototype ? "symbol" : _typeof2(obj);
};
}
return _typeof(obj);
}
module.exports = _typeof;
});
function _assertThisInitialized(self) {
if (self === void 0) {
throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
}
return self;
}
var assertThisInitialized = _assertThisInitialized;
function _possibleConstructorReturn(self, call) {
if (call && (_typeof_1(call) === "object" || typeof call === "function")) {
return call;
}
return assertThisInitialized(self);
}
var possibleConstructorReturn = _possibleConstructorReturn;
// 19.1.2.9 Object.getPrototypeOf(O)
_objectSap('getPrototypeOf', function () {
return function getPrototypeOf(it) {
return _objectGpo(_toObject(it));
};
});
var getPrototypeOf = _core.Object.getPrototypeOf;
var getPrototypeOf$1 = getPrototypeOf;
var getPrototypeOf$2 = createCommonjsModule(function (module) {
function _getPrototypeOf(o) {
module.exports = _getPrototypeOf = getPrototypeOf$1 || function _getPrototypeOf(o) {
return o.__proto__;
};
return _getPrototypeOf(o);
}
module.exports = _getPrototypeOf;
});
var extend = function extend(object) {
for (var _len = arguments.length, extensions = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
extensions[_key - 1] = arguments[_key];
}
// $.extend alternative, ... is the spread operator.
for (var _i = 0; _i < extensions.length; _i++) {
var extension = extensions[_i];
// console.log(extension);
// console.log(typeof extension);
if (!extension) continue; // Ignore null and undefined objects and parameters.
var _iteratorNormalCompletion = true;
var _didIteratorError = false;
var _iteratorError = undefined;
try {
for (var _iterator = Object.getOwnPropertyNames(extension)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
var prop = _step.value;
// Do not traverse the prototype chain.
if (object[prop] !== undefined && extension[prop] && object[prop].toString() === '[object Object]' && extension[prop].toString() === '[object Object]') {
// Goes deep only if object[prop] and extension[prop] are both objects !
if (object[prop].constructor === Object) extend(object[prop], extension[prop]);
} else object[prop] = typeof object[prop] === 'undefined' ? extension[prop] : object[prop];
if (typeof object[prop] === 'undefined' && Array.isArray(extension[prop])) object[prop] = extension[prop].slice(); // Add values that do not already exist.
else if (typeof object[prop] === 'undefined' && Array.isArray(extension[prop])) object[prop] = extension[prop];
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator.return != null) {
_iterator.return();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}
}
return object;
};
var instruct = function instruct(array, instArray) {
var tempObject = {};
for (var i = 0, max = instArray.length; i < max; i++) {
var guide = instArray[i];
tempObject[guide] = array[i];
}
return tempObject;
};
var transformData = function transformData(object, instructions) {
for (var key in instructions) {
if (Array.isArray(object[key])) object[key] = instruct(object[key], instructions[key]);else if (object[key] instanceof Object && !Array.isArray(instructions[key])) object[key] = transformData(object[key], instructions[key]);
}
return object;
};
var toArray = function toArray(object, instruction) {
var tempArray = [];
for (var i = 0, max = instruction.length; i < max; i++) {
var guide = instruction[i];
tempArray[i] = object[guide];
}
return tempArray;
};
// Polyfills
if ( Number.EPSILON === undefined ) {
Number.EPSILON = Math.pow( 2, - 52 );
}
if ( Number.isInteger === undefined ) {
// Missing in IE
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isInteger
Number.isInteger = function ( value ) {
return typeof value === 'number' && isFinite( value ) && Math.floor( value ) === value;
};
}
//
if ( Math.sign === undefined ) {
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/sign
Math.sign = function ( x ) {
return ( x < 0 ) ? - 1 : ( x > 0 ) ? 1 : + x;
};
}
if ( 'name' in Function.prototype === false ) {
// Missing in IE
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name
Object.defineProperty( Function.prototype, 'name', {
get: function () {
return this.toString().match( /^\s*function\s*([^\(\s]*)/ )[ 1 ];
}
} );
}
if ( Object.assign === undefined ) {
// Missing in IE
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign
( function () {
Object.assign = function ( target ) {
if ( target === undefined || target === null ) {
throw new TypeError( 'Cannot convert undefined or null to object' );
}
var output = Object( target );
for ( var index = 1; index < arguments.length; index ++ ) {
var source = arguments[ index ];
if ( source !== undefined && source !== null ) {
for ( var nextKey in source ) {
if ( Object.prototype.hasOwnProperty.call( source, nextKey ) ) {
output[ nextKey ] = source[ nextKey ];
}
}
}
}
return output;
};
} )();
}
/**
* https://github.com/mrdoob/eventdispatcher.js/
*/
function EventDispatcher() {}
Object.assign( EventDispatcher.prototype, {
addEventListener: function ( type, listener ) {
if ( this._listeners === undefined ) this._listeners = {};
var listeners = this._listeners;
if ( listeners[ type ] === undefined ) {
listeners[ type ] = [];
}
if ( listeners[ type ].indexOf( listener ) === - 1 ) {
listeners[ type ].push( listener );
}
},
hasEventListener: function ( type, listener ) {
if ( this._listeners === undefined ) return false;
var listeners = this._listeners;
return listeners[ type ] !== undefined && listeners[ type ].indexOf( listener ) !== - 1;
},
removeEventListener: function ( type, listener ) {
if ( this._listeners === undefined ) return;
var listeners = this._listeners;
var listenerArray = listeners[ type ];
if ( listenerArray !== undefined ) {
var index = listenerArray.indexOf( listener );
if ( index !== - 1 ) {
listenerArray.splice( index, 1 );
}
}
},
dispatchEvent: function ( event ) {
if ( this._listeners === undefined ) return;
var listeners = this._listeners;
var listenerArray = listeners[ event.type ];
if ( listenerArray !== undefined ) {
event.target = this;
var array = listenerArray.slice( 0 );
for ( var i = 0, l = array.length; i < l; i ++ ) {
array[ i ].call( this, event );
}
}
}
} );
var REVISION = '92';
var MOUSE = { LEFT: 0, MIDDLE: 1, RIGHT: 2 };
var CullFaceNone = 0;
var CullFaceBack = 1;
var CullFaceFront = 2;
var PCFShadowMap = 1;
var PCFSoftShadowMap = 2;
var FrontSide = 0;
var BackSide = 1;
var DoubleSide = 2;
var FlatShading = 1;
var NoColors = 0;
var FaceColors = 1;
var VertexColors = 2;
var NoBlending = 0;
var NormalBlending = 1;
var AdditiveBlending = 2;
var SubtractiveBlending = 3;
var MultiplyBlending = 4;
var CustomBlending = 5;
var AddEquation = 100;
var SubtractEquation = 101;
var ReverseSubtractEquation = 102;
var MinEquation = 103;
var MaxEquation = 104;
var ZeroFactor = 200;
var OneFactor = 201;
var SrcColorFactor = 202;
var OneMinusSrcColorFactor = 203;
var SrcAlphaFactor = 204;
var OneMinusSrcAlphaFactor = 205;
var DstAlphaFactor = 206;
var OneMinusDstAlphaFactor = 207;
var DstColorFactor = 208;
var OneMinusDstColorFactor = 209;
var SrcAlphaSaturateFactor = 210;
var NeverDepth = 0;
var AlwaysDepth = 1;
var LessDepth = 2;
var LessEqualDepth = 3;
var EqualDepth = 4;
var GreaterEqualDepth = 5;
var GreaterDepth = 6;
var NotEqualDepth = 7;
var MultiplyOperation = 0;
var MixOperation = 1;
var AddOperation = 2;
var NoToneMapping = 0;
var LinearToneMapping = 1;
var ReinhardToneMapping = 2;
var Uncharted2ToneMapping = 3;
var CineonToneMapping = 4;
var UVMapping = 300;
var CubeReflectionMapping = 301;
var CubeRefractionMapping = 302;
var EquirectangularReflectionMapping = 303;
var EquirectangularRefractionMapping = 304;
var SphericalReflectionMapping = 305;
var CubeUVReflectionMapping = 306;
var CubeUVRefractionMapping = 307;
var RepeatWrapping = 1000;
var ClampToEdgeWrapping = 1001;
var MirroredRepeatWrapping = 1002;
var NearestFilter = 1003;
var NearestMipMapNearestFilter = 1004;
var NearestMipMapLinearFilter = 1005;
var LinearFilter = 1006;
var LinearMipMapNearestFilter = 1007;
var LinearMipMapLinearFilter = 1008;
var UnsignedByteType = 1009;
var ByteType = 1010;
var ShortType = 1011;
var UnsignedShortType = 1012;
var IntType = 1013;
var UnsignedIntType = 1014;
var FloatType = 1015;
var HalfFloatType = 1016;
var UnsignedShort4444Type = 1017;
var UnsignedShort5551Type = 1018;
var UnsignedShort565Type = 1019;
var UnsignedInt248Type = 1020;
var AlphaFormat = 1021;
var RGBFormat = 1022;
var RGBAFormat = 1023;
var LuminanceFormat = 1024;
var LuminanceAlphaFormat = 1025;
var DepthFormat = 1026;
var DepthStencilFormat = 1027;
var RGB_S3TC_DXT1_Format = 33776;
var RGBA_S3TC_DXT1_Format = 33777;
var RGBA_S3TC_DXT3_Format = 33778;
var RGBA_S3TC_DXT5_Format = 33779;
var RGB_PVRTC_4BPPV1_Format = 35840;
var RGB_PVRTC_2BPPV1_Format = 35841;
var RGBA_PVRTC_4BPPV1_Format = 35842;
var RGBA_PVRTC_2BPPV1_Format = 35843;
var RGB_ETC1_Format = 36196;
var RGBA_ASTC_4x4_Format = 37808;
var RGBA_ASTC_5x4_Format = 37809;
var RGBA_ASTC_5x5_Format = 37810;
var RGBA_ASTC_6x5_Format = 37811;
var RGBA_ASTC_6x6_Format = 37812;
var RGBA_ASTC_8x5_Format = 37813;
var RGBA_ASTC_8x6_Format = 37814;
var RGBA_ASTC_8x8_Format = 37815;
var RGBA_ASTC_10x5_Format = 37816;
var RGBA_ASTC_10x6_Format = 37817;
var RGBA_ASTC_10x8_Format = 37818;
var RGBA_ASTC_10x10_Format = 37819;
var RGBA_ASTC_12x10_Format = 37820;
var RGBA_ASTC_12x12_Format = 37821;
var LoopOnce = 2200;
var LoopRepeat = 2201;
var LoopPingPong = 2202;
var InterpolateDiscrete = 2300;
var InterpolateLinear = 2301;
var InterpolateSmooth = 2302;
var ZeroCurvatureEnding = 2400;
var ZeroSlopeEnding = 2401;
var WrapAroundEnding = 2402;
var TrianglesDrawMode = 0;
var TriangleStripDrawMode = 1;
var TriangleFanDrawMode = 2;
var LinearEncoding = 3000;
var sRGBEncoding = 3001;
var GammaEncoding = 3007;
var RGBEEncoding = 3002;
var RGBM7Encoding = 3004;
var RGBM16Encoding = 3005;
var RGBDEncoding = 3006;
var BasicDepthPacking = 3200;
var RGBADepthPacking = 3201;
/**
* @author alteredq / http://alteredqualia.com/
* @author mrdoob / http://mrdoob.com/
*/
var _Math = {
DEG2RAD: Math.PI / 180,
RAD2DEG: 180 / Math.PI,
generateUUID: ( function () {
// http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/21963136#21963136
var lut = [];
for ( var i = 0; i < 256; i ++ ) {
lut[ i ] = ( i < 16 ? '0' : '' ) + ( i ).toString( 16 );
}
return function generateUUID() {
var d0 = Math.random() * 0xffffffff | 0;
var d1 = Math.random() * 0xffffffff | 0;
var d2 = Math.random() * 0xffffffff | 0;
var d3 = Math.random() * 0xffffffff | 0;
var uuid = lut[ d0 & 0xff ] + lut[ d0 >> 8 & 0xff ] + lut[ d0 >> 16 & 0xff ] + lut[ d0 >> 24 & 0xff ] + '-' +
lut[ d1 & 0xff ] + lut[ d1 >> 8 & 0xff ] + '-' + lut[ d1 >> 16 & 0x0f | 0x40 ] + lut[ d1 >> 24 & 0xff ] + '-' +
lut[ d2 & 0x3f | 0x80 ] + lut[ d2 >> 8 & 0xff ] + '-' + lut[ d2 >> 16 & 0xff ] + lut[ d2 >> 24 & 0xff ] +
lut[ d3 & 0xff ] + lut[ d3 >> 8 & 0xff ] + lut[ d3 >> 16 & 0xff ] + lut[ d3 >> 24 & 0xff ];
// .toUpperCase() here flattens concatenated strings to save heap memory space.
return uuid.toUpperCase();
};
} )(),
clamp: function ( value, min, max ) {
return Math.max( min, Math.min( max, value ) );
},
// compute euclidian modulo of m % n
// https://en.wikipedia.org/wiki/Modulo_operation
euclideanModulo: function ( n, m ) {
return ( ( n % m ) + m ) % m;
},
// Linear mapping from range <a1, a2> to range <b1, b2>
mapLinear: function ( x, a1, a2, b1, b2 ) {
return b1 + ( x - a1 ) * ( b2 - b1 ) / ( a2 - a1 );
},
// https://en.wikipedia.org/wiki/Linear_interpolation
lerp: function ( x, y, t ) {
return ( 1 - t ) * x + t * y;
},
// http://en.wikipedia.org/wiki/Smoothstep
smoothstep: function ( x, min, max ) {
if ( x <= min ) return 0;
if ( x >= max ) return 1;
x = ( x - min ) / ( max - min );
return x * x * ( 3 - 2 * x );
},
smootherstep: function ( x, min, max ) {
if ( x <= min ) return 0;
if ( x >= max ) return 1;
x = ( x - min ) / ( max - min );
return x * x * x * ( x * ( x * 6 - 15 ) + 10 );
},
// Random integer from <low, high> interval
randInt: function ( low, high ) {
return low + Math.floor( Math.random() * ( high - low + 1 ) );
},
// Random float from <low, high> interval
randFloat: function ( low, high ) {
return low + Math.random() * ( high - low );
},
// Random float from <-range/2, range/2> interval
randFloatSpread: function ( range ) {
return range * ( 0.5 - Math.random() );
},
degToRad: function ( degrees ) {
return degrees * _Math.DEG2RAD;
},
radToDeg: function ( radians ) {
return radians * _Math.RAD2DEG;
},
isPowerOfTwo: function ( value ) {
return ( value & ( value - 1 ) ) === 0 && value !== 0;
},
ceilPowerOfTwo: function ( value ) {
return Math.pow( 2, Math.ceil( Math.log( value ) / Math.LN2 ) );
},
floorPowerOfTwo: function ( value ) {
return Math.pow( 2, Math.floor( Math.log( value ) / Math.LN2 ) );
}
};
/**
* @author mrdoob / http://mrdoob.com/
* @author philogb / http://blog.thejit.org/
* @author egraether / http://egraether.com/
* @author zz85 / http://www.lab4games.net/zz85/blog
*/
function Vector2( x, y ) {
this.x = x || 0;
this.y = y || 0;
}
Object.defineProperties( Vector2.prototype, {
"width": {
get: function () {
return this.x;
},
set: function ( value ) {
this.x = value;
}
},
"height": {
get: function () {
return this.y;
},
set: function ( value ) {
this.y = value;
}
}
} );
Object.assign( Vector2.prototype, {
isVector2: true,
set: function ( x, y ) {
this.x = x;
this.y = y;
return this;
},
setScalar: function ( scalar ) {
this.x = scalar;
this.y = scalar;
return this;
},
setX: function ( x ) {
this.x = x;
return this;
},
setY: function ( y ) {
this.y = y;
return this;
},
setComponent: function ( index, value ) {
switch ( index ) {
case 0: this.x = value; break;
case 1: this.y = value; break;
default: throw new Error( 'index is out of range: ' + index );
}
return this;
},
getComponent: function ( index ) {
switch ( index ) {
case 0: return this.x;
case 1: return this.y;
default: throw new Error( 'index is out of range: ' + index );
}
},
clone: function () {
return new this.constructor( this.x, this.y );
},
copy: function ( v ) {
this.x = v.x;
this.y = v.y;
return this;
},
add: function ( v, w ) {
if ( w !== undefined ) {
console.warn( 'THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );
return this.addVectors( v, w );
}
this.x += v.x;
this.y += v.y;
return this;
},
addScalar: function ( s ) {
this.x += s;
this.y += s;
return this;
},
addVectors: function ( a, b ) {
this.x = a.x + b.x;
this.y = a.y + b.y;
return this;
},
addScaledVector: function ( v, s ) {
this.x += v.x * s;
this.y += v.y * s;
return this;
},
sub: function ( v, w ) {
if ( w !== undefined ) {
console.warn( 'THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );
return this.subVectors( v, w );
}
this.x -= v.x;
this.y -= v.y;
return this;
},
subScalar: function ( s ) {
this.x -= s;
this.y -= s;
return this;
},
subVectors: function ( a, b ) {
this.x = a.x - b.x;
this.y = a.y - b.y;
return this;
},
multiply: function ( v ) {
this.x *= v.x;
this.y *= v.y;
return this;
},
multiplyScalar: function ( scalar ) {
this.x *= scalar;
this.y *= scalar;
return this;
},
divide: function ( v ) {
this.x /= v.x;
this.y /= v.y;
return this;
},
divideScalar: function ( scalar ) {
return this.multiplyScalar( 1 / scalar );
},
applyMatrix3: function ( m ) {
var x = this.x, y = this.y;
var e = m.elements;
this.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ];
this.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ];
return this;
},
min: function ( v ) {
this.x = Math.min( this.x, v.x );
this.y = Math.min( this.y, v.y );
return this;
},
max: function ( v ) {
this.x = Math.max( this.x, v.x );
this.y = Math.max( this.y, v.y );
return this;
},
clamp: function ( min, max ) {
// assumes min < max, componentwise
this.x = Math.max( min.x, Math.min( max.x, this.x ) );
this.y = Math.max( min.y, Math.min( max.y, this.y ) );
return this;
},
clampScalar: function () {
var min = new Vector2();
var max = new Vector2();
return function clampScalar( minVal, maxVal ) {
min.set( minVal, minVal );
max.set( maxVal, maxVal );
return this.clamp( min, max );
};
}(),
clampLength: function ( min, max ) {
var length = this.length();
return this.divideScalar( length || 1 ).multiplyScalar( Math.max( min, Math.min( max, length ) ) );
},
floor: function () {
this.x = Math.floor( this.x );
this.y = Math.floor( this.y );
return this;
},
ceil: function () {
this.x = Math.ceil( this.x );
this.y = Math.ceil( this.y );
return this;
},
round: function () {
this.x = Math.round( this.x );
this.y = Math.round( this.y );
return this;
},
roundToZero: function () {
this.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );
this.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );
return this;
},
negate: function () {
this.x = - this.x;
this.y = - this.y;
return this;
},
dot: function ( v ) {
return this.x * v.x + this.y * v.y;
},
lengthSq: function () {
return this.x * this.x + this.y * this.y;
},
length: function () {
return Math.sqrt( this.x * this.x + this.y * this.y );
},
manhattanLength: function () {
return Math.abs( this.x ) + Math.abs( this.y );
},
normalize: function () {
return this.divideScalar( this.length() || 1 );
},
angle: function () {
// computes the angle in radians with respect to the positive x-axis
var angle = Math.atan2( this.y, this.x );
if ( angle < 0 ) angle += 2 * Math.PI;
return angle;
},
distanceTo: function ( v ) {
return Math.sqrt( this.distanceToSquared( v ) );
},
distanceToSquared: function ( v ) {
var dx = this.x - v.x, dy = this.y - v.y;
return dx * dx + dy * dy;
},
manhattanDistanceTo: function ( v ) {
return Math.abs( this.x - v.x ) + Math.abs( this.y - v.y );
},
setLength: function ( length ) {
return this.normalize().multiplyScalar( length );
},
lerp: function ( v, alpha ) {
this.x += ( v.x - this.x ) * alpha;
this.y += ( v.y - this.y ) * alpha;
return this;
},
lerpVectors: function ( v1, v2, alpha ) {
return this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 );
},
equals: function ( v ) {
return ( ( v.x === this.x ) && ( v.y === this.y ) );
},
fromArray: function ( array, offset ) {
if ( offset === undefined ) offset = 0;
this.x = array[ offset ];
this.y = array[ offset + 1 ];
return this;
},
toArray: function ( array, offset ) {
if ( array === undefined ) array = [];
if ( offset === undefined ) offset = 0;
array[ offset ] = this.x;
array[ offset + 1 ] = this.y;
return array;
},
fromBufferAttribute: function ( attribute, index, offset ) {
if ( offset !== undefined ) {
console.warn( 'THREE.Vector2: offset has been removed from .fromBufferAttribute().' );
}
this.x = attribute.getX( index );
this.y = attribute.getY( index );
return this;
},
rotateAround: function ( center, angle ) {
var c = Math.cos( angle ), s = Math.sin( angle );
var x = this.x - center.x;
var y = this.y - center.y;
this.x = x * c - y * s + center.x;
this.y = x * s + y * c + center.y;
return this;
}
} );
/**
* @author mrdoob / http://mrdoob.com/
* @author supereggbert / http://www.paulbrunt.co.uk/
* @author philogb / http://blog.thejit.org/
* @author jordi_ros / http://plattsoft.com
* @author D1plo1d / http://github.com/D1plo1d
* @author alteredq / http://alteredqualia.com/
* @author mikael emtinger / http://gomo.se/
* @author timknip / http://www.floorplanner.com/
* @author bhouston / http://clara.io
* @author WestLangley / http://github.com/WestLangley
*/
function Matrix4() {
this.elements = [
1, 0, 0, 0,
0, 1, 0, 0,
0, 0, 1, 0,
0, 0, 0, 1
];
if ( arguments.length > 0 ) {
console.error( 'THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.' );
}
}
Object.assign( Matrix4.prototype, {
isMatrix4: true,
set: function ( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) {
var te = this.elements;
te[ 0 ] = n11; te[ 4 ] = n12; te[ 8 ] = n13; te[ 12 ] = n14;
te[ 1 ] = n21; te[ 5 ] = n22; te[ 9 ] = n23; te[ 13 ] = n24;
te[ 2 ] = n31; te[ 6 ] = n32; te[ 10 ] = n33; te[ 14 ] = n34;
te[ 3 ] = n41; te[ 7 ] = n42; te[ 11 ] = n43; te[ 15 ] = n44;
return this;
},
identity: function () {
this.set(
1, 0, 0, 0,
0, 1, 0, 0,
0, 0, 1, 0,
0, 0, 0, 1
);
return this;
},
clone: function () {
return new Matrix4().fromArray( this.elements );
},
copy: function ( m ) {
var te = this.elements;
var me = m.elements;
te[ 0 ] = me[ 0 ]; te[ 1 ] = me[ 1 ]; te[ 2 ] = me[ 2 ]; te[ 3 ] = me[ 3 ];
te[ 4 ] = me[ 4 ]; te[ 5 ] = me[ 5 ]; te[ 6 ] = me[ 6 ]; te[ 7 ] = me[ 7 ];
te[ 8 ] = me[ 8 ]; te[ 9 ] = me[ 9 ]; te[ 10 ] = me[ 10 ]; te[ 11 ] = me[ 11 ];
te[ 12 ] = me[ 12 ]; te[ 13 ] = me[ 13 ]; te[ 14 ] = me[ 14 ]; te[ 15 ] = me[ 15 ];
return this;
},
copyPosition: function ( m ) {
var te = this.elements, me = m.elements;
te[ 12 ] = me[ 12 ];
te[ 13 ] = me[ 13 ];
te[ 14 ] = me[ 14 ];
return this;
},
extractBasis: function ( xAxis, yAxis, zAxis ) {
xAxis.setFromMatrixColumn( this, 0 );
yAxis.setFromMatrixColumn( this, 1 );
zAxis.setFromMatrixColumn( this, 2 );
return this;
},
makeBasis: function ( xAxis, yAxis, zAxis ) {
this.set(
xAxis.x, yAxis.x, zAxis.x, 0,
xAxis.y, yAxis.y, zAxis.y, 0,
xAxis.z, yAxis.z, zAxis.z, 0,
0, 0, 0, 1
);
return this;
},
extractRotation: function () {
var v1 = new Vector3();
return function extractRotation( m ) {
var te = this.elements;
var me = m.elements;
var scaleX = 1 / v1.setFromMatrixColumn( m, 0 ).length();
var scaleY = 1 / v1.setFromMatrixColumn( m, 1 ).length();
var scaleZ = 1 / v1.setFromMatrixColumn( m, 2 ).length();
te[ 0 ] = me[ 0 ] * scaleX;
te[ 1 ] = me[ 1 ] * scaleX;
te[ 2 ] = me[ 2 ] * scaleX;
te[ 4 ] = me[ 4 ] * scaleY;
te[ 5 ] = me[ 5 ] * scaleY;
te[ 6 ] = me[ 6 ] * scaleY;
te[ 8 ] = me[ 8 ] * scaleZ;
te[ 9 ] = me[ 9 ] * scaleZ;
te[ 10 ] = me[ 10 ] * scaleZ;
return this;
};
}(),
makeRotationFromEuler: function ( euler ) {
if ( ! ( euler && euler.isEuler ) ) {
console.error( 'THREE.Matrix4: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.' );
}
var te = this.elements;
var x = euler.x, y = euler.y, z = euler.z;
var a = Math.cos( x ), b = Math.sin( x );
var c = Math.cos( y ), d = Math.sin( y );
var e = Math.cos( z ), f = Math.sin( z );
if ( euler.order === 'XYZ' ) {
var ae = a * e, af = a * f, be = b * e, bf = b * f;
te[ 0 ] = c * e;
te[ 4 ] = - c * f;
te[ 8 ] = d;
te[ 1 ] = af + be * d;
te[ 5 ] = ae - bf * d;
te[ 9 ] = - b * c;
te[ 2 ] = bf - ae * d;
te[ 6 ] = be + af * d;
te[ 10 ] = a * c;
} else if ( euler.order === 'YXZ' ) {
var ce = c * e, cf = c * f, de = d * e, df = d * f;
te[ 0 ] = ce + df * b;
te[ 4 ] = de * b - cf;
te[ 8 ] = a * d;
te[ 1 ] = a * f;
te[ 5 ] = a * e;
te[ 9 ] = - b;
te[ 2 ] = cf * b - de;
te[ 6 ] = df + ce * b;
te[ 10 ] = a * c;
} else if ( euler.order === 'ZXY' ) {
var ce = c * e, cf = c * f, de = d * e, df = d * f;
te[ 0 ] = ce - df * b;
te[ 4 ] = - a * f;
te[ 8 ] = de + cf * b;
te[ 1 ] = cf + de * b;
te[ 5 ] = a * e;
te[ 9 ] = df - ce * b;
te[ 2 ] = - a * d;
te[ 6 ] = b;
te[ 10 ] = a * c;
} else if ( euler.order === 'ZYX' ) {
var ae = a * e, af = a * f, be = b * e, bf = b * f;
te[ 0 ] = c * e;
te[ 4 ] = be * d - af;
te[ 8 ] = ae * d + bf;
te[ 1 ] = c * f;
te[ 5 ] = bf * d + ae;
te[ 9 ] = af * d - be;
te[ 2 ] = - d;
te[ 6 ] = b * c;
te[ 10 ] = a * c;
} else if ( euler.order === 'YZX' ) {
var ac = a * c, ad = a * d, bc = b * c, bd = b * d;
te[ 0 ] = c * e;
te[ 4 ] = bd - ac * f;
te[ 8 ] = bc * f + ad;
te[ 1 ] = f;
te[ 5 ] = a * e;
te[ 9 ] = - b * e;
te[ 2 ] = - d * e;
te[ 6 ] = ad * f + bc;
te[ 10 ] = ac - bd * f;
} else if ( euler.order === 'XZY' ) {
var ac = a * c, ad = a * d, bc = b * c, bd = b * d;
te[ 0 ] = c * e;
te[ 4 ] = - f;
te[ 8 ] = d * e;
te[ 1 ] = ac * f + bd;
te[ 5 ] = a * e;
te[ 9 ] = ad * f - bc;
te[ 2 ] = bc * f - ad;
te[ 6 ] = b * e;
te[ 10 ] = bd * f + ac;
}
// last column
te[ 3 ] = 0;
te[ 7 ] = 0;
te[ 11 ] = 0;
// bottom row
te[ 12 ] = 0;
te[ 13 ] = 0;
te[ 14 ] = 0;
te[ 15 ] = 1;
return this;
},
makeRotationFromQuaternion: function ( q ) {
var te = this.elements;
var x = q._x, y = q._y, z = q._z, w = q._w;
var x2 = x + x, y2 = y + y, z2 = z + z;
var xx = x * x2, xy = x * y2, xz = x * z2;
var yy = y * y2, yz = y * z2, zz = z * z2;
var wx = w * x2, wy = w * y2, wz = w * z2;
te[ 0 ] = 1 - ( yy + zz );
te[ 4 ] = xy - wz;
te[ 8 ] = xz + wy;
te[ 1 ] = xy + wz;
te[ 5 ] = 1 - ( xx + zz );
te[ 9 ] = yz - wx;
te[ 2 ] = xz - wy;
te[ 6 ] = yz + wx;
te[ 10 ] = 1 - ( xx + yy );
// last column
te[ 3 ] = 0;
te[ 7 ] = 0;
te[ 11 ] = 0;
// bottom row
te[ 12 ] = 0;
te[ 13 ] = 0;
te[ 14 ] = 0;
te[ 15 ] = 1;
return this;
},
lookAt: function () {
var x = new Vector3();
var y = new Vector3();
var z = new Vector3();
return function lookAt( eye, target, up ) {
var te = this.elements;
z.subVectors( eye, target );
if ( z.lengthSq() === 0 ) {
// eye and target are in the same position
z.z = 1;
}
z.normalize();
x.crossVectors( up, z );
if ( x.lengthSq() === 0 ) {
// up and z are parallel
if ( Math.abs( up.z ) === 1 ) {
z.x += 0.0001;
} else {
z.z += 0.0001;
}
z.normalize();
x.crossVectors( up, z );
}
x.normalize();
y.crossVectors( z, x );
te[ 0 ] = x.x; te[ 4 ] = y.x; te[ 8 ] = z.x;
te[ 1 ] = x.y; te[ 5 ] = y.y; te[ 9 ] = z.y;
te[ 2 ] = x.z; te[ 6 ] = y.z; te[ 10 ] = z.z;
return this;
};
}(),
multiply: function ( m, n ) {
if ( n !== undefined ) {
console.warn( 'THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead.' );
return this.multiplyMatrices( m, n );
}
return this.multiplyMatrices( this, m );
},
premultiply: function ( m ) {
return this.multiplyMatrices( m, this );
},
multiplyMatrices: function ( a, b ) {
var ae = a.elements;
var be = b.elements;
var te = this.elements;
var a11 = ae[ 0 ], a12 = ae[ 4 ], a13 = ae[ 8 ], a14 = ae[ 12 ];
var a21 = ae[ 1 ], a22 = ae[ 5 ], a23 = ae[ 9 ], a24 = ae[ 13 ];
var a31 = ae[ 2 ], a32 = ae[ 6 ], a33 = ae[ 10 ], a34 = ae[ 14 ];
var a41 = ae[ 3 ], a42 = ae[ 7 ], a43 = ae[ 11 ], a44 = ae[ 15 ];
var b11 = be[ 0 ], b12 = be[ 4 ], b13 = be[ 8 ], b14 = be[ 12 ];
var b21 = be[ 1 ], b22 = be[ 5 ], b23 = be[ 9 ], b24 = be[ 13 ];
var b31 = be[ 2 ], b32 = be[ 6 ], b33 = be[ 10 ], b34 = be[ 14 ];
var b41 = be[ 3 ], b42 = be[ 7 ], b43 = be[ 11 ], b44 = be[ 15 ];
te[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41;
te[ 4 ] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42;
te[ 8 ] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43;
te[ 12 ] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44;
te[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41;
te[ 5 ] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42;
te[ 9 ] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43;
te[ 13 ] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44;
te[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41;
te[ 6 ] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42;
te[ 10 ] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43;
te[ 14 ] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44;
te[ 3 ] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41;
te[ 7 ] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42;
te[ 11 ] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43;
te[ 15 ] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44;
return this;
},
multiplyScalar: function ( s ) {
var te = this.elements;
te[ 0 ] *= s; te[ 4 ] *= s; te[ 8 ] *= s; te[ 12 ] *= s;
te[ 1 ] *= s; te[ 5 ] *= s; te[ 9 ] *= s; te[ 13 ] *= s;
te[ 2 ] *= s; te[ 6 ] *= s; te[ 10 ] *= s; te[ 14 ] *= s;
te[ 3 ] *= s; te[ 7 ] *= s; te[ 11 ] *= s; te[ 15 ] *= s;
return this;
},
applyToBufferAttribute: function () {
var v1 = new Vector3();
return function applyToBufferAttribute( attribute ) {
for ( var i = 0, l = attribute.count; i < l; i ++ ) {
v1.x = attribute.getX( i );
v1.y = attribute.getY( i );
v1.z = attribute.getZ( i );
v1.applyMatrix4( this );
attribute.setXYZ( i, v1.x, v1.y, v1.z );
}
return attribute;
};
}(),
determinant: function () {
var te = this.elements;
var n11 = te[ 0 ], n12 = te[ 4 ], n13 = te[ 8 ], n14 = te[ 12 ];
var n21 = te[ 1 ], n22 = te[ 5 ], n23 = te[ 9 ], n24 = te[ 13 ];
var n31 = te[ 2 ], n32 = te[ 6 ], n33 = te[ 10 ], n34 = te[ 14 ];
var n41 = te[ 3 ], n42 = te[ 7 ], n43 = te[ 11 ], n44 = te[ 15 ];
//TODO: make this more efficient
//( based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm )
return (
n41 * (
+ n14 * n23 * n32
- n13 * n24 * n32
- n14 * n22 * n33
+ n12 * n24 * n33
+ n13 * n22 * n34
- n12 * n23 * n34
) +
n42 * (
+ n11 * n23 * n34
- n11 * n24 * n33
+ n14 * n21 * n33
- n13 * n21 * n34
+ n13 * n24 * n31
- n14 * n23 * n31
) +
n43 * (
+ n11 * n24 * n32
- n11 * n22 * n34
- n14 * n21 * n32
+ n12 * n21 * n34
+ n14 * n22 * n31
- n12 * n24 * n31
) +
n44 * (
- n13 * n22 * n31
- n11 * n23 * n32
+ n11 * n22 * n33
+ n13 * n21 * n32
- n12 * n21 * n33
+ n12 * n23 * n31
)
);
},
transpose: function () {
var te = this.elements;
var tmp;
tmp = te[ 1 ]; te[ 1 ] = te[ 4 ]; te[ 4 ] = tmp;
tmp = te[ 2 ]; te[ 2 ] = te[ 8 ]; te[ 8 ] = tmp;
tmp = te[ 6 ]; te[ 6 ] = te[ 9 ]; te[ 9 ] = tmp;
tmp = te[ 3 ]; te[ 3 ] = te[ 12 ]; te[ 12 ] = tmp;
tmp = te[ 7 ]; te[ 7 ] = te[ 13 ]; te[ 13 ] = tmp;
tmp = te[ 11 ]; te[ 11 ] = te[ 14 ]; te[ 14 ] = tmp;
return this;
},
setPosition: function ( v ) {
var te = this.elements;
te[ 12 ] = v.x;
te[ 13 ] = v.y;
te[ 14 ] = v.z;
return this;
},
getInverse: function ( m, throwOnDegenerate ) {
// based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm
var te = this.elements,
me = m.elements,
n11 = me[ 0 ], n21 = me[ 1 ], n31 = me[ 2 ], n41 = me[ 3 ],
n12 = me[ 4 ], n22 = me[ 5 ], n32 = me[ 6 ], n42 = me[ 7 ],
n13 = me[ 8 ], n23 = me[ 9 ], n33 = me[ 10 ], n43 = me[ 11 ],
n14 = me[ 12 ], n24 = me[ 13 ], n34 = me[ 14 ], n44 = me[ 15 ],
t11 = n23 * n34 * n42 - n24 * n33 * n42 + n24 * n32 * n43 - n22 * n34 * n43 - n23 * n32 * n44 + n22 * n33 * n44,
t12 = n14 * n33 * n42 - n13 * n34 * n42 - n14 * n32 * n43 + n12 * n34 * n43 + n13 * n32 * n44 - n12 * n33 * n44,
t13 = n13 * n24 * n42 - n14 * n23 * n42 + n14 * n22 * n43 - n12 * n24 * n43 - n13 * n22 * n44 + n12 * n23 * n44,
t14 = n14 * n23 * n32 - n13 * n24 * n32 - n14 * n22 * n33 + n12 * n24 * n33 + n13 * n22 * n34 - n12 * n23 * n34;
var det = n11 * t11 + n21 * t12 + n31 * t13 + n41 * t14;
if ( det === 0 ) {
var msg = "THREE.Matrix4: .getInverse() can't invert matrix, determinant is 0";
if ( throwOnDegenerate === true ) {
throw new Error( msg );
} else {
console.warn( msg );
}
return this.identity();
}
var detInv = 1 / det;
te[ 0 ] = t11 * detInv;
te[ 1 ] = ( n24 * n33 * n41 - n23 * n34 * n41 - n24 * n31 * n43 + n21 * n34 * n43 + n23 * n31 * n44 - n21 * n33 * n44 ) * detInv;
te[ 2 ] = ( n22 * n34 * n41 - n24 * n32 * n41 + n24 * n31 * n42 - n21 * n34 * n42 - n22 * n31 * n44 + n21 * n32 * n44 ) * detInv;
te[ 3 ] = ( n23 * n32 * n41 - n22 * n33 * n41 - n23 * n31 * n42 + n21 * n33 * n42 + n22 * n31 * n43 - n21 * n32 * n43 ) * detInv;
te[ 4 ] = t12 * detInv;
te[ 5 ] = ( n13 * n34 * n41 - n14 * n33 * n41 + n14 * n31 * n43 - n11 * n34 * n43 - n13 * n31 * n44 + n11 * n33 * n44 ) * detInv;
te[ 6 ] = ( n14 * n32 * n41 - n12 * n34 * n41 - n14 * n31 * n42 + n11 * n34 * n42 + n12 * n31 * n44 - n11 * n32 * n44 ) * detInv;
te[ 7 ] = ( n12 * n33 * n41 - n13 * n32 * n41 + n13 * n31 * n42 - n11 * n33 * n42 - n12 * n31 * n43 + n11 * n32 * n43 ) * detInv;
te[ 8 ] = t13 * detInv;
te[ 9 ] = ( n14 * n23 * n41 - n13 * n24 * n41 - n14 * n21 * n43 + n11 * n24 * n43 + n13 * n21 * n44 - n11 * n23 * n44 ) * detInv;
te[ 10 ] = ( n12 * n24 * n41 - n14 * n22 * n41 + n14 * n21 * n42 - n11 * n24 * n42 - n12 * n21 * n44 + n11 * n22 * n44 ) * detInv;
te[ 11 ] = ( n13 * n22 * n41 - n12 * n23 * n41 - n13 * n21 * n42 + n11 * n23 * n42 + n12 * n21 * n43 - n11 * n22 * n43 ) * detInv;
te[ 12 ] = t14 * detInv;
te[ 13 ] = ( n13 * n24 * n31 - n14 * n23 * n31 + n14 * n21 * n33 - n11 * n24 * n33 - n13 * n21 * n34 + n11 * n23 * n34 ) * detInv;
te[ 14 ] = ( n14 * n22 * n31 - n12 * n24 * n31 - n14 * n21 * n32 + n11 * n24 * n32 + n12 * n21 * n34 - n11 * n22 * n34 ) * detInv;
te[ 15 ] = ( n12 * n23 * n31 - n13 * n22 * n31 + n13 * n21 * n32 - n11 * n23 * n32 - n12 * n21 * n33 + n11 * n22 * n33 ) * detInv;
return this;
},
scale: function ( v ) {
var te = this.elements;
var x = v.x, y = v.y, z = v.z;
te[ 0 ] *= x; te[ 4 ] *= y; te[ 8 ] *= z;
te[ 1 ] *= x; te[ 5 ] *= y; te[ 9 ] *= z;
te[ 2 ] *= x; te[ 6 ] *= y; te[ 10 ] *= z;
te[ 3 ] *= x; te[ 7 ] *= y; te[ 11 ] *= z;
return this;
},
getMaxScaleOnAxis: function () {
var te = this.elements;
var scaleXSq = te[ 0 ] * te[ 0 ] + te[ 1 ] * te[ 1 ] + te[ 2 ] * te[ 2 ];
var scaleYSq = te[ 4 ] * te[ 4 ] + te[ 5 ] * te[ 5 ] + te[ 6 ] * te[ 6 ];
var scaleZSq = te[ 8 ] * te[ 8 ] + te[ 9 ] * te[ 9 ] + te[ 10 ] * te[ 10 ];
return Math.sqrt( Math.max( scaleXSq, scaleYSq, scaleZSq ) );
},
makeTranslation: function ( x, y, z ) {
this.set(
1, 0, 0, x,
0, 1, 0, y,
0, 0, 1, z,
0, 0, 0, 1
);
return this;
},
makeRotationX: function ( theta ) {
var c = Math.cos( theta ), s = Math.sin( theta );
this.set(
1, 0, 0, 0,
0, c, - s, 0,
0, s, c, 0,
0, 0, 0, 1
);
return this;
},
makeRotationY: function ( theta ) {
var c = Math.cos( theta ), s = Math.sin( theta );
this.set(
c, 0, s, 0,
0, 1, 0, 0,
- s, 0, c, 0,
0, 0, 0, 1
);
return this;
},
makeRotationZ: function ( theta ) {
var c = Math.cos( theta ), s = Math.sin( theta );
this.set(
c, - s, 0, 0,
s, c, 0, 0,
0, 0, 1, 0,
0, 0, 0, 1
);
return this;
},
makeRotationAxis: function ( axis, angle ) {
// Based on http://www.gamedev.net/reference/articles/article1199.asp
var c = Math.cos( angle );
var s = Math.sin( angle );
var t = 1 - c;
var x = axis.x, y = axis.y, z = axis.z;
var tx = t * x, ty = t * y;
this.set(
tx * x + c, tx * y - s * z, tx * z + s * y, 0,
tx * y + s * z, ty * y + c, ty * z - s * x, 0,
tx * z - s * y, ty * z + s * x, t * z * z + c, 0,
0, 0, 0, 1
);
return this;
},
makeScale: function ( x, y, z ) {
this.set(
x, 0, 0, 0,
0, y, 0, 0,
0, 0, z, 0,
0, 0, 0, 1
);
return this;
},
makeShear: function ( x, y, z ) {
this.set(
1, y, z, 0,
x, 1, z, 0,
x, y, 1, 0,
0, 0, 0, 1
);
return this;
},
compose: function ( position, quaternion, scale ) {
this.makeRotationFromQuaternion( quaternion );
this.scale( scale );
this.setPosition( position );
return this;
},
decompose: function () {
var vector = new Vector3();
var matrix = new Matrix4();
return function decompose( position, quaternion, scale ) {
var te = this.elements;
var sx = vector.set( te[ 0 ], te[ 1 ], te[ 2 ] ).length();
var sy = vector.set( te[ 4 ], te[ 5 ], te[ 6 ] ).length();
var sz = vector.set( te[ 8 ], te[ 9 ], te[ 10 ] ).length();
// if determine is negative, we need to invert one scale
var det = this.determinant();
if ( det < 0 ) sx = - sx;
position.x = te[ 12 ];
position.y = te[ 13 ];
position.z = te[ 14 ];
// scale the rotation part
matrix.copy( this );
var invSX = 1 / sx;
var invSY = 1 / sy;
var invSZ = 1 / sz;
matrix.elements[ 0 ] *= invSX;
matrix.elements[ 1 ] *= invSX;
matrix.elements[ 2 ] *= invSX;
matrix.elements[ 4 ] *= invSY;
matrix.elements[ 5 ] *= invSY;
matrix.elements[ 6 ] *= invSY;
matrix.elements[ 8 ] *= invSZ;
matrix.elements[ 9 ] *= invSZ;
matrix.elements[ 10 ] *= invSZ;
quaternion.setFromRotationMatrix( matrix );
scale.x = sx;
scale.y = sy;
scale.z = sz;
return this;
};
}(),
makePerspective: function ( left, right, top, bottom, near, far ) {
if ( far === undefined ) {
console.warn( 'THREE.Matrix4: .makePerspective() has been redefined and has a new signature. Please check the docs.' );
}
var te = this.elements;
var x = 2 * near / ( right - left );
var y = 2 * near / ( top - bottom );
var a = ( right + left ) / ( right - left );
var b = ( top + bottom ) / ( top - bottom );
var c = - ( far + near ) / ( far - near );
var d = - 2 * far * near / ( far - near );
te[ 0 ] = x; te[ 4 ] = 0; te[ 8 ] = a; te[ 12 ] = 0;
te[ 1 ] = 0; te[ 5 ] = y; te[ 9 ] = b; te[ 13 ] = 0;
te[ 2 ] = 0; te[ 6 ] = 0; te[ 10 ] = c; te[ 14 ] = d;
te[ 3 ] = 0; te[ 7 ] = 0; te[ 11 ] = - 1; te[ 15 ] = 0;
return this;
},
makeOrthographic: function ( left, right, top, bottom, near, far ) {
var te = this.elements;
var w = 1.0 / ( right - left );
var h = 1.0 / ( top - bottom );
var p = 1.0 / ( far - near );
var x = ( right + left ) * w;
var y = ( top + bottom ) * h;
var z = ( far + near ) * p;
te[ 0 ] = 2 * w; te[ 4 ] = 0; te[ 8 ] = 0; te[ 12 ] = - x;
te[ 1 ] = 0; te[ 5 ] = 2 * h; te[ 9 ] = 0; te[ 13 ] = - y;
te[ 2 ] = 0; te[ 6 ] = 0; te[ 10 ] = - 2 * p; te[ 14 ] = - z;
te[ 3 ] = 0; te[ 7 ] = 0; te[ 11 ] = 0; te[ 15 ] = 1;
return this;
},
equals: function ( matrix ) {
var te = this.elements;
var me = matrix.elements;
for ( var i = 0; i < 16; i ++ ) {
if ( te[ i ] !== me[ i ] ) return false;
}
return true;
},
fromArray: function ( array, offset ) {
if ( offset === undefined ) offset = 0;
for ( var i = 0; i < 16; i ++ ) {
this.elements[ i ] = array[ i + offset ];
}
return this;
},
toArray: function ( array, offset ) {
if ( array === undefined ) array = [];
if ( offset === undefined ) offset = 0;
var te = this.elements;
array[ offset ] = te[ 0 ];
array[ offset + 1 ] = te[ 1 ];
array[ offset + 2 ] = te[ 2 ];
array[ offset + 3 ] = te[ 3 ];
array[ offset + 4 ] = te[ 4 ];
array[ offset + 5 ] = te[ 5 ];
array[ offset + 6 ] = te[ 6 ];
array[ offset + 7 ] = te[ 7 ];
array[ offset + 8 ] = te[ 8 ];
array[ offset + 9 ] = te[ 9 ];
array[ offset + 10 ] = te[ 10 ];
array[ offset + 11 ] = te[ 11 ];
array[ offset + 12 ] = te[ 12 ];
array[ offset + 13 ] = te[ 13 ];
array[ offset + 14 ] = te[ 14 ];
array[ offset + 15 ] = te[ 15 ];
return array;
}
} );
/**
* @author mikael emtinger / http://gomo.se/
* @author alteredq / http://alteredqualia.com/
* @author WestLangley / http://github.com/WestLangley
* @author bhouston / http://clara.io
*/
function Quaternion( x, y, z, w ) {
this._x = x || 0;
this._y = y || 0;
this._z = z || 0;
this._w = ( w !== undefined ) ? w : 1;
}
Object.assign( Quaternion, {
slerp: function ( qa, qb, qm, t ) {
return qm.copy( qa ).slerp( qb, t );
},
slerpFlat: function ( dst, dstOffset, src0, srcOffset0, src1, srcOffset1, t ) {
// fuzz-free, array-based Quaternion SLERP operation
var x0 = src0[ srcOffset0 + 0 ],
y0 = src0[ srcOffset0 + 1 ],
z0 = src0[ srcOffset0 + 2 ],
w0 = src0[ srcOffset0 + 3 ],
x1 = src1[ srcOffset1 + 0 ],
y1 = src1[ srcOffset1 + 1 ],
z1 = src1[ srcOffset1 + 2 ],
w1 = src1[ srcOffset1 + 3 ];
if ( w0 !== w1 || x0 !== x1 || y0 !== y1 || z0 !== z1 ) {
var s = 1 - t,
cos = x0 * x1 + y0 * y1 + z0 * z1 + w0 * w1,
dir = ( cos >= 0 ? 1 : - 1 ),
sqrSin = 1 - cos * cos;
// Skip the Slerp for tiny steps to avoid numeric problems:
if ( sqrSin > Number.EPSILON ) {
var sin = Math.sqrt( sqrSin ),
len = Math.atan2( sin, cos * dir );
s = Math.sin( s * len ) / sin;
t = Math.sin( t * len ) / sin;
}
var tDir = t * dir;
x0 = x0 * s + x1 * tDir;
y0 = y0 * s + y1 * tDir;
z0 = z0 * s + z1 * tDir;
w0 = w0 * s + w1 * tDir;
// Normalize in case we just did a lerp:
if ( s === 1 - t ) {
var f = 1 / Math.sqrt( x0 * x0 + y0 * y0 + z0 * z0 + w0 * w0 );
x0 *= f;
y0 *= f;
z0 *= f;
w0 *= f;
}
}
dst[ dstOffset ] = x0;
dst[ dstOffset + 1 ] = y0;
dst[ dstOffset + 2 ] = z0;
dst[ dstOffset + 3 ] = w0;
}
} );
Object.defineProperties( Quaternion.prototype, {
x: {
get: function () {
return this._x;
},
set: function ( value ) {
this._x = value;
this.onChangeCallback();
}
},
y: {
get: function () {
return this._y;
},
set: function ( value ) {
this._y = value;
this.onChangeCallback();
}
},
z: {
get: function () {
return this._z;
},
set: function ( value ) {
this._z = value;
this.onChangeCallback();
}
},
w: {
get: function () {
return this._w;
},
set: function ( value ) {
this._w = value;
this.onChangeCallback();
}
}
} );
Object.assign( Quaternion.prototype, {
set: function ( x, y, z, w ) {
this._x = x;
this._y = y;
this._z = z;
this._w = w;
this.onChangeCallback();
return this;
},
clone: function () {
return new this.constructor( this._x, this._y, this._z, this._w );
},
copy: function ( quaternion ) {
this._x = quaternion.x;
this._y = quaternion.y;
this._z = quaternion.z;
this._w = quaternion.w;
this.onChangeCallback();
return this;
},
setFromEuler: function ( euler, update ) {
if ( ! ( euler && euler.isEuler ) ) {
throw new Error( 'THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.' );
}
var x = euler._x, y = euler._y, z = euler._z, order = euler.order;
// http://www.mathworks.com/matlabcentral/fileexchange/
// 20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/
// content/SpinCalc.m
var cos = Math.cos;
var sin = Math.sin;
var c1 = cos( x / 2 );
var c2 = cos( y / 2 );
var c3 = cos( z / 2 );
var s1 = sin( x / 2 );
var s2 = sin( y / 2 );
var s3 = sin( z / 2 );
if ( order === 'XYZ' ) {
this._x = s1 * c2 * c3 + c1 * s2 * s3;
this._y = c1 * s2 * c3 - s1 * c2 * s3;
this._z = c1 * c2 * s3 + s1 * s2 * c3;
this._w = c1 * c2 * c3 - s1 * s2 * s3;
} else if ( order === 'YXZ' ) {
this._x = s1 * c2 * c3 + c1 * s2 * s3;
this._y = c1 * s2 * c3 - s1 * c2 * s3;
this._z = c1 * c2 * s3 - s1 * s2 * c3;
this._w = c1 * c2 * c3 + s1 * s2 * s3;
} else if ( order === 'ZXY' ) {
this._x = s1 * c2 * c3 - c1 * s2 * s3;
this._y = c1 * s2 * c3 + s1 * c2 * s3;
this._z = c1 * c2 * s3 + s1 * s2 * c3;
this._w = c1 * c2 * c3 - s1 * s2 * s3;
} else if ( order === 'ZYX' ) {
this._x = s1 * c2 * c3 - c1 * s2 * s3;
this._y = c1 * s2 * c3 + s1 * c2 * s3;
this._z = c1 * c2 * s3 - s1 * s2 * c3;
this._w = c1 * c2 * c3 + s1 * s2 * s3;
} else if ( order === 'YZX' ) {
this._x = s1 * c2 * c3 + c1 * s2 * s3;
this._y = c1 * s2 * c3 + s1 * c2 * s3;
this._z = c1 * c2 * s3 - s1 * s2 * c3;
this._w = c1 * c2 * c3 - s1 * s2 * s3;
} else if ( order === 'XZY' ) {
this._x = s1 * c2 * c3 - c1 * s2 * s3;
this._y = c1 * s2 * c3 - s1 * c2 * s3;
this._z = c1 * c2 * s3 + s1 * s2 * c3;
this._w = c1 * c2 * c3 + s1 * s2 * s3;
}
if ( update !== false ) this.onChangeCallback();
return this;
},
setFromAxisAngle: function ( axis, angle ) {
// http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm
// assumes axis is normalized
var halfAngle = angle / 2, s = Math.sin( halfAngle );
this._x = axis.x * s;
this._y = axis.y * s;
this._z = axis.z * s;
this._w = Math.cos( halfAngle );
this.onChangeCallback();
return this;
},
setFromRotationMatrix: function ( m ) {
// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm
// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)
var te = m.elements,
m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ],
m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ],
m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ],
trace = m11 + m22 + m33,
s;
if ( trace > 0 ) {
s = 0.5 / Math.sqrt( trace + 1.0 );
this._w = 0.25 / s;
this._x = ( m32 - m23 ) * s;
this._y = ( m13 - m31 ) * s;
this._z = ( m21 - m12 ) * s;
} else if ( m11 > m22 && m11 > m33 ) {
s = 2.0 * Math.sqrt( 1.0 + m11 - m22 - m33 );
this._w = ( m32 - m23 ) / s;
this._x = 0.25 * s;
this._y = ( m12 + m21 ) / s;
this._z = ( m13 + m31 ) / s;
} else if ( m22 > m33 ) {
s = 2.0 * Math.sqrt( 1.0 + m22 - m11 - m33 );
this._w = ( m13 - m31 ) / s;
this._x = ( m12 + m21 ) / s;
this._y = 0.25 * s;
this._z = ( m23 + m32 ) / s;
} else {
s = 2.0 * Math.sqrt( 1.0 + m33 - m11 - m22 );
this._w = ( m21 - m12 ) / s;
this._x = ( m13 + m31 ) / s;
this._y = ( m23 + m32 ) / s;
this._z = 0.25 * s;
}
this.onChangeCallback();
return this;
},
setFromUnitVectors: function () {
// assumes direction vectors vFrom and vTo are normalized
var v1 = new Vector3();
var r;
var EPS = 0.000001;
return function setFromUnitVectors( vFrom, vTo ) {
if ( v1 === undefined ) v1 = new Vector3();
r = vFrom.dot( vTo ) + 1;
if ( r < EPS ) {
r = 0;
if ( Math.abs( vFrom.x ) > Math.abs( vFrom.z ) ) {
v1.set( - vFrom.y, vFrom.x, 0 );
} else {
v1.set( 0, - vFrom.z, vFrom.y );
}
} else {
v1.crossVectors( vFrom, vTo );
}
this._x = v1.x;
this._y = v1.y;
this._z = v1.z;
this._w = r;
return this.normalize();
};
}(),
inverse: function () {
// quaternion is assumed to have unit length
return this.conjugate();
},
conjugate: function () {
this._x *= - 1;
this._y *= - 1;
this._z *= - 1;
this.onChangeCallback();
return this;
},
dot: function ( v ) {
return this._x * v._x + this._y * v._y + this._z * v._z + this._w * v._w;
},
lengthSq: function () {
return this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w;
},
length: function () {
return Math.sqrt( this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w );
},
normalize: function () {
var l = this.length();
if ( l === 0 ) {
this._x = 0;
this._y = 0;
this._z = 0;
this._w = 1;
} else {
l = 1 / l;
this._x = this._x * l;
this._y = this._y * l;
this._z = this._z * l;
this._w = this._w * l;
}
this.onChangeCallback();
return this;
},
multiply: function ( q, p ) {
if ( p !== undefined ) {
console.warn( 'THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead.' );
return this.multiplyQuaternions( q, p );
}
return this.multiplyQuaternions( this, q );
},
premultiply: function ( q ) {
return this.multiplyQuaternions( q, this );
},
multiplyQuaternions: function ( a, b ) {
// from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm
var qax = a._x, qay = a._y, qaz = a._z, qaw = a._w;
var qbx = b._x, qby = b._y, qbz = b._z, qbw = b._w;
this._x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby;
this._y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz;
this._z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx;
this._w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz;
this.onChangeCallback();
return this;
},
slerp: function ( qb, t ) {
if ( t === 0 ) return this;
if ( t === 1 ) return this.copy( qb );
var x = this._x, y = this._y, z = this._z, w = this._w;
// http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/
var cosHalfTheta = w * qb._w + x * qb._x + y * qb._y + z * qb._z;
if ( cosHalfTheta < 0 ) {
this._w = - qb._w;
this._x = - qb._x;
this._y = - qb._y;
this._z = - qb._z;
cosHalfTheta = - cosHalfTheta;
} else {
this.copy( qb );
}
if ( cosHalfTheta >= 1.0 ) {
this._w = w;
this._x = x;
this._y = y;
this._z = z;
return this;
}
var sinHalfTheta = Math.sqrt( 1.0 - cosHalfTheta * cosHalfTheta );
if ( Math.abs( sinHalfTheta ) < 0.001 ) {
this._w = 0.5 * ( w + this._w );
this._x = 0.5 * ( x + this._x );
this._y = 0.5 * ( y + this._y );
this._z = 0.5 * ( z + this._z );
return this;
}
var halfTheta = Math.atan2( sinHalfTheta, cosHalfTheta );
var ratioA = Math.sin( ( 1 - t ) * halfTheta ) / sinHalfTheta,
ratioB = Math.sin( t * halfTheta ) / sinHalfTheta;
this._w = ( w * ratioA + this._w * ratioB );
this._x = ( x * ratioA + this._x * ratioB );
this._y = ( y * ratioA + this._y * ratioB );
this._z = ( z * ratioA + this._z * ratioB );
this.onChangeCallback();
return this;
},
equals: function ( quaternion ) {
return ( quaternion._x === this._x ) && ( quaternion._y === this._y ) && ( quaternion._z === this._z ) && ( quaternion._w === this._w );
},
fromArray: function ( array, offset ) {
if ( offset === undefined ) offset = 0;
this._x = array[ offset ];
this._y = array[ offset + 1 ];
this._z = array[ offset + 2 ];
this._w = array[ offset + 3 ];
this.onChangeCallback();
return this;
},
toArray: function ( array, offset ) {
if ( array === undefined ) array = [];
if ( offset === undefined ) offset = 0;
array[ offset ] = this._x;
array[ offset + 1 ] = this._y;
array[ offset + 2 ] = this._z;
array[ offset + 3 ] = this._w;
return array;
},
onChange: function ( callback ) {
this.onChangeCallback = callback;
return this;
},
onChangeCallback: function () {}
} );
/**
* @author mrdoob / http://mrdoob.com/
* @author kile / http://kile.stravaganza.org/
* @author philogb / http://blog.thejit.org/
* @author mikael emtinger / http://gomo.se/
* @author egraether / http://egraether.com/
* @author WestLangley / http://github.com/WestLangley
*/
function Vector3( x, y, z ) {
this.x = x || 0;
this.y = y || 0;
this.z = z || 0;
}
Object.assign( Vector3.prototype, {
isVector3: true,
set: function ( x, y, z ) {
this.x = x;
this.y = y;
this.z = z;
return this;
},
setScalar: function ( scalar ) {
this.x = scalar;
this.y = scalar;
this.z = scalar;
return this;
},
setX: function ( x ) {
this.x = x;
return this;
},
setY: function ( y ) {
this.y = y;
return this;
},
setZ: function ( z ) {
this.z = z;
return this;
},
setComponent: function ( index, value ) {
switch ( index ) {
case 0: this.x = value; break;
case 1: this.y = value; break;
case 2: this.z = value; break;
default: throw new Error( 'index is out of range: ' + index );
}
return this;
},
getComponent: function ( index ) {
switch ( index ) {
case 0: return this.x;
case 1: return this.y;
case 2: return this.z;
default: throw new Error( 'index is out of range: ' + index );
}
},
clone: function () {
return new this.constructor( this.x, this.y, this.z );
},
copy: function ( v ) {
this.x = v.x;
this.y = v.y;
this.z = v.z;
return this;
},
add: function ( v, w ) {
if ( w !== undefined ) {
console.warn( 'THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );
return this.addVectors( v, w );
}
this.x += v.x;
this.y += v.y;
this.z += v.z;
return this;
},
addScalar: function ( s ) {
this.x += s;
this.y += s;
this.z += s;
return this;
},
addVectors: function ( a, b ) {
this.x = a.x + b.x;
this.y = a.y + b.y;
this.z = a.z + b.z;
return this;
},
addScaledVector: function ( v, s ) {
this.x += v.x * s;
this.y += v.y * s;
this.z += v.z * s;
return this;
},
sub: function ( v, w ) {
if ( w !== undefined ) {
console.warn( 'THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );
return this.subVectors( v, w );
}
this.x -= v.x;
this.y -= v.y;
this.z -= v.z;
return this;
},
subScalar: function ( s ) {
this.x -= s;
this.y -= s;
this.z -= s;
return this;
},
subVectors: function ( a, b ) {
this.x = a.x - b.x;
this.y = a.y - b.y;
this.z = a.z - b.z;
return this;
},
multiply: function ( v, w ) {
if ( w !== undefined ) {
console.warn( 'THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead.' );
return this.multiplyVectors( v, w );
}
this.x *= v.x;
this.y *= v.y;
this.z *= v.z;
return this;
},
multiplyScalar: function ( scalar ) {
this.x *= scalar;
this.y *= scalar;
this.z *= scalar;
return this;
},
multiplyVectors: function ( a, b ) {
this.x = a.x * b.x;
this.y = a.y * b.y;
this.z = a.z * b.z;
return this;
},
applyEuler: function () {
var quaternion = new Quaternion();
return function applyEuler( euler ) {
if ( ! ( euler && euler.isEuler ) ) {
console.error( 'THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order.' );
}
return this.applyQuaternion( quaternion.setFromEuler( euler ) );
};
}(),
applyAxisAngle: function () {
var quaternion = new Quaternion();
return function applyAxisAngle( axis, angle ) {
return this.applyQuaternion( quaternion.setFromAxisAngle( axis, angle ) );
};
}(),
applyMatrix3: function ( m ) {
var x = this.x, y = this.y, z = this.z;
var e = m.elements;
this.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ] * z;
this.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ] * z;
this.z = e[ 2 ] * x + e[ 5 ] * y + e[ 8 ] * z;
return this;
},
applyMatrix4: function ( m ) {
var x = this.x, y = this.y, z = this.z;
var e = m.elements;
var w = 1 / ( e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] );
this.x = ( e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] ) * w;
this.y = ( e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] ) * w;
this.z = ( e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] ) * w;
return this;
},
applyQuaternion: function ( q ) {
var x = this.x, y = this.y, z = this.z;
var qx = q.x, qy = q.y, qz = q.z, qw = q.w;
// calculate quat * vector
var ix = qw * x + qy * z - qz * y;
var iy = qw * y + qz * x - qx * z;
var iz = qw * z + qx * y - qy * x;
var iw = - qx * x - qy * y - qz * z;
// calculate result * inverse quat
this.x = ix * qw + iw * - qx + iy * - qz - iz * - qy;
this.y = iy * qw + iw * - qy + iz * - qx - ix * - qz;
this.z = iz * qw + iw * - qz + ix * - qy - iy * - qx;
return this;
},
project: function () {
var matrix = new Matrix4();
return function project( camera ) {
matrix.multiplyMatrices( camera.projectionMatrix, matrix.getInverse( camera.matrixWorld ) );
return this.applyMatrix4( matrix );
};
}(),
unproject: function () {
var matrix = new Matrix4();
return function unproject( camera ) {
matrix.multiplyMatrices( camera.matrixWorld, matrix.getInverse( camera.projectionMatrix ) );
return this.applyMatrix4( matrix );
};
}(),
transformDirection: function ( m ) {
// input: THREE.Matrix4 affine matrix
// vector interpreted as a direction
var x = this.x, y = this.y, z = this.z;
var e = m.elements;
this.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z;
this.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z;
this.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z;
return this.normalize();
},
divide: function ( v ) {
this.x /= v.x;
this.y /= v.y;
this.z /= v.z;
return this;
},
divideScalar: function ( scalar ) {
return this.multiplyScalar( 1 / scalar );
},
min: function ( v ) {
this.x = Math.min( this.x, v.x );
this.y = Math.min( this.y, v.y );
this.z = Math.min( this.z, v.z );
return this;
},
max: function ( v ) {
this.x = Math.max( this.x, v.x );
this.y = Math.max( this.y, v.y );
this.z = Math.max( this.z, v.z );
return this;
},
clamp: function ( min, max ) {
// assumes min < max, componentwise
this.x = Math.max( min.x, Math.min( max.x, this.x ) );
this.y = Math.max( min.y, Math.min( max.y, this.y ) );
this.z = Math.max( min.z, Math.min( max.z, this.z ) );
return this;
},
clampScalar: function () {
var min = new Vector3();
var max = new Vector3();
return function clampScalar( minVal, maxVal ) {
min.set( minVal, minVal, minVal );
max.set( maxVal, maxVal, maxVal );
return this.clamp( min, max );
};
}(),
clampLength: function ( min, max ) {
var length = this.length();
return this.divideScalar( length || 1 ).multiplyScalar( Math.max( min, Math.min( max, length ) ) );
},
floor: function () {
this.x = Math.floor( this.x );
this.y = Math.floor( this.y );
this.z = Math.floor( this.z );
return this;
},
ceil: function () {
this.x = Math.ceil( this.x );
this.y = Math.ceil( this.y );
this.z = Math.ceil( this.z );
return this;
},
round: function () {
this.x = Math.round( this.x );
this.y = Math.round( this.y );
this.z = Math.round( this.z );
return this;
},
roundToZero: function () {
this.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );
this.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );
this.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z );
return this;
},
negate: function () {
this.x = - this.x;
this.y = - this.y;
this.z = - this.z;
return this;
},
dot: function ( v ) {
return this.x * v.x + this.y * v.y + this.z * v.z;
},
// TODO lengthSquared?
lengthSq: function () {
return this.x * this.x + this.y * this.y + this.z * this.z;
},
length: function () {
return Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z );
},
manhattanLength: function () {
return Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z );
},
normalize: function () {
return this.divideScalar( this.length() || 1 );
},
setLength: function ( length ) {
return this.normalize().multiplyScalar( length );
},
lerp: function ( v, alpha ) {
this.x += ( v.x - this.x ) * alpha;
this.y += ( v.y - this.y ) * alpha;
this.z += ( v.z - this.z ) * alpha;
return this;
},
lerpVectors: function ( v1, v2, alpha ) {
return this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 );
},
cross: function ( v, w ) {
if ( w !== undefined ) {
console.warn( 'THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead.' );
return this.crossVectors( v, w );
}
return this.crossVectors( this, v );
},
crossVectors: function ( a, b ) {
var ax = a.x, ay = a.y, az = a.z;
var bx = b.x, by = b.y, bz = b.z;
this.x = ay * bz - az * by;
this.y = az * bx - ax * bz;
this.z = ax * by - ay * bx;
return this;
},
projectOnVector: function ( vector ) {
var scalar = vector.dot( this ) / vector.lengthSq();
return this.copy( vector ).multiplyScalar( scalar );
},
projectOnPlane: function () {
var v1 = new Vector3();
return function projectOnPlane( planeNormal ) {
v1.copy( this ).projectOnVector( planeNormal );
return this.sub( v1 );
};
}(),
reflect: function () {
// reflect incident vector off plane orthogonal to normal
// normal is assumed to have unit length
var v1 = new Vector3();
return function reflect( normal ) {
return this.sub( v1.copy( normal ).multiplyScalar( 2 * this.dot( normal ) ) );
};
}(),
angleTo: function ( v ) {
var theta = this.dot( v ) / ( Math.sqrt( this.lengthSq() * v.lengthSq() ) );
// clamp, to handle numerical problems
return Math.acos( _Math.clamp( theta, - 1, 1 ) );
},
distanceTo: function ( v ) {
return Math.sqrt( this.distanceToSquared( v ) );
},
distanceToSquared: function ( v ) {
var dx = this.x - v.x, dy = this.y - v.y, dz = this.z - v.z;
return dx * dx + dy * dy + dz * dz;
},
manhattanDistanceTo: function ( v ) {
return Math.abs( this.x - v.x ) + Math.abs( this.y - v.y ) + Math.abs( this.z - v.z );
},
setFromSpherical: function ( s ) {
var sinPhiRadius = Math.sin( s.phi ) * s.radius;
this.x = sinPhiRadius * Math.sin( s.theta );
this.y = Math.cos( s.phi ) * s.radius;
this.z = sinPhiRadius * Math.cos( s.theta );
return this;
},
setFromCylindrical: function ( c ) {
this.x = c.radius * Math.sin( c.theta );
this.y = c.y;
this.z = c.radius * Math.cos( c.theta );
return this;
},
setFromMatrixPosition: function ( m ) {
var e = m.elements;
this.x = e[ 12 ];
this.y = e[ 13 ];
this.z = e[ 14 ];
return this;
},
setFromMatrixScale: function ( m ) {
var sx = this.setFromMatrixColumn( m, 0 ).length();
var sy = this.setFromMatrixColumn( m, 1 ).length();
var sz = this.setFromMatrixColumn( m, 2 ).length();
this.x = sx;
this.y = sy;
this.z = sz;
return this;
},
setFromMatrixColumn: function ( m, index ) {
return this.fromArray( m.elements, index * 4 );
},
equals: function ( v ) {
return ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) );
},
fromArray: function ( array, offset ) {
if ( offset === undefined ) offset = 0;
this.x = array[ offset ];
this.y = array[ offset + 1 ];
this.z = array[ offset + 2 ];
return this;
},
toArray: function ( array, offset ) {
if ( array === undefined ) array = [];
if ( offset === undefined ) offset = 0;
array[ offset ] = this.x;
array[ offset + 1 ] = this.y;
array[ offset + 2 ] = this.z;
return array;
},
fromBufferAttribute: function ( attribute, index, offset ) {
if ( offset !== undefined ) {
console.warn( 'THREE.Vector3: offset has been removed from .fromBufferAttribute().' );
}
this.x = attribute.getX( index );
this.y = attribute.getY( index );
this.z = attribute.getZ( index );
return this;
}
} );
/**
* @author alteredq / http://alteredqualia.com/
* @author WestLangley / http://github.com/WestLangley
* @author bhouston / http://clara.io
* @author tschw
*/
function Matrix3() {
this.elements = [
1, 0, 0,
0, 1, 0,
0, 0, 1
];
if ( arguments.length > 0 ) {
console.error( 'THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.' );
}
}
Object.assign( Matrix3.prototype, {
isMatrix3: true,
set: function ( n11, n12, n13, n21, n22, n23, n31, n32, n33 ) {
var te = this.elements;
te[ 0 ] = n11; te[ 1 ] = n21; te[ 2 ] = n31;
te[ 3 ] = n12; te[ 4 ] = n22; te[ 5 ] = n32;
te[ 6 ] = n13; te[ 7 ] = n23; te[ 8 ] = n33;
return this;
},
identity: function () {
this.set(
1, 0, 0,
0, 1, 0,
0, 0, 1
);
return this;
},
clone: function () {
return new this.constructor().fromArray( this.elements );
},
copy: function ( m ) {
var te = this.elements;
var me = m.elements;
te[ 0 ] = me[ 0 ]; te[ 1 ] = me[ 1 ]; te[ 2 ] = me[ 2 ];
te[ 3 ] = me[ 3 ]; te[ 4 ] = me[ 4 ]; te[ 5 ] = me[ 5 ];
te[ 6 ] = me[ 6 ]; te[ 7 ] = me[ 7 ]; te[ 8 ] = me[ 8 ];
return this;
},
setFromMatrix4: function ( m ) {
var me = m.elements;
this.set(
me[ 0 ], me[ 4 ], me[ 8 ],
me[ 1 ], me[ 5 ], me[ 9 ],
me[ 2 ], me[ 6 ], me[ 10 ]
);
return this;
},
applyToBufferAttribute: function () {
var v1 = new Vector3();
return function applyToBufferAttribute( attribute ) {
for ( var i = 0, l = attribute.count; i < l; i ++ ) {
v1.x = attribute.getX( i );
v1.y = attribute.getY( i );
v1.z = attribute.getZ( i );
v1.applyMatrix3( this );
attribute.setXYZ( i, v1.x, v1.y, v1.z );
}
return attribute;
};
}(),
multiply: function ( m ) {
return this.multiplyMatrices( this, m );
},
premultiply: function ( m ) {
return this.multiplyMatrices( m, this );
},
multiplyMatrices: function ( a, b ) {
var ae = a.elements;
var be = b.elements;
var te = this.elements;
var a11 = ae[ 0 ], a12 = ae[ 3 ], a13 = ae[ 6 ];
var a21 = ae[ 1 ], a22 = ae[ 4 ], a23 = ae[ 7 ];
var a31 = ae[ 2 ], a32 = ae[ 5 ], a33 = ae[ 8 ];
var b11 = be[ 0 ], b12 = be[ 3 ], b13 = be[ 6 ];
var b21 = be[ 1 ], b22 = be[ 4 ], b23 = be[ 7 ];
var b31 = be[ 2 ], b32 = be[ 5 ], b33 = be[ 8 ];
te[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31;
te[ 3 ] = a11 * b12 + a12 * b22 + a13 * b32;
te[ 6 ] = a11 * b13 + a12 * b23 + a13 * b33;
te[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31;
te[ 4 ] = a21 * b12 + a22 * b22 + a23 * b32;
te[ 7 ] = a21 * b13 + a22 * b23 + a23 * b33;
te[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31;
te[ 5 ] = a31 * b12 + a32 * b22 + a33 * b32;
te[ 8 ] = a31 * b13 + a32 * b23 + a33 * b33;
return this;
},
multiplyScalar: function ( s ) {
var te = this.elements;
te[ 0 ] *= s; te[ 3 ] *= s; te[ 6 ] *= s;
te[ 1 ] *= s; te[ 4 ] *= s; te[ 7 ] *= s;
te[ 2 ] *= s; te[ 5 ] *= s; te[ 8 ] *= s;
return this;
},
determinant: function () {
var te = this.elements;
var a = te[ 0 ], b = te[ 1 ], c = te[ 2 ],
d = te[ 3 ], e = te[ 4 ], f = te[ 5 ],
g = te[ 6 ], h = te[ 7 ], i = te[ 8 ];
return a * e * i - a * f * h - b * d * i + b * f * g + c * d * h - c * e * g;
},
getInverse: function ( matrix, throwOnDegenerate ) {
if ( matrix && matrix.isMatrix4 ) {
console.error( "THREE.Matrix3: .getInverse() no longer takes a Matrix4 argument." );
}
var me = matrix.elements,
te = this.elements,
n11 = me[ 0 ], n21 = me[ 1 ], n31 = me[ 2 ],
n12 = me[ 3 ], n22 = me[ 4 ], n32 = me[ 5 ],
n13 = me[ 6 ], n23 = me[ 7 ], n33 = me[ 8 ],
t11 = n33 * n22 - n32 * n23,
t12 = n32 * n13 - n33 * n12,
t13 = n23 * n12 - n22 * n13,
det = n11 * t11 + n21 * t12 + n31 * t13;
if ( det === 0 ) {
var msg = "THREE.Matrix3: .getInverse() can't invert matrix, determinant is 0";
if ( throwOnDegenerate === true ) {
throw new Error( msg );
} else {
console.warn( msg );
}
return this.identity();
}
var detInv = 1 / det;
te[ 0 ] = t11 * detInv;
te[ 1 ] = ( n31 * n23 - n33 * n21 ) * detInv;
te[ 2 ] = ( n32 * n21 - n31 * n22 ) * detInv;
te[ 3 ] = t12 * detInv;
te[ 4 ] = ( n33 * n11 - n31 * n13 ) * detInv;
te[ 5 ] = ( n31 * n12 - n32 * n11 ) * detInv;
te[ 6 ] = t13 * detInv;
te[ 7 ] = ( n21 * n13 - n23 * n11 ) * detInv;
te[ 8 ] = ( n22 * n11 - n21 * n12 ) * detInv;
return this;
},
transpose: function () {
var tmp, m = this.elements;
tmp = m[ 1 ]; m[ 1 ] = m[ 3 ]; m[ 3 ] = tmp;
tmp = m[ 2 ]; m[ 2 ] = m[ 6 ]; m[ 6 ] = tmp;
tmp = m[ 5 ]; m[ 5 ] = m[ 7 ]; m[ 7 ] = tmp;
return this;
},
getNormalMatrix: function ( matrix4 ) {
return this.setFromMatrix4( matrix4 ).getInverse( this ).transpose();
},
transposeIntoArray: function ( r ) {
var m = this.elements;
r[ 0 ] = m[ 0 ];
r[ 1 ] = m[ 3 ];
r[ 2 ] = m[ 6 ];
r[ 3 ] = m[ 1 ];
r[ 4 ] = m[ 4 ];
r[ 5 ] = m[ 7 ];
r[ 6 ] = m[ 2 ];
r[ 7 ] = m[ 5 ];
r[ 8 ] = m[ 8 ];
return this;
},
setUvTransform: function ( tx, ty, sx, sy, rotation, cx, cy ) {
var c = Math.cos( rotation );
var s = Math.sin( rotation );
this.set(
sx * c, sx * s, - sx * ( c * cx + s * cy ) + cx + tx,
- sy * s, sy * c, - sy * ( - s * cx + c * cy ) + cy + ty,
0, 0, 1
);
},
scale: function ( sx, sy ) {
var te = this.elements;
te[ 0 ] *= sx; te[ 3 ] *= sx; te[ 6 ] *= sx;
te[ 1 ] *= sy; te[ 4 ] *= sy; te[ 7 ] *= sy;
return this;
},
rotate: function ( theta ) {
var c = Math.cos( theta );
var s = Math.sin( theta );
var te = this.elements;
var a11 = te[ 0 ], a12 = te[ 3 ], a13 = te[ 6 ];
var a21 = te[ 1 ], a22 = te[ 4 ], a23 = te[ 7 ];
te[ 0 ] = c * a11 + s * a21;
te[ 3 ] = c * a12 + s * a22;
te[ 6 ] = c * a13 + s * a23;
te[ 1 ] = - s * a11 + c * a21;
te[ 4 ] = - s * a12 + c * a22;
te[ 7 ] = - s * a13 + c * a23;
return this;
},
translate: function ( tx, ty ) {
var te = this.elements;
te[ 0 ] += tx * te[ 2 ]; te[ 3 ] += tx * te[ 5 ]; te[ 6 ] += tx * te[ 8 ];
te[ 1 ] += ty * te[ 2 ]; te[ 4 ] += ty * te[ 5 ]; te[ 7 ] += ty * te[ 8 ];
return this;
},
equals: function ( matrix ) {
var te = this.elements;
var me = matrix.elements;
for ( var i = 0; i < 9; i ++ ) {
if ( te[ i ] !== me[ i ] ) return false;
}
return true;
},
fromArray: function ( array, offset ) {
if ( offset === undefined ) offset = 0;
for ( var i = 0; i < 9; i ++ ) {
this.elements[ i ] = array[ i + offset ];
}
return this;
},
toArray: function ( array, offset ) {
if ( array === undefined ) array = [];
if ( offset === undefined ) offset = 0;
var te = this.elements;
array[ offset ] = te[ 0 ];
array[ offset + 1 ] = te[ 1 ];
array[ offset + 2 ] = te[ 2 ];
array[ offset + 3 ] = te[ 3 ];
array[ offset + 4 ] = te[ 4 ];
array[ offset + 5 ] = te[ 5 ];
array[ offset + 6 ] = te[ 6 ];
array[ offset + 7 ] = te[ 7 ];
array[ offset + 8 ] = te[ 8 ];
return array;
}
} );
/**
* @author mrdoob / http://mrdoob.com/
* @author alteredq / http://alteredqualia.com/
* @author szimek / https://github.com/szimek/
*/
var textureId = 0;
function Texture( image, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ) {
Object.defineProperty( this, 'id', { value: textureId ++ } );
this.uuid = _Math.generateUUID();
this.name = '';
this.image = image !== undefined ? image : Texture.DEFAULT_IMAGE;
this.mipmaps = [];
this.mapping = mapping !== undefined ? mapping : Texture.DEFAULT_MAPPING;
this.wrapS = wrapS !== undefined ? wrapS : ClampToEdgeWrapping;
this.wrapT = wrapT !== undefined ? wrapT : ClampToEdgeWrapping;
this.magFilter = magFilter !== undefined ? magFilter : LinearFilter;
this.minFilter = minFilter !== undefined ? minFilter : LinearMipMapLinearFilter;
this.anisotropy = anisotropy !== undefined ? anisotropy : 1;
this.format = format !== undefined ? format : RGBAFormat;
this.type = type !== undefined ? type : UnsignedByteType;
this.offset = new Vector2( 0, 0 );
this.repeat = new Vector2( 1, 1 );
this.center = new Vector2( 0, 0 );
this.rotation = 0;
this.matrixAutoUpdate = true;
this.matrix = new Matrix3();
this.generateMipmaps = true;
this.premultiplyAlpha = false;
this.flipY = true;
this.unpackAlignment = 4; // valid values: 1, 2, 4, 8 (see http://www.khronos.org/opengles/sdk/docs/man/xhtml/glPixelStorei.xml)
// Values of encoding !== THREE.LinearEncoding only supported on map, envMap and emissiveMap.
//
// Also changing the encoding after already used by a Material will not automatically make the Material
// update. You need to explicitly call Material.needsUpdate to trigger it to recompile.
this.encoding = encoding !== undefined ? encoding : LinearEncoding;
this.version = 0;
this.onUpdate = null;
}
Texture.DEFAULT_IMAGE = undefined;
Texture.DEFAULT_MAPPING = UVMapping;
Texture.prototype = Object.assign( Object.create( EventDispatcher.prototype ), {
constructor: Texture,
isTexture: true,
updateMatrix: function () {
this.matrix.setUvTransform( this.offset.x, this.offset.y, this.repeat.x, this.repeat.y, this.rotation, this.center.x, this.center.y );
},
clone: function () {
return new this.constructor().copy( this );
},
copy: function ( source ) {
this.name = source.name;
this.image = source.image;
this.mipmaps = source.mipmaps.slice( 0 );
this.mapping = source.mapping;
this.wrapS = source.wrapS;
this.wrapT = source.wrapT;
this.magFilter = source.magFilter;
this.minFilter = source.minFilter;
this.anisotropy = source.anisotropy;
this.format = source.format;
this.type = source.type;
this.offset.copy( source.offset );
this.repeat.copy( source.repeat );
this.center.copy( source.center );
this.rotation = source.rotation;
this.matrixAutoUpdate = source.matrixAutoUpdate;
this.matrix.copy( source.matrix );
this.generateMipmaps = source.generateMipmaps;
this.premultiplyAlpha = source.premultiplyAlpha;
this.flipY = source.flipY;
this.unpackAlignment = source.unpackAlignment;
this.encoding = source.encoding;
return this;
},
toJSON: function ( meta ) {
var isRootObject = ( meta === undefined || typeof meta === 'string' );
if ( ! isRootObject && meta.textures[ this.uuid ] !== undefined ) {
return meta.textures[ this.uuid ];
}
function getDataURL( image ) {
var canvas;
if ( image instanceof HTMLCanvasElement ) {
canvas = image;
} else {
canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );
canvas.width = image.width;
canvas.height = image.height;
var context = canvas.getContext( '2d' );
if ( image instanceof ImageData ) {
context.putImageData( image, 0, 0 );
} else {
context.drawImage( image, 0, 0, image.width, image.height );
}
}
if ( canvas.width > 2048 || canvas.height > 2048 ) {
return canvas.toDataURL( 'image/jpeg', 0.6 );
} else {
return canvas.toDataURL( 'image/png' );
}
}
var output = {
metadata: {
version: 4.5,
type: 'Texture',
generator: 'Texture.toJSON'
},
uuid: this.uuid,
name: this.name,
mapping: this.mapping,
repeat: [ this.repeat.x, this.repeat.y ],
offset: [ this.offset.x, this.offset.y ],
center: [ this.center.x, this.center.y ],
rotation: this.rotation,
wrap: [ this.wrapS, this.wrapT ],
format: this.format,
minFilter: this.minFilter,
magFilter: this.magFilter,
anisotropy: this.anisotropy,
flipY: this.flipY
};
if ( this.image !== undefined ) {
// TODO: Move to THREE.Image
var image = this.image;
if ( image.uuid === undefined ) {
image.uuid = _Math.generateUUID(); // UGH
}
if ( ! isRootObject && meta.images[ image.uuid ] === undefined ) {
meta.images[ image.uuid ] = {
uuid: image.uuid,
url: getDataURL( image )
};
}
output.image = image.uuid;
}
if ( ! isRootObject ) {
meta.textures[ this.uuid ] = output;
}
return output;
},
dispose: function () {
this.dispatchEvent( { type: 'dispose' } );
},
transformUv: function ( uv ) {
if ( this.mapping !== UVMapping ) return;
uv.applyMatrix3( this.matrix );
if ( uv.x < 0 || uv.x > 1 ) {
switch ( this.wrapS ) {
case RepeatWrapping:
uv.x = uv.x - Math.floor( uv.x );
break;
case ClampToEdgeWrapping:
uv.x = uv.x < 0 ? 0 : 1;
break;
case MirroredRepeatWrapping:
if ( Math.abs( Math.floor( uv.x ) % 2 ) === 1 ) {
uv.x = Math.ceil( uv.x ) - uv.x;
} else {
uv.x = uv.x - Math.floor( uv.x );
}
break;
}
}
if ( uv.y < 0 || uv.y > 1 ) {
switch ( this.wrapT ) {
case RepeatWrapping:
uv.y = uv.y - Math.floor( uv.y );
break;
case ClampToEdgeWrapping:
uv.y = uv.y < 0 ? 0 : 1;
break;
case MirroredRepeatWrapping:
if ( Math.abs( Math.floor( uv.y ) % 2 ) === 1 ) {
uv.y = Math.ceil( uv.y ) - uv.y;
} else {
uv.y = uv.y - Math.floor( uv.y );
}
break;
}
}
if ( this.flipY ) {
uv.y = 1 - uv.y;
}
}
} );
Object.defineProperty( Texture.prototype, "needsUpdate", {
set: function ( value ) {
if ( value === true ) this.version ++;
}
} );
/**
* @author supereggbert / http://www.paulbrunt.co.uk/
* @author philogb / http://blog.thejit.org/
* @author mikael emtinger / http://gomo.se/
* @author egraether / http://egraether.com/
* @author WestLangley / http://github.com/WestLangley
*/
function Vector4( x, y, z, w ) {
this.x = x || 0;
this.y = y || 0;
this.z = z || 0;
this.w = ( w !== undefined ) ? w : 1;
}
Object.assign( Vector4.prototype, {
isVector4: true,
set: function ( x, y, z, w ) {
this.x = x;
this.y = y;
this.z = z;
this.w = w;
return this;
},
setScalar: function ( scalar ) {
this.x = scalar;
this.y = scalar;
this.z = scalar;
this.w = scalar;
return this;
},
setX: function ( x ) {
this.x = x;
return this;
},
setY: function ( y ) {
this.y = y;
return this;
},
setZ: function ( z ) {
this.z = z;
return this;
},
setW: function ( w ) {
this.w = w;
return this;
},
setComponent: function ( index, value ) {
switch ( index ) {
case 0: this.x = value; break;
case 1: this.y = value; break;
case 2: this.z = value; break;
case 3: this.w = value; break;
default: throw new Error( 'index is out of range: ' + index );
}
return this;
},
getComponent: function ( index ) {
switch ( index ) {
case 0: return this.x;
case 1: return this.y;
case 2: return this.z;
case 3: return this.w;
default: throw new Error( 'index is out of range: ' + index );
}
},
clone: function () {
return new this.constructor( this.x, this.y, this.z, this.w );
},
copy: function ( v ) {
this.x = v.x;
this.y = v.y;
this.z = v.z;
this.w = ( v.w !== undefined ) ? v.w : 1;
return this;
},
add: function ( v, w ) {
if ( w !== undefined ) {
console.warn( 'THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );
return this.addVectors( v, w );
}
this.x += v.x;
this.y += v.y;
this.z += v.z;
this.w += v.w;
return this;
},
addScalar: function ( s ) {
this.x += s;
this.y += s;
this.z += s;
this.w += s;
return this;
},
addVectors: function ( a, b ) {
this.x = a.x + b.x;
this.y = a.y + b.y;
this.z = a.z + b.z;
this.w = a.w + b.w;
return this;
},
addScaledVector: function ( v, s ) {
this.x += v.x * s;
this.y += v.y * s;
this.z += v.z * s;
this.w += v.w * s;
return this;
},
sub: function ( v, w ) {
if ( w !== undefined ) {
console.warn( 'THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );
return this.subVectors( v, w );
}
this.x -= v.x;
this.y -= v.y;
this.z -= v.z;
this.w -= v.w;
return this;
},
subScalar: function ( s ) {
this.x -= s;
this.y -= s;
this.z -= s;
this.w -= s;
return this;
},
subVectors: function ( a, b ) {
this.x = a.x - b.x;
this.y = a.y - b.y;
this.z = a.z - b.z;
this.w = a.w - b.w;
return this;
},
multiplyScalar: function ( scalar ) {
this.x *= scalar;
this.y *= scalar;
this.z *= scalar;
this.w *= scalar;
return this;
},
applyMatrix4: function ( m ) {
var x = this.x, y = this.y, z = this.z, w = this.w;
var e = m.elements;
this.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] * w;
this.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] * w;
this.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] * w;
this.w = e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] * w;
return this;
},
divideScalar: function ( scalar ) {
return this.multiplyScalar( 1 / scalar );
},
setAxisAngleFromQuaternion: function ( q ) {
// http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm
// q is assumed to be normalized
this.w = 2 * Math.acos( q.w );
var s = Math.sqrt( 1 - q.w * q.w );
if ( s < 0.0001 ) {
this.x = 1;
this.y = 0;
this.z = 0;
} else {
this.x = q.x / s;
this.y = q.y / s;
this.z = q.z / s;
}
return this;
},
setAxisAngleFromRotationMatrix: function ( m ) {
// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToAngle/index.htm
// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)
var angle, x, y, z, // variables for result
epsilon = 0.01, // margin to allow for rounding errors
epsilon2 = 0.1, // margin to distinguish between 0 and 180 degrees
te = m.elements,
m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ],
m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ],
m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ];
if ( ( Math.abs( m12 - m21 ) < epsilon ) &&
( Math.abs( m13 - m31 ) < epsilon ) &&
( Math.abs( m23 - m32 ) < epsilon ) ) {
// singularity found
// first check for identity matrix which must have +1 for all terms
// in leading diagonal and zero in other terms
if ( ( Math.abs( m12 + m21 ) < epsilon2 ) &&
( Math.abs( m13 + m31 ) < epsilon2 ) &&
( Math.abs( m23 + m32 ) < epsilon2 ) &&
( Math.abs( m11 + m22 + m33 - 3 ) < epsilon2 ) ) {
// this singularity is identity matrix so angle = 0
this.set( 1, 0, 0, 0 );
return this; // zero angle, arbitrary axis
}
// otherwise this singularity is angle = 180
angle = Math.PI;
var xx = ( m11 + 1 ) / 2;
var yy = ( m22 + 1 ) / 2;
var zz = ( m33 + 1 ) / 2;
var xy = ( m12 + m21 ) / 4;
var xz = ( m13 + m31 ) / 4;
var yz = ( m23 + m32 ) / 4;
if ( ( xx > yy ) && ( xx > zz ) ) {
// m11 is the largest diagonal term
if ( xx < epsilon ) {
x = 0;
y = 0.707106781;
z = 0.707106781;
} else {
x = Math.sqrt( xx );
y = xy / x;
z = xz / x;
}
} else if ( yy > zz ) {
// m22 is the largest diagonal term
if ( yy < epsilon ) {
x = 0.707106781;
y = 0;
z = 0.707106781;
} else {
y = Math.sqrt( yy );
x = xy / y;
z = yz / y;
}
} else {
// m33 is the largest diagonal term so base result on this
if ( zz < epsilon ) {
x = 0.707106781;
y = 0.707106781;
z = 0;
} else {
z = Math.sqrt( zz );
x = xz / z;
y = yz / z;
}
}
this.set( x, y, z, angle );
return this; // return 180 deg rotation
}
// as we have reached here there are no singularities so we can handle normally
var s = Math.sqrt( ( m32 - m23 ) * ( m32 - m23 ) +
( m13 - m31 ) * ( m13 - m31 ) +
( m21 - m12 ) * ( m21 - m12 ) ); // used to normalize
if ( Math.abs( s ) < 0.001 ) s = 1;
// prevent divide by zero, should not happen if matrix is orthogonal and should be
// caught by singularity test above, but I've left it in just in case
this.x = ( m32 - m23 ) / s;
this.y = ( m13 - m31 ) / s;
this.z = ( m21 - m12 ) / s;
this.w = Math.acos( ( m11 + m22 + m33 - 1 ) / 2 );
return this;
},
min: function ( v ) {
this.x = Math.min( this.x, v.x );
this.y = Math.min( this.y, v.y );
this.z = Math.min( this.z, v.z );
this.w = Math.min( this.w, v.w );
return this;
},
max: function ( v ) {
this.x = Math.max( this.x, v.x );
this.y = Math.max( this.y, v.y );
this.z = Math.max( this.z, v.z );
this.w = Math.max( this.w, v.w );
return this;
},
clamp: function ( min, max ) {
// assumes min < max, componentwise
this.x = Math.max( min.x, Math.min( max.x, this.x ) );
this.y = Math.max( min.y, Math.min( max.y, this.y ) );
this.z = Math.max( min.z, Math.min( max.z, this.z ) );
this.w = Math.max( min.w, Math.min( max.w, this.w ) );
return this;
},
clampScalar: function () {
var min, max;
return function clampScalar( minVal, maxVal ) {
if ( min === undefined ) {
min = new Vector4();
max = new Vector4();
}
min.set( minVal, minVal, minVal, minVal );
max.set( maxVal, maxVal, maxVal, maxVal );
return this.clamp( min, max );
};
}(),
clampLength: function ( min, max ) {
var length = this.length();
return this.divideScalar( length || 1 ).multiplyScalar( Math.max( min, Math.min( max, length ) ) );
},
floor: function () {
this.x = Math.floor( this.x );
this.y = Math.floor( this.y );
this.z = Math.floor( this.z );
this.w = Math.floor( this.w );
return this;
},
ceil: function () {
this.x = Math.ceil( this.x );
this.y = Math.ceil( this.y );
this.z = Math.ceil( this.z );
this.w = Math.ceil( this.w );
return this;
},
round: function () {
this.x = Math.round( this.x );
this.y = Math.round( this.y );
this.z = Math.round( this.z );
this.w = Math.round( this.w );
return this;
},
roundToZero: function () {
this.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );
this.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );
this.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z );
this.w = ( this.w < 0 ) ? Math.ceil( this.w ) : Math.floor( this.w );
return this;
},
negate: function () {
this.x = - this.x;
this.y = - this.y;
this.z = - this.z;
this.w = - this.w;
return this;
},
dot: function ( v ) {
return this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w;
},
lengthSq: function () {
return this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w;
},
length: function () {
return Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w );
},
manhattanLength: function () {
return Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z ) + Math.abs( this.w );
},
normalize: function () {
return this.divideScalar( this.length() || 1 );
},
setLength: function ( length ) {
return this.normalize().multiplyScalar( length );
},
lerp: function ( v, alpha ) {
this.x += ( v.x - this.x ) * alpha;
this.y += ( v.y - this.y ) * alpha;
this.z += ( v.z - this.z ) * alpha;
this.w += ( v.w - this.w ) * alpha;
return this;
},
lerpVectors: function ( v1, v2, alpha ) {
return this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 );
},
equals: function ( v ) {
return ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) && ( v.w === this.w ) );
},
fromArray: function ( array, offset ) {
if ( offset === undefined ) offset = 0;
this.x = array[ offset ];
this.y = array[ offset + 1 ];
this.z = array[ offset + 2 ];
this.w = array[ offset + 3 ];
return this;
},
toArray: function ( array, offset ) {
if ( array === undefined ) array = [];
if ( offset === undefined ) offset = 0;
array[ offset ] = this.x;
array[ offset + 1 ] = this.y;
array[ offset + 2 ] = this.z;
array[ offset + 3 ] = this.w;
return array;
},
fromBufferAttribute: function ( attribute, index, offset ) {
if ( offset !== undefined ) {
console.warn( 'THREE.Vector4: offset has been removed from .fromBufferAttribute().' );
}
this.x = attribute.getX( index );
this.y = attribute.getY( index );
this.z = attribute.getZ( index );
this.w = attribute.getW( index );
return this;
}
} );
/**
* @author szimek / https://github.com/szimek/
* @author alteredq / http://alteredqualia.com/
* @author Marius Kintel / https://github.com/kintel
*/
/*
In options, we can specify:
* Texture parameters for an auto-generated target texture
* depthBuffer/stencilBuffer: Booleans to indicate if we should generate these buffers
*/
function WebGLRenderTarget( width, height, options ) {
this.width = width;
this.height = height;
this.scissor = new Vector4( 0, 0, width, height );
this.scissorTest = false;
this.viewport = new Vector4( 0, 0, width, height );
options = options || {};
if ( options.minFilter === undefined ) options.minFilter = LinearFilter;
this.texture = new Texture( undefined, undefined, options.wrapS, options.wrapT, options.magFilter, options.minFilter, options.format, options.type, options.anisotropy, options.encoding );
this.depthBuffer = options.depthBuffer !== undefined ? options.depthBuffer : true;
this.stencilBuffer = options.stencilBuffer !== undefined ? options.stencilBuffer : true;
this.depthTexture = options.depthTexture !== undefined ? options.depthTexture : null;
}
WebGLRenderTarget.prototype = Object.assign( Object.create( EventDispatcher.prototype ), {
constructor: WebGLRenderTarget,
isWebGLRenderTarget: true,
setSize: function ( width, height ) {
if ( this.width !== width || this.height !== height ) {
this.width = width;
this.height = height;
this.dispose();
}
this.viewport.set( 0, 0, width, height );
this.scissor.set( 0, 0, width, height );
},
clone: function () {
return new this.constructor().copy( this );
},
copy: function ( source ) {
this.width = source.width;
this.height = source.height;
this.viewport.copy( source.viewport );
this.texture = source.texture.clone();
this.depthBuffer = source.depthBuffer;
this.stencilBuffer = source.stencilBuffer;
this.depthTexture = source.depthTexture;
return this;
},
dispose: function () {
this.dispatchEvent( { type: 'dispose' } );
}
} );
/**
* @author alteredq / http://alteredqualia.com
*/
function WebGLRenderTargetCube( width, height, options ) {
WebGLRenderTarget.call( this, width, height, options );
this.activeCubeFace = 0; // PX 0, NX 1, PY 2, NY 3, PZ 4, NZ 5
this.activeMipMapLevel = 0;
}
WebGLRenderTargetCube.prototype = Object.create( WebGLRenderTarget.prototype );
WebGLRenderTargetCube.prototype.constructor = WebGLRenderTargetCube;
WebGLRenderTargetCube.prototype.isWebGLRenderTargetCube = true;
/**
* @author alteredq / http://alteredqualia.com/
*/
function DataTexture( data, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, encoding ) {
Texture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding );
this.image = { data: data, width: width, height: height };
this.magFilter = magFilter !== undefined ? magFilter : NearestFilter;
this.minFilter = minFilter !== undefined ? minFilter : NearestFilter;
this.generateMipmaps = false;
this.flipY = false;
this.unpackAlignment = 1;
}
DataTexture.prototype = Object.create( Texture.prototype );
DataTexture.prototype.constructor = DataTexture;
DataTexture.prototype.isDataTexture = true;
/**
* @author bhouston / http://clara.io
* @author WestLangley / http://github.com/WestLangley
*/
function Box3( min, max ) {
this.min = ( min !== undefined ) ? min : new Vector3( + Infinity, + Infinity, + Infinity );
this.max = ( max !== undefined ) ? max : new Vector3( - Infinity, - Infinity, - Infinity );
}
Object.assign( Box3.prototype, {
isBox3: true,
set: function ( min, max ) {
this.min.copy( min );
this.max.copy( max );
return this;
},
setFromArray: function ( array ) {
var minX = + Infinity;
var minY = + Infinity;
var minZ = + Infinity;
var maxX = - Infinity;
var maxY = - Infinity;
var maxZ = - Infinity;
for ( var i = 0, l = array.length; i < l; i += 3 ) {
var x = array[ i ];
var y = array[ i + 1 ];
var z = array[ i + 2 ];
if ( x < minX ) minX = x;
if ( y < minY ) minY = y;
if ( z < minZ ) minZ = z;
if ( x > maxX ) maxX = x;
if ( y > maxY ) maxY = y;
if ( z > maxZ ) maxZ = z;
}
this.min.set( minX, minY, minZ );
this.max.set( maxX, maxY, maxZ );
return this;
},
setFromBufferAttribute: function ( attribute ) {
var minX = + Infinity;
var minY = + Infinity;
var minZ = + Infinity;
var maxX = - Infinity;
var maxY = - Infinity;
var maxZ = - Infinity;
for ( var i = 0, l = attribute.count; i < l; i ++ ) {
var x = attribute.getX( i );
var y = attribute.getY( i );
var z = attribute.getZ( i );
if ( x < minX ) minX = x;
if ( y < minY ) minY = y;
if ( z < minZ ) minZ = z;
if ( x > maxX ) maxX = x;
if ( y > maxY ) maxY = y;
if ( z > maxZ ) maxZ = z;
}
this.min.set( minX, minY, minZ );
this.max.set( maxX, maxY, maxZ );
return this;
},
setFromPoints: function ( points ) {
this.makeEmpty();
for ( var i = 0, il = points.length; i < il; i ++ ) {
this.expandByPoint( points[ i ] );
}
return this;
},
setFromCenterAndSize: function () {
var v1 = new Vector3();
return function setFromCenterAndSize( center, size ) {
var halfSize = v1.copy( size ).multiplyScalar( 0.5 );
this.min.copy( center ).sub( halfSize );
this.max.copy( center ).add( halfSize );
return this;
};
}(),
setFromObject: function ( object ) {
this.makeEmpty();
return this.expandByObject( object );
},
clone: function () {
return new this.constructor().copy( this );
},
copy: function ( box ) {
this.min.copy( box.min );
this.max.copy( box.max );
return this;
},
makeEmpty: function () {
this.min.x = this.min.y = this.min.z = + Infinity;
this.max.x = this.max.y = this.max.z = - Infinity;
return this;
},
isEmpty: function () {
// this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes
return ( this.max.x < this.min.x ) || ( this.max.y < this.min.y ) || ( this.max.z < this.min.z );
},
getCenter: function ( target ) {
if ( target === undefined ) {
console.warn( 'THREE.Box3: .getCenter() target is now required' );
target = new Vector3();
}
return this.isEmpty() ? target.set( 0, 0, 0 ) : target.addVectors( this.min, this.max ).multiplyScalar( 0.5 );
},
getSize: function ( target ) {
if ( target === undefined ) {
console.warn( 'THREE.Box3: .getSize() target is now required' );
target = new Vector3();
}
return this.isEmpty() ? target.set( 0, 0, 0 ) : target.subVectors( this.max, this.min );
},
expandByPoint: function ( point ) {
this.min.min( point );
this.max.max( point );
return this;
},
expandByVector: function ( vector ) {
this.min.sub( vector );
this.max.add( vector );
return this;
},
expandByScalar: function ( scalar ) {
this.min.addScalar( - scalar );
this.max.addScalar( scalar );
return this;
},
expandByObject: function () {
// Computes the world-axis-aligned bounding box of an object (including its children),
// accounting for both the object's, and children's, world transforms
var scope, i, l;
var v1 = new Vector3();
function traverse( node ) {
var geometry = node.geometry;
if ( geometry !== undefined ) {
if ( geometry.isGeometry ) {
var vertices = geometry.vertices;
for ( i = 0, l = vertices.length; i < l; i ++ ) {
v1.copy( vertices[ i ] );
v1.applyMatrix4( node.matrixWorld );
scope.expandByPoint( v1 );
}
} else if ( geometry.isBufferGeometry ) {
var attribute = geometry.attributes.position;
if ( attribute !== undefined ) {
for ( i = 0, l = attribute.count; i < l; i ++ ) {
v1.fromBufferAttribute( attribute, i ).applyMatrix4( node.matrixWorld );
scope.expandByPoint( v1 );
}
}
}
}
}
return function expandByObject( object ) {
scope = this;
object.updateMatrixWorld( true );
object.traverse( traverse );
return this;
};
}(),
containsPoint: function ( point ) {
return point.x < this.min.x || point.x > this.max.x ||
point.y < this.min.y || point.y > this.max.y ||
point.z < this.min.z || point.z > this.max.z ? false : true;
},
containsBox: function ( box ) {
return this.min.x <= box.min.x && box.max.x <= this.max.x &&
this.min.y <= box.min.y && box.max.y <= this.max.y &&
this.min.z <= box.min.z && box.max.z <= this.max.z;
},
getParameter: function ( point, target ) {
// This can potentially have a divide by zero if the box
// has a size dimension of 0.
if ( target === undefined ) {
console.warn( 'THREE.Box3: .getParameter() target is now required' );
target = new Vector3();
}
return target.set(
( point.x - this.min.x ) / ( this.max.x - this.min.x ),
( point.y - this.min.y ) / ( this.max.y - this.min.y ),
( point.z - this.min.z ) / ( this.max.z - this.min.z )
);
},
intersectsBox: function ( box ) {
// using 6 splitting planes to rule out intersections.
return box.max.x < this.min.x || box.min.x > this.max.x ||
box.max.y < this.min.y || box.min.y > this.max.y ||
box.max.z < this.min.z || box.min.z > this.max.z ? false : true;
},
intersectsSphere: ( function () {
var closestPoint = new Vector3();
return function intersectsSphere( sphere ) {
// Find the point on the AABB closest to the sphere center.
this.clampPoint( sphere.center, closestPoint );
// If that point is inside the sphere, the AABB and sphere intersect.
return closestPoint.distanceToSquared( sphere.center ) <= ( sphere.radius * sphere.radius );
};
} )(),
intersectsPlane: function ( plane ) {
// We compute the minimum and maximum dot product values. If those values
// are on the same side (back or front) of the plane, then there is no intersection.
var min, max;
if ( plane.normal.x > 0 ) {
min = plane.normal.x * this.min.x;
max = plane.normal.x * this.max.x;
} else {
min = plane.normal.x * this.max.x;
max = plane.normal.x * this.min.x;
}
if ( plane.normal.y > 0 ) {
min += plane.normal.y * this.min.y;
max += plane.normal.y * this.max.y;
} else {
min += plane.normal.y * this.max.y;
max += plane.normal.y * this.min.y;
}
if ( plane.normal.z > 0 ) {
min += plane.normal.z * this.min.z;
max += plane.normal.z * this.max.z;
} else {
min += plane.normal.z * this.max.z;
max += plane.normal.z * this.min.z;
}
return ( min <= plane.constant && max >= plane.constant );
},
intersectsTriangle: ( function () {
// triangle centered vertices
var v0 = new Vector3();
var v1 = new Vector3();
var v2 = new Vector3();
// triangle edge vectors
var f0 = new Vector3();
var f1 = new Vector3();
var f2 = new Vector3();
var testAxis = new Vector3();
var center = new Vector3();
var extents = new Vector3();
var triangleNormal = new Vector3();
function satForAxes( axes ) {
var i, j;
for ( i = 0, j = axes.length - 3; i <= j; i += 3 ) {
testAxis.fromArray( axes, i );
// project the aabb onto the seperating axis
var r = extents.x * Math.abs( testAxis.x ) + extents.y * Math.abs( testAxis.y ) + extents.z * Math.abs( testAxis.z );
// project all 3 vertices of the triangle onto the seperating axis
var p0 = v0.dot( testAxis );
var p1 = v1.dot( testAxis );
var p2 = v2.dot( testAxis );
// actual test, basically see if either of the most extreme of the triangle points intersects r
if ( Math.max( - Math.max( p0, p1, p2 ), Math.min( p0, p1, p2 ) ) > r ) {
// points of the projected triangle are outside the projected half-length of the aabb
// the axis is seperating and we can exit
return false;
}
}
return true;
}
return function intersectsTriangle( triangle ) {
if ( this.isEmpty() ) {
return false;
}
// compute box center and extents
this.getCenter( center );
extents.subVectors( this.max, center );
// translate triangle to aabb origin
v0.subVectors( triangle.a, center );
v1.subVectors( triangle.b, center );
v2.subVectors( triangle.c, center );
// compute edge vectors for triangle
f0.subVectors( v1, v0 );
f1.subVectors( v2, v1 );
f2.subVectors( v0, v2 );
// test against axes that are given by cross product combinations of the edges of the triangle and the edges of the aabb
// make an axis testing of each of the 3 sides of the aabb against each of the 3 sides of the triangle = 9 axis of separation
// axis_ij = u_i x f_j (u0, u1, u2 = face normals of aabb = x,y,z axes vectors since aabb is axis aligned)
var axes = [
0, - f0.z, f0.y, 0, - f1.z, f1.y, 0, - f2.z, f2.y,
f0.z, 0, - f0.x, f1.z, 0, - f1.x, f2.z, 0, - f2.x,
- f0.y, f0.x, 0, - f1.y, f1.x, 0, - f2.y, f2.x, 0
];
if ( ! satForAxes( axes ) ) {
return false;
}
// test 3 face normals from the aabb
axes = [ 1, 0, 0, 0, 1, 0, 0, 0, 1 ];
if ( ! satForAxes( axes ) ) {
return false;
}
// finally testing the face normal of the triangle
// use already existing triangle edge vectors here
triangleNormal.crossVectors( f0, f1 );
axes = [ triangleNormal.x, triangleNormal.y, triangleNormal.z ];
return satForAxes( axes );
};
} )(),
clampPoint: function ( point, target ) {
if ( target === undefined ) {
console.warn( 'THREE.Box3: .clampPoint() target is now required' );
target = new Vector3();
}
return target.copy( point ).clamp( this.min, this.max );
},
distanceToPoint: function () {
var v1 = new Vector3();
return function distanceToPoint( point ) {
var clampedPoint = v1.copy( point ).clamp( this.min, this.max );
return clampedPoint.sub( point ).length();
};
}(),
getBoundingSphere: function () {
var v1 = new Vector3();
return function getBoundingSphere( target ) {
if ( target === undefined ) {
console.warn( 'THREE.Box3: .getBoundingSphere() target is now required' );
target = new Sphere();
}
this.getCenter( target.center );
target.radius = this.getSize( v1 ).length() * 0.5;
return target;
};
}(),
intersect: function ( box ) {
this.min.max( box.min );
this.max.min( box.max );
// ensure that if there is no overlap, the result is fully empty, not slightly empty with non-inf/+inf values that will cause subsequence intersects to erroneously return valid values.
if ( this.isEmpty() ) this.makeEmpty();
return this;
},
union: function ( box ) {
this.min.min( box.min );
this.max.max( box.max );
return this;
},
applyMatrix4: function () {
var points = [
new Vector3(),
new Vector3(),
new Vector3(),
new Vector3(),
new Vector3(),
new Vector3(),
new Vector3(),
new Vector3()
];
return function applyMatrix4( matrix ) {
// transform of empty box is an empty box.
if ( this.isEmpty() ) return this;
// NOTE: I am using a binary pattern to specify all 2^3 combinations below
points[ 0 ].set( this.min.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 000
points[ 1 ].set( this.min.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 001
points[ 2 ].set( this.min.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 010
points[ 3 ].set( this.min.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 011
points[ 4 ].set( this.max.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 100
points[ 5 ].set( this.max.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 101
points[ 6 ].set( this.max.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 110
points[ 7 ].set( this.max.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 111
this.setFromPoints( points );
return this;
};
}(),
translate: function ( offset ) {
this.min.add( offset );
this.max.add( offset );
return this;
},
equals: function ( box ) {
return box.min.equals( this.min ) && box.max.equals( this.max );
}
} );
/**
* @author bhouston / http://clara.io
* @author mrdoob / http://mrdoob.com/
*/
function Sphere( center, radius ) {
this.center = ( center !== undefined ) ? center : new Vector3();
this.radius = ( radius !== undefined ) ? radius : 0;
}
Object.assign( Sphere.prototype, {
set: function ( center, radius ) {
this.center.copy( center );
this.radius = radius;
return this;
},
setFromPoints: function () {
var box = new Box3();
return function setFromPoints( points, optionalCenter ) {
var center = this.center;
if ( optionalCenter !== undefined ) {
center.copy( optionalCenter );
} else {
box.setFromPoints( points ).getCenter( center );
}
var maxRadiusSq = 0;
for ( var i = 0, il = points.length; i < il; i ++ ) {
maxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( points[ i ] ) );
}
this.radius = Math.sqrt( maxRadiusSq );
return this;
};
}(),
clone: function () {
return new this.constructor().copy( this );
},
copy: function ( sphere ) {
this.center.copy( sphere.center );
this.radius = sphere.radius;
return this;
},
empty: function () {
return ( this.radius <= 0 );
},
containsPoint: function ( point ) {
return ( point.distanceToSquared( this.center ) <= ( this.radius * this.radius ) );
},
distanceToPoint: function ( point ) {
return ( point.distanceTo( this.center ) - this.radius );
},
intersectsSphere: function ( sphere ) {
var radiusSum = this.radius + sphere.radius;
return sphere.center.distanceToSquared( this.center ) <= ( radiusSum * radiusSum );
},
intersectsBox: function ( box ) {
return box.intersectsSphere( this );
},
intersectsPlane: function ( plane ) {
return Math.abs( plane.distanceToPoint( this.center ) ) <= this.radius;
},
clampPoint: function ( point, target ) {
var deltaLengthSq = this.center.distanceToSquared( point );
if ( target === undefined ) {
console.warn( 'THREE.Sphere: .clampPoint() target is now required' );
target = new Vector3();
}
target.copy( point );
if ( deltaLengthSq > ( this.radius * this.radius ) ) {
target.sub( this.center ).normalize();
target.multiplyScalar( this.radius ).add( this.center );
}
return target;
},
getBoundingBox: function ( target ) {
if ( target === undefined ) {
console.warn( 'THREE.Sphere: .getBoundingBox() target is now required' );
target = new Box3();
}
target.set( this.center, this.center );
target.expandByScalar( this.radius );
return target;
},
applyMatrix4: function ( matrix ) {
this.center.applyMatrix4( matrix );
this.radius = this.radius * matrix.getMaxScaleOnAxis();
return this;
},
translate: function ( offset ) {
this.center.add( offset );
return this;
},
equals: function ( sphere ) {
return sphere.center.equals( this.center ) && ( sphere.radius === this.radius );
}
} );
/**
* @author bhouston / http://clara.io
*/
function Plane( normal, constant ) {
// normal is assumed to be normalized
this.normal = ( normal !== undefined ) ? normal : new Vector3( 1, 0, 0 );
this.constant = ( constant !== undefined ) ? constant : 0;
}
Object.assign( Plane.prototype, {
set: function ( normal, constant ) {
this.normal.copy( normal );
this.constant = constant;
return this;
},
setComponents: function ( x, y, z, w ) {
this.normal.set( x, y, z );
this.constant = w;
return this;
},
setFromNormalAndCoplanarPoint: function ( normal, point ) {
this.normal.copy( normal );
this.constant = - point.dot( this.normal );
return this;
},
setFromCoplanarPoints: function () {
var v1 = new Vector3();
var v2 = new Vector3();
return function setFromCoplanarPoints( a, b, c ) {
var normal = v1.subVectors( c, b ).cross( v2.subVectors( a, b ) ).normalize();
// Q: should an error be thrown if normal is zero (e.g. degenerate plane)?
this.setFromNormalAndCoplanarPoint( normal, a );
return this;
};
}(),
clone: function () {
return new this.constructor().copy( this );
},
copy: function ( plane ) {
this.normal.copy( plane.normal );
this.constant = plane.constant;
return this;
},
normalize: function () {
// Note: will lead to a divide by zero if the plane is invalid.
var inverseNormalLength = 1.0 / this.normal.length();
this.normal.multiplyScalar( inverseNormalLength );
this.constant *= inverseNormalLength;
return this;
},
negate: function () {
this.constant *= - 1;
this.normal.negate();
return this;
},
distanceToPoint: function ( point ) {
return this.normal.dot( point ) + this.constant;
},
distanceToSphere: function ( sphere ) {
return this.distanceToPoint( sphere.center ) - sphere.radius;
},
projectPoint: function ( point, target ) {
if ( target === undefined ) {
console.warn( 'THREE.Plane: .projectPoint() target is now required' );
target = new Vector3();
}
return target.copy( this.normal ).multiplyScalar( - this.distanceToPoint( point ) ).add( point );
},
intersectLine: function () {
var v1 = new Vector3();
return function intersectLine( line, target ) {
if ( target === undefined ) {
console.warn( 'THREE.Plane: .intersectLine() target is now required' );
target = new Vector3();
}
var direction = line.delta( v1 );
var denominator = this.normal.dot( direction );
if ( denominator === 0 ) {
// line is coplanar, return origin
if ( this.distanceToPoint( line.start ) === 0 ) {
return target.copy( line.start );
}
// Unsure if this is the correct method to handle this case.
return undefined;
}
var t = - ( line.start.dot( this.normal ) + this.constant ) / denominator;
if ( t < 0 || t > 1 ) {
return undefined;
}
return target.copy( direction ).multiplyScalar( t ).add( line.start );
};
}(),
intersectsLine: function ( line ) {
// Note: this tests if a line intersects the plane, not whether it (or its end-points) are coplanar with it.
var startSign = this.distanceToPoint( line.start );
var endSign = this.distanceToPoint( line.end );
return ( startSign < 0 && endSign > 0 ) || ( endSign < 0 && startSign > 0 );
},
intersectsBox: function ( box ) {
return box.intersectsPlane( this );
},
intersectsSphere: function ( sphere ) {
return sphere.intersectsPlane( this );
},
coplanarPoint: function ( target ) {
if ( target === undefined ) {
console.warn( 'THREE.Plane: .coplanarPoint() target is now required' );
target = new Vector3();
}
return target.copy( this.normal ).multiplyScalar( - this.constant );
},
applyMatrix4: function () {
var v1 = new Vector3();
var m1 = new Matrix3();
return function applyMatrix4( matrix, optionalNormalMatrix ) {
var normalMatrix = optionalNormalMatrix || m1.getNormalMatrix( matrix );
var referencePoint = this.coplanarPoint( v1 ).applyMatrix4( matrix );
var normal = this.normal.applyMatrix3( normalMatrix ).normalize();
this.constant = - referencePoint.dot( normal );
return this;
};
}(),
translate: function ( offset ) {
this.constant -= offset.dot( this.normal );
return this;
},
equals: function ( plane ) {
return plane.normal.equals( this.normal ) && ( plane.constant === this.constant );
}
} );
/**
* @author mrdoob / http://mrdoob.com/
* @author alteredq / http://alteredqualia.com/
* @author bhouston / http://clara.io
*/
function Frustum( p0, p1, p2, p3, p4, p5 ) {
this.planes = [
( p0 !== undefined ) ? p0 : new Plane(),
( p1 !== undefined ) ? p1 : new Plane(),
( p2 !== undefined ) ? p2 : new Plane(),
( p3 !== undefined ) ? p3 : new Plane(),
( p4 !== undefined ) ? p4 : new Plane(),
( p5 !== undefined ) ? p5 : new Plane()
];
}
Object.assign( Frustum.prototype, {
set: function ( p0, p1, p2, p3, p4, p5 ) {
var planes = this.planes;
planes[ 0 ].copy( p0 );
planes[ 1 ].copy( p1 );
planes[ 2 ].copy( p2 );
planes[ 3 ].copy( p3 );
planes[ 4 ].copy( p4 );
planes[ 5 ].copy( p5 );
return this;
},
clone: function () {
return new this.constructor().copy( this );
},
copy: function ( frustum ) {
var planes = this.planes;
for ( var i = 0; i < 6; i ++ ) {
planes[ i ].copy( frustum.planes[ i ] );
}
return this;
},
setFromMatrix: function ( m ) {
var planes = this.planes;
var me = m.elements;
var me0 = me[ 0 ], me1 = me[ 1 ], me2 = me[ 2 ], me3 = me[ 3 ];
var me4 = me[ 4 ], me5 = me[ 5 ], me6 = me[ 6 ], me7 = me[ 7 ];
var me8 = me[ 8 ], me9 = me[ 9 ], me10 = me[ 10 ], me11 = me[ 11 ];
var me12 = me[ 12 ], me13 = me[ 13 ], me14 = me[ 14 ], me15 = me[ 15 ];
planes[ 0 ].setComponents( me3 - me0, me7 - me4, me11 - me8, me15 - me12 ).normalize();
planes[ 1 ].setComponents( me3 + me0, me7 + me4, me11 + me8, me15 + me12 ).normalize();
planes[ 2 ].setComponents( me3 + me1, me7 + me5, me11 + me9, me15 + me13 ).normalize();
planes[ 3 ].setComponents( me3 - me1, me7 - me5, me11 - me9, me15 - me13 ).normalize();
planes[ 4 ].setComponents( me3 - me2, me7 - me6, me11 - me10, me15 - me14 ).normalize();
planes[ 5 ].setComponents( me3 + me2, me7 + me6, me11 + me10, me15 + me14 ).normalize();
return this;
},
intersectsObject: function () {
var sphere = new Sphere();
return function intersectsObject( object ) {
var geometry = object.geometry;
if ( geometry.boundingSphere === null )
geometry.computeBoundingSphere();
sphere.copy( geometry.boundingSphere )
.applyMatrix4( object.matrixWorld );
return this.intersectsSphere( sphere );
};
}(),
intersectsSprite: function () {
var sphere = new Sphere();
return function intersectsSprite( sprite ) {
sphere.center.set( 0, 0, 0 );
sphere.radius = 0.7071067811865476;
sphere.applyMatrix4( sprite.matrixWorld );
return this.intersectsSphere( sphere );
};
}(),
intersectsSphere: function ( sphere ) {
var planes = this.planes;
var center = sphere.center;
var negRadius = - sphere.radius;
for ( var i = 0; i < 6; i ++ ) {
var distance = planes[ i ].distanceToPoint( center );
if ( distance < negRadius ) {
return false;
}
}
return true;
},
intersectsBox: function () {
var p1 = new Vector3(),
p2 = new Vector3();
return function intersectsBox( box ) {
var planes = this.planes;
for ( var i = 0; i < 6; i ++ ) {
var plane = planes[ i ];
p1.x = plane.normal.x > 0 ? box.min.x : box.max.x;
p2.x = plane.normal.x > 0 ? box.max.x : box.min.x;
p1.y = plane.normal.y > 0 ? box.min.y : box.max.y;
p2.y = plane.normal.y > 0 ? box.max.y : box.min.y;
p1.z = plane.normal.z > 0 ? box.min.z : box.max.z;
p2.z = plane.normal.z > 0 ? box.max.z : box.min.z;
var d1 = plane.distanceToPoint( p1 );
var d2 = plane.distanceToPoint( p2 );
// if both outside plane, no intersection
if ( d1 < 0 && d2 < 0 ) {
return false;
}
}
return true;
};
}(),
containsPoint: function ( point ) {
var planes = this.planes;
for ( var i = 0; i < 6; i ++ ) {
if ( planes[ i ].distanceToPoint( point ) < 0 ) {
return false;
}
}
return true;
}
} );
var alphamap_fragment = "#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, vUv ).g;\n#endif\n";
var alphamap_pars_fragment = "#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif\n";
var alphatest_fragment = "#ifdef ALPHATEST\n\tif ( diffuseColor.a < ALPHATEST ) discard;\n#endif\n";
var aomap_fragment = "#ifdef USE_AOMAP\n\tfloat ambientOcclusion = ( texture2D( aoMap, vUv2 ).r - 1.0 ) * aoMapIntensity + 1.0;\n\treflectedLight.indirectDiffuse *= ambientOcclusion;\n\t#if defined( USE_ENVMAP ) && defined( PHYSICAL )\n\t\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\t\treflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.specularRoughness );\n\t#endif\n#endif\n";
var aomap_pars_fragment = "#ifdef USE_AOMAP\n\tuniform sampler2D aoMap;\n\tuniform float aoMapIntensity;\n#endif";
var begin_vertex = "\nvec3 transformed = vec3( position );\n";
var beginnormal_vertex = "\nvec3 objectNormal = vec3( normal );\n";
var bsdfs = "float punctualLightIntensityToIrradianceFactor( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\n\tif( decayExponent > 0.0 ) {\n#if defined ( PHYSICALLY_CORRECT_LIGHTS )\n\t\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\n\t\tfloat maxDistanceCutoffFactor = pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n\t\treturn distanceFalloff * maxDistanceCutoffFactor;\n#else\n\t\treturn pow( saturate( -lightDistance / cutoffDistance + 1.0 ), decayExponent );\n#endif\n\t}\n\treturn 1.0;\n}\nvec3 BRDF_Diffuse_Lambert( const in vec3 diffuseColor ) {\n\treturn RECIPROCAL_PI * diffuseColor;\n}\nvec3 F_Schlick( const in vec3 specularColor, const in float dotLH ) {\n\tfloat fresnel = exp2( ( -5.55473 * dotLH - 6.98316 ) * dotLH );\n\treturn ( 1.0 - specularColor ) * fresnel + specularColor;\n}\nfloat G_GGX_Smith( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gl = dotNL + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\tfloat gv = dotNV + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\treturn 1.0 / ( gl * gv );\n}\nfloat G_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\treturn 0.5 / max( gv + gl, EPSILON );\n}\nfloat D_GGX( const in float alpha, const in float dotNH ) {\n\tfloat a2 = pow2( alpha );\n\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\n\treturn RECIPROCAL_PI * a2 / pow2( denom );\n}\nvec3 BRDF_Specular_GGX( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) {\n\tfloat alpha = pow2( roughness );\n\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\n\tfloat dotNL = saturate( dot( geometry.normal, incidentLight.direction ) );\n\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\tfloat D = D_GGX( alpha, dotNH );\n\treturn F * ( G * D );\n}\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\n\tconst float LUT_SIZE = 64.0;\n\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\n\tconst float LUT_BIAS = 0.5 / LUT_SIZE;\n\tfloat dotNV = saturate( dot( N, V ) );\n\tvec2 uv = vec2( roughness, sqrt( 1.0 - dotNV ) );\n\tuv = uv * LUT_SCALE + LUT_BIAS;\n\treturn uv;\n}\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\n\tfloat l = length( f );\n\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\n}\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\n\tfloat x = dot( v1, v2 );\n\tfloat y = abs( x );\n\tfloat a = 0.8543985 + ( 0.4965155 + 0.0145206 * y ) * y;\n\tfloat b = 3.4175940 + ( 4.1616724 + y ) * y;\n\tfloat v = a / b;\n\tfloat theta_sintheta = ( x > 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v;\n\treturn cross( v1, v2 ) * theta_sintheta;\n}\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\n\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\n\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\n\tvec3 lightNormal = cross( v1, v2 );\n\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\n\tvec3 T1, T2;\n\tT1 = normalize( V - N * dot( V, N ) );\n\tT2 = - cross( N, T1 );\n\tmat3 mat = mInv * transposeMat3( mat3( T1, T2, N ) );\n\tvec3 coords[ 4 ];\n\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\n\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\n\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\n\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\n\tcoords[ 0 ] = normalize( coords[ 0 ] );\n\tcoords[ 1 ] = normalize( coords[ 1 ] );\n\tcoords[ 2 ] = normalize( coords[ 2 ] );\n\tcoords[ 3 ] = normalize( coords[ 3 ] );\n\tvec3 vectorFormFactor = vec3( 0.0 );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\n\tfloat result = LTC_ClippedSphereFormFactor( vectorFormFactor );\n\treturn vec3( result );\n}\nvec3 BRDF_Specular_GGX_Environment( const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) {\n\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\tconst vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 );\n\tconst vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 );\n\tvec4 r = roughness * c0 + c1;\n\tfloat a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y;\n\tvec2 AB = vec2( -1.04, 1.04 ) * a004 + r.zw;\n\treturn specularColor * AB.x + AB.y;\n}\nfloat G_BlinnPhong_Implicit( ) {\n\treturn 0.25;\n}\nfloat D_BlinnPhong( const in float shininess, const in float dotNH ) {\n\treturn RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\n}\nvec3 BRDF_Specular_BlinnPhong( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float shininess ) {\n\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\n\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_BlinnPhong_Implicit( );\n\tfloat D = D_BlinnPhong( shininess, dotNH );\n\treturn F * ( G * D );\n}\nfloat GGXRoughnessToBlinnExponent( const in float ggxRoughness ) {\n\treturn ( 2.0 / pow2( ggxRoughness + 0.0001 ) - 2.0 );\n}\nfloat BlinnExponentToGGXRoughness( const in float blinnExponent ) {\n\treturn sqrt( 2.0 / ( blinnExponent + 2.0 ) );\n}\n";
var bumpmap_pars_fragment = "#ifdef USE_BUMPMAP\n\tuniform sampler2D bumpMap;\n\tuniform float bumpScale;\n\tvec2 dHdxy_fwd() {\n\t\tvec2 dSTdx = dFdx( vUv );\n\t\tvec2 dSTdy = dFdy( vUv );\n\t\tfloat Hll = bumpScale * texture2D( bumpMap, vUv ).x;\n\t\tfloat dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;\n\t\tfloat dBy = bumpScale * texture2D( bumpMap, vUv + dSTdy ).x - Hll;\n\t\treturn vec2( dBx, dBy );\n\t}\n\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy ) {\n\t\tvec3 vSigmaX = vec3( dFdx( surf_pos.x ), dFdx( surf_pos.y ), dFdx( surf_pos.z ) );\n\t\tvec3 vSigmaY = vec3( dFdy( surf_pos.x ), dFdy( surf_pos.y ), dFdy( surf_pos.z ) );\n\t\tvec3 vN = surf_norm;\n\t\tvec3 R1 = cross( vSigmaY, vN );\n\t\tvec3 R2 = cross( vN, vSigmaX );\n\t\tfloat fDet = dot( vSigmaX, R1 );\n\t\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\n\t\treturn normalize( abs( fDet ) * surf_norm - vGrad );\n\t}\n#endif\n";
var clipping_planes_fragment = "#if NUM_CLIPPING_PLANES > 0\n\tvec4 plane;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\n\t\tplane = clippingPlanes[ i ];\n\t\tif ( dot( vViewPosition, plane.xyz ) > plane.w ) discard;\n\t}\n\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\tbool clipped = true;\n\t\t#pragma unroll_loop\n\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n\t\t\tplane = clippingPlanes[ i ];\n\t\t\tclipped = ( dot( vViewPosition, plane.xyz ) > plane.w ) && clipped;\n\t\t}\n\t\tif ( clipped ) discard;\n\t#endif\n#endif\n";
var clipping_planes_pars_fragment = "#if NUM_CLIPPING_PLANES > 0\n\t#if ! defined( PHYSICAL ) && ! defined( PHONG )\n\t\tvarying vec3 vViewPosition;\n\t#endif\n\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\n#endif\n";
var clipping_planes_pars_vertex = "#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\n\tvarying vec3 vViewPosition;\n#endif\n";
var clipping_planes_vertex = "#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n";
var color_fragment = "#ifdef USE_COLOR\n\tdiffuseColor.rgb *= vColor;\n#endif";
var color_pars_fragment = "#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif\n";
var color_pars_vertex = "#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif";
var color_vertex = "#ifdef USE_COLOR\n\tvColor.xyz = color.xyz;\n#endif";
var common = "#define PI 3.14159265359\n#define PI2 6.28318530718\n#define PI_HALF 1.5707963267949\n#define RECIPROCAL_PI 0.31830988618\n#define RECIPROCAL_PI2 0.15915494\n#define LOG2 1.442695\n#define EPSILON 1e-6\n#define saturate(a) clamp( a, 0.0, 1.0 )\n#define whiteCompliment(a) ( 1.0 - saturate( a ) )\nfloat pow2( const in float x ) { return x*x; }\nfloat pow3( const in float x ) { return x*x*x; }\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\nfloat average( const in vec3 color ) { return dot( color, vec3( 0.3333 ) ); }\nhighp float rand( const in vec2 uv ) {\n\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\n\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\n\treturn fract(sin(sn) * c);\n}\nstruct IncidentLight {\n\tvec3 color;\n\tvec3 direction;\n\tbool visible;\n};\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};\nstruct GeometricContext {\n\tvec3 position;\n\tvec3 normal;\n\tvec3 viewDir;\n};\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n}\nvec3 projectOnPlane(in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\tfloat distance = dot( planeNormal, point - pointOnPlane );\n\treturn - distance * planeNormal + point;\n}\nfloat sideOfPlane( in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn sign( dot( point - pointOnPlane, planeNormal ) );\n}\nvec3 linePlaneIntersect( in vec3 pointOnLine, in vec3 lineDirection, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn lineDirection * ( dot( planeNormal, pointOnPlane - pointOnLine ) / dot( planeNormal, lineDirection ) ) + pointOnLine;\n}\nmat3 transposeMat3( const in mat3 m ) {\n\tmat3 tmp;\n\ttmp[ 0 ] = vec3( m[ 0 ].x, m[ 1 ].x, m[ 2 ].x );\n\ttmp[ 1 ] = vec3( m[ 0 ].y, m[ 1 ].y, m[ 2 ].y );\n\ttmp[ 2 ] = vec3( m[ 0 ].z, m[ 1 ].z, m[ 2 ].z );\n\treturn tmp;\n}\nfloat linearToRelativeLuminance( const in vec3 color ) {\n\tvec3 weights = vec3( 0.2126, 0.7152, 0.0722 );\n\treturn dot( weights, color.rgb );\n}\n";
var cube_uv_reflection_fragment = "#ifdef ENVMAP_TYPE_CUBE_UV\n#define cubeUV_textureSize (1024.0)\nint getFaceFromDirection(vec3 direction) {\n\tvec3 absDirection = abs(direction);\n\tint face = -1;\n\tif( absDirection.x > absDirection.z ) {\n\t\tif(absDirection.x > absDirection.y )\n\t\t\tface = direction.x > 0.0 ? 0 : 3;\n\t\telse\n\t\t\tface = direction.y > 0.0 ? 1 : 4;\n\t}\n\telse {\n\t\tif(absDirection.z > absDirection.y )\n\t\t\tface = direction.z > 0.0 ? 2 : 5;\n\t\telse\n\t\t\tface = direction.y > 0.0 ? 1 : 4;\n\t}\n\treturn face;\n}\n#define cubeUV_maxLods1 (log2(cubeUV_textureSize*0.25) - 1.0)\n#define cubeUV_rangeClamp (exp2((6.0 - 1.0) * 2.0))\nvec2 MipLevelInfo( vec3 vec, float roughnessLevel, float roughness ) {\n\tfloat scale = exp2(cubeUV_maxLods1 - roughnessLevel);\n\tfloat dxRoughness = dFdx(roughness);\n\tfloat dyRoughness = dFdy(roughness);\n\tvec3 dx = dFdx( vec * scale * dxRoughness );\n\tvec3 dy = dFdy( vec * scale * dyRoughness );\n\tfloat d = max( dot( dx, dx ), dot( dy, dy ) );\n\td = clamp(d, 1.0, cubeUV_rangeClamp);\n\tfloat mipLevel = 0.5 * log2(d);\n\treturn vec2(floor(mipLevel), fract(mipLevel));\n}\n#define cubeUV_maxLods2 (log2(cubeUV_textureSize*0.25) - 2.0)\n#define cubeUV_rcpTextureSize (1.0 / cubeUV_textureSize)\nvec2 getCubeUV(vec3 direction, float roughnessLevel, float mipLevel) {\n\tmipLevel = roughnessLevel > cubeUV_maxLods2 - 3.0 ? 0.0 : mipLevel;\n\tfloat a = 16.0 * cubeUV_rcpTextureSize;\n\tvec2 exp2_packed = exp2( vec2( roughnessLevel, mipLevel ) );\n\tvec2 rcp_exp2_packed = vec2( 1.0 ) / exp2_packed;\n\tfloat powScale = exp2_packed.x * exp2_packed.y;\n\tfloat scale = rcp_exp2_packed.x * rcp_exp2_packed.y * 0.25;\n\tfloat mipOffset = 0.75*(1.0 - rcp_exp2_packed.y) * rcp_exp2_packed.x;\n\tbool bRes = mipLevel == 0.0;\n\tscale = bRes && (scale < a) ? a : scale;\n\tvec3 r;\n\tvec2 offset;\n\tint face = getFaceFromDirection(direction);\n\tfloat rcpPowScale = 1.0 / powScale;\n\tif( face == 0) {\n\t\tr = vec3(direction.x, -direction.z, direction.y);\n\t\toffset = vec2(0.0+mipOffset,0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 1) {\n\t\tr = vec3(direction.y, direction.x, direction.z);\n\t\toffset = vec2(scale+mipOffset, 0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 2) {\n\t\tr = vec3(direction.z, direction.x, direction.y);\n\t\toffset = vec2(2.0*scale+mipOffset, 0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 3) {\n\t\tr = vec3(direction.x, direction.z, direction.y);\n\t\toffset = vec2(0.0+mipOffset,0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\telse if( face == 4) {\n\t\tr = vec3(direction.y, direction.x, -direction.z);\n\t\toffset = vec2(scale+mipOffset, 0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\telse {\n\t\tr = vec3(direction.z, -direction.x, direction.y);\n\t\toffset = vec2(2.0*scale+mipOffset, 0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\tr = normalize(r);\n\tfloat texelOffset = 0.5 * cubeUV_rcpTextureSize;\n\tvec2 s = ( r.yz / abs( r.x ) + vec2( 1.0 ) ) * 0.5;\n\tvec2 base = offset + vec2( texelOffset );\n\treturn base + s * ( scale - 2.0 * texelOffset );\n}\n#define cubeUV_maxLods3 (log2(cubeUV_textureSize*0.25) - 3.0)\nvec4 textureCubeUV(vec3 reflectedDirection, float roughness ) {\n\tfloat roughnessVal = roughness* cubeUV_maxLods3;\n\tfloat r1 = floor(roughnessVal);\n\tfloat r2 = r1 + 1.0;\n\tfloat t = fract(roughnessVal);\n\tvec2 mipInfo = MipLevelInfo(reflectedDirection, r1, roughness);\n\tfloat s = mipInfo.y;\n\tfloat level0 = mipInfo.x;\n\tfloat level1 = level0 + 1.0;\n\tlevel1 = level1 > 5.0 ? 5.0 : level1;\n\tlevel0 += min( floor( s + 0.5 ), 5.0 );\n\tvec2 uv_10 = getCubeUV(reflectedDirection, r1, level0);\n\tvec4 color10 = envMapTexelToLinear(texture2D(envMap, uv_10));\n\tvec2 uv_20 = getCubeUV(reflectedDirection, r2, level0);\n\tvec4 color20 = envMapTexelToLinear(texture2D(envMap, uv_20));\n\tvec4 result = mix(color10, color20, t);\n\treturn vec4(result.rgb, 1.0);\n}\n#endif\n";
var defaultnormal_vertex = "vec3 transformedNormal = normalMatrix * objectNormal;\n#ifdef FLIP_SIDED\n\ttransformedNormal = - transformedNormal;\n#endif\n";
var displacementmap_pars_vertex = "#ifdef USE_DISPLACEMENTMAP\n\tuniform sampler2D displacementMap;\n\tuniform float displacementScale;\n\tuniform float displacementBias;\n#endif\n";
var displacementmap_vertex = "#ifdef USE_DISPLACEMENTMAP\n\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, uv ).x * displacementScale + displacementBias );\n#endif\n";
var emissivemap_fragment = "#ifdef USE_EMISSIVEMAP\n\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\n\temissiveColor.rgb = emissiveMapTexelToLinear( emissiveColor ).rgb;\n\ttotalEmissiveRadiance *= emissiveColor.rgb;\n#endif\n";
var emissivemap_pars_fragment = "#ifdef USE_EMISSIVEMAP\n\tuniform sampler2D emissiveMap;\n#endif\n";
var encodings_fragment = " gl_FragColor = linearToOutputTexel( gl_FragColor );\n";
var encodings_pars_fragment = "\nvec4 LinearToLinear( in vec4 value ) {\n\treturn value;\n}\nvec4 GammaToLinear( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.xyz, vec3( gammaFactor ) ), value.w );\n}\nvec4 LinearToGamma( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.xyz, vec3( 1.0 / gammaFactor ) ), value.w );\n}\nvec4 sRGBToLinear( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.w );\n}\nvec4 LinearTosRGB( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.w );\n}\nvec4 RGBEToLinear( in vec4 value ) {\n\treturn vec4( value.rgb * exp2( value.a * 255.0 - 128.0 ), 1.0 );\n}\nvec4 LinearToRGBE( in vec4 value ) {\n\tfloat maxComponent = max( max( value.r, value.g ), value.b );\n\tfloat fExp = clamp( ceil( log2( maxComponent ) ), -128.0, 127.0 );\n\treturn vec4( value.rgb / exp2( fExp ), ( fExp + 128.0 ) / 255.0 );\n}\nvec4 RGBMToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.xyz * value.w * maxRange, 1.0 );\n}\nvec4 LinearToRGBM( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.x, max( value.g, value.b ) );\n\tfloat M = clamp( maxRGB / maxRange, 0.0, 1.0 );\n\tM = ceil( M * 255.0 ) / 255.0;\n\treturn vec4( value.rgb / ( M * maxRange ), M );\n}\nvec4 RGBDToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.rgb * ( ( maxRange / 255.0 ) / value.a ), 1.0 );\n}\nvec4 LinearToRGBD( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.x, max( value.g, value.b ) );\n\tfloat D = max( maxRange / maxRGB, 1.0 );\n\tD = min( floor( D ) / 255.0, 1.0 );\n\treturn vec4( value.rgb * ( D * ( 255.0 / maxRange ) ), D );\n}\nconst mat3 cLogLuvM = mat3( 0.2209, 0.3390, 0.4184, 0.1138, 0.6780, 0.7319, 0.0102, 0.1130, 0.2969 );\nvec4 LinearToLogLuv( in vec4 value ) {\n\tvec3 Xp_Y_XYZp = value.rgb * cLogLuvM;\n\tXp_Y_XYZp = max(Xp_Y_XYZp, vec3(1e-6, 1e-6, 1e-6));\n\tvec4 vResult;\n\tvResult.xy = Xp_Y_XYZp.xy / Xp_Y_XYZp.z;\n\tfloat Le = 2.0 * log2(Xp_Y_XYZp.y) + 127.0;\n\tvResult.w = fract(Le);\n\tvResult.z = (Le - (floor(vResult.w*255.0))/255.0)/255.0;\n\treturn vResult;\n}\nconst mat3 cLogLuvInverseM = mat3( 6.0014, -2.7008, -1.7996, -1.3320, 3.1029, -5.7721, 0.3008, -1.0882, 5.6268 );\nvec4 LogLuvToLinear( in vec4 value ) {\n\tfloat Le = value.z * 255.0 + value.w;\n\tvec3 Xp_Y_XYZp;\n\tXp_Y_XYZp.y = exp2((Le - 127.0) / 2.0);\n\tXp_Y_XYZp.z = Xp_Y_XYZp.y / value.y;\n\tXp_Y_XYZp.x = value.x * Xp_Y_XYZp.z;\n\tvec3 vRGB = Xp_Y_XYZp.rgb * cLogLuvInverseM;\n\treturn vec4( max(vRGB, 0.0), 1.0 );\n}\n";
var envmap_fragment = "#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvec3 cameraToVertex = normalize( vWorldPosition - cameraPosition );\n\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#else\n\t\tvec3 reflectVec = vReflect;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 envColor = textureCube( envMap, vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\tvec2 sampleUV;\n\t\treflectVec = normalize( reflectVec );\n\t\tsampleUV.y = asin( clamp( reflectVec.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\t\tsampleUV.x = atan( reflectVec.z, reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\n\t\tvec4 envColor = texture2D( envMap, sampleUV );\n\t#elif defined( ENVMAP_TYPE_SPHERE )\n\t\treflectVec = normalize( reflectVec );\n\t\tvec3 reflectView = normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0, 0.0, 1.0 ) );\n\t\tvec4 envColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5 );\n\t#else\n\t\tvec4 envColor = vec4( 0.0 );\n\t#endif\n\tenvColor = envMapTexelToLinear( envColor );\n\t#ifdef ENVMAP_BLENDING_MULTIPLY\n\t\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_MIX )\n\t\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_ADD )\n\t\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\n\t#endif\n#endif\n";
var envmap_pars_fragment = "#if defined( USE_ENVMAP ) || defined( PHYSICAL )\n\tuniform float reflectivity;\n\tuniform float envMapIntensity;\n#endif\n#ifdef USE_ENVMAP\n\t#if ! defined( PHYSICAL ) && ( defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) )\n\t\tvarying vec3 vWorldPosition;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tuniform samplerCube envMap;\n\t#else\n\t\tuniform sampler2D envMap;\n\t#endif\n\tuniform float flipEnvMap;\n\tuniform int maxMipLevel;\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( PHYSICAL )\n\t\tuniform float refractionRatio;\n\t#else\n\t\tvarying vec3 vReflect;\n\t#endif\n#endif\n";
var envmap_pars_vertex = "#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvarying vec3 vWorldPosition;\n\t#else\n\t\tvarying vec3 vReflect;\n\t\tuniform float refractionRatio;\n\t#endif\n#endif\n";
var envmap_vertex = "#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvWorldPosition = worldPosition.xyz;\n\t#else\n\t\tvec3 cameraToVertex = normalize( worldPosition.xyz - cameraPosition );\n\t\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvReflect = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#endif\n#endif\n";
var fog_vertex = "\n#ifdef USE_FOG\nfogDepth = -mvPosition.z;\n#endif";
var fog_pars_vertex = "#ifdef USE_FOG\n varying float fogDepth;\n#endif\n";
var fog_fragment = "#ifdef USE_FOG\n\t#ifdef FOG_EXP2\n\t\tfloat fogFactor = whiteCompliment( exp2( - fogDensity * fogDensity * fogDepth * fogDepth * LOG2 ) );\n\t#else\n\t\tfloat fogFactor = smoothstep( fogNear, fogFar, fogDepth );\n\t#endif\n\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n#endif\n";
var fog_pars_fragment = "#ifdef USE_FOG\n\tuniform vec3 fogColor;\n\tvarying float fogDepth;\n\t#ifdef FOG_EXP2\n\t\tuniform float fogDensity;\n\t#else\n\t\tuniform float fogNear;\n\t\tuniform float fogFar;\n\t#endif\n#endif\n";
var gradientmap_pars_fragment = "#ifdef TOON\n\tuniform sampler2D gradientMap;\n\tvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\n\t\tfloat dotNL = dot( normal, lightDirection );\n\t\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\n\t\t#ifdef USE_GRADIENTMAP\n\t\t\treturn texture2D( gradientMap, coord ).rgb;\n\t\t#else\n\t\t\treturn ( coord.x < 0.7 ) ? vec3( 0.7 ) : vec3( 1.0 );\n\t\t#endif\n\t}\n#endif\n";
var lightmap_fragment = "#ifdef USE_LIGHTMAP\n\treflectedLight.indirectDiffuse += PI * texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n#endif\n";
var lightmap_pars_fragment = "#ifdef USE_LIGHTMAP\n\tuniform sampler2D lightMap;\n\tuniform float lightMapIntensity;\n#endif";
var lights_lambert_vertex = "vec3 diffuse = vec3( 1.0 );\nGeometricContext geometry;\ngeometry.position = mvPosition.xyz;\ngeometry.normal = normalize( transformedNormal );\ngeometry.viewDir = normalize( -mvPosition.xyz );\nGeometricContext backGeometry;\nbackGeometry.position = geometry.position;\nbackGeometry.normal = -geometry.normal;\nbackGeometry.viewDir = geometry.viewDir;\nvLightFront = vec3( 0.0 );\n#ifdef DOUBLE_SIDED\n\tvLightBack = vec3( 0.0 );\n#endif\nIncidentLight directLight;\nfloat dotNL;\nvec3 directLightColor_Diffuse;\n#if NUM_POINT_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tgetPointDirectLightIrradiance( pointLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tgetSpotDirectLightIrradiance( spotLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_DIR_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tgetDirectionalDirectLightIrradiance( directionalLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\tvLightFront += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += getHemisphereLightIrradiance( hemisphereLights[ i ], backGeometry );\n\t\t#endif\n\t}\n#endif\n";
var lights_pars_begin = "uniform vec3 ambientLightColor;\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\n\tvec3 irradiance = ambientLightColor;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treturn irradiance;\n}\n#if NUM_DIR_LIGHTS > 0\n\tstruct DirectionalLight {\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t};\n\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\n\tvoid getDirectionalDirectLightIrradiance( const in DirectionalLight directionalLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tdirectLight.color = directionalLight.color;\n\t\tdirectLight.direction = directionalLight.direction;\n\t\tdirectLight.visible = true;\n\t}\n#endif\n#if NUM_POINT_LIGHTS > 0\n\tstruct PointLight {\n\t\tvec3 position;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t\tfloat shadowCameraNear;\n\t\tfloat shadowCameraFar;\n\t};\n\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\n\tvoid getPointDirectLightIrradiance( const in PointLight pointLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tvec3 lVector = pointLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tdirectLight.color = pointLight.color;\n\t\tdirectLight.color *= punctualLightIntensityToIrradianceFactor( lightDistance, pointLight.distance, pointLight.decay );\n\t\tdirectLight.visible = ( directLight.color != vec3( 0.0 ) );\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tstruct SpotLight {\n\t\tvec3 position;\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tfloat coneCos;\n\t\tfloat penumbraCos;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t};\n\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\n\tvoid getSpotDirectLightIrradiance( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tvec3 lVector = spotLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tfloat angleCos = dot( directLight.direction, spotLight.direction );\n\t\tif ( angleCos > spotLight.coneCos ) {\n\t\t\tfloat spotEffect = smoothstep( spotLight.coneCos, spotLight.penumbraCos, angleCos );\n\t\t\tdirectLight.color = spotLight.color;\n\t\t\tdirectLight.color *= spotEffect * punctualLightIntensityToIrradianceFactor( lightDistance, spotLight.distance, spotLight.decay );\n\t\t\tdirectLight.visible = true;\n\t\t} else {\n\t\t\tdirectLight.color = vec3( 0.0 );\n\t\t\tdirectLight.visible = false;\n\t\t}\n\t}\n#endif\n#if NUM_RECT_AREA_LIGHTS > 0\n\tstruct RectAreaLight {\n\t\tvec3 color;\n\t\tvec3 position;\n\t\tvec3 halfWidth;\n\t\tvec3 halfHeight;\n\t};\n\tuniform sampler2D ltc_1;\tuniform sampler2D ltc_2;\n\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tstruct HemisphereLight {\n\t\tvec3 direction;\n\t\tvec3 skyColor;\n\t\tvec3 groundColor;\n\t};\n\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\n\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in GeometricContext geometry ) {\n\t\tfloat dotNL = dot( geometry.normal, hemiLight.direction );\n\t\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\n\t\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tirradiance *= PI;\n\t\t#endif\n\t\treturn irradiance;\n\t}\n#endif\n";
var lights_pars_maps = "#if defined( USE_ENVMAP ) && defined( PHYSICAL )\n\tvec3 getLightProbeIndirectIrradiance( const in GeometricContext geometry, const in int maxMIPLevel ) {\n\t\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\n\t\t\tvec4 envMapColor = textureCubeUV( queryVec, 1.0 );\n\t\t#else\n\t\t\tvec4 envMapColor = vec4( 0.0 );\n\t\t#endif\n\t\treturn PI * envMapColor.rgb * envMapIntensity;\n\t}\n\tfloat getSpecularMIPLevel( const in float blinnShininessExponent, const in int maxMIPLevel ) {\n\t\tfloat maxMIPLevelScalar = float( maxMIPLevel );\n\t\tfloat desiredMIPLevel = maxMIPLevelScalar + 0.79248 - 0.5 * log2( pow2( blinnShininessExponent ) + 1.0 );\n\t\treturn clamp( desiredMIPLevel, 0.0, maxMIPLevelScalar );\n\t}\n\tvec3 getLightProbeIndirectRadiance( const in GeometricContext geometry, const in float blinnShininessExponent, const in int maxMIPLevel ) {\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( -geometry.viewDir, geometry.normal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( -geometry.viewDir, geometry.normal, refractionRatio );\n\t\t#endif\n\t\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n\t\tfloat specularMIPLevel = getSpecularMIPLevel( blinnShininessExponent, maxMIPLevel );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\n\t\t\tvec4 envMapColor = textureCubeUV(queryReflectVec, BlinnExponentToGGXRoughness(blinnShininessExponent));\n\t\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\t\tvec2 sampleUV;\n\t\t\tsampleUV.y = asin( clamp( reflectVec.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\t\t\tsampleUV.x = atan( reflectVec.z, reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = texture2DLodEXT( envMap, sampleUV, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = texture2D( envMap, sampleUV, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_SPHERE )\n\t\t\tvec3 reflectView = normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0,0.0,1.0 ) );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = texture2DLodEXT( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#endif\n\t\treturn envMapColor.rgb * envMapIntensity;\n\t}\n#endif\n";
var lights_phong_fragment = "BlinnPhongMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;\n";
var lights_phong_pars_fragment = "varying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\nstruct BlinnPhongMaterial {\n\tvec3\tdiffuseColor;\n\tvec3\tspecularColor;\n\tfloat\tspecularShininess;\n\tfloat\tspecularStrength;\n};\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\t#ifdef TOON\n\t\tvec3 irradiance = getGradientIrradiance( geometry.normal, directLight.direction ) * directLight.color;\n\t#else\n\t\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\t\tvec3 irradiance = dotNL * directLight.color;\n\t#endif\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n\treflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong( directLight, geometry, material.specularColor, material.specularShininess ) * material.specularStrength;\n}\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_BlinnPhong\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_BlinnPhong\n#define Material_LightProbeLOD( material )\t(0)\n";
var lights_physical_fragment = "PhysicalMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\nmaterial.specularRoughness = clamp( roughnessFactor, 0.04, 1.0 );\n#ifdef STANDARD\n\tmaterial.specularColor = mix( vec3( DEFAULT_SPECULAR_COEFFICIENT ), diffuseColor.rgb, metalnessFactor );\n#else\n\tmaterial.specularColor = mix( vec3( MAXIMUM_SPECULAR_COEFFICIENT * pow2( reflectivity ) ), diffuseColor.rgb, metalnessFactor );\n\tmaterial.clearCoat = saturate( clearCoat );\tmaterial.clearCoatRoughness = clamp( clearCoatRoughness, 0.04, 1.0 );\n#endif\n";
var lights_physical_pars_fragment = "struct PhysicalMaterial {\n\tvec3\tdiffuseColor;\n\tfloat\tspecularRoughness;\n\tvec3\tspecularColor;\n\t#ifndef STANDARD\n\t\tfloat clearCoat;\n\t\tfloat clearCoatRoughness;\n\t#endif\n};\n#define MAXIMUM_SPECULAR_COEFFICIENT 0.16\n#define DEFAULT_SPECULAR_COEFFICIENT 0.04\nfloat clearCoatDHRApprox( const in float roughness, const in float dotNL ) {\n\treturn DEFAULT_SPECULAR_COEFFICIENT + ( 1.0 - DEFAULT_SPECULAR_COEFFICIENT ) * ( pow( 1.0 - dotNL, 5.0 ) * pow( 1.0 - roughness, 2.0 ) );\n}\n#if NUM_RECT_AREA_LIGHTS > 0\n\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t\tvec3 normal = geometry.normal;\n\t\tvec3 viewDir = geometry.viewDir;\n\t\tvec3 position = geometry.position;\n\t\tvec3 lightPos = rectAreaLight.position;\n\t\tvec3 halfWidth = rectAreaLight.halfWidth;\n\t\tvec3 halfHeight = rectAreaLight.halfHeight;\n\t\tvec3 lightColor = rectAreaLight.color;\n\t\tfloat roughness = material.specularRoughness;\n\t\tvec3 rectCoords[ 4 ];\n\t\trectCoords[ 0 ] = lightPos - halfWidth - halfHeight;\t\trectCoords[ 1 ] = lightPos + halfWidth - halfHeight;\n\t\trectCoords[ 2 ] = lightPos + halfWidth + halfHeight;\n\t\trectCoords[ 3 ] = lightPos - halfWidth + halfHeight;\n\t\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\n\t\tvec4 t1 = texture2D( ltc_1, uv );\n\t\tvec4 t2 = texture2D( ltc_2, uv );\n\t\tmat3 mInv = mat3(\n\t\t\tvec3( t1.x, 0, t1.y ),\n\t\t\tvec3( 0, 1, 0 ),\n\t\t\tvec3( t1.z, 0, t1.w )\n\t\t);\n\t\tvec3 fresnel = ( material.specularColor * t2.x + ( vec3( 1.0 ) - material.specularColor ) * t2.y );\n\t\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\n\t}\n#endif\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\t#ifndef STANDARD\n\t\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\n\t#else\n\t\tfloat clearCoatDHR = 0.0;\n\t#endif\n\treflectedLight.directSpecular += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Specular_GGX( directLight, geometry, material.specularColor, material.specularRoughness );\n\treflectedLight.directDiffuse += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n\t#ifndef STANDARD\n\t\treflectedLight.directSpecular += irradiance * material.clearCoat * BRDF_Specular_GGX( directLight, geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\n\t#endif\n}\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 clearCoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t#ifndef STANDARD\n\t\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\t\tfloat dotNL = dotNV;\n\t\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\n\t#else\n\t\tfloat clearCoatDHR = 0.0;\n\t#endif\n\treflectedLight.indirectSpecular += ( 1.0 - clearCoatDHR ) * radiance * BRDF_Specular_GGX_Environment( geometry, material.specularColor, material.specularRoughness );\n\t#ifndef STANDARD\n\t\treflectedLight.indirectSpecular += clearCoatRadiance * material.clearCoat * BRDF_Specular_GGX_Environment( geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\n\t#endif\n}\n#define RE_Direct\t\t\t\tRE_Direct_Physical\n#define RE_Direct_RectArea\t\tRE_Direct_RectArea_Physical\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Physical\n#define RE_IndirectSpecular\t\tRE_IndirectSpecular_Physical\n#define Material_BlinnShininessExponent( material ) GGXRoughnessToBlinnExponent( material.specularRoughness )\n#define Material_ClearCoat_BlinnShininessExponent( material ) GGXRoughnessToBlinnExponent( material.clearCoatRoughness )\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\n\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\n}\n";
var lights_fragment_begin = "\nGeometricContext geometry;\ngeometry.position = - vViewPosition;\ngeometry.normal = normal;\ngeometry.viewDir = normalize( vViewPosition );\nIncidentLight directLight;\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n\tPointLight pointLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tgetPointDirectLightIrradiance( pointLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( pointLight.shadow, directLight.visible ) ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n\tSpotLight spotLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tgetSpotDirectLightIrradiance( spotLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( spotLight.shadow, directLight.visible ) ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n\tDirectionalLight directionalLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tgetDirectionalDirectLightIrradiance( directionalLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( directionalLight.shadow, directLight.visible ) ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n\tRectAreaLight rectAreaLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\n\t\trectAreaLight = rectAreaLights[ i ];\n\t\tRE_Direct_RectArea( rectAreaLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if defined( RE_IndirectDiffuse )\n\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\t#if ( NUM_HEMI_LIGHTS > 0 )\n\t\t#pragma unroll_loop\n\t\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\t\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t}\n\t#endif\n#endif\n#if defined( RE_IndirectSpecular )\n\tvec3 radiance = vec3( 0.0 );\n\tvec3 clearCoatRadiance = vec3( 0.0 );\n#endif\n";
var lights_fragment_maps = "#if defined( RE_IndirectDiffuse )\n\t#ifdef USE_LIGHTMAP\n\t\tvec3 lightMapIrradiance = texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tlightMapIrradiance *= PI;\n\t\t#endif\n\t\tirradiance += lightMapIrradiance;\n\t#endif\n\t#if defined( USE_ENVMAP ) && defined( PHYSICAL ) && defined( ENVMAP_TYPE_CUBE_UV )\n\t\tirradiance += getLightProbeIndirectIrradiance( geometry, maxMipLevel );\n\t#endif\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\tradiance += getLightProbeIndirectRadiance( geometry, Material_BlinnShininessExponent( material ), maxMipLevel );\n\t#ifndef STANDARD\n\t\tclearCoatRadiance += getLightProbeIndirectRadiance( geometry, Material_ClearCoat_BlinnShininessExponent( material ), maxMipLevel );\n\t#endif\n#endif\n";
var lights_fragment_end = "#if defined( RE_IndirectDiffuse )\n\tRE_IndirectDiffuse( irradiance, geometry, material, reflectedLight );\n#endif\n#if defined( RE_IndirectSpecular )\n\tRE_IndirectSpecular( radiance, clearCoatRadiance, geometry, material, reflectedLight );\n#endif\n";
var logdepthbuf_fragment = "#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\tgl_FragDepthEXT = log2( vFragDepth ) * logDepthBufFC * 0.5;\n#endif";
var logdepthbuf_pars_fragment = "#ifdef USE_LOGDEPTHBUF\n\tuniform float logDepthBufFC;\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t#endif\n#endif\n";
var logdepthbuf_pars_vertex = "#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t#endif\n\tuniform float logDepthBufFC;\n#endif";
var logdepthbuf_vertex = "#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvFragDepth = 1.0 + gl_Position.w;\n\t#else\n\t\tgl_Position.z = log2( max( EPSILON, gl_Position.w + 1.0 ) ) * logDepthBufFC - 1.0;\n\t\tgl_Position.z *= gl_Position.w;\n\t#endif\n#endif\n";
var map_fragment = "#ifdef USE_MAP\n\tvec4 texelColor = texture2D( map, vUv );\n\ttexelColor = mapTexelToLinear( texelColor );\n\tdiffuseColor *= texelColor;\n#endif\n";
var map_pars_fragment = "#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif\n";
var map_particle_fragment = "#ifdef USE_MAP\n\tvec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\n\tvec4 mapTexel = texture2D( map, uv );\n\tdiffuseColor *= mapTexelToLinear( mapTexel );\n#endif\n";
var map_particle_pars_fragment = "#ifdef USE_MAP\n\tuniform mat3 uvTransform;\n\tuniform sampler2D map;\n#endif\n";
var metalnessmap_fragment = "float metalnessFactor = metalness;\n#ifdef USE_METALNESSMAP\n\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\n\tmetalnessFactor *= texelMetalness.b;\n#endif\n";
var metalnessmap_pars_fragment = "#ifdef USE_METALNESSMAP\n\tuniform sampler2D metalnessMap;\n#endif";
var morphnormal_vertex = "#ifdef USE_MORPHNORMALS\n\tobjectNormal += ( morphNormal0 - normal ) * morphTargetInfluences[ 0 ];\n\tobjectNormal += ( morphNormal1 - normal ) * morphTargetInfluences[ 1 ];\n\tobjectNormal += ( morphNormal2 - normal ) * morphTargetInfluences[ 2 ];\n\tobjectNormal += ( morphNormal3 - normal ) * morphTargetInfluences[ 3 ];\n#endif\n";
var morphtarget_pars_vertex = "#ifdef USE_MORPHTARGETS\n\t#ifndef USE_MORPHNORMALS\n\tuniform float morphTargetInfluences[ 8 ];\n\t#else\n\tuniform float morphTargetInfluences[ 4 ];\n\t#endif\n#endif";
var morphtarget_vertex = "#ifdef USE_MORPHTARGETS\n\ttransformed += ( morphTarget0 - position ) * morphTargetInfluences[ 0 ];\n\ttransformed += ( morphTarget1 - position ) * morphTargetInfluences[ 1 ];\n\ttransformed += ( morphTarget2 - position ) * morphTargetInfluences[ 2 ];\n\ttransformed += ( morphTarget3 - position ) * morphTargetInfluences[ 3 ];\n\t#ifndef USE_MORPHNORMALS\n\ttransformed += ( morphTarget4 - position ) * morphTargetInfluences[ 4 ];\n\ttransformed += ( morphTarget5 - position ) * morphTargetInfluences[ 5 ];\n\ttransformed += ( morphTarget6 - position ) * morphTargetInfluences[ 6 ];\n\ttransformed += ( morphTarget7 - position ) * morphTargetInfluences[ 7 ];\n\t#endif\n#endif\n";
var normal_fragment_begin = "#ifdef FLAT_SHADED\n\tvec3 fdx = vec3( dFdx( vViewPosition.x ), dFdx( vViewPosition.y ), dFdx( vViewPosition.z ) );\n\tvec3 fdy = vec3( dFdy( vViewPosition.x ), dFdy( vViewPosition.y ), dFdy( vViewPosition.z ) );\n\tvec3 normal = normalize( cross( fdx, fdy ) );\n#else\n\tvec3 normal = normalize( vNormal );\n\t#ifdef DOUBLE_SIDED\n\t\tnormal = normal * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t#endif\n#endif\n";
var normal_fragment_maps = "#ifdef USE_NORMALMAP\n\tnormal = perturbNormal2Arb( -vViewPosition, normal );\n#elif defined( USE_BUMPMAP )\n\tnormal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd() );\n#endif\n";
var normalmap_pars_fragment = "#ifdef USE_NORMALMAP\n\tuniform sampler2D normalMap;\n\tuniform vec2 normalScale;\n\tvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm ) {\n\t\tvec3 q0 = vec3( dFdx( eye_pos.x ), dFdx( eye_pos.y ), dFdx( eye_pos.z ) );\n\t\tvec3 q1 = vec3( dFdy( eye_pos.x ), dFdy( eye_pos.y ), dFdy( eye_pos.z ) );\n\t\tvec2 st0 = dFdx( vUv.st );\n\t\tvec2 st1 = dFdy( vUv.st );\n\t\tfloat scale = sign( st1.t * st0.s - st0.t * st1.s );\t\tscale *= float( gl_FrontFacing ) * 2.0 - 1.0;\n\t\tvec3 S = normalize( ( q0 * st1.t - q1 * st0.t ) * scale );\n\t\tvec3 T = normalize( ( - q0 * st1.s + q1 * st0.s ) * scale );\n\t\tvec3 N = normalize( surf_norm );\n\t\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\t\tmapN.xy = normalScale * mapN.xy;\n\t\tmat3 tsn = mat3( S, T, N );\n\t\treturn normalize( tsn * mapN );\n\t}\n#endif\n";
var packing = "vec3 packNormalToRGB( const in vec3 normal ) {\n\treturn normalize( normal ) * 0.5 + 0.5;\n}\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\n\treturn 2.0 * rgb.xyz - 1.0;\n}\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256., 256. );\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\nconst float ShiftRight8 = 1. / 256.;\nvec4 packDepthToRGBA( const in float v ) {\n\tvec4 r = vec4( fract( v * PackFactors ), v );\n\tr.yzw -= r.xyz * ShiftRight8;\treturn r * PackUpscale;\n}\nfloat unpackRGBAToDepth( const in vec4 v ) {\n\treturn dot( v, UnpackFactors );\n}\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( viewZ + near ) / ( near - far );\n}\nfloat orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {\n\treturn linearClipZ * ( near - far ) - near;\n}\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn (( near + viewZ ) * far ) / (( far - near ) * viewZ );\n}\nfloat perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {\n\treturn ( near * far ) / ( ( far - near ) * invClipZ - far );\n}\n";
var premultiplied_alpha_fragment = "#ifdef PREMULTIPLIED_ALPHA\n\tgl_FragColor.rgb *= gl_FragColor.a;\n#endif\n";
var project_vertex = "vec4 mvPosition = modelViewMatrix * vec4( transformed, 1.0 );\ngl_Position = projectionMatrix * mvPosition;\n";
var dithering_fragment = "#if defined( DITHERING )\n gl_FragColor.rgb = dithering( gl_FragColor.rgb );\n#endif\n";
var dithering_pars_fragment = "#if defined( DITHERING )\n\tvec3 dithering( vec3 color ) {\n\t\tfloat grid_position = rand( gl_FragCoord.xy );\n\t\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\n\t\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\n\t\treturn color + dither_shift_RGB;\n\t}\n#endif\n";
var roughnessmap_fragment = "float roughnessFactor = roughness;\n#ifdef USE_ROUGHNESSMAP\n\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\n\troughnessFactor *= texelRoughness.g;\n#endif\n";
var roughnessmap_pars_fragment = "#ifdef USE_ROUGHNESSMAP\n\tuniform sampler2D roughnessMap;\n#endif";
var shadowmap_pars_fragment = "#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\t\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHTS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ];\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHTS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ];\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\t\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHTS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ];\n\t#endif\n\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\n\t\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\n\t}\n\tfloat texture2DShadowLerp( sampler2D depths, vec2 size, vec2 uv, float compare ) {\n\t\tconst vec2 offset = vec2( 0.0, 1.0 );\n\t\tvec2 texelSize = vec2( 1.0 ) / size;\n\t\tvec2 centroidUV = floor( uv * size + 0.5 ) / size;\n\t\tfloat lb = texture2DCompare( depths, centroidUV + texelSize * offset.xx, compare );\n\t\tfloat lt = texture2DCompare( depths, centroidUV + texelSize * offset.xy, compare );\n\t\tfloat rb = texture2DCompare( depths, centroidUV + texelSize * offset.yx, compare );\n\t\tfloat rt = texture2DCompare( depths, centroidUV + texelSize * offset.yy, compare );\n\t\tvec2 f = fract( uv * size + 0.5 );\n\t\tfloat a = mix( lb, lt, f.y );\n\t\tfloat b = mix( rb, rt, f.y );\n\t\tfloat c = mix( a, b, f.x );\n\t\treturn c;\n\t}\n\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\tfloat shadow = 1.0;\n\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\tshadowCoord.z += shadowBias;\n\t\tbvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\n\t\tbool inFrustum = all( inFrustumVec );\n\t\tbvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\n\t\tbool frustumTest = all( frustumTestVec );\n\t\tif ( frustumTest ) {\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\tshadow = (\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\tshadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#endif\n\t\t}\n\t\treturn shadow;\n\t}\n\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\n\t\tvec3 absV = abs( v );\n\t\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\n\t\tabsV *= scaleToCube;\n\t\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\n\t\tvec2 planar = v.xy;\n\t\tfloat almostATexel = 1.5 * texelSizeY;\n\t\tfloat almostOne = 1.0 - almostATexel;\n\t\tif ( absV.z >= almostOne ) {\n\t\t\tif ( v.z > 0.0 )\n\t\t\t\tplanar.x = 4.0 - v.x;\n\t\t} else if ( absV.x >= almostOne ) {\n\t\t\tfloat signX = sign( v.x );\n\t\t\tplanar.x = v.z * signX + 2.0 * signX;\n\t\t} else if ( absV.y >= almostOne ) {\n\t\t\tfloat signY = sign( v.y );\n\t\t\tplanar.x = v.x + 2.0 * signY + 2.0;\n\t\t\tplanar.y = v.z * signY - 2.0;\n\t\t}\n\t\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\n\t}\n\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n\t\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\tfloat dp = ( length( lightToPosition ) - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear );\t\tdp += shadowBias;\n\t\tvec3 bd3D = normalize( lightToPosition );\n\t\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\n\t\t\treturn (\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\treturn texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\n\t\t#endif\n\t}\n#endif\n";
var shadowmap_pars_vertex = "#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\t\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHTS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ];\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\t\tuniform mat4 spotShadowMatrix[ NUM_SPOT_LIGHTS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ];\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\t\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHTS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ];\n\t#endif\n#endif\n";
var shadowmap_vertex = "#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tvSpotShadowCoord[ i ] = spotShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n#endif\n";
var shadowmask_pars_fragment = "float getShadowMask() {\n\tfloat shadow = 1.0;\n\t#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\tDirectionalLight directionalLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tshadow *= bool( directionalLight.shadow ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t}\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\tSpotLight spotLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tshadow *= bool( spotLight.shadow ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t}\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\tPointLight pointLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tshadow *= bool( pointLight.shadow ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\n\t}\n\t#endif\n\t#endif\n\treturn shadow;\n}\n";
var skinbase_vertex = "#ifdef USE_SKINNING\n\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\n\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\n\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\n\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\n#endif";
var skinning_pars_vertex = "#ifdef USE_SKINNING\n\tuniform mat4 bindMatrix;\n\tuniform mat4 bindMatrixInverse;\n\t#ifdef BONE_TEXTURE\n\t\tuniform sampler2D boneTexture;\n\t\tuniform int boneTextureSize;\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tfloat j = i * 4.0;\n\t\t\tfloat x = mod( j, float( boneTextureSize ) );\n\t\t\tfloat y = floor( j / float( boneTextureSize ) );\n\t\t\tfloat dx = 1.0 / float( boneTextureSize );\n\t\t\tfloat dy = 1.0 / float( boneTextureSize );\n\t\t\ty = dy * ( y + 0.5 );\n\t\t\tvec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\n\t\t\tvec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\n\t\t\tvec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\n\t\t\tvec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\n\t\t\tmat4 bone = mat4( v1, v2, v3, v4 );\n\t\t\treturn bone;\n\t\t}\n\t#else\n\t\tuniform mat4 boneMatrices[ MAX_BONES ];\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tmat4 bone = boneMatrices[ int(i) ];\n\t\t\treturn bone;\n\t\t}\n\t#endif\n#endif\n";
var skinning_vertex = "#ifdef USE_SKINNING\n\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\n\tvec4 skinned = vec4( 0.0 );\n\tskinned += boneMatX * skinVertex * skinWeight.x;\n\tskinned += boneMatY * skinVertex * skinWeight.y;\n\tskinned += boneMatZ * skinVertex * skinWeight.z;\n\tskinned += boneMatW * skinVertex * skinWeight.w;\n\ttransformed = ( bindMatrixInverse * skinned ).xyz;\n#endif\n";
var skinnormal_vertex = "#ifdef USE_SKINNING\n\tmat4 skinMatrix = mat4( 0.0 );\n\tskinMatrix += skinWeight.x * boneMatX;\n\tskinMatrix += skinWeight.y * boneMatY;\n\tskinMatrix += skinWeight.z * boneMatZ;\n\tskinMatrix += skinWeight.w * boneMatW;\n\tskinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\n\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\n#endif\n";
var specularmap_fragment = "float specularStrength;\n#ifdef USE_SPECULARMAP\n\tvec4 texelSpecular = texture2D( specularMap, vUv );\n\tspecularStrength = texelSpecular.r;\n#else\n\tspecularStrength = 1.0;\n#endif";
var specularmap_pars_fragment = "#ifdef USE_SPECULARMAP\n\tuniform sampler2D specularMap;\n#endif";
var tonemapping_fragment = "#if defined( TONE_MAPPING )\n gl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\n#endif\n";
var tonemapping_pars_fragment = "#ifndef saturate\n\t#define saturate(a) clamp( a, 0.0, 1.0 )\n#endif\nuniform float toneMappingExposure;\nuniform float toneMappingWhitePoint;\nvec3 LinearToneMapping( vec3 color ) {\n\treturn toneMappingExposure * color;\n}\nvec3 ReinhardToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( color / ( vec3( 1.0 ) + color ) );\n}\n#define Uncharted2Helper( x ) max( ( ( x * ( 0.15 * x + 0.10 * 0.50 ) + 0.20 * 0.02 ) / ( x * ( 0.15 * x + 0.50 ) + 0.20 * 0.30 ) ) - 0.02 / 0.30, vec3( 0.0 ) )\nvec3 Uncharted2ToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( Uncharted2Helper( color ) / Uncharted2Helper( vec3( toneMappingWhitePoint ) ) );\n}\nvec3 OptimizedCineonToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\tcolor = max( vec3( 0.0 ), color - 0.004 );\n\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\n}\n";
var uv_pars_fragment = "#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvarying vec2 vUv;\n#endif";
var uv_pars_vertex = "#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvarying vec2 vUv;\n\tuniform mat3 uvTransform;\n#endif\n";
var uv_vertex = "#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n#endif";
var uv2_pars_fragment = "#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvarying vec2 vUv2;\n#endif";
var uv2_pars_vertex = "#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tattribute vec2 uv2;\n\tvarying vec2 vUv2;\n#endif";
var uv2_vertex = "#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvUv2 = uv2;\n#endif";
var worldpos_vertex = "#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP )\n\tvec4 worldPosition = modelMatrix * vec4( transformed, 1.0 );\n#endif\n";
var cube_frag = "uniform samplerCube tCube;\nuniform float tFlip;\nuniform float opacity;\nvarying vec3 vWorldPosition;\nvoid main() {\n\tgl_FragColor = textureCube( tCube, vec3( tFlip * vWorldPosition.x, vWorldPosition.yz ) );\n\tgl_FragColor.a *= opacity;\n}\n";
var cube_vert = "varying vec3 vWorldPosition;\n#include <common>\nvoid main() {\n\tvWorldPosition = transformDirection( position, modelMatrix );\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\tgl_Position.z = gl_Position.w;\n}\n";
var depth_frag = "#if DEPTH_PACKING == 3200\n\tuniform float opacity;\n#endif\n#include <common>\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( 1.0 );\n\t#if DEPTH_PACKING == 3200\n\t\tdiffuseColor.a = opacity;\n\t#endif\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <logdepthbuf_fragment>\n\t#if DEPTH_PACKING == 3200\n\t\tgl_FragColor = vec4( vec3( 1.0 - gl_FragCoord.z ), opacity );\n\t#elif DEPTH_PACKING == 3201\n\t\tgl_FragColor = packDepthToRGBA( gl_FragCoord.z );\n\t#endif\n}\n";
var depth_vert = "#include <common>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <skinbase_vertex>\n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include <beginnormal_vertex>\n\t\t#include <morphnormal_vertex>\n\t\t#include <skinnormal_vertex>\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n}\n";
var distanceRGBA_frag = "#define DISTANCE\nuniform vec3 referencePosition;\nuniform float nearDistance;\nuniform float farDistance;\nvarying vec3 vWorldPosition;\n#include <common>\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main () {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( 1.0 );\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\tfloat dist = length( vWorldPosition - referencePosition );\n\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\n\tdist = saturate( dist );\n\tgl_FragColor = packDepthToRGBA( dist );\n}\n";
var distanceRGBA_vert = "#define DISTANCE\nvarying vec3 vWorldPosition;\n#include <common>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <skinbase_vertex>\n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include <beginnormal_vertex>\n\t\t#include <morphnormal_vertex>\n\t\t#include <skinnormal_vertex>\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <worldpos_vertex>\n\t#include <clipping_planes_vertex>\n\tvWorldPosition = worldPosition.xyz;\n}\n";
var equirect_frag = "uniform sampler2D tEquirect;\nvarying vec3 vWorldPosition;\n#include <common>\nvoid main() {\n\tvec3 direction = normalize( vWorldPosition );\n\tvec2 sampleUV;\n\tsampleUV.y = asin( clamp( direction.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\tsampleUV.x = atan( direction.z, direction.x ) * RECIPROCAL_PI2 + 0.5;\n\tgl_FragColor = texture2D( tEquirect, sampleUV );\n}\n";
var equirect_vert = "varying vec3 vWorldPosition;\n#include <common>\nvoid main() {\n\tvWorldPosition = transformDirection( position, modelMatrix );\n\t#include <begin_vertex>\n\t#include <project_vertex>\n}\n";
var linedashed_frag = "uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;\n#include <common>\n#include <color_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\n\t\tdiscard;\n\t}\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <color_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <premultiplied_alpha_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}\n";
var linedashed_vert = "uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include <common>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <color_vertex>\n\tvLineDistance = scale * lineDistance;\n\tvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <fog_vertex>\n}\n";
var meshbasic_frag = "uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <envmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\t#ifdef USE_LIGHTMAP\n\t\treflectedLight.indirectDiffuse += texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n\t#else\n\t\treflectedLight.indirectDiffuse += vec3( 1.0 );\n\t#endif\n\t#include <aomap_fragment>\n\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\t#include <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <premultiplied_alpha_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}\n";
var meshbasic_vert = "#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <envmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <skinbase_vertex>\n\t#ifdef USE_ENVMAP\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <worldpos_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <envmap_vertex>\n\t#include <fog_vertex>\n}\n";
var meshlambert_frag = "uniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\nvarying vec3 vLightFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n#endif\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_pars_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <lights_pars_maps>\n#include <fog_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <shadowmask_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\t#include <emissivemap_fragment>\n\treflectedLight.indirectDiffuse = getAmbientLightIrradiance( ambientLightColor );\n\t#include <lightmap_fragment>\n\treflectedLight.indirectDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb );\n\t#ifdef DOUBLE_SIDED\n\t\treflectedLight.directDiffuse = ( gl_FrontFacing ) ? vLightFront : vLightBack;\n\t#else\n\t\treflectedLight.directDiffuse = vLightFront;\n\t#endif\n\treflectedLight.directDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb ) * getShadowMask();\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}\n";
var meshlambert_vert = "#define LAMBERT\nvarying vec3 vLightFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <envmap_pars_vertex>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <lights_pars_maps>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <worldpos_vertex>\n\t#include <envmap_vertex>\n\t#include <lights_lambert_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}\n";
var meshphong_frag = "#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_pars_fragment>\n#include <gradientmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <lights_pars_maps>\n#include <lights_phong_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\t#include <emissivemap_fragment>\n\t#include <lights_phong_fragment>\n\t#include <lights_fragment_begin>\n\t#include <lights_fragment_maps>\n\t#include <lights_fragment_end>\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#include <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}\n";
var meshphong_vert = "#define PHONG\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <envmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <envmap_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}\n";
var meshphysical_frag = "#define PHYSICAL\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\n#ifndef STANDARD\n\tuniform float clearCoat;\n\tuniform float clearCoatRoughness;\n#endif\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <cube_uv_reflection_fragment>\n#include <lights_pars_begin>\n#include <lights_pars_maps>\n#include <lights_physical_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <roughnessmap_pars_fragment>\n#include <metalnessmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <roughnessmap_fragment>\n\t#include <metalnessmap_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\t#include <emissivemap_fragment>\n\t#include <lights_physical_fragment>\n\t#include <lights_fragment_begin>\n\t#include <lights_fragment_maps>\n\t#include <lights_fragment_end>\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}\n";
var meshphysical_vert = "#define PHYSICAL\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}\n";
var normal_frag = "#define NORMAL\nuniform float opacity;\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <packing>\n#include <uv_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\nvoid main() {\n\t#include <logdepthbuf_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\tgl_FragColor = vec4( packNormalToRGB( normal ), opacity );\n}\n";
var normal_vert = "#define NORMAL\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n}\n";
var points_frag = "uniform vec3 diffuse;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <color_pars_fragment>\n#include <map_particle_pars_fragment>\n#include <fog_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_particle_fragment>\n\t#include <color_fragment>\n\t#include <alphatest_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <premultiplied_alpha_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}\n";
var points_vert = "uniform float size;\nuniform float scale;\n#include <common>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <color_vertex>\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\t#ifdef USE_SIZEATTENUATION\n\t\tgl_PointSize = size * ( scale / - mvPosition.z );\n\t#else\n\t\tgl_PointSize = size;\n\t#endif\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}\n";
var shadow_frag = "uniform vec3 color;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <shadowmap_pars_fragment>\n#include <shadowmask_pars_fragment>\nvoid main() {\n\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\n\t#include <fog_fragment>\n}\n";
var shadow_vert = "#include <fog_pars_vertex>\n#include <shadowmap_pars_vertex>\nvoid main() {\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}\n";
var ShaderChunk = {
alphamap_fragment: alphamap_fragment,
alphamap_pars_fragment: alphamap_pars_fragment,
alphatest_fragment: alphatest_fragment,
aomap_fragment: aomap_fragment,
aomap_pars_fragment: aomap_pars_fragment,
begin_vertex: begin_vertex,
beginnormal_vertex: beginnormal_vertex,
bsdfs: bsdfs,
bumpmap_pars_fragment: bumpmap_pars_fragment,
clipping_planes_fragment: clipping_planes_fragment,
clipping_planes_pars_fragment: clipping_planes_pars_fragment,
clipping_planes_pars_vertex: clipping_planes_pars_vertex,
clipping_planes_vertex: clipping_planes_vertex,
color_fragment: color_fragment,
color_pars_fragment: color_pars_fragment,
color_pars_vertex: color_pars_vertex,
color_vertex: color_vertex,
common: common,
cube_uv_reflection_fragment: cube_uv_reflection_fragment,
defaultnormal_vertex: defaultnormal_vertex,
displacementmap_pars_vertex: displacementmap_pars_vertex,
displacementmap_vertex: displacementmap_vertex,
emissivemap_fragment: emissivemap_fragment,
emissivemap_pars_fragment: emissivemap_pars_fragment,
encodings_fragment: encodings_fragment,
encodings_pars_fragment: encodings_pars_fragment,
envmap_fragment: envmap_fragment,
envmap_pars_fragment: envmap_pars_fragment,
envmap_pars_vertex: envmap_pars_vertex,
envmap_vertex: envmap_vertex,
fog_vertex: fog_vertex,
fog_pars_vertex: fog_pars_vertex,
fog_fragment: fog_fragment,
fog_pars_fragment: fog_pars_fragment,
gradientmap_pars_fragment: gradientmap_pars_fragment,
lightmap_fragment: lightmap_fragment,
lightmap_pars_fragment: lightmap_pars_fragment,
lights_lambert_vertex: lights_lambert_vertex,
lights_pars_begin: lights_pars_begin,
lights_pars_maps: lights_pars_maps,
lights_phong_fragment: lights_phong_fragment,
lights_phong_pars_fragment: lights_phong_pars_fragment,
lights_physical_fragment: lights_physical_fragment,
lights_physical_pars_fragment: lights_physical_pars_fragment,
lights_fragment_begin: lights_fragment_begin,
lights_fragment_maps: lights_fragment_maps,
lights_fragment_end: lights_fragment_end,
logdepthbuf_fragment: logdepthbuf_fragment,
logdepthbuf_pars_fragment: logdepthbuf_pars_fragment,
logdepthbuf_pars_vertex: logdepthbuf_pars_vertex,
logdepthbuf_vertex: logdepthbuf_vertex,
map_fragment: map_fragment,
map_pars_fragment: map_pars_fragment,
map_particle_fragment: map_particle_fragment,
map_particle_pars_fragment: map_particle_pars_fragment,
metalnessmap_fragment: metalnessmap_fragment,
metalnessmap_pars_fragment: metalnessmap_pars_fragment,
morphnormal_vertex: morphnormal_vertex,
morphtarget_pars_vertex: morphtarget_pars_vertex,
morphtarget_vertex: morphtarget_vertex,
normal_fragment_begin: normal_fragment_begin,
normal_fragment_maps: normal_fragment_maps,
normalmap_pars_fragment: normalmap_pars_fragment,
packing: packing,
premultiplied_alpha_fragment: premultiplied_alpha_fragment,
project_vertex: project_vertex,
dithering_fragment: dithering_fragment,
dithering_pars_fragment: dithering_pars_fragment,
roughnessmap_fragment: roughnessmap_fragment,
roughnessmap_pars_fragment: roughnessmap_pars_fragment,
shadowmap_pars_fragment: shadowmap_pars_fragment,
shadowmap_pars_vertex: shadowmap_pars_vertex,
shadowmap_vertex: shadowmap_vertex,
shadowmask_pars_fragment: shadowmask_pars_fragment,
skinbase_vertex: skinbase_vertex,
skinning_pars_vertex: skinning_pars_vertex,
skinning_vertex: skinning_vertex,
skinnormal_vertex: skinnormal_vertex,
specularmap_fragment: specularmap_fragment,
specularmap_pars_fragment: specularmap_pars_fragment,
tonemapping_fragment: tonemapping_fragment,
tonemapping_pars_fragment: tonemapping_pars_fragment,
uv_pars_fragment: uv_pars_fragment,
uv_pars_vertex: uv_pars_vertex,
uv_vertex: uv_vertex,
uv2_pars_fragment: uv2_pars_fragment,
uv2_pars_vertex: uv2_pars_vertex,
uv2_vertex: uv2_vertex,
worldpos_vertex: worldpos_vertex,
cube_frag: cube_frag,
cube_vert: cube_vert,
depth_frag: depth_frag,
depth_vert: depth_vert,
distanceRGBA_frag: distanceRGBA_frag,
distanceRGBA_vert: distanceRGBA_vert,
equirect_frag: equirect_frag,
equirect_vert: equirect_vert,
linedashed_frag: linedashed_frag,
linedashed_vert: linedashed_vert,
meshbasic_frag: meshbasic_frag,
meshbasic_vert: meshbasic_vert,
meshlambert_frag: meshlambert_frag,
meshlambert_vert: meshlambert_vert,
meshphong_frag: meshphong_frag,
meshphong_vert: meshphong_vert,
meshphysical_frag: meshphysical_frag,
meshphysical_vert: meshphysical_vert,
normal_frag: normal_frag,
normal_vert: normal_vert,
points_frag: points_frag,
points_vert: points_vert,
shadow_frag: shadow_frag,
shadow_vert: shadow_vert
};
/**
* Uniform Utilities
*/
var UniformsUtils = {
merge: function ( uniforms ) {
var merged = {};
for ( var u = 0; u < uniforms.length; u ++ ) {
var tmp = this.clone( uniforms[ u ] );
for ( var p in tmp ) {
merged[ p ] = tmp[ p ];
}
}
return merged;
},
clone: function ( uniforms_src ) {
var uniforms_dst = {};
for ( var u in uniforms_src ) {
uniforms_dst[ u ] = {};
for ( var p in uniforms_src[ u ] ) {
var parameter_src = uniforms_src[ u ][ p ];
if ( parameter_src && ( parameter_src.isColor ||
parameter_src.isMatrix3 || parameter_src.isMatrix4 ||
parameter_src.isVector2 || parameter_src.isVector3 || parameter_src.isVector4 ||
parameter_src.isTexture ) ) {
uniforms_dst[ u ][ p ] = parameter_src.clone();
} else if ( Array.isArray( parameter_src ) ) {
uniforms_dst[ u ][ p ] = parameter_src.slice();
} else {
uniforms_dst[ u ][ p ] = parameter_src;
}
}
}
return uniforms_dst;
}
};
/**
* @author mrdoob / http://mrdoob.com/
*/
var ColorKeywords = { 'aliceblue': 0xF0F8FF, 'antiquewhite': 0xFAEBD7, 'aqua': 0x00FFFF, 'aquamarine': 0x7FFFD4, 'azure': 0xF0FFFF,
'beige': 0xF5F5DC, 'bisque': 0xFFE4C4, 'black': 0x000000, 'blanchedalmond': 0xFFEBCD, 'blue': 0x0000FF, 'blueviolet': 0x8A2BE2,
'brown': 0xA52A2A, 'burlywood': 0xDEB887, 'cadetblue': 0x5F9EA0, 'chartreuse': 0x7FFF00, 'chocolate': 0xD2691E, 'coral': 0xFF7F50,
'cornflowerblue': 0x6495ED, 'cornsilk': 0xFFF8DC, 'crimson': 0xDC143C, 'cyan': 0x00FFFF, 'darkblue': 0x00008B, 'darkcyan': 0x008B8B,
'darkgoldenrod': 0xB8860B, 'darkgray': 0xA9A9A9, 'darkgreen': 0x006400, 'darkgrey': 0xA9A9A9, 'darkkhaki': 0xBDB76B, 'darkmagenta': 0x8B008B,
'darkolivegreen': 0x556B2F, 'darkorange': 0xFF8C00, 'darkorchid': 0x9932CC, 'darkred': 0x8B0000, 'darksalmon': 0xE9967A, 'darkseagreen': 0x8FBC8F,
'darkslateblue': 0x483D8B, 'darkslategray': 0x2F4F4F, 'darkslategrey': 0x2F4F4F, 'darkturquoise': 0x00CED1, 'darkviolet': 0x9400D3,
'deeppink': 0xFF1493, 'deepskyblue': 0x00BFFF, 'dimgray': 0x696969, 'dimgrey': 0x696969, 'dodgerblue': 0x1E90FF, 'firebrick': 0xB22222,
'floralwhite': 0xFFFAF0, 'forestgreen': 0x228B22, 'fuchsia': 0xFF00FF, 'gainsboro': 0xDCDCDC, 'ghostwhite': 0xF8F8FF, 'gold': 0xFFD700,
'goldenrod': 0xDAA520, 'gray': 0x808080, 'green': 0x008000, 'greenyellow': 0xADFF2F, 'grey': 0x808080, 'honeydew': 0xF0FFF0, 'hotpink': 0xFF69B4,
'indianred': 0xCD5C5C, 'indigo': 0x4B0082, 'ivory': 0xFFFFF0, 'khaki': 0xF0E68C, 'lavender': 0xE6E6FA, 'lavenderblush': 0xFFF0F5, 'lawngreen': 0x7CFC00,
'lemonchiffon': 0xFFFACD, 'lightblue': 0xADD8E6, 'lightcoral': 0xF08080, 'lightcyan': 0xE0FFFF, 'lightgoldenrodyellow': 0xFAFAD2, 'lightgray': 0xD3D3D3,
'lightgreen': 0x90EE90, 'lightgrey': 0xD3D3D3, 'lightpink': 0xFFB6C1, 'lightsalmon': 0xFFA07A, 'lightseagreen': 0x20B2AA, 'lightskyblue': 0x87CEFA,
'lightslategray': 0x778899, 'lightslategrey': 0x778899, 'lightsteelblue': 0xB0C4DE, 'lightyellow': 0xFFFFE0, 'lime': 0x00FF00, 'limegreen': 0x32CD32,
'linen': 0xFAF0E6, 'magenta': 0xFF00FF, 'maroon': 0x800000, 'mediumaquamarine': 0x66CDAA, 'mediumblue': 0x0000CD, 'mediumorchid': 0xBA55D3,
'mediumpurple': 0x9370DB, 'mediumseagreen': 0x3CB371, 'mediumslateblue': 0x7B68EE, 'mediumspringgreen': 0x00FA9A, 'mediumturquoise': 0x48D1CC,
'mediumvioletred': 0xC71585, 'midnightblue': 0x191970, 'mintcream': 0xF5FFFA, 'mistyrose': 0xFFE4E1, 'moccasin': 0xFFE4B5, 'navajowhite': 0xFFDEAD,
'navy': 0x000080, 'oldlace': 0xFDF5E6, 'olive': 0x808000, 'olivedrab': 0x6B8E23, 'orange': 0xFFA500, 'orangered': 0xFF4500, 'orchid': 0xDA70D6,
'palegoldenrod': 0xEEE8AA, 'palegreen': 0x98FB98, 'paleturquoise': 0xAFEEEE, 'palevioletred': 0xDB7093, 'papayawhip': 0xFFEFD5, 'peachpuff': 0xFFDAB9,
'peru': 0xCD853F, 'pink': 0xFFC0CB, 'plum': 0xDDA0DD, 'powderblue': 0xB0E0E6, 'purple': 0x800080, 'rebeccapurple': 0x663399, 'red': 0xFF0000, 'rosybrown': 0xBC8F8F,
'royalblue': 0x4169E1, 'saddlebrown': 0x8B4513, 'salmon': 0xFA8072, 'sandybrown': 0xF4A460, 'seagreen': 0x2E8B57, 'seashell': 0xFFF5EE,
'sienna': 0xA0522D, 'silver': 0xC0C0C0, 'skyblue': 0x87CEEB, 'slateblue': 0x6A5ACD, 'slategray': 0x708090, 'slategrey': 0x708090, 'snow': 0xFFFAFA,
'springgreen': 0x00FF7F, 'steelblue': 0x4682B4, 'tan': 0xD2B48C, 'teal': 0x008080, 'thistle': 0xD8BFD8, 'tomato': 0xFF6347, 'turquoise': 0x40E0D0,
'violet': 0xEE82EE, 'wheat': 0xF5DEB3, 'white': 0xFFFFFF, 'whitesmoke': 0xF5F5F5, 'yellow': 0xFFFF00, 'yellowgreen': 0x9ACD32 };
function Color( r, g, b ) {
if ( g === undefined && b === undefined ) {
// r is THREE.Color, hex or string
return this.set( r );
}
return this.setRGB( r, g, b );
}
Object.assign( Color.prototype, {
isColor: true,
r: 1, g: 1, b: 1,
set: function ( value ) {
if ( value && value.isColor ) {
this.copy( value );
} else if ( typeof value === 'number' ) {
this.setHex( value );
} else if ( typeof value === 'string' ) {
this.setStyle( value );
}
return this;
},
setScalar: function ( scalar ) {
this.r = scalar;
this.g = scalar;
this.b = scalar;
return this;
},
setHex: function ( hex ) {
hex = Math.floor( hex );
this.r = ( hex >> 16 & 255 ) / 255;
this.g = ( hex >> 8 & 255 ) / 255;
this.b = ( hex & 255 ) / 255;
return this;
},
setRGB: function ( r, g, b ) {
this.r = r;
this.g = g;
this.b = b;
return this;
},
setHSL: function () {
function hue2rgb( p, q, t ) {
if ( t < 0 ) t += 1;
if ( t > 1 ) t -= 1;
if ( t < 1 / 6 ) return p + ( q - p ) * 6 * t;
if ( t < 1 / 2 ) return q;
if ( t < 2 / 3 ) return p + ( q - p ) * 6 * ( 2 / 3 - t );
return p;
}
return function setHSL( h, s, l ) {
// h,s,l ranges are in 0.0 - 1.0
h = _Math.euclideanModulo( h, 1 );
s = _Math.clamp( s, 0, 1 );
l = _Math.clamp( l, 0, 1 );
if ( s === 0 ) {
this.r = this.g = this.b = l;
} else {
var p = l <= 0.5 ? l * ( 1 + s ) : l + s - ( l * s );
var q = ( 2 * l ) - p;
this.r = hue2rgb( q, p, h + 1 / 3 );
this.g = hue2rgb( q, p, h );
this.b = hue2rgb( q, p, h - 1 / 3 );
}
return this;
};
}(),
setStyle: function ( style ) {
function handleAlpha( string ) {
if ( string === undefined ) return;
if ( parseFloat( string ) < 1 ) {
console.warn( 'THREE.Color: Alpha component of ' + style + ' will be ignored.' );
}
}
var m;
if ( m = /^((?:rgb|hsl)a?)\(\s*([^\)]*)\)/.exec( style ) ) {
// rgb / hsl
var color;
var name = m[ 1 ];
var components = m[ 2 ];
switch ( name ) {
case 'rgb':
case 'rgba':
if ( color = /^(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec( components ) ) {
// rgb(255,0,0) rgba(255,0,0,0.5)
this.r = Math.min( 255, parseInt( color[ 1 ], 10 ) ) / 255;
this.g = Math.min( 255, parseInt( color[ 2 ], 10 ) ) / 255;
this.b = Math.min( 255, parseInt( color[ 3 ], 10 ) ) / 255;
handleAlpha( color[ 5 ] );
return this;
}
if ( color = /^(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec( components ) ) {
// rgb(100%,0%,0%) rgba(100%,0%,0%,0.5)
this.r = Math.min( 100, parseInt( color[ 1 ], 10 ) ) / 100;
this.g = Math.min( 100, parseInt( color[ 2 ], 10 ) ) / 100;
this.b = Math.min( 100, parseInt( color[ 3 ], 10 ) ) / 100;
handleAlpha( color[ 5 ] );
return this;
}
break;
case 'hsl':
case 'hsla':
if ( color = /^([0-9]*\.?[0-9]+)\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec( components ) ) {
// hsl(120,50%,50%) hsla(120,50%,50%,0.5)
var h = parseFloat( color[ 1 ] ) / 360;
var s = parseInt( color[ 2 ], 10 ) / 100;
var l = parseInt( color[ 3 ], 10 ) / 100;
handleAlpha( color[ 5 ] );
return this.setHSL( h, s, l );
}
break;
}
} else if ( m = /^\#([A-Fa-f0-9]+)$/.exec( style ) ) {
// hex color
var hex = m[ 1 ];
var size = hex.length;
if ( size === 3 ) {
// #ff0
this.r = parseInt( hex.charAt( 0 ) + hex.charAt( 0 ), 16 ) / 255;
this.g = parseInt( hex.charAt( 1 ) + hex.charAt( 1 ), 16 ) / 255;
this.b = parseInt( hex.charAt( 2 ) + hex.charAt( 2 ), 16 ) / 255;
return this;
} else if ( size === 6 ) {
// #ff0000
this.r = parseInt( hex.charAt( 0 ) + hex.charAt( 1 ), 16 ) / 255;
this.g = parseInt( hex.charAt( 2 ) + hex.charAt( 3 ), 16 ) / 255;
this.b = parseInt( hex.charAt( 4 ) + hex.charAt( 5 ), 16 ) / 255;
return this;
}
}
if ( style && style.length > 0 ) {
// color keywords
var hex = ColorKeywords[ style ];
if ( hex !== undefined ) {
// red
this.setHex( hex );
} else {
// unknown color
console.warn( 'THREE.Color: Unknown color ' + style );
}
}
return this;
},
clone: function () {
return new this.constructor( this.r, this.g, this.b );
},
copy: function ( color ) {
this.r = color.r;
this.g = color.g;
this.b = color.b;
return this;
},
copyGammaToLinear: function ( color, gammaFactor ) {
if ( gammaFactor === undefined ) gammaFactor = 2.0;
this.r = Math.pow( color.r, gammaFactor );
this.g = Math.pow( color.g, gammaFactor );
this.b = Math.pow( color.b, gammaFactor );
return this;
},
copyLinearToGamma: function ( color, gammaFactor ) {
if ( gammaFactor === undefined ) gammaFactor = 2.0;
var safeInverse = ( gammaFactor > 0 ) ? ( 1.0 / gammaFactor ) : 1.0;
this.r = Math.pow( color.r, safeInverse );
this.g = Math.pow( color.g, safeInverse );
this.b = Math.pow( color.b, safeInverse );
return this;
},
convertGammaToLinear: function () {
var r = this.r, g = this.g, b = this.b;
this.r = r * r;
this.g = g * g;
this.b = b * b;
return this;
},
convertLinearToGamma: function () {
this.r = Math.sqrt( this.r );
this.g = Math.sqrt( this.g );
this.b = Math.sqrt( this.b );
return this;
},
getHex: function () {
return ( this.r * 255 ) << 16 ^ ( this.g * 255 ) << 8 ^ ( this.b * 255 ) << 0;
},
getHexString: function () {
return ( '000000' + this.getHex().toString( 16 ) ).slice( - 6 );
},
getHSL: function ( target ) {
// h,s,l ranges are in 0.0 - 1.0
if ( target === undefined ) {
console.warn( 'THREE.Color: .getHSL() target is now required' );
target = { h: 0, s: 0, l: 0 };
}
var r = this.r, g = this.g, b = this.b;
var max = Math.max( r, g, b );
var min = Math.min( r, g, b );
var hue, saturation;
var lightness = ( min + max ) / 2.0;
if ( min === max ) {
hue = 0;
saturation = 0;
} else {
var delta = max - min;
saturation = lightness <= 0.5 ? delta / ( max + min ) : delta / ( 2 - max - min );
switch ( max ) {
case r: hue = ( g - b ) / delta + ( g < b ? 6 : 0 ); break;
case g: hue = ( b - r ) / delta + 2; break;
case b: hue = ( r - g ) / delta + 4; break;
}
hue /= 6;
}
target.h = hue;
target.s = saturation;
target.l = lightness;
return target;
},
getStyle: function () {
return 'rgb(' + ( ( this.r * 255 ) | 0 ) + ',' + ( ( this.g * 255 ) | 0 ) + ',' + ( ( this.b * 255 ) | 0 ) + ')';
},
offsetHSL: function () {
var hsl = {};
return function ( h, s, l ) {
this.getHSL( hsl );
hsl.h += h; hsl.s += s; hsl.l += l;
this.setHSL( hsl.h, hsl.s, hsl.l );
return this;
};
}(),
add: function ( color ) {
this.r += color.r;
this.g += color.g;
this.b += color.b;
return this;
},
addColors: function ( color1, color2 ) {
this.r = color1.r + color2.r;
this.g = color1.g + color2.g;
this.b = color1.b + color2.b;
return this;
},
addScalar: function ( s ) {
this.r += s;
this.g += s;
this.b += s;
return this;
},
sub: function ( color ) {
this.r = Math.max( 0, this.r - color.r );
this.g = Math.max( 0, this.g - color.g );
this.b = Math.max( 0, this.b - color.b );
return this;
},
multiply: function ( color ) {
this.r *= color.r;
this.g *= color.g;
this.b *= color.b;
return this;
},
multiplyScalar: function ( s ) {
this.r *= s;
this.g *= s;
this.b *= s;
return this;
},
lerp: function ( color, alpha ) {
this.r += ( color.r - this.r ) * alpha;
this.g += ( color.g - this.g ) * alpha;
this.b += ( color.b - this.b ) * alpha;
return this;
},
equals: function ( c ) {
return ( c.r === this.r ) && ( c.g === this.g ) && ( c.b === this.b );
},
fromArray: function ( array, offset ) {
if ( offset === undefined ) offset = 0;
this.r = array[ offset ];
this.g = array[ offset + 1 ];
this.b = array[ offset + 2 ];
return this;
},
toArray: function ( array, offset ) {
if ( array === undefined ) array = [];
if ( offset === undefined ) offset = 0;
array[ offset ] = this.r;
array[ offset + 1 ] = this.g;
array[ offset + 2 ] = this.b;
return array;
},
toJSON: function () {
return this.getHex();
}
} );
/**
* Uniforms library for shared webgl shaders
*/
var UniformsLib = {
common: {
diffuse: { value: new Color( 0xeeeeee ) },
opacity: { value: 1.0 },
map: { value: null },
uvTransform: { value: new Matrix3() },
alphaMap: { value: null },
},
specularmap: {
specularMap: { value: null },
},
envmap: {
envMap: { value: null },
flipEnvMap: { value: - 1 },
reflectivity: { value: 1.0 },
refractionRatio: { value: 0.98 },
maxMipLevel: { value: 0 }
},
aomap: {
aoMap: { value: null },
aoMapIntensity: { value: 1 }
},
lightmap: {
lightMap: { value: null },
lightMapIntensity: { value: 1 }
},
emissivemap: {
emissiveMap: { value: null }
},
bumpmap: {
bumpMap: { value: null },
bumpScale: { value: 1 }
},
normalmap: {
normalMap: { value: null },
normalScale: { value: new Vector2( 1, 1 ) }
},
displacementmap: {
displacementMap: { value: null },
displacementScale: { value: 1 },
displacementBias: { value: 0 }
},
roughnessmap: {
roughnessMap: { value: null }
},
metalnessmap: {
metalnessMap: { value: null }
},
gradientmap: {
gradientMap: { value: null }
},
fog: {
fogDensity: { value: 0.00025 },
fogNear: { value: 1 },
fogFar: { value: 2000 },
fogColor: { value: new Color( 0xffffff ) }
},
lights: {
ambientLightColor: { value: [] },
directionalLights: { value: [], properties: {
direction: {},
color: {},
shadow: {},
shadowBias: {},
shadowRadius: {},
shadowMapSize: {}
} },
directionalShadowMap: { value: [] },
directionalShadowMatrix: { value: [] },
spotLights: { value: [], properties: {
color: {},
position: {},
direction: {},
distance: {},
coneCos: {},
penumbraCos: {},
decay: {},
shadow: {},
shadowBias: {},
shadowRadius: {},
shadowMapSize: {}
} },
spotShadowMap: { value: [] },
spotShadowMatrix: { value: [] },
pointLights: { value: [], properties: {
color: {},
position: {},
decay: {},
distance: {},
shadow: {},
shadowBias: {},
shadowRadius: {},
shadowMapSize: {},
shadowCameraNear: {},
shadowCameraFar: {}
} },
pointShadowMap: { value: [] },
pointShadowMatrix: { value: [] },
hemisphereLights: { value: [], properties: {
direction: {},
skyColor: {},
groundColor: {}
} },
// TODO (abelnation): RectAreaLight BRDF data needs to be moved from example to main src
rectAreaLights: { value: [], properties: {
color: {},
position: {},
width: {},
height: {}
} }
},
points: {
diffuse: { value: new Color( 0xeeeeee ) },
opacity: { value: 1.0 },
size: { value: 1.0 },
scale: { value: 1.0 },
map: { value: null },
uvTransform: { value: new Matrix3() }
}
};
/**
* @author alteredq / http://alteredqualia.com/
* @author mrdoob / http://mrdoob.com/
* @author mikael emtinger / http://gomo.se/
*/
var ShaderLib = {
basic: {
uniforms: UniformsUtils.merge( [
UniformsLib.common,
UniformsLib.specularmap,
UniformsLib.envmap,
UniformsLib.aomap,
UniformsLib.lightmap,
UniformsLib.fog
] ),
vertexShader: ShaderChunk.meshbasic_vert,
fragmentShader: ShaderChunk.meshbasic_frag
},
lambert: {
uniforms: UniformsUtils.merge( [
UniformsLib.common,
UniformsLib.specularmap,
UniformsLib.envmap,
UniformsLib.aomap,
UniformsLib.lightmap,
UniformsLib.emissivemap,
UniformsLib.fog,
UniformsLib.lights,
{
emissive: { value: new Color( 0x000000 ) }
}
] ),
vertexShader: ShaderChunk.meshlambert_vert,
fragmentShader: ShaderChunk.meshlambert_frag
},
phong: {
uniforms: UniformsUtils.merge( [
UniformsLib.common,
UniformsLib.specularmap,
UniformsLib.envmap,
UniformsLib.aomap,
UniformsLib.lightmap,
UniformsLib.emissivemap,
UniformsLib.bumpmap,
UniformsLib.normalmap,
UniformsLib.displacementmap,
UniformsLib.gradientmap,
UniformsLib.fog,
UniformsLib.lights,
{
emissive: { value: new Color( 0x000000 ) },
specular: { value: new Color( 0x111111 ) },
shininess: { value: 30 }
}
] ),
vertexShader: ShaderChunk.meshphong_vert,
fragmentShader: ShaderChunk.meshphong_frag
},
standard: {
uniforms: UniformsUtils.merge( [
UniformsLib.common,
UniformsLib.envmap,
UniformsLib.aomap,
UniformsLib.lightmap,
UniformsLib.emissivemap,
UniformsLib.bumpmap,
UniformsLib.normalmap,
UniformsLib.displacementmap,
UniformsLib.roughnessmap,
UniformsLib.metalnessmap,
UniformsLib.fog,
UniformsLib.lights,
{
emissive: { value: new Color( 0x000000 ) },
roughness: { value: 0.5 },
metalness: { value: 0.5 },
envMapIntensity: { value: 1 } // temporary
}
] ),
vertexShader: ShaderChunk.meshphysical_vert,
fragmentShader: ShaderChunk.meshphysical_frag
},
points: {
uniforms: UniformsUtils.merge( [
UniformsLib.points,
UniformsLib.fog
] ),
vertexShader: ShaderChunk.points_vert,
fragmentShader: ShaderChunk.points_frag
},
dashed: {
uniforms: UniformsUtils.merge( [
UniformsLib.common,
UniformsLib.fog,
{
scale: { value: 1 },
dashSize: { value: 1 },
totalSize: { value: 2 }
}
] ),
vertexShader: ShaderChunk.linedashed_vert,
fragmentShader: ShaderChunk.linedashed_frag
},
depth: {
uniforms: UniformsUtils.merge( [
UniformsLib.common,
UniformsLib.displacementmap
] ),
vertexShader: ShaderChunk.depth_vert,
fragmentShader: ShaderChunk.depth_frag
},
normal: {
uniforms: UniformsUtils.merge( [
UniformsLib.common,
UniformsLib.bumpmap,
UniformsLib.normalmap,
UniformsLib.displacementmap,
{
opacity: { value: 1.0 }
}
] ),
vertexShader: ShaderChunk.normal_vert,
fragmentShader: ShaderChunk.normal_frag
},
/* -------------------------------------------------------------------------
// Cube map shader
------------------------------------------------------------------------- */
cube: {
uniforms: {
tCube: { value: null },
tFlip: { value: - 1 },
opacity: { value: 1.0 }
},
vertexShader: ShaderChunk.cube_vert,
fragmentShader: ShaderChunk.cube_frag
},
equirect: {
uniforms: {
tEquirect: { value: null },
},
vertexShader: ShaderChunk.equirect_vert,
fragmentShader: ShaderChunk.equirect_frag
},
distanceRGBA: {
uniforms: UniformsUtils.merge( [
UniformsLib.common,
UniformsLib.displacementmap,
{
referencePosition: { value: new Vector3() },
nearDistance: { value: 1 },
farDistance: { value: 1000 }
}
] ),
vertexShader: ShaderChunk.distanceRGBA_vert,
fragmentShader: ShaderChunk.distanceRGBA_frag
},
shadow: {
uniforms: UniformsUtils.merge( [
UniformsLib.lights,
UniformsLib.fog,
{
color: { value: new Color( 0x00000 ) },
opacity: { value: 1.0 }
},
] ),
vertexShader: ShaderChunk.shadow_vert,
fragmentShader: ShaderChunk.shadow_frag
}
};
ShaderLib.physical = {
uniforms: UniformsUtils.merge( [
ShaderLib.standard.uniforms,
{
clearCoat: { value: 0 },
clearCoatRoughness: { value: 0 }
}
] ),
vertexShader: ShaderChunk.meshphysical_vert,
fragmentShader: ShaderChunk.meshphysical_frag
};
/**
* @author mrdoob / http://mrdoob.com/
*/
function WebGLAttributes( gl ) {
var buffers = new WeakMap();
function createBuffer( attribute, bufferType ) {
var array = attribute.array;
var usage = attribute.dynamic ? gl.DYNAMIC_DRAW : gl.STATIC_DRAW;
var buffer = gl.createBuffer();
gl.bindBuffer( bufferType, buffer );
gl.bufferData( bufferType, array, usage );
attribute.onUploadCallback();
var type = gl.FLOAT;
if ( array instanceof Float32Array ) {
type = gl.FLOAT;
} else if ( array instanceof Float64Array ) {
console.warn( 'THREE.WebGLAttributes: Unsupported data buffer format: Float64Array.' );
} else if ( array instanceof Uint16Array ) {
type = gl.UNSIGNED_SHORT;
} else if ( array instanceof Int16Array ) {
type = gl.SHORT;
} else if ( array instanceof Uint32Array ) {
type = gl.UNSIGNED_INT;
} else if ( array instanceof Int32Array ) {
type = gl.INT;
} else if ( array instanceof Int8Array ) {
type = gl.BYTE;
} else if ( array instanceof Uint8Array ) {
type = gl.UNSIGNED_BYTE;
}
return {
buffer: buffer,
type: type,
bytesPerElement: array.BYTES_PER_ELEMENT,
version: attribute.version
};
}
function updateBuffer( buffer, attribute, bufferType ) {
var array = attribute.array;
var updateRange = attribute.updateRange;
gl.bindBuffer( bufferType, buffer );
if ( attribute.dynamic === false ) {
gl.bufferData( bufferType, array, gl.STATIC_DRAW );
} else if ( updateRange.count === - 1 ) {
// Not using update ranges
gl.bufferSubData( bufferType, 0, array );
} else if ( updateRange.count === 0 ) {
console.error( 'THREE.WebGLObjects.updateBuffer: dynamic THREE.BufferAttribute marked as needsUpdate but updateRange.count is 0, ensure you are using set methods or updating manually.' );
} else {
gl.bufferSubData( bufferType, updateRange.offset * array.BYTES_PER_ELEMENT,
array.subarray( updateRange.offset, updateRange.offset + updateRange.count ) );
updateRange.count = - 1; // reset range
}
}
//
function get( attribute ) {
if ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;
return buffers.get( attribute );
}
function remove( attribute ) {
if ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;
var data = buffers.get( attribute );
if ( data ) {
gl.deleteBuffer( data.buffer );
buffers.delete( attribute );
}
}
function update( attribute, bufferType ) {
if ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;
var data = buffers.get( attribute );
if ( data === undefined ) {
buffers.set( attribute, createBuffer( attribute, bufferType ) );
} else if ( data.version < attribute.version ) {
updateBuffer( data.buffer, attribute, bufferType );
data.version = attribute.version;
}
}
return {
get: get,
remove: remove,
update: update
};
}
/**
* @author mrdoob / http://mrdoob.com/
* @author WestLangley / http://github.com/WestLangley
* @author bhouston / http://clara.io
*/
function Euler( x, y, z, order ) {
this._x = x || 0;
this._y = y || 0;
this._z = z || 0;
this._order = order || Euler.DefaultOrder;
}
Euler.RotationOrders = [ 'XYZ', 'YZX', 'ZXY', 'XZY', 'YXZ', 'ZYX' ];
Euler.DefaultOrder = 'XYZ';
Object.defineProperties( Euler.prototype, {
x: {
get: function () {
return this._x;
},
set: function ( value ) {
this._x = value;
this.onChangeCallback();
}
},
y: {
get: function () {
return this._y;
},
set: function ( value ) {
this._y = value;
this.onChangeCallback();
}
},
z: {
get: function () {
return this._z;
},
set: function ( value ) {
this._z = value;
this.onChangeCallback();
}
},
order: {
get: function () {
return this._order;
},
set: function ( value ) {
this._order = value;
this.onChangeCallback();
}
}
} );
Object.assign( Euler.prototype, {
isEuler: true,
set: function ( x, y, z, order ) {
this._x = x;
this._y = y;
this._z = z;
this._order = order || this._order;
this.onChangeCallback();
return this;
},
clone: function () {
return new this.constructor( this._x, this._y, this._z, this._order );
},
copy: function ( euler ) {
this._x = euler._x;
this._y = euler._y;
this._z = euler._z;
this._order = euler._order;
this.onChangeCallback();
return this;
},
setFromRotationMatrix: function ( m, order, update ) {
var clamp = _Math.clamp;
// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)
var te = m.elements;
var m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ];
var m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ];
var m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ];
order = order || this._order;
if ( order === 'XYZ' ) {
this._y = Math.asin( clamp( m13, - 1, 1 ) );
if ( Math.abs( m13 ) < 0.99999 ) {
this._x = Math.atan2( - m23, m33 );
this._z = Math.atan2( - m12, m11 );
} else {
this._x = Math.atan2( m32, m22 );
this._z = 0;
}
} else if ( order === 'YXZ' ) {
this._x = Math.asin( - clamp( m23, - 1, 1 ) );
if ( Math.abs( m23 ) < 0.99999 ) {
this._y = Math.atan2( m13, m33 );
this._z = Math.atan2( m21, m22 );
} else {
this._y = Math.atan2( - m31, m11 );
this._z = 0;
}
} else if ( order === 'ZXY' ) {
this._x = Math.asin( clamp( m32, - 1, 1 ) );
if ( Math.abs( m32 ) < 0.99999 ) {
this._y = Math.atan2( - m31, m33 );
this._z = Math.atan2( - m12, m22 );
} else {
this._y = 0;
this._z = Math.atan2( m21, m11 );
}
} else if ( order === 'ZYX' ) {
this._y = Math.asin( - clamp( m31, - 1, 1 ) );
if ( Math.abs( m31 ) < 0.99999 ) {
this._x = Math.atan2( m32, m33 );
this._z = Math.atan2( m21, m11 );
} else {
this._x = 0;
this._z = Math.atan2( - m12, m22 );
}
} else if ( order === 'YZX' ) {
this._z = Math.asin( clamp( m21, - 1, 1 ) );
if ( Math.abs( m21 ) < 0.99999 ) {
this._x = Math.atan2( - m23, m22 );
this._y = Math.atan2( - m31, m11 );
} else {
this._x = 0;
this._y = Math.atan2( m13, m33 );
}
} else if ( order === 'XZY' ) {
this._z = Math.asin( - clamp( m12, - 1, 1 ) );
if ( Math.abs( m12 ) < 0.99999 ) {
this._x = Math.atan2( m32, m22 );
this._y = Math.atan2( m13, m11 );
} else {
this._x = Math.atan2( - m23, m33 );
this._y = 0;
}
} else {
console.warn( 'THREE.Euler: .setFromRotationMatrix() given unsupported order: ' + order );
}
this._order = order;
if ( update !== false ) this.onChangeCallback();
return this;
},
setFromQuaternion: function () {
var matrix = new Matrix4();
return function setFromQuaternion( q, order, update ) {
matrix.makeRotationFromQuaternion( q );
return this.setFromRotationMatrix( matrix, order, update );
};
}(),
setFromVector3: function ( v, order ) {
return this.set( v.x, v.y, v.z, order || this._order );
},
reorder: function () {
// WARNING: this discards revolution information -bhouston
var q = new Quaternion();
return function reorder( newOrder ) {
q.setFromEuler( this );
return this.setFromQuaternion( q, newOrder );
};
}(),
equals: function ( euler ) {
return ( euler._x === this._x ) && ( euler._y === this._y ) && ( euler._z === this._z ) && ( euler._order === this._order );
},
fromArray: function ( array ) {
this._x = array[ 0 ];
this._y = array[ 1 ];
this._z = array[ 2 ];
if ( array[ 3 ] !== undefined ) this._order = array[ 3 ];
this.onChangeCallback();
return this;
},
toArray: function ( array, offset ) {
if ( array === undefined ) array = [];
if ( offset === undefined ) offset = 0;
array[ offset ] = this._x;
array[ offset + 1 ] = this._y;
array[ offset + 2 ] = this._z;
array[ offset + 3 ] = this._order;
return array;
},
toVector3: function ( optionalResult ) {
if ( optionalResult ) {
return optionalResult.set( this._x, this._y, this._z );
} else {
return new Vector3( this._x, this._y, this._z );
}
},
onChange: function ( callback ) {
this.onChangeCallback = callback;
return this;
},
onChangeCallback: function () {}
} );
/**
* @author mrdoob / http://mrdoob.com/
*/
function Layers() {
this.mask = 1 | 0;
}
Object.assign( Layers.prototype, {
set: function ( channel ) {
this.mask = 1 << channel | 0;
},
enable: function ( channel ) {
this.mask |= 1 << channel | 0;
},
toggle: function ( channel ) {
this.mask ^= 1 << channel | 0;
},
disable: function ( channel ) {
this.mask &= ~ ( 1 << channel | 0 );
},
test: function ( layers ) {
return ( this.mask & layers.mask ) !== 0;
}
} );
/**
* @author mrdoob / http://mrdoob.com/
* @author mikael emtinger / http://gomo.se/
* @author alteredq / http://alteredqualia.com/
* @author WestLangley / http://github.com/WestLangley
* @author elephantatwork / www.elephantatwork.ch
*/
var object3DId = 0;
function Object3D() {
Object.defineProperty( this, 'id', { value: object3DId ++ } );
this.uuid = _Math.generateUUID();
this.name = '';
this.type = 'Object3D';
this.parent = null;
this.children = [];
this.up = Object3D.DefaultUp.clone();
var position = new Vector3();
var rotation = new Euler();
var quaternion = new Quaternion();
var scale = new Vector3( 1, 1, 1 );
function onRotationChange() {
quaternion.setFromEuler( rotation, false );
}
function onQuaternionChange() {
rotation.setFromQuaternion( quaternion, undefined, false );
}
rotation.onChange( onRotationChange );
quaternion.onChange( onQuaternionChange );
Object.defineProperties( this, {
position: {
enumerable: true,
value: position
},
rotation: {
enumerable: true,
value: rotation
},
quaternion: {
enumerable: true,
value: quaternion
},
scale: {
enumerable: true,
value: scale
},
modelViewMatrix: {
value: new Matrix4()
},
normalMatrix: {
value: new Matrix3()
}
} );
this.matrix = new Matrix4();
this.matrixWorld = new Matrix4();
this.matrixAutoUpdate = Object3D.DefaultMatrixAutoUpdate;
this.matrixWorldNeedsUpdate = false;
this.layers = new Layers();
this.visible = true;
this.castShadow = false;
this.receiveShadow = false;
this.frustumCulled = true;
this.renderOrder = 0;
this.userData = {};
}
Object3D.DefaultUp = new Vector3( 0, 1, 0 );
Object3D.DefaultMatrixAutoUpdate = true;
Object3D.prototype = Object.assign( Object.create( EventDispatcher.prototype ), {
constructor: Object3D,
isObject3D: true,
onBeforeRender: function () {},
onAfterRender: function () {},
applyMatrix: function ( matrix ) {
this.matrix.multiplyMatrices( matrix, this.matrix );
this.matrix.decompose( this.position, this.quaternion, this.scale );
},
applyQuaternion: function ( q ) {
this.quaternion.premultiply( q );
return this;
},
setRotationFromAxisAngle: function ( axis, angle ) {
// assumes axis is normalized
this.quaternion.setFromAxisAngle( axis, angle );
},
setRotationFromEuler: function ( euler ) {
this.quaternion.setFromEuler( euler, true );
},
setRotationFromMatrix: function ( m ) {
// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)
this.quaternion.setFromRotationMatrix( m );
},
setRotationFromQuaternion: function ( q ) {
// assumes q is normalized
this.quaternion.copy( q );
},
rotateOnAxis: function () {
// rotate object on axis in object space
// axis is assumed to be normalized
var q1 = new Quaternion();
return function rotateOnAxis( axis, angle ) {
q1.setFromAxisAngle( axis, angle );
this.quaternion.multiply( q1 );
return this;
};
}(),
rotateOnWorldAxis: function () {
// rotate object on axis in world space
// axis is assumed to be normalized
// method assumes no rotated parent
var q1 = new Quaternion();
return function rotateOnWorldAxis( axis, angle ) {
q1.setFromAxisAngle( axis, angle );
this.quaternion.premultiply( q1 );
return this;
};
}(),
rotateX: function () {
var v1 = new Vector3( 1, 0, 0 );
return function rotateX( angle ) {
return this.rotateOnAxis( v1, angle );
};
}(),
rotateY: function () {
var v1 = new Vector3( 0, 1, 0 );
return function rotateY( angle ) {
return this.rotateOnAxis( v1, angle );
};
}(),
rotateZ: function () {
var v1 = new Vector3( 0, 0, 1 );
return function rotateZ( angle ) {
return this.rotateOnAxis( v1, angle );
};
}(),
translateOnAxis: function () {
// translate object by distance along axis in object space
// axis is assumed to be normalized
var v1 = new Vector3();
return function translateOnAxis( axis, distance ) {
v1.copy( axis ).applyQuaternion( this.quaternion );
this.position.add( v1.multiplyScalar( distance ) );
return this;
};
}(),
translateX: function () {
var v1 = new Vector3( 1, 0, 0 );
return function translateX( distance ) {
return this.translateOnAxis( v1, distance );
};
}(),
translateY: function () {
var v1 = new Vector3( 0, 1, 0 );
return function translateY( distance ) {
return this.translateOnAxis( v1, distance );
};
}(),
translateZ: function () {
var v1 = new Vector3( 0, 0, 1 );
return function translateZ( distance ) {
return this.translateOnAxis( v1, distance );
};
}(),
localToWorld: function ( vector ) {
return vector.applyMatrix4( this.matrixWorld );
},
worldToLocal: function () {
var m1 = new Matrix4();
return function worldToLocal( vector ) {
return vector.applyMatrix4( m1.getInverse( this.matrixWorld ) );
};
}(),
lookAt: function () {
// This method does not support objects with rotated and/or translated parent(s)
var m1 = new Matrix4();
var vector = new Vector3();
return function lookAt( x, y, z ) {
if ( x.isVector3 ) {
vector.copy( x );
} else {
vector.set( x, y, z );
}
if ( this.isCamera ) {
m1.lookAt( this.position, vector, this.up );
} else {
m1.lookAt( vector, this.position, this.up );
}
this.quaternion.setFromRotationMatrix( m1 );
};
}(),
add: function ( object ) {
if ( arguments.length > 1 ) {
for ( var i = 0; i < arguments.length; i ++ ) {
this.add( arguments[ i ] );
}
return this;
}
if ( object === this ) {
console.error( "THREE.Object3D.add: object can't be added as a child of itself.", object );
return this;
}
if ( ( object && object.isObject3D ) ) {
if ( object.parent !== null ) {
object.parent.remove( object );
}
object.parent = this;
object.dispatchEvent( { type: 'added' } );
this.children.push( object );
} else {
console.error( "THREE.Object3D.add: object not an instance of THREE.Object3D.", object );
}
return this;
},
remove: function ( object ) {
if ( arguments.length > 1 ) {
for ( var i = 0; i < arguments.length; i ++ ) {
this.remove( arguments[ i ] );
}
return this;
}
var index = this.children.indexOf( object );
if ( index !== - 1 ) {
object.parent = null;
object.dispatchEvent( { type: 'removed' } );
this.children.splice( index, 1 );
}
return this;
},
getObjectById: function ( id ) {
return this.getObjectByProperty( 'id', id );
},
getObjectByName: function ( name ) {
return this.getObjectByProperty( 'name', name );
},
getObjectByProperty: function ( name, value ) {
if ( this[ name ] === value ) return this;
for ( var i = 0, l = this.children.length; i < l; i ++ ) {
var child = this.children[ i ];
var object = child.getObjectByProperty( name, value );
if ( object !== undefined ) {
return object;
}
}
return undefined;
},
getWorldPosition: function ( target ) {
if ( target === undefined ) {
console.warn( 'THREE.Object3D: .getWorldPosition() target is now required' );
target = new Vector3();
}
this.updateMatrixWorld( true );
return target.setFromMatrixPosition( this.matrixWorld );
},
getWorldQuaternion: function () {
var position = new Vector3();
var scale = new Vector3();
return function getWorldQuaternion( target ) {
if ( target === undefined ) {
console.warn( 'THREE.Object3D: .getWorldQuaternion() target is now required' );
target = new Quaternion();
}
this.updateMatrixWorld( true );
this.matrixWorld.decompose( position, target, scale );
return target;
};
}(),
getWorldScale: function () {
var position = new Vector3();
var quaternion = new Quaternion();
return function getWorldScale( target ) {
if ( target === undefined ) {
console.warn( 'THREE.Object3D: .getWorldScale() target is now required' );
target = new Vector3();
}
this.updateMatrixWorld( true );
this.matrixWorld.decompose( position, quaternion, target );
return target;
};
}(),
getWorldDirection: function () {
var quaternion = new Quaternion();
return function getWorldDirection( target ) {
if ( target === undefined ) {
console.warn( 'THREE.Object3D: .getWorldDirection() target is now required' );
target = new Vector3();
}
this.getWorldQuaternion( quaternion );
return target.set( 0, 0, 1 ).applyQuaternion( quaternion );
};
}(),
raycast: function () {},
traverse: function ( callback ) {
callback( this );
var children = this.children;
for ( var i = 0, l = children.length; i < l; i ++ ) {
children[ i ].traverse( callback );
}
},
traverseVisible: function ( callback ) {
if ( this.visible === false ) return;
callback( this );
var children = this.children;
for ( var i = 0, l = children.length; i < l; i ++ ) {
children[ i ].traverseVisible( callback );
}
},
traverseAncestors: function ( callback ) {
var parent = this.parent;
if ( parent !== null ) {
callback( parent );
parent.traverseAncestors( callback );
}
},
updateMatrix: function () {
this.matrix.compose( this.position, this.quaternion, this.scale );
this.matrixWorldNeedsUpdate = true;
},
updateMatrixWorld: function ( force ) {
if ( this.matrixAutoUpdate ) this.updateMatrix();
if ( this.matrixWorldNeedsUpdate || force ) {
if ( this.parent === null ) {
this.matrixWorld.copy( this.matrix );
} else {
this.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix );
}
this.matrixWorldNeedsUpdate = false;
force = true;
}
// update children
var children = this.children;
for ( var i = 0, l = children.length; i < l; i ++ ) {
children[ i ].updateMatrixWorld( force );
}
},
toJSON: function ( meta ) {
// meta is a string when called from JSON.stringify
var isRootObject = ( meta === undefined || typeof meta === 'string' );
var output = {};
// meta is a hash used to collect geometries, materials.
// not providing it implies that this is the root object
// being serialized.
if ( isRootObject ) {
// initialize meta obj
meta = {
geometries: {},
materials: {},
textures: {},
images: {},
shapes: {}
};
output.metadata = {
version: 4.5,
type: 'Object',
generator: 'Object3D.toJSON'
};
}
// standard Object3D serialization
var object = {};
object.uuid = this.uuid;
object.type = this.type;
if ( this.name !== '' ) object.name = this.name;
if ( this.castShadow === true ) object.castShadow = true;
if ( this.receiveShadow === true ) object.receiveShadow = true;
if ( this.visible === false ) object.visible = false;
if ( this.frustumCulled === false ) object.frustumCulled = false;
if ( this.renderOrder !== 0 ) object.renderOrder = this.renderOrder;
if ( JSON.stringify( this.userData ) !== '{}' ) object.userData = this.userData;
object.matrix = this.matrix.toArray();
if ( this.matrixAutoUpdate === false ) object.matrixAutoUpdate = false;
//
function serialize( library, element ) {
if ( library[ element.uuid ] === undefined ) {
library[ element.uuid ] = element.toJSON( meta );
}
return element.uuid;
}
if ( this.geometry !== undefined ) {
object.geometry = serialize( meta.geometries, this.geometry );
var parameters = this.geometry.parameters;
if ( parameters !== undefined && parameters.shapes !== undefined ) {
var shapes = parameters.shapes;
if ( Array.isArray( shapes ) ) {
for ( var i = 0, l = shapes.length; i < l; i ++ ) {
var shape = shapes[ i ];
serialize( meta.shapes, shape );
}
} else {
serialize( meta.shapes, shapes );
}
}
}
if ( this.material !== undefined ) {
if ( Array.isArray( this.material ) ) {
var uuids = [];
for ( var i = 0, l = this.material.length; i < l; i ++ ) {
uuids.push( serialize( meta.materials, this.material[ i ] ) );
}
object.material = uuids;
} else {
object.material = serialize( meta.materials, this.material );
}
}
//
if ( this.children.length > 0 ) {
object.children = [];
for ( var i = 0; i < this.children.length; i ++ ) {
object.children.push( this.children[ i ].toJSON( meta ).object );
}
}
if ( isRootObject ) {
var geometries = extractFromCache( meta.geometries );
var materials = extractFromCache( meta.materials );
var textures = extractFromCache( meta.textures );
var images = extractFromCache( meta.images );
var shapes = extractFromCache( meta.shapes );
if ( geometries.length > 0 ) output.geometries = geometries;
if ( materials.length > 0 ) output.materials = materials;
if ( textures.length > 0 ) output.textures = textures;
if ( images.length > 0 ) output.images = images;
if ( shapes.length > 0 ) output.shapes = shapes;
}
output.object = object;
return output;
// extract data from the cache hash
// remove metadata on each item
// and return as array
function extractFromCache( cache ) {
var values = [];
for ( var key in cache ) {
var data = cache[ key ];
delete data.metadata;
values.push( data );
}
return values;
}
},
clone: function ( recursive ) {
return new this.constructor().copy( this, recursive );
},
copy: function ( source, recursive ) {
if ( recursive === undefined ) recursive = true;
this.name = source.name;
this.up.copy( source.up );
this.position.copy( source.position );
this.quaternion.copy( source.quaternion );
this.scale.copy( source.scale );
this.matrix.copy( source.matrix );
this.matrixWorld.copy( source.matrixWorld );
this.matrixAutoUpdate = source.matrixAutoUpdate;
this.matrixWorldNeedsUpdate = source.matrixWorldNeedsUpdate;
this.layers.mask = source.layers.mask;
this.visible = source.visible;
this.castShadow = source.castShadow;
this.receiveShadow = source.receiveShadow;
this.frustumCulled = source.frustumCulled;
this.renderOrder = source.renderOrder;
this.userData = JSON.parse( JSON.stringify( source.userData ) );
if ( recursive === true ) {
for ( var i = 0; i < source.children.length; i ++ ) {
var child = source.children[ i ];
this.add( child.clone() );
}
}
return this;
}
} );
/**
* @author mrdoob / http://mrdoob.com/
* @author mikael emtinger / http://gomo.se/
* @author WestLangley / http://github.com/WestLangley
*/
function Camera() {
Object3D.call( this );
this.type = 'Camera';
this.matrixWorldInverse = new Matrix4();
this.projectionMatrix = new Matrix4();
}
Camera.prototype = Object.assign( Object.create( Object3D.prototype ), {
constructor: Camera,
isCamera: true,
copy: function ( source, recursive ) {
Object3D.prototype.copy.call( this, source, recursive );
this.matrixWorldInverse.copy( source.matrixWorldInverse );
this.projectionMatrix.copy( source.projectionMatrix );
return this;
},
getWorldDirection: function () {
var quaternion = new Quaternion();
return function getWorldDirection( target ) {
if ( target === undefined ) {
console.warn( 'THREE.Camera: .getWorldDirection() target is now required' );
target = new Vector3();
}
this.getWorldQuaternion( quaternion );
return target.set( 0, 0, - 1 ).applyQuaternion( quaternion );
};
}(),
updateMatrixWorld: function ( force ) {
Object3D.prototype.updateMatrixWorld.call( this, force );
this.matrixWorldInverse.getInverse( this.matrixWorld );
},
clone: function () {
return new this.constructor().copy( this );
}
} );
/**
* @author alteredq / http://alteredqualia.com/
* @author arose / http://github.com/arose
*/
function OrthographicCamera( left, right, top, bottom, near, far ) {
Camera.call( this );
this.type = 'OrthographicCamera';
this.zoom = 1;
this.view = null;
this.left = left;
this.right = right;
this.top = top;
this.bottom = bottom;
this.near = ( near !== undefined ) ? near : 0.1;
this.far = ( far !== undefined ) ? far : 2000;
this.updateProjectionMatrix();
}
OrthographicCamera.prototype = Object.assign( Object.create( Camera.prototype ), {
constructor: OrthographicCamera,
isOrthographicCamera: true,
copy: function ( source, recursive ) {
Camera.prototype.copy.call( this, source, recursive );
this.left = source.left;
this.right = source.right;
this.top = source.top;
this.bottom = source.bottom;
this.near = source.near;
this.far = source.far;
this.zoom = source.zoom;
this.view = source.view === null ? null : Object.assign( {}, source.view );
return this;
},
setViewOffset: function ( fullWidth, fullHeight, x, y, width, height ) {
if ( this.view === null ) {
this.view = {
enabled: true,
fullWidth: 1,
fullHeight: 1,
offsetX: 0,
offsetY: 0,
width: 1,
height: 1
};
}
this.view.enabled = true;
this.view.fullWidth = fullWidth;
this.view.fullHeight = fullHeight;
this.view.offsetX = x;
this.view.offsetY = y;
this.view.width = width;
this.view.height = height;
this.updateProjectionMatrix();
},
clearViewOffset: function () {
if ( this.view !== null ) {
this.view.enabled = false;
}
this.updateProjectionMatrix();
},
updateProjectionMatrix: function () {
var dx = ( this.right - this.left ) / ( 2 * this.zoom );
var dy = ( this.top - this.bottom ) / ( 2 * this.zoom );
var cx = ( this.right + this.left ) / 2;
var cy = ( this.top + this.bottom ) / 2;
var left = cx - dx;
var right = cx + dx;
var top = cy + dy;
var bottom = cy - dy;
if ( this.view !== null && this.view.enabled ) {
var zoomW = this.zoom / ( this.view.width / this.view.fullWidth );
var zoomH = this.zoom / ( this.view.height / this.view.fullHeight );
var scaleW = ( this.right - this.left ) / this.view.width;
var scaleH = ( this.top - this.bottom ) / this.view.height;
left += scaleW * ( this.view.offsetX / zoomW );
right = left + scaleW * ( this.view.width / zoomW );
top -= scaleH * ( this.view.offsetY / zoomH );
bottom = top - scaleH * ( this.view.height / zoomH );
}
this.projectionMatrix.makeOrthographic( left, right, top, bottom, this.near, this.far );
},
toJSON: function ( meta ) {
var data = Object3D.prototype.toJSON.call( this, meta );
data.object.zoom = this.zoom;
data.object.left = this.left;
data.object.right = this.right;
data.object.top = this.top;
data.object.bottom = this.bottom;
data.object.near = this.near;
data.object.far = this.far;
if ( this.view !== null ) data.object.view = Object.assign( {}, this.view );
return data;
}
} );
/**
* @author mrdoob / http://mrdoob.com/
* @author alteredq / http://alteredqualia.com/
*/
function Face3( a, b, c, normal, color, materialIndex ) {
this.a = a;
this.b = b;
this.c = c;
this.normal = ( normal && normal.isVector3 ) ? normal : new Vector3();
this.vertexNormals = Array.isArray( normal ) ? normal : [];
this.color = ( color && color.isColor ) ? color : new Color();
this.vertexColors = Array.isArray( color ) ? color : [];
this.materialIndex = materialIndex !== undefined ? materialIndex : 0;
}
Object.assign( Face3.prototype, {
clone: function () {
return new this.constructor().copy( this );
},
copy: function ( source ) {
this.a = source.a;
this.b = source.b;
this.c = source.c;
this.normal.copy( source.normal );
this.color.copy( source.color );
this.materialIndex = source.materialIndex;
for ( var i = 0, il = source.vertexNormals.length; i < il; i ++ ) {
this.vertexNormals[ i ] = source.vertexNormals[ i ].clone();
}
for ( var i = 0, il = source.vertexColors.length; i < il; i ++ ) {
this.vertexColors[ i ] = source.vertexColors[ i ].clone();
}
return this;
}
} );
/**
* @author mrdoob / http://mrdoob.com/
* @author kile / http://kile.stravaganza.org/
* @author alteredq / http://alteredqualia.com/
* @author mikael emtinger / http://gomo.se/
* @author zz85 / http://www.lab4games.net/zz85/blog
* @author bhouston / http://clara.io
*/
var geometryId = 0; // Geometry uses even numbers as Id
function Geometry() {
Object.defineProperty( this, 'id', { value: geometryId += 2 } );
this.uuid = _Math.generateUUID();
this.name = '';
this.type = 'Geometry';
this.vertices = [];
this.colors = [];
this.faces = [];
this.faceVertexUvs = [[]];
this.morphTargets = [];
this.morphNormals = [];
this.skinWeights = [];
this.skinIndices = [];
this.lineDistances = [];
this.boundingBox = null;
this.boundingSphere = null;
// update flags
this.elementsNeedUpdate = false;
this.verticesNeedUpdate = false;
this.uvsNeedUpdate = false;
this.normalsNeedUpdate = false;
this.colorsNeedUpdate = false;
this.lineDistancesNeedUpdate = false;
this.groupsNeedUpdate = false;
}
Geometry.prototype = Object.assign( Object.create( EventDispatcher.prototype ), {
constructor: Geometry,
isGeometry: true,
applyMatrix: function ( matrix ) {
var normalMatrix = new Matrix3().getNormalMatrix( matrix );
for ( var i = 0, il = this.vertices.length; i < il; i ++ ) {
var vertex = this.vertices[ i ];
vertex.applyMatrix4( matrix );
}
for ( var i = 0, il = this.faces.length; i < il; i ++ ) {
var face = this.faces[ i ];
face.normal.applyMatrix3( normalMatrix ).normalize();
for ( var j = 0, jl = face.vertexNormals.length; j < jl; j ++ ) {
face.vertexNormals[ j ].applyMatrix3( normalMatrix ).normalize();
}
}
if ( this.boundingBox !== null ) {
this.computeBoundingBox();
}
if ( this.boundingSphere !== null ) {
this.computeBoundingSphere();
}
this.verticesNeedUpdate = true;
this.normalsNeedUpdate = true;
return this;
},
rotateX: function () {
// rotate geometry around world x-axis
var m1 = new Matrix4();
return function rotateX( angle ) {
m1.makeRotationX( angle );
this.applyMatrix( m1 );
return this;
};
}(),
rotateY: function () {
// rotate geometry around world y-axis
var m1 = new Matrix4();
return function rotateY( angle ) {
m1.makeRotationY( angle );
this.applyMatrix( m1 );
return this;
};
}(),
rotateZ: function () {
// rotate geometry around world z-axis
var m1 = new Matrix4();
return function rotateZ( angle ) {
m1.makeRotationZ( angle );
this.applyMatrix( m1 );
return this;
};
}(),
translate: function () {
// translate geometry
var m1 = new Matrix4();
return function translate( x, y, z ) {
m1.makeTranslation( x, y, z );
this.applyMatrix( m1 );
return this;
};
}(),
scale: function () {
// scale geometry
var m1 = new Matrix4();
return function scale( x, y, z ) {
m1.makeScale( x, y, z );
this.applyMatrix( m1 );
return this;
};
}(),
lookAt: function () {
var obj = new Object3D();
return function lookAt( vector ) {
obj.lookAt( vector );
obj.updateMatrix();
this.applyMatrix( obj.matrix );
};
}(),
fromBufferGeometry: function ( geometry ) {
var scope = this;
var indices = geometry.index !== null ? geometry.index.array : undefined;
var attributes = geometry.attributes;
var positions = attributes.position.array;
var normals = attributes.normal !== undefined ? attributes.normal.array : undefined;
var colors = attributes.color !== undefined ? attributes.color.array : undefined;
var uvs = attributes.uv !== undefined ? attributes.uv.array : undefined;
var uvs2 = attributes.uv2 !== undefined ? attributes.uv2.array : undefined;
if ( uvs2 !== undefined ) this.faceVertexUvs[ 1 ] = [];
var tempNormals = [];
var tempUVs = [];
var tempUVs2 = [];
for ( var i = 0, j = 0; i < positions.length; i += 3, j += 2 ) {
scope.vertices.push( new Vector3( positions[ i ], positions[ i + 1 ], positions[ i + 2 ] ) );
if ( normals !== undefined ) {
tempNormals.push( new Vector3( normals[ i ], normals[ i + 1 ], normals[ i + 2 ] ) );
}
if ( colors !== undefined ) {
scope.colors.push( new Color( colors[ i ], colors[ i + 1 ], colors[ i + 2 ] ) );
}
if ( uvs !== undefined ) {
tempUVs.push( new Vector2( uvs[ j ], uvs[ j + 1 ] ) );
}
if ( uvs2 !== undefined ) {
tempUVs2.push( new Vector2( uvs2[ j ], uvs2[ j + 1 ] ) );
}
}
function addFace( a, b, c, materialIndex ) {
var vertexNormals = normals !== undefined ? [ tempNormals[ a ].clone(), tempNormals[ b ].clone(), tempNormals[ c ].clone() ] : [];
var vertexColors = colors !== undefined ? [ scope.colors[ a ].clone(), scope.colors[ b ].clone(), scope.colors[ c ].clone() ] : [];
var face = new Face3( a, b, c, vertexNormals, vertexColors, materialIndex );
scope.faces.push( face );
if ( uvs !== undefined ) {
scope.faceVertexUvs[ 0 ].push( [ tempUVs[ a ].clone(), tempUVs[ b ].clone(), tempUVs[ c ].clone() ] );
}
if ( uvs2 !== undefined ) {
scope.faceVertexUvs[ 1 ].push( [ tempUVs2[ a ].clone(), tempUVs2[ b ].clone(), tempUVs2[ c ].clone() ] );
}
}
var groups = geometry.groups;
if ( groups.length > 0 ) {
for ( var i = 0; i < groups.length; i ++ ) {
var group = groups[ i ];
var start = group.start;
var count = group.count;
for ( var j = start, jl = start + count; j < jl; j += 3 ) {
if ( indices !== undefined ) {
addFace( indices[ j ], indices[ j + 1 ], indices[ j + 2 ], group.materialIndex );
} else {
addFace( j, j + 1, j + 2, group.materialIndex );
}
}
}
} else {
if ( indices !== undefined ) {
for ( var i = 0; i < indices.length; i += 3 ) {
addFace( indices[ i ], indices[ i + 1 ], indices[ i + 2 ] );
}
} else {
for ( var i = 0; i < positions.length / 3; i += 3 ) {
addFace( i, i + 1, i + 2 );
}
}
}
this.computeFaceNormals();
if ( geometry.boundingBox !== null ) {
this.boundingBox = geometry.boundingBox.clone();
}
if ( geometry.boundingSphere !== null ) {
this.boundingSphere = geometry.boundingSphere.clone();
}
return this;
},
center: function () {
var offset = new Vector3();
return function center() {
this.computeBoundingBox();
this.boundingBox.getCenter( offset ).negate();
this.translate( offset.x, offset.y, offset.z );
return this;
};
}(),
normalize: function () {
this.computeBoundingSphere();
var center = this.boundingSphere.center;
var radius = this.boundingSphere.radius;
var s = radius === 0 ? 1 : 1.0 / radius;
var matrix = new Matrix4();
matrix.set(
s, 0, 0, - s * center.x,
0, s, 0, - s * center.y,
0, 0, s, - s * center.z,
0, 0, 0, 1
);
this.applyMatrix( matrix );
return this;
},
computeFaceNormals: function () {
var cb = new Vector3(), ab = new Vector3();
for ( var f = 0, fl = this.faces.length; f < fl; f ++ ) {
var face = this.faces[ f ];
var vA = this.vertices[ face.a ];
var vB = this.vertices[ face.b ];
var vC = this.vertices[ face.c ];
cb.subVectors( vC, vB );
ab.subVectors( vA, vB );
cb.cross( ab );
cb.normalize();
face.normal.copy( cb );
}
},
computeVertexNormals: function ( areaWeighted ) {
if ( areaWeighted === undefined ) areaWeighted = true;
var v, vl, f, fl, face, vertices;
vertices = new Array( this.vertices.length );
for ( v = 0, vl = this.vertices.length; v < vl; v ++ ) {
vertices[ v ] = new Vector3();
}
if ( areaWeighted ) {
// vertex normals weighted by triangle areas
// http://www.iquilezles.org/www/articles/normals/normals.htm
var vA, vB, vC;
var cb = new Vector3(), ab = new Vector3();
for ( f = 0, fl = this.faces.length; f < fl; f ++ ) {
face = this.faces[ f ];
vA = this.vertices[ face.a ];
vB = this.vertices[ face.b ];
vC = this.vertices[ face.c ];
cb.subVectors( vC, vB );
ab.subVectors( vA, vB );
cb.cross( ab );
vertices[ face.a ].add( cb );
vertices[ face.b ].add( cb );
vertices[ face.c ].add( cb );
}
} else {
this.computeFaceNormals();
for ( f = 0, fl = this.faces.length; f < fl; f ++ ) {
face = this.faces[ f ];
vertices[ face.a ].add( face.normal );
vertices[ face.b ].add( face.normal );
vertices[ face.c ].add( face.normal );
}
}
for ( v = 0, vl = this.vertices.length; v < vl; v ++ ) {
vertices[ v ].normalize();
}
for ( f = 0, fl = this.faces.length; f < fl; f ++ ) {
face = this.faces[ f ];
var vertexNormals = face.vertexNormals;
if ( vertexNormals.length === 3 ) {
vertexNormals[ 0 ].copy( vertices[ face.a ] );
vertexNormals[ 1 ].copy( vertices[ face.b ] );
vertexNormals[ 2 ].copy( vertices[ face.c ] );
} else {
vertexNormals[ 0 ] = vertices[ face.a ].clone();
vertexNormals[ 1 ] = vertices[ face.b ].clone();
vertexNormals[ 2 ] = vertices[ face.c ].clone();
}
}
if ( this.faces.length > 0 ) {
this.normalsNeedUpdate = true;
}
},
computeFlatVertexNormals: function () {
var f, fl, face;
this.computeFaceNormals();
for ( f = 0, fl = this.faces.length; f < fl; f ++ ) {
face = this.faces[ f ];
var vertexNormals = face.vertexNormals;
if ( vertexNormals.length === 3 ) {
vertexNormals[ 0 ].copy( face.normal );
vertexNormals[ 1 ].copy( face.normal );
vertexNormals[ 2 ].copy( face.normal );
} else {
vertexNormals[ 0 ] = face.normal.clone();
vertexNormals[ 1 ] = face.normal.clone();
vertexNormals[ 2 ] = face.normal.clone();
}
}
if ( this.faces.length > 0 ) {
this.normalsNeedUpdate = true;
}
},
computeMorphNormals: function () {
var i, il, f, fl, face;
// save original normals
// - create temp variables on first access
// otherwise just copy (for faster repeated calls)
for ( f = 0, fl = this.faces.length; f < fl; f ++ ) {
face = this.faces[ f ];
if ( ! face.__originalFaceNormal ) {
face.__originalFaceNormal = face.normal.clone();
} else {
face.__originalFaceNormal.copy( face.normal );
}
if ( ! face.__originalVertexNormals ) face.__originalVertexNormals = [];
for ( i = 0, il = face.vertexNormals.length; i < il; i ++ ) {
if ( ! face.__originalVertexNormals[ i ] ) {
face.__originalVertexNormals[ i ] = face.vertexNormals[ i ].clone();
} else {
face.__originalVertexNormals[ i ].copy( face.vertexNormals[ i ] );
}
}
}
// use temp geometry to compute face and vertex normals for each morph
var tmpGeo = new Geometry();
tmpGeo.faces = this.faces;
for ( i = 0, il = this.morphTargets.length; i < il; i ++ ) {
// create on first access
if ( ! this.morphNormals[ i ] ) {
this.morphNormals[ i ] = {};
this.morphNormals[ i ].faceNormals = [];
this.morphNormals[ i ].vertexNormals = [];
var dstNormalsFace = this.morphNormals[ i ].faceNormals;
var dstNormalsVertex = this.morphNormals[ i ].vertexNormals;
var faceNormal, vertexNormals;
for ( f = 0, fl = this.faces.length; f < fl; f ++ ) {
faceNormal = new Vector3();
vertexNormals = { a: new Vector3(), b: new Vector3(), c: new Vector3() };
dstNormalsFace.push( faceNormal );
dstNormalsVertex.push( vertexNormals );
}
}
var morphNormals = this.morphNormals[ i ];
// set vertices to morph target
tmpGeo.vertices = this.morphTargets[ i ].vertices;
// compute morph normals
tmpGeo.computeFaceNormals();
tmpGeo.computeVertexNormals();
// store morph normals
var faceNormal, vertexNormals;
for ( f = 0, fl = this.faces.length; f < fl; f ++ ) {
face = this.faces[ f ];
faceNormal = morphNormals.faceNormals[ f ];
vertexNormals = morphNormals.vertexNormals[ f ];
faceNormal.copy( face.normal );
vertexNormals.a.copy( face.vertexNormals[ 0 ] );
vertexNormals.b.copy( face.vertexNormals[ 1 ] );
vertexNormals.c.copy( face.vertexNormals[ 2 ] );
}
}
// restore original normals
for ( f = 0, fl = this.faces.length; f < fl; f ++ ) {
face = this.faces[ f ];
face.normal = face.__originalFaceNormal;
face.vertexNormals = face.__originalVertexNormals;
}
},
computeBoundingBox: function () {
if ( this.boundingBox === null ) {
this.boundingBox = new Box3();
}
this.boundingBox.setFromPoints( this.vertices );
},
computeBoundingSphere: function () {
if ( this.boundingSphere === null ) {
this.boundingSphere = new Sphere();
}
this.boundingSphere.setFromPoints( this.vertices );
},
merge: function ( geometry, matrix, materialIndexOffset ) {
if ( ! ( geometry && geometry.isGeometry ) ) {
console.error( 'THREE.Geometry.merge(): geometry not an instance of THREE.Geometry.', geometry );
return;
}
var normalMatrix,
vertexOffset = this.vertices.length,
vertices1 = this.vertices,
vertices2 = geometry.vertices,
faces1 = this.faces,
faces2 = geometry.faces,
uvs1 = this.faceVertexUvs[ 0 ],
uvs2 = geometry.faceVertexUvs[ 0 ],
colors1 = this.colors,
colors2 = geometry.colors;
if ( materialIndexOffset === undefined ) materialIndexOffset = 0;
if ( matrix !== undefined ) {
normalMatrix = new Matrix3().getNormalMatrix( matrix );
}
// vertices
for ( var i = 0, il = vertices2.length; i < il; i ++ ) {
var vertex = vertices2[ i ];
var vertexCopy = vertex.clone();
if ( matrix !== undefined ) vertexCopy.applyMatrix4( matrix );
vertices1.push( vertexCopy );
}
// colors
for ( var i = 0, il = colors2.length; i < il; i ++ ) {
colors1.push( colors2[ i ].clone() );
}
// faces
for ( i = 0, il = faces2.length; i < il; i ++ ) {
var face = faces2[ i ], faceCopy, normal, color,
faceVertexNormals = face.vertexNormals,
faceVertexColors = face.vertexColors;
faceCopy = new Face3( face.a + vertexOffset, face.b + vertexOffset, face.c + vertexOffset );
faceCopy.normal.copy( face.normal );
if ( normalMatrix !== undefined ) {
faceCopy.normal.applyMatrix3( normalMatrix ).normalize();
}
for ( var j = 0, jl = faceVertexNormals.length; j < jl; j ++ ) {
normal = faceVertexNormals[ j ].clone();
if ( normalMatrix !== undefined ) {
normal.applyMatrix3( normalMatrix ).normalize();
}
faceCopy.vertexNormals.push( normal );
}
faceCopy.color.copy( face.color );
for ( var j = 0, jl = faceVertexColors.length; j < jl; j ++ ) {
color = faceVertexColors[ j ];
faceCopy.vertexColors.push( color.clone() );
}
faceCopy.materialIndex = face.materialIndex + materialIndexOffset;
faces1.push( faceCopy );
}
// uvs
for ( i = 0, il = uvs2.length; i < il; i ++ ) {
var uv = uvs2[ i ], uvCopy = [];
if ( uv === undefined ) {
continue;
}
for ( var j = 0, jl = uv.length; j < jl; j ++ ) {
uvCopy.push( uv[ j ].clone() );
}
uvs1.push( uvCopy );
}
},
mergeMesh: function ( mesh ) {
if ( ! ( mesh && mesh.isMesh ) ) {
console.error( 'THREE.Geometry.mergeMesh(): mesh not an instance of THREE.Mesh.', mesh );
return;
}
if ( mesh.matrixAutoUpdate ) mesh.updateMatrix();
this.merge( mesh.geometry, mesh.matrix );
},
/*
* Checks for duplicate vertices with hashmap.
* Duplicated vertices are removed
* and faces' vertices are updated.
*/
mergeVertices: function () {
var verticesMap = {}; // Hashmap for looking up vertices by position coordinates (and making sure they are unique)
var unique = [], changes = [];
var v, key;
var precisionPoints = 4; // number of decimal points, e.g. 4 for epsilon of 0.0001
var precision = Math.pow( 10, precisionPoints );
var i, il, face;
var indices, j, jl;
for ( i = 0, il = this.vertices.length; i < il; i ++ ) {
v = this.vertices[ i ];
key = Math.round( v.x * precision ) + '_' + Math.round( v.y * precision ) + '_' + Math.round( v.z * precision );
if ( verticesMap[ key ] === undefined ) {
verticesMap[ key ] = i;
unique.push( this.vertices[ i ] );
changes[ i ] = unique.length - 1;
} else {
//console.log('Duplicate vertex found. ', i, ' could be using ', verticesMap[key]);
changes[ i ] = changes[ verticesMap[ key ] ];
}
}
// if faces are completely degenerate after merging vertices, we
// have to remove them from the geometry.
var faceIndicesToRemove = [];
for ( i = 0, il = this.faces.length; i < il; i ++ ) {
face = this.faces[ i ];
face.a = changes[ face.a ];
face.b = changes[ face.b ];
face.c = changes[ face.c ];
indices = [ face.a, face.b, face.c ];
// if any duplicate vertices are found in a Face3
// we have to remove the face as nothing can be saved
for ( var n = 0; n < 3; n ++ ) {
if ( indices[ n ] === indices[ ( n + 1 ) % 3 ] ) {
faceIndicesToRemove.push( i );
break;
}
}
}
for ( i = faceIndicesToRemove.length - 1; i >= 0; i -- ) {
var idx = faceIndicesToRemove[ i ];
this.faces.splice( idx, 1 );
for ( j = 0, jl = this.faceVertexUvs.length; j < jl; j ++ ) {
this.faceVertexUvs[ j ].splice( idx, 1 );
}
}
// Use unique set of vertices
var diff = this.vertices.length - unique.length;
this.vertices = unique;
return diff;
},
setFromPoints: function ( points ) {
this.vertices = [];
for ( var i = 0, l = points.length; i < l; i ++ ) {
var point = points[ i ];
this.vertices.push( new Vector3( point.x, point.y, point.z || 0 ) );
}
return this;
},
sortFacesByMaterialIndex: function () {
var faces = this.faces;
var length = faces.length;
// tag faces
for ( var i = 0; i < length; i ++ ) {
faces[ i ]._id = i;
}
// sort faces
function materialIndexSort( a, b ) {
return a.materialIndex - b.materialIndex;
}
faces.sort( materialIndexSort );
// sort uvs
var uvs1 = this.faceVertexUvs[ 0 ];
var uvs2 = this.faceVertexUvs[ 1 ];
var newUvs1, newUvs2;
if ( uvs1 && uvs1.length === length ) newUvs1 = [];
if ( uvs2 && uvs2.length === length ) newUvs2 = [];
for ( var i = 0; i < length; i ++ ) {
var id = faces[ i ]._id;
if ( newUvs1 ) newUvs1.push( uvs1[ id ] );
if ( newUvs2 ) newUvs2.push( uvs2[ id ] );
}
if ( newUvs1 ) this.faceVertexUvs[ 0 ] = newUvs1;
if ( newUvs2 ) this.faceVertexUvs[ 1 ] = newUvs2;
},
toJSON: function () {
var data = {
metadata: {
version: 4.5,
type: 'Geometry',
generator: 'Geometry.toJSON'
}
};
// standard Geometry serialization
data.uuid = this.uuid;
data.type = this.type;
if ( this.name !== '' ) data.name = this.name;
if ( this.parameters !== undefined ) {
var parameters = this.parameters;
for ( var key in parameters ) {
if ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ];
}
return data;
}
var vertices = [];
for ( var i = 0; i < this.vertices.length; i ++ ) {
var vertex = this.vertices[ i ];
vertices.push( vertex.x, vertex.y, vertex.z );
}
var faces = [];
var normals = [];
var normalsHash = {};
var colors = [];
var colorsHash = {};
var uvs = [];
var uvsHash = {};
for ( var i = 0; i < this.faces.length; i ++ ) {
var face = this.faces[ i ];
var hasMaterial = true;
var hasFaceUv = false; // deprecated
var hasFaceVertexUv = this.faceVertexUvs[ 0 ][ i ] !== undefined;
var hasFaceNormal = face.normal.length() > 0;
var hasFaceVertexNormal = face.vertexNormals.length > 0;
var hasFaceColor = face.color.r !== 1 || face.color.g !== 1 || face.color.b !== 1;
var hasFaceVertexColor = face.vertexColors.length > 0;
var faceType = 0;
faceType = setBit( faceType, 0, 0 ); // isQuad
faceType = setBit( faceType, 1, hasMaterial );
faceType = setBit( faceType, 2, hasFaceUv );
faceType = setBit( faceType, 3, hasFaceVertexUv );
faceType = setBit( faceType, 4, hasFaceNormal );
faceType = setBit( faceType, 5, hasFaceVertexNormal );
faceType = setBit( faceType, 6, hasFaceColor );
faceType = setBit( faceType, 7, hasFaceVertexColor );
faces.push( faceType );
faces.push( face.a, face.b, face.c );
faces.push( face.materialIndex );
if ( hasFaceVertexUv ) {
var faceVertexUvs = this.faceVertexUvs[ 0 ][ i ];
faces.push(
getUvIndex( faceVertexUvs[ 0 ] ),
getUvIndex( faceVertexUvs[ 1 ] ),
getUvIndex( faceVertexUvs[ 2 ] )
);
}
if ( hasFaceNormal ) {
faces.push( getNormalIndex( face.normal ) );
}
if ( hasFaceVertexNormal ) {
var vertexNormals = face.vertexNormals;
faces.push(
getNormalIndex( vertexNormals[ 0 ] ),
getNormalIndex( vertexNormals[ 1 ] ),
getNormalIndex( vertexNormals[ 2 ] )
);
}
if ( hasFaceColor ) {
faces.push( getColorIndex( face.color ) );
}
if ( hasFaceVertexColor ) {
var vertexColors = face.vertexColors;
faces.push(
getColorIndex( vertexColors[ 0 ] ),
getColorIndex( vertexColors[ 1 ] ),
getColorIndex( vertexColors[ 2 ] )
);
}
}
function setBit( value, position, enabled ) {
return enabled ? value | ( 1 << position ) : value & ( ~ ( 1 << position ) );
}
function getNormalIndex( normal ) {
var hash = normal.x.toString() + normal.y.toString() + normal.z.toString();
if ( normalsHash[ hash ] !== undefined ) {
return normalsHash[ hash ];
}
normalsHash[ hash ] = normals.length / 3;
normals.push( normal.x, normal.y, normal.z );
return normalsHash[ hash ];
}
function getColorIndex( color ) {
var hash = color.r.toString() + color.g.toString() + color.b.toString();
if ( colorsHash[ hash ] !== undefined ) {
return colorsHash[ hash ];
}
colorsHash[ hash ] = colors.length;
colors.push( color.getHex() );
return colorsHash[ hash ];
}
function getUvIndex( uv ) {
var hash = uv.x.toString() + uv.y.toString();
if ( uvsHash[ hash ] !== undefined ) {
return uvsHash[ hash ];
}
uvsHash[ hash ] = uvs.length / 2;
uvs.push( uv.x, uv.y );
return uvsHash[ hash ];
}
data.data = {};
data.data.vertices = vertices;
data.data.normals = normals;
if ( colors.length > 0 ) data.data.colors = colors;
if ( uvs.length > 0 ) data.data.uvs = [ uvs ]; // temporal backward compatibility
data.data.faces = faces;
return data;
},
clone: function () {
/*
// Handle primitives
var parameters = this.parameters;
if ( parameters !== undefined ) {
var values = [];
for ( var key in parameters ) {
values.push( parameters[ key ] );
}
var geometry = Object.create( this.constructor.prototype );
this.constructor.apply( geometry, values );
return geometry;
}
return new this.constructor().copy( this );
*/
return new Geometry().copy( this );
},
copy: function ( source ) {
var i, il, j, jl, k, kl;
// reset
this.vertices = [];
this.colors = [];
this.faces = [];
this.faceVertexUvs = [[]];
this.morphTargets = [];
this.morphNormals = [];
this.skinWeights = [];
this.skinIndices = [];
this.lineDistances = [];
this.boundingBox = null;
this.boundingSphere = null;
// name
this.name = source.name;
// vertices
var vertices = source.vertices;
for ( i = 0, il = vertices.length; i < il; i ++ ) {
this.vertices.push( vertices[ i ].clone() );
}
// colors
var colors = source.colors;
for ( i = 0, il = colors.length; i < il; i ++ ) {
this.colors.push( colors[ i ].clone() );
}
// faces
var faces = source.faces;
for ( i = 0, il = faces.length; i < il; i ++ ) {
this.faces.push( faces[ i ].clone() );
}
// face vertex uvs
for ( i = 0, il = source.faceVertexUvs.length; i < il; i ++ ) {
var faceVertexUvs = source.faceVertexUvs[ i ];
if ( this.faceVertexUvs[ i ] === undefined ) {
this.faceVertexUvs[ i ] = [];
}
for ( j = 0, jl = faceVertexUvs.length; j < jl; j ++ ) {
var uvs = faceVertexUvs[ j ], uvsCopy = [];
for ( k = 0, kl = uvs.length; k < kl; k ++ ) {
var uv = uvs[ k ];
uvsCopy.push( uv.clone() );
}
this.faceVertexUvs[ i ].push( uvsCopy );
}
}
// morph targets
var morphTargets = source.morphTargets;
for ( i = 0, il = morphTargets.length; i < il; i ++ ) {
var morphTarget = {};
morphTarget.name = morphTargets[ i ].name;
// vertices
if ( morphTargets[ i ].vertices !== undefined ) {
morphTarget.vertices = [];
for ( j = 0, jl = morphTargets[ i ].vertices.length; j < jl; j ++ ) {
morphTarget.vertices.push( morphTargets[ i ].vertices[ j ].clone() );
}
}
// normals
if ( morphTargets[ i ].normals !== undefined ) {
morphTarget.normals = [];
for ( j = 0, jl = morphTargets[ i ].normals.length; j < jl; j ++ ) {
morphTarget.normals.push( morphTargets[ i ].normals[ j ].clone() );
}
}
this.morphTargets.push( morphTarget );
}
// morph normals
var morphNormals = source.morphNormals;
for ( i = 0, il = morphNormals.length; i < il; i ++ ) {
var morphNormal = {};
// vertex normals
if ( morphNormals[ i ].vertexNormals !== undefined ) {
morphNormal.vertexNormals = [];
for ( j = 0, jl = morphNormals[ i ].vertexNormals.length; j < jl; j ++ ) {
var srcVertexNormal = morphNormals[ i ].vertexNormals[ j ];
var destVertexNormal = {};
destVertexNormal.a = srcVertexNormal.a.clone();
destVertexNormal.b = srcVertexNormal.b.clone();
destVertexNormal.c = srcVertexNormal.c.clone();
morphNormal.vertexNormals.push( destVertexNormal );
}
}
// face normals
if ( morphNormals[ i ].faceNormals !== undefined ) {
morphNormal.faceNormals = [];
for ( j = 0, jl = morphNormals[ i ].faceNormals.length; j < jl; j ++ ) {
morphNormal.faceNormals.push( morphNormals[ i ].faceNormals[ j ].clone() );
}
}
this.morphNormals.push( morphNormal );
}
// skin weights
var skinWeights = source.skinWeights;
for ( i = 0, il = skinWeights.length; i < il; i ++ ) {
this.skinWeights.push( skinWeights[ i ].clone() );
}
// skin indices
var skinIndices = source.skinIndices;
for ( i = 0, il = skinIndices.length; i < il; i ++ ) {
this.skinIndices.push( skinIndices[ i ].clone() );
}
// line distances
var lineDistances = source.lineDistances;
for ( i = 0, il = lineDistances.length; i < il; i ++ ) {
this.lineDistances.push( lineDistances[ i ] );
}
// bounding box
var boundingBox = source.boundingBox;
if ( boundingBox !== null ) {
this.boundingBox = boundingBox.clone();
}
// bounding sphere
var boundingSphere = source.boundingSphere;
if ( boundingSphere !== null ) {
this.boundingSphere = boundingSphere.clone();
}
// update flags
this.elementsNeedUpdate = source.elementsNeedUpdate;
this.verticesNeedUpdate = source.verticesNeedUpdate;
this.uvsNeedUpdate = source.uvsNeedUpdate;
this.normalsNeedUpdate = source.normalsNeedUpdate;
this.colorsNeedUpdate = source.colorsNeedUpdate;
this.lineDistancesNeedUpdate = source.lineDistancesNeedUpdate;
this.groupsNeedUpdate = source.groupsNeedUpdate;
return this;
},
dispose: function () {
this.dispatchEvent( { type: 'dispose' } );
}
} );
/**
* @author mrdoob / http://mrdoob.com/
*/
function BufferAttribute( array, itemSize, normalized ) {
if ( Array.isArray( array ) ) {
throw new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' );
}
this.name = '';
this.array = array;
this.itemSize = itemSize;
this.count = array !== undefined ? array.length / itemSize : 0;
this.normalized = normalized === true;
this.dynamic = false;
this.updateRange = { offset: 0, count: - 1 };
this.version = 0;
}
Object.defineProperty( BufferAttribute.prototype, 'needsUpdate', {
set: function ( value ) {
if ( value === true ) this.version ++;
}
} );
Object.assign( BufferAttribute.prototype, {
isBufferAttribute: true,
onUploadCallback: function () {},
setArray: function ( array ) {
if ( Array.isArray( array ) ) {
throw new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' );
}
this.count = array !== undefined ? array.length / this.itemSize : 0;
this.array = array;
return this;
},
setDynamic: function ( value ) {
this.dynamic = value;
return this;
},
copy: function ( source ) {
this.name = source.name;
this.array = new source.array.constructor( source.array );
this.itemSize = source.itemSize;
this.count = source.count;
this.normalized = source.normalized;
this.dynamic = source.dynamic;
return this;
},
copyAt: function ( index1, attribute, index2 ) {
index1 *= this.itemSize;
index2 *= attribute.itemSize;
for ( var i = 0, l = this.itemSize; i < l; i ++ ) {
this.array[ index1 + i ] = attribute.array[ index2 + i ];
}
return this;
},
copyArray: function ( array ) {
this.array.set( array );
return this;
},
copyColorsArray: function ( colors ) {
var array = this.array, offset = 0;
for ( var i = 0, l = colors.length; i < l; i ++ ) {
var color = colors[ i ];
if ( color === undefined ) {
console.warn( 'THREE.BufferAttribute.copyColorsArray(): color is undefined', i );
color = new Color();
}
array[ offset ++ ] = color.r;
array[ offset ++ ] = color.g;
array[ offset ++ ] = color.b;
}
return this;
},
copyVector2sArray: function ( vectors ) {
var array = this.array, offset = 0;
for ( var i = 0, l = vectors.length; i < l; i ++ ) {
var vector = vectors[ i ];
if ( vector === undefined ) {
console.warn( 'THREE.BufferAttribute.copyVector2sArray(): vector is undefined', i );
vector = new Vector2();
}
array[ offset ++ ] = vector.x;
array[ offset ++ ] = vector.y;
}
return this;
},
copyVector3sArray: function ( vectors ) {
var array = this.array, offset = 0;
for ( var i = 0, l = vectors.length; i < l; i ++ ) {
var vector = vectors[ i ];
if ( vector === undefined ) {
console.warn( 'THREE.BufferAttribute.copyVector3sArray(): vector is undefined', i );
vector = new Vector3();
}
array[ offset ++ ] = vector.x;
array[ offset ++ ] = vector.y;
array[ offset ++ ] = vector.z;
}
return this;
},
copyVector4sArray: function ( vectors ) {
var array = this.array, offset = 0;
for ( var i = 0, l = vectors.length; i < l; i ++ ) {
var vector = vectors[ i ];
if ( vector === undefined ) {
console.warn( 'THREE.BufferAttribute.copyVector4sArray(): vector is undefined', i );
vector = new Vector4();
}
array[ offset ++ ] = vector.x;
array[ offset ++ ] = vector.y;
array[ offset ++ ] = vector.z;
array[ offset ++ ] = vector.w;
}
return this;
},
set: function ( value, offset ) {
if ( offset === undefined ) offset = 0;
this.array.set( value, offset );
return this;
},
getX: function ( index ) {
return this.array[ index * this.itemSize ];
},
setX: function ( index, x ) {
this.array[ index * this.itemSize ] = x;
return this;
},
getY: function ( index ) {
return this.array[ index * this.itemSize + 1 ];
},
setY: function ( index, y ) {
this.array[ index * this.itemSize + 1 ] = y;
return this;
},
getZ: function ( index ) {
return this.array[ index * this.itemSize + 2 ];
},
setZ: function ( index, z ) {
this.array[ index * this.itemSize + 2 ] = z;
return this;
},
getW: function ( index ) {
return this.array[ index * this.itemSize + 3 ];
},
setW: function ( index, w ) {
this.array[ index * this.itemSize + 3 ] = w;
return this;
},
setXY: function ( index, x, y ) {
index *= this.itemSize;
this.array[ index + 0 ] = x;
this.array[ index + 1 ] = y;
return this;
},
setXYZ: function ( index, x, y, z ) {
index *= this.itemSize;
this.array[ index + 0 ] = x;
this.array[ index + 1 ] = y;
this.array[ index + 2 ] = z;
return this;
},
setXYZW: function ( index, x, y, z, w ) {
index *= this.itemSize;
this.array[ index + 0 ] = x;
this.array[ index + 1 ] = y;
this.array[ index + 2 ] = z;
this.array[ index + 3 ] = w;
return this;
},
onUpload: function ( callback ) {
this.onUploadCallback = callback;
return this;
},
clone: function () {
return new this.constructor( this.array, this.itemSize ).copy( this );
}
} );
//
function Int8BufferAttribute( array, itemSize, normalized ) {
BufferAttribute.call( this, new Int8Array( array ), itemSize, normalized );
}
Int8BufferAttribute.prototype = Object.create( BufferAttribute.prototype );
Int8BufferAttribute.prototype.constructor = Int8BufferAttribute;
function Uint8BufferAttribute( array, itemSize, normalized ) {
BufferAttribute.call( this, new Uint8Array( array ), itemSize, normalized );
}
Uint8BufferAttribute.prototype = Object.create( BufferAttribute.prototype );
Uint8BufferAttribute.prototype.constructor = Uint8BufferAttribute;
function Uint8ClampedBufferAttribute( array, itemSize, normalized ) {
BufferAttribute.call( this, new Uint8ClampedArray( array ), itemSize, normalized );
}
Uint8ClampedBufferAttribute.prototype = Object.create( BufferAttribute.prototype );
Uint8ClampedBufferAttribute.prototype.constructor = Uint8ClampedBufferAttribute;
function Int16BufferAttribute( array, itemSize, normalized ) {
BufferAttribute.call( this, new Int16Array( array ), itemSize, normalized );
}
Int16BufferAttribute.prototype = Object.create( BufferAttribute.prototype );
Int16BufferAttribute.prototype.constructor = Int16BufferAttribute;
function Uint16BufferAttribute( array, itemSize, normalized ) {
BufferAttribute.call( this, new Uint16Array( array ), itemSize, normalized );
}
Uint16BufferAttribute.prototype = Object.create( BufferAttribute.prototype );
Uint16BufferAttribute.prototype.constructor = Uint16BufferAttribute;
function Int32BufferAttribute( array, itemSize, normalized ) {
BufferAttribute.call( this, new Int32Array( array ), itemSize, normalized );
}
Int32BufferAttribute.prototype = Object.create( BufferAttribute.prototype );
Int32BufferAttribute.prototype.constructor = Int32BufferAttribute;
function Uint32BufferAttribute( array, itemSize, normalized ) {
BufferAttribute.call( this, new Uint32Array( array ), itemSize, normalized );
}
Uint32BufferAttribute.prototype = Object.create( BufferAttribute.prototype );
Uint32BufferAttribute.prototype.constructor = Uint32BufferAttribute;
function Float32BufferAttribute( array, itemSize, normalized ) {
BufferAttribute.call( this, new Float32Array( array ), itemSize, normalized );
}
Float32BufferAttribute.prototype = Object.create( BufferAttribute.prototype );
Float32BufferAttribute.prototype.constructor = Float32BufferAttribute;
function Float64BufferAttribute( array, itemSize, normalized ) {
BufferAttribute.call( this, new Float64Array( array ), itemSize, normalized );
}
Float64BufferAttribute.prototype = Object.create( BufferAttribute.prototype );
Float64BufferAttribute.prototype.constructor = Float64BufferAttribute;
/**
* @author mrdoob / http://mrdoob.com/
*/
function DirectGeometry() {
this.vertices = [];
this.normals = [];
this.colors = [];
this.uvs = [];
this.uvs2 = [];
this.groups = [];
this.morphTargets = {};
this.skinWeights = [];
this.skinIndices = [];
// this.lineDistances = [];
this.boundingBox = null;
this.boundingSphere = null;
// update flags
this.verticesNeedUpdate = false;
this.normalsNeedUpdate = false;
this.colorsNeedUpdate = false;
this.uvsNeedUpdate = false;
this.groupsNeedUpdate = false;
}
Object.assign( DirectGeometry.prototype, {
computeGroups: function ( geometry ) {
var group;
var groups = [];
var materialIndex = undefined;
var faces = geometry.faces;
for ( var i = 0; i < faces.length; i ++ ) {
var face = faces[ i ];
// materials
if ( face.materialIndex !== materialIndex ) {
materialIndex = face.materialIndex;
if ( group !== undefined ) {
group.count = ( i * 3 ) - group.start;
groups.push( group );
}
group = {
start: i * 3,
materialIndex: materialIndex
};
}
}
if ( group !== undefined ) {
group.count = ( i * 3 ) - group.start;
groups.push( group );
}
this.groups = groups;
},
fromGeometry: function ( geometry ) {
var faces = geometry.faces;
var vertices = geometry.vertices;
var faceVertexUvs = geometry.faceVertexUvs;
var hasFaceVertexUv = faceVertexUvs[ 0 ] && faceVertexUvs[ 0 ].length > 0;
var hasFaceVertexUv2 = faceVertexUvs[ 1 ] && faceVertexUvs[ 1 ].length > 0;
// morphs
var morphTargets = geometry.morphTargets;
var morphTargetsLength = morphTargets.length;
var morphTargetsPosition;
if ( morphTargetsLength > 0 ) {
morphTargetsPosition = [];
for ( var i = 0; i < morphTargetsLength; i ++ ) {
morphTargetsPosition[ i ] = [];
}
this.morphTargets.position = morphTargetsPosition;
}
var morphNormals = geometry.morphNormals;
var morphNormalsLength = morphNormals.length;
var morphTargetsNormal;
if ( morphNormalsLength > 0 ) {
morphTargetsNormal = [];
for ( var i = 0; i < morphNormalsLength; i ++ ) {
morphTargetsNormal[ i ] = [];
}
this.morphTargets.normal = morphTargetsNormal;
}
// skins
var skinIndices = geometry.skinIndices;
var skinWeights = geometry.skinWeights;
var hasSkinIndices = skinIndices.length === vertices.length;
var hasSkinWeights = skinWeights.length === vertices.length;
//
for ( var i = 0; i < faces.length; i ++ ) {
var face = faces[ i ];
this.vertices.push( vertices[ face.a ], vertices[ face.b ], vertices[ face.c ] );
var vertexNormals = face.vertexNormals;
if ( vertexNormals.length === 3 ) {
this.normals.push( vertexNormals[ 0 ], vertexNormals[ 1 ], vertexNormals[ 2 ] );
} else {
var normal = face.normal;
this.normals.push( normal, normal, normal );
}
var vertexColors = face.vertexColors;
if ( vertexColors.length === 3 ) {
this.colors.push( vertexColors[ 0 ], vertexColors[ 1 ], vertexColors[ 2 ] );
} else {
var color = face.color;
this.colors.push( color, color, color );
}
if ( hasFaceVertexUv === true ) {
var vertexUvs = faceVertexUvs[ 0 ][ i ];
if ( vertexUvs !== undefined ) {
this.uvs.push( vertexUvs[ 0 ], vertexUvs[ 1 ], vertexUvs[ 2 ] );
} else {
console.warn( 'THREE.DirectGeometry.fromGeometry(): Undefined vertexUv ', i );
this.uvs.push( new Vector2(), new Vector2(), new Vector2() );
}
}
if ( hasFaceVertexUv2 === true ) {
var vertexUvs = faceVertexUvs[ 1 ][ i ];
if ( vertexUvs !== undefined ) {
this.uvs2.push( vertexUvs[ 0 ], vertexUvs[ 1 ], vertexUvs[ 2 ] );
} else {
console.warn( 'THREE.DirectGeometry.fromGeometry(): Undefined vertexUv2 ', i );
this.uvs2.push( new Vector2(), new Vector2(), new Vector2() );
}
}
// morphs
for ( var j = 0; j < morphTargetsLength; j ++ ) {
var morphTarget = morphTargets[ j ].vertices;
morphTargetsPosition[ j ].push( morphTarget[ face.a ], morphTarget[ face.b ], morphTarget[ face.c ] );
}
for ( var j = 0; j < morphNormalsLength; j ++ ) {
var morphNormal = morphNormals[ j ].vertexNormals[ i ];
morphTargetsNormal[ j ].push( morphNormal.a, morphNormal.b, morphNormal.c );
}
// skins
if ( hasSkinIndices ) {
this.skinIndices.push( skinIndices[ face.a ], skinIndices[ face.b ], skinIndices[ face.c ] );
}
if ( hasSkinWeights ) {
this.skinWeights.push( skinWeights[ face.a ], skinWeights[ face.b ], skinWeights[ face.c ] );
}
}
this.computeGroups( geometry );
this.verticesNeedUpdate = geometry.verticesNeedUpdate;
this.normalsNeedUpdate = geometry.normalsNeedUpdate;
this.colorsNeedUpdate = geometry.colorsNeedUpdate;
this.uvsNeedUpdate = geometry.uvsNeedUpdate;
this.groupsNeedUpdate = geometry.groupsNeedUpdate;
return this;
}
} );
/**
* @author mrdoob / http://mrdoob.com/
*/
function arrayMax( array ) {
if ( array.length === 0 ) return - Infinity;
var max = array[ 0 ];
for ( var i = 1, l = array.length; i < l; ++ i ) {
if ( array[ i ] > max ) max = array[ i ];
}
return max;
}
/**
* @author alteredq / http://alteredqualia.com/
* @author mrdoob / http://mrdoob.com/
*/
var bufferGeometryId = 1; // BufferGeometry uses odd numbers as Id
function BufferGeometry() {
Object.defineProperty( this, 'id', { value: bufferGeometryId += 2 } );
this.uuid = _Math.generateUUID();
this.name = '';
this.type = 'BufferGeometry';
this.index = null;
this.attributes = {};
this.morphAttributes = {};
this.groups = [];
this.boundingBox = null;
this.boundingSphere = null;
this.drawRange = { start: 0, count: Infinity };
}
BufferGeometry.prototype = Object.assign( Object.create( EventDispatcher.prototype ), {
constructor: BufferGeometry,
isBufferGeometry: true,
getIndex: function () {
return this.index;
},
setIndex: function ( index ) {
if ( Array.isArray( index ) ) {
this.index = new ( arrayMax( index ) > 65535 ? Uint32BufferAttribute : Uint16BufferAttribute )( index, 1 );
} else {
this.index = index;
}
},
addAttribute: function ( name, attribute ) {
if ( ! ( attribute && attribute.isBufferAttribute ) && ! ( attribute && attribute.isInterleavedBufferAttribute ) ) {
console.warn( 'THREE.BufferGeometry: .addAttribute() now expects ( name, attribute ).' );
this.addAttribute( name, new BufferAttribute( arguments[ 1 ], arguments[ 2 ] ) );
return;
}
if ( name === 'index' ) {
console.warn( 'THREE.BufferGeometry.addAttribute: Use .setIndex() for index attribute.' );
this.setIndex( attribute );
return;
}
this.attributes[ name ] = attribute;
return this;
},
getAttribute: function ( name ) {
return this.attributes[ name ];
},
removeAttribute: function ( name ) {
delete this.attributes[ name ];
return this;
},
addGroup: function ( start, count, materialIndex ) {
this.groups.push( {
start: start,
count: count,
materialIndex: materialIndex !== undefined ? materialIndex : 0
} );
},
clearGroups: function () {
this.groups = [];
},
setDrawRange: function ( start, count ) {
this.drawRange.start = start;
this.drawRange.count = count;
},
applyMatrix: function ( matrix ) {
var position = this.attributes.position;
if ( position !== undefined ) {
matrix.applyToBufferAttribute( position );
position.needsUpdate = true;
}
var normal = this.attributes.normal;
if ( normal !== undefined ) {
var normalMatrix = new Matrix3().getNormalMatrix( matrix );
normalMatrix.applyToBufferAttribute( normal );
normal.needsUpdate = true;
}
if ( this.boundingBox !== null ) {
this.computeBoundingBox();
}
if ( this.boundingSphere !== null ) {
this.computeBoundingSphere();
}
return this;
},
rotateX: function () {
// rotate geometry around world x-axis
var m1 = new Matrix4();
return function rotateX( angle ) {
m1.makeRotationX( angle );
this.applyMatrix( m1 );
return this;
};
}(),
rotateY: function () {
// rotate geometry around world y-axis
var m1 = new Matrix4();
return function rotateY( angle ) {
m1.makeRotationY( angle );
this.applyMatrix( m1 );
return this;
};
}(),
rotateZ: function () {
// rotate geometry around world z-axis
var m1 = new Matrix4();
return function rotateZ( angle ) {
m1.makeRotationZ( angle );
this.applyMatrix( m1 );
return this;
};
}(),
translate: function () {
// translate geometry
var m1 = new Matrix4();
return function translate( x, y, z ) {
m1.makeTranslation( x, y, z );
this.applyMatrix( m1 );
return this;
};
}(),
scale: function () {
// scale geometry
var m1 = new Matrix4();
return function scale( x, y, z ) {
m1.makeScale( x, y, z );
this.applyMatrix( m1 );
return this;
};
}(),
lookAt: function () {
var obj = new Object3D();
return function lookAt( vector ) {
obj.lookAt( vector );
obj.updateMatrix();
this.applyMatrix( obj.matrix );
};
}(),
center: function () {
var offset = new Vector3();
return function center() {
this.computeBoundingBox();
this.boundingBox.getCenter( offset ).negate();
this.translate( offset.x, offset.y, offset.z );
return this;
};
}(),
setFromObject: function ( object ) {
// console.log( 'THREE.BufferGeometry.setFromObject(). Converting', object, this );
var geometry = object.geometry;
if ( object.isPoints || object.isLine ) {
var positions = new Float32BufferAttribute( geometry.vertices.length * 3, 3 );
var colors = new Float32BufferAttribute( geometry.colors.length * 3, 3 );
this.addAttribute( 'position', positions.copyVector3sArray( geometry.vertices ) );
this.addAttribute( 'color', colors.copyColorsArray( geometry.colors ) );
if ( geometry.lineDistances && geometry.lineDistances.length === geometry.vertices.length ) {
var lineDistances = new Float32BufferAttribute( geometry.lineDistances.length, 1 );
this.addAttribute( 'lineDistance', lineDistances.copyArray( geometry.lineDistances ) );
}
if ( geometry.boundingSphere !== null ) {
this.boundingSphere = geometry.boundingSphere.clone();
}
if ( geometry.boundingBox !== null ) {
this.boundingBox = geometry.boundingBox.clone();
}
} else if ( object.isMesh ) {
if ( geometry && geometry.isGeometry ) {
this.fromGeometry( geometry );
}
}
return this;
},
setFromPoints: function ( points ) {
var position = [];
for ( var i = 0, l = points.length; i < l; i ++ ) {
var point = points[ i ];
position.push( point.x, point.y, point.z || 0 );
}
this.addAttribute( 'position', new Float32BufferAttribute( position, 3 ) );
return this;
},
updateFromObject: function ( object ) {
var geometry = object.geometry;
if ( object.isMesh ) {
var direct = geometry.__directGeometry;
if ( geometry.elementsNeedUpdate === true ) {
direct = undefined;
geometry.elementsNeedUpdate = false;
}
if ( direct === undefined ) {
return this.fromGeometry( geometry );
}
direct.verticesNeedUpdate = geometry.verticesNeedUpdate;
direct.normalsNeedUpdate = geometry.normalsNeedUpdate;
direct.colorsNeedUpdate = geometry.colorsNeedUpdate;
direct.uvsNeedUpdate = geometry.uvsNeedUpdate;
direct.groupsNeedUpdate = geometry.groupsNeedUpdate;
geometry.verticesNeedUpdate = false;
geometry.normalsNeedUpdate = false;
geometry.colorsNeedUpdate = false;
geometry.uvsNeedUpdate = false;
geometry.groupsNeedUpdate = false;
geometry = direct;
}
var attribute;
if ( geometry.verticesNeedUpdate === true ) {
attribute = this.attributes.position;
if ( attribute !== undefined ) {
attribute.copyVector3sArray( geometry.vertices );
attribute.needsUpdate = true;
}
geometry.verticesNeedUpdate = false;
}
if ( geometry.normalsNeedUpdate === true ) {
attribute = this.attributes.normal;
if ( attribute !== undefined ) {
attribute.copyVector3sArray( geometry.normals );
attribute.needsUpdate = true;
}
geometry.normalsNeedUpdate = false;
}
if ( geometry.colorsNeedUpdate === true ) {
attribute = this.attributes.color;
if ( attribute !== undefined ) {
attribute.copyColorsArray( geometry.colors );
attribute.needsUpdate = true;
}
geometry.colorsNeedUpdate = false;
}
if ( geometry.uvsNeedUpdate ) {
attribute = this.attributes.uv;
if ( attribute !== undefined ) {
attribute.copyVector2sArray( geometry.uvs );
attribute.needsUpdate = true;
}
geometry.uvsNeedUpdate = false;
}
if ( geometry.lineDistancesNeedUpdate ) {
attribute = this.attributes.lineDistance;
if ( attribute !== undefined ) {
attribute.copyArray( geometry.lineDistances );
attribute.needsUpdate = true;
}
geometry.lineDistancesNeedUpdate = false;
}
if ( geometry.groupsNeedUpdate ) {
geometry.computeGroups( object.geometry );
this.groups = geometry.groups;
geometry.groupsNeedUpdate = false;
}
return this;
},
fromGeometry: function ( geometry ) {
geometry.__directGeometry = new DirectGeometry().fromGeometry( geometry );
return this.fromDirectGeometry( geometry.__directGeometry );
},
fromDirectGeometry: function ( geometry ) {
var positions = new Float32Array( geometry.vertices.length * 3 );
this.addAttribute( 'position', new BufferAttribute( positions, 3 ).copyVector3sArray( geometry.vertices ) );
if ( geometry.normals.length > 0 ) {
var normals = new Float32Array( geometry.normals.length * 3 );
this.addAttribute( 'normal', new BufferAttribute( normals, 3 ).copyVector3sArray( geometry.normals ) );
}
if ( geometry.colors.length > 0 ) {
var colors = new Float32Array( geometry.colors.length * 3 );
this.addAttribute( 'color', new BufferAttribute( colors, 3 ).copyColorsArray( geometry.colors ) );
}
if ( geometry.uvs.length > 0 ) {
var uvs = new Float32Array( geometry.uvs.length * 2 );
this.addAttribute( 'uv', new BufferAttribute( uvs, 2 ).copyVector2sArray( geometry.uvs ) );
}
if ( geometry.uvs2.length > 0 ) {
var uvs2 = new Float32Array( geometry.uvs2.length * 2 );
this.addAttribute( 'uv2', new BufferAttribute( uvs2, 2 ).copyVector2sArray( geometry.uvs2 ) );
}
// groups
this.groups = geometry.groups;
// morphs
for ( var name in geometry.morphTargets ) {
var array = [];
var morphTargets = geometry.morphTargets[ name ];
for ( var i = 0, l = morphTargets.length; i < l; i ++ ) {
var morphTarget = morphTargets[ i ];
var attribute = new Float32BufferAttribute( morphTarget.length * 3, 3 );
array.push( attribute.copyVector3sArray( morphTarget ) );
}
this.morphAttributes[ name ] = array;
}
// skinning
if ( geometry.skinIndices.length > 0 ) {
var skinIndices = new Float32BufferAttribute( geometry.skinIndices.length * 4, 4 );
this.addAttribute( 'skinIndex', skinIndices.copyVector4sArray( geometry.skinIndices ) );
}
if ( geometry.skinWeights.length > 0 ) {
var skinWeights = new Float32BufferAttribute( geometry.skinWeights.length * 4, 4 );
this.addAttribute( 'skinWeight', skinWeights.copyVector4sArray( geometry.skinWeights ) );
}
//
if ( geometry.boundingSphere !== null ) {
this.boundingSphere = geometry.boundingSphere.clone();
}
if ( geometry.boundingBox !== null ) {
this.boundingBox = geometry.boundingBox.clone();
}
return this;
},
computeBoundingBox: function () {
if ( this.boundingBox === null ) {
this.boundingBox = new Box3();
}
var position = this.attributes.position;
if ( position !== undefined ) {
this.boundingBox.setFromBufferAttribute( position );
} else {
this.boundingBox.makeEmpty();
}
if ( isNaN( this.boundingBox.min.x ) || isNaN( this.boundingBox.min.y ) || isNaN( this.boundingBox.min.z ) ) {
console.error( 'THREE.BufferGeometry.computeBoundingBox: Computed min/max have NaN values. The "position" attribute is likely to have NaN values.', this );
}
},
computeBoundingSphere: function () {
var box = new Box3();
var vector = new Vector3();
return function computeBoundingSphere() {
if ( this.boundingSphere === null ) {
this.boundingSphere = new Sphere();
}
var position = this.attributes.position;
if ( position ) {
var center = this.boundingSphere.center;
box.setFromBufferAttribute( position );
box.getCenter( center );
// hoping to find a boundingSphere with a radius smaller than the
// boundingSphere of the boundingBox: sqrt(3) smaller in the best case
var maxRadiusSq = 0;
for ( var i = 0, il = position.count; i < il; i ++ ) {
vector.x = position.getX( i );
vector.y = position.getY( i );
vector.z = position.getZ( i );
maxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( vector ) );
}
this.boundingSphere.radius = Math.sqrt( maxRadiusSq );
if ( isNaN( this.boundingSphere.radius ) ) {
console.error( 'THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The "position" attribute is likely to have NaN values.', this );
}
}
};
}(),
computeFaceNormals: function () {
// backwards compatibility
},
computeVertexNormals: function () {
var index = this.index;
var attributes = this.attributes;
var groups = this.groups;
if ( attributes.position ) {
var positions = attributes.position.array;
if ( attributes.normal === undefined ) {
this.addAttribute( 'normal', new BufferAttribute( new Float32Array( positions.length ), 3 ) );
} else {
// reset existing normals to zero
var array = attributes.normal.array;
for ( var i = 0, il = array.length; i < il; i ++ ) {
array[ i ] = 0;
}
}
var normals = attributes.normal.array;
var vA, vB, vC;
var pA = new Vector3(), pB = new Vector3(), pC = new Vector3();
var cb = new Vector3(), ab = new Vector3();
// indexed elements
if ( index ) {
var indices = index.array;
if ( groups.length === 0 ) {
this.addGroup( 0, indices.length );
}
for ( var j = 0, jl = groups.length; j < jl; ++ j ) {
var group = groups[ j ];
var start = group.start;
var count = group.count;
for ( var i = start, il = start + count; i < il; i += 3 ) {
vA = indices[ i + 0 ] * 3;
vB = indices[ i + 1 ] * 3;
vC = indices[ i + 2 ] * 3;
pA.fromArray( positions, vA );
pB.fromArray( positions, vB );
pC.fromArray( positions, vC );
cb.subVectors( pC, pB );
ab.subVectors( pA, pB );
cb.cross( ab );
normals[ vA ] += cb.x;
normals[ vA + 1 ] += cb.y;
normals[ vA + 2 ] += cb.z;
normals[ vB ] += cb.x;
normals[ vB + 1 ] += cb.y;
normals[ vB + 2 ] += cb.z;
normals[ vC ] += cb.x;
normals[ vC + 1 ] += cb.y;
normals[ vC + 2 ] += cb.z;
}
}
} else {
// non-indexed elements (unconnected triangle soup)
for ( var i = 0, il = positions.length; i < il; i += 9 ) {
pA.fromArray( positions, i );
pB.fromArray( positions, i + 3 );
pC.fromArray( positions, i + 6 );
cb.subVectors( pC, pB );
ab.subVectors( pA, pB );
cb.cross( ab );
normals[ i ] = cb.x;
normals[ i + 1 ] = cb.y;
normals[ i + 2 ] = cb.z;
normals[ i + 3 ] = cb.x;
normals[ i + 4 ] = cb.y;
normals[ i + 5 ] = cb.z;
normals[ i + 6 ] = cb.x;
normals[ i + 7 ] = cb.y;
normals[ i + 8 ] = cb.z;
}
}
this.normalizeNormals();
attributes.normal.needsUpdate = true;
}
},
merge: function ( geometry, offset ) {
if ( ! ( geometry && geometry.isBufferGeometry ) ) {
console.error( 'THREE.BufferGeometry.merge(): geometry not an instance of THREE.BufferGeometry.', geometry );
return;
}
if ( offset === undefined ) {
offset = 0;
console.warn(
'THREE.BufferGeometry.merge(): Overwriting original geometry, starting at offset=0. '
+ 'Use BufferGeometryUtils.mergeBufferGeometries() for lossless merge.'
);
}
var attributes = this.attributes;
for ( var key in attributes ) {
if ( geometry.attributes[ key ] === undefined ) continue;
var attribute1 = attributes[ key ];
var attributeArray1 = attribute1.array;
var attribute2 = geometry.attributes[ key ];
var attributeArray2 = attribute2.array;
var attributeSize = attribute2.itemSize;
for ( var i = 0, j = attributeSize * offset; i < attributeArray2.length; i ++, j ++ ) {
attributeArray1[ j ] = attributeArray2[ i ];
}
}
return this;
},
normalizeNormals: function () {
var vector = new Vector3();
return function normalizeNormals() {
var normals = this.attributes.normal;
for ( var i = 0, il = normals.count; i < il; i ++ ) {
vector.x = normals.getX( i );
vector.y = normals.getY( i );
vector.z = normals.getZ( i );
vector.normalize();
normals.setXYZ( i, vector.x, vector.y, vector.z );
}
};
}(),
toNonIndexed: function () {
if ( this.index === null ) {
console.warn( 'THREE.BufferGeometry.toNonIndexed(): Geometry is already non-indexed.' );
return this;
}
var geometry2 = new BufferGeometry();
var indices = this.index.array;
var attributes = this.attributes;
for ( var name in attributes ) {
var attribute = attributes[ name ];
var array = attribute.array;
var itemSize = attribute.itemSize;
var array2 = new array.constructor( indices.length * itemSize );
var index = 0, index2 = 0;
for ( var i = 0, l = indices.length; i < l; i ++ ) {
index = indices[ i ] * itemSize;
for ( var j = 0; j < itemSize; j ++ ) {
array2[ index2 ++ ] = array[ index ++ ];
}
}
geometry2.addAttribute( name, new BufferAttribute( array2, itemSize ) );
}
var groups = this.groups;
for ( var i = 0, l = groups.length; i < l; i ++ ) {
var group = groups[ i ];
geometry2.addGroup( group.start, group.count, group.materialIndex );
}
return geometry2;
},
toJSON: function () {
var data = {
metadata: {
version: 4.5,
type: 'BufferGeometry',
generator: 'BufferGeometry.toJSON'
}
};
// standard BufferGeometry serialization
data.uuid = this.uuid;
data.type = this.type;
if ( this.name !== '' ) data.name = this.name;
if ( this.parameters !== undefined ) {
var parameters = this.parameters;
for ( var key in parameters ) {
if ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ];
}
return data;
}
data.data = { attributes: {} };
var index = this.index;
if ( index !== null ) {
var array = Array.prototype.slice.call( index.array );
data.data.index = {
type: index.array.constructor.name,
array: array
};
}
var attributes = this.attributes;
for ( var key in attributes ) {
var attribute = attributes[ key ];
var array = Array.prototype.slice.call( attribute.array );
data.data.attributes[ key ] = {
itemSize: attribute.itemSize,
type: attribute.array.constructor.name,
array: array,
normalized: attribute.normalized
};
}
var groups = this.groups;
if ( groups.length > 0 ) {
data.data.groups = JSON.parse( JSON.stringify( groups ) );
}
var boundingSphere = this.boundingSphere;
if ( boundingSphere !== null ) {
data.data.boundingSphere = {
center: boundingSphere.center.toArray(),
radius: boundingSphere.radius
};
}
return data;
},
clone: function () {
/*
// Handle primitives
var parameters = this.parameters;
if ( parameters !== undefined ) {
var values = [];
for ( var key in parameters ) {
values.push( parameters[ key ] );
}
var geometry = Object.create( this.constructor.prototype );
this.constructor.apply( geometry, values );
return geometry;
}
return new this.constructor().copy( this );
*/
return new BufferGeometry().copy( this );
},
copy: function ( source ) {
var name, i, l;
// reset
this.index = null;
this.attributes = {};
this.morphAttributes = {};
this.groups = [];
this.boundingBox = null;
this.boundingSphere = null;
// name
this.name = source.name;
// index
var index = source.index;
if ( index !== null ) {
this.setIndex( index.clone() );
}
// attributes
var attributes = source.attributes;
for ( name in attributes ) {
var attribute = attributes[ name ];
this.addAttribute( name, attribute.clone() );
}
// morph attributes
var morphAttributes = source.morphAttributes;
for ( name in morphAttributes ) {
var array = [];
var morphAttribute = morphAttributes[ name ]; // morphAttribute: array of Float32BufferAttributes
for ( i = 0, l = morphAttribute.length; i < l; i ++ ) {
array.push( morphAttribute[ i ].clone() );
}
this.morphAttributes[ name ] = array;
}
// groups
var groups = source.groups;
for ( i = 0, l = groups.length; i < l; i ++ ) {
var group = groups[ i ];
this.addGroup( group.start, group.count, group.materialIndex );
}
// bounding box
var boundingBox = source.boundingBox;
if ( boundingBox !== null ) {
this.boundingBox = boundingBox.clone();
}
// bounding sphere
var boundingSphere = source.boundingSphere;
if ( boundingSphere !== null ) {
this.boundingSphere = boundingSphere.clone();
}
// draw range
this.drawRange.start = source.drawRange.start;
this.drawRange.count = source.drawRange.count;
return this;
},
dispose: function () {
this.dispatchEvent( { type: 'dispose' } );
}
} );
/**
* @author mrdoob / http://mrdoob.com/
* @author Mugen87 / https://github.com/Mugen87
*/
// BoxGeometry
function BoxGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) {
Geometry.call( this );
this.type = 'BoxGeometry';
this.parameters = {
width: width,
height: height,
depth: depth,
widthSegments: widthSegments,
heightSegments: heightSegments,
depthSegments: depthSegments
};
this.fromBufferGeometry( new BoxBufferGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) );
this.mergeVertices();
}
BoxGeometry.prototype = Object.create( Geometry.prototype );
BoxGeometry.prototype.constructor = BoxGeometry;
// BoxBufferGeometry
function BoxBufferGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) {
BufferGeometry.call( this );
this.type = 'BoxBufferGeometry';
this.parameters = {
width: width,
height: height,
depth: depth,
widthSegments: widthSegments,
heightSegments: heightSegments,
depthSegments: depthSegments
};
var scope = this;
width = width || 1;
height = height || 1;
depth = depth || 1;
// segments
widthSegments = Math.floor( widthSegments ) || 1;
heightSegments = Math.floor( heightSegments ) || 1;
depthSegments = Math.floor( depthSegments ) || 1;
// buffers
var indices = [];
var vertices = [];
var normals = [];
var uvs = [];
// helper variables
var numberOfVertices = 0;
var groupStart = 0;
// build each side of the box geometry
buildPlane( 'z', 'y', 'x', - 1, - 1, depth, height, width, depthSegments, heightSegments, 0 ); // px
buildPlane( 'z', 'y', 'x', 1, - 1, depth, height, - width, depthSegments, heightSegments, 1 ); // nx
buildPlane( 'x', 'z', 'y', 1, 1, width, depth, height, widthSegments, depthSegments, 2 ); // py
buildPlane( 'x', 'z', 'y', 1, - 1, width, depth, - height, widthSegments, depthSegments, 3 ); // ny
buildPlane( 'x', 'y', 'z', 1, - 1, width, height, depth, widthSegments, heightSegments, 4 ); // pz
buildPlane( 'x', 'y', 'z', - 1, - 1, width, height, - depth, widthSegments, heightSegments, 5 ); // nz
// build geometry
this.setIndex( indices );
this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );
this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );
function buildPlane( u, v, w, udir, vdir, width, height, depth, gridX, gridY, materialIndex ) {
var segmentWidth = width / gridX;
var segmentHeight = height / gridY;
var widthHalf = width / 2;
var heightHalf = height / 2;
var depthHalf = depth / 2;
var gridX1 = gridX + 1;
var gridY1 = gridY + 1;
var vertexCounter = 0;
var groupCount = 0;
var ix, iy;
var vector = new Vector3();
// generate vertices, normals and uvs
for ( iy = 0; iy < gridY1; iy ++ ) {
var y = iy * segmentHeight - heightHalf;
for ( ix = 0; ix < gridX1; ix ++ ) {
var x = ix * segmentWidth - widthHalf;
// set values to correct vector component
vector[ u ] = x * udir;
vector[ v ] = y * vdir;
vector[ w ] = depthHalf;
// now apply vector to vertex buffer
vertices.push( vector.x, vector.y, vector.z );
// set values to correct vector component
vector[ u ] = 0;
vector[ v ] = 0;
vector[ w ] = depth > 0 ? 1 : - 1;
// now apply vector to normal buffer
normals.push( vector.x, vector.y, vector.z );
// uvs
uvs.push( ix / gridX );
uvs.push( 1 - ( iy / gridY ) );
// counters
vertexCounter += 1;
}
}
// indices
// 1. you need three indices to draw a single face
// 2. a single segment consists of two faces
// 3. so we need to generate six (2*3) indices per segment
for ( iy = 0; iy < gridY; iy ++ ) {
for ( ix = 0; ix < gridX; ix ++ ) {
var a = numberOfVertices + ix + gridX1 * iy;
var b = numberOfVertices + ix + gridX1 * ( iy + 1 );
var c = numberOfVertices + ( ix + 1 ) + gridX1 * ( iy + 1 );
var d = numberOfVertices + ( ix + 1 ) + gridX1 * iy;
// faces
indices.push( a, b, d );
indices.push( b, c, d );
// increase counter
groupCount += 6;
}
}
// add a group to the geometry. this will ensure multi material support
scope.addGroup( groupStart, groupCount, materialIndex );
// calculate new start value for groups
groupStart += groupCount;
// update total number of vertices
numberOfVertices += vertexCounter;
}
}
BoxBufferGeometry.prototype = Object.create( BufferGeometry.prototype );
BoxBufferGeometry.prototype.constructor = BoxBufferGeometry;
/**
* @author mrdoob / http://mrdoob.com/
* @author Mugen87 / https://github.com/Mugen87
*/
// PlaneGeometry
function PlaneGeometry( width, height, widthSegments, heightSegments ) {
Geometry.call( this );
this.type = 'PlaneGeometry';
this.parameters = {
width: width,
height: height,
widthSegments: widthSegments,
heightSegments: heightSegments
};
this.fromBufferGeometry( new PlaneBufferGeometry( width, height, widthSegments, heightSegments ) );
this.mergeVertices();
}
PlaneGeometry.prototype = Object.create( Geometry.prototype );
PlaneGeometry.prototype.constructor = PlaneGeometry;
// PlaneBufferGeometry
function PlaneBufferGeometry( width, height, widthSegments, heightSegments ) {
BufferGeometry.call( this );
this.type = 'PlaneBufferGeometry';
this.parameters = {
width: width,
height: height,
widthSegments: widthSegments,
heightSegments: heightSegments
};
width = width || 1;
height = height || 1;
var width_half = width / 2;
var height_half = height / 2;
var gridX = Math.floor( widthSegments ) || 1;
var gridY = Math.floor( heightSegments ) || 1;
var gridX1 = gridX + 1;
var gridY1 = gridY + 1;
var segment_width = width / gridX;
var segment_height = height / gridY;
var ix, iy;
// buffers
var indices = [];
var vertices = [];
var normals = [];
var uvs = [];
// generate vertices, normals and uvs
for ( iy = 0; iy < gridY1; iy ++ ) {
var y = iy * segment_height - height_half;
for ( ix = 0; ix < gridX1; ix ++ ) {
var x = ix * segment_width - width_half;
vertices.push( x, - y, 0 );
normals.push( 0, 0, 1 );
uvs.push( ix / gridX );
uvs.push( 1 - ( iy / gridY ) );
}
}
// indices
for ( iy = 0; iy < gridY; iy ++ ) {
for ( ix = 0; ix < gridX; ix ++ ) {
var a = ix + gridX1 * iy;
var b = ix + gridX1 * ( iy + 1 );
var c = ( ix + 1 ) + gridX1 * ( iy + 1 );
var d = ( ix + 1 ) + gridX1 * iy;
// faces
indices.push( a, b, d );
indices.push( b, c, d );
}
}
// build geometry
this.setIndex( indices );
this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );
this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );
}
PlaneBufferGeometry.prototype = Object.create( BufferGeometry.prototype );
PlaneBufferGeometry.prototype.constructor = PlaneBufferGeometry;
/**
* @author mrdoob / http://mrdoob.com/
* @author alteredq / http://alteredqualia.com/
*/
var materialId = 0;
function Material() {
Object.defineProperty( this, 'id', { value: materialId ++ } );
this.uuid = _Math.generateUUID();
this.name = '';
this.type = 'Material';
this.fog = true;
this.lights = true;
this.blending = NormalBlending;
this.side = FrontSide;
this.flatShading = false;
this.vertexColors = NoColors; // THREE.NoColors, THREE.VertexColors, THREE.FaceColors
this.opacity = 1;
this.transparent = false;
this.blendSrc = SrcAlphaFactor;
this.blendDst = OneMinusSrcAlphaFactor;
this.blendEquation = AddEquation;
this.blendSrcAlpha = null;
this.blendDstAlpha = null;
this.blendEquationAlpha = null;
this.depthFunc = LessEqualDepth;
this.depthTest = true;
this.depthWrite = true;
this.clippingPlanes = null;
this.clipIntersection = false;
this.clipShadows = false;
this.shadowSide = null;
this.colorWrite = true;
this.precision = null; // override the renderer's default precision for this material
this.polygonOffset = false;
this.polygonOffsetFactor = 0;
this.polygonOffsetUnits = 0;
this.dithering = false;
this.alphaTest = 0;
this.premultipliedAlpha = false;
this.overdraw = 0; // Overdrawn pixels (typically between 0 and 1) for fixing antialiasing gaps in CanvasRenderer
this.visible = true;
this.userData = {};
this.needsUpdate = true;
}
Material.prototype = Object.assign( Object.create( EventDispatcher.prototype ), {
constructor: Material,
isMaterial: true,
onBeforeCompile: function () {},
setValues: function ( values ) {
if ( values === undefined ) return;
for ( var key in values ) {
var newValue = values[ key ];
if ( newValue === undefined ) {
console.warn( "THREE.Material: '" + key + "' parameter is undefined." );
continue;
}
// for backward compatability if shading is set in the constructor
if ( key === 'shading' ) {
console.warn( 'THREE.' + this.type + ': .shading has been removed. Use the boolean .flatShading instead.' );
this.flatShading = ( newValue === FlatShading ) ? true : false;
continue;
}
var currentValue = this[ key ];
if ( currentValue === undefined ) {
console.warn( "THREE." + this.type + ": '" + key + "' is not a property of this material." );
continue;
}
if ( currentValue && currentValue.isColor ) {
currentValue.set( newValue );
} else if ( ( currentValue && currentValue.isVector3 ) && ( newValue && newValue.isVector3 ) ) {
currentValue.copy( newValue );
} else if ( key === 'overdraw' ) {
// ensure overdraw is backwards-compatible with legacy boolean type
this[ key ] = Number( newValue );
} else {
this[ key ] = newValue;
}
}
},
toJSON: function ( meta ) {
var isRoot = ( meta === undefined || typeof meta === 'string' );
if ( isRoot ) {
meta = {
textures: {},
images: {}
};
}
var data = {
metadata: {
version: 4.5,
type: 'Material',
generator: 'Material.toJSON'
}
};
// standard Material serialization
data.uuid = this.uuid;
data.type = this.type;
if ( this.name !== '' ) data.name = this.name;
if ( this.color && this.color.isColor ) data.color = this.color.getHex();
if ( this.roughness !== undefined ) data.roughness = this.roughness;
if ( this.metalness !== undefined ) data.metalness = this.metalness;
if ( this.emissive && this.emissive.isColor ) data.emissive = this.emissive.getHex();
if ( this.emissiveIntensity !== 1 ) data.emissiveIntensity = this.emissiveIntensity;
if ( this.specular && this.specular.isColor ) data.specular = this.specular.getHex();
if ( this.shininess !== undefined ) data.shininess = this.shininess;
if ( this.clearCoat !== undefined ) data.clearCoat = this.clearCoat;
if ( this.clearCoatRoughness !== undefined ) data.clearCoatRoughness = this.clearCoatRoughness;
if ( this.map && this.map.isTexture ) data.map = this.map.toJSON( meta ).uuid;
if ( this.alphaMap && this.alphaMap.isTexture ) data.alphaMap = this.alphaMap.toJSON( meta ).uuid;
if ( this.lightMap && this.lightMap.isTexture ) data.lightMap = this.lightMap.toJSON( meta ).uuid;
if ( this.bumpMap && this.bumpMap.isTexture ) {
data.bumpMap = this.bumpMap.toJSON( meta ).uuid;
data.bumpScale = this.bumpScale;
}
if ( this.normalMap && this.normalMap.isTexture ) {
data.normalMap = this.normalMap.toJSON( meta ).uuid;
data.normalScale = this.normalScale.toArray();
}
if ( this.displacementMap && this.displacementMap.isTexture ) {
data.displacementMap = this.displacementMap.toJSON( meta ).uuid;
data.displacementScale = this.displacementScale;
data.displacementBias = this.displacementBias;
}
if ( this.roughnessMap && this.roughnessMap.isTexture ) data.roughnessMap = this.roughnessMap.toJSON( meta ).uuid;
if ( this.metalnessMap && this.metalnessMap.isTexture ) data.metalnessMap = this.metalnessMap.toJSON( meta ).uuid;
if ( this.emissiveMap && this.emissiveMap.isTexture ) data.emissiveMap = this.emissiveMap.toJSON( meta ).uuid;
if ( this.specularMap && this.specularMap.isTexture ) data.specularMap = this.specularMap.toJSON( meta ).uuid;
if ( this.envMap && this.envMap.isTexture ) {
data.envMap = this.envMap.toJSON( meta ).uuid;
data.reflectivity = this.reflectivity; // Scale behind envMap
}
if ( this.gradientMap && this.gradientMap.isTexture ) {
data.gradientMap = this.gradientMap.toJSON( meta ).uuid;
}
if ( this.size !== undefined ) data.size = this.size;
if ( this.sizeAttenuation !== undefined ) data.sizeAttenuation = this.sizeAttenuation;
if ( this.blending !== NormalBlending ) data.blending = this.blending;
if ( this.flatShading === true ) data.flatShading = this.flatShading;
if ( this.side !== FrontSide ) data.side = this.side;
if ( this.vertexColors !== NoColors ) data.vertexColors = this.vertexColors;
if ( this.opacity < 1 ) data.opacity = this.opacity;
if ( this.transparent === true ) data.transparent = this.transparent;
data.depthFunc = this.depthFunc;
data.depthTest = this.depthTest;
data.depthWrite = this.depthWrite;
// rotation (SpriteMaterial)
if ( this.rotation !== 0 ) data.rotation = this.rotation;
if ( this.linewidth !== 1 ) data.linewidth = this.linewidth;
if ( this.dashSize !== undefined ) data.dashSize = this.dashSize;
if ( this.gapSize !== undefined ) data.gapSize = this.gapSize;
if ( this.scale !== undefined ) data.scale = this.scale;
if ( this.dithering === true ) data.dithering = true;
if ( this.alphaTest > 0 ) data.alphaTest = this.alphaTest;
if ( this.premultipliedAlpha === true ) data.premultipliedAlpha = this.premultipliedAlpha;
if ( this.wireframe === true ) data.wireframe = this.wireframe;
if ( this.wireframeLinewidth > 1 ) data.wireframeLinewidth = this.wireframeLinewidth;
if ( this.wireframeLinecap !== 'round' ) data.wireframeLinecap = this.wireframeLinecap;
if ( this.wireframeLinejoin !== 'round' ) data.wireframeLinejoin = this.wireframeLinejoin;
if ( this.morphTargets === true ) data.morphTargets = true;
if ( this.skinning === true ) data.skinning = true;
if ( this.visible === false ) data.visible = false;
if ( JSON.stringify( this.userData ) !== '{}' ) data.userData = this.userData;
// TODO: Copied from Object3D.toJSON
function extractFromCache( cache ) {
var values = [];
for ( var key in cache ) {
var data = cache[ key ];
delete data.metadata;
values.push( data );
}
return values;
}
if ( isRoot ) {
var textures = extractFromCache( meta.textures );
var images = extractFromCache( meta.images );
if ( textures.length > 0 ) data.textures = textures;
if ( images.length > 0 ) data.images = images;
}
return data;
},
clone: function () {
return new this.constructor().copy( this );
},
copy: function ( source ) {
this.name = source.name;
this.fog = source.fog;
this.lights = source.lights;
this.blending = source.blending;
this.side = source.side;
this.flatShading = source.flatShading;
this.vertexColors = source.vertexColors;
this.opacity = source.opacity;
this.transparent = source.transparent;
this.blendSrc = source.blendSrc;
this.blendDst = source.blendDst;
this.blendEquation = source.blendEquation;
this.blendSrcAlpha = source.blendSrcAlpha;
this.blendDstAlpha = source.blendDstAlpha;
this.blendEquationAlpha = source.blendEquationAlpha;
this.depthFunc = source.depthFunc;
this.depthTest = source.depthTest;
this.depthWrite = source.depthWrite;
this.colorWrite = source.colorWrite;
this.precision = source.precision;
this.polygonOffset = source.polygonOffset;
this.polygonOffsetFactor = source.polygonOffsetFactor;
this.polygonOffsetUnits = source.polygonOffsetUnits;
this.dithering = source.dithering;
this.alphaTest = source.alphaTest;
this.premultipliedAlpha = source.premultipliedAlpha;
this.overdraw = source.overdraw;
this.visible = source.visible;
this.userData = JSON.parse( JSON.stringify( source.userData ) );
this.clipShadows = source.clipShadows;
this.clipIntersection = source.clipIntersection;
var srcPlanes = source.clippingPlanes,
dstPlanes = null;
if ( srcPlanes !== null ) {
var n = srcPlanes.length;
dstPlanes = new Array( n );
for ( var i = 0; i !== n; ++ i )
dstPlanes[ i ] = srcPlanes[ i ].clone();
}
this.clippingPlanes = dstPlanes;
this.shadowSide = source.shadowSide;
return this;
},
dispose: function () {
this.dispatchEvent( { type: 'dispose' } );
}
} );
/**
* @author mrdoob / http://mrdoob.com/
* @author alteredq / http://alteredqualia.com/
*
* parameters = {
* color: <hex>,
* opacity: <float>,
* map: new THREE.Texture( <Image> ),
*
* lightMap: new THREE.Texture( <Image> ),
* lightMapIntensity: <float>
*
* aoMap: new THREE.Texture( <Image> ),
* aoMapIntensity: <float>
*
* specularMap: new THREE.Texture( <Image> ),
*
* alphaMap: new THREE.Texture( <Image> ),
*
* envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ),
* combine: THREE.Multiply,
* reflectivity: <float>,
* refractionRatio: <float>,
*
* depthTest: <bool>,
* depthWrite: <bool>,
*
* wireframe: <boolean>,
* wireframeLinewidth: <float>,
*
* skinning: <bool>,
* morphTargets: <bool>
* }
*/
function MeshBasicMaterial( parameters ) {
Material.call( this );
this.type = 'MeshBasicMaterial';
this.color = new Color( 0xffffff ); // emissive
this.map = null;
this.lightMap = null;
this.lightMapIntensity = 1.0;
this.aoMap = null;
this.aoMapIntensity = 1.0;
this.specularMap = null;
this.alphaMap = null;
this.envMap = null;
this.combine = MultiplyOperation;
this.reflectivity = 1;
this.refractionRatio = 0.98;
this.wireframe = false;
this.wireframeLinewidth = 1;
this.wireframeLinecap = 'round';
this.wireframeLinejoin = 'round';
this.skinning = false;
this.morphTargets = false;
this.lights = false;
this.setValues( parameters );
}
MeshBasicMaterial.prototype = Object.create( Material.prototype );
MeshBasicMaterial.prototype.constructor = MeshBasicMaterial;
MeshBasicMaterial.prototype.isMeshBasicMaterial = true;
MeshBasicMaterial.prototype.copy = function ( source ) {
Material.prototype.copy.call( this, source );
this.color.copy( source.color );
this.map = source.map;
this.lightMap = source.lightMap;
this.lightMapIntensity = source.lightMapIntensity;
this.aoMap = source.aoMap;
this.aoMapIntensity = source.aoMapIntensity;
this.specularMap = source.specularMap;
this.alphaMap = source.alphaMap;
this.envMap = source.envMap;
this.combine = source.combine;
this.reflectivity = source.reflectivity;
this.refractionRatio = source.refractionRatio;
this.wireframe = source.wireframe;
this.wireframeLinewidth = source.wireframeLinewidth;
this.wireframeLinecap = source.wireframeLinecap;
this.wireframeLinejoin = source.wireframeLinejoin;
this.skinning = source.skinning;
this.morphTargets = source.morphTargets;
return this;
};
/**
* @author alteredq / http://alteredqualia.com/
*
* parameters = {
* defines: { "label" : "value" },
* uniforms: { "parameter1": { value: 1.0 }, "parameter2": { value2: 2 } },
*
* fragmentShader: <string>,
* vertexShader: <string>,
*
* wireframe: <boolean>,
* wireframeLinewidth: <float>,
*
* lights: <bool>,
*
* skinning: <bool>,
* morphTargets: <bool>,
* morphNormals: <bool>
* }
*/
function ShaderMaterial( parameters ) {
Material.call( this );
this.type = 'ShaderMaterial';
this.defines = {};
this.uniforms = {};
this.vertexShader = 'void main() {\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}';
this.fragmentShader = 'void main() {\n\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\n}';
this.linewidth = 1;
this.wireframe = false;
this.wireframeLinewidth = 1;
this.fog = false; // set to use scene fog
this.lights = false; // set to use scene lights
this.clipping = false; // set to use user-defined clipping planes
this.skinning = false; // set to use skinning attribute streams
this.morphTargets = false; // set to use morph targets
this.morphNormals = false; // set to use morph normals
this.extensions = {
derivatives: false, // set to use derivatives
fragDepth: false, // set to use fragment depth values
drawBuffers: false, // set to use draw buffers
shaderTextureLOD: false // set to use shader texture LOD
};
// When rendered geometry doesn't include these attributes but the material does,
// use these default values in WebGL. This avoids errors when buffer data is missing.
this.defaultAttributeValues = {
'color': [ 1, 1, 1 ],
'uv': [ 0, 0 ],
'uv2': [ 0, 0 ]
};
this.index0AttributeName = undefined;
this.uniformsNeedUpdate = false;
if ( parameters !== undefined ) {
if ( parameters.attributes !== undefined ) {
console.error( 'THREE.ShaderMaterial: attributes should now be defined in THREE.BufferGeometry instead.' );
}
this.setValues( parameters );
}
}
ShaderMaterial.prototype = Object.create( Material.prototype );
ShaderMaterial.prototype.constructor = ShaderMaterial;
ShaderMaterial.prototype.isShaderMaterial = true;
ShaderMaterial.prototype.copy = function ( source ) {
Material.prototype.copy.call( this, source );
this.fragmentShader = source.fragmentShader;
this.vertexShader = source.vertexShader;
this.uniforms = UniformsUtils.clone( source.uniforms );
this.defines = Object.assign( {}, source.defines );
this.wireframe = source.wireframe;
this.wireframeLinewidth = source.wireframeLinewidth;
this.lights = source.lights;
this.clipping = source.clipping;
this.skinning = source.skinning;
this.morphTargets = source.morphTargets;
this.morphNormals = source.morphNormals;
this.extensions = source.extensions;
return this;
};
ShaderMaterial.prototype.toJSON = function ( meta ) {
var data = Material.prototype.toJSON.call( this, meta );
data.uniforms = this.uniforms;
data.vertexShader = this.vertexShader;
data.fragmentShader = this.fragmentShader;
return data;
};
/**
* @author bhouston / http://clara.io
*/
function Ray( origin, direction ) {
this.origin = ( origin !== undefined ) ? origin : new Vector3();
this.direction = ( direction !== undefined ) ? direction : new Vector3();
}
Object.assign( Ray.prototype, {
set: function ( origin, direction ) {
this.origin.copy( origin );
this.direction.copy( direction );
return this;
},
clone: function () {
return new this.constructor().copy( this );
},
copy: function ( ray ) {
this.origin.copy( ray.origin );
this.direction.copy( ray.direction );
return this;
},
at: function ( t, target ) {
if ( target === undefined ) {
console.warn( 'THREE.Ray: .at() target is now required' );
target = new Vector3();
}
return target.copy( this.direction ).multiplyScalar( t ).add( this.origin );
},
lookAt: function ( v ) {
this.direction.copy( v ).sub( this.origin ).normalize();
return this;
},
recast: function () {
var v1 = new Vector3();
return function recast( t ) {
this.origin.copy( this.at( t, v1 ) );
return this;
};
}(),
closestPointToPoint: function ( point, target ) {
if ( target === undefined ) {
console.warn( 'THREE.Ray: .closestPointToPoint() target is now required' );
target = new Vector3();
}
target.subVectors( point, this.origin );
var directionDistance = target.dot( this.direction );
if ( directionDistance < 0 ) {
return target.copy( this.origin );
}
return target.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin );
},
distanceToPoint: function ( point ) {
return Math.sqrt( this.distanceSqToPoint( point ) );
},
distanceSqToPoint: function () {
var v1 = new Vector3();
return function distanceSqToPoint( point ) {
var directionDistance = v1.subVectors( point, this.origin ).dot( this.direction );
// point behind the ray
if ( directionDistance < 0 ) {
return this.origin.distanceToSquared( point );
}
v1.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin );
return v1.distanceToSquared( point );
};
}(),
distanceSqToSegment: function () {
var segCenter = new Vector3();
var segDir = new Vector3();
var diff = new Vector3();
return function distanceSqToSegment( v0, v1, optionalPointOnRay, optionalPointOnSegment ) {
// from http://www.geometrictools.com/GTEngine/Include/Mathematics/GteDistRaySegment.h
// It returns the min distance between the ray and the segment
// defined by v0 and v1
// It can also set two optional targets :
// - The closest point on the ray
// - The closest point on the segment
segCenter.copy( v0 ).add( v1 ).multiplyScalar( 0.5 );
segDir.copy( v1 ).sub( v0 ).normalize();
diff.copy( this.origin ).sub( segCenter );
var segExtent = v0.distanceTo( v1 ) * 0.5;
var a01 = - this.direction.dot( segDir );
var b0 = diff.dot( this.direction );
var b1 = - diff.dot( segDir );
var c = diff.lengthSq();
var det = Math.abs( 1 - a01 * a01 );
var s0, s1, sqrDist, extDet;
if ( det > 0 ) {
// The ray and segment are not parallel.
s0 = a01 * b1 - b0;
s1 = a01 * b0 - b1;
extDet = segExtent * det;
if ( s0 >= 0 ) {
if ( s1 >= - extDet ) {
if ( s1 <= extDet ) {
// region 0
// Minimum at interior points of ray and segment.
var invDet = 1 / det;
s0 *= invDet;
s1 *= invDet;
sqrDist = s0 * ( s0 + a01 * s1 + 2 * b0 ) + s1 * ( a01 * s0 + s1 + 2 * b1 ) + c;
} else {
// region 1
s1 = segExtent;
s0 = Math.max( 0, - ( a01 * s1 + b0 ) );
sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;
}
} else {
// region 5
s1 = - segExtent;
s0 = Math.max( 0, - ( a01 * s1 + b0 ) );
sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;
}
} else {
if ( s1 <= - extDet ) {
// region 4
s0 = Math.max( 0, - ( - a01 * segExtent + b0 ) );
s1 = ( s0 > 0 ) ? - segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent );
sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;
} else if ( s1 <= extDet ) {
// region 3
s0 = 0;
s1 = Math.min( Math.max( - segExtent, - b1 ), segExtent );
sqrDist = s1 * ( s1 + 2 * b1 ) + c;
} else {
// region 2
s0 = Math.max( 0, - ( a01 * segExtent + b0 ) );
s1 = ( s0 > 0 ) ? segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent );
sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;
}
}
} else {
// Ray and segment are parallel.
s1 = ( a01 > 0 ) ? - segExtent : segExtent;
s0 = Math.max( 0, - ( a01 * s1 + b0 ) );
sqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;
}
if ( optionalPointOnRay ) {
optionalPointOnRay.copy( this.direction ).multiplyScalar( s0 ).add( this.origin );
}
if ( optionalPointOnSegment ) {
optionalPointOnSegment.copy( segDir ).multiplyScalar( s1 ).add( segCenter );
}
return sqrDist;
};
}(),
intersectSphere: function () {
var v1 = new Vector3();
return function intersectSphere( sphere, target ) {
v1.subVectors( sphere.center, this.origin );
var tca = v1.dot( this.direction );
var d2 = v1.dot( v1 ) - tca * tca;
var radius2 = sphere.radius * sphere.radius;
if ( d2 > radius2 ) return null;
var thc = Math.sqrt( radius2 - d2 );
// t0 = first intersect point - entrance on front of sphere
var t0 = tca - thc;
// t1 = second intersect point - exit point on back of sphere
var t1 = tca + thc;
// test to see if both t0 and t1 are behind the ray - if so, return null
if ( t0 < 0 && t1 < 0 ) return null;
// test to see if t0 is behind the ray:
// if it is, the ray is inside the sphere, so return the second exit point scaled by t1,
// in order to always return an intersect point that is in front of the ray.
if ( t0 < 0 ) return this.at( t1, target );
// else t0 is in front of the ray, so return the first collision point scaled by t0
return this.at( t0, target );
};
}(),
intersectsSphere: function ( sphere ) {
return this.distanceToPoint( sphere.center ) <= sphere.radius;
},
distanceToPlane: function ( plane ) {
var denominator = plane.normal.dot( this.direction );
if ( denominator === 0 ) {
// line is coplanar, return origin
if ( plane.distanceToPoint( this.origin ) === 0 ) {
return 0;
}
// Null is preferable to undefined since undefined means.... it is undefined
return null;
}
var t = - ( this.origin.dot( plane.normal ) + plane.constant ) / denominator;
// Return if the ray never intersects the plane
return t >= 0 ? t : null;
},
intersectPlane: function ( plane, target ) {
var t = this.distanceToPlane( plane );
if ( t === null ) {
return null;
}
return this.at( t, target );
},
intersectsPlane: function ( plane ) {
// check if the ray lies on the plane first
var distToPoint = plane.distanceToPoint( this.origin );
if ( distToPoint === 0 ) {
return true;
}
var denominator = plane.normal.dot( this.direction );
if ( denominator * distToPoint < 0 ) {
return true;
}
// ray origin is behind the plane (and is pointing behind it)
return false;
},
intersectBox: function ( box, target ) {
var tmin, tmax, tymin, tymax, tzmin, tzmax;
var invdirx = 1 / this.direction.x,
invdiry = 1 / this.direction.y,
invdirz = 1 / this.direction.z;
var origin = this.origin;
if ( invdirx >= 0 ) {
tmin = ( box.min.x - origin.x ) * invdirx;
tmax = ( box.max.x - origin.x ) * invdirx;
} else {
tmin = ( box.max.x - origin.x ) * invdirx;
tmax = ( box.min.x - origin.x ) * invdirx;
}
if ( invdiry >= 0 ) {
tymin = ( box.min.y - origin.y ) * invdiry;
tymax = ( box.max.y - origin.y ) * invdiry;
} else {
tymin = ( box.max.y - origin.y ) * invdiry;
tymax = ( box.min.y - origin.y ) * invdiry;
}
if ( ( tmin > tymax ) || ( tymin > tmax ) ) return null;
// These lines also handle the case where tmin or tmax is NaN
// (result of 0 * Infinity). x !== x returns true if x is NaN
if ( tymin > tmin || tmin !== tmin ) tmin = tymin;
if ( tymax < tmax || tmax !== tmax ) tmax = tymax;
if ( invdirz >= 0 ) {
tzmin = ( box.min.z - origin.z ) * invdirz;
tzmax = ( box.max.z - origin.z ) * invdirz;
} else {
tzmin = ( box.max.z - origin.z ) * invdirz;
tzmax = ( box.min.z - origin.z ) * invdirz;
}
if ( ( tmin > tzmax ) || ( tzmin > tmax ) ) return null;
if ( tzmin > tmin || tmin !== tmin ) tmin = tzmin;
if ( tzmax < tmax || tmax !== tmax ) tmax = tzmax;
//return point closest to the ray (positive side)
if ( tmax < 0 ) return null;
return this.at( tmin >= 0 ? tmin : tmax, target );
},
intersectsBox: ( function () {
var v = new Vector3();
return function intersectsBox( box ) {
return this.intersectBox( box, v ) !== null;
};
} )(),
intersectTriangle: function () {
// Compute the offset origin, edges, and normal.
var diff = new Vector3();
var edge1 = new Vector3();
var edge2 = new Vector3();
var normal = new Vector3();
return function intersectTriangle( a, b, c, backfaceCulling, target ) {
// from http://www.geometrictools.com/GTEngine/Include/Mathematics/GteIntrRay3Triangle3.h
edge1.subVectors( b, a );
edge2.subVectors( c, a );
normal.crossVectors( edge1, edge2 );
// Solve Q + t*D = b1*E1 + b2*E2 (Q = kDiff, D = ray direction,
// E1 = kEdge1, E2 = kEdge2, N = Cross(E1,E2)) by
// |Dot(D,N)|*b1 = sign(Dot(D,N))*Dot(D,Cross(Q,E2))
// |Dot(D,N)|*b2 = sign(Dot(D,N))*Dot(D,Cross(E1,Q))
// |Dot(D,N)|*t = -sign(Dot(D,N))*Dot(Q,N)
var DdN = this.direction.dot( normal );
var sign;
if ( DdN > 0 ) {
if ( backfaceCulling ) return null;
sign = 1;
} else if ( DdN < 0 ) {
sign = - 1;
DdN = - DdN;
} else {
return null;
}
diff.subVectors( this.origin, a );
var DdQxE2 = sign * this.direction.dot( edge2.crossVectors( diff, edge2 ) );
// b1 < 0, no intersection
if ( DdQxE2 < 0 ) {
return null;
}
var DdE1xQ = sign * this.direction.dot( edge1.cross( diff ) );
// b2 < 0, no intersection
if ( DdE1xQ < 0 ) {
return null;
}
// b1+b2 > 1, no intersection
if ( DdQxE2 + DdE1xQ > DdN ) {
return null;
}
// Line intersects triangle, check if ray does.
var QdN = - sign * diff.dot( normal );
// t < 0, no intersection
if ( QdN < 0 ) {
return null;
}
// Ray intersects triangle.
return this.at( QdN / DdN, target );
};
}(),
applyMatrix4: function ( matrix4 ) {
this.origin.applyMatrix4( matrix4 );
this.direction.transformDirection( matrix4 );
return this;
},
equals: function ( ray ) {
return ray.origin.equals( this.origin ) && ray.direction.equals( this.direction );
}
} );
/**
* @author bhouston / http://clara.io
*/
function Line3( start, end ) {
this.start = ( start !== undefined ) ? start : new Vector3();
this.end = ( end !== undefined ) ? end : new Vector3();
}
Object.assign( Line3.prototype, {
set: function ( start, end ) {
this.start.copy( start );
this.end.copy( end );
return this;
},
clone: function () {
return new this.constructor().copy( this );
},
copy: function ( line ) {
this.start.copy( line.start );
this.end.copy( line.end );
return this;
},
getCenter: function ( target ) {
if ( target === undefined ) {
console.warn( 'THREE.Line3: .getCenter() target is now required' );
target = new Vector3();
}
return target.addVectors( this.start, this.end ).multiplyScalar( 0.5 );
},
delta: function ( target ) {
if ( target === undefined ) {
console.warn( 'THREE.Line3: .delta() target is now required' );
target = new Vector3();
}
return target.subVectors( this.end, this.start );
},
distanceSq: function () {
return this.start.distanceToSquared( this.end );
},
distance: function () {
return this.start.distanceTo( this.end );
},
at: function ( t, target ) {
if ( target === undefined ) {
console.warn( 'THREE.Line3: .at() target is now required' );
target = new Vector3();
}
return this.delta( target ).multiplyScalar( t ).add( this.start );
},
closestPointToPointParameter: function () {
var startP = new Vector3();
var startEnd = new Vector3();
return function closestPointToPointParameter( point, clampToLine ) {
startP.subVectors( point, this.start );
startEnd.subVectors( this.end, this.start );
var startEnd2 = startEnd.dot( startEnd );
var startEnd_startP = startEnd.dot( startP );
var t = startEnd_startP / startEnd2;
if ( clampToLine ) {
t = _Math.clamp( t, 0, 1 );
}
return t;
};
}(),
closestPointToPoint: function ( point, clampToLine, target ) {
var t = this.closestPointToPointParameter( point, clampToLine );
if ( target === undefined ) {
console.warn( 'THREE.Line3: .closestPointToPoint() target is now required' );
target = new Vector3();
}
return this.delta( target ).multiplyScalar( t ).add( this.start );
},
applyMatrix4: function ( matrix ) {
this.start.applyMatrix4( matrix );
this.end.applyMatrix4( matrix );
return this;
},
equals: function ( line ) {
return line.start.equals( this.start ) && line.end.equals( this.end );
}
} );
/**
* @author bhouston / http://clara.io
* @author mrdoob / http://mrdoob.com/
*/
function Triangle( a, b, c ) {
this.a = ( a !== undefined ) ? a : new Vector3();
this.b = ( b !== undefined ) ? b : new Vector3();
this.c = ( c !== undefined ) ? c : new Vector3();
}
Object.assign( Triangle, {
getNormal: function () {
var v0 = new Vector3();
return function getNormal( a, b, c, target ) {
if ( target === undefined ) {
console.warn( 'THREE.Triangle: .getNormal() target is now required' );
target = new Vector3();
}
target.subVectors( c, b );
v0.subVectors( a, b );
target.cross( v0 );
var targetLengthSq = target.lengthSq();
if ( targetLengthSq > 0 ) {
return target.multiplyScalar( 1 / Math.sqrt( targetLengthSq ) );
}
return target.set( 0, 0, 0 );
};
}(),
// static/instance method to calculate barycentric coordinates
// based on: http://www.blackpawn.com/texts/pointinpoly/default.html
getBarycoord: function () {
var v0 = new Vector3();
var v1 = new Vector3();
var v2 = new Vector3();
return function getBarycoord( point, a, b, c, target ) {
v0.subVectors( c, a );
v1.subVectors( b, a );
v2.subVectors( point, a );
var dot00 = v0.dot( v0 );
var dot01 = v0.dot( v1 );
var dot02 = v0.dot( v2 );
var dot11 = v1.dot( v1 );
var dot12 = v1.dot( v2 );
var denom = ( dot00 * dot11 - dot01 * dot01 );
if ( target === undefined ) {
console.warn( 'THREE.Triangle: .getBarycoord() target is now required' );
target = new Vector3();
}
// collinear or singular triangle
if ( denom === 0 ) {
// arbitrary location outside of triangle?
// not sure if this is the best idea, maybe should be returning undefined
return target.set( - 2, - 1, - 1 );
}
var invDenom = 1 / denom;
var u = ( dot11 * dot02 - dot01 * dot12 ) * invDenom;
var v = ( dot00 * dot12 - dot01 * dot02 ) * invDenom;
// barycentric coordinates must always sum to 1
return target.set( 1 - u - v, v, u );
};
}(),
containsPoint: function () {
var v1 = new Vector3();
return function containsPoint( point, a, b, c ) {
Triangle.getBarycoord( point, a, b, c, v1 );
return ( v1.x >= 0 ) && ( v1.y >= 0 ) && ( ( v1.x + v1.y ) <= 1 );
};
}()
} );
Object.assign( Triangle.prototype, {
set: function ( a, b, c ) {
this.a.copy( a );
this.b.copy( b );
this.c.copy( c );
return this;
},
setFromPointsAndIndices: function ( points, i0, i1, i2 ) {
this.a.copy( points[ i0 ] );
this.b.copy( points[ i1 ] );
this.c.copy( points[ i2 ] );
return this;
},
clone: function () {
return new this.constructor().copy( this );
},
copy: function ( triangle ) {
this.a.copy( triangle.a );
this.b.copy( triangle.b );
this.c.copy( triangle.c );
return this;
},
getArea: function () {
var v0 = new Vector3();
var v1 = new Vector3();
return function getArea() {
v0.subVectors( this.c, this.b );
v1.subVectors( this.a, this.b );
return v0.cross( v1 ).length() * 0.5;
};
}(),
getMidpoint: function ( target ) {
if ( target === undefined ) {
console.warn( 'THREE.Triangle: .getMidpoint() target is now required' );
target = new Vector3();
}
return target.addVectors( this.a, this.b ).add( this.c ).multiplyScalar( 1 / 3 );
},
getNormal: function ( target ) {
return Triangle.getNormal( this.a, this.b, this.c, target );
},
getPlane: function ( target ) {
if ( target === undefined ) {
console.warn( 'THREE.Triangle: .getPlane() target is now required' );
target = new Vector3();
}
return target.setFromCoplanarPoints( this.a, this.b, this.c );
},
getBarycoord: function ( point, target ) {
return Triangle.getBarycoord( point, this.a, this.b, this.c, target );
},
containsPoint: function ( point ) {
return Triangle.containsPoint( point, this.a, this.b, this.c );
},
intersectsBox: function ( box ) {
return box.intersectsTriangle( this );
},
closestPointToPoint: function () {
var plane = new Plane();
var edgeList = [ new Line3(), new Line3(), new Line3() ];
var projectedPoint = new Vector3();
var closestPoint = new Vector3();
return function closestPointToPoint( point, target ) {
if ( target === undefined ) {
console.warn( 'THREE.Triangle: .closestPointToPoint() target is now required' );
target = new Vector3();
}
var minDistance = Infinity;
// project the point onto the plane of the triangle
plane.setFromCoplanarPoints( this.a, this.b, this.c );
plane.projectPoint( point, projectedPoint );
// check if the projection lies within the triangle
if ( this.containsPoint( projectedPoint ) === true ) {
// if so, this is the closest point
target.copy( projectedPoint );
} else {
// if not, the point falls outside the triangle. the target is the closest point to the triangle's edges or vertices
edgeList[ 0 ].set( this.a, this.b );
edgeList[ 1 ].set( this.b, this.c );
edgeList[ 2 ].set( this.c, this.a );
for ( var i = 0; i < edgeList.length; i ++ ) {
edgeList[ i ].closestPointToPoint( projectedPoint, true, closestPoint );
var distance = projectedPoint.distanceToSquared( closestPoint );
if ( distance < minDistance ) {
minDistance = distance;
target.copy( closestPoint );
}
}
}
return target;
};
}(),
equals: function ( triangle ) {
return triangle.a.equals( this.a ) && triangle.b.equals( this.b ) && triangle.c.equals( this.c );
}
} );
/**
* @author mrdoob / http://mrdoob.com/
* @author alteredq / http://alteredqualia.com/
* @author mikael emtinger / http://gomo.se/
* @author jonobr1 / http://jonobr1.com/
*/
function Mesh( geometry, material ) {
Object3D.call( this );
this.type = 'Mesh';
this.geometry = geometry !== undefined ? geometry : new BufferGeometry();
this.material = material !== undefined ? material : new MeshBasicMaterial( { color: Math.random() * 0xffffff } );
this.drawMode = TrianglesDrawMode;
this.updateMorphTargets();
}
Mesh.prototype = Object.assign( Object.create( Object3D.prototype ), {
constructor: Mesh,
isMesh: true,
setDrawMode: function ( value ) {
this.drawMode = value;
},
copy: function ( source ) {
Object3D.prototype.copy.call( this, source );
this.drawMode = source.drawMode;
if ( source.morphTargetInfluences !== undefined ) {
this.morphTargetInfluences = source.morphTargetInfluences.slice();
}
if ( source.morphTargetDictionary !== undefined ) {
this.morphTargetDictionary = Object.assign( {}, source.morphTargetDictionary );
}
return this;
},
updateMorphTargets: function () {
var geometry = this.geometry;
var m, ml, name;
if ( geometry.isBufferGeometry ) {
var morphAttributes = geometry.morphAttributes;
var keys = Object.keys( morphAttributes );
if ( keys.length > 0 ) {
var morphAttribute = morphAttributes[ keys[ 0 ] ];
if ( morphAttribute !== undefined ) {
this.morphTargetInfluences = [];
this.morphTargetDictionary = {};
for ( m = 0, ml = morphAttribute.length; m < ml; m ++ ) {
name = morphAttribute[ m ].name || String( m );
this.morphTargetInfluences.push( 0 );
this.morphTargetDictionary[ name ] = m;
}
}
}
} else {
var morphTargets = geometry.morphTargets;
if ( morphTargets !== undefined && morphTargets.length > 0 ) {
this.morphTargetInfluences = [];
this.morphTargetDictionary = {};
for ( m = 0, ml = morphTargets.length; m < ml; m ++ ) {
name = morphTargets[ m ].name || String( m );
this.morphTargetInfluences.push( 0 );
this.morphTargetDictionary[ name ] = m;
}
}
}
},
raycast: ( function () {
var inverseMatrix = new Matrix4();
var ray = new Ray();
var sphere = new Sphere();
var vA = new Vector3();
var vB = new Vector3();
var vC = new Vector3();
var tempA = new Vector3();
var tempB = new Vector3();
var tempC = new Vector3();
var uvA = new Vector2();
var uvB = new Vector2();
var uvC = new Vector2();
var barycoord = new Vector3();
var intersectionPoint = new Vector3();
var intersectionPointWorld = new Vector3();
function uvIntersection( point, p1, p2, p3, uv1, uv2, uv3 ) {
Triangle.getBarycoord( point, p1, p2, p3, barycoord );
uv1.multiplyScalar( barycoord.x );
uv2.multiplyScalar( barycoord.y );
uv3.multiplyScalar( barycoord.z );
uv1.add( uv2 ).add( uv3 );
return uv1.clone();
}
function checkIntersection( object, material, raycaster, ray, pA, pB, pC, point ) {
var intersect;
if ( material.side === BackSide ) {
intersect = ray.intersectTriangle( pC, pB, pA, true, point );
} else {
intersect = ray.intersectTriangle( pA, pB, pC, material.side !== DoubleSide, point );
}
if ( intersect === null ) return null;
intersectionPointWorld.copy( point );
intersectionPointWorld.applyMatrix4( object.matrixWorld );
var distance = raycaster.ray.origin.distanceTo( intersectionPointWorld );
if ( distance < raycaster.near || distance > raycaster.far ) return null;
return {
distance: distance,
point: intersectionPointWorld.clone(),
object: object
};
}
function checkBufferGeometryIntersection( object, raycaster, ray, position, uv, a, b, c ) {
vA.fromBufferAttribute( position, a );
vB.fromBufferAttribute( position, b );
vC.fromBufferAttribute( position, c );
var intersection = checkIntersection( object, object.material, raycaster, ray, vA, vB, vC, intersectionPoint );
if ( intersection ) {
if ( uv ) {
uvA.fromBufferAttribute( uv, a );
uvB.fromBufferAttribute( uv, b );
uvC.fromBufferAttribute( uv, c );
intersection.uv = uvIntersection( intersectionPoint, vA, vB, vC, uvA, uvB, uvC );
}
var face = new Face3( a, b, c );
Triangle.getNormal( vA, vB, vC, face.normal );
intersection.face = face;
intersection.faceIndex = a;
}
return intersection;
}
return function raycast( raycaster, intersects ) {
var geometry = this.geometry;
var material = this.material;
var matrixWorld = this.matrixWorld;
if ( material === undefined ) return;
// Checking boundingSphere distance to ray
if ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();
sphere.copy( geometry.boundingSphere );
sphere.applyMatrix4( matrixWorld );
if ( raycaster.ray.intersectsSphere( sphere ) === false ) return;
//
inverseMatrix.getInverse( matrixWorld );
ray.copy( raycaster.ray ).applyMatrix4( inverseMatrix );
// Check boundingBox before continuing
if ( geometry.boundingBox !== null ) {
if ( ray.intersectsBox( geometry.boundingBox ) === false ) return;
}
var intersection;
if ( geometry.isBufferGeometry ) {
var a, b, c;
var index = geometry.index;
var position = geometry.attributes.position;
var uv = geometry.attributes.uv;
var i, l;
if ( index !== null ) {
// indexed buffer geometry
for ( i = 0, l = index.count; i < l; i += 3 ) {
a = index.getX( i );
b = index.getX( i + 1 );
c = index.getX( i + 2 );
intersection = checkBufferGeometryIntersection( this, raycaster, ray, position, uv, a, b, c );
if ( intersection ) {
intersection.faceIndex = Math.floor( i / 3 ); // triangle number in indices buffer semantics
intersects.push( intersection );
}
}
} else if ( position !== undefined ) {
// non-indexed buffer geometry
for ( i = 0, l = position.count; i < l; i += 3 ) {
a = i;
b = i + 1;
c = i + 2;
intersection = checkBufferGeometryIntersection( this, raycaster, ray, position, uv, a, b, c );
if ( intersection ) intersects.push( intersection );
}
}
} else if ( geometry.isGeometry ) {
var fvA, fvB, fvC;
var isMultiMaterial = Array.isArray( material );
var vertices = geometry.vertices;
var faces = geometry.faces;
var uvs;
var faceVertexUvs = geometry.faceVertexUvs[ 0 ];
if ( faceVertexUvs.length > 0 ) uvs = faceVertexUvs;
for ( var f = 0, fl = faces.length; f < fl; f ++ ) {
var face = faces[ f ];
var faceMaterial = isMultiMaterial ? material[ face.materialIndex ] : material;
if ( faceMaterial === undefined ) continue;
fvA = vertices[ face.a ];
fvB = vertices[ face.b ];
fvC = vertices[ face.c ];
if ( faceMaterial.morphTargets === true ) {
var morphTargets = geometry.morphTargets;
var morphInfluences = this.morphTargetInfluences;
vA.set( 0, 0, 0 );
vB.set( 0, 0, 0 );
vC.set( 0, 0, 0 );
for ( var t = 0, tl = morphTargets.length; t < tl; t ++ ) {
var influence = morphInfluences[ t ];
if ( influence === 0 ) continue;
var targets = morphTargets[ t ].vertices;
vA.addScaledVector( tempA.subVectors( targets[ face.a ], fvA ), influence );
vB.addScaledVector( tempB.subVectors( targets[ face.b ], fvB ), influence );
vC.addScaledVector( tempC.subVectors( targets[ face.c ], fvC ), influence );
}
vA.add( fvA );
vB.add( fvB );
vC.add( fvC );
fvA = vA;
fvB = vB;
fvC = vC;
}
intersection = checkIntersection( this, faceMaterial, raycaster, ray, fvA, fvB, fvC, intersectionPoint );
if ( intersection ) {
if ( uvs && uvs[ f ] ) {
var uvs_f = uvs[ f ];
uvA.copy( uvs_f[ 0 ] );
uvB.copy( uvs_f[ 1 ] );
uvC.copy( uvs_f[ 2 ] );
intersection.uv = uvIntersection( intersectionPoint, fvA, fvB, fvC, uvA, uvB, uvC );
}
intersection.face = face;
intersection.faceIndex = f;
intersects.push( intersection );
}
}
}
};
}() ),
clone: function () {
return new this.constructor( this.geometry, this.material ).copy( this );
}
} );
/**
* @author mrdoob / http://mrdoob.com/
*/
function WebGLBackground( renderer, state, geometries, premultipliedAlpha ) {
var clearColor = new Color( 0x000000 );
var clearAlpha = 0;
var planeCamera, planeMesh;
var boxMesh;
function render( renderList, scene, camera, forceClear ) {
var background = scene.background;
if ( background === null ) {
setClear( clearColor, clearAlpha );
} else if ( background && background.isColor ) {
setClear( background, 1 );
forceClear = true;
}
if ( renderer.autoClear || forceClear ) {
renderer.clear( renderer.autoClearColor, renderer.autoClearDepth, renderer.autoClearStencil );
}
if ( background && background.isCubeTexture ) {
if ( boxMesh === undefined ) {
boxMesh = new Mesh(
new BoxBufferGeometry( 1, 1, 1 ),
new ShaderMaterial( {
uniforms: ShaderLib.cube.uniforms,
vertexShader: ShaderLib.cube.vertexShader,
fragmentShader: ShaderLib.cube.fragmentShader,
side: BackSide,
depthTest: true,
depthWrite: false,
fog: false
} )
);
boxMesh.geometry.removeAttribute( 'normal' );
boxMesh.geometry.removeAttribute( 'uv' );
boxMesh.onBeforeRender = function ( renderer, scene, camera ) {
this.matrixWorld.copyPosition( camera.matrixWorld );
};
geometries.update( boxMesh.geometry );
}
boxMesh.material.uniforms.tCube.value = background;
renderList.push( boxMesh, boxMesh.geometry, boxMesh.material, 0, null );
} else if ( background && background.isTexture ) {
if ( planeCamera === undefined ) {
planeCamera = new OrthographicCamera( - 1, 1, 1, - 1, 0, 1 );
planeMesh = new Mesh(
new PlaneBufferGeometry( 2, 2 ),
new MeshBasicMaterial( { depthTest: false, depthWrite: false, fog: false } )
);
geometries.update( planeMesh.geometry );
}
planeMesh.material.map = background;
// TODO Push this to renderList
renderer.renderBufferDirect( planeCamera, null, planeMesh.geometry, planeMesh.material, planeMesh, null );
}
}
function setClear( color, alpha ) {
state.buffers.color.setClear( color.r, color.g, color.b, alpha, premultipliedAlpha );
}
return {
getClearColor: function () {
return clearColor;
},
setClearColor: function ( color, alpha ) {
clearColor.set( color );
clearAlpha = alpha !== undefined ? alpha : 1;
setClear( clearColor, clearAlpha );
},
getClearAlpha: function () {
return clearAlpha;
},
setClearAlpha: function ( alpha ) {
clearAlpha = alpha;
setClear( clearColor, clearAlpha );
},
render: render
};
}
/**
* @author mrdoob / http://mrdoob.com/
*/
function WebGLBufferRenderer( gl, extensions, info ) {
var mode;
function setMode( value ) {
mode = value;
}
function render( start, count ) {
gl.drawArrays( mode, start, count );
info.update( count, mode );
}
function renderInstances( geometry, start, count ) {
var extension = extensions.get( 'ANGLE_instanced_arrays' );
if ( extension === null ) {
console.error( 'THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' );
return;
}
var position = geometry.attributes.position;
if ( position.isInterleavedBufferAttribute ) {
count = position.data.count;
extension.drawArraysInstancedANGLE( mode, 0, count, geometry.maxInstancedCount );
} else {
extension.drawArraysInstancedANGLE( mode, start, count, geometry.maxInstancedCount );
}
info.update( count, mode, geometry.maxInstancedCount );
}
//
this.setMode = setMode;
this.render = render;
this.renderInstances = renderInstances;
}
/**
* @author mrdoob / http://mrdoob.com/
*/
function WebGLCapabilities( gl, extensions, parameters ) {
var maxAnisotropy;
function getMaxAnisotropy() {
if ( maxAnisotropy !== undefined ) return maxAnisotropy;
var extension = extensions.get( 'EXT_texture_filter_anisotropic' );
if ( extension !== null ) {
maxAnisotropy = gl.getParameter( extension.MAX_TEXTURE_MAX_ANISOTROPY_EXT );
} else {
maxAnisotropy = 0;
}
return maxAnisotropy;
}
function getMaxPrecision( precision ) {
if ( precision === 'highp' ) {
if ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.HIGH_FLOAT ).precision > 0 &&
gl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.HIGH_FLOAT ).precision > 0 ) {
return 'highp';
}
precision = 'mediump';
}
if ( precision === 'mediump' ) {
if ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.MEDIUM_FLOAT ).precision > 0 &&
gl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.MEDIUM_FLOAT ).precision > 0 ) {
return 'mediump';
}
}
return 'lowp';
}
var precision = parameters.precision !== undefined ? parameters.precision : 'highp';
var maxPrecision = getMaxPrecision( precision );
if ( maxPrecision !== precision ) {
console.warn( 'THREE.WebGLRenderer:', precision, 'not supported, using', maxPrecision, 'instead.' );
precision = maxPrecision;
}
var logarithmicDepthBuffer = parameters.logarithmicDepthBuffer === true;
var maxTextures = gl.getParameter( gl.MAX_TEXTURE_IMAGE_UNITS );
var maxVertexTextures = gl.getParameter( gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS );
var maxTextureSize = gl.getParameter( gl.MAX_TEXTURE_SIZE );
var maxCubemapSize = gl.getParameter( gl.MAX_CUBE_MAP_TEXTURE_SIZE );
var maxAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS );
var maxVertexUniforms = gl.getParameter( gl.MAX_VERTEX_UNIFORM_VECTORS );
var maxVaryings = gl.getParameter( gl.MAX_VARYING_VECTORS );
var maxFragmentUniforms = gl.getParameter( gl.MAX_FRAGMENT_UNIFORM_VECTORS );
var vertexTextures = maxVertexTextures > 0;
var floatFragmentTextures = !! extensions.get( 'OES_texture_float' );
var floatVertexTextures = vertexTextures && floatFragmentTextures;
return {
getMaxAnisotropy: getMaxAnisotropy,
getMaxPrecision: getMaxPrecision,
precision: precision,
logarithmicDepthBuffer: logarithmicDepthBuffer,
maxTextures: maxTextures,
maxVertexTextures: maxVertexTextures,
maxTextureSize: maxTextureSize,
maxCubemapSize: maxCubemapSize,
maxAttributes: maxAttributes,
maxVertexUniforms: maxVertexUniforms,
maxVaryings: maxVaryings,
maxFragmentUniforms: maxFragmentUniforms,
vertexTextures: vertexTextures,
floatFragmentTextures: floatFragmentTextures,
floatVertexTextures: floatVertexTextures
};
}
/**
* @author tschw
*/
function WebGLClipping() {
var scope = this,
globalState = null,
numGlobalPlanes = 0,
localClippingEnabled = false,
renderingShadows = false,
plane = new Plane(),
viewNormalMatrix = new Matrix3(),
uniform = { value: null, needsUpdate: false };
this.uniform = uniform;
this.numPlanes = 0;
this.numIntersection = 0;
this.init = function ( planes, enableLocalClipping, camera ) {
var enabled =
planes.length !== 0 ||
enableLocalClipping ||
// enable state of previous frame - the clipping code has to
// run another frame in order to reset the state:
numGlobalPlanes !== 0 ||
localClippingEnabled;
localClippingEnabled = enableLocalClipping;
globalState = projectPlanes( planes, camera, 0 );
numGlobalPlanes = planes.length;
return enabled;
};
this.beginShadows = function () {
renderingShadows = true;
projectPlanes( null );
};
this.endShadows = function () {
renderingShadows = false;
resetGlobalState();
};
this.setState = function ( planes, clipIntersection, clipShadows, camera, cache, fromCache ) {
if ( ! localClippingEnabled || planes === null || planes.length === 0 || renderingShadows && ! clipShadows ) {
// there's no local clipping
if ( renderingShadows ) {
// there's no global clipping
projectPlanes( null );
} else {
resetGlobalState();
}
} else {
var nGlobal = renderingShadows ? 0 : numGlobalPlanes,
lGlobal = nGlobal * 4,
dstArray = cache.clippingState || null;
uniform.value = dstArray; // ensure unique state
dstArray = projectPlanes( planes, camera, lGlobal, fromCache );
for ( var i = 0; i !== lGlobal; ++ i ) {
dstArray[ i ] = globalState[ i ];
}
cache.clippingState = dstArray;
this.numIntersection = clipIntersection ? this.numPlanes : 0;
this.numPlanes += nGlobal;
}
};
function resetGlobalState() {
if ( uniform.value !== globalState ) {
uniform.value = globalState;
uniform.needsUpdate = numGlobalPlanes > 0;
}
scope.numPlanes = numGlobalPlanes;
scope.numIntersection = 0;
}
function projectPlanes( planes, camera, dstOffset, skipTransform ) {
var nPlanes = planes !== null ? planes.length : 0,
dstArray = null;
if ( nPlanes !== 0 ) {
dstArray = uniform.value;
if ( skipTransform !== true || dstArray === null ) {
var flatSize = dstOffset + nPlanes * 4,
viewMatrix = camera.matrixWorldInverse;
viewNormalMatrix.getNormalMatrix( viewMatrix );
if ( dstArray === null || dstArray.length < flatSize ) {
dstArray = new Float32Array( flatSize );
}
for ( var i = 0, i4 = dstOffset; i !== nPlanes; ++ i, i4 += 4 ) {
plane.copy( planes[ i ] ).applyMatrix4( viewMatrix, viewNormalMatrix );
plane.normal.toArray( dstArray, i4 );
dstArray[ i4 + 3 ] = plane.constant;
}
}
uniform.value = dstArray;
uniform.needsUpdate = true;
}
scope.numPlanes = nPlanes;
return dstArray;
}
}
/**
* @author mrdoob / http://mrdoob.com/
*/
function WebGLExtensions( gl ) {
var extensions = {};
return {
get: function ( name ) {
if ( extensions[ name ] !== undefined ) {
return extensions[ name ];
}
var extension;
switch ( name ) {
case 'WEBGL_depth_texture':
extension = gl.getExtension( 'WEBGL_depth_texture' ) || gl.getExtension( 'MOZ_WEBGL_depth_texture' ) || gl.getExtension( 'WEBKIT_WEBGL_depth_texture' );
break;
case 'EXT_texture_filter_anisotropic':
extension = gl.getExtension( 'EXT_texture_filter_anisotropic' ) || gl.getExtension( 'MOZ_EXT_texture_filter_anisotropic' ) || gl.getExtension( 'WEBKIT_EXT_texture_filter_anisotropic' );
break;
case 'WEBGL_compressed_texture_s3tc':
extension = gl.getExtension( 'WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'MOZ_WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_s3tc' );
break;
case 'WEBGL_compressed_texture_pvrtc':
extension = gl.getExtension( 'WEBGL_compressed_texture_pvrtc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_pvrtc' );
break;
default:
extension = gl.getExtension( name );
}
if ( extension === null ) {
console.warn( 'THREE.WebGLRenderer: ' + name + ' extension not supported.' );
}
extensions[ name ] = extension;
return extension;
}
};
}
/**
* @author mrdoob / http://mrdoob.com/
*/
function WebGLGeometries( gl, attributes, info ) {
var geometries = {};
var wireframeAttributes = {};
function onGeometryDispose( event ) {
var geometry = event.target;
var buffergeometry = geometries[ geometry.id ];
if ( buffergeometry.index !== null ) {
attributes.remove( buffergeometry.index );
}
for ( var name in buffergeometry.attributes ) {
attributes.remove( buffergeometry.attributes[ name ] );
}
geometry.removeEventListener( 'dispose', onGeometryDispose );
delete geometries[ geometry.id ];
// TODO Remove duplicate code
var attribute = wireframeAttributes[ geometry.id ];
if ( attribute ) {
attributes.remove( attribute );
delete wireframeAttributes[ geometry.id ];
}
attribute = wireframeAttributes[ buffergeometry.id ];
if ( attribute ) {
attributes.remove( attribute );
delete wireframeAttributes[ buffergeometry.id ];
}
//
info.memory.geometries --;
}
function get( object, geometry ) {
var buffergeometry = geometries[ geometry.id ];
if ( buffergeometry ) return buffergeometry;
geometry.addEventListener( 'dispose', onGeometryDispose );
if ( geometry.isBufferGeometry ) {
buffergeometry = geometry;
} else if ( geometry.isGeometry ) {
if ( geometry._bufferGeometry === undefined ) {
geometry._bufferGeometry = new BufferGeometry().setFromObject( object );
}
buffergeometry = geometry._bufferGeometry;
}
geometries[ geometry.id ] = buffergeometry;
info.memory.geometries ++;
return buffergeometry;
}
function update( geometry ) {
var index = geometry.index;
var geometryAttributes = geometry.attributes;
if ( index !== null ) {
attributes.update( index, gl.ELEMENT_ARRAY_BUFFER );
}
for ( var name in geometryAttributes ) {
attributes.update( geometryAttributes[ name ], gl.ARRAY_BUFFER );
}
// morph targets
var morphAttributes = geometry.morphAttributes;
for ( var name in morphAttributes ) {
var array = morphAttributes[ name ];
for ( var i = 0, l = array.length; i < l; i ++ ) {
attributes.update( array[ i ], gl.ARRAY_BUFFER );
}
}
}
function getWireframeAttribute( geometry ) {
var attribute = wireframeAttributes[ geometry.id ];
if ( attribute ) return attribute;
var indices = [];
var geometryIndex = geometry.index;
var geometryAttributes = geometry.attributes;
// console.time( 'wireframe' );
if ( geometryIndex !== null ) {
var array = geometryIndex.array;
for ( var i = 0, l = array.length; i < l; i += 3 ) {
var a = array[ i + 0 ];
var b = array[ i + 1 ];
var c = array[ i + 2 ];
indices.push( a, b, b, c, c, a );
}
} else {
var array = geometryAttributes.position.array;
for ( var i = 0, l = ( array.length / 3 ) - 1; i < l; i += 3 ) {
var a = i + 0;
var b = i + 1;
var c = i + 2;
indices.push( a, b, b, c, c, a );
}
}
// console.timeEnd( 'wireframe' );
attribute = new ( arrayMax( indices ) > 65535 ? Uint32BufferAttribute : Uint16BufferAttribute )( indices, 1 );
attributes.update( attribute, gl.ELEMENT_ARRAY_BUFFER );
wireframeAttributes[ geometry.id ] = attribute;
return attribute;
}
return {
get: get,
update: update,
getWireframeAttribute: getWireframeAttribute
};
}
/**
* @author mrdoob / http://mrdoob.com/
*/
function WebGLIndexedBufferRenderer( gl, extensions, info ) {
var mode;
function setMode( value ) {
mode = value;
}
var type, bytesPerElement;
function setIndex( value ) {
type = value.type;
bytesPerElement = value.bytesPerElement;
}
function render( start, count ) {
gl.drawElements( mode, count, type, start * bytesPerElement );
info.update( count, mode );
}
function renderInstances( geometry, start, count ) {
var extension = extensions.get( 'ANGLE_instanced_arrays' );
if ( extension === null ) {
console.error( 'THREE.WebGLIndexedBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' );
return;
}
extension.drawElementsInstancedANGLE( mode, count, type, start * bytesPerElement, geometry.maxInstancedCount );
info.update( count, mode, geometry.maxInstancedCount );
}
//
this.setMode = setMode;
this.setIndex = setIndex;
this.render = render;
this.renderInstances = renderInstances;
}
/**
* @author Mugen87 / https://github.com/Mugen87
*/
function WebGLInfo( gl ) {
var memory = {
geometries: 0,
textures: 0
};
var render = {
frame: 0,
calls: 0,
triangles: 0,
points: 0,
lines: 0
};
function update( count, mode, instanceCount ) {
instanceCount = instanceCount || 1;
render.calls ++;
switch ( mode ) {
case gl.TRIANGLES:
render.triangles += instanceCount * ( count / 3 );
break;
case gl.TRIANGLE_STRIP:
case gl.TRIANGLE_FAN:
render.triangles += instanceCount * ( count - 2 );
break;
case gl.LINES:
render.lines += instanceCount * ( count / 2 );
break;
case gl.LINE_STRIP:
render.lines += instanceCount * ( count - 1 );
break;
case gl.LINE_LOOP:
render.lines += instanceCount * count;
break;
case gl.POINTS:
render.points += instanceCount * count;
break;
default:
console.error( 'THREE.WebGLInfo: Unknown draw mode:', mode );
break;
}
}
function reset() {
render.frame ++;
render.calls = 0;
render.triangles = 0;
render.points = 0;
render.lines = 0;
}
return {
memory: memory,
render: render,
programs: null,
autoReset: true,
reset: reset,
update: update
};
}
/**
* @author mrdoob / http://mrdoob.com/
*/
function absNumericalSort( a, b ) {
return Math.abs( b[ 1 ] ) - Math.abs( a[ 1 ] );
}
function WebGLMorphtargets( gl ) {
var influencesList = {};
var morphInfluences = new Float32Array( 8 );
function update( object, geometry, material, program ) {
var objectInfluences = object.morphTargetInfluences;
var length = objectInfluences.length;
var influences = influencesList[ geometry.id ];
if ( influences === undefined ) {
// initialise list
influences = [];
for ( var i = 0; i < length; i ++ ) {
influences[ i ] = [ i, 0 ];
}
influencesList[ geometry.id ] = influences;
}
var morphTargets = material.morphTargets && geometry.morphAttributes.position;
var morphNormals = material.morphNormals && geometry.morphAttributes.normal;
// Remove current morphAttributes
for ( var i = 0; i < length; i ++ ) {
var influence = influences[ i ];
if ( influence[ 1 ] !== 0 ) {
if ( morphTargets ) geometry.removeAttribute( 'morphTarget' + i );
if ( morphNormals ) geometry.removeAttribute( 'morphNormal' + i );
}
}
// Collect influences
for ( var i = 0; i < length; i ++ ) {
var influence = influences[ i ];
influence[ 0 ] = i;
influence[ 1 ] = objectInfluences[ i ];
}
influences.sort( absNumericalSort );
// Add morphAttributes
for ( var i = 0; i < 8; i ++ ) {
var influence = influences[ i ];
if ( influence ) {
var index = influence[ 0 ];
var value = influence[ 1 ];
if ( value ) {
if ( morphTargets ) geometry.addAttribute( 'morphTarget' + i, morphTargets[ index ] );
if ( morphNormals ) geometry.addAttribute( 'morphNormal' + i, morphNormals[ index ] );
morphInfluences[ i ] = value;
continue;
}
}
morphInfluences[ i ] = 0;
}
program.getUniforms().setValue( gl, 'morphTargetInfluences', morphInfluences );
}
return {
update: update
};
}
/**
* @author mrdoob / http://mrdoob.com/
*/
function WebGLObjects( geometries, info ) {
var updateList = {};
function update( object ) {
var frame = info.render.frame;
var geometry = object.geometry;
var buffergeometry = geometries.get( object, geometry );
// Update once per frame
if ( updateList[ buffergeometry.id ] !== frame ) {
if ( geometry.isGeometry ) {
buffergeometry.updateFromObject( object );
}
geometries.update( buffergeometry );
updateList[ buffergeometry.id ] = frame;
}
return buffergeometry;
}
function dispose() {
updateList = {};
}
return {
update: update,
dispose: dispose
};
}
/**
* @author mrdoob / http://mrdoob.com/
*/
function CubeTexture( images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ) {
images = images !== undefined ? images : [];
mapping = mapping !== undefined ? mapping : CubeReflectionMapping;
Texture.call( this, images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding );
this.flipY = false;
}
CubeTexture.prototype = Object.create( Texture.prototype );
CubeTexture.prototype.constructor = CubeTexture;
CubeTexture.prototype.isCubeTexture = true;
Object.defineProperty( CubeTexture.prototype, 'images', {
get: function () {
return this.image;
},
set: function ( value ) {
this.image = value;
}
} );
/**
* @author tschw
*
* Uniforms of a program.
* Those form a tree structure with a special top-level container for the root,
* which you get by calling 'new WebGLUniforms( gl, program, renderer )'.
*
*
* Properties of inner nodes including the top-level container:
*
* .seq - array of nested uniforms
* .map - nested uniforms by name
*
*
* Methods of all nodes except the top-level container:
*
* .setValue( gl, value, [renderer] )
*
* uploads a uniform value(s)
* the 'renderer' parameter is needed for sampler uniforms
*
*
* Static methods of the top-level container (renderer factorizations):
*
* .upload( gl, seq, values, renderer )
*
* sets uniforms in 'seq' to 'values[id].value'
*
* .seqWithValue( seq, values ) : filteredSeq
*
* filters 'seq' entries with corresponding entry in values
*
*
* Methods of the top-level container (renderer factorizations):
*
* .setValue( gl, name, value )
*
* sets uniform with name 'name' to 'value'
*
* .set( gl, obj, prop )
*
* sets uniform from object and property with same name than uniform
*
* .setOptional( gl, obj, prop )
*
* like .set for an optional property of the object
*
*/
var emptyTexture = new Texture();
var emptyCubeTexture = new CubeTexture();
// --- Base for inner nodes (including the root) ---
function UniformContainer() {
this.seq = [];
this.map = {};
}
// --- Utilities ---
// Array Caches (provide typed arrays for temporary by size)
var arrayCacheF32 = [];
var arrayCacheI32 = [];
// Float32Array caches used for uploading Matrix uniforms
var mat4array = new Float32Array( 16 );
var mat3array = new Float32Array( 9 );
// Flattening for arrays of vectors and matrices
function flatten( array, nBlocks, blockSize ) {
var firstElem = array[ 0 ];
if ( firstElem <= 0 || firstElem > 0 ) return array;
// unoptimized: ! isNaN( firstElem )
// see http://jacksondunstan.com/articles/983
var n = nBlocks * blockSize,
r = arrayCacheF32[ n ];
if ( r === undefined ) {
r = new Float32Array( n );
arrayCacheF32[ n ] = r;
}
if ( nBlocks !== 0 ) {
firstElem.toArray( r, 0 );
for ( var i = 1, offset = 0; i !== nBlocks; ++ i ) {
offset += blockSize;
array[ i ].toArray( r, offset );
}
}
return r;
}
// Texture unit allocation
function allocTexUnits( renderer, n ) {
var r = arrayCacheI32[ n ];
if ( r === undefined ) {
r = new Int32Array( n );
arrayCacheI32[ n ] = r;
}
for ( var i = 0; i !== n; ++ i )
r[ i ] = renderer.allocTextureUnit();
return r;
}
// --- Setters ---
// Note: Defining these methods externally, because they come in a bunch
// and this way their names minify.
// Single scalar
function setValue1f( gl, v ) {
gl.uniform1f( this.addr, v );
}
function setValue1i( gl, v ) {
gl.uniform1i( this.addr, v );
}
// Single float vector (from flat array or THREE.VectorN)
function setValue2fv( gl, v ) {
if ( v.x === undefined ) {
gl.uniform2fv( this.addr, v );
} else {
gl.uniform2f( this.addr, v.x, v.y );
}
}
function setValue3fv( gl, v ) {
if ( v.x !== undefined ) {
gl.uniform3f( this.addr, v.x, v.y, v.z );
} else if ( v.r !== undefined ) {
gl.uniform3f( this.addr, v.r, v.g, v.b );
} else {
gl.uniform3fv( this.addr, v );
}
}
function setValue4fv( gl, v ) {
if ( v.x === undefined ) {
gl.uniform4fv( this.addr, v );
} else {
gl.uniform4f( this.addr, v.x, v.y, v.z, v.w );
}
}
// Single matrix (from flat array or MatrixN)
function setValue2fm( gl, v ) {
gl.uniformMatrix2fv( this.addr, false, v.elements || v );
}
function setValue3fm( gl, v ) {
if ( v.elements === undefined ) {
gl.uniformMatrix3fv( this.addr, false, v );
} else {
mat3array.set( v.elements );
gl.uniformMatrix3fv( this.addr, false, mat3array );
}
}
function setValue4fm( gl, v ) {
if ( v.elements === undefined ) {
gl.uniformMatrix4fv( this.addr, false, v );
} else {
mat4array.set( v.elements );
gl.uniformMatrix4fv( this.addr, false, mat4array );
}
}
// Single texture (2D / Cube)
function setValueT1( gl, v, renderer ) {
var unit = renderer.allocTextureUnit();
gl.uniform1i( this.addr, unit );
renderer.setTexture2D( v || emptyTexture, unit );
}
function setValueT6( gl, v, renderer ) {
var unit = renderer.allocTextureUnit();
gl.uniform1i( this.addr, unit );
renderer.setTextureCube( v || emptyCubeTexture, unit );
}
// Integer / Boolean vectors or arrays thereof (always flat arrays)
function setValue2iv( gl, v ) {
gl.uniform2iv( this.addr, v );
}
function setValue3iv( gl, v ) {
gl.uniform3iv( this.addr, v );
}
function setValue4iv( gl, v ) {
gl.uniform4iv( this.addr, v );
}
// Helper to pick the right setter for the singular case
function getSingularSetter( type ) {
switch ( type ) {
case 0x1406: return setValue1f; // FLOAT
case 0x8b50: return setValue2fv; // _VEC2
case 0x8b51: return setValue3fv; // _VEC3
case 0x8b52: return setValue4fv; // _VEC4
case 0x8b5a: return setValue2fm; // _MAT2
case 0x8b5b: return setValue3fm; // _MAT3
case 0x8b5c: return setValue4fm; // _MAT4
case 0x8b5e: case 0x8d66: return setValueT1; // SAMPLER_2D, SAMPLER_EXTERNAL_OES
case 0x8b60: return setValueT6; // SAMPLER_CUBE
case 0x1404: case 0x8b56: return setValue1i; // INT, BOOL
case 0x8b53: case 0x8b57: return setValue2iv; // _VEC2
case 0x8b54: case 0x8b58: return setValue3iv; // _VEC3
case 0x8b55: case 0x8b59: return setValue4iv; // _VEC4
}
}
// Array of scalars
function setValue1fv( gl, v ) {
gl.uniform1fv( this.addr, v );
}
function setValue1iv( gl, v ) {
gl.uniform1iv( this.addr, v );
}
// Array of vectors (flat or from THREE classes)
function setValueV2a( gl, v ) {
gl.uniform2fv( this.addr, flatten( v, this.size, 2 ) );
}
function setValueV3a( gl, v ) {
gl.uniform3fv( this.addr, flatten( v, this.size, 3 ) );
}
function setValueV4a( gl, v ) {
gl.uniform4fv( this.addr, flatten( v, this.size, 4 ) );
}
// Array of matrices (flat or from THREE clases)
function setValueM2a( gl, v ) {
gl.uniformMatrix2fv( this.addr, false, flatten( v, this.size, 4 ) );
}
function setValueM3a( gl, v ) {
gl.uniformMatrix3fv( this.addr, false, flatten( v, this.size, 9 ) );
}
function setValueM4a( gl, v ) {
gl.uniformMatrix4fv( this.addr, false, flatten( v, this.size, 16 ) );
}
// Array of textures (2D / Cube)
function setValueT1a( gl, v, renderer ) {
var n = v.length,
units = allocTexUnits( renderer, n );
gl.uniform1iv( this.addr, units );
for ( var i = 0; i !== n; ++ i ) {
renderer.setTexture2D( v[ i ] || emptyTexture, units[ i ] );
}
}
function setValueT6a( gl, v, renderer ) {
var n = v.length,
units = allocTexUnits( renderer, n );
gl.uniform1iv( this.addr, units );
for ( var i = 0; i !== n; ++ i ) {
renderer.setTextureCube( v[ i ] || emptyCubeTexture, units[ i ] );
}
}
// Helper to pick the right setter for a pure (bottom-level) array
function getPureArraySetter( type ) {
switch ( type ) {
case 0x1406: return setValue1fv; // FLOAT
case 0x8b50: return setValueV2a; // _VEC2
case 0x8b51: return setValueV3a; // _VEC3
case 0x8b52: return setValueV4a; // _VEC4
case 0x8b5a: return setValueM2a; // _MAT2
case 0x8b5b: return setValueM3a; // _MAT3
case 0x8b5c: return setValueM4a; // _MAT4
case 0x8b5e: return setValueT1a; // SAMPLER_2D
case 0x8b60: return setValueT6a; // SAMPLER_CUBE
case 0x1404: case 0x8b56: return setValue1iv; // INT, BOOL
case 0x8b53: case 0x8b57: return setValue2iv; // _VEC2
case 0x8b54: case 0x8b58: return setValue3iv; // _VEC3
case 0x8b55: case 0x8b59: return setValue4iv; // _VEC4
}
}
// --- Uniform Classes ---
function SingleUniform( id, activeInfo, addr ) {
this.id = id;
this.addr = addr;
this.setValue = getSingularSetter( activeInfo.type );
// this.path = activeInfo.name; // DEBUG
}
function PureArrayUniform( id, activeInfo, addr ) {
this.id = id;
this.addr = addr;
this.size = activeInfo.size;
this.setValue = getPureArraySetter( activeInfo.type );
// this.path = activeInfo.name; // DEBUG
}
function StructuredUniform( id ) {
this.id = id;
UniformContainer.call( this ); // mix-in
}
StructuredUniform.prototype.setValue = function ( gl, value ) {
// Note: Don't need an extra 'renderer' parameter, since samplers
// are not allowed in structured uniforms.
var seq = this.seq;
for ( var i = 0, n = seq.length; i !== n; ++ i ) {
var u = seq[ i ];
u.setValue( gl, value[ u.id ] );
}
};
// --- Top-level ---
// Parser - builds up the property tree from the path strings
var RePathPart = /([\w\d_]+)(\])?(\[|\.)?/g;
// extracts
// - the identifier (member name or array index)
// - followed by an optional right bracket (found when array index)
// - followed by an optional left bracket or dot (type of subscript)
//
// Note: These portions can be read in a non-overlapping fashion and
// allow straightforward parsing of the hierarchy that WebGL encodes
// in the uniform names.
function addUniform( container, uniformObject ) {
container.seq.push( uniformObject );
container.map[ uniformObject.id ] = uniformObject;
}
function parseUniform( activeInfo, addr, container ) {
var path = activeInfo.name,
pathLength = path.length;
// reset RegExp object, because of the early exit of a previous run
RePathPart.lastIndex = 0;
for ( ; ; ) {
var match = RePathPart.exec( path ),
matchEnd = RePathPart.lastIndex,
id = match[ 1 ],
idIsIndex = match[ 2 ] === ']',
subscript = match[ 3 ];
if ( idIsIndex ) id = id | 0; // convert to integer
if ( subscript === undefined || subscript === '[' && matchEnd + 2 === pathLength ) {
// bare name or "pure" bottom-level array "[0]" suffix
addUniform( container, subscript === undefined ?
new SingleUniform( id, activeInfo, addr ) :
new PureArrayUniform( id, activeInfo, addr ) );
break;
} else {
// step into inner node / create it in case it doesn't exist
var map = container.map, next = map[ id ];
if ( next === undefined ) {
next = new StructuredUniform( id );
addUniform( container, next );
}
container = next;
}
}
}
// Root Container
function WebGLUniforms( gl, program, renderer ) {
UniformContainer.call( this );
this.renderer = renderer;
var n = gl.getProgramParameter( program, gl.ACTIVE_UNIFORMS );
for ( var i = 0; i < n; ++ i ) {
var info = gl.getActiveUniform( program, i ),
addr = gl.getUniformLocation( program, info.name );
parseUniform( info, addr, this );
}
}
WebGLUniforms.prototype.setValue = function ( gl, name, value ) {
var u = this.map[ name ];
if ( u !== undefined ) u.setValue( gl, value, this.renderer );
};
WebGLUniforms.prototype.setOptional = function ( gl, object, name ) {
var v = object[ name ];
if ( v !== undefined ) this.setValue( gl, name, v );
};
// Static interface
WebGLUniforms.upload = function ( gl, seq, values, renderer ) {
for ( var i = 0, n = seq.length; i !== n; ++ i ) {
var u = seq[ i ],
v = values[ u.id ];
if ( v.needsUpdate !== false ) {
// note: always updating when .needsUpdate is undefined
u.setValue( gl, v.value, renderer );
}
}
};
WebGLUniforms.seqWithValue = function ( seq, values ) {
var r = [];
for ( var i = 0, n = seq.length; i !== n; ++ i ) {
var u = seq[ i ];
if ( u.id in values ) r.push( u );
}
return r;
};
/**
* @author mrdoob / http://mrdoob.com/
*/
function addLineNumbers( string ) {
var lines = string.split( '\n' );
for ( var i = 0; i < lines.length; i ++ ) {
lines[ i ] = ( i + 1 ) + ': ' + lines[ i ];
}
return lines.join( '\n' );
}
function WebGLShader( gl, type, string ) {
var shader = gl.createShader( type );
gl.shaderSource( shader, string );
gl.compileShader( shader );
if ( gl.getShaderParameter( shader, gl.COMPILE_STATUS ) === false ) {
console.error( 'THREE.WebGLShader: Shader couldn\'t compile.' );
}
if ( gl.getShaderInfoLog( shader ) !== '' ) {
console.warn( 'THREE.WebGLShader: gl.getShaderInfoLog()', type === gl.VERTEX_SHADER ? 'vertex' : 'fragment', gl.getShaderInfoLog( shader ), addLineNumbers( string ) );
}
// --enable-privileged-webgl-extension
// console.log( type, gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( shader ) );
return shader;
}
/**
* @author mrdoob / http://mrdoob.com/
*/
var programIdCount = 0;
function getEncodingComponents( encoding ) {
switch ( encoding ) {
case LinearEncoding:
return [ 'Linear', '( value )' ];
case sRGBEncoding:
return [ 'sRGB', '( value )' ];
case RGBEEncoding:
return [ 'RGBE', '( value )' ];
case RGBM7Encoding:
return [ 'RGBM', '( value, 7.0 )' ];
case RGBM16Encoding:
return [ 'RGBM', '( value, 16.0 )' ];
case RGBDEncoding:
return [ 'RGBD', '( value, 256.0 )' ];
case GammaEncoding:
return [ 'Gamma', '( value, float( GAMMA_FACTOR ) )' ];
default:
throw new Error( 'unsupported encoding: ' + encoding );
}
}
function getTexelDecodingFunction( functionName, encoding ) {
var components = getEncodingComponents( encoding );
return 'vec4 ' + functionName + '( vec4 value ) { return ' + components[ 0 ] + 'ToLinear' + components[ 1 ] + '; }';
}
function getTexelEncodingFunction( functionName, encoding ) {
var components = getEncodingComponents( encoding );
return 'vec4 ' + functionName + '( vec4 value ) { return LinearTo' + components[ 0 ] + components[ 1 ] + '; }';
}
function getToneMappingFunction( functionName, toneMapping ) {
var toneMappingName;
switch ( toneMapping ) {
case LinearToneMapping:
toneMappingName = 'Linear';
break;
case ReinhardToneMapping:
toneMappingName = 'Reinhard';
break;
case Uncharted2ToneMapping:
toneMappingName = 'Uncharted2';
break;
case CineonToneMapping:
toneMappingName = 'OptimizedCineon';
break;
default:
throw new Error( 'unsupported toneMapping: ' + toneMapping );
}
return 'vec3 ' + functionName + '( vec3 color ) { return ' + toneMappingName + 'ToneMapping( color ); }';
}
function generateExtensions( extensions, parameters, rendererExtensions ) {
extensions = extensions || {};
var chunks = [
( extensions.derivatives || parameters.envMapCubeUV || parameters.bumpMap || parameters.normalMap || parameters.flatShading ) ? '#extension GL_OES_standard_derivatives : enable' : '',
( extensions.fragDepth || parameters.logarithmicDepthBuffer ) && rendererExtensions.get( 'EXT_frag_depth' ) ? '#extension GL_EXT_frag_depth : enable' : '',
( extensions.drawBuffers ) && rendererExtensions.get( 'WEBGL_draw_buffers' ) ? '#extension GL_EXT_draw_buffers : require' : '',
( extensions.shaderTextureLOD || parameters.envMap ) && rendererExtensions.get( 'EXT_shader_texture_lod' ) ? '#extension GL_EXT_shader_texture_lod : enable' : ''
];
return chunks.filter( filterEmptyLine ).join( '\n' );
}
function generateDefines( defines ) {
var chunks = [];
for ( var name in defines ) {
var value = defines[ name ];
if ( value === false ) continue;
chunks.push( '#define ' + name + ' ' + value );
}
return chunks.join( '\n' );
}
function fetchAttributeLocations( gl, program ) {
var attributes = {};
var n = gl.getProgramParameter( program, gl.ACTIVE_ATTRIBUTES );
for ( var i = 0; i < n; i ++ ) {
var info = gl.getActiveAttrib( program, i );
var name = info.name;
// console.log( 'THREE.WebGLProgram: ACTIVE VERTEX ATTRIBUTE:', name, i );
attributes[ name ] = gl.getAttribLocation( program, name );
}
return attributes;
}
function filterEmptyLine( string ) {
return string !== '';
}
function replaceLightNums( string, parameters ) {
return string
.replace( /NUM_DIR_LIGHTS/g, parameters.numDirLights )
.replace( /NUM_SPOT_LIGHTS/g, parameters.numSpotLights )
.replace( /NUM_RECT_AREA_LIGHTS/g, parameters.numRectAreaLights )
.replace( /NUM_POINT_LIGHTS/g, parameters.numPointLights )
.replace( /NUM_HEMI_LIGHTS/g, parameters.numHemiLights );
}
function replaceClippingPlaneNums( string, parameters ) {
return string
.replace( /NUM_CLIPPING_PLANES/g, parameters.numClippingPlanes )
.replace( /UNION_CLIPPING_PLANES/g, ( parameters.numClippingPlanes - parameters.numClipIntersection ) );
}
function parseIncludes( string ) {
var pattern = /^[ \t]*#include +<([\w\d.]+)>/gm;
function replace( match, include ) {
var replace = ShaderChunk[ include ];
if ( replace === undefined ) {
throw new Error( 'Can not resolve #include <' + include + '>' );
}
return parseIncludes( replace );
}
return string.replace( pattern, replace );
}
function unrollLoops( string ) {
var pattern = /#pragma unroll_loop[\s]+?for \( int i \= (\d+)\; i < (\d+)\; i \+\+ \) \{([\s\S]+?)(?=\})\}/g;
function replace( match, start, end, snippet ) {
var unroll = '';
for ( var i = parseInt( start ); i < parseInt( end ); i ++ ) {
unroll += snippet.replace( /\[ i \]/g, '[ ' + i + ' ]' );
}
return unroll;
}
return string.replace( pattern, replace );
}
function WebGLProgram( renderer, extensions, code, material, shader, parameters ) {
var gl = renderer.context;
var defines = material.defines;
var vertexShader = shader.vertexShader;
var fragmentShader = shader.fragmentShader;
var shadowMapTypeDefine = 'SHADOWMAP_TYPE_BASIC';
if ( parameters.shadowMapType === PCFShadowMap ) {
shadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF';
} else if ( parameters.shadowMapType === PCFSoftShadowMap ) {
shadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF_SOFT';
}
var envMapTypeDefine = 'ENVMAP_TYPE_CUBE';
var envMapModeDefine = 'ENVMAP_MODE_REFLECTION';
var envMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY';
if ( parameters.envMap ) {
switch ( material.envMap.mapping ) {
case CubeReflectionMapping:
case CubeRefractionMapping:
envMapTypeDefine = 'ENVMAP_TYPE_CUBE';
break;
case CubeUVReflectionMapping:
case CubeUVRefractionMapping:
envMapTypeDefine = 'ENVMAP_TYPE_CUBE_UV';
break;
case EquirectangularReflectionMapping:
case EquirectangularRefractionMapping:
envMapTypeDefine = 'ENVMAP_TYPE_EQUIREC';
break;
case SphericalReflectionMapping:
envMapTypeDefine = 'ENVMAP_TYPE_SPHERE';
break;
}
switch ( material.envMap.mapping ) {
case CubeRefractionMapping:
case EquirectangularRefractionMapping:
envMapModeDefine = 'ENVMAP_MODE_REFRACTION';
break;
}
switch ( material.combine ) {
case MultiplyOperation:
envMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY';
break;
case MixOperation:
envMapBlendingDefine = 'ENVMAP_BLENDING_MIX';
break;
case AddOperation:
envMapBlendingDefine = 'ENVMAP_BLENDING_ADD';
break;
}
}
var gammaFactorDefine = ( renderer.gammaFactor > 0 ) ? renderer.gammaFactor : 1.0;
// console.log( 'building new program ' );
//
var customExtensions = generateExtensions( material.extensions, parameters, extensions );
var customDefines = generateDefines( defines );
//
var program = gl.createProgram();
var prefixVertex, prefixFragment;
if ( material.isRawShaderMaterial ) {
prefixVertex = [
customDefines
].filter( filterEmptyLine ).join( '\n' );
if ( prefixVertex.length > 0 ) {
prefixVertex += '\n';
}
prefixFragment = [
customExtensions,
customDefines
].filter( filterEmptyLine ).join( '\n' );
if ( prefixFragment.length > 0 ) {
prefixFragment += '\n';
}
} else {
prefixVertex = [
'precision ' + parameters.precision + ' float;',
'precision ' + parameters.precision + ' int;',
'#define SHADER_NAME ' + shader.name,
customDefines,
parameters.supportsVertexTextures ? '#define VERTEX_TEXTURES' : '',
'#define GAMMA_FACTOR ' + gammaFactorDefine,
'#define MAX_BONES ' + parameters.maxBones,
( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '',
( parameters.useFog && parameters.fogExp ) ? '#define FOG_EXP2' : '',
parameters.map ? '#define USE_MAP' : '',
parameters.envMap ? '#define USE_ENVMAP' : '',
parameters.envMap ? '#define ' + envMapModeDefine : '',
parameters.lightMap ? '#define USE_LIGHTMAP' : '',
parameters.aoMap ? '#define USE_AOMAP' : '',
parameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',
parameters.bumpMap ? '#define USE_BUMPMAP' : '',
parameters.normalMap ? '#define USE_NORMALMAP' : '',
parameters.displacementMap && parameters.supportsVertexTextures ? '#define USE_DISPLACEMENTMAP' : '',
parameters.specularMap ? '#define USE_SPECULARMAP' : '',
parameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',
parameters.metalnessMap ? '#define USE_METALNESSMAP' : '',
parameters.alphaMap ? '#define USE_ALPHAMAP' : '',
parameters.vertexColors ? '#define USE_COLOR' : '',
parameters.flatShading ? '#define FLAT_SHADED' : '',
parameters.skinning ? '#define USE_SKINNING' : '',
parameters.useVertexTexture ? '#define BONE_TEXTURE' : '',
parameters.morphTargets ? '#define USE_MORPHTARGETS' : '',
parameters.morphNormals && parameters.flatShading === false ? '#define USE_MORPHNORMALS' : '',
parameters.doubleSided ? '#define DOUBLE_SIDED' : '',
parameters.flipSided ? '#define FLIP_SIDED' : '',
parameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '',
parameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '',
parameters.sizeAttenuation ? '#define USE_SIZEATTENUATION' : '',
parameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',
parameters.logarithmicDepthBuffer && extensions.get( 'EXT_frag_depth' ) ? '#define USE_LOGDEPTHBUF_EXT' : '',
'uniform mat4 modelMatrix;',
'uniform mat4 modelViewMatrix;',
'uniform mat4 projectionMatrix;',
'uniform mat4 viewMatrix;',
'uniform mat3 normalMatrix;',
'uniform vec3 cameraPosition;',
'attribute vec3 position;',
'attribute vec3 normal;',
'attribute vec2 uv;',
'#ifdef USE_COLOR',
' attribute vec3 color;',
'#endif',
'#ifdef USE_MORPHTARGETS',
' attribute vec3 morphTarget0;',
' attribute vec3 morphTarget1;',
' attribute vec3 morphTarget2;',
' attribute vec3 morphTarget3;',
' #ifdef USE_MORPHNORMALS',
' attribute vec3 morphNormal0;',
' attribute vec3 morphNormal1;',
' attribute vec3 morphNormal2;',
' attribute vec3 morphNormal3;',
' #else',
' attribute vec3 morphTarget4;',
' attribute vec3 morphTarget5;',
' attribute vec3 morphTarget6;',
' attribute vec3 morphTarget7;',
' #endif',
'#endif',
'#ifdef USE_SKINNING',
' attribute vec4 skinIndex;',
' attribute vec4 skinWeight;',
'#endif',
'\n'
].filter( filterEmptyLine ).join( '\n' );
prefixFragment = [
customExtensions,
'precision ' + parameters.precision + ' float;',
'precision ' + parameters.precision + ' int;',
'#define SHADER_NAME ' + shader.name,
customDefines,
parameters.alphaTest ? '#define ALPHATEST ' + parameters.alphaTest : '',
'#define GAMMA_FACTOR ' + gammaFactorDefine,
( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '',
( parameters.useFog && parameters.fogExp ) ? '#define FOG_EXP2' : '',
parameters.map ? '#define USE_MAP' : '',
parameters.envMap ? '#define USE_ENVMAP' : '',
parameters.envMap ? '#define ' + envMapTypeDefine : '',
parameters.envMap ? '#define ' + envMapModeDefine : '',
parameters.envMap ? '#define ' + envMapBlendingDefine : '',
parameters.lightMap ? '#define USE_LIGHTMAP' : '',
parameters.aoMap ? '#define USE_AOMAP' : '',
parameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',
parameters.bumpMap ? '#define USE_BUMPMAP' : '',
parameters.normalMap ? '#define USE_NORMALMAP' : '',
parameters.specularMap ? '#define USE_SPECULARMAP' : '',
parameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',
parameters.metalnessMap ? '#define USE_METALNESSMAP' : '',
parameters.alphaMap ? '#define USE_ALPHAMAP' : '',
parameters.vertexColors ? '#define USE_COLOR' : '',
parameters.gradientMap ? '#define USE_GRADIENTMAP' : '',
parameters.flatShading ? '#define FLAT_SHADED' : '',
parameters.doubleSided ? '#define DOUBLE_SIDED' : '',
parameters.flipSided ? '#define FLIP_SIDED' : '',
parameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '',
parameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '',
parameters.premultipliedAlpha ? '#define PREMULTIPLIED_ALPHA' : '',
parameters.physicallyCorrectLights ? '#define PHYSICALLY_CORRECT_LIGHTS' : '',
parameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',
parameters.logarithmicDepthBuffer && extensions.get( 'EXT_frag_depth' ) ? '#define USE_LOGDEPTHBUF_EXT' : '',
parameters.envMap && extensions.get( 'EXT_shader_texture_lod' ) ? '#define TEXTURE_LOD_EXT' : '',
'uniform mat4 viewMatrix;',
'uniform vec3 cameraPosition;',
( parameters.toneMapping !== NoToneMapping ) ? '#define TONE_MAPPING' : '',
( parameters.toneMapping !== NoToneMapping ) ? ShaderChunk[ 'tonemapping_pars_fragment' ] : '', // this code is required here because it is used by the toneMapping() function defined below
( parameters.toneMapping !== NoToneMapping ) ? getToneMappingFunction( 'toneMapping', parameters.toneMapping ) : '',
parameters.dithering ? '#define DITHERING' : '',
( parameters.outputEncoding || parameters.mapEncoding || parameters.envMapEncoding || parameters.emissiveMapEncoding ) ? ShaderChunk[ 'encodings_pars_fragment' ] : '', // this code is required here because it is used by the various encoding/decoding function defined below
parameters.mapEncoding ? getTexelDecodingFunction( 'mapTexelToLinear', parameters.mapEncoding ) : '',
parameters.envMapEncoding ? getTexelDecodingFunction( 'envMapTexelToLinear', parameters.envMapEncoding ) : '',
parameters.emissiveMapEncoding ? getTexelDecodingFunction( 'emissiveMapTexelToLinear', parameters.emissiveMapEncoding ) : '',
parameters.outputEncoding ? getTexelEncodingFunction( 'linearToOutputTexel', parameters.outputEncoding ) : '',
parameters.depthPacking ? '#define DEPTH_PACKING ' + material.depthPacking : '',
'\n'
].filter( filterEmptyLine ).join( '\n' );
}
vertexShader = parseIncludes( vertexShader );
vertexShader = replaceLightNums( vertexShader, parameters );
vertexShader = replaceClippingPlaneNums( vertexShader, parameters );
fragmentShader = parseIncludes( fragmentShader );
fragmentShader = replaceLightNums( fragmentShader, parameters );
fragmentShader = replaceClippingPlaneNums( fragmentShader, parameters );
vertexShader = unrollLoops( vertexShader );
fragmentShader = unrollLoops( fragmentShader );
var vertexGlsl = prefixVertex + vertexShader;
var fragmentGlsl = prefixFragment + fragmentShader;
// console.log( '*VERTEX*', vertexGlsl );
// console.log( '*FRAGMENT*', fragmentGlsl );
var glVertexShader = WebGLShader( gl, gl.VERTEX_SHADER, vertexGlsl );
var glFragmentShader = WebGLShader( gl, gl.FRAGMENT_SHADER, fragmentGlsl );
gl.attachShader( program, glVertexShader );
gl.attachShader( program, glFragmentShader );
// Force a particular attribute to index 0.
if ( material.index0AttributeName !== undefined ) {
gl.bindAttribLocation( program, 0, material.index0AttributeName );
} else if ( parameters.morphTargets === true ) {
// programs with morphTargets displace position out of attribute 0
gl.bindAttribLocation( program, 0, 'position' );
}
gl.linkProgram( program );
var programLog = gl.getProgramInfoLog( program ).trim();
var vertexLog = gl.getShaderInfoLog( glVertexShader ).trim();
var fragmentLog = gl.getShaderInfoLog( glFragmentShader ).trim();
var runnable = true;
var haveDiagnostics = true;
// console.log( '**VERTEX**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( glVertexShader ) );
// console.log( '**FRAGMENT**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( glFragmentShader ) );
if ( gl.getProgramParameter( program, gl.LINK_STATUS ) === false ) {
runnable = false;
console.error( 'THREE.WebGLProgram: shader error: ', gl.getError(), 'gl.VALIDATE_STATUS', gl.getProgramParameter( program, gl.VALIDATE_STATUS ), 'gl.getProgramInfoLog', programLog, vertexLog, fragmentLog );
} else if ( programLog !== '' ) {
console.warn( 'THREE.WebGLProgram: gl.getProgramInfoLog()', programLog );
} else if ( vertexLog === '' || fragmentLog === '' ) {
haveDiagnostics = false;
}
if ( haveDiagnostics ) {
this.diagnostics = {
runnable: runnable,
material: material,
programLog: programLog,
vertexShader: {
log: vertexLog,
prefix: prefixVertex
},
fragmentShader: {
log: fragmentLog,
prefix: prefixFragment
}
};
}
// clean up
gl.deleteShader( glVertexShader );
gl.deleteShader( glFragmentShader );
// set up caching for uniform locations
var cachedUniforms;
this.getUniforms = function () {
if ( cachedUniforms === undefined ) {
cachedUniforms = new WebGLUniforms( gl, program, renderer );
}
return cachedUniforms;
};
// set up caching for attribute locations
var cachedAttributes;
this.getAttributes = function () {
if ( cachedAttributes === undefined ) {
cachedAttributes = fetchAttributeLocations( gl, program );
}
return cachedAttributes;
};
// free resource
this.destroy = function () {
gl.deleteProgram( program );
this.program = undefined;
};
// DEPRECATED
Object.defineProperties( this, {
uniforms: {
get: function () {
console.warn( 'THREE.WebGLProgram: .uniforms is now .getUniforms().' );
return this.getUniforms();
}
},
attributes: {
get: function () {
console.warn( 'THREE.WebGLProgram: .attributes is now .getAttributes().' );
return this.getAttributes();
}
}
} );
//
this.name = shader.name;
this.id = programIdCount ++;
this.code = code;
this.usedTimes = 1;
this.program = program;
this.vertexShader = glVertexShader;
this.fragmentShader = glFragmentShader;
return this;
}
/**
* @author mrdoob / http://mrdoob.com/
*/
function WebGLPrograms( renderer, extensions, capabilities ) {
var programs = [];
var shaderIDs = {
MeshDepthMaterial: 'depth',
MeshDistanceMaterial: 'distanceRGBA',
MeshNormalMaterial: 'normal',
MeshBasicMaterial: 'basic',
MeshLambertMaterial: 'lambert',
MeshPhongMaterial: 'phong',
MeshToonMaterial: 'phong',
MeshStandardMaterial: 'physical',
MeshPhysicalMaterial: 'physical',
LineBasicMaterial: 'basic',
LineDashedMaterial: 'dashed',
PointsMaterial: 'points',
ShadowMaterial: 'shadow'
};
var parameterNames = [
"precision", "supportsVertexTextures", "map", "mapEncoding", "envMap", "envMapMode", "envMapEncoding",
"lightMap", "aoMap", "emissiveMap", "emissiveMapEncoding", "bumpMap", "normalMap", "displacementMap", "specularMap",
"roughnessMap", "metalnessMap", "gradientMap",
"alphaMap", "combine", "vertexColors", "fog", "useFog", "fogExp",
"flatShading", "sizeAttenuation", "logarithmicDepthBuffer", "skinning",
"maxBones", "useVertexTexture", "morphTargets", "morphNormals",
"maxMorphTargets", "maxMorphNormals", "premultipliedAlpha",
"numDirLights", "numPointLights", "numSpotLights", "numHemiLights", "numRectAreaLights",
"shadowMapEnabled", "shadowMapType", "toneMapping", 'physicallyCorrectLights',
"alphaTest", "doubleSided", "flipSided", "numClippingPlanes", "numClipIntersection", "depthPacking", "dithering"
];
function allocateBones( object ) {
var skeleton = object.skeleton;
var bones = skeleton.bones;
if ( capabilities.floatVertexTextures ) {
return 1024;
} else {
// default for when object is not specified
// ( for example when prebuilding shader to be used with multiple objects )
//
// - leave some extra space for other uniforms
// - limit here is ANGLE's 254 max uniform vectors
// (up to 54 should be safe)
var nVertexUniforms = capabilities.maxVertexUniforms;
var nVertexMatrices = Math.floor( ( nVertexUniforms - 20 ) / 4 );
var maxBones = Math.min( nVertexMatrices, bones.length );
if ( maxBones < bones.length ) {
console.warn( 'THREE.WebGLRenderer: Skeleton has ' + bones.length + ' bones. This GPU supports ' + maxBones + '.' );
return 0;
}
return maxBones;
}
}
function getTextureEncodingFromMap( map, gammaOverrideLinear ) {
var encoding;
if ( ! map ) {
encoding = LinearEncoding;
} else if ( map.isTexture ) {
encoding = map.encoding;
} else if ( map.isWebGLRenderTarget ) {
console.warn( "THREE.WebGLPrograms.getTextureEncodingFromMap: don't use render targets as textures. Use their .texture property instead." );
encoding = map.texture.encoding;
}
// add backwards compatibility for WebGLRenderer.gammaInput/gammaOutput parameter, should probably be removed at some point.
if ( encoding === LinearEncoding && gammaOverrideLinear ) {
encoding = GammaEncoding;
}
return encoding;
}
this.getParameters = function ( material, lights, shadows, fog, nClipPlanes, nClipIntersection, object ) {
var shaderID = shaderIDs[ material.type ];
// heuristics to create shader parameters according to lights in the scene
// (not to blow over maxLights budget)
var maxBones = object.isSkinnedMesh ? allocateBones( object ) : 0;
var precision = capabilities.precision;
if ( material.precision !== null ) {
precision = capabilities.getMaxPrecision( material.precision );
if ( precision !== material.precision ) {
console.warn( 'THREE.WebGLProgram.getParameters:', material.precision, 'not supported, using', precision, 'instead.' );
}
}
var currentRenderTarget = renderer.getRenderTarget();
var parameters = {
shaderID: shaderID,
precision: precision,
supportsVertexTextures: capabilities.vertexTextures,
outputEncoding: getTextureEncodingFromMap( ( ! currentRenderTarget ) ? null : currentRenderTarget.texture, renderer.gammaOutput ),
map: !! material.map,
mapEncoding: getTextureEncodingFromMap( material.map, renderer.gammaInput ),
envMap: !! material.envMap,
envMapMode: material.envMap && material.envMap.mapping,
envMapEncoding: getTextureEncodingFromMap( material.envMap, renderer.gammaInput ),
envMapCubeUV: ( !! material.envMap ) && ( ( material.envMap.mapping === CubeUVReflectionMapping ) || ( material.envMap.mapping === CubeUVRefractionMapping ) ),
lightMap: !! material.lightMap,
aoMap: !! material.aoMap,
emissiveMap: !! material.emissiveMap,
emissiveMapEncoding: getTextureEncodingFromMap( material.emissiveMap, renderer.gammaInput ),
bumpMap: !! material.bumpMap,
normalMap: !! material.normalMap,
displacementMap: !! material.displacementMap,
roughnessMap: !! material.roughnessMap,
metalnessMap: !! material.metalnessMap,
specularMap: !! material.specularMap,
alphaMap: !! material.alphaMap,
gradientMap: !! material.gradientMap,
combine: material.combine,
vertexColors: material.vertexColors,
fog: !! fog,
useFog: material.fog,
fogExp: ( fog && fog.isFogExp2 ),
flatShading: material.flatShading,
sizeAttenuation: material.sizeAttenuation,
logarithmicDepthBuffer: capabilities.logarithmicDepthBuffer,
skinning: material.skinning && maxBones > 0,
maxBones: maxBones,
useVertexTexture: capabilities.floatVertexTextures,
morphTargets: material.morphTargets,
morphNormals: material.morphNormals,
maxMorphTargets: renderer.maxMorphTargets,
maxMorphNormals: renderer.maxMorphNormals,
numDirLights: lights.directional.length,
numPointLights: lights.point.length,
numSpotLights: lights.spot.length,
numRectAreaLights: lights.rectArea.length,
numHemiLights: lights.hemi.length,
numClippingPlanes: nClipPlanes,
numClipIntersection: nClipIntersection,
dithering: material.dithering,
shadowMapEnabled: renderer.shadowMap.enabled && object.receiveShadow && shadows.length > 0,
shadowMapType: renderer.shadowMap.type,
toneMapping: renderer.toneMapping,
physicallyCorrectLights: renderer.physicallyCorrectLights,
premultipliedAlpha: material.premultipliedAlpha,
alphaTest: material.alphaTest,
doubleSided: material.side === DoubleSide,
flipSided: material.side === BackSide,
depthPacking: ( material.depthPacking !== undefined ) ? material.depthPacking : false
};
return parameters;
};
this.getProgramCode = function ( material, parameters ) {
var array = [];
if ( parameters.shaderID ) {
array.push( parameters.shaderID );
} else {
array.push( material.fragmentShader );
array.push( material.vertexShader );
}
if ( material.defines !== undefined ) {
for ( var name in material.defines ) {
array.push( name );
array.push( material.defines[ name ] );
}
}
for ( var i = 0; i < parameterNames.length; i ++ ) {
array.push( parameters[ parameterNames[ i ] ] );
}
array.push( material.onBeforeCompile.toString() );
array.push( renderer.gammaOutput );
return array.join();
};
this.acquireProgram = function ( material, shader, parameters, code ) {
var program;
// Check if code has been already compiled
for ( var p = 0, pl = programs.length; p < pl; p ++ ) {
var programInfo = programs[ p ];
if ( programInfo.code === code ) {
program = programInfo;
++ program.usedTimes;
break;
}
}
if ( program === undefined ) {
program = new WebGLProgram( renderer, extensions, code, material, shader, parameters );
programs.push( program );
}
return program;
};
this.releaseProgram = function ( program ) {
if ( -- program.usedTimes === 0 ) {
// Remove from unordered set
var i = programs.indexOf( program );
programs[ i ] = programs[ programs.length - 1 ];
programs.pop();
// Free WebGL resources
program.destroy();
}
};
// Exposed for resource monitoring & error feedback via renderer.info:
this.programs = programs;
}
/**
* @author fordacious / fordacious.github.io
*/
function WebGLProperties() {
var properties = new WeakMap();
function get( object ) {
var map = properties.get( object );
if ( map === undefined ) {
map = {};
properties.set( object, map );
}
return map;
}
function remove( object ) {
properties.delete( object );
}
function update( object, key, value ) {
properties.get( object )[ key ] = value;
}
function dispose() {
properties = new WeakMap();
}
return {
get: get,
remove: remove,
update: update,
dispose: dispose
};
}
/**
* @author mrdoob / http://mrdoob.com/
*/
function painterSortStable( a, b ) {
if ( a.renderOrder !== b.renderOrder ) {
return a.renderOrder - b.renderOrder;
} else if ( a.program && b.program && a.program !== b.program ) {
return a.program.id - b.program.id;
} else if ( a.material.id !== b.material.id ) {
return a.material.id - b.material.id;
} else if ( a.z !== b.z ) {
return a.z - b.z;
} else {
return a.id - b.id;
}
}
function reversePainterSortStable( a, b ) {
if ( a.renderOrder !== b.renderOrder ) {
return a.renderOrder - b.renderOrder;
} if ( a.z !== b.z ) {
return b.z - a.z;
} else {
return a.id - b.id;
}
}
function WebGLRenderList() {
var renderItems = [];
var renderItemsIndex = 0;
var opaque = [];
var transparent = [];
function init() {
renderItemsIndex = 0;
opaque.length = 0;
transparent.length = 0;
}
function push( object, geometry, material, z, group ) {
var renderItem = renderItems[ renderItemsIndex ];
if ( renderItem === undefined ) {
renderItem = {
id: object.id,
object: object,
geometry: geometry,
material: material,
program: material.program,
renderOrder: object.renderOrder,
z: z,
group: group
};
renderItems[ renderItemsIndex ] = renderItem;
} else {
renderItem.id = object.id;
renderItem.object = object;
renderItem.geometry = geometry;
renderItem.material = material;
renderItem.program = material.program;
renderItem.renderOrder = object.renderOrder;
renderItem.z = z;
renderItem.group = group;
}
( material.transparent === true ? transparent : opaque ).push( renderItem );
renderItemsIndex ++;
}
function sort() {
if ( opaque.length > 1 ) opaque.sort( painterSortStable );
if ( transparent.length > 1 ) transparent.sort( reversePainterSortStable );
}
return {
opaque: opaque,
transparent: transparent,
init: init,
push: push,
sort: sort
};
}
function WebGLRenderLists() {
var lists = {};
function get( scene, camera ) {
var hash = scene.id + ',' + camera.id;
var list = lists[ hash ];
if ( list === undefined ) {
// console.log( 'THREE.WebGLRenderLists:', hash );
list = new WebGLRenderList();
lists[ hash ] = list;
}
return list;
}
function dispose() {
lists = {};
}
return {
get: get,
dispose: dispose
};
}
/**
* @author mrdoob / http://mrdoob.com/
*/
function UniformsCache() {
var lights = {};
return {
get: function ( light ) {
if ( lights[ light.id ] !== undefined ) {
return lights[ light.id ];
}
var uniforms;
switch ( light.type ) {
case 'DirectionalLight':
uniforms = {
direction: new Vector3(),
color: new Color(),
shadow: false,
shadowBias: 0,
shadowRadius: 1,
shadowMapSize: new Vector2()
};
break;
case 'SpotLight':
uniforms = {
position: new Vector3(),
direction: new Vector3(),
color: new Color(),
distance: 0,
coneCos: 0,
penumbraCos: 0,
decay: 0,
shadow: false,
shadowBias: 0,
shadowRadius: 1,
shadowMapSize: new Vector2()
};
break;
case 'PointLight':
uniforms = {
position: new Vector3(),
color: new Color(),
distance: 0,
decay: 0,
shadow: false,
shadowBias: 0,
shadowRadius: 1,
shadowMapSize: new Vector2(),
shadowCameraNear: 1,
shadowCameraFar: 1000
};
break;
case 'HemisphereLight':
uniforms = {
direction: new Vector3(),
skyColor: new Color(),
groundColor: new Color()
};
break;
case 'RectAreaLight':
uniforms = {
color: new Color(),
position: new Vector3(),
halfWidth: new Vector3(),
halfHeight: new Vector3()
// TODO (abelnation): set RectAreaLight shadow uniforms
};
break;
}
lights[ light.id ] = uniforms;
return uniforms;
}
};
}
var count = 0;
function WebGLLights() {
var cache = new UniformsCache();
var state = {
id: count ++,
hash: '',
ambient: [ 0, 0, 0 ],
directional: [],
directionalShadowMap: [],
directionalShadowMatrix: [],
spot: [],
spotShadowMap: [],
spotShadowMatrix: [],
rectArea: [],
point: [],
pointShadowMap: [],
pointShadowMatrix: [],
hemi: []
};
var vector3 = new Vector3();
var matrix4 = new Matrix4();
var matrix42 = new Matrix4();
function setup( lights, shadows, camera ) {
var r = 0, g = 0, b = 0;
var directionalLength = 0;
var pointLength = 0;
var spotLength = 0;
var rectAreaLength = 0;
var hemiLength = 0;
var viewMatrix = camera.matrixWorldInverse;
for ( var i = 0, l = lights.length; i < l; i ++ ) {
var light = lights[ i ];
var color = light.color;
var intensity = light.intensity;
var distance = light.distance;
var shadowMap = ( light.shadow && light.shadow.map ) ? light.shadow.map.texture : null;
if ( light.isAmbientLight ) {
r += color.r * intensity;
g += color.g * intensity;
b += color.b * intensity;
} else if ( light.isDirectionalLight ) {
var uniforms = cache.get( light );
uniforms.color.copy( light.color ).multiplyScalar( light.intensity );
uniforms.direction.setFromMatrixPosition( light.matrixWorld );
vector3.setFromMatrixPosition( light.target.matrixWorld );
uniforms.direction.sub( vector3 );
uniforms.direction.transformDirection( viewMatrix );
uniforms.shadow = light.castShadow;
if ( light.castShadow ) {
var shadow = light.shadow;
uniforms.shadowBias = shadow.bias;
uniforms.shadowRadius = shadow.radius;
uniforms.shadowMapSize = shadow.mapSize;
}
state.directionalShadowMap[ directionalLength ] = shadowMap;
state.directionalShadowMatrix[ directionalLength ] = light.shadow.matrix;
state.directional[ directionalLength ] = uniforms;
directionalLength ++;
} else if ( light.isSpotLight ) {
var uniforms = cache.get( light );
uniforms.position.setFromMatrixPosition( light.matrixWorld );
uniforms.position.applyMatrix4( viewMatrix );
uniforms.color.copy( color ).multiplyScalar( intensity );
uniforms.distance = distance;
uniforms.direction.setFromMatrixPosition( light.matrixWorld );
vector3.setFromMatrixPosition( light.target.matrixWorld );
uniforms.direction.sub( vector3 );
uniforms.direction.transformDirection( viewMatrix );
uniforms.coneCos = Math.cos( light.angle );
uniforms.penumbraCos = Math.cos( light.angle * ( 1 - light.penumbra ) );
uniforms.decay = ( light.distance === 0 ) ? 0.0 : light.decay;
uniforms.shadow = light.castShadow;
if ( light.castShadow ) {
var shadow = light.shadow;
uniforms.shadowBias = shadow.bias;
uniforms.shadowRadius = shadow.radius;
uniforms.shadowMapSize = shadow.mapSize;
}
state.spotShadowMap[ spotLength ] = shadowMap;
state.spotShadowMatrix[ spotLength ] = light.shadow.matrix;
state.spot[ spotLength ] = uniforms;
spotLength ++;
} else if ( light.isRectAreaLight ) {
var uniforms = cache.get( light );
// (a) intensity is the total visible light emitted
//uniforms.color.copy( color ).multiplyScalar( intensity / ( light.width * light.height * Math.PI ) );
// (b) intensity is the brightness of the light
uniforms.color.copy( color ).multiplyScalar( intensity );
uniforms.position.setFromMatrixPosition( light.matrixWorld );
uniforms.position.applyMatrix4( viewMatrix );
// extract local rotation of light to derive width/height half vectors
matrix42.identity();
matrix4.copy( light.matrixWorld );
matrix4.premultiply( viewMatrix );
matrix42.extractRotation( matrix4 );
uniforms.halfWidth.set( light.width * 0.5, 0.0, 0.0 );
uniforms.halfHeight.set( 0.0, light.height * 0.5, 0.0 );
uniforms.halfWidth.applyMatrix4( matrix42 );
uniforms.halfHeight.applyMatrix4( matrix42 );
// TODO (abelnation): RectAreaLight distance?
// uniforms.distance = distance;
state.rectArea[ rectAreaLength ] = uniforms;
rectAreaLength ++;
} else if ( light.isPointLight ) {
var uniforms = cache.get( light );
uniforms.position.setFromMatrixPosition( light.matrixWorld );
uniforms.position.applyMatrix4( viewMatrix );
uniforms.color.copy( light.color ).multiplyScalar( light.intensity );
uniforms.distance = light.distance;
uniforms.decay = ( light.distance === 0 ) ? 0.0 : light.decay;
uniforms.shadow = light.castShadow;
if ( light.castShadow ) {
var shadow = light.shadow;
uniforms.shadowBias = shadow.bias;
uniforms.shadowRadius = shadow.radius;
uniforms.shadowMapSize = shadow.mapSize;
uniforms.shadowCameraNear = shadow.camera.near;
uniforms.shadowCameraFar = shadow.camera.far;
}
state.pointShadowMap[ pointLength ] = shadowMap;
state.pointShadowMatrix[ pointLength ] = light.shadow.matrix;
state.point[ pointLength ] = uniforms;
pointLength ++;
} else if ( light.isHemisphereLight ) {
var uniforms = cache.get( light );
uniforms.direction.setFromMatrixPosition( light.matrixWorld );
uniforms.direction.transformDirection( viewMatrix );
uniforms.direction.normalize();
uniforms.skyColor.copy( light.color ).multiplyScalar( intensity );
uniforms.groundColor.copy( light.groundColor ).multiplyScalar( intensity );
state.hemi[ hemiLength ] = uniforms;
hemiLength ++;
}
}
state.ambient[ 0 ] = r;
state.ambient[ 1 ] = g;
state.ambient[ 2 ] = b;
state.directional.length = directionalLength;
state.spot.length = spotLength;
state.rectArea.length = rectAreaLength;
state.point.length = pointLength;
state.hemi.length = hemiLength;
state.hash = state.id + ',' + directionalLength + ',' + pointLength + ',' + spotLength + ',' + rectAreaLength + ',' + hemiLength + ',' + shadows.length;
}
return {
setup: setup,
state: state
};
}
/**
* @author Mugen87 / https://github.com/Mugen87
*/
function WebGLRenderState() {
var lights = new WebGLLights();
var lightsArray = [];
var shadowsArray = [];
var spritesArray = [];
function init() {
lightsArray.length = 0;
shadowsArray.length = 0;
spritesArray.length = 0;
}
function pushLight( light ) {
lightsArray.push( light );
}
function pushShadow( shadowLight ) {
shadowsArray.push( shadowLight );
}
function pushSprite( shadowLight ) {
spritesArray.push( shadowLight );
}
function setupLights( camera ) {
lights.setup( lightsArray, shadowsArray, camera );
}
var state = {
lightsArray: lightsArray,
shadowsArray: shadowsArray,
spritesArray: spritesArray,
lights: lights
};
return {
init: init,
state: state,
setupLights: setupLights,
pushLight: pushLight,
pushShadow: pushShadow,
pushSprite: pushSprite
};
}
function WebGLRenderStates() {
var renderStates = {};
function get( scene, camera ) {
var hash = scene.id + ',' + camera.id;
var renderState = renderStates[ hash ];
if ( renderState === undefined ) {
renderState = new WebGLRenderState();
renderStates[ hash ] = renderState;
}
return renderState;
}
function dispose() {
renderStates = {};
}
return {
get: get,
dispose: dispose
};
}
/**
* @author mrdoob / http://mrdoob.com/
* @author alteredq / http://alteredqualia.com/
* @author bhouston / https://clara.io
* @author WestLangley / http://github.com/WestLangley
*
* parameters = {
*
* opacity: <float>,
*
* map: new THREE.Texture( <Image> ),
*
* alphaMap: new THREE.Texture( <Image> ),
*
* displacementMap: new THREE.Texture( <Image> ),
* displacementScale: <float>,
* displacementBias: <float>,
*
* wireframe: <boolean>,
* wireframeLinewidth: <float>
* }
*/
function MeshDepthMaterial( parameters ) {
Material.call( this );
this.type = 'MeshDepthMaterial';
this.depthPacking = BasicDepthPacking;
this.skinning = false;
this.morphTargets = false;
this.map = null;
this.alphaMap = null;
this.displacementMap = null;
this.displacementScale = 1;
this.displacementBias = 0;
this.wireframe = false;
this.wireframeLinewidth = 1;
this.fog = false;
this.lights = false;
this.setValues( parameters );
}
MeshDepthMaterial.prototype = Object.create( Material.prototype );
MeshDepthMaterial.prototype.constructor = MeshDepthMaterial;
MeshDepthMaterial.prototype.isMeshDepthMaterial = true;
MeshDepthMaterial.prototype.copy = function ( source ) {
Material.prototype.copy.call( this, source );
this.depthPacking = source.depthPacking;
this.skinning = source.skinning;
this.morphTargets = source.morphTargets;
this.map = source.map;
this.alphaMap = source.alphaMap;
this.displacementMap = source.displacementMap;
this.displacementScale = source.displacementScale;
this.displacementBias = source.displacementBias;
this.wireframe = source.wireframe;
this.wireframeLinewidth = source.wireframeLinewidth;
return this;
};
/**
* @author WestLangley / http://github.com/WestLangley
*
* parameters = {
*
* referencePosition: <float>,
* nearDistance: <float>,
* farDistance: <float>,
*
* skinning: <bool>,
* morphTargets: <bool>,
*
* map: new THREE.Texture( <Image> ),
*
* alphaMap: new THREE.Texture( <Image> ),
*
* displacementMap: new THREE.Texture( <Image> ),
* displacementScale: <float>,
* displacementBias: <float>
*
* }
*/
function MeshDistanceMaterial( parameters ) {
Material.call( this );
this.type = 'MeshDistanceMaterial';
this.referencePosition = new Vector3();
this.nearDistance = 1;
this.farDistance = 1000;
this.skinning = false;
this.morphTargets = false;
this.map = null;
this.alphaMap = null;
this.displacementMap = null;
this.displacementScale = 1;
this.displacementBias = 0;
this.fog = false;
this.lights = false;
this.setValues( parameters );
}
MeshDistanceMaterial.prototype = Object.create( Material.prototype );
MeshDistanceMaterial.prototype.constructor = MeshDistanceMaterial;
MeshDistanceMaterial.prototype.isMeshDistanceMaterial = true;
MeshDistanceMaterial.prototype.copy = function ( source ) {
Material.prototype.copy.call( this, source );
this.referencePosition.copy( source.referencePosition );
this.nearDistance = source.nearDistance;
this.farDistance = source.farDistance;
this.skinning = source.skinning;
this.morphTargets = source.morphTargets;
this.map = source.map;
this.alphaMap = source.alphaMap;
this.displacementMap = source.displacementMap;
this.displacementScale = source.displacementScale;
this.displacementBias = source.displacementBias;
return this;
};
/**
* @author alteredq / http://alteredqualia.com/
* @author mrdoob / http://mrdoob.com/
*/
function WebGLShadowMap( _renderer, _objects, maxTextureSize ) {
var _frustum = new Frustum(),
_projScreenMatrix = new Matrix4(),
_shadowMapSize = new Vector2(),
_maxShadowMapSize = new Vector2( maxTextureSize, maxTextureSize ),
_lookTarget = new Vector3(),
_lightPositionWorld = new Vector3(),
_MorphingFlag = 1,
_SkinningFlag = 2,
_NumberOfMaterialVariants = ( _MorphingFlag | _SkinningFlag ) + 1,
_depthMaterials = new Array( _NumberOfMaterialVariants ),
_distanceMaterials = new Array( _NumberOfMaterialVariants ),
_materialCache = {};
var shadowSide = { 0: BackSide, 1: FrontSide, 2: DoubleSide };
var cubeDirections = [
new Vector3( 1, 0, 0 ), new Vector3( - 1, 0, 0 ), new Vector3( 0, 0, 1 ),
new Vector3( 0, 0, - 1 ), new Vector3( 0, 1, 0 ), new Vector3( 0, - 1, 0 )
];
var cubeUps = [
new Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ),
new Vector3( 0, 1, 0 ), new Vector3( 0, 0, 1 ), new Vector3( 0, 0, - 1 )
];
var cube2DViewPorts = [
new Vector4(), new Vector4(), new Vector4(),
new Vector4(), new Vector4(), new Vector4()
];
// init
for ( var i = 0; i !== _NumberOfMaterialVariants; ++ i ) {
var useMorphing = ( i & _MorphingFlag ) !== 0;
var useSkinning = ( i & _SkinningFlag ) !== 0;
var depthMaterial = new MeshDepthMaterial( {
depthPacking: RGBADepthPacking,
morphTargets: useMorphing,
skinning: useSkinning
} );
_depthMaterials[ i ] = depthMaterial;
//
var distanceMaterial = new MeshDistanceMaterial( {
morphTargets: useMorphing,
skinning: useSkinning
} );
_distanceMaterials[ i ] = distanceMaterial;
}
//
var scope = this;
this.enabled = false;
this.autoUpdate = true;
this.needsUpdate = false;
this.type = PCFShadowMap;
this.render = function ( lights, scene, camera ) {
if ( scope.enabled === false ) return;
if ( scope.autoUpdate === false && scope.needsUpdate === false ) return;
if ( lights.length === 0 ) return;
// TODO Clean up (needed in case of contextlost)
var _gl = _renderer.context;
var _state = _renderer.state;
// Set GL state for depth map.
_state.disable( _gl.BLEND );
_state.buffers.color.setClear( 1, 1, 1, 1 );
_state.buffers.depth.setTest( true );
_state.setScissorTest( false );
// render depth map
var faceCount;
for ( var i = 0, il = lights.length; i < il; i ++ ) {
var light = lights[ i ];
var shadow = light.shadow;
var isPointLight = light && light.isPointLight;
if ( shadow === undefined ) {
console.warn( 'THREE.WebGLShadowMap:', light, 'has no shadow.' );
continue;
}
var shadowCamera = shadow.camera;
_shadowMapSize.copy( shadow.mapSize );
_shadowMapSize.min( _maxShadowMapSize );
if ( isPointLight ) {
var vpWidth = _shadowMapSize.x;
var vpHeight = _shadowMapSize.y;
// These viewports map a cube-map onto a 2D texture with the
// following orientation:
//
// xzXZ
// y Y
//
// X - Positive x direction
// x - Negative x direction
// Y - Positive y direction
// y - Negative y direction
// Z - Positive z direction
// z - Negative z direction
// positive X
cube2DViewPorts[ 0 ].set( vpWidth * 2, vpHeight, vpWidth, vpHeight );
// negative X
cube2DViewPorts[ 1 ].set( 0, vpHeight, vpWidth, vpHeight );
// positive Z
cube2DViewPorts[ 2 ].set( vpWidth * 3, vpHeight, vpWidth, vpHeight );
// negative Z
cube2DViewPorts[ 3 ].set( vpWidth, vpHeight, vpWidth, vpHeight );
// positive Y
cube2DViewPorts[ 4 ].set( vpWidth * 3, 0, vpWidth, vpHeight );
// negative Y
cube2DViewPorts[ 5 ].set( vpWidth, 0, vpWidth, vpHeight );
_shadowMapSize.x *= 4.0;
_shadowMapSize.y *= 2.0;
}
if ( shadow.map === null ) {
var pars = { minFilter: NearestFilter, magFilter: NearestFilter, format: RGBAFormat };
shadow.map = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y, pars );
shadow.map.texture.name = light.name + ".shadowMap";
shadowCamera.updateProjectionMatrix();
}
if ( shadow.isSpotLightShadow ) {
shadow.update( light );
}
var shadowMap = shadow.map;
var shadowMatrix = shadow.matrix;
_lightPositionWorld.setFromMatrixPosition( light.matrixWorld );
shadowCamera.position.copy( _lightPositionWorld );
if ( isPointLight ) {
faceCount = 6;
// for point lights we set the shadow matrix to be a translation-only matrix
// equal to inverse of the light's position
shadowMatrix.makeTranslation( - _lightPositionWorld.x, - _lightPositionWorld.y, - _lightPositionWorld.z );
} else {
faceCount = 1;
_lookTarget.setFromMatrixPosition( light.target.matrixWorld );
shadowCamera.lookAt( _lookTarget );
shadowCamera.updateMatrixWorld();
// compute shadow matrix
shadowMatrix.set(
0.5, 0.0, 0.0, 0.5,
0.0, 0.5, 0.0, 0.5,
0.0, 0.0, 0.5, 0.5,
0.0, 0.0, 0.0, 1.0
);
shadowMatrix.multiply( shadowCamera.projectionMatrix );
shadowMatrix.multiply( shadowCamera.matrixWorldInverse );
}
_renderer.setRenderTarget( shadowMap );
_renderer.clear();
// render shadow map for each cube face (if omni-directional) or
// run a single pass if not
for ( var face = 0; face < faceCount; face ++ ) {
if ( isPointLight ) {
_lookTarget.copy( shadowCamera.position );
_lookTarget.add( cubeDirections[ face ] );
shadowCamera.up.copy( cubeUps[ face ] );
shadowCamera.lookAt( _lookTarget );
shadowCamera.updateMatrixWorld();
var vpDimensions = cube2DViewPorts[ face ];
_state.viewport( vpDimensions );
}
// update camera matrices and frustum
_projScreenMatrix.multiplyMatrices( shadowCamera.projectionMatrix, shadowCamera.matrixWorldInverse );
_frustum.setFromMatrix( _projScreenMatrix );
// set object matrices & frustum culling
renderObject( scene, camera, shadowCamera, isPointLight );
}
}
scope.needsUpdate = false;
};
function getDepthMaterial( object, material, isPointLight, lightPositionWorld, shadowCameraNear, shadowCameraFar ) {
var geometry = object.geometry;
var result = null;
var materialVariants = _depthMaterials;
var customMaterial = object.customDepthMaterial;
if ( isPointLight ) {
materialVariants = _distanceMaterials;
customMaterial = object.customDistanceMaterial;
}
if ( ! customMaterial ) {
var useMorphing = false;
if ( material.morphTargets ) {
if ( geometry && geometry.isBufferGeometry ) {
useMorphing = geometry.morphAttributes && geometry.morphAttributes.position && geometry.morphAttributes.position.length > 0;
} else if ( geometry && geometry.isGeometry ) {
useMorphing = geometry.morphTargets && geometry.morphTargets.length > 0;
}
}
if ( object.isSkinnedMesh && material.skinning === false ) {
console.warn( 'THREE.WebGLShadowMap: THREE.SkinnedMesh with material.skinning set to false:', object );
}
var useSkinning = object.isSkinnedMesh && material.skinning;
var variantIndex = 0;
if ( useMorphing ) variantIndex |= _MorphingFlag;
if ( useSkinning ) variantIndex |= _SkinningFlag;
result = materialVariants[ variantIndex ];
} else {
result = customMaterial;
}
if ( _renderer.localClippingEnabled &&
material.clipShadows === true &&
material.clippingPlanes.length !== 0 ) {
// in this case we need a unique material instance reflecting the
// appropriate state
var keyA = result.uuid, keyB = material.uuid;
var materialsForVariant = _materialCache[ keyA ];
if ( materialsForVariant === undefined ) {
materialsForVariant = {};
_materialCache[ keyA ] = materialsForVariant;
}
var cachedMaterial = materialsForVariant[ keyB ];
if ( cachedMaterial === undefined ) {
cachedMaterial = result.clone();
materialsForVariant[ keyB ] = cachedMaterial;
}
result = cachedMaterial;
}
result.visible = material.visible;
result.wireframe = material.wireframe;
result.side = ( material.shadowSide != null ) ? material.shadowSide : shadowSide[ material.side ];
result.clipShadows = material.clipShadows;
result.clippingPlanes = material.clippingPlanes;
result.clipIntersection = material.clipIntersection;
result.wireframeLinewidth = material.wireframeLinewidth;
result.linewidth = material.linewidth;
if ( isPointLight && result.isMeshDistanceMaterial ) {
result.referencePosition.copy( lightPositionWorld );
result.nearDistance = shadowCameraNear;
result.farDistance = shadowCameraFar;
}
return result;
}
function renderObject( object, camera, shadowCamera, isPointLight ) {
if ( object.visible === false ) return;
var visible = object.layers.test( camera.layers );
if ( visible && ( object.isMesh || object.isLine || object.isPoints ) ) {
if ( object.castShadow && ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) ) {
object.modelViewMatrix.multiplyMatrices( shadowCamera.matrixWorldInverse, object.matrixWorld );
var geometry = _objects.update( object );
var material = object.material;
if ( Array.isArray( material ) ) {
var groups = geometry.groups;
for ( var k = 0, kl = groups.length; k < kl; k ++ ) {
var group = groups[ k ];
var groupMaterial = material[ group.materialIndex ];
if ( groupMaterial && groupMaterial.visible ) {
var depthMaterial = getDepthMaterial( object, groupMaterial, isPointLight, _lightPositionWorld, shadowCamera.near, shadowCamera.far );
_renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, group );
}
}
} else if ( material.visible ) {
var depthMaterial = getDepthMaterial( object, material, isPointLight, _lightPositionWorld, shadowCamera.near, shadowCamera.far );
_renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, null );
}
}
}
var children = object.children;
for ( var i = 0, l = children.length; i < l; i ++ ) {
renderObject( children[ i ], camera, shadowCamera, isPointLight );
}
}
}
/**
* @author mrdoob / http://mrdoob.com/
*/
function CanvasTexture( canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) {
Texture.call( this, canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );
this.needsUpdate = true;
}
CanvasTexture.prototype = Object.create( Texture.prototype );
CanvasTexture.prototype.constructor = CanvasTexture;
/**
* @author mikael emtinger / http://gomo.se/
* @author alteredq / http://alteredqualia.com/
*/
function WebGLSpriteRenderer( renderer, gl, state, textures, capabilities ) {
var vertexBuffer, elementBuffer;
var program, attributes, uniforms;
var texture;
// decompose matrixWorld
var spritePosition = new Vector3();
var spriteRotation = new Quaternion();
var spriteScale = new Vector3();
function init() {
var vertices = new Float32Array( [
- 0.5, - 0.5, 0, 0,
0.5, - 0.5, 1, 0,
0.5, 0.5, 1, 1,
- 0.5, 0.5, 0, 1
] );
var faces = new Uint16Array( [
0, 1, 2,
0, 2, 3
] );
vertexBuffer = gl.createBuffer();
elementBuffer = gl.createBuffer();
gl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer );
gl.bufferData( gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW );
gl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer );
gl.bufferData( gl.ELEMENT_ARRAY_BUFFER, faces, gl.STATIC_DRAW );
program = createProgram();
attributes = {
position: gl.getAttribLocation( program, 'position' ),
uv: gl.getAttribLocation( program, 'uv' )
};
uniforms = {
uvOffset: gl.getUniformLocation( program, 'uvOffset' ),
uvScale: gl.getUniformLocation( program, 'uvScale' ),
rotation: gl.getUniformLocation( program, 'rotation' ),
center: gl.getUniformLocation( program, 'center' ),
scale: gl.getUniformLocation( program, 'scale' ),
color: gl.getUniformLocation( program, 'color' ),
map: gl.getUniformLocation( program, 'map' ),
opacity: gl.getUniformLocation( program, 'opacity' ),
modelViewMatrix: gl.getUniformLocation( program, 'modelViewMatrix' ),
projectionMatrix: gl.getUniformLocation( program, 'projectionMatrix' ),
fogType: gl.getUniformLocation( program, 'fogType' ),
fogDensity: gl.getUniformLocation( program, 'fogDensity' ),
fogNear: gl.getUniformLocation( program, 'fogNear' ),
fogFar: gl.getUniformLocation( program, 'fogFar' ),
fogColor: gl.getUniformLocation( program, 'fogColor' ),
fogDepth: gl.getUniformLocation( program, 'fogDepth' ),
alphaTest: gl.getUniformLocation( program, 'alphaTest' )
};
var canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );
canvas.width = 8;
canvas.height = 8;
var context = canvas.getContext( '2d' );
context.fillStyle = 'white';
context.fillRect( 0, 0, 8, 8 );
texture = new CanvasTexture( canvas );
}
this.render = function ( sprites, scene, camera ) {
if ( sprites.length === 0 ) return;
// setup gl
if ( program === undefined ) {
init();
}
state.useProgram( program );
state.initAttributes();
state.enableAttribute( attributes.position );
state.enableAttribute( attributes.uv );
state.disableUnusedAttributes();
state.disable( gl.CULL_FACE );
state.enable( gl.BLEND );
gl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer );
gl.vertexAttribPointer( attributes.position, 2, gl.FLOAT, false, 2 * 8, 0 );
gl.vertexAttribPointer( attributes.uv, 2, gl.FLOAT, false, 2 * 8, 8 );
gl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer );
gl.uniformMatrix4fv( uniforms.projectionMatrix, false, camera.projectionMatrix.elements );
state.activeTexture( gl.TEXTURE0 );
gl.uniform1i( uniforms.map, 0 );
var oldFogType = 0;
var sceneFogType = 0;
var fog = scene.fog;
if ( fog ) {
gl.uniform3f( uniforms.fogColor, fog.color.r, fog.color.g, fog.color.b );
if ( fog.isFog ) {
gl.uniform1f( uniforms.fogNear, fog.near );
gl.uniform1f( uniforms.fogFar, fog.far );
gl.uniform1i( uniforms.fogType, 1 );
oldFogType = 1;
sceneFogType = 1;
} else if ( fog.isFogExp2 ) {
gl.uniform1f( uniforms.fogDensity, fog.density );
gl.uniform1i( uniforms.fogType, 2 );
oldFogType = 2;
sceneFogType = 2;
}
} else {
gl.uniform1i( uniforms.fogType, 0 );
oldFogType = 0;
sceneFogType = 0;
}
// update positions and sort
for ( var i = 0, l = sprites.length; i < l; i ++ ) {
var sprite = sprites[ i ];
sprite.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, sprite.matrixWorld );
sprite.z = - sprite.modelViewMatrix.elements[ 14 ];
}
sprites.sort( painterSortStable );
// render all sprites
var scale = [];
var center = [];
for ( var i = 0, l = sprites.length; i < l; i ++ ) {
var sprite = sprites[ i ];
var material = sprite.material;
if ( material.visible === false ) continue;
sprite.onBeforeRender( renderer, scene, camera, undefined, material, undefined );
gl.uniform1f( uniforms.alphaTest, material.alphaTest );
gl.uniformMatrix4fv( uniforms.modelViewMatrix, false, sprite.modelViewMatrix.elements );
sprite.matrixWorld.decompose( spritePosition, spriteRotation, spriteScale );
scale[ 0 ] = spriteScale.x;
scale[ 1 ] = spriteScale.y;
center[ 0 ] = sprite.center.x - 0.5;
center[ 1 ] = sprite.center.y - 0.5;
var fogType = 0;
if ( scene.fog && material.fog ) {
fogType = sceneFogType;
}
if ( oldFogType !== fogType ) {
gl.uniform1i( uniforms.fogType, fogType );
oldFogType = fogType;
}
if ( material.map !== null ) {
gl.uniform2f( uniforms.uvOffset, material.map.offset.x, material.map.offset.y );
gl.uniform2f( uniforms.uvScale, material.map.repeat.x, material.map.repeat.y );
} else {
gl.uniform2f( uniforms.uvOffset, 0, 0 );
gl.uniform2f( uniforms.uvScale, 1, 1 );
}
gl.uniform1f( uniforms.opacity, material.opacity );
gl.uniform3f( uniforms.color, material.color.r, material.color.g, material.color.b );
gl.uniform1f( uniforms.rotation, material.rotation );
gl.uniform2fv( uniforms.center, center );
gl.uniform2fv( uniforms.scale, scale );
state.setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.premultipliedAlpha );
state.buffers.depth.setTest( material.depthTest );
state.buffers.depth.setMask( material.depthWrite );
state.buffers.color.setMask( material.colorWrite );
textures.setTexture2D( material.map || texture, 0 );
gl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 );
sprite.onAfterRender( renderer, scene, camera, undefined, material, undefined );
}
// restore gl
state.enable( gl.CULL_FACE );
state.reset();
};
function createProgram() {
var program = gl.createProgram();
var vertexShader = gl.createShader( gl.VERTEX_SHADER );
var fragmentShader = gl.createShader( gl.FRAGMENT_SHADER );
gl.shaderSource( vertexShader, [
'precision ' + capabilities.precision + ' float;',
'#define SHADER_NAME ' + 'SpriteMaterial',
'uniform mat4 modelViewMatrix;',
'uniform mat4 projectionMatrix;',
'uniform float rotation;',
'uniform vec2 center;',
'uniform vec2 scale;',
'uniform vec2 uvOffset;',
'uniform vec2 uvScale;',
'attribute vec2 position;',
'attribute vec2 uv;',
'varying vec2 vUV;',
'varying float fogDepth;',
'void main() {',
' vUV = uvOffset + uv * uvScale;',
' vec2 alignedPosition = ( position - center ) * scale;',
' vec2 rotatedPosition;',
' rotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;',
' rotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;',
' vec4 mvPosition;',
' mvPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );',
' mvPosition.xy += rotatedPosition;',
' gl_Position = projectionMatrix * mvPosition;',
' fogDepth = - mvPosition.z;',
'}'
].join( '\n' ) );
gl.shaderSource( fragmentShader, [
'precision ' + capabilities.precision + ' float;',
'#define SHADER_NAME ' + 'SpriteMaterial',
'uniform vec3 color;',
'uniform sampler2D map;',
'uniform float opacity;',
'uniform int fogType;',
'uniform vec3 fogColor;',
'uniform float fogDensity;',
'uniform float fogNear;',
'uniform float fogFar;',
'uniform float alphaTest;',
'varying vec2 vUV;',
'varying float fogDepth;',
'void main() {',
' vec4 texture = texture2D( map, vUV );',
' gl_FragColor = vec4( color * texture.xyz, texture.a * opacity );',
' if ( gl_FragColor.a < alphaTest ) discard;',
' if ( fogType > 0 ) {',
' float fogFactor = 0.0;',
' if ( fogType == 1 ) {',
' fogFactor = smoothstep( fogNear, fogFar, fogDepth );',
' } else {',
' const float LOG2 = 1.442695;',
' fogFactor = exp2( - fogDensity * fogDensity * fogDepth * fogDepth * LOG2 );',
' fogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );',
' }',
' gl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );',
' }',
'}'
].join( '\n' ) );
gl.compileShader( vertexShader );
gl.compileShader( fragmentShader );
gl.attachShader( program, vertexShader );
gl.attachShader( program, fragmentShader );
gl.linkProgram( program );
return program;
}
function painterSortStable( a, b ) {
if ( a.renderOrder !== b.renderOrder ) {
return a.renderOrder - b.renderOrder;
} else if ( a.z !== b.z ) {
return b.z - a.z;
} else {
return b.id - a.id;
}
}
}
/**
* @author mrdoob / http://mrdoob.com/
*/
function WebGLState( gl, extensions, utils ) {
function ColorBuffer() {
var locked = false;
var color = new Vector4();
var currentColorMask = null;
var currentColorClear = new Vector4( 0, 0, 0, 0 );
return {
setMask: function ( colorMask ) {
if ( currentColorMask !== colorMask && ! locked ) {
gl.colorMask( colorMask, colorMask, colorMask, colorMask );
currentColorMask = colorMask;
}
},
setLocked: function ( lock ) {
locked = lock;
},
setClear: function ( r, g, b, a, premultipliedAlpha ) {
if ( premultipliedAlpha === true ) {
r *= a; g *= a; b *= a;
}
color.set( r, g, b, a );
if ( currentColorClear.equals( color ) === false ) {
gl.clearColor( r, g, b, a );
currentColorClear.copy( color );
}
},
reset: function () {
locked = false;
currentColorMask = null;
currentColorClear.set( - 1, 0, 0, 0 ); // set to invalid state
}
};
}
function DepthBuffer() {
var locked = false;
var currentDepthMask = null;
var currentDepthFunc = null;
var currentDepthClear = null;
return {
setTest: function ( depthTest ) {
if ( depthTest ) {
enable( gl.DEPTH_TEST );
} else {
disable( gl.DEPTH_TEST );
}
},
setMask: function ( depthMask ) {
if ( currentDepthMask !== depthMask && ! locked ) {
gl.depthMask( depthMask );
currentDepthMask = depthMask;
}
},
setFunc: function ( depthFunc ) {
if ( currentDepthFunc !== depthFunc ) {
if ( depthFunc ) {
switch ( depthFunc ) {
case NeverDepth:
gl.depthFunc( gl.NEVER );
break;
case AlwaysDepth:
gl.depthFunc( gl.ALWAYS );
break;
case LessDepth:
gl.depthFunc( gl.LESS );
break;
case LessEqualDepth:
gl.depthFunc( gl.LEQUAL );
break;
case EqualDepth:
gl.depthFunc( gl.EQUAL );
break;
case GreaterEqualDepth:
gl.depthFunc( gl.GEQUAL );
break;
case GreaterDepth:
gl.depthFunc( gl.GREATER );
break;
case NotEqualDepth:
gl.depthFunc( gl.NOTEQUAL );
break;
default:
gl.depthFunc( gl.LEQUAL );
}
} else {
gl.depthFunc( gl.LEQUAL );
}
currentDepthFunc = depthFunc;
}
},
setLocked: function ( lock ) {
locked = lock;
},
setClear: function ( depth ) {
if ( currentDepthClear !== depth ) {
gl.clearDepth( depth );
currentDepthClear = depth;
}
},
reset: function () {
locked = false;
currentDepthMask = null;
currentDepthFunc = null;
currentDepthClear = null;
}
};
}
function StencilBuffer() {
var locked = false;
var currentStencilMask = null;
var currentStencilFunc = null;
var currentStencilRef = null;
var currentStencilFuncMask = null;
var currentStencilFail = null;
var currentStencilZFail = null;
var currentStencilZPass = null;
var currentStencilClear = null;
return {
setTest: function ( stencilTest ) {
if ( stencilTest ) {
enable( gl.STENCIL_TEST );
} else {
disable( gl.STENCIL_TEST );
}
},
setMask: function ( stencilMask ) {
if ( currentStencilMask !== stencilMask && ! locked ) {
gl.stencilMask( stencilMask );
currentStencilMask = stencilMask;
}
},
setFunc: function ( stencilFunc, stencilRef, stencilMask ) {
if ( currentStencilFunc !== stencilFunc ||
currentStencilRef !== stencilRef ||
currentStencilFuncMask !== stencilMask ) {
gl.stencilFunc( stencilFunc, stencilRef, stencilMask );
currentStencilFunc = stencilFunc;
currentStencilRef = stencilRef;
currentStencilFuncMask = stencilMask;
}
},
setOp: function ( stencilFail, stencilZFail, stencilZPass ) {
if ( currentStencilFail !== stencilFail ||
currentStencilZFail !== stencilZFail ||
currentStencilZPass !== stencilZPass ) {
gl.stencilOp( stencilFail, stencilZFail, stencilZPass );
currentStencilFail = stencilFail;
currentStencilZFail = stencilZFail;
currentStencilZPass = stencilZPass;
}
},
setLocked: function ( lock ) {
locked = lock;
},
setClear: function ( stencil ) {
if ( currentStencilClear !== stencil ) {
gl.clearStencil( stencil );
currentStencilClear = stencil;
}
},
reset: function () {
locked = false;
currentStencilMask = null;
currentStencilFunc = null;
currentStencilRef = null;
currentStencilFuncMask = null;
currentStencilFail = null;
currentStencilZFail = null;
currentStencilZPass = null;
currentStencilClear = null;
}
};
}
//
var colorBuffer = new ColorBuffer();
var depthBuffer = new DepthBuffer();
var stencilBuffer = new StencilBuffer();
var maxVertexAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS );
var newAttributes = new Uint8Array( maxVertexAttributes );
var enabledAttributes = new Uint8Array( maxVertexAttributes );
var attributeDivisors = new Uint8Array( maxVertexAttributes );
var capabilities = {};
var compressedTextureFormats = null;
var currentProgram = null;
var currentBlending = null;
var currentBlendEquation = null;
var currentBlendSrc = null;
var currentBlendDst = null;
var currentBlendEquationAlpha = null;
var currentBlendSrcAlpha = null;
var currentBlendDstAlpha = null;
var currentPremultipledAlpha = false;
var currentFlipSided = null;
var currentCullFace = null;
var currentLineWidth = null;
var currentPolygonOffsetFactor = null;
var currentPolygonOffsetUnits = null;
var maxTextures = gl.getParameter( gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS );
var lineWidthAvailable = false;
var version = 0;
var glVersion = gl.getParameter( gl.VERSION );
if ( glVersion.indexOf( 'WebGL' ) !== - 1 ) {
version = parseFloat( /^WebGL\ ([0-9])/.exec( glVersion )[ 1 ] );
lineWidthAvailable = ( version >= 1.0 );
} else if ( glVersion.indexOf( 'OpenGL ES' ) !== - 1 ) {
version = parseFloat( /^OpenGL\ ES\ ([0-9])/.exec( glVersion )[ 1 ] );
lineWidthAvailable = ( version >= 2.0 );
}
var currentTextureSlot = null;
var currentBoundTextures = {};
var currentScissor = new Vector4();
var currentViewport = new Vector4();
function createTexture( type, target, count ) {
var data = new Uint8Array( 4 ); // 4 is required to match default unpack alignment of 4.
var texture = gl.createTexture();
gl.bindTexture( type, texture );
gl.texParameteri( type, gl.TEXTURE_MIN_FILTER, gl.NEAREST );
gl.texParameteri( type, gl.TEXTURE_MAG_FILTER, gl.NEAREST );
for ( var i = 0; i < count; i ++ ) {
gl.texImage2D( target + i, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, data );
}
return texture;
}
var emptyTextures = {};
emptyTextures[ gl.TEXTURE_2D ] = createTexture( gl.TEXTURE_2D, gl.TEXTURE_2D, 1 );
emptyTextures[ gl.TEXTURE_CUBE_MAP ] = createTexture( gl.TEXTURE_CUBE_MAP, gl.TEXTURE_CUBE_MAP_POSITIVE_X, 6 );
// init
colorBuffer.setClear( 0, 0, 0, 1 );
depthBuffer.setClear( 1 );
stencilBuffer.setClear( 0 );
enable( gl.DEPTH_TEST );
depthBuffer.setFunc( LessEqualDepth );
setFlipSided( false );
setCullFace( CullFaceBack );
enable( gl.CULL_FACE );
enable( gl.BLEND );
setBlending( NormalBlending );
//
function initAttributes() {
for ( var i = 0, l = newAttributes.length; i < l; i ++ ) {
newAttributes[ i ] = 0;
}
}
function enableAttribute( attribute ) {
newAttributes[ attribute ] = 1;
if ( enabledAttributes[ attribute ] === 0 ) {
gl.enableVertexAttribArray( attribute );
enabledAttributes[ attribute ] = 1;
}
if ( attributeDivisors[ attribute ] !== 0 ) {
var extension = extensions.get( 'ANGLE_instanced_arrays' );
extension.vertexAttribDivisorANGLE( attribute, 0 );
attributeDivisors[ attribute ] = 0;
}
}
function enableAttributeAndDivisor( attribute, meshPerAttribute ) {
newAttributes[ attribute ] = 1;
if ( enabledAttributes[ attribute ] === 0 ) {
gl.enableVertexAttribArray( attribute );
enabledAttributes[ attribute ] = 1;
}
if ( attributeDivisors[ attribute ] !== meshPerAttribute ) {
var extension = extensions.get( 'ANGLE_instanced_arrays' );
extension.vertexAttribDivisorANGLE( attribute, meshPerAttribute );
attributeDivisors[ attribute ] = meshPerAttribute;
}
}
function disableUnusedAttributes() {
for ( var i = 0, l = enabledAttributes.length; i !== l; ++ i ) {
if ( enabledAttributes[ i ] !== newAttributes[ i ] ) {
gl.disableVertexAttribArray( i );
enabledAttributes[ i ] = 0;
}
}
}
function enable( id ) {
if ( capabilities[ id ] !== true ) {
gl.enable( id );
capabilities[ id ] = true;
}
}
function disable( id ) {
if ( capabilities[ id ] !== false ) {
gl.disable( id );
capabilities[ id ] = false;
}
}
function getCompressedTextureFormats() {
if ( compressedTextureFormats === null ) {
compressedTextureFormats = [];
if ( extensions.get( 'WEBGL_compressed_texture_pvrtc' ) ||
extensions.get( 'WEBGL_compressed_texture_s3tc' ) ||
extensions.get( 'WEBGL_compressed_texture_etc1' ) ||
extensions.get( 'WEBGL_compressed_texture_astc' ) ) {
var formats = gl.getParameter( gl.COMPRESSED_TEXTURE_FORMATS );
for ( var i = 0; i < formats.length; i ++ ) {
compressedTextureFormats.push( formats[ i ] );
}
}
}
return compressedTextureFormats;
}
function useProgram( program ) {
if ( currentProgram !== program ) {
gl.useProgram( program );
currentProgram = program;
return true;
}
return false;
}
function setBlending( blending, blendEquation, blendSrc, blendDst, blendEquationAlpha, blendSrcAlpha, blendDstAlpha, premultipliedAlpha ) {
if ( blending !== NoBlending ) {
enable( gl.BLEND );
} else {
disable( gl.BLEND );
}
if ( blending !== CustomBlending ) {
if ( blending !== currentBlending || premultipliedAlpha !== currentPremultipledAlpha ) {
switch ( blending ) {
case AdditiveBlending:
if ( premultipliedAlpha ) {
gl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );
gl.blendFuncSeparate( gl.ONE, gl.ONE, gl.ONE, gl.ONE );
} else {
gl.blendEquation( gl.FUNC_ADD );
gl.blendFunc( gl.SRC_ALPHA, gl.ONE );
}
break;
case SubtractiveBlending:
if ( premultipliedAlpha ) {
gl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );
gl.blendFuncSeparate( gl.ZERO, gl.ZERO, gl.ONE_MINUS_SRC_COLOR, gl.ONE_MINUS_SRC_ALPHA );
} else {
gl.blendEquation( gl.FUNC_ADD );
gl.blendFunc( gl.ZERO, gl.ONE_MINUS_SRC_COLOR );
}
break;
case MultiplyBlending:
if ( premultipliedAlpha ) {
gl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );
gl.blendFuncSeparate( gl.ZERO, gl.SRC_COLOR, gl.ZERO, gl.SRC_ALPHA );
} else {
gl.blendEquation( gl.FUNC_ADD );
gl.blendFunc( gl.ZERO, gl.SRC_COLOR );
}
break;
default:
if ( premultipliedAlpha ) {
gl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );
gl.blendFuncSeparate( gl.ONE, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA );
} else {
gl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );
gl.blendFuncSeparate( gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA );
}
}
}
currentBlendEquation = null;
currentBlendSrc = null;
currentBlendDst = null;
currentBlendEquationAlpha = null;
currentBlendSrcAlpha = null;
currentBlendDstAlpha = null;
} else {
blendEquationAlpha = blendEquationAlpha || blendEquation;
blendSrcAlpha = blendSrcAlpha || blendSrc;
blendDstAlpha = blendDstAlpha || blendDst;
if ( blendEquation !== currentBlendEquation || blendEquationAlpha !== currentBlendEquationAlpha ) {
gl.blendEquationSeparate( utils.convert( blendEquation ), utils.convert( blendEquationAlpha ) );
currentBlendEquation = blendEquation;
currentBlendEquationAlpha = blendEquationAlpha;
}
if ( blendSrc !== currentBlendSrc || blendDst !== currentBlendDst || blendSrcAlpha !== currentBlendSrcAlpha || blendDstAlpha !== currentBlendDstAlpha ) {
gl.blendFuncSeparate( utils.convert( blendSrc ), utils.convert( blendDst ), utils.convert( blendSrcAlpha ), utils.convert( blendDstAlpha ) );
currentBlendSrc = blendSrc;
currentBlendDst = blendDst;
currentBlendSrcAlpha = blendSrcAlpha;
currentBlendDstAlpha = blendDstAlpha;
}
}
currentBlending = blending;
currentPremultipledAlpha = premultipliedAlpha;
}
function setMaterial( material, frontFaceCW ) {
material.side === DoubleSide
? disable( gl.CULL_FACE )
: enable( gl.CULL_FACE );
var flipSided = ( material.side === BackSide );
if ( frontFaceCW ) flipSided = ! flipSided;
setFlipSided( flipSided );
material.transparent === true
? setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.premultipliedAlpha )
: setBlending( NoBlending );
depthBuffer.setFunc( material.depthFunc );
depthBuffer.setTest( material.depthTest );
depthBuffer.setMask( material.depthWrite );
colorBuffer.setMask( material.colorWrite );
setPolygonOffset( material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits );
}
//
function setFlipSided( flipSided ) {
if ( currentFlipSided !== flipSided ) {
if ( flipSided ) {
gl.frontFace( gl.CW );
} else {
gl.frontFace( gl.CCW );
}
currentFlipSided = flipSided;
}
}
function setCullFace( cullFace ) {
if ( cullFace !== CullFaceNone ) {
enable( gl.CULL_FACE );
if ( cullFace !== currentCullFace ) {
if ( cullFace === CullFaceBack ) {
gl.cullFace( gl.BACK );
} else if ( cullFace === CullFaceFront ) {
gl.cullFace( gl.FRONT );
} else {
gl.cullFace( gl.FRONT_AND_BACK );
}
}
} else {
disable( gl.CULL_FACE );
}
currentCullFace = cullFace;
}
function setLineWidth( width ) {
if ( width !== currentLineWidth ) {
if ( lineWidthAvailable ) gl.lineWidth( width );
currentLineWidth = width;
}
}
function setPolygonOffset( polygonOffset, factor, units ) {
if ( polygonOffset ) {
enable( gl.POLYGON_OFFSET_FILL );
if ( currentPolygonOffsetFactor !== factor || currentPolygonOffsetUnits !== units ) {
gl.polygonOffset( factor, units );
currentPolygonOffsetFactor = factor;
currentPolygonOffsetUnits = units;
}
} else {
disable( gl.POLYGON_OFFSET_FILL );
}
}
function setScissorTest( scissorTest ) {
if ( scissorTest ) {
enable( gl.SCISSOR_TEST );
} else {
disable( gl.SCISSOR_TEST );
}
}
// texture
function activeTexture( webglSlot ) {
if ( webglSlot === undefined ) webglSlot = gl.TEXTURE0 + maxTextures - 1;
if ( currentTextureSlot !== webglSlot ) {
gl.activeTexture( webglSlot );
currentTextureSlot = webglSlot;
}
}
function bindTexture( webglType, webglTexture ) {
if ( currentTextureSlot === null ) {
activeTexture();
}
var boundTexture = currentBoundTextures[ currentTextureSlot ];
if ( boundTexture === undefined ) {
boundTexture = { type: undefined, texture: undefined };
currentBoundTextures[ currentTextureSlot ] = boundTexture;
}
if ( boundTexture.type !== webglType || boundTexture.texture !== webglTexture ) {
gl.bindTexture( webglType, webglTexture || emptyTextures[ webglType ] );
boundTexture.type = webglType;
boundTexture.texture = webglTexture;
}
}
function compressedTexImage2D() {
try {
gl.compressedTexImage2D.apply( gl, arguments );
} catch ( error ) {
console.error( 'THREE.WebGLState:', error );
}
}
function texImage2D() {
try {
gl.texImage2D.apply( gl, arguments );
} catch ( error ) {
console.error( 'THREE.WebGLState:', error );
}
}
//
function scissor( scissor ) {
if ( currentScissor.equals( scissor ) === false ) {
gl.scissor( scissor.x, scissor.y, scissor.z, scissor.w );
currentScissor.copy( scissor );
}
}
function viewport( viewport ) {
if ( currentViewport.equals( viewport ) === false ) {
gl.viewport( viewport.x, viewport.y, viewport.z, viewport.w );
currentViewport.copy( viewport );
}
}
//
function reset() {
for ( var i = 0; i < enabledAttributes.length; i ++ ) {
if ( enabledAttributes[ i ] === 1 ) {
gl.disableVertexAttribArray( i );
enabledAttributes[ i ] = 0;
}
}
capabilities = {};
compressedTextureFormats = null;
currentTextureSlot = null;
currentBoundTextures = {};
currentProgram = null;
currentBlending = null;
currentFlipSided = null;
currentCullFace = null;
colorBuffer.reset();
depthBuffer.reset();
stencilBuffer.reset();
}
return {
buffers: {
color: colorBuffer,
depth: depthBuffer,
stencil: stencilBuffer
},
initAttributes: initAttributes,
enableAttribute: enableAttribute,
enableAttributeAndDivisor: enableAttributeAndDivisor,
disableUnusedAttributes: disableUnusedAttributes,
enable: enable,
disable: disable,
getCompressedTextureFormats: getCompressedTextureFormats,
useProgram: useProgram,
setBlending: setBlending,
setMaterial: setMaterial,
setFlipSided: setFlipSided,
setCullFace: setCullFace,
setLineWidth: setLineWidth,
setPolygonOffset: setPolygonOffset,
setScissorTest: setScissorTest,
activeTexture: activeTexture,
bindTexture: bindTexture,
compressedTexImage2D: compressedTexImage2D,
texImage2D: texImage2D,
scissor: scissor,
viewport: viewport,
reset: reset
};
}
/**
* @author mrdoob / http://mrdoob.com/
*/
function WebGLTextures( _gl, extensions, state, properties, capabilities, utils, info ) {
var _isWebGL2 = ( typeof WebGL2RenderingContext !== 'undefined' && _gl instanceof WebGL2RenderingContext ); /* global WebGL2RenderingContext */
var _videoTextures = {};
var _canvas;
//
function clampToMaxSize( image, maxSize ) {
if ( image.width > maxSize || image.height > maxSize ) {
if ( 'data' in image ) {
console.warn( 'THREE.WebGLRenderer: image in DataTexture is too big (' + image.width + 'x' + image.height + ').' );
return;
}
// Warning: Scaling through the canvas will only work with images that use
// premultiplied alpha.
var scale = maxSize / Math.max( image.width, image.height );
var canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );
canvas.width = Math.floor( image.width * scale );
canvas.height = Math.floor( image.height * scale );
var context = canvas.getContext( '2d' );
context.drawImage( image, 0, 0, image.width, image.height, 0, 0, canvas.width, canvas.height );
console.warn( 'THREE.WebGLRenderer: image is too big (' + image.width + 'x' + image.height + '). Resized to ' + canvas.width + 'x' + canvas.height, image );
return canvas;
}
return image;
}
function isPowerOfTwo( image ) {
return _Math.isPowerOfTwo( image.width ) && _Math.isPowerOfTwo( image.height );
}
function makePowerOfTwo( image ) {
if ( image instanceof HTMLImageElement || image instanceof HTMLCanvasElement || image instanceof ImageBitmap ) {
if ( _canvas === undefined ) _canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );
_canvas.width = _Math.floorPowerOfTwo( image.width );
_canvas.height = _Math.floorPowerOfTwo( image.height );
var context = _canvas.getContext( '2d' );
context.drawImage( image, 0, 0, _canvas.width, _canvas.height );
console.warn( 'THREE.WebGLRenderer: image is not power of two (' + image.width + 'x' + image.height + '). Resized to ' + _canvas.width + 'x' + _canvas.height, image );
return _canvas;
}
return image;
}
function textureNeedsPowerOfTwo( texture ) {
return ( texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping ) ||
( texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter );
}
function textureNeedsGenerateMipmaps( texture, isPowerOfTwo ) {
return texture.generateMipmaps && isPowerOfTwo &&
texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter;
}
function generateMipmap( target, texture, width, height ) {
_gl.generateMipmap( target );
var textureProperties = properties.get( texture );
// Note: Math.log( x ) * Math.LOG2E used instead of Math.log2( x ) which is not supported by IE11
textureProperties.__maxMipLevel = Math.log( Math.max( width, height ) ) * Math.LOG2E;
}
// Fallback filters for non-power-of-2 textures
function filterFallback( f ) {
if ( f === NearestFilter || f === NearestMipMapNearestFilter || f === NearestMipMapLinearFilter ) {
return _gl.NEAREST;
}
return _gl.LINEAR;
}
//
function onTextureDispose( event ) {
var texture = event.target;
texture.removeEventListener( 'dispose', onTextureDispose );
deallocateTexture( texture );
if ( texture.isVideoTexture ) {
delete _videoTextures[ texture.id ];
}
info.memory.textures --;
}
function onRenderTargetDispose( event ) {
var renderTarget = event.target;
renderTarget.removeEventListener( 'dispose', onRenderTargetDispose );
deallocateRenderTarget( renderTarget );
info.memory.textures --;
}
//
function deallocateTexture( texture ) {
var textureProperties = properties.get( texture );
if ( texture.image && textureProperties.__image__webglTextureCube ) {
// cube texture
_gl.deleteTexture( textureProperties.__image__webglTextureCube );
} else {
// 2D texture
if ( textureProperties.__webglInit === undefined ) return;
_gl.deleteTexture( textureProperties.__webglTexture );
}
// remove all webgl properties
properties.remove( texture );
}
function deallocateRenderTarget( renderTarget ) {
var renderTargetProperties = properties.get( renderTarget );
var textureProperties = properties.get( renderTarget.texture );
if ( ! renderTarget ) return;
if ( textureProperties.__webglTexture !== undefined ) {
_gl.deleteTexture( textureProperties.__webglTexture );
}
if ( renderTarget.depthTexture ) {
renderTarget.depthTexture.dispose();
}
if ( renderTarget.isWebGLRenderTargetCube ) {
for ( var i = 0; i < 6; i ++ ) {
_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ i ] );
if ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer[ i ] );
}
} else {
_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer );
if ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer );
}
properties.remove( renderTarget.texture );
properties.remove( renderTarget );
}
//
function setTexture2D( texture, slot ) {
var textureProperties = properties.get( texture );
if ( texture.isVideoTexture ) updateVideoTexture( texture );
if ( texture.version > 0 && textureProperties.__version !== texture.version ) {
var image = texture.image;
if ( image === undefined ) {
console.warn( 'THREE.WebGLRenderer: Texture marked for update but image is undefined', texture );
} else if ( image.complete === false ) {
console.warn( 'THREE.WebGLRenderer: Texture marked for update but image is incomplete', texture );
} else {
uploadTexture( textureProperties, texture, slot );
return;
}
}
state.activeTexture( _gl.TEXTURE0 + slot );
state.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture );
}
function setTextureCube( texture, slot ) {
var textureProperties = properties.get( texture );
if ( texture.image.length === 6 ) {
if ( texture.version > 0 && textureProperties.__version !== texture.version ) {
if ( ! textureProperties.__image__webglTextureCube ) {
texture.addEventListener( 'dispose', onTextureDispose );
textureProperties.__image__webglTextureCube = _gl.createTexture();
info.memory.textures ++;
}
state.activeTexture( _gl.TEXTURE0 + slot );
state.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__image__webglTextureCube );
_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY );
var isCompressed = ( texture && texture.isCompressedTexture );
var isDataTexture = ( texture.image[ 0 ] && texture.image[ 0 ].isDataTexture );
var cubeImage = [];
for ( var i = 0; i < 6; i ++ ) {
if ( ! isCompressed && ! isDataTexture ) {
cubeImage[ i ] = clampToMaxSize( texture.image[ i ], capabilities.maxCubemapSize );
} else {
cubeImage[ i ] = isDataTexture ? texture.image[ i ].image : texture.image[ i ];
}
}
var image = cubeImage[ 0 ],
isPowerOfTwoImage = isPowerOfTwo( image ),
glFormat = utils.convert( texture.format ),
glType = utils.convert( texture.type );
setTextureParameters( _gl.TEXTURE_CUBE_MAP, texture, isPowerOfTwoImage );
for ( var i = 0; i < 6; i ++ ) {
if ( ! isCompressed ) {
if ( isDataTexture ) {
state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glFormat, cubeImage[ i ].width, cubeImage[ i ].height, 0, glFormat, glType, cubeImage[ i ].data );
} else {
state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glFormat, glFormat, glType, cubeImage[ i ] );
}
} else {
var mipmap, mipmaps = cubeImage[ i ].mipmaps;
for ( var j = 0, jl = mipmaps.length; j < jl; j ++ ) {
mipmap = mipmaps[ j ];
if ( texture.format !== RGBAFormat && texture.format !== RGBFormat ) {
if ( state.getCompressedTextureFormats().indexOf( glFormat ) > - 1 ) {
state.compressedTexImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glFormat, mipmap.width, mipmap.height, 0, mipmap.data );
} else {
console.warn( 'THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()' );
}
} else {
state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );
}
}
}
}
if ( ! isCompressed ) {
textureProperties.__maxMipLevel = 0;
} else {
textureProperties.__maxMipLevel = mipmaps.length - 1;
}
if ( textureNeedsGenerateMipmaps( texture, isPowerOfTwoImage ) ) {
// We assume images for cube map have the same size.
generateMipmap( _gl.TEXTURE_CUBE_MAP, texture, image.width, image.height );
}
textureProperties.__version = texture.version;
if ( texture.onUpdate ) texture.onUpdate( texture );
} else {
state.activeTexture( _gl.TEXTURE0 + slot );
state.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__image__webglTextureCube );
}
}
}
function setTextureCubeDynamic( texture, slot ) {
state.activeTexture( _gl.TEXTURE0 + slot );
state.bindTexture( _gl.TEXTURE_CUBE_MAP, properties.get( texture ).__webglTexture );
}
function setTextureParameters( textureType, texture, isPowerOfTwoImage ) {
var extension;
if ( isPowerOfTwoImage ) {
_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, utils.convert( texture.wrapS ) );
_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, utils.convert( texture.wrapT ) );
_gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, utils.convert( texture.magFilter ) );
_gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, utils.convert( texture.minFilter ) );
} else {
_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, _gl.CLAMP_TO_EDGE );
_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, _gl.CLAMP_TO_EDGE );
if ( texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping ) {
console.warn( 'THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping.', texture );
}
_gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, filterFallback( texture.magFilter ) );
_gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, filterFallback( texture.minFilter ) );
if ( texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ) {
console.warn( 'THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter.', texture );
}
}
extension = extensions.get( 'EXT_texture_filter_anisotropic' );
if ( extension ) {
if ( texture.type === FloatType && extensions.get( 'OES_texture_float_linear' ) === null ) return;
if ( texture.type === HalfFloatType && extensions.get( 'OES_texture_half_float_linear' ) === null ) return;
if ( texture.anisotropy > 1 || properties.get( texture ).__currentAnisotropy ) {
_gl.texParameterf( textureType, extension.TEXTURE_MAX_ANISOTROPY_EXT, Math.min( texture.anisotropy, capabilities.getMaxAnisotropy() ) );
properties.get( texture ).__currentAnisotropy = texture.anisotropy;
}
}
}
function uploadTexture( textureProperties, texture, slot ) {
if ( textureProperties.__webglInit === undefined ) {
textureProperties.__webglInit = true;
texture.addEventListener( 'dispose', onTextureDispose );
textureProperties.__webglTexture = _gl.createTexture();
info.memory.textures ++;
}
state.activeTexture( _gl.TEXTURE0 + slot );
state.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture );
_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY );
_gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha );
_gl.pixelStorei( _gl.UNPACK_ALIGNMENT, texture.unpackAlignment );
var image = clampToMaxSize( texture.image, capabilities.maxTextureSize );
if ( textureNeedsPowerOfTwo( texture ) && isPowerOfTwo( image ) === false ) {
image = makePowerOfTwo( image );
}
var isPowerOfTwoImage = isPowerOfTwo( image ),
glFormat = utils.convert( texture.format ),
glType = utils.convert( texture.type );
setTextureParameters( _gl.TEXTURE_2D, texture, isPowerOfTwoImage );
var mipmap, mipmaps = texture.mipmaps;
if ( texture.isDepthTexture ) {
// populate depth texture with dummy data
var internalFormat = _gl.DEPTH_COMPONENT;
if ( texture.type === FloatType ) {
if ( ! _isWebGL2 ) throw new Error( 'Float Depth Texture only supported in WebGL2.0' );
internalFormat = _gl.DEPTH_COMPONENT32F;
} else if ( _isWebGL2 ) {
// WebGL 2.0 requires signed internalformat for glTexImage2D
internalFormat = _gl.DEPTH_COMPONENT16;
}
if ( texture.format === DepthFormat && internalFormat === _gl.DEPTH_COMPONENT ) {
// The error INVALID_OPERATION is generated by texImage2D if format and internalformat are
// DEPTH_COMPONENT and type is not UNSIGNED_SHORT or UNSIGNED_INT
// (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/)
if ( texture.type !== UnsignedShortType && texture.type !== UnsignedIntType ) {
console.warn( 'THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture.' );
texture.type = UnsignedShortType;
glType = utils.convert( texture.type );
}
}
// Depth stencil textures need the DEPTH_STENCIL internal format
// (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/)
if ( texture.format === DepthStencilFormat ) {
internalFormat = _gl.DEPTH_STENCIL;
// The error INVALID_OPERATION is generated by texImage2D if format and internalformat are
// DEPTH_STENCIL and type is not UNSIGNED_INT_24_8_WEBGL.
// (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/)
if ( texture.type !== UnsignedInt248Type ) {
console.warn( 'THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture.' );
texture.type = UnsignedInt248Type;
glType = utils.convert( texture.type );
}
}
state.texImage2D( _gl.TEXTURE_2D, 0, internalFormat, image.width, image.height, 0, glFormat, glType, null );
} else if ( texture.isDataTexture ) {
// use manually created mipmaps if available
// if there are no manual mipmaps
// set 0 level mipmap and then use GL to generate other mipmap levels
if ( mipmaps.length > 0 && isPowerOfTwoImage ) {
for ( var i = 0, il = mipmaps.length; i < il; i ++ ) {
mipmap = mipmaps[ i ];
state.texImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );
}
texture.generateMipmaps = false;
textureProperties.__maxMipLevel = mipmaps.length - 1;
} else {
state.texImage2D( _gl.TEXTURE_2D, 0, glFormat, image.width, image.height, 0, glFormat, glType, image.data );
textureProperties.__maxMipLevel = 0;
}
} else if ( texture.isCompressedTexture ) {
for ( var i = 0, il = mipmaps.length; i < il; i ++ ) {
mipmap = mipmaps[ i ];
if ( texture.format !== RGBAFormat && texture.format !== RGBFormat ) {
if ( state.getCompressedTextureFormats().indexOf( glFormat ) > - 1 ) {
state.compressedTexImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, mipmap.data );
} else {
console.warn( 'THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()' );
}
} else {
state.texImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );
}
}
textureProperties.__maxMipLevel = mipmaps.length - 1;
} else {
// regular Texture (image, video, canvas)
// use manually created mipmaps if available
// if there are no manual mipmaps
// set 0 level mipmap and then use GL to generate other mipmap levels
if ( mipmaps.length > 0 && isPowerOfTwoImage ) {
for ( var i = 0, il = mipmaps.length; i < il; i ++ ) {
mipmap = mipmaps[ i ];
state.texImage2D( _gl.TEXTURE_2D, i, glFormat, glFormat, glType, mipmap );
}
texture.generateMipmaps = false;
textureProperties.__maxMipLevel = mipmaps.length - 1;
} else {
state.texImage2D( _gl.TEXTURE_2D, 0, glFormat, glFormat, glType, image );
textureProperties.__maxMipLevel = 0;
}
}
if ( textureNeedsGenerateMipmaps( texture, isPowerOfTwoImage ) ) {
generateMipmap( _gl.TEXTURE_2D, texture, image.width, image.height );
}
textureProperties.__version = texture.version;
if ( texture.onUpdate ) texture.onUpdate( texture );
}
// Render targets
// Setup storage for target texture and bind it to correct framebuffer
function setupFrameBufferTexture( framebuffer, renderTarget, attachment, textureTarget ) {
var glFormat = utils.convert( renderTarget.texture.format );
var glType = utils.convert( renderTarget.texture.type );
state.texImage2D( textureTarget, 0, glFormat, renderTarget.width, renderTarget.height, 0, glFormat, glType, null );
_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );
_gl.framebufferTexture2D( _gl.FRAMEBUFFER, attachment, textureTarget, properties.get( renderTarget.texture ).__webglTexture, 0 );
_gl.bindFramebuffer( _gl.FRAMEBUFFER, null );
}
// Setup storage for internal depth/stencil buffers and bind to correct framebuffer
function setupRenderBufferStorage( renderbuffer, renderTarget ) {
_gl.bindRenderbuffer( _gl.RENDERBUFFER, renderbuffer );
if ( renderTarget.depthBuffer && ! renderTarget.stencilBuffer ) {
_gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_COMPONENT16, renderTarget.width, renderTarget.height );
_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer );
} else if ( renderTarget.depthBuffer && renderTarget.stencilBuffer ) {
_gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_STENCIL, renderTarget.width, renderTarget.height );
_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer );
} else {
// FIXME: We don't support !depth !stencil
_gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.RGBA4, renderTarget.width, renderTarget.height );
}
_gl.bindRenderbuffer( _gl.RENDERBUFFER, null );
}
// Setup resources for a Depth Texture for a FBO (needs an extension)
function setupDepthTexture( framebuffer, renderTarget ) {
var isCube = ( renderTarget && renderTarget.isWebGLRenderTargetCube );
if ( isCube ) throw new Error( 'Depth Texture with cube render targets is not supported' );
_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );
if ( ! ( renderTarget.depthTexture && renderTarget.depthTexture.isDepthTexture ) ) {
throw new Error( 'renderTarget.depthTexture must be an instance of THREE.DepthTexture' );
}
// upload an empty depth texture with framebuffer size
if ( ! properties.get( renderTarget.depthTexture ).__webglTexture ||
renderTarget.depthTexture.image.width !== renderTarget.width ||
renderTarget.depthTexture.image.height !== renderTarget.height ) {
renderTarget.depthTexture.image.width = renderTarget.width;
renderTarget.depthTexture.image.height = renderTarget.height;
renderTarget.depthTexture.needsUpdate = true;
}
setTexture2D( renderTarget.depthTexture, 0 );
var webglDepthTexture = properties.get( renderTarget.depthTexture ).__webglTexture;
if ( renderTarget.depthTexture.format === DepthFormat ) {
_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 );
} else if ( renderTarget.depthTexture.format === DepthStencilFormat ) {
_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 );
} else {
throw new Error( 'Unknown depthTexture format' );
}
}
// Setup GL resources for a non-texture depth buffer
function setupDepthRenderbuffer( renderTarget ) {
var renderTargetProperties = properties.get( renderTarget );
var isCube = ( renderTarget.isWebGLRenderTargetCube === true );
if ( renderTarget.depthTexture ) {
if ( isCube ) throw new Error( 'target.depthTexture not supported in Cube render targets' );
setupDepthTexture( renderTargetProperties.__webglFramebuffer, renderTarget );
} else {
if ( isCube ) {
renderTargetProperties.__webglDepthbuffer = [];
for ( var i = 0; i < 6; i ++ ) {
_gl.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer[ i ] );
renderTargetProperties.__webglDepthbuffer[ i ] = _gl.createRenderbuffer();
setupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer[ i ], renderTarget );
}
} else {
_gl.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );
renderTargetProperties.__webglDepthbuffer = _gl.createRenderbuffer();
setupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer, renderTarget );
}
}
_gl.bindFramebuffer( _gl.FRAMEBUFFER, null );
}
// Set up GL resources for the render target
function setupRenderTarget( renderTarget ) {
var renderTargetProperties = properties.get( renderTarget );
var textureProperties = properties.get( renderTarget.texture );
renderTarget.addEventListener( 'dispose', onRenderTargetDispose );
textureProperties.__webglTexture = _gl.createTexture();
info.memory.textures ++;
var isCube = ( renderTarget.isWebGLRenderTargetCube === true );
var isTargetPowerOfTwo = isPowerOfTwo( renderTarget );
// Setup framebuffer
if ( isCube ) {
renderTargetProperties.__webglFramebuffer = [];
for ( var i = 0; i < 6; i ++ ) {
renderTargetProperties.__webglFramebuffer[ i ] = _gl.createFramebuffer();
}
} else {
renderTargetProperties.__webglFramebuffer = _gl.createFramebuffer();
}
// Setup color buffer
if ( isCube ) {
state.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture );
setTextureParameters( _gl.TEXTURE_CUBE_MAP, renderTarget.texture, isTargetPowerOfTwo );
for ( var i = 0; i < 6; i ++ ) {
setupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ i ], renderTarget, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i );
}
if ( textureNeedsGenerateMipmaps( renderTarget.texture, isTargetPowerOfTwo ) ) {
generateMipmap( _gl.TEXTURE_CUBE_MAP, renderTarget.texture, renderTarget.width, renderTarget.height );
}
state.bindTexture( _gl.TEXTURE_CUBE_MAP, null );
} else {
state.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture );
setTextureParameters( _gl.TEXTURE_2D, renderTarget.texture, isTargetPowerOfTwo );
setupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D );
if ( textureNeedsGenerateMipmaps( renderTarget.texture, isTargetPowerOfTwo ) ) {
generateMipmap( _gl.TEXTURE_2D, renderTarget.texture, renderTarget.width, renderTarget.height );
}
state.bindTexture( _gl.TEXTURE_2D, null );
}
// Setup depth and stencil buffers
if ( renderTarget.depthBuffer ) {
setupDepthRenderbuffer( renderTarget );
}
}
function updateRenderTargetMipmap( renderTarget ) {
var texture = renderTarget.texture;
var isTargetPowerOfTwo = isPowerOfTwo( renderTarget );
if ( textureNeedsGenerateMipmaps( texture, isTargetPowerOfTwo ) ) {
var target = renderTarget.isWebGLRenderTargetCube ? _gl.TEXTURE_CUBE_MAP : _gl.TEXTURE_2D;
var webglTexture = properties.get( texture ).__webglTexture;
state.bindTexture( target, webglTexture );
generateMipmap( target, texture, renderTarget.width, renderTarget.height );
state.bindTexture( target, null );
}
}
function updateVideoTexture( texture ) {
var id = texture.id;
var frame = info.render.frame;
// Check the last frame we updated the VideoTexture
if ( _videoTextures[ id ] !== frame ) {
_videoTextures[ id ] = frame;
texture.update();
}
}
this.setTexture2D = setTexture2D;
this.setTextureCube = setTextureCube;
this.setTextureCubeDynamic = setTextureCubeDynamic;
this.setupRenderTarget = setupRenderTarget;
this.updateRenderTargetMipmap = updateRenderTargetMipmap;
}
/**
* @author thespite / http://www.twitter.com/thespite
*/
function WebGLUtils( gl, extensions ) {
function convert( p ) {
var extension;
if ( p === RepeatWrapping ) return gl.REPEAT;
if ( p === ClampToEdgeWrapping ) return gl.CLAMP_TO_EDGE;
if ( p === MirroredRepeatWrapping ) return gl.MIRRORED_REPEAT;
if ( p === NearestFilter ) return gl.NEAREST;
if ( p === NearestMipMapNearestFilter ) return gl.NEAREST_MIPMAP_NEAREST;
if ( p === NearestMipMapLinearFilter ) return gl.NEAREST_MIPMAP_LINEAR;
if ( p === LinearFilter ) return gl.LINEAR;
if ( p === LinearMipMapNearestFilter ) return gl.LINEAR_MIPMAP_NEAREST;
if ( p === LinearMipMapLinearFilter ) return gl.LINEAR_MIPMAP_LINEAR;
if ( p === UnsignedByteType ) return gl.UNSIGNED_BYTE;
if ( p === UnsignedShort4444Type ) return gl.UNSIGNED_SHORT_4_4_4_4;
if ( p === UnsignedShort5551Type ) return gl.UNSIGNED_SHORT_5_5_5_1;
if ( p === UnsignedShort565Type ) return gl.UNSIGNED_SHORT_5_6_5;
if ( p === ByteType ) return gl.BYTE;
if ( p === ShortType ) return gl.SHORT;
if ( p === UnsignedShortType ) return gl.UNSIGNED_SHORT;
if ( p === IntType ) return gl.INT;
if ( p === UnsignedIntType ) return gl.UNSIGNED_INT;
if ( p === FloatType ) return gl.FLOAT;
if ( p === HalfFloatType ) {
extension = extensions.get( 'OES_texture_half_float' );
if ( extension !== null ) return extension.HALF_FLOAT_OES;
}
if ( p === AlphaFormat ) return gl.ALPHA;
if ( p === RGBFormat ) return gl.RGB;
if ( p === RGBAFormat ) return gl.RGBA;
if ( p === LuminanceFormat ) return gl.LUMINANCE;
if ( p === LuminanceAlphaFormat ) return gl.LUMINANCE_ALPHA;
if ( p === DepthFormat ) return gl.DEPTH_COMPONENT;
if ( p === DepthStencilFormat ) return gl.DEPTH_STENCIL;
if ( p === AddEquation ) return gl.FUNC_ADD;
if ( p === SubtractEquation ) return gl.FUNC_SUBTRACT;
if ( p === ReverseSubtractEquation ) return gl.FUNC_REVERSE_SUBTRACT;
if ( p === ZeroFactor ) return gl.ZERO;
if ( p === OneFactor ) return gl.ONE;
if ( p === SrcColorFactor ) return gl.SRC_COLOR;
if ( p === OneMinusSrcColorFactor ) return gl.ONE_MINUS_SRC_COLOR;
if ( p === SrcAlphaFactor ) return gl.SRC_ALPHA;
if ( p === OneMinusSrcAlphaFactor ) return gl.ONE_MINUS_SRC_ALPHA;
if ( p === DstAlphaFactor ) return gl.DST_ALPHA;
if ( p === OneMinusDstAlphaFactor ) return gl.ONE_MINUS_DST_ALPHA;
if ( p === DstColorFactor ) return gl.DST_COLOR;
if ( p === OneMinusDstColorFactor ) return gl.ONE_MINUS_DST_COLOR;
if ( p === SrcAlphaSaturateFactor ) return gl.SRC_ALPHA_SATURATE;
if ( p === RGB_S3TC_DXT1_Format || p === RGBA_S3TC_DXT1_Format ||
p === RGBA_S3TC_DXT3_Format || p === RGBA_S3TC_DXT5_Format ) {
extension = extensions.get( 'WEBGL_compressed_texture_s3tc' );
if ( extension !== null ) {
if ( p === RGB_S3TC_DXT1_Format ) return extension.COMPRESSED_RGB_S3TC_DXT1_EXT;
if ( p === RGBA_S3TC_DXT1_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT1_EXT;
if ( p === RGBA_S3TC_DXT3_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT3_EXT;
if ( p === RGBA_S3TC_DXT5_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT5_EXT;
}
}
if ( p === RGB_PVRTC_4BPPV1_Format || p === RGB_PVRTC_2BPPV1_Format ||
p === RGBA_PVRTC_4BPPV1_Format || p === RGBA_PVRTC_2BPPV1_Format ) {
extension = extensions.get( 'WEBGL_compressed_texture_pvrtc' );
if ( extension !== null ) {
if ( p === RGB_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;
if ( p === RGB_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;
if ( p === RGBA_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;
if ( p === RGBA_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG;
}
}
if ( p === RGB_ETC1_Format ) {
extension = extensions.get( 'WEBGL_compressed_texture_etc1' );
if ( extension !== null ) return extension.COMPRESSED_RGB_ETC1_WEBGL;
}
if ( p === RGBA_ASTC_4x4_Format || p === RGBA_ASTC_5x4_Format || p === RGBA_ASTC_5x5_Format ||
p === RGBA_ASTC_6x5_Format || p === RGBA_ASTC_6x6_Format || p === RGBA_ASTC_8x5_Format ||
p === RGBA_ASTC_8x6_Format || p === RGBA_ASTC_8x8_Format || p === RGBA_ASTC_10x5_Format ||
p === RGBA_ASTC_10x6_Format || p === RGBA_ASTC_10x8_Format || p === RGBA_ASTC_10x10_Format ||
p === RGBA_ASTC_12x10_Format || p === RGBA_ASTC_12x12_Format ) {
extension = extensions.get( 'WEBGL_compressed_texture_astc' );
if ( extension !== null ) {
return p;
}
}
if ( p === MinEquation || p === MaxEquation ) {
extension = extensions.get( 'EXT_blend_minmax' );
if ( extension !== null ) {
if ( p === MinEquation ) return extension.MIN_EXT;
if ( p === MaxEquation ) return extension.MAX_EXT;
}
}
if ( p === UnsignedInt248Type ) {
extension = extensions.get( 'WEBGL_depth_texture' );
if ( extension !== null ) return extension.UNSIGNED_INT_24_8_WEBGL;
}
return 0;
}
return { convert: convert };
}
/**
* @author mrdoob / http://mrdoob.com/
* @author greggman / http://games.greggman.com/
* @author zz85 / http://www.lab4games.net/zz85/blog
* @author tschw
*/
function PerspectiveCamera( fov, aspect, near, far ) {
Camera.call( this );
this.type = 'PerspectiveCamera';
this.fov = fov !== undefined ? fov : 50;
this.zoom = 1;
this.near = near !== undefined ? near : 0.1;
this.far = far !== undefined ? far : 2000;
this.focus = 10;
this.aspect = aspect !== undefined ? aspect : 1;
this.view = null;
this.filmGauge = 35; // width of the film (default in millimeters)
this.filmOffset = 0; // horizontal film offset (same unit as gauge)
this.updateProjectionMatrix();
}
PerspectiveCamera.prototype = Object.assign( Object.create( Camera.prototype ), {
constructor: PerspectiveCamera,
isPerspectiveCamera: true,
copy: function ( source, recursive ) {
Camera.prototype.copy.call( this, source, recursive );
this.fov = source.fov;
this.zoom = source.zoom;
this.near = source.near;
this.far = source.far;
this.focus = source.focus;
this.aspect = source.aspect;
this.view = source.view === null ? null : Object.assign( {}, source.view );
this.filmGauge = source.filmGauge;
this.filmOffset = source.filmOffset;
return this;
},
/**
* Sets the FOV by focal length in respect to the current .filmGauge.
*
* The default film gauge is 35, so that the focal length can be specified for
* a 35mm (full frame) camera.
*
* Values for focal length and film gauge must have the same unit.
*/
setFocalLength: function ( focalLength ) {
// see http://www.bobatkins.com/photography/technical/field_of_view.html
var vExtentSlope = 0.5 * this.getFilmHeight() / focalLength;
this.fov = _Math.RAD2DEG * 2 * Math.atan( vExtentSlope );
this.updateProjectionMatrix();
},
/**
* Calculates the focal length from the current .fov and .filmGauge.
*/
getFocalLength: function () {
var vExtentSlope = Math.tan( _Math.DEG2RAD * 0.5 * this.fov );
return 0.5 * this.getFilmHeight() / vExtentSlope;
},
getEffectiveFOV: function () {
return _Math.RAD2DEG * 2 * Math.atan(
Math.tan( _Math.DEG2RAD * 0.5 * this.fov ) / this.zoom );
},
getFilmWidth: function () {
// film not completely covered in portrait format (aspect < 1)
return this.filmGauge * Math.min( this.aspect, 1 );
},
getFilmHeight: function () {
// film not completely covered in landscape format (aspect > 1)
return this.filmGauge / Math.max( this.aspect, 1 );
},
/**
* Sets an offset in a larger frustum. This is useful for multi-window or
* multi-monitor/multi-machine setups.
*
* For example, if you have 3x2 monitors and each monitor is 1920x1080 and
* the monitors are in grid like this
*
* +---+---+---+
* | A | B | C |
* +---+---+---+
* | D | E | F |
* +---+---+---+
*
* then for each monitor you would call it like this
*
* var w = 1920;
* var h = 1080;
* var fullWidth = w * 3;
* var fullHeight = h * 2;
*
* --A--
* camera.setOffset( fullWidth, fullHeight, w * 0, h * 0, w, h );
* --B--
* camera.setOffset( fullWidth, fullHeight, w * 1, h * 0, w, h );
* --C--
* camera.setOffset( fullWidth, fullHeight, w * 2, h * 0, w, h );
* --D--
* camera.setOffset( fullWidth, fullHeight, w * 0, h * 1, w, h );
* --E--
* camera.setOffset( fullWidth, fullHeight, w * 1, h * 1, w, h );
* --F--
* camera.setOffset( fullWidth, fullHeight, w * 2, h * 1, w, h );
*
* Note there is no reason monitors have to be the same size or in a grid.
*/
setViewOffset: function ( fullWidth, fullHeight, x, y, width, height ) {
this.aspect = fullWidth / fullHeight;
if ( this.view === null ) {
this.view = {
enabled: true,
fullWidth: 1,
fullHeight: 1,
offsetX: 0,
offsetY: 0,
width: 1,
height: 1
};
}
this.view.enabled = true;
this.view.fullWidth = fullWidth;
this.view.fullHeight = fullHeight;
this.view.offsetX = x;
this.view.offsetY = y;
this.view.width = width;
this.view.height = height;
this.updateProjectionMatrix();
},
clearViewOffset: function () {
if ( this.view !== null ) {
this.view.enabled = false;
}
this.updateProjectionMatrix();
},
updateProjectionMatrix: function () {
var near = this.near,
top = near * Math.tan(
_Math.DEG2RAD * 0.5 * this.fov ) / this.zoom,
height = 2 * top,
width = this.aspect * height,
left = - 0.5 * width,
view = this.view;
if ( this.view !== null && this.view.enabled ) {
var fullWidth = view.fullWidth,
fullHeight = view.fullHeight;
left += view.offsetX * width / fullWidth;
top -= view.offsetY * height / fullHeight;
width *= view.width / fullWidth;
height *= view.height / fullHeight;
}
var skew = this.filmOffset;
if ( skew !== 0 ) left += near * skew / this.getFilmWidth();
this.projectionMatrix.makePerspective( left, left + width, top, top - height, near, this.far );
},
toJSON: function ( meta ) {
var data = Object3D.prototype.toJSON.call( this, meta );
data.object.fov = this.fov;
data.object.zoom = this.zoom;
data.object.near = this.near;
data.object.far = this.far;
data.object.focus = this.focus;
data.object.aspect = this.aspect;
if ( this.view !== null ) data.object.view = Object.assign( {}, this.view );
data.object.filmGauge = this.filmGauge;
data.object.filmOffset = this.filmOffset;
return data;
}
} );
/**
* @author mrdoob / http://mrdoob.com/
*/
function ArrayCamera( array ) {
PerspectiveCamera.call( this );
this.cameras = array || [];
}
ArrayCamera.prototype = Object.assign( Object.create( PerspectiveCamera.prototype ), {
constructor: ArrayCamera,
isArrayCamera: true
} );
/**
* @author mrdoob / http://mrdoob.com/
*/
function WebVRManager( renderer ) {
var scope = this;
var device = null;
var frameData = null;
var poseTarget = null;
var standingMatrix = new Matrix4();
var standingMatrixInverse = new Matrix4();
if ( typeof window !== 'undefined' && 'VRFrameData' in window ) {
frameData = new window.VRFrameData();
window.addEventListener( 'vrdisplaypresentchange', onVRDisplayPresentChange, false );
}
var matrixWorldInverse = new Matrix4();
var tempQuaternion = new Quaternion();
var tempPosition = new Vector3();
var cameraL = new PerspectiveCamera();
cameraL.bounds = new Vector4( 0.0, 0.0, 0.5, 1.0 );
cameraL.layers.enable( 1 );
var cameraR = new PerspectiveCamera();
cameraR.bounds = new Vector4( 0.5, 0.0, 0.5, 1.0 );
cameraR.layers.enable( 2 );
var cameraVR = new ArrayCamera( [ cameraL, cameraR ] );
cameraVR.layers.enable( 1 );
cameraVR.layers.enable( 2 );
//
function isPresenting() {
return device !== null && device.isPresenting === true;
}
var currentSize, currentPixelRatio;
function onVRDisplayPresentChange() {
if ( isPresenting() ) {
var eyeParameters = device.getEyeParameters( 'left' );
var renderWidth = eyeParameters.renderWidth;
var renderHeight = eyeParameters.renderHeight;
currentPixelRatio = renderer.getPixelRatio();
currentSize = renderer.getSize();
renderer.setDrawingBufferSize( renderWidth * 2, renderHeight, 1 );
} else if ( scope.enabled ) {
renderer.setDrawingBufferSize( currentSize.width, currentSize.height, currentPixelRatio );
}
}
//
this.enabled = false;
this.userHeight = 1.6;
this.getDevice = function () {
return device;
};
this.setDevice = function ( value ) {
if ( value !== undefined ) device = value;
};
this.setPoseTarget = function ( object ) {
if ( object !== undefined ) poseTarget = object;
};
this.getCamera = function ( camera ) {
if ( device === null ) return camera;
device.depthNear = camera.near;
device.depthFar = camera.far;
device.getFrameData( frameData );
//
var stageParameters = device.stageParameters;
if ( stageParameters ) {
standingMatrix.fromArray( stageParameters.sittingToStandingTransform );
} else {
standingMatrix.makeTranslation( 0, scope.userHeight, 0 );
}
var pose = frameData.pose;
var poseObject = poseTarget !== null ? poseTarget : camera;
// We want to manipulate poseObject by its position and quaternion components since users may rely on them.
poseObject.matrix.copy( standingMatrix );
poseObject.matrix.decompose( poseObject.position, poseObject.quaternion, poseObject.scale );
if ( pose.orientation !== null ) {
tempQuaternion.fromArray( pose.orientation );
poseObject.quaternion.multiply( tempQuaternion );
}
if ( pose.position !== null ) {
tempQuaternion.setFromRotationMatrix( standingMatrix );
tempPosition.fromArray( pose.position );
tempPosition.applyQuaternion( tempQuaternion );
poseObject.position.add( tempPosition );
}
poseObject.updateMatrixWorld();
if ( device.isPresenting === false ) return camera;
//
cameraL.near = camera.near;
cameraR.near = camera.near;
cameraL.far = camera.far;
cameraR.far = camera.far;
cameraVR.matrixWorld.copy( camera.matrixWorld );
cameraVR.matrixWorldInverse.copy( camera.matrixWorldInverse );
cameraL.matrixWorldInverse.fromArray( frameData.leftViewMatrix );
cameraR.matrixWorldInverse.fromArray( frameData.rightViewMatrix );
// TODO (mrdoob) Double check this code
standingMatrixInverse.getInverse( standingMatrix );
cameraL.matrixWorldInverse.multiply( standingMatrixInverse );
cameraR.matrixWorldInverse.multiply( standingMatrixInverse );
var parent = poseObject.parent;
if ( parent !== null ) {
matrixWorldInverse.getInverse( parent.matrixWorld );
cameraL.matrixWorldInverse.multiply( matrixWorldInverse );
cameraR.matrixWorldInverse.multiply( matrixWorldInverse );
}
// envMap and Mirror needs camera.matrixWorld
cameraL.matrixWorld.getInverse( cameraL.matrixWorldInverse );
cameraR.matrixWorld.getInverse( cameraR.matrixWorldInverse );
cameraL.projectionMatrix.fromArray( frameData.leftProjectionMatrix );
cameraR.projectionMatrix.fromArray( frameData.rightProjectionMatrix );
// HACK (mrdoob)
// https://github.com/w3c/webvr/issues/203
cameraVR.projectionMatrix.copy( cameraL.projectionMatrix );
//
var layers = device.getLayers();
if ( layers.length ) {
var layer = layers[ 0 ];
if ( layer.leftBounds !== null && layer.leftBounds.length === 4 ) {
cameraL.bounds.fromArray( layer.leftBounds );
}
if ( layer.rightBounds !== null && layer.rightBounds.length === 4 ) {
cameraR.bounds.fromArray( layer.rightBounds );
}
}
return cameraVR;
};
this.getStandingMatrix = function () {
return standingMatrix;
};
this.submitFrame = function () {
if ( isPresenting() ) device.submitFrame();
};
this.dispose = function () {
if ( typeof window !== 'undefined' ) {
window.removeEventListener( 'vrdisplaypresentchange', onVRDisplayPresentChange );
}
};
}
/**
* @author supereggbert / http://www.paulbrunt.co.uk/
* @author mrdoob / http://mrdoob.com/
* @author alteredq / http://alteredqualia.com/
* @author szimek / https://github.com/szimek/
* @author tschw
*/
function WebGLRenderer( parameters ) {
console.log( 'THREE.WebGLRenderer', REVISION );
parameters = parameters || {};
var _canvas = parameters.canvas !== undefined ? parameters.canvas : document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ),
_context = parameters.context !== undefined ? parameters.context : null,
_alpha = parameters.alpha !== undefined ? parameters.alpha : false,
_depth = parameters.depth !== undefined ? parameters.depth : true,
_stencil = parameters.stencil !== undefined ? parameters.stencil : true,
_antialias = parameters.antialias !== undefined ? parameters.antialias : false,
_premultipliedAlpha = parameters.premultipliedAlpha !== undefined ? parameters.premultipliedAlpha : true,
_preserveDrawingBuffer = parameters.preserveDrawingBuffer !== undefined ? parameters.preserveDrawingBuffer : false,
_powerPreference = parameters.powerPreference !== undefined ? parameters.powerPreference : 'default';
var currentRenderList = null;
var currentRenderState = null;
// public properties
this.domElement = _canvas;
this.context = null;
// clearing
this.autoClear = true;
this.autoClearColor = true;
this.autoClearDepth = true;
this.autoClearStencil = true;
// scene graph
this.sortObjects = true;
// user-defined clipping
this.clippingPlanes = [];
this.localClippingEnabled = false;
// physically based shading
this.gammaFactor = 2.0; // for backwards compatibility
this.gammaInput = false;
this.gammaOutput = false;
// physical lights
this.physicallyCorrectLights = false;
// tone mapping
this.toneMapping = LinearToneMapping;
this.toneMappingExposure = 1.0;
this.toneMappingWhitePoint = 1.0;
// morphs
this.maxMorphTargets = 8;
this.maxMorphNormals = 4;
// internal properties
var _this = this,
_isContextLost = false,
// internal state cache
_currentRenderTarget = null,
_currentFramebuffer = null,
_currentMaterialId = - 1,
_currentGeometryProgram = '',
_currentCamera = null,
_currentArrayCamera = null,
_currentViewport = new Vector4(),
_currentScissor = new Vector4(),
_currentScissorTest = null,
//
_usedTextureUnits = 0,
//
_width = _canvas.width,
_height = _canvas.height,
_pixelRatio = 1,
_viewport = new Vector4( 0, 0, _width, _height ),
_scissor = new Vector4( 0, 0, _width, _height ),
_scissorTest = false,
// frustum
_frustum = new Frustum(),
// clipping
_clipping = new WebGLClipping(),
_clippingEnabled = false,
_localClippingEnabled = false,
// camera matrices cache
_projScreenMatrix = new Matrix4(),
_vector3 = new Vector3();
function getTargetPixelRatio() {
return _currentRenderTarget === null ? _pixelRatio : 1;
}
// initialize
var _gl;
try {
var contextAttributes = {
alpha: _alpha,
depth: _depth,
stencil: _stencil,
antialias: _antialias,
premultipliedAlpha: _premultipliedAlpha,
preserveDrawingBuffer: _preserveDrawingBuffer,
powerPreference: _powerPreference
};
// event listeners must be registered before WebGL context is created, see #12753
_canvas.addEventListener( 'webglcontextlost', onContextLost, false );
_canvas.addEventListener( 'webglcontextrestored', onContextRestore, false );
_gl = _context || _canvas.getContext( 'webgl', contextAttributes ) || _canvas.getContext( 'experimental-webgl', contextAttributes );
if ( _gl === null ) {
if ( _canvas.getContext( 'webgl' ) !== null ) {
throw new Error( 'Error creating WebGL context with your selected attributes.' );
} else {
throw new Error( 'Error creating WebGL context.' );
}
}
// Some experimental-webgl implementations do not have getShaderPrecisionFormat
if ( _gl.getShaderPrecisionFormat === undefined ) {
_gl.getShaderPrecisionFormat = function () {
return { 'rangeMin': 1, 'rangeMax': 1, 'precision': 1 };
};
}
} catch ( error ) {
console.error( 'THREE.WebGLRenderer: ' + error.message );
}
var extensions, capabilities, state, info;
var properties, textures, attributes, geometries, objects;
var programCache, renderLists, renderStates;
var background, morphtargets, bufferRenderer, indexedBufferRenderer;
var spriteRenderer;
var utils;
function initGLContext() {
extensions = new WebGLExtensions( _gl );
extensions.get( 'WEBGL_depth_texture' );
extensions.get( 'OES_texture_float' );
extensions.get( 'OES_texture_float_linear' );
extensions.get( 'OES_texture_half_float' );
extensions.get( 'OES_texture_half_float_linear' );
extensions.get( 'OES_standard_derivatives' );
extensions.get( 'OES_element_index_uint' );
extensions.get( 'ANGLE_instanced_arrays' );
utils = new WebGLUtils( _gl, extensions );
capabilities = new WebGLCapabilities( _gl, extensions, parameters );
state = new WebGLState( _gl, extensions, utils );
state.scissor( _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ) );
state.viewport( _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ) );
info = new WebGLInfo( _gl );
properties = new WebGLProperties();
textures = new WebGLTextures( _gl, extensions, state, properties, capabilities, utils, info );
attributes = new WebGLAttributes( _gl );
geometries = new WebGLGeometries( _gl, attributes, info );
objects = new WebGLObjects( geometries, info );
morphtargets = new WebGLMorphtargets( _gl );
programCache = new WebGLPrograms( _this, extensions, capabilities );
renderLists = new WebGLRenderLists();
renderStates = new WebGLRenderStates();
background = new WebGLBackground( _this, state, geometries, _premultipliedAlpha );
bufferRenderer = new WebGLBufferRenderer( _gl, extensions, info );
indexedBufferRenderer = new WebGLIndexedBufferRenderer( _gl, extensions, info );
spriteRenderer = new WebGLSpriteRenderer( _this, _gl, state, textures, capabilities );
info.programs = programCache.programs;
_this.context = _gl;
_this.capabilities = capabilities;
_this.extensions = extensions;
_this.properties = properties;
_this.renderLists = renderLists;
_this.state = state;
_this.info = info;
}
initGLContext();
// vr
var vr = new WebVRManager( _this );
this.vr = vr;
// shadow map
var shadowMap = new WebGLShadowMap( _this, objects, capabilities.maxTextureSize );
this.shadowMap = shadowMap;
// API
this.getContext = function () {
return _gl;
};
this.getContextAttributes = function () {
return _gl.getContextAttributes();
};
this.forceContextLoss = function () {
var extension = extensions.get( 'WEBGL_lose_context' );
if ( extension ) extension.loseContext();
};
this.forceContextRestore = function () {
var extension = extensions.get( 'WEBGL_lose_context' );
if ( extension ) extension.restoreContext();
};
this.getPixelRatio = function () {
return _pixelRatio;
};
this.setPixelRatio = function ( value ) {
if ( value === undefined ) return;
_pixelRatio = value;
this.setSize( _width, _height, false );
};
this.getSize = function () {
return {
width: _width,
height: _height
};
};
this.setSize = function ( width, height, updateStyle ) {
var device = vr.getDevice();
if ( device && device.isPresenting ) {
console.warn( 'THREE.WebGLRenderer: Can\'t change size while VR device is presenting.' );
return;
}
_width = width;
_height = height;
_canvas.width = width * _pixelRatio;
_canvas.height = height * _pixelRatio;
if ( updateStyle !== false ) {
_canvas.style.width = width + 'px';
_canvas.style.height = height + 'px';
}
this.setViewport( 0, 0, width, height );
};
this.getDrawingBufferSize = function () {
return {
width: _width * _pixelRatio,
height: _height * _pixelRatio
};
};
this.setDrawingBufferSize = function ( width, height, pixelRatio ) {
_width = width;
_height = height;
_pixelRatio = pixelRatio;
_canvas.width = width * pixelRatio;
_canvas.height = height * pixelRatio;
this.setViewport( 0, 0, width, height );
};
this.getCurrentViewport = function () {
return _currentViewport;
};
this.setViewport = function ( x, y, width, height ) {
_viewport.set( x, _height - y - height, width, height );
state.viewport( _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ) );
};
this.setScissor = function ( x, y, width, height ) {
_scissor.set( x, _height - y - height, width, height );
state.scissor( _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ) );
};
this.setScissorTest = function ( boolean ) {
state.setScissorTest( _scissorTest = boolean );
};
// Clearing
this.getClearColor = function () {
return background.getClearColor();
};
this.setClearColor = function () {
background.setClearColor.apply( background, arguments );
};
this.getClearAlpha = function () {
return background.getClearAlpha();
};
this.setClearAlpha = function () {
background.setClearAlpha.apply( background, arguments );
};
this.clear = function ( color, depth, stencil ) {
var bits = 0;
if ( color === undefined || color ) bits |= _gl.COLOR_BUFFER_BIT;
if ( depth === undefined || depth ) bits |= _gl.DEPTH_BUFFER_BIT;
if ( stencil === undefined || stencil ) bits |= _gl.STENCIL_BUFFER_BIT;
_gl.clear( bits );
};
this.clearColor = function () {
this.clear( true, false, false );
};
this.clearDepth = function () {
this.clear( false, true, false );
};
this.clearStencil = function () {
this.clear( false, false, true );
};
this.clearTarget = function ( renderTarget, color, depth, stencil ) {
this.setRenderTarget( renderTarget );
this.clear( color, depth, stencil );
};
//
this.dispose = function () {
_canvas.removeEventListener( 'webglcontextlost', onContextLost, false );
_canvas.removeEventListener( 'webglcontextrestored', onContextRestore, false );
renderLists.dispose();
renderStates.dispose();
properties.dispose();
objects.dispose();
vr.dispose();
stopAnimation();
};
// Events
function onContextLost( event ) {
event.preventDefault();
console.log( 'THREE.WebGLRenderer: Context Lost.' );
_isContextLost = true;
}
function onContextRestore( /* event */ ) {
console.log( 'THREE.WebGLRenderer: Context Restored.' );
_isContextLost = false;
initGLContext();
}
function onMaterialDispose( event ) {
var material = event.target;
material.removeEventListener( 'dispose', onMaterialDispose );
deallocateMaterial( material );
}
// Buffer deallocation
function deallocateMaterial( material ) {
releaseMaterialProgramReference( material );
properties.remove( material );
}
function releaseMaterialProgramReference( material ) {
var programInfo = properties.get( material ).program;
material.program = undefined;
if ( programInfo !== undefined ) {
programCache.releaseProgram( programInfo );
}
}
// Buffer rendering
function renderObjectImmediate( object, program, material ) {
object.render( function ( object ) {
_this.renderBufferImmediate( object, program, material );
} );
}
this.renderBufferImmediate = function ( object, program, material ) {
state.initAttributes();
var buffers = properties.get( object );
if ( object.hasPositions && ! buffers.position ) buffers.position = _gl.createBuffer();
if ( object.hasNormals && ! buffers.normal ) buffers.normal = _gl.createBuffer();
if ( object.hasUvs && ! buffers.uv ) buffers.uv = _gl.createBuffer();
if ( object.hasColors && ! buffers.color ) buffers.color = _gl.createBuffer();
var programAttributes = program.getAttributes();
if ( object.hasPositions ) {
_gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.position );
_gl.bufferData( _gl.ARRAY_BUFFER, object.positionArray, _gl.DYNAMIC_DRAW );
state.enableAttribute( programAttributes.position );
_gl.vertexAttribPointer( programAttributes.position, 3, _gl.FLOAT, false, 0, 0 );
}
if ( object.hasNormals ) {
_gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.normal );
if ( ! material.isMeshPhongMaterial &&
! material.isMeshStandardMaterial &&
! material.isMeshNormalMaterial &&
material.flatShading === true ) {
for ( var i = 0, l = object.count * 3; i < l; i += 9 ) {
var array = object.normalArray;
var nx = ( array[ i + 0 ] + array[ i + 3 ] + array[ i + 6 ] ) / 3;
var ny = ( array[ i + 1 ] + array[ i + 4 ] + array[ i + 7 ] ) / 3;
var nz = ( array[ i + 2 ] + array[ i + 5 ] + array[ i + 8 ] ) / 3;
array[ i + 0 ] = nx;
array[ i + 1 ] = ny;
array[ i + 2 ] = nz;
array[ i + 3 ] = nx;
array[ i + 4 ] = ny;
array[ i + 5 ] = nz;
array[ i + 6 ] = nx;
array[ i + 7 ] = ny;
array[ i + 8 ] = nz;
}
}
_gl.bufferData( _gl.ARRAY_BUFFER, object.normalArray, _gl.DYNAMIC_DRAW );
state.enableAttribute( programAttributes.normal );
_gl.vertexAttribPointer( programAttributes.normal, 3, _gl.FLOAT, false, 0, 0 );
}
if ( object.hasUvs && material.map ) {
_gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.uv );
_gl.bufferData( _gl.ARRAY_BUFFER, object.uvArray, _gl.DYNAMIC_DRAW );
state.enableAttribute( programAttributes.uv );
_gl.vertexAttribPointer( programAttributes.uv, 2, _gl.FLOAT, false, 0, 0 );
}
if ( object.hasColors && material.vertexColors !== NoColors ) {
_gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.color );
_gl.bufferData( _gl.ARRAY_BUFFER, object.colorArray, _gl.DYNAMIC_DRAW );
state.enableAttribute( programAttributes.color );
_gl.vertexAttribPointer( programAttributes.color, 3, _gl.FLOAT, false, 0, 0 );
}
state.disableUnusedAttributes();
_gl.drawArrays( _gl.TRIANGLES, 0, object.count );
object.count = 0;
};
this.renderBufferDirect = function ( camera, fog, geometry, material, object, group ) {
var frontFaceCW = ( object.isMesh && object.matrixWorld.determinant() < 0 );
state.setMaterial( material, frontFaceCW );
var program = setProgram( camera, fog, material, object );
var geometryProgram = geometry.id + '_' + program.id + '_' + ( material.wireframe === true );
var updateBuffers = false;
if ( geometryProgram !== _currentGeometryProgram ) {
_currentGeometryProgram = geometryProgram;
updateBuffers = true;
}
if ( object.morphTargetInfluences ) {
morphtargets.update( object, geometry, material, program );
updateBuffers = true;
}
//
var index = geometry.index;
var position = geometry.attributes.position;
var rangeFactor = 1;
if ( material.wireframe === true ) {
index = geometries.getWireframeAttribute( geometry );
rangeFactor = 2;
}
var attribute;
var renderer = bufferRenderer;
if ( index !== null ) {
attribute = attributes.get( index );
renderer = indexedBufferRenderer;
renderer.setIndex( attribute );
}
if ( updateBuffers ) {
setupVertexAttributes( material, program, geometry );
if ( index !== null ) {
_gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, attribute.buffer );
}
}
//
var dataCount = Infinity;
if ( index !== null ) {
dataCount = index.count;
} else if ( position !== undefined ) {
dataCount = position.count;
}
var rangeStart = geometry.drawRange.start * rangeFactor;
var rangeCount = geometry.drawRange.count * rangeFactor;
var groupStart = group !== null ? group.start * rangeFactor : 0;
var groupCount = group !== null ? group.count * rangeFactor : Infinity;
var drawStart = Math.max( rangeStart, groupStart );
var drawEnd = Math.min( dataCount, rangeStart + rangeCount, groupStart + groupCount ) - 1;
var drawCount = Math.max( 0, drawEnd - drawStart + 1 );
if ( drawCount === 0 ) return;
//
if ( object.isMesh ) {
if ( material.wireframe === true ) {
state.setLineWidth( material.wireframeLinewidth * getTargetPixelRatio() );
renderer.setMode( _gl.LINES );
} else {
switch ( object.drawMode ) {
case TrianglesDrawMode:
renderer.setMode( _gl.TRIANGLES );
break;
case TriangleStripDrawMode:
renderer.setMode( _gl.TRIANGLE_STRIP );
break;
case TriangleFanDrawMode:
renderer.setMode( _gl.TRIANGLE_FAN );
break;
}
}
} else if ( object.isLine ) {
var lineWidth = material.linewidth;
if ( lineWidth === undefined ) lineWidth = 1; // Not using Line*Material
state.setLineWidth( lineWidth * getTargetPixelRatio() );
if ( object.isLineSegments ) {
renderer.setMode( _gl.LINES );
} else if ( object.isLineLoop ) {
renderer.setMode( _gl.LINE_LOOP );
} else {
renderer.setMode( _gl.LINE_STRIP );
}
} else if ( object.isPoints ) {
renderer.setMode( _gl.POINTS );
}
if ( geometry && geometry.isInstancedBufferGeometry ) {
if ( geometry.maxInstancedCount > 0 ) {
renderer.renderInstances( geometry, drawStart, drawCount );
}
} else {
renderer.render( drawStart, drawCount );
}
};
function setupVertexAttributes( material, program, geometry ) {
if ( geometry && geometry.isInstancedBufferGeometry ) {
if ( extensions.get( 'ANGLE_instanced_arrays' ) === null ) {
console.error( 'THREE.WebGLRenderer.setupVertexAttributes: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' );
return;
}
}
state.initAttributes();
var geometryAttributes = geometry.attributes;
var programAttributes = program.getAttributes();
var materialDefaultAttributeValues = material.defaultAttributeValues;
for ( var name in programAttributes ) {
var programAttribute = programAttributes[ name ];
if ( programAttribute >= 0 ) {
var geometryAttribute = geometryAttributes[ name ];
if ( geometryAttribute !== undefined ) {
var normalized = geometryAttribute.normalized;
var size = geometryAttribute.itemSize;
var attribute = attributes.get( geometryAttribute );
// TODO Attribute may not be available on context restore
if ( attribute === undefined ) continue;
var buffer = attribute.buffer;
var type = attribute.type;
var bytesPerElement = attribute.bytesPerElement;
if ( geometryAttribute.isInterleavedBufferAttribute ) {
var data = geometryAttribute.data;
var stride = data.stride;
var offset = geometryAttribute.offset;
if ( data && data.isInstancedInterleavedBuffer ) {
state.enableAttributeAndDivisor( programAttribute, data.meshPerAttribute );
if ( geometry.maxInstancedCount === undefined ) {
geometry.maxInstancedCount = data.meshPerAttribute * data.count;
}
} else {
state.enableAttribute( programAttribute );
}
_gl.bindBuffer( _gl.ARRAY_BUFFER, buffer );
_gl.vertexAttribPointer( programAttribute, size, type, normalized, stride * bytesPerElement, offset * bytesPerElement );
} else {
if ( geometryAttribute.isInstancedBufferAttribute ) {
state.enableAttributeAndDivisor( programAttribute, geometryAttribute.meshPerAttribute );
if ( geometry.maxInstancedCount === undefined ) {
geometry.maxInstancedCount = geometryAttribute.meshPerAttribute * geometryAttribute.count;
}
} else {
state.enableAttribute( programAttribute );
}
_gl.bindBuffer( _gl.ARRAY_BUFFER, buffer );
_gl.vertexAttribPointer( programAttribute, size, type, normalized, 0, 0 );
}
} else if ( materialDefaultAttributeValues !== undefined ) {
var value = materialDefaultAttributeValues[ name ];
if ( value !== undefined ) {
switch ( value.length ) {
case 2:
_gl.vertexAttrib2fv( programAttribute, value );
break;
case 3:
_gl.vertexAttrib3fv( programAttribute, value );
break;
case 4:
_gl.vertexAttrib4fv( programAttribute, value );
break;
default:
_gl.vertexAttrib1fv( programAttribute, value );
}
}
}
}
}
state.disableUnusedAttributes();
}
// Compile
this.compile = function ( scene, camera ) {
currentRenderState = renderStates.get( scene, camera );
currentRenderState.init();
scene.traverse( function ( object ) {
if ( object.isLight ) {
currentRenderState.pushLight( object );
if ( object.castShadow ) {
currentRenderState.pushShadow( object );
}
}
} );
currentRenderState.setupLights( camera );
scene.traverse( function ( object ) {
if ( object.material ) {
if ( Array.isArray( object.material ) ) {
for ( var i = 0; i < object.material.length; i ++ ) {
initMaterial( object.material[ i ], scene.fog, object );
}
} else {
initMaterial( object.material, scene.fog, object );
}
}
} );
};
// Animation Loop
var isAnimating = false;
var onAnimationFrame = null;
function startAnimation() {
if ( isAnimating ) return;
requestAnimationLoopFrame();
isAnimating = true;
}
function stopAnimation() {
isAnimating = false;
}
function requestAnimationLoopFrame() {
var device = vr.getDevice();
if ( device && device.isPresenting ) {
device.requestAnimationFrame( animationLoop );
} else {
window.requestAnimationFrame( animationLoop );
}
}
function animationLoop( time ) {
if ( isAnimating === false ) return;
onAnimationFrame( time );
requestAnimationLoopFrame();
}
this.animate = function ( callback ) {
onAnimationFrame = callback;
onAnimationFrame !== null ? startAnimation() : stopAnimation();
};
// Rendering
this.render = function ( scene, camera, renderTarget, forceClear ) {
if ( ! ( camera && camera.isCamera ) ) {
console.error( 'THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.' );
return;
}
if ( _isContextLost ) return;
// reset caching for this frame
_currentGeometryProgram = '';
_currentMaterialId = - 1;
_currentCamera = null;
// update scene graph
if ( scene.autoUpdate === true ) scene.updateMatrixWorld();
// update camera matrices and frustum
if ( camera.parent === null ) camera.updateMatrixWorld();
if ( vr.enabled ) {
camera = vr.getCamera( camera );
}
//
currentRenderState = renderStates.get( scene, camera );
currentRenderState.init();
scene.onBeforeRender( _this, scene, camera, renderTarget );
_projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );
_frustum.setFromMatrix( _projScreenMatrix );
_localClippingEnabled = this.localClippingEnabled;
_clippingEnabled = _clipping.init( this.clippingPlanes, _localClippingEnabled, camera );
currentRenderList = renderLists.get( scene, camera );
currentRenderList.init();
projectObject( scene, camera, _this.sortObjects );
if ( _this.sortObjects === true ) {
currentRenderList.sort();
}
//
if ( _clippingEnabled ) _clipping.beginShadows();
var shadowsArray = currentRenderState.state.shadowsArray;
shadowMap.render( shadowsArray, scene, camera );
currentRenderState.setupLights( camera );
if ( _clippingEnabled ) _clipping.endShadows();
//
if ( this.info.autoReset ) this.info.reset();
if ( renderTarget === undefined ) {
renderTarget = null;
}
this.setRenderTarget( renderTarget );
//
background.render( currentRenderList, scene, camera, forceClear );
// render scene
var opaqueObjects = currentRenderList.opaque;
var transparentObjects = currentRenderList.transparent;
if ( scene.overrideMaterial ) {
var overrideMaterial = scene.overrideMaterial;
if ( opaqueObjects.length ) renderObjects( opaqueObjects, scene, camera, overrideMaterial );
if ( transparentObjects.length ) renderObjects( transparentObjects, scene, camera, overrideMaterial );
} else {
// opaque pass (front-to-back order)
if ( opaqueObjects.length ) renderObjects( opaqueObjects, scene, camera );
// transparent pass (back-to-front order)
if ( transparentObjects.length ) renderObjects( transparentObjects, scene, camera );
}
// custom renderers
var spritesArray = currentRenderState.state.spritesArray;
spriteRenderer.render( spritesArray, scene, camera );
// Generate mipmap if we're using any kind of mipmap filtering
if ( renderTarget ) {
textures.updateRenderTargetMipmap( renderTarget );
}
// Ensure depth buffer writing is enabled so it can be cleared on next render
state.buffers.depth.setTest( true );
state.buffers.depth.setMask( true );
state.buffers.color.setMask( true );
state.setPolygonOffset( false );
scene.onAfterRender( _this, scene, camera );
if ( vr.enabled ) {
vr.submitFrame();
}
// _gl.finish();
currentRenderList = null;
currentRenderState = null;
};
/*
// TODO Duplicated code (Frustum)
var _sphere = new Sphere();
function isObjectViewable( object ) {
var geometry = object.geometry;
if ( geometry.boundingSphere === null )
geometry.computeBoundingSphere();
_sphere.copy( geometry.boundingSphere ).
applyMatrix4( object.matrixWorld );
return isSphereViewable( _sphere );
}
function isSpriteViewable( sprite ) {
_sphere.center.set( 0, 0, 0 );
_sphere.radius = 0.7071067811865476;
_sphere.applyMatrix4( sprite.matrixWorld );
return isSphereViewable( _sphere );
}
function isSphereViewable( sphere ) {
if ( ! _frustum.intersectsSphere( sphere ) ) return false;
var numPlanes = _clipping.numPlanes;
if ( numPlanes === 0 ) return true;
var planes = _this.clippingPlanes,
center = sphere.center,
negRad = - sphere.radius,
i = 0;
do {
// out when deeper than radius in the negative halfspace
if ( planes[ i ].distanceToPoint( center ) < negRad ) return false;
} while ( ++ i !== numPlanes );
return true;
}
*/
function projectObject( object, camera, sortObjects ) {
if ( object.visible === false ) return;
var visible = object.layers.test( camera.layers );
if ( visible ) {
if ( object.isLight ) {
currentRenderState.pushLight( object );
if ( object.castShadow ) {
currentRenderState.pushShadow( object );
}
} else if ( object.isSprite ) {
if ( ! object.frustumCulled || _frustum.intersectsSprite( object ) ) {
currentRenderState.pushSprite( object );
}
} else if ( object.isImmediateRenderObject ) {
if ( sortObjects ) {
_vector3.setFromMatrixPosition( object.matrixWorld )
.applyMatrix4( _projScreenMatrix );
}
currentRenderList.push( object, null, object.material, _vector3.z, null );
} else if ( object.isMesh || object.isLine || object.isPoints ) {
if ( object.isSkinnedMesh ) {
object.skeleton.update();
}
if ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) {
if ( sortObjects ) {
_vector3.setFromMatrixPosition( object.matrixWorld )
.applyMatrix4( _projScreenMatrix );
}
var geometry = objects.update( object );
var material = object.material;
if ( Array.isArray( material ) ) {
var groups = geometry.groups;
for ( var i = 0, l = groups.length; i < l; i ++ ) {
var group = groups[ i ];
var groupMaterial = material[ group.materialIndex ];
if ( groupMaterial && groupMaterial.visible ) {
currentRenderList.push( object, geometry, groupMaterial, _vector3.z, group );
}
}
} else if ( material.visible ) {
currentRenderList.push( object, geometry, material, _vector3.z, null );
}
}
}
}
var children = object.children;
for ( var i = 0, l = children.length; i < l; i ++ ) {
projectObject( children[ i ], camera, sortObjects );
}
}
function renderObjects( renderList, scene, camera, overrideMaterial ) {
for ( var i = 0, l = renderList.length; i < l; i ++ ) {
var renderItem = renderList[ i ];
var object = renderItem.object;
var geometry = renderItem.geometry;
var material = overrideMaterial === undefined ? renderItem.material : overrideMaterial;
var group = renderItem.group;
if ( camera.isArrayCamera ) {
_currentArrayCamera = camera;
var cameras = camera.cameras;
for ( var j = 0, jl = cameras.length; j < jl; j ++ ) {
var camera2 = cameras[ j ];
if ( object.layers.test( camera2.layers ) ) {
var bounds = camera2.bounds;
var x = bounds.x * _width;
var y = bounds.y * _height;
var width = bounds.z * _width;
var height = bounds.w * _height;
state.viewport( _currentViewport.set( x, y, width, height ).multiplyScalar( _pixelRatio ) );
renderObject( object, scene, camera2, geometry, material, group );
}
}
} else {
_currentArrayCamera = null;
renderObject( object, scene, camera, geometry, material, group );
}
}
}
function renderObject( object, scene, camera, geometry, material, group ) {
object.onBeforeRender( _this, scene, camera, geometry, material, group );
currentRenderState = renderStates.get( scene, _currentArrayCamera || camera );
object.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld );
object.normalMatrix.getNormalMatrix( object.modelViewMatrix );
if ( object.isImmediateRenderObject ) {
var frontFaceCW = ( object.isMesh && object.matrixWorld.determinant() < 0 );
state.setMaterial( material, frontFaceCW );
var program = setProgram( camera, scene.fog, material, object );
_currentGeometryProgram = '';
renderObjectImmediate( object, program, material );
} else {
_this.renderBufferDirect( camera, scene.fog, geometry, material, object, group );
}
object.onAfterRender( _this, scene, camera, geometry, material, group );
currentRenderState = renderStates.get( scene, _currentArrayCamera || camera );
}
function initMaterial( material, fog, object ) {
var materialProperties = properties.get( material );
var lights = currentRenderState.state.lights;
var shadowsArray = currentRenderState.state.shadowsArray;
var parameters = programCache.getParameters(
material, lights.state, shadowsArray, fog, _clipping.numPlanes, _clipping.numIntersection, object );
var code = programCache.getProgramCode( material, parameters );
var program = materialProperties.program;
var programChange = true;
if ( program === undefined ) {
// new material
material.addEventListener( 'dispose', onMaterialDispose );
} else if ( program.code !== code ) {
// changed glsl or parameters
releaseMaterialProgramReference( material );
} else if ( materialProperties.lightsHash !== lights.state.hash ) {
properties.update( material, 'lightsHash', lights.state.hash );
programChange = false;
} else if ( parameters.shaderID !== undefined ) {
// same glsl and uniform list
return;
} else {
// only rebuild uniform list
programChange = false;
}
if ( programChange ) {
if ( parameters.shaderID ) {
var shader = ShaderLib[ parameters.shaderID ];
materialProperties.shader = {
name: material.type,
uniforms: UniformsUtils.clone( shader.uniforms ),
vertexShader: shader.vertexShader,
fragmentShader: shader.fragmentShader
};
} else {
materialProperties.shader = {
name: material.type,
uniforms: material.uniforms,
vertexShader: material.vertexShader,
fragmentShader: material.fragmentShader
};
}
material.onBeforeCompile( materialProperties.shader, _this );
program = programCache.acquireProgram( material, materialProperties.shader, parameters, code );
materialProperties.program = program;
material.program = program;
}
var programAttributes = program.getAttributes();
if ( material.morphTargets ) {
material.numSupportedMorphTargets = 0;
for ( var i = 0; i < _this.maxMorphTargets; i ++ ) {
if ( programAttributes[ 'morphTarget' + i ] >= 0 ) {
material.numSupportedMorphTargets ++;
}
}
}
if ( material.morphNormals ) {
material.numSupportedMorphNormals = 0;
for ( var i = 0; i < _this.maxMorphNormals; i ++ ) {
if ( programAttributes[ 'morphNormal' + i ] >= 0 ) {
material.numSupportedMorphNormals ++;
}
}
}
var uniforms = materialProperties.shader.uniforms;
if ( ! material.isShaderMaterial &&
! material.isRawShaderMaterial ||
material.clipping === true ) {
materialProperties.numClippingPlanes = _clipping.numPlanes;
materialProperties.numIntersection = _clipping.numIntersection;
uniforms.clippingPlanes = _clipping.uniform;
}
materialProperties.fog = fog;
// store the light setup it was created for
materialProperties.lightsHash = lights.state.hash;
if ( material.lights ) {
// wire up the material to this renderer's lighting state
uniforms.ambientLightColor.value = lights.state.ambient;
uniforms.directionalLights.value = lights.state.directional;
uniforms.spotLights.value = lights.state.spot;
uniforms.rectAreaLights.value = lights.state.rectArea;
uniforms.pointLights.value = lights.state.point;
uniforms.hemisphereLights.value = lights.state.hemi;
uniforms.directionalShadowMap.value = lights.state.directionalShadowMap;
uniforms.directionalShadowMatrix.value = lights.state.directionalShadowMatrix;
uniforms.spotShadowMap.value = lights.state.spotShadowMap;
uniforms.spotShadowMatrix.value = lights.state.spotShadowMatrix;
uniforms.pointShadowMap.value = lights.state.pointShadowMap;
uniforms.pointShadowMatrix.value = lights.state.pointShadowMatrix;
// TODO (abelnation): add area lights shadow info to uniforms
}
var progUniforms = materialProperties.program.getUniforms(),
uniformsList =
WebGLUniforms.seqWithValue( progUniforms.seq, uniforms );
materialProperties.uniformsList = uniformsList;
}
function setProgram( camera, fog, material, object ) {
_usedTextureUnits = 0;
var materialProperties = properties.get( material );
var lights = currentRenderState.state.lights;
if ( _clippingEnabled ) {
if ( _localClippingEnabled || camera !== _currentCamera ) {
var useCache =
camera === _currentCamera &&
material.id === _currentMaterialId;
// we might want to call this function with some ClippingGroup
// object instead of the material, once it becomes feasible
// (#8465, #8379)
_clipping.setState(
material.clippingPlanes, material.clipIntersection, material.clipShadows,
camera, materialProperties, useCache );
}
}
if ( material.needsUpdate === false ) {
if ( materialProperties.program === undefined ) {
material.needsUpdate = true;
} else if ( material.fog && materialProperties.fog !== fog ) {
material.needsUpdate = true;
} else if ( material.lights && materialProperties.lightsHash !== lights.state.hash ) {
material.needsUpdate = true;
} else if ( materialProperties.numClippingPlanes !== undefined &&
( materialProperties.numClippingPlanes !== _clipping.numPlanes ||
materialProperties.numIntersection !== _clipping.numIntersection ) ) {
material.needsUpdate = true;
}
}
if ( material.needsUpdate ) {
initMaterial( material, fog, object );
material.needsUpdate = false;
}
var refreshProgram = false;
var refreshMaterial = false;
var refreshLights = false;
var program = materialProperties.program,
p_uniforms = program.getUniforms(),
m_uniforms = materialProperties.shader.uniforms;
if ( state.useProgram( program.program ) ) {
refreshProgram = true;
refreshMaterial = true;
refreshLights = true;
}
if ( material.id !== _currentMaterialId ) {
_currentMaterialId = material.id;
refreshMaterial = true;
}
if ( refreshProgram || camera !== _currentCamera ) {
p_uniforms.setValue( _gl, 'projectionMatrix', camera.projectionMatrix );
if ( capabilities.logarithmicDepthBuffer ) {
p_uniforms.setValue( _gl, 'logDepthBufFC',
2.0 / ( Math.log( camera.far + 1.0 ) / Math.LN2 ) );
}
// Avoid unneeded uniform updates per ArrayCamera's sub-camera
if ( _currentCamera !== ( _currentArrayCamera || camera ) ) {
_currentCamera = ( _currentArrayCamera || camera );
// lighting uniforms depend on the camera so enforce an update
// now, in case this material supports lights - or later, when
// the next material that does gets activated:
refreshMaterial = true; // set to true on material change
refreshLights = true; // remains set until update done
}
// load material specific uniforms
// (shader material also gets them for the sake of genericity)
if ( material.isShaderMaterial ||
material.isMeshPhongMaterial ||
material.isMeshStandardMaterial ||
material.envMap ) {
var uCamPos = p_uniforms.map.cameraPosition;
if ( uCamPos !== undefined ) {
uCamPos.setValue( _gl,
_vector3.setFromMatrixPosition( camera.matrixWorld ) );
}
}
if ( material.isMeshPhongMaterial ||
material.isMeshLambertMaterial ||
material.isMeshBasicMaterial ||
material.isMeshStandardMaterial ||
material.isShaderMaterial ||
material.skinning ) {
p_uniforms.setValue( _gl, 'viewMatrix', camera.matrixWorldInverse );
}
}
// skinning uniforms must be set even if material didn't change
// auto-setting of texture unit for bone texture must go before other textures
// not sure why, but otherwise weird things happen
if ( material.skinning ) {
p_uniforms.setOptional( _gl, object, 'bindMatrix' );
p_uniforms.setOptional( _gl, object, 'bindMatrixInverse' );
var skeleton = object.skeleton;
if ( skeleton ) {
var bones = skeleton.bones;
if ( capabilities.floatVertexTextures ) {
if ( skeleton.boneTexture === undefined ) {
// layout (1 matrix = 4 pixels)
// RGBA RGBA RGBA RGBA (=> column1, column2, column3, column4)
// with 8x8 pixel texture max 16 bones * 4 pixels = (8 * 8)
// 16x16 pixel texture max 64 bones * 4 pixels = (16 * 16)
// 32x32 pixel texture max 256 bones * 4 pixels = (32 * 32)
// 64x64 pixel texture max 1024 bones * 4 pixels = (64 * 64)
var size = Math.sqrt( bones.length * 4 ); // 4 pixels needed for 1 matrix
size = _Math.ceilPowerOfTwo( size );
size = Math.max( size, 4 );
var boneMatrices = new Float32Array( size * size * 4 ); // 4 floats per RGBA pixel
boneMatrices.set( skeleton.boneMatrices ); // copy current values
var boneTexture = new DataTexture( boneMatrices, size, size, RGBAFormat, FloatType );
boneTexture.needsUpdate = true;
skeleton.boneMatrices = boneMatrices;
skeleton.boneTexture = boneTexture;
skeleton.boneTextureSize = size;
}
p_uniforms.setValue( _gl, 'boneTexture', skeleton.boneTexture );
p_uniforms.setValue( _gl, 'boneTextureSize', skeleton.boneTextureSize );
} else {
p_uniforms.setOptional( _gl, skeleton, 'boneMatrices' );
}
}
}
if ( refreshMaterial ) {
p_uniforms.setValue( _gl, 'toneMappingExposure', _this.toneMappingExposure );
p_uniforms.setValue( _gl, 'toneMappingWhitePoint', _this.toneMappingWhitePoint );
if ( material.lights ) {
// the current material requires lighting info
// note: all lighting uniforms are always set correctly
// they simply reference the renderer's state for their
// values
//
// use the current material's .needsUpdate flags to set
// the GL state when required
markUniformsLightsNeedsUpdate( m_uniforms, refreshLights );
}
// refresh uniforms common to several materials
if ( fog && material.fog ) {
refreshUniformsFog( m_uniforms, fog );
}
if ( material.isMeshBasicMaterial ) {
refreshUniformsCommon( m_uniforms, material );
} else if ( material.isMeshLambertMaterial ) {
refreshUniformsCommon( m_uniforms, material );
refreshUniformsLambert( m_uniforms, material );
} else if ( material.isMeshPhongMaterial ) {
refreshUniformsCommon( m_uniforms, material );
if ( material.isMeshToonMaterial ) {
refreshUniformsToon( m_uniforms, material );
} else {
refreshUniformsPhong( m_uniforms, material );
}
} else if ( material.isMeshStandardMaterial ) {
refreshUniformsCommon( m_uniforms, material );
if ( material.isMeshPhysicalMaterial ) {
refreshUniformsPhysical( m_uniforms, material );
} else {
refreshUniformsStandard( m_uniforms, material );
}
} else if ( material.isMeshDepthMaterial ) {
refreshUniformsCommon( m_uniforms, material );
refreshUniformsDepth( m_uniforms, material );
} else if ( material.isMeshDistanceMaterial ) {
refreshUniformsCommon( m_uniforms, material );
refreshUniformsDistance( m_uniforms, material );
} else if ( material.isMeshNormalMaterial ) {
refreshUniformsCommon( m_uniforms, material );
refreshUniformsNormal( m_uniforms, material );
} else if ( material.isLineBasicMaterial ) {
refreshUniformsLine( m_uniforms, material );
if ( material.isLineDashedMaterial ) {
refreshUniformsDash( m_uniforms, material );
}
} else if ( material.isPointsMaterial ) {
refreshUniformsPoints( m_uniforms, material );
} else if ( material.isShadowMaterial ) {
m_uniforms.color.value = material.color;
m_uniforms.opacity.value = material.opacity;
}
// RectAreaLight Texture
// TODO (mrdoob): Find a nicer implementation
if ( m_uniforms.ltc_1 !== undefined ) m_uniforms.ltc_1.value = UniformsLib.LTC_1;
if ( m_uniforms.ltc_2 !== undefined ) m_uniforms.ltc_2.value = UniformsLib.LTC_2;
WebGLUniforms.upload( _gl, materialProperties.uniformsList, m_uniforms, _this );
}
if ( material.isShaderMaterial && material.uniformsNeedUpdate === true ) {
WebGLUniforms.upload( _gl, materialProperties.uniformsList, m_uniforms, _this );
material.uniformsNeedUpdate = false;
}
// common matrices
p_uniforms.setValue( _gl, 'modelViewMatrix', object.modelViewMatrix );
p_uniforms.setValue( _gl, 'normalMatrix', object.normalMatrix );
p_uniforms.setValue( _gl, 'modelMatrix', object.matrixWorld );
return program;
}
// Uniforms (refresh uniforms objects)
function refreshUniformsCommon( uniforms, material ) {
uniforms.opacity.value = material.opacity;
if ( material.color ) {
uniforms.diffuse.value = material.color;
}
if ( material.emissive ) {
uniforms.emissive.value.copy( material.emissive ).multiplyScalar( material.emissiveIntensity );
}
if ( material.map ) {
uniforms.map.value = material.map;
}
if ( material.alphaMap ) {
uniforms.alphaMap.value = material.alphaMap;
}
if ( material.specularMap ) {
uniforms.specularMap.value = material.specularMap;
}
if ( material.envMap ) {
uniforms.envMap.value = material.envMap;
// don't flip CubeTexture envMaps, flip everything else:
// WebGLRenderTargetCube will be flipped for backwards compatibility
// WebGLRenderTargetCube.texture will be flipped because it's a Texture and NOT a CubeTexture
// this check must be handled differently, or removed entirely, if WebGLRenderTargetCube uses a CubeTexture in the future
uniforms.flipEnvMap.value = ( ! ( material.envMap && material.envMap.isCubeTexture ) ) ? 1 : - 1;
uniforms.reflectivity.value = material.reflectivity;
uniforms.refractionRatio.value = material.refractionRatio;
uniforms.maxMipLevel.value = properties.get( material.envMap ).__maxMipLevel;
}
if ( material.lightMap ) {
uniforms.lightMap.value = material.lightMap;
uniforms.lightMapIntensity.value = material.lightMapIntensity;
}
if ( material.aoMap ) {
uniforms.aoMap.value = material.aoMap;
uniforms.aoMapIntensity.value = material.aoMapIntensity;
}
// uv repeat and offset setting priorities
// 1. color map
// 2. specular map
// 3. normal map
// 4. bump map
// 5. alpha map
// 6. emissive map
var uvScaleMap;
if ( material.map ) {
uvScaleMap = material.map;
} else if ( material.specularMap ) {
uvScaleMap = material.specularMap;
} else if ( material.displacementMap ) {
uvScaleMap = material.displacementMap;
} else if ( material.normalMap ) {
uvScaleMap = material.normalMap;
} else if ( material.bumpMap ) {
uvScaleMap = material.bumpMap;
} else if ( material.roughnessMap ) {
uvScaleMap = material.roughnessMap;
} else if ( material.metalnessMap ) {
uvScaleMap = material.metalnessMap;
} else if ( material.alphaMap ) {
uvScaleMap = material.alphaMap;
} else if ( material.emissiveMap ) {
uvScaleMap = material.emissiveMap;
}
if ( uvScaleMap !== undefined ) {
// backwards compatibility
if ( uvScaleMap.isWebGLRenderTarget ) {
uvScaleMap = uvScaleMap.texture;
}
if ( uvScaleMap.matrixAutoUpdate === true ) {
uvScaleMap.updateMatrix();
}
uniforms.uvTransform.value.copy( uvScaleMap.matrix );
}
}
function refreshUniformsLine( uniforms, material ) {
uniforms.diffuse.value = material.color;
uniforms.opacity.value = material.opacity;
}
function refreshUniformsDash( uniforms, material ) {
uniforms.dashSize.value = material.dashSize;
uniforms.totalSize.value = material.dashSize + material.gapSize;
uniforms.scale.value = material.scale;
}
function refreshUniformsPoints( uniforms, material ) {
uniforms.diffuse.value = material.color;
uniforms.opacity.value = material.opacity;
uniforms.size.value = material.size * _pixelRatio;
uniforms.scale.value = _height * 0.5;
uniforms.map.value = material.map;
if ( material.map !== null ) {
if ( material.map.matrixAutoUpdate === true ) {
material.map.updateMatrix();
}
uniforms.uvTransform.value.copy( material.map.matrix );
}
}
function refreshUniformsFog( uniforms, fog ) {
uniforms.fogColor.value = fog.color;
if ( fog.isFog ) {
uniforms.fogNear.value = fog.near;
uniforms.fogFar.value = fog.far;
} else if ( fog.isFogExp2 ) {
uniforms.fogDensity.value = fog.density;
}
}
function refreshUniformsLambert( uniforms, material ) {
if ( material.emissiveMap ) {
uniforms.emissiveMap.value = material.emissiveMap;
}
}
function refreshUniformsPhong( uniforms, material ) {
uniforms.specular.value = material.specular;
uniforms.shininess.value = Math.max( material.shininess, 1e-4 ); // to prevent pow( 0.0, 0.0 )
if ( material.emissiveMap ) {
uniforms.emissiveMap.value = material.emissiveMap;
}
if ( material.bumpMap ) {
uniforms.bumpMap.value = material.bumpMap;
uniforms.bumpScale.value = material.bumpScale;
}
if ( material.normalMap ) {
uniforms.normalMap.value = material.normalMap;
uniforms.normalScale.value.copy( material.normalScale );
}
if ( material.displacementMap ) {
uniforms.displacementMap.value = material.displacementMap;
uniforms.displacementScale.value = material.displacementScale;
uniforms.displacementBias.value = material.displacementBias;
}
}
function refreshUniformsToon( uniforms, material ) {
refreshUniformsPhong( uniforms, material );
if ( material.gradientMap ) {
uniforms.gradientMap.value = material.gradientMap;
}
}
function refreshUniformsStandard( uniforms, material ) {
uniforms.roughness.value = material.roughness;
uniforms.metalness.value = material.metalness;
if ( material.roughnessMap ) {
uniforms.roughnessMap.value = material.roughnessMap;
}
if ( material.metalnessMap ) {
uniforms.metalnessMap.value = material.metalnessMap;
}
if ( material.emissiveMap ) {
uniforms.emissiveMap.value = material.emissiveMap;
}
if ( material.bumpMap ) {
uniforms.bumpMap.value = material.bumpMap;
uniforms.bumpScale.value = material.bumpScale;
}
if ( material.normalMap ) {
uniforms.normalMap.value = material.normalMap;
uniforms.normalScale.value.copy( material.normalScale );
}
if ( material.displacementMap ) {
uniforms.displacementMap.value = material.displacementMap;
uniforms.displacementScale.value = material.displacementScale;
uniforms.displacementBias.value = material.displacementBias;
}
if ( material.envMap ) {
//uniforms.envMap.value = material.envMap; // part of uniforms common
uniforms.envMapIntensity.value = material.envMapIntensity;
}
}
function refreshUniformsPhysical( uniforms, material ) {
uniforms.clearCoat.value = material.clearCoat;
uniforms.clearCoatRoughness.value = material.clearCoatRoughness;
refreshUniformsStandard( uniforms, material );
}
function refreshUniformsDepth( uniforms, material ) {
if ( material.displacementMap ) {
uniforms.displacementMap.value = material.displacementMap;
uniforms.displacementScale.value = material.displacementScale;
uniforms.displacementBias.value = material.displacementBias;
}
}
function refreshUniformsDistance( uniforms, material ) {
if ( material.displacementMap ) {
uniforms.displacementMap.value = material.displacementMap;
uniforms.displacementScale.value = material.displacementScale;
uniforms.displacementBias.value = material.displacementBias;
}
uniforms.referencePosition.value.copy( material.referencePosition );
uniforms.nearDistance.value = material.nearDistance;
uniforms.farDistance.value = material.farDistance;
}
function refreshUniformsNormal( uniforms, material ) {
if ( material.bumpMap ) {
uniforms.bumpMap.value = material.bumpMap;
uniforms.bumpScale.value = material.bumpScale;
}
if ( material.normalMap ) {
uniforms.normalMap.value = material.normalMap;
uniforms.normalScale.value.copy( material.normalScale );
}
if ( material.displacementMap ) {
uniforms.displacementMap.value = material.displacementMap;
uniforms.displacementScale.value = material.displacementScale;
uniforms.displacementBias.value = material.displacementBias;
}
}
// If uniforms are marked as clean, they don't need to be loaded to the GPU.
function markUniformsLightsNeedsUpdate( uniforms, value ) {
uniforms.ambientLightColor.needsUpdate = value;
uniforms.directionalLights.needsUpdate = value;
uniforms.pointLights.needsUpdate = value;
uniforms.spotLights.needsUpdate = value;
uniforms.rectAreaLights.needsUpdate = value;
uniforms.hemisphereLights.needsUpdate = value;
}
// Textures
function allocTextureUnit() {
var textureUnit = _usedTextureUnits;
if ( textureUnit >= capabilities.maxTextures ) {
console.warn( 'THREE.WebGLRenderer: Trying to use ' + textureUnit + ' texture units while this GPU supports only ' + capabilities.maxTextures );
}
_usedTextureUnits += 1;
return textureUnit;
}
this.allocTextureUnit = allocTextureUnit;
// this.setTexture2D = setTexture2D;
this.setTexture2D = ( function () {
var warned = false;
// backwards compatibility: peel texture.texture
return function setTexture2D( texture, slot ) {
if ( texture && texture.isWebGLRenderTarget ) {
if ( ! warned ) {
console.warn( "THREE.WebGLRenderer.setTexture2D: don't use render targets as textures. Use their .texture property instead." );
warned = true;
}
texture = texture.texture;
}
textures.setTexture2D( texture, slot );
};
}() );
this.setTexture = ( function () {
var warned = false;
return function setTexture( texture, slot ) {
if ( ! warned ) {
console.warn( "THREE.WebGLRenderer: .setTexture is deprecated, use setTexture2D instead." );
warned = true;
}
textures.setTexture2D( texture, slot );
};
}() );
this.setTextureCube = ( function () {
var warned = false;
return function setTextureCube( texture, slot ) {
// backwards compatibility: peel texture.texture
if ( texture && texture.isWebGLRenderTargetCube ) {
if ( ! warned ) {
console.warn( "THREE.WebGLRenderer.setTextureCube: don't use cube render targets as textures. Use their .texture property instead." );
warned = true;
}
texture = texture.texture;
}
// currently relying on the fact that WebGLRenderTargetCube.texture is a Texture and NOT a CubeTexture
// TODO: unify these code paths
if ( ( texture && texture.isCubeTexture ) ||
( Array.isArray( texture.image ) && texture.image.length === 6 ) ) {
// CompressedTexture can have Array in image :/
// this function alone should take care of cube textures
textures.setTextureCube( texture, slot );
} else {
// assumed: texture property of THREE.WebGLRenderTargetCube
textures.setTextureCubeDynamic( texture, slot );
}
};
}() );
this.getRenderTarget = function () {
return _currentRenderTarget;
};
this.setRenderTarget = function ( renderTarget ) {
_currentRenderTarget = renderTarget;
if ( renderTarget && properties.get( renderTarget ).__webglFramebuffer === undefined ) {
textures.setupRenderTarget( renderTarget );
}
var framebuffer = null;
var isCube = false;
if ( renderTarget ) {
var __webglFramebuffer = properties.get( renderTarget ).__webglFramebuffer;
if ( renderTarget.isWebGLRenderTargetCube ) {
framebuffer = __webglFramebuffer[ renderTarget.activeCubeFace ];
isCube = true;
} else {
framebuffer = __webglFramebuffer;
}
_currentViewport.copy( renderTarget.viewport );
_currentScissor.copy( renderTarget.scissor );
_currentScissorTest = renderTarget.scissorTest;
} else {
_currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio );
_currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio );
_currentScissorTest = _scissorTest;
}
if ( _currentFramebuffer !== framebuffer ) {
_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );
_currentFramebuffer = framebuffer;
}
state.viewport( _currentViewport );
state.scissor( _currentScissor );
state.setScissorTest( _currentScissorTest );
if ( isCube ) {
var textureProperties = properties.get( renderTarget.texture );
_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + renderTarget.activeCubeFace, textureProperties.__webglTexture, renderTarget.activeMipMapLevel );
}
};
this.readRenderTargetPixels = function ( renderTarget, x, y, width, height, buffer ) {
if ( ! ( renderTarget && renderTarget.isWebGLRenderTarget ) ) {
console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.' );
return;
}
var framebuffer = properties.get( renderTarget ).__webglFramebuffer;
if ( framebuffer ) {
var restore = false;
if ( framebuffer !== _currentFramebuffer ) {
_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );
restore = true;
}
try {
var texture = renderTarget.texture;
var textureFormat = texture.format;
var textureType = texture.type;
if ( textureFormat !== RGBAFormat && utils.convert( textureFormat ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_FORMAT ) ) {
console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.' );
return;
}
if ( textureType !== UnsignedByteType && utils.convert( textureType ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_TYPE ) && // IE11, Edge and Chrome Mac < 52 (#9513)
! ( textureType === FloatType && ( extensions.get( 'OES_texture_float' ) || extensions.get( 'WEBGL_color_buffer_float' ) ) ) && // Chrome Mac >= 52 and Firefox
! ( textureType === HalfFloatType && extensions.get( 'EXT_color_buffer_half_float' ) ) ) {
console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.' );
return;
}
if ( _gl.checkFramebufferStatus( _gl.FRAMEBUFFER ) === _gl.FRAMEBUFFER_COMPLETE ) {
// the following if statement ensures valid read requests (no out-of-bounds pixels, see #8604)
if ( ( x >= 0 && x <= ( renderTarget.width - width ) ) && ( y >= 0 && y <= ( renderTarget.height - height ) ) ) {
_gl.readPixels( x, y, width, height, utils.convert( textureFormat ), utils.convert( textureType ), buffer );
}
} else {
console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete.' );
}
} finally {
if ( restore ) {
_gl.bindFramebuffer( _gl.FRAMEBUFFER, _currentFramebuffer );
}
}
}
};
this.copyFramebufferToTexture = function ( position, texture, level ) {
var width = texture.image.width;
var height = texture.image.height;
var glFormat = utils.convert( texture.format );
this.setTexture2D( texture, 0 );
_gl.copyTexImage2D( _gl.TEXTURE_2D, level || 0, glFormat, position.x, position.y, width, height, 0 );
};
this.copyTextureToTexture = function ( position, srcTexture, dstTexture, level ) {
var width = srcTexture.image.width;
var height = srcTexture.image.height;
var glFormat = utils.convert( dstTexture.format );
var glType = utils.convert( dstTexture.type );
var pixels = srcTexture.isDataTexture ? srcTexture.image.data : srcTexture.image;
this.setTexture2D( dstTexture, 0 );
_gl.texSubImage2D( _gl.TEXTURE_2D, level || 0, position.x, position.y, width, height, glFormat, glType, pixels );
};
}
/**
* @author mrdoob / http://mrdoob.com/
* @author alteredq / http://alteredqualia.com/
*/
function FogExp2( color, density ) {
this.name = '';
this.color = new Color( color );
this.density = ( density !== undefined ) ? density : 0.00025;
}
FogExp2.prototype.isFogExp2 = true;
FogExp2.prototype.clone = function () {
return new FogExp2( this.color.getHex(), this.density );
};
FogExp2.prototype.toJSON = function ( /* meta */ ) {
return {
type: 'FogExp2',
color: this.color.getHex(),
density: this.density
};
};
/**
* @author mrdoob / http://mrdoob.com/
* @author alteredq / http://alteredqualia.com/
*/
function Fog( color, near, far ) {
this.name = '';
this.color = new Color( color );
this.near = ( near !== undefined ) ? near : 1;
this.far = ( far !== undefined ) ? far : 1000;
}
Fog.prototype.isFog = true;
Fog.prototype.clone = function () {
return new Fog( this.color.getHex(), this.near, this.far );
};
Fog.prototype.toJSON = function ( /* meta */ ) {
return {
type: 'Fog',
color: this.color.getHex(),
near: this.near,
far: this.far
};
};
/**
* @author mrdoob / http://mrdoob.com/
*/
function Scene() {
Object3D.call( this );
this.type = 'Scene';
this.background = null;
this.fog = null;
this.overrideMaterial = null;
this.autoUpdate = true; // checked by the renderer
}
Scene.prototype = Object.assign( Object.create( Object3D.prototype ), {
constructor: Scene,
copy: function ( source, recursive ) {
Object3D.prototype.copy.call( this, source, recursive );
if ( source.background !== null ) this.background = source.background.clone();
if ( source.fog !== null ) this.fog = source.fog.clone();
if ( source.overrideMaterial !== null ) this.overrideMaterial = source.overrideMaterial.clone();
this.autoUpdate = source.autoUpdate;
this.matrixAutoUpdate = source.matrixAutoUpdate;
return this;
},
toJSON: function ( meta ) {
var data = Object3D.prototype.toJSON.call( this, meta );
if ( this.background !== null ) data.object.background = this.background.toJSON( meta );
if ( this.fog !== null ) data.object.fog = this.fog.toJSON();
return data;
}
} );
/**
* @author alteredq / http://alteredqualia.com/
*
* parameters = {
* color: <hex>,
* opacity: <float>,
* map: new THREE.Texture( <Image> ),
*
* uvOffset: new THREE.Vector2(),
* uvScale: new THREE.Vector2()
* }
*/
function SpriteMaterial( parameters ) {
Material.call( this );
this.type = 'SpriteMaterial';
this.color = new Color( 0xffffff );
this.map = null;
this.rotation = 0;
this.fog = false;
this.lights = false;
this.setValues( parameters );
}
SpriteMaterial.prototype = Object.create( Material.prototype );
SpriteMaterial.prototype.constructor = SpriteMaterial;
SpriteMaterial.prototype.isSpriteMaterial = true;
SpriteMaterial.prototype.copy = function ( source ) {
Material.prototype.copy.call( this, source );
this.color.copy( source.color );
this.map = source.map;
this.rotation = source.rotation;
return this;
};
/**
* @author mikael emtinger / http://gomo.se/
* @author alteredq / http://alteredqualia.com/
*/
function Sprite( material ) {
Object3D.call( this );
this.type = 'Sprite';
this.material = ( material !== undefined ) ? material : new SpriteMaterial();
this.center = new Vector2( 0.5, 0.5 );
}
Sprite.prototype = Object.assign( Object.create( Object3D.prototype ), {
constructor: Sprite,
isSprite: true,
raycast: ( function () {
var intersectPoint = new Vector3();
var worldPosition = new Vector3();
var worldScale = new Vector3();
return function raycast( raycaster, intersects ) {
worldPosition.setFromMatrixPosition( this.matrixWorld );
raycaster.ray.closestPointToPoint( worldPosition, intersectPoint );
worldScale.setFromMatrixScale( this.matrixWorld );
var guessSizeSq = worldScale.x * worldScale.y / 4;
if ( worldPosition.distanceToSquared( intersectPoint ) > guessSizeSq ) return;
var distance = raycaster.ray.origin.distanceTo( intersectPoint );
if ( distance < raycaster.near || distance > raycaster.far ) return;
intersects.push( {
distance: distance,
point: intersectPoint.clone(),
face: null,
object: this
} );
};
}() ),
clone: function () {
return new this.constructor( this.material ).copy( this );
},
copy: function ( source ) {
Object3D.prototype.copy.call( this, source );
if ( source.center !== undefined ) this.center.copy( source.center );
return this;
}
} );
/**
* @author mikael emtinger / http://gomo.se/
* @author alteredq / http://alteredqualia.com/
* @author mrdoob / http://mrdoob.com/
*/
function LOD() {
Object3D.call( this );
this.type = 'LOD';
Object.defineProperties( this, {
levels: {
enumerable: true,
value: []
}
} );
}
LOD.prototype = Object.assign( Object.create( Object3D.prototype ), {
constructor: LOD,
copy: function ( source ) {
Object3D.prototype.copy.call( this, source, false );
var levels = source.levels;
for ( var i = 0, l = levels.length; i < l; i ++ ) {
var level = levels[ i ];
this.addLevel( level.object.clone(), level.distance );
}
return this;
},
addLevel: function ( object, distance ) {
if ( distance === undefined ) distance = 0;
distance = Math.abs( distance );
var levels = this.levels;
for ( var l = 0; l < levels.length; l ++ ) {
if ( distance < levels[ l ].distance ) {
break;
}
}
levels.splice( l, 0, { distance: distance, object: object } );
this.add( object );
},
getObjectForDistance: function ( distance ) {
var levels = this.levels;
for ( var i = 1, l = levels.length; i < l; i ++ ) {
if ( distance < levels[ i ].distance ) {
break;
}
}
return levels[ i - 1 ].object;
},
raycast: ( function () {
var matrixPosition = new Vector3();
return function raycast( raycaster, intersects ) {
matrixPosition.setFromMatrixPosition( this.matrixWorld );
var distance = raycaster.ray.origin.distanceTo( matrixPosition );
this.getObjectForDistance( distance ).raycast( raycaster, intersects );
};
}() ),
update: function () {
var v1 = new Vector3();
var v2 = new Vector3();
return function update( camera ) {
var levels = this.levels;
if ( levels.length > 1 ) {
v1.setFromMatrixPosition( camera.matrixWorld );
v2.setFromMatrixPosition( this.matrixWorld );
var distance = v1.distanceTo( v2 );
levels[ 0 ].object.visible = true;
for ( var i = 1, l = levels.length; i < l; i ++ ) {
if ( distance >= levels[ i ].distance ) {
levels[ i - 1 ].object.visible = false;
levels[ i ].object.visible = true;
} else {
break;
}
}
for ( ; i < l; i ++ ) {
levels[ i ].object.visible = false;
}
}
};
}(),
toJSON: function ( meta ) {
var data = Object3D.prototype.toJSON.call( this, meta );
data.object.levels = [];
var levels = this.levels;
for ( var i = 0, l = levels.length; i < l; i ++ ) {
var level = levels[ i ];
data.object.levels.push( {
object: level.object.uuid,
distance: level.distance
} );
}
return data;
}
} );
/**
* @author mikael emtinger / http://gomo.se/
* @author alteredq / http://alteredqualia.com/
* @author michael guerrero / http://realitymeltdown.com
* @author ikerr / http://verold.com
*/
function Skeleton( bones, boneInverses ) {
// copy the bone array
bones = bones || [];
this.bones = bones.slice( 0 );
this.boneMatrices = new Float32Array( this.bones.length * 16 );
// use the supplied bone inverses or calculate the inverses
if ( boneInverses === undefined ) {
this.calculateInverses();
} else {
if ( this.bones.length === boneInverses.length ) {
this.boneInverses = boneInverses.slice( 0 );
} else {
console.warn( 'THREE.Skeleton boneInverses is the wrong length.' );
this.boneInverses = [];
for ( var i = 0, il = this.bones.length; i < il; i ++ ) {
this.boneInverses.push( new Matrix4() );
}
}
}
}
Object.assign( Skeleton.prototype, {
calculateInverses: function () {
this.boneInverses = [];
for ( var i = 0, il = this.bones.length; i < il; i ++ ) {
var inverse = new Matrix4();
if ( this.bones[ i ] ) {
inverse.getInverse( this.bones[ i ].matrixWorld );
}
this.boneInverses.push( inverse );
}
},
pose: function () {
var bone, i, il;
// recover the bind-time world matrices
for ( i = 0, il = this.bones.length; i < il; i ++ ) {
bone = this.bones[ i ];
if ( bone ) {
bone.matrixWorld.getInverse( this.boneInverses[ i ] );
}
}
// compute the local matrices, positions, rotations and scales
for ( i = 0, il = this.bones.length; i < il; i ++ ) {
bone = this.bones[ i ];
if ( bone ) {
if ( bone.parent && bone.parent.isBone ) {
bone.matrix.getInverse( bone.parent.matrixWorld );
bone.matrix.multiply( bone.matrixWorld );
} else {
bone.matrix.copy( bone.matrixWorld );
}
bone.matrix.decompose( bone.position, bone.quaternion, bone.scale );
}
}
},
update: ( function () {
var offsetMatrix = new Matrix4();
var identityMatrix = new Matrix4();
return function update() {
var bones = this.bones;
var boneInverses = this.boneInverses;
var boneMatrices = this.boneMatrices;
var boneTexture = this.boneTexture;
// flatten bone matrices to array
for ( var i = 0, il = bones.length; i < il; i ++ ) {
// compute the offset between the current and the original transform
var matrix = bones[ i ] ? bones[ i ].matrixWorld : identityMatrix;
offsetMatrix.multiplyMatrices( matrix, boneInverses[ i ] );
offsetMatrix.toArray( boneMatrices, i * 16 );
}
if ( boneTexture !== undefined ) {
boneTexture.needsUpdate = true;
}
};
} )(),
clone: function () {
return new Skeleton( this.bones, this.boneInverses );
},
getBoneByName: function ( name ) {
for ( var i = 0, il = this.bones.length; i < il; i ++ ) {
var bone = this.bones[ i ];
if ( bone.name === name ) {
return bone;
}
}
return undefined;
}
} );
/**
* @author mikael emtinger / http://gomo.se/
* @author alteredq / http://alteredqualia.com/
* @author ikerr / http://verold.com
*/
function Bone() {
Object3D.call( this );
this.type = 'Bone';
}
Bone.prototype = Object.assign( Object.create( Object3D.prototype ), {
constructor: Bone,
isBone: true
} );
/**
* @author mikael emtinger / http://gomo.se/
* @author alteredq / http://alteredqualia.com/
* @author ikerr / http://verold.com
*/
function SkinnedMesh( geometry, material ) {
Mesh.call( this, geometry, material );
this.type = 'SkinnedMesh';
this.bindMode = 'attached';
this.bindMatrix = new Matrix4();
this.bindMatrixInverse = new Matrix4();
var bones = this.initBones();
var skeleton = new Skeleton( bones );
this.bind( skeleton, this.matrixWorld );
this.normalizeSkinWeights();
}
SkinnedMesh.prototype = Object.assign( Object.create( Mesh.prototype ), {
constructor: SkinnedMesh,
isSkinnedMesh: true,
initBones: function () {
var bones = [], bone, gbone;
var i, il;
if ( this.geometry && this.geometry.bones !== undefined ) {
// first, create array of 'Bone' objects from geometry data
for ( i = 0, il = this.geometry.bones.length; i < il; i ++ ) {
gbone = this.geometry.bones[ i ];
// create new 'Bone' object
bone = new Bone();
bones.push( bone );
// apply values
bone.name = gbone.name;
bone.position.fromArray( gbone.pos );
bone.quaternion.fromArray( gbone.rotq );
if ( gbone.scl !== undefined ) bone.scale.fromArray( gbone.scl );
}
// second, create bone hierarchy
for ( i = 0, il = this.geometry.bones.length; i < il; i ++ ) {
gbone = this.geometry.bones[ i ];
if ( ( gbone.parent !== - 1 ) && ( gbone.parent !== null ) && ( bones[ gbone.parent ] !== undefined ) ) {
// subsequent bones in the hierarchy
bones[ gbone.parent ].add( bones[ i ] );
} else {
// topmost bone, immediate child of the skinned mesh
this.add( bones[ i ] );
}
}
}
// now the bones are part of the scene graph and children of the skinned mesh.
// let's update the corresponding matrices
this.updateMatrixWorld( true );
return bones;
},
bind: function ( skeleton, bindMatrix ) {
this.skeleton = skeleton;
if ( bindMatrix === undefined ) {
this.updateMatrixWorld( true );
this.skeleton.calculateInverses();
bindMatrix = this.matrixWorld;
}
this.bindMatrix.copy( bindMatrix );
this.bindMatrixInverse.getInverse( bindMatrix );
},
pose: function () {
this.skeleton.pose();
},
normalizeSkinWeights: function () {
var scale, i;
if ( this.geometry && this.geometry.isGeometry ) {
for ( i = 0; i < this.geometry.skinWeights.length; i ++ ) {
var sw = this.geometry.skinWeights[ i ];
scale = 1.0 / sw.manhattanLength();
if ( scale !== Infinity ) {
sw.multiplyScalar( scale );
} else {
sw.set( 1, 0, 0, 0 ); // do something reasonable
}
}
} else if ( this.geometry && this.geometry.isBufferGeometry ) {
var vec = new Vector4();
var skinWeight = this.geometry.attributes.skinWeight;
for ( i = 0; i < skinWeight.count; i ++ ) {
vec.x = skinWeight.getX( i );
vec.y = skinWeight.getY( i );
vec.z = skinWeight.getZ( i );
vec.w = skinWeight.getW( i );
scale = 1.0 / vec.manhattanLength();
if ( scale !== Infinity ) {
vec.multiplyScalar( scale );
} else {
vec.set( 1, 0, 0, 0 ); // do something reasonable
}
skinWeight.setXYZW( i, vec.x, vec.y, vec.z, vec.w );
}
}
},
updateMatrixWorld: function ( force ) {
Mesh.prototype.updateMatrixWorld.call( this, force );
if ( this.bindMode === 'attached' ) {
this.bindMatrixInverse.getInverse( this.matrixWorld );
} else if ( this.bindMode === 'detached' ) {
this.bindMatrixInverse.getInverse( this.bindMatrix );
} else {
console.warn( 'THREE.SkinnedMesh: Unrecognized bindMode: ' + this.bindMode );
}
},
clone: function () {
return new this.constructor( this.geometry, this.material ).copy( this );
}
} );
/**
* @author mrdoob / http://mrdoob.com/
* @author alteredq / http://alteredqualia.com/
*
* parameters = {
* color: <hex>,
* opacity: <float>,
*
* linewidth: <float>,
* linecap: "round",
* linejoin: "round"
* }
*/
function LineBasicMaterial( parameters ) {
Material.call( this );
this.type = 'LineBasicMaterial';
this.color = new Color( 0xffffff );
this.linewidth = 1;
this.linecap = 'round';
this.linejoin = 'round';
this.lights = false;
this.setValues( parameters );
}
LineBasicMaterial.prototype = Object.create( Material.prototype );
LineBasicMaterial.prototype.constructor = LineBasicMaterial;
LineBasicMaterial.prototype.isLineBasicMaterial = true;
LineBasicMaterial.prototype.copy = function ( source ) {
Material.prototype.copy.call( this, source );
this.color.copy( source.color );
this.linewidth = source.linewidth;
this.linecap = source.linecap;
this.linejoin = source.linejoin;
return this;
};
/**
* @author mrdoob / http://mrdoob.com/
*/
function Line( geometry, material, mode ) {
if ( mode === 1 ) {
console.warn( 'THREE.Line: parameter THREE.LinePieces no longer supported. Created THREE.LineSegments instead.' );
return new LineSegments( geometry, material );
}
Object3D.call( this );
this.type = 'Line';
this.geometry = geometry !== undefined ? geometry : new BufferGeometry();
this.material = material !== undefined ? material : new LineBasicMaterial( { color: Math.random() * 0xffffff } );
}
Line.prototype = Object.assign( Object.create( Object3D.prototype ), {
constructor: Line,
isLine: true,
computeLineDistances: ( function () {
var start = new Vector3();
var end = new Vector3();
return function computeLineDistances() {
var geometry = this.geometry;
if ( geometry.isBufferGeometry ) {
// we assume non-indexed geometry
if ( geometry.index === null ) {
var positionAttribute = geometry.attributes.position;
var lineDistances = [ 0 ];
for ( var i = 1, l = positionAttribute.count; i < l; i ++ ) {
start.fromBufferAttribute( positionAttribute, i - 1 );
end.fromBufferAttribute( positionAttribute, i );
lineDistances[ i ] = lineDistances[ i - 1 ];
lineDistances[ i ] += start.distanceTo( end );
}
geometry.addAttribute( 'lineDistance', new Float32BufferAttribute( lineDistances, 1 ) );
} else {
console.warn( 'THREE.Line.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.' );
}
} else if ( geometry.isGeometry ) {
var vertices = geometry.vertices;
var lineDistances = geometry.lineDistances;
lineDistances[ 0 ] = 0;
for ( var i = 1, l = vertices.length; i < l; i ++ ) {
lineDistances[ i ] = lineDistances[ i - 1 ];
lineDistances[ i ] += vertices[ i - 1 ].distanceTo( vertices[ i ] );
}
}
return this;
};
}() ),
raycast: ( function () {
var inverseMatrix = new Matrix4();
var ray = new Ray();
var sphere = new Sphere();
return function raycast( raycaster, intersects ) {
var precision = raycaster.linePrecision;
var precisionSq = precision * precision;
var geometry = this.geometry;
var matrixWorld = this.matrixWorld;
// Checking boundingSphere distance to ray
if ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();
sphere.copy( geometry.boundingSphere );
sphere.applyMatrix4( matrixWorld );
if ( raycaster.ray.intersectsSphere( sphere ) === false ) return;
//
inverseMatrix.getInverse( matrixWorld );
ray.copy( raycaster.ray ).applyMatrix4( inverseMatrix );
var vStart = new Vector3();
var vEnd = new Vector3();
var interSegment = new Vector3();
var interRay = new Vector3();
var step = ( this && this.isLineSegments ) ? 2 : 1;
if ( geometry.isBufferGeometry ) {
var index = geometry.index;
var attributes = geometry.attributes;
var positions = attributes.position.array;
if ( index !== null ) {
var indices = index.array;
for ( var i = 0, l = indices.length - 1; i < l; i += step ) {
var a = indices[ i ];
var b = indices[ i + 1 ];
vStart.fromArray( positions, a * 3 );
vEnd.fromArray( positions, b * 3 );
var distSq = ray.distanceSqToSegment( vStart, vEnd, interRay, interSegment );
if ( distSq > precisionSq ) continue;
interRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation
var distance = raycaster.ray.origin.distanceTo( interRay );
if ( distance < raycaster.near || distance > raycaster.far ) continue;
intersects.push( {
distance: distance,
// What do we want? intersection point on the ray or on the segment??
// point: raycaster.ray.at( distance ),
point: interSegment.clone().applyMatrix4( this.matrixWorld ),
index: i,
face: null,
faceIndex: null,
object: this
} );
}
} else {
for ( var i = 0, l = positions.length / 3 - 1; i < l; i += step ) {
vStart.fromArray( positions, 3 * i );
vEnd.fromArray( positions, 3 * i + 3 );
var distSq = ray.distanceSqToSegment( vStart, vEnd, interRay, interSegment );
if ( distSq > precisionSq ) continue;
interRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation
var distance = raycaster.ray.origin.distanceTo( interRay );
if ( distance < raycaster.near || distance > raycaster.far ) continue;
intersects.push( {
distance: distance,
// What do we want? intersection point on the ray or on the segment??
// point: raycaster.ray.at( distance ),
point: interSegment.clone().applyMatrix4( this.matrixWorld ),
index: i,
face: null,
faceIndex: null,
object: this
} );
}
}
} else if ( geometry.isGeometry ) {
var vertices = geometry.vertices;
var nbVertices = vertices.length;
for ( var i = 0; i < nbVertices - 1; i += step ) {
var distSq = ray.distanceSqToSegment( vertices[ i ], vertices[ i + 1 ], interRay, interSegment );
if ( distSq > precisionSq ) continue;
interRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation
var distance = raycaster.ray.origin.distanceTo( interRay );
if ( distance < raycaster.near || distance > raycaster.far ) continue;
intersects.push( {
distance: distance,
// What do we want? intersection point on the ray or on the segment??
// point: raycaster.ray.at( distance ),
point: interSegment.clone().applyMatrix4( this.matrixWorld ),
index: i,
face: null,
faceIndex: null,
object: this
} );
}
}
};
}() ),
clone: function () {
return new this.constructor( this.geometry, this.material ).copy( this );
}
} );
/**
* @author mrdoob / http://mrdoob.com/
*/
function LineSegments( geometry, material ) {
Line.call( this, geometry, material );
this.type = 'LineSegments';
}
LineSegments.prototype = Object.assign( Object.create( Line.prototype ), {
constructor: LineSegments,
isLineSegments: true,
computeLineDistances: ( function () {
var start = new Vector3();
var end = new Vector3();
return function computeLineDistances() {
var geometry = this.geometry;
if ( geometry.isBufferGeometry ) {
// we assume non-indexed geometry
if ( geometry.index === null ) {
var positionAttribute = geometry.attributes.position;
var lineDistances = [];
for ( var i = 0, l = positionAttribute.count; i < l; i += 2 ) {
start.fromBufferAttribute( positionAttribute, i );
end.fromBufferAttribute( positionAttribute, i + 1 );
lineDistances[ i ] = ( i === 0 ) ? 0 : lineDistances[ i - 1 ];
lineDistances[ i + 1 ] = lineDistances[ i ] + start.distanceTo( end );
}
geometry.addAttribute( 'lineDistance', new Float32BufferAttribute( lineDistances, 1 ) );
} else {
console.warn( 'THREE.LineSegments.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.' );
}
} else if ( geometry.isGeometry ) {
var vertices = geometry.vertices;
var lineDistances = geometry.lineDistances;
for ( var i = 0, l = vertices.length; i < l; i += 2 ) {
start.copy( vertices[ i ] );
end.copy( vertices[ i + 1 ] );
lineDistances[ i ] = ( i === 0 ) ? 0 : lineDistances[ i - 1 ];
lineDistances[ i + 1 ] = lineDistances[ i ] + start.distanceTo( end );
}
}
return this;
};
}() )
} );
/**
* @author mgreter / http://github.com/mgreter
*/
function LineLoop( geometry, material ) {
Line.call( this, geometry, material );
this.type = 'LineLoop';
}
LineLoop.prototype = Object.assign( Object.create( Line.prototype ), {
constructor: LineLoop,
isLineLoop: true,
} );
/**
* @author mrdoob / http://mrdoob.com/
* @author alteredq / http://alteredqualia.com/
*
* parameters = {
* color: <hex>,
* opacity: <float>,
* map: new THREE.Texture( <Image> ),
*
* size: <float>,
* sizeAttenuation: <bool>
* }
*/
function PointsMaterial( parameters ) {
Material.call( this );
this.type = 'PointsMaterial';
this.color = new Color( 0xffffff );
this.map = null;
this.size = 1;
this.sizeAttenuation = true;
this.lights = false;
this.setValues( parameters );
}
PointsMaterial.prototype = Object.create( Material.prototype );
PointsMaterial.prototype.constructor = PointsMaterial;
PointsMaterial.prototype.isPointsMaterial = true;
PointsMaterial.prototype.copy = function ( source ) {
Material.prototype.copy.call( this, source );
this.color.copy( source.color );
this.map = source.map;
this.size = source.size;
this.sizeAttenuation = source.sizeAttenuation;
return this;
};
/**
* @author alteredq / http://alteredqualia.com/
*/
function Points( geometry, material ) {
Object3D.call( this );
this.type = 'Points';
this.geometry = geometry !== undefined ? geometry : new BufferGeometry();
this.material = material !== undefined ? material : new PointsMaterial( { color: Math.random() * 0xffffff } );
}
Points.prototype = Object.assign( Object.create( Object3D.prototype ), {
constructor: Points,
isPoints: true,
raycast: ( function () {
var inverseMatrix = new Matrix4();
var ray = new Ray();
var sphere = new Sphere();
return function raycast( raycaster, intersects ) {
var object = this;
var geometry = this.geometry;
var matrixWorld = this.matrixWorld;
var threshold = raycaster.params.Points.threshold;
// Checking boundingSphere distance to ray
if ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();
sphere.copy( geometry.boundingSphere );
sphere.applyMatrix4( matrixWorld );
sphere.radius += threshold;
if ( raycaster.ray.intersectsSphere( sphere ) === false ) return;
//
inverseMatrix.getInverse( matrixWorld );
ray.copy( raycaster.ray ).applyMatrix4( inverseMatrix );
var localThreshold = threshold / ( ( this.scale.x + this.scale.y + this.scale.z ) / 3 );
var localThresholdSq = localThreshold * localThreshold;
var position = new Vector3();
var intersectPoint = new Vector3();
function testPoint( point, index ) {
var rayPointDistanceSq = ray.distanceSqToPoint( point );
if ( rayPointDistanceSq < localThresholdSq ) {
ray.closestPointToPoint( point, intersectPoint );
intersectPoint.applyMatrix4( matrixWorld );
var distance = raycaster.ray.origin.distanceTo( intersectPoint );
if ( distance < raycaster.near || distance > raycaster.far ) return;
intersects.push( {
distance: distance,
distanceToRay: Math.sqrt( rayPointDistanceSq ),
point: intersectPoint.clone(),
index: index,
face: null,
object: object
} );
}
}
if ( geometry.isBufferGeometry ) {
var index = geometry.index;
var attributes = geometry.attributes;
var positions = attributes.position.array;
if ( index !== null ) {
var indices = index.array;
for ( var i = 0, il = indices.length; i < il; i ++ ) {
var a = indices[ i ];
position.fromArray( positions, a * 3 );
testPoint( position, a );
}
} else {
for ( var i = 0, l = positions.length / 3; i < l; i ++ ) {
position.fromArray( positions, i * 3 );
testPoint( position, i );
}
}
} else {
var vertices = geometry.vertices;
for ( var i = 0, l = vertices.length; i < l; i ++ ) {
testPoint( vertices[ i ], i );
}
}
};
}() ),
clone: function () {
return new this.constructor( this.geometry, this.material ).copy( this );
}
} );
/**
* @author mrdoob / http://mrdoob.com/
*/
function Group() {
Object3D.call( this );
this.type = 'Group';
}
Group.prototype = Object.assign( Object.create( Object3D.prototype ), {
constructor: Group,
isGroup: true
} );
/**
* @author mrdoob / http://mrdoob.com/
*/
function VideoTexture( video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) {
Texture.call( this, video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );
this.generateMipmaps = false;
}
VideoTexture.prototype = Object.assign( Object.create( Texture.prototype ), {
constructor: VideoTexture,
isVideoTexture: true,
update: function () {
var video = this.image;
if ( video.readyState >= video.HAVE_CURRENT_DATA ) {
this.needsUpdate = true;
}
}
} );
/**
* @author alteredq / http://alteredqualia.com/
*/
function CompressedTexture( mipmaps, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, encoding ) {
Texture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding );
this.image = { width: width, height: height };
this.mipmaps = mipmaps;
// no flipping for cube textures
// (also flipping doesn't work for compressed textures )
this.flipY = false;
// can't generate mipmaps for compressed textures
// mips must be embedded in DDS files
this.generateMipmaps = false;
}
CompressedTexture.prototype = Object.create( Texture.prototype );
CompressedTexture.prototype.constructor = CompressedTexture;
CompressedTexture.prototype.isCompressedTexture = true;
/**
* @author Matt DesLauriers / @mattdesl
* @author atix / arthursilber.de
*/
function DepthTexture( width, height, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, format ) {
format = format !== undefined ? format : DepthFormat;
if ( format !== DepthFormat && format !== DepthStencilFormat ) {
throw new Error( 'DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat' );
}
if ( type === undefined && format === DepthFormat ) type = UnsignedShortType;
if ( type === undefined && format === DepthStencilFormat ) type = UnsignedInt248Type;
Texture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );
this.image = { width: width, height: height };
this.magFilter = magFilter !== undefined ? magFilter : NearestFilter;
this.minFilter = minFilter !== undefined ? minFilter : NearestFilter;
this.flipY = false;
this.generateMipmaps = false;
}
DepthTexture.prototype = Object.create( Texture.prototype );
DepthTexture.prototype.constructor = DepthTexture;
DepthTexture.prototype.isDepthTexture = true;
/**
* @author mrdoob / http://mrdoob.com/
* @author Mugen87 / https://github.com/Mugen87
*/
function WireframeGeometry( geometry ) {
BufferGeometry.call( this );
this.type = 'WireframeGeometry';
// buffer
var vertices = [];
// helper variables
var i, j, l, o, ol;
var edge = [ 0, 0 ], edges = {}, e, edge1, edge2;
var key, keys = [ 'a', 'b', 'c' ];
var vertex;
// different logic for Geometry and BufferGeometry
if ( geometry && geometry.isGeometry ) {
// create a data structure that contains all edges without duplicates
var faces = geometry.faces;
for ( i = 0, l = faces.length; i < l; i ++ ) {
var face = faces[ i ];
for ( j = 0; j < 3; j ++ ) {
edge1 = face[ keys[ j ] ];
edge2 = face[ keys[ ( j + 1 ) % 3 ] ];
edge[ 0 ] = Math.min( edge1, edge2 ); // sorting prevents duplicates
edge[ 1 ] = Math.max( edge1, edge2 );
key = edge[ 0 ] + ',' + edge[ 1 ];
if ( edges[ key ] === undefined ) {
edges[ key ] = { index1: edge[ 0 ], index2: edge[ 1 ] };
}
}
}
// generate vertices
for ( key in edges ) {
e = edges[ key ];
vertex = geometry.vertices[ e.index1 ];
vertices.push( vertex.x, vertex.y, vertex.z );
vertex = geometry.vertices[ e.index2 ];
vertices.push( vertex.x, vertex.y, vertex.z );
}
} else if ( geometry && geometry.isBufferGeometry ) {
var position, indices, groups;
var group, start, count;
var index1, index2;
vertex = new Vector3();
if ( geometry.index !== null ) {
// indexed BufferGeometry
position = geometry.attributes.position;
indices = geometry.index;
groups = geometry.groups;
if ( groups.length === 0 ) {
groups = [ { start: 0, count: indices.count, materialIndex: 0 } ];
}
// create a data structure that contains all eges without duplicates
for ( o = 0, ol = groups.length; o < ol; ++ o ) {
group = groups[ o ];
start = group.start;
count = group.count;
for ( i = start, l = ( start + count ); i < l; i += 3 ) {
for ( j = 0; j < 3; j ++ ) {
edge1 = indices.getX( i + j );
edge2 = indices.getX( i + ( j + 1 ) % 3 );
edge[ 0 ] = Math.min( edge1, edge2 ); // sorting prevents duplicates
edge[ 1 ] = Math.max( edge1, edge2 );
key = edge[ 0 ] + ',' + edge[ 1 ];
if ( edges[ key ] === undefined ) {
edges[ key ] = { index1: edge[ 0 ], index2: edge[ 1 ] };
}
}
}
}
// generate vertices
for ( key in edges ) {
e = edges[ key ];
vertex.fromBufferAttribute( position, e.index1 );
vertices.push( vertex.x, vertex.y, vertex.z );
vertex.fromBufferAttribute( position, e.index2 );
vertices.push( vertex.x, vertex.y, vertex.z );
}
} else {
// non-indexed BufferGeometry
position = geometry.attributes.position;
for ( i = 0, l = ( position.count / 3 ); i < l; i ++ ) {
for ( j = 0; j < 3; j ++ ) {
// three edges per triangle, an edge is represented as (index1, index2)
// e.g. the first triangle has the following edges: (0,1),(1,2),(2,0)
index1 = 3 * i + j;
vertex.fromBufferAttribute( position, index1 );
vertices.push( vertex.x, vertex.y, vertex.z );
index2 = 3 * i + ( ( j + 1 ) % 3 );
vertex.fromBufferAttribute( position, index2 );
vertices.push( vertex.x, vertex.y, vertex.z );
}
}
}
}
// build geometry
this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
}
WireframeGeometry.prototype = Object.create( BufferGeometry.prototype );
WireframeGeometry.prototype.constructor = WireframeGeometry;
/**
* @author zz85 / https://github.com/zz85
* @author Mugen87 / https://github.com/Mugen87
*
* Parametric Surfaces Geometry
* based on the brilliant article by @prideout http://prideout.net/blog/?p=44
*/
// ParametricGeometry
function ParametricGeometry( func, slices, stacks ) {
Geometry.call( this );
this.type = 'ParametricGeometry';
this.parameters = {
func: func,
slices: slices,
stacks: stacks
};
this.fromBufferGeometry( new ParametricBufferGeometry( func, slices, stacks ) );
this.mergeVertices();
}
ParametricGeometry.prototype = Object.create( Geometry.prototype );
ParametricGeometry.prototype.constructor = ParametricGeometry;
// ParametricBufferGeometry
function ParametricBufferGeometry( func, slices, stacks ) {
BufferGeometry.call( this );
this.type = 'ParametricBufferGeometry';
this.parameters = {
func: func,
slices: slices,
stacks: stacks
};
// buffers
var indices = [];
var vertices = [];
var normals = [];
var uvs = [];
var EPS = 0.00001;
var normal = new Vector3();
var p0 = new Vector3(), p1 = new Vector3();
var pu = new Vector3(), pv = new Vector3();
var i, j;
// generate vertices, normals and uvs
var sliceCount = slices + 1;
for ( i = 0; i <= stacks; i ++ ) {
var v = i / stacks;
for ( j = 0; j <= slices; j ++ ) {
var u = j / slices;
// vertex
func( u, v, p0 );
vertices.push( p0.x, p0.y, p0.z );
// normal
// approximate tangent vectors via finite differences
if ( u - EPS >= 0 ) {
func( u - EPS, v, p1 );
pu.subVectors( p0, p1 );
} else {
func( u + EPS, v, p1 );
pu.subVectors( p1, p0 );
}
if ( v - EPS >= 0 ) {
func( u, v - EPS, p1 );
pv.subVectors( p0, p1 );
} else {
func( u, v + EPS, p1 );
pv.subVectors( p1, p0 );
}
// cross product of tangent vectors returns surface normal
normal.crossVectors( pu, pv ).normalize();
normals.push( normal.x, normal.y, normal.z );
// uv
uvs.push( u, v );
}
}
// generate indices
for ( i = 0; i < stacks; i ++ ) {
for ( j = 0; j < slices; j ++ ) {
var a = i * sliceCount + j;
var b = i * sliceCount + j + 1;
var c = ( i + 1 ) * sliceCount + j + 1;
var d = ( i + 1 ) * sliceCount + j;
// faces one and two
indices.push( a, b, d );
indices.push( b, c, d );
}
}
// build geometry
this.setIndex( indices );
this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );
this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );
}
ParametricBufferGeometry.prototype = Object.create( BufferGeometry.prototype );
ParametricBufferGeometry.prototype.constructor = ParametricBufferGeometry;
/**
* @author clockworkgeek / https://github.com/clockworkgeek
* @author timothypratley / https://github.com/timothypratley
* @author WestLangley / http://github.com/WestLangley
* @author Mugen87 / https://github.com/Mugen87
*/
// PolyhedronGeometry
function PolyhedronGeometry( vertices, indices, radius, detail ) {
Geometry.call( this );
this.type = 'PolyhedronGeometry';
this.parameters = {
vertices: vertices,
indices: indices,
radius: radius,
detail: detail
};
this.fromBufferGeometry( new PolyhedronBufferGeometry( vertices, indices, radius, detail ) );
this.mergeVertices();
}
PolyhedronGeometry.prototype = Object.create( Geometry.prototype );
PolyhedronGeometry.prototype.constructor = PolyhedronGeometry;
// PolyhedronBufferGeometry
function PolyhedronBufferGeometry( vertices, indices, radius, detail ) {
BufferGeometry.call( this );
this.type = 'PolyhedronBufferGeometry';
this.parameters = {
vertices: vertices,
indices: indices,
radius: radius,
detail: detail
};
radius = radius || 1;
detail = detail || 0;
// default buffer data
var vertexBuffer = [];
var uvBuffer = [];
// the subdivision creates the vertex buffer data
subdivide( detail );
// all vertices should lie on a conceptual sphere with a given radius
appplyRadius( radius );
// finally, create the uv data
generateUVs();
// build non-indexed geometry
this.addAttribute( 'position', new Float32BufferAttribute( vertexBuffer, 3 ) );
this.addAttribute( 'normal', new Float32BufferAttribute( vertexBuffer.slice(), 3 ) );
this.addAttribute( 'uv', new Float32BufferAttribute( uvBuffer, 2 ) );
if ( detail === 0 ) {
this.computeVertexNormals(); // flat normals
} else {
this.normalizeNormals(); // smooth normals
}
// helper functions
function subdivide( detail ) {
var a = new Vector3();
var b = new Vector3();
var c = new Vector3();
// iterate over all faces and apply a subdivison with the given detail value
for ( var i = 0; i < indices.length; i += 3 ) {
// get the vertices of the face
getVertexByIndex( indices[ i + 0 ], a );
getVertexByIndex( indices[ i + 1 ], b );
getVertexByIndex( indices[ i + 2 ], c );
// perform subdivision
subdivideFace( a, b, c, detail );
}
}
function subdivideFace( a, b, c, detail ) {
var cols = Math.pow( 2, detail );
// we use this multidimensional array as a data structure for creating the subdivision
var v = [];
var i, j;
// construct all of the vertices for this subdivision
for ( i = 0; i <= cols; i ++ ) {
v[ i ] = [];
var aj = a.clone().lerp( c, i / cols );
var bj = b.clone().lerp( c, i / cols );
var rows = cols - i;
for ( j = 0; j <= rows; j ++ ) {
if ( j === 0 && i === cols ) {
v[ i ][ j ] = aj;
} else {
v[ i ][ j ] = aj.clone().lerp( bj, j / rows );
}
}
}
// construct all of the faces
for ( i = 0; i < cols; i ++ ) {
for ( j = 0; j < 2 * ( cols - i ) - 1; j ++ ) {
var k = Math.floor( j / 2 );
if ( j % 2 === 0 ) {
pushVertex( v[ i ][ k + 1 ] );
pushVertex( v[ i + 1 ][ k ] );
pushVertex( v[ i ][ k ] );
} else {
pushVertex( v[ i ][ k + 1 ] );
pushVertex( v[ i + 1 ][ k + 1 ] );
pushVertex( v[ i + 1 ][ k ] );
}
}
}
}
function appplyRadius( radius ) {
var vertex = new Vector3();
// iterate over the entire buffer and apply the radius to each vertex
for ( var i = 0; i < vertexBuffer.length; i += 3 ) {
vertex.x = vertexBuffer[ i + 0 ];
vertex.y = vertexBuffer[ i + 1 ];
vertex.z = vertexBuffer[ i + 2 ];
vertex.normalize().multiplyScalar( radius );
vertexBuffer[ i + 0 ] = vertex.x;
vertexBuffer[ i + 1 ] = vertex.y;
vertexBuffer[ i + 2 ] = vertex.z;
}
}
function generateUVs() {
var vertex = new Vector3();
for ( var i = 0; i < vertexBuffer.length; i += 3 ) {
vertex.x = vertexBuffer[ i + 0 ];
vertex.y = vertexBuffer[ i + 1 ];
vertex.z = vertexBuffer[ i + 2 ];
var u = azimuth( vertex ) / 2 / Math.PI + 0.5;
var v = inclination( vertex ) / Math.PI + 0.5;
uvBuffer.push( u, 1 - v );
}
correctUVs();
correctSeam();
}
function correctSeam() {
// handle case when face straddles the seam, see #3269
for ( var i = 0; i < uvBuffer.length; i += 6 ) {
// uv data of a single face
var x0 = uvBuffer[ i + 0 ];
var x1 = uvBuffer[ i + 2 ];
var x2 = uvBuffer[ i + 4 ];
var max = Math.max( x0, x1, x2 );
var min = Math.min( x0, x1, x2 );
// 0.9 is somewhat arbitrary
if ( max > 0.9 && min < 0.1 ) {
if ( x0 < 0.2 ) uvBuffer[ i + 0 ] += 1;
if ( x1 < 0.2 ) uvBuffer[ i + 2 ] += 1;
if ( x2 < 0.2 ) uvBuffer[ i + 4 ] += 1;
}
}
}
function pushVertex( vertex ) {
vertexBuffer.push( vertex.x, vertex.y, vertex.z );
}
function getVertexByIndex( index, vertex ) {
var stride = index * 3;
vertex.x = vertices[ stride + 0 ];
vertex.y = vertices[ stride + 1 ];
vertex.z = vertices[ stride + 2 ];
}
function correctUVs() {
var a = new Vector3();
var b = new Vector3();
var c = new Vector3();
var centroid = new Vector3();
var uvA = new Vector2();
var uvB = new Vector2();
var uvC = new Vector2();
for ( var i = 0, j = 0; i < vertexBuffer.length; i += 9, j += 6 ) {
a.set( vertexBuffer[ i + 0 ], vertexBuffer[ i + 1 ], vertexBuffer[ i + 2 ] );
b.set( vertexBuffer[ i + 3 ], vertexBuffer[ i + 4 ], vertexBuffer[ i + 5 ] );
c.set( vertexBuffer[ i + 6 ], vertexBuffer[ i + 7 ], vertexBuffer[ i + 8 ] );
uvA.set( uvBuffer[ j + 0 ], uvBuffer[ j + 1 ] );
uvB.set( uvBuffer[ j + 2 ], uvBuffer[ j + 3 ] );
uvC.set( uvBuffer[ j + 4 ], uvBuffer[ j + 5 ] );
centroid.copy( a ).add( b ).add( c ).divideScalar( 3 );
var azi = azimuth( centroid );
correctUV( uvA, j + 0, a, azi );
correctUV( uvB, j + 2, b, azi );
correctUV( uvC, j + 4, c, azi );
}
}
function correctUV( uv, stride, vector, azimuth ) {
if ( ( azimuth < 0 ) && ( uv.x === 1 ) ) {
uvBuffer[ stride ] = uv.x - 1;
}
if ( ( vector.x === 0 ) && ( vector.z === 0 ) ) {
uvBuffer[ stride ] = azimuth / 2 / Math.PI + 0.5;
}
}
// Angle around the Y axis, counter-clockwise when looking from above.
function azimuth( vector ) {
return Math.atan2( vector.z, - vector.x );
}
// Angle above the XZ plane.
function inclination( vector ) {
return Math.atan2( - vector.y, Math.sqrt( ( vector.x * vector.x ) + ( vector.z * vector.z ) ) );
}
}
PolyhedronBufferGeometry.prototype = Object.create( BufferGeometry.prototype );
PolyhedronBufferGeometry.prototype.constructor = PolyhedronBufferGeometry;
/**
* @author timothypratley / https://github.com/timothypratley
* @author Mugen87 / https://github.com/Mugen87
*/
// TetrahedronGeometry
function TetrahedronGeometry( radius, detail ) {
Geometry.call( this );
this.type = 'TetrahedronGeometry';
this.parameters = {
radius: radius,
detail: detail
};
this.fromBufferGeometry( new TetrahedronBufferGeometry( radius, detail ) );
this.mergeVertices();
}
TetrahedronGeometry.prototype = Object.create( Geometry.prototype );
TetrahedronGeometry.prototype.constructor = TetrahedronGeometry;
// TetrahedronBufferGeometry
function TetrahedronBufferGeometry( radius, detail ) {
var vertices = [
1, 1, 1, - 1, - 1, 1, - 1, 1, - 1, 1, - 1, - 1
];
var indices = [
2, 1, 0, 0, 3, 2, 1, 3, 0, 2, 3, 1
];
PolyhedronBufferGeometry.call( this, vertices, indices, radius, detail );
this.type = 'TetrahedronBufferGeometry';
this.parameters = {
radius: radius,
detail: detail
};
}
TetrahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype );
TetrahedronBufferGeometry.prototype.constructor = TetrahedronBufferGeometry;
/**
* @author timothypratley / https://github.com/timothypratley
* @author Mugen87 / https://github.com/Mugen87
*/
// OctahedronGeometry
function OctahedronGeometry( radius, detail ) {
Geometry.call( this );
this.type = 'OctahedronGeometry';
this.parameters = {
radius: radius,
detail: detail
};
this.fromBufferGeometry( new OctahedronBufferGeometry( radius, detail ) );
this.mergeVertices();
}
OctahedronGeometry.prototype = Object.create( Geometry.prototype );
OctahedronGeometry.prototype.constructor = OctahedronGeometry;
// OctahedronBufferGeometry
function OctahedronBufferGeometry( radius, detail ) {
var vertices = [
1, 0, 0, - 1, 0, 0, 0, 1, 0,
0, - 1, 0, 0, 0, 1, 0, 0, - 1
];
var indices = [
0, 2, 4, 0, 4, 3, 0, 3, 5,
0, 5, 2, 1, 2, 5, 1, 5, 3,
1, 3, 4, 1, 4, 2
];
PolyhedronBufferGeometry.call( this, vertices, indices, radius, detail );
this.type = 'OctahedronBufferGeometry';
this.parameters = {
radius: radius,
detail: detail
};
}
OctahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype );
OctahedronBufferGeometry.prototype.constructor = OctahedronBufferGeometry;
/**
* @author timothypratley / https://github.com/timothypratley
* @author Mugen87 / https://github.com/Mugen87
*/
// IcosahedronGeometry
function IcosahedronGeometry( radius, detail ) {
Geometry.call( this );
this.type = 'IcosahedronGeometry';
this.parameters = {
radius: radius,
detail: detail
};
this.fromBufferGeometry( new IcosahedronBufferGeometry( radius, detail ) );
this.mergeVertices();
}
IcosahedronGeometry.prototype = Object.create( Geometry.prototype );
IcosahedronGeometry.prototype.constructor = IcosahedronGeometry;
// IcosahedronBufferGeometry
function IcosahedronBufferGeometry( radius, detail ) {
var t = ( 1 + Math.sqrt( 5 ) ) / 2;
var vertices = [
- 1, t, 0, 1, t, 0, - 1, - t, 0, 1, - t, 0,
0, - 1, t, 0, 1, t, 0, - 1, - t, 0, 1, - t,
t, 0, - 1, t, 0, 1, - t, 0, - 1, - t, 0, 1
];
var indices = [
0, 11, 5, 0, 5, 1, 0, 1, 7, 0, 7, 10, 0, 10, 11,
1, 5, 9, 5, 11, 4, 11, 10, 2, 10, 7, 6, 7, 1, 8,
3, 9, 4, 3, 4, 2, 3, 2, 6, 3, 6, 8, 3, 8, 9,
4, 9, 5, 2, 4, 11, 6, 2, 10, 8, 6, 7, 9, 8, 1
];
PolyhedronBufferGeometry.call( this, vertices, indices, radius, detail );
this.type = 'IcosahedronBufferGeometry';
this.parameters = {
radius: radius,
detail: detail
};
}
IcosahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype );
IcosahedronBufferGeometry.prototype.constructor = IcosahedronBufferGeometry;
/**
* @author Abe Pazos / https://hamoid.com
* @author Mugen87 / https://github.com/Mugen87
*/
// DodecahedronGeometry
function DodecahedronGeometry( radius, detail ) {
Geometry.call( this );
this.type = 'DodecahedronGeometry';
this.parameters = {
radius: radius,
detail: detail
};
this.fromBufferGeometry( new DodecahedronBufferGeometry( radius, detail ) );
this.mergeVertices();
}
DodecahedronGeometry.prototype = Object.create( Geometry.prototype );
DodecahedronGeometry.prototype.constructor = DodecahedronGeometry;
// DodecahedronBufferGeometry
function DodecahedronBufferGeometry( radius, detail ) {
var t = ( 1 + Math.sqrt( 5 ) ) / 2;
var r = 1 / t;
var vertices = [
// (±1, ±1, ±1)
- 1, - 1, - 1, - 1, - 1, 1,
- 1, 1, - 1, - 1, 1, 1,
1, - 1, - 1, 1, - 1, 1,
1, 1, - 1, 1, 1, 1,
// (0, ±1/φ, ±φ)
0, - r, - t, 0, - r, t,
0, r, - t, 0, r, t,
// (±1/φ, ±φ, 0)
- r, - t, 0, - r, t, 0,
r, - t, 0, r, t, 0,
// (±φ, 0, ±1/φ)
- t, 0, - r, t, 0, - r,
- t, 0, r, t, 0, r
];
var indices = [
3, 11, 7, 3, 7, 15, 3, 15, 13,
7, 19, 17, 7, 17, 6, 7, 6, 15,
17, 4, 8, 17, 8, 10, 17, 10, 6,
8, 0, 16, 8, 16, 2, 8, 2, 10,
0, 12, 1, 0, 1, 18, 0, 18, 16,
6, 10, 2, 6, 2, 13, 6, 13, 15,
2, 16, 18, 2, 18, 3, 2, 3, 13,
18, 1, 9, 18, 9, 11, 18, 11, 3,
4, 14, 12, 4, 12, 0, 4, 0, 8,
11, 9, 5, 11, 5, 19, 11, 19, 7,
19, 5, 14, 19, 14, 4, 19, 4, 17,
1, 12, 14, 1, 14, 5, 1, 5, 9
];
PolyhedronBufferGeometry.call( this, vertices, indices, radius, detail );
this.type = 'DodecahedronBufferGeometry';
this.parameters = {
radius: radius,
detail: detail
};
}
DodecahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype );
DodecahedronBufferGeometry.prototype.constructor = DodecahedronBufferGeometry;
/**
* @author oosmoxiecode / https://github.com/oosmoxiecode
* @author WestLangley / https://github.com/WestLangley
* @author zz85 / https://github.com/zz85
* @author miningold / https://github.com/miningold
* @author jonobr1 / https://github.com/jonobr1
* @author Mugen87 / https://github.com/Mugen87
*
*/
// TubeGeometry
function TubeGeometry( path, tubularSegments, radius, radialSegments, closed, taper ) {
Geometry.call( this );
this.type = 'TubeGeometry';
this.parameters = {
path: path,
tubularSegments: tubularSegments,
radius: radius,
radialSegments: radialSegments,
closed: closed
};
if ( taper !== undefined ) console.warn( 'THREE.TubeGeometry: taper has been removed.' );
var bufferGeometry = new TubeBufferGeometry( path, tubularSegments, radius, radialSegments, closed );
// expose internals
this.tangents = bufferGeometry.tangents;
this.normals = bufferGeometry.normals;
this.binormals = bufferGeometry.binormals;
// create geometry
this.fromBufferGeometry( bufferGeometry );
this.mergeVertices();
}
TubeGeometry.prototype = Object.create( Geometry.prototype );
TubeGeometry.prototype.constructor = TubeGeometry;
// TubeBufferGeometry
function TubeBufferGeometry( path, tubularSegments, radius, radialSegments, closed ) {
BufferGeometry.call( this );
this.type = 'TubeBufferGeometry';
this.parameters = {
path: path,
tubularSegments: tubularSegments,
radius: radius,
radialSegments: radialSegments,
closed: closed
};
tubularSegments = tubularSegments || 64;
radius = radius || 1;
radialSegments = radialSegments || 8;
closed = closed || false;
var frames = path.computeFrenetFrames( tubularSegments, closed );
// expose internals
this.tangents = frames.tangents;
this.normals = frames.normals;
this.binormals = frames.binormals;
// helper variables
var vertex = new Vector3();
var normal = new Vector3();
var uv = new Vector2();
var P = new Vector3();
var i, j;
// buffer
var vertices = [];
var normals = [];
var uvs = [];
var indices = [];
// create buffer data
generateBufferData();
// build geometry
this.setIndex( indices );
this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );
this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );
// functions
function generateBufferData() {
for ( i = 0; i < tubularSegments; i ++ ) {
generateSegment( i );
}
// if the geometry is not closed, generate the last row of vertices and normals
// at the regular position on the given path
//
// if the geometry is closed, duplicate the first row of vertices and normals (uvs will differ)
generateSegment( ( closed === false ) ? tubularSegments : 0 );
// uvs are generated in a separate function.
// this makes it easy compute correct values for closed geometries
generateUVs();
// finally create faces
generateIndices();
}
function generateSegment( i ) {
// we use getPointAt to sample evenly distributed points from the given path
P = path.getPointAt( i / tubularSegments, P );
// retrieve corresponding normal and binormal
var N = frames.normals[ i ];
var B = frames.binormals[ i ];
// generate normals and vertices for the current segment
for ( j = 0; j <= radialSegments; j ++ ) {
var v = j / radialSegments * Math.PI * 2;
var sin = Math.sin( v );
var cos = - Math.cos( v );
// normal
normal.x = ( cos * N.x + sin * B.x );
normal.y = ( cos * N.y + sin * B.y );
normal.z = ( cos * N.z + sin * B.z );
normal.normalize();
normals.push( normal.x, normal.y, normal.z );
// vertex
vertex.x = P.x + radius * normal.x;
vertex.y = P.y + radius * normal.y;
vertex.z = P.z + radius * normal.z;
vertices.push( vertex.x, vertex.y, vertex.z );
}
}
function generateIndices() {
for ( j = 1; j <= tubularSegments; j ++ ) {
for ( i = 1; i <= radialSegments; i ++ ) {
var a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 );
var b = ( radialSegments + 1 ) * j + ( i - 1 );
var c = ( radialSegments + 1 ) * j + i;
var d = ( radialSegments + 1 ) * ( j - 1 ) + i;
// faces
indices.push( a, b, d );
indices.push( b, c, d );
}
}
}
function generateUVs() {
for ( i = 0; i <= tubularSegments; i ++ ) {
for ( j = 0; j <= radialSegments; j ++ ) {
uv.x = i / tubularSegments;
uv.y = j / radialSegments;
uvs.push( uv.x, uv.y );
}
}
}
}
TubeBufferGeometry.prototype = Object.create( BufferGeometry.prototype );
TubeBufferGeometry.prototype.constructor = TubeBufferGeometry;
/**
* @author oosmoxiecode
* @author Mugen87 / https://github.com/Mugen87
*
* based on http://www.blackpawn.com/texts/pqtorus/
*/
// TorusKnotGeometry
function TorusKnotGeometry( radius, tube, tubularSegments, radialSegments, p, q, heightScale ) {
Geometry.call( this );
this.type = 'TorusKnotGeometry';
this.parameters = {
radius: radius,
tube: tube,
tubularSegments: tubularSegments,
radialSegments: radialSegments,
p: p,
q: q
};
if ( heightScale !== undefined ) console.warn( 'THREE.TorusKnotGeometry: heightScale has been deprecated. Use .scale( x, y, z ) instead.' );
this.fromBufferGeometry( new TorusKnotBufferGeometry( radius, tube, tubularSegments, radialSegments, p, q ) );
this.mergeVertices();
}
TorusKnotGeometry.prototype = Object.create( Geometry.prototype );
TorusKnotGeometry.prototype.constructor = TorusKnotGeometry;
// TorusKnotBufferGeometry
function TorusKnotBufferGeometry( radius, tube, tubularSegments, radialSegments, p, q ) {
BufferGeometry.call( this );
this.type = 'TorusKnotBufferGeometry';
this.parameters = {
radius: radius,
tube: tube,
tubularSegments: tubularSegments,
radialSegments: radialSegments,
p: p,
q: q
};
radius = radius || 1;
tube = tube || 0.4;
tubularSegments = Math.floor( tubularSegments ) || 64;
radialSegments = Math.floor( radialSegments ) || 8;
p = p || 2;
q = q || 3;
// buffers
var indices = [];
var vertices = [];
var normals = [];
var uvs = [];
// helper variables
var i, j;
var vertex = new Vector3();
var normal = new Vector3();
var P1 = new Vector3();
var P2 = new Vector3();
var B = new Vector3();
var T = new Vector3();
var N = new Vector3();
// generate vertices, normals and uvs
for ( i = 0; i <= tubularSegments; ++ i ) {
// the radian "u" is used to calculate the position on the torus curve of the current tubular segement
var u = i / tubularSegments * p * Math.PI * 2;
// now we calculate two points. P1 is our current position on the curve, P2 is a little farther ahead.
// these points are used to create a special "coordinate space", which is necessary to calculate the correct vertex positions
calculatePositionOnCurve( u, p, q, radius, P1 );
calculatePositionOnCurve( u + 0.01, p, q, radius, P2 );
// calculate orthonormal basis
T.subVectors( P2, P1 );
N.addVectors( P2, P1 );
B.crossVectors( T, N );
N.crossVectors( B, T );
// normalize B, N. T can be ignored, we don't use it
B.normalize();
N.normalize();
for ( j = 0; j <= radialSegments; ++ j ) {
// now calculate the vertices. they are nothing more than an extrusion of the torus curve.
// because we extrude a shape in the xy-plane, there is no need to calculate a z-value.
var v = j / radialSegments * Math.PI * 2;
var cx = - tube * Math.cos( v );
var cy = tube * Math.sin( v );
// now calculate the final vertex position.
// first we orient the extrusion with our basis vectos, then we add it to the current position on the curve
vertex.x = P1.x + ( cx * N.x + cy * B.x );
vertex.y = P1.y + ( cx * N.y + cy * B.y );
vertex.z = P1.z + ( cx * N.z + cy * B.z );
vertices.push( vertex.x, vertex.y, vertex.z );
// normal (P1 is always the center/origin of the extrusion, thus we can use it to calculate the normal)
normal.subVectors( vertex, P1 ).normalize();
normals.push( normal.x, normal.y, normal.z );
// uv
uvs.push( i / tubularSegments );
uvs.push( j / radialSegments );
}
}
// generate indices
for ( j = 1; j <= tubularSegments; j ++ ) {
for ( i = 1; i <= radialSegments; i ++ ) {
// indices
var a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 );
var b = ( radialSegments + 1 ) * j + ( i - 1 );
var c = ( radialSegments + 1 ) * j + i;
var d = ( radialSegments + 1 ) * ( j - 1 ) + i;
// faces
indices.push( a, b, d );
indices.push( b, c, d );
}
}
// build geometry
this.setIndex( indices );
this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );
this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );
// this function calculates the current position on the torus curve
function calculatePositionOnCurve( u, p, q, radius, position ) {
var cu = Math.cos( u );
var su = Math.sin( u );
var quOverP = q / p * u;
var cs = Math.cos( quOverP );
position.x = radius * ( 2 + cs ) * 0.5 * cu;
position.y = radius * ( 2 + cs ) * su * 0.5;
position.z = radius * Math.sin( quOverP ) * 0.5;
}
}
TorusKnotBufferGeometry.prototype = Object.create( BufferGeometry.prototype );
TorusKnotBufferGeometry.prototype.constructor = TorusKnotBufferGeometry;
/**
* @author oosmoxiecode
* @author mrdoob / http://mrdoob.com/
* @author Mugen87 / https://github.com/Mugen87
*/
// TorusGeometry
function TorusGeometry( radius, tube, radialSegments, tubularSegments, arc ) {
Geometry.call( this );
this.type = 'TorusGeometry';
this.parameters = {
radius: radius,
tube: tube,
radialSegments: radialSegments,
tubularSegments: tubularSegments,
arc: arc
};
this.fromBufferGeometry( new TorusBufferGeometry( radius, tube, radialSegments, tubularSegments, arc ) );
this.mergeVertices();
}
TorusGeometry.prototype = Object.create( Geometry.prototype );
TorusGeometry.prototype.constructor = TorusGeometry;
// TorusBufferGeometry
function TorusBufferGeometry( radius, tube, radialSegments, tubularSegments, arc ) {
BufferGeometry.call( this );
this.type = 'TorusBufferGeometry';
this.parameters = {
radius: radius,
tube: tube,
radialSegments: radialSegments,
tubularSegments: tubularSegments,
arc: arc
};
radius = radius || 1;
tube = tube || 0.4;
radialSegments = Math.floor( radialSegments ) || 8;
tubularSegments = Math.floor( tubularSegments ) || 6;
arc = arc || Math.PI * 2;
// buffers
var indices = [];
var vertices = [];
var normals = [];
var uvs = [];
// helper variables
var center = new Vector3();
var vertex = new Vector3();
var normal = new Vector3();
var j, i;
// generate vertices, normals and uvs
for ( j = 0; j <= radialSegments; j ++ ) {
for ( i = 0; i <= tubularSegments; i ++ ) {
var u = i / tubularSegments * arc;
var v = j / radialSegments * Math.PI * 2;
// vertex
vertex.x = ( radius + tube * Math.cos( v ) ) * Math.cos( u );
vertex.y = ( radius + tube * Math.cos( v ) ) * Math.sin( u );
vertex.z = tube * Math.sin( v );
vertices.push( vertex.x, vertex.y, vertex.z );
// normal
center.x = radius * Math.cos( u );
center.y = radius * Math.sin( u );
normal.subVectors( vertex, center ).normalize();
normals.push( normal.x, normal.y, normal.z );
// uv
uvs.push( i / tubularSegments );
uvs.push( j / radialSegments );
}
}
// generate indices
for ( j = 1; j <= radialSegments; j ++ ) {
for ( i = 1; i <= tubularSegments; i ++ ) {
// indices
var a = ( tubularSegments + 1 ) * j + i - 1;
var b = ( tubularSegments + 1 ) * ( j - 1 ) + i - 1;
var c = ( tubularSegments + 1 ) * ( j - 1 ) + i;
var d = ( tubularSegments + 1 ) * j + i;
// faces
indices.push( a, b, d );
indices.push( b, c, d );
}
}
// build geometry
this.setIndex( indices );
this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );
this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );
}
TorusBufferGeometry.prototype = Object.create( BufferGeometry.prototype );
TorusBufferGeometry.prototype.constructor = TorusBufferGeometry;
/**
* @author Mugen87 / https://github.com/Mugen87
* Port from https://github.com/mapbox/earcut (v2.1.2)
*/
var Earcut = {
triangulate: function ( data, holeIndices, dim ) {
dim = dim || 2;
var hasHoles = holeIndices && holeIndices.length,
outerLen = hasHoles ? holeIndices[ 0 ] * dim : data.length,
outerNode = linkedList( data, 0, outerLen, dim, true ),
triangles = [];
if ( ! outerNode ) return triangles;
var minX, minY, maxX, maxY, x, y, invSize;
if ( hasHoles ) outerNode = eliminateHoles( data, holeIndices, outerNode, dim );
// if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox
if ( data.length > 80 * dim ) {
minX = maxX = data[ 0 ];
minY = maxY = data[ 1 ];
for ( var i = dim; i < outerLen; i += dim ) {
x = data[ i ];
y = data[ i + 1 ];
if ( x < minX ) minX = x;
if ( y < minY ) minY = y;
if ( x > maxX ) maxX = x;
if ( y > maxY ) maxY = y;
}
// minX, minY and invSize are later used to transform coords into integers for z-order calculation
invSize = Math.max( maxX - minX, maxY - minY );
invSize = invSize !== 0 ? 1 / invSize : 0;
}
earcutLinked( outerNode, triangles, dim, minX, minY, invSize );
return triangles;
}
};
// create a circular doubly linked list from polygon points in the specified winding order
function linkedList( data, start, end, dim, clockwise ) {
var i, last;
if ( clockwise === ( signedArea( data, start, end, dim ) > 0 ) ) {
for ( i = start; i < end; i += dim ) last = insertNode( i, data[ i ], data[ i + 1 ], last );
} else {
for ( i = end - dim; i >= start; i -= dim ) last = insertNode( i, data[ i ], data[ i + 1 ], last );
}
if ( last && equals( last, last.next ) ) {
removeNode( last );
last = last.next;
}
return last;
}
// eliminate colinear or duplicate points
function filterPoints( start, end ) {
if ( ! start ) return start;
if ( ! end ) end = start;
var p = start, again;
do {
again = false;
if ( ! p.steiner && ( equals( p, p.next ) || area( p.prev, p, p.next ) === 0 ) ) {
removeNode( p );
p = end = p.prev;
if ( p === p.next ) break;
again = true;
} else {
p = p.next;
}
} while ( again || p !== end );
return end;
}
// main ear slicing loop which triangulates a polygon (given as a linked list)
function earcutLinked( ear, triangles, dim, minX, minY, invSize, pass ) {
if ( ! ear ) return;
// interlink polygon nodes in z-order
if ( ! pass && invSize ) indexCurve( ear, minX, minY, invSize );
var stop = ear, prev, next;
// iterate through ears, slicing them one by one
while ( ear.prev !== ear.next ) {
prev = ear.prev;
next = ear.next;
if ( invSize ? isEarHashed( ear, minX, minY, invSize ) : isEar( ear ) ) {
// cut off the triangle
triangles.push( prev.i / dim );
triangles.push( ear.i / dim );
triangles.push( next.i / dim );
removeNode( ear );
// skipping the next vertice leads to less sliver triangles
ear = next.next;
stop = next.next;
continue;
}
ear = next;
// if we looped through the whole remaining polygon and can't find any more ears
if ( ear === stop ) {
// try filtering points and slicing again
if ( ! pass ) {
earcutLinked( filterPoints( ear ), triangles, dim, minX, minY, invSize, 1 );
// if this didn't work, try curing all small self-intersections locally
} else if ( pass === 1 ) {
ear = cureLocalIntersections( ear, triangles, dim );
earcutLinked( ear, triangles, dim, minX, minY, invSize, 2 );
// as a last resort, try splitting the remaining polygon into two
} else if ( pass === 2 ) {
splitEarcut( ear, triangles, dim, minX, minY, invSize );
}
break;
}
}
}
// check whether a polygon node forms a valid ear with adjacent nodes
function isEar( ear ) {
var a = ear.prev,
b = ear,
c = ear.next;
if ( area( a, b, c ) >= 0 ) return false; // reflex, can't be an ear
// now make sure we don't have other points inside the potential ear
var p = ear.next.next;
while ( p !== ear.prev ) {
if ( pointInTriangle( a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y ) && area( p.prev, p, p.next ) >= 0 ) {
return false;
}
p = p.next;
}
return true;
}
function isEarHashed( ear, minX, minY, invSize ) {
var a = ear.prev,
b = ear,
c = ear.next;
if ( area( a, b, c ) >= 0 ) return false; // reflex, can't be an ear
// triangle bbox; min & max are calculated like this for speed
var minTX = a.x < b.x ? ( a.x < c.x ? a.x : c.x ) : ( b.x < c.x ? b.x : c.x ),
minTY = a.y < b.y ? ( a.y < c.y ? a.y : c.y ) : ( b.y < c.y ? b.y : c.y ),
maxTX = a.x > b.x ? ( a.x > c.x ? a.x : c.x ) : ( b.x > c.x ? b.x : c.x ),
maxTY = a.y > b.y ? ( a.y > c.y ? a.y : c.y ) : ( b.y > c.y ? b.y : c.y );
// z-order range for the current triangle bbox;
var minZ = zOrder( minTX, minTY, minX, minY, invSize ),
maxZ = zOrder( maxTX, maxTY, minX, minY, invSize );
// first look for points inside the triangle in increasing z-order
var p = ear.nextZ;
while ( p && p.z <= maxZ ) {
if ( p !== ear.prev && p !== ear.next &&
pointInTriangle( a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y ) &&
area( p.prev, p, p.next ) >= 0 ) return false;
p = p.nextZ;
}
// then look for points in decreasing z-order
p = ear.prevZ;
while ( p && p.z >= minZ ) {
if ( p !== ear.prev && p !== ear.next &&
pointInTriangle( a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y ) &&
area( p.prev, p, p.next ) >= 0 ) return false;
p = p.prevZ;
}
return true;
}
// go through all polygon nodes and cure small local self-intersections
function cureLocalIntersections( start, triangles, dim ) {
var p = start;
do {
var a = p.prev, b = p.next.next;
if ( ! equals( a, b ) && intersects( a, p, p.next, b ) && locallyInside( a, b ) && locallyInside( b, a ) ) {
triangles.push( a.i / dim );
triangles.push( p.i / dim );
triangles.push( b.i / dim );
// remove two nodes involved
removeNode( p );
removeNode( p.next );
p = start = b;
}
p = p.next;
} while ( p !== start );
return p;
}
// try splitting polygon into two and triangulate them independently
function splitEarcut( start, triangles, dim, minX, minY, invSize ) {
// look for a valid diagonal that divides the polygon into two
var a = start;
do {
var b = a.next.next;
while ( b !== a.prev ) {
if ( a.i !== b.i && isValidDiagonal( a, b ) ) {
// split the polygon in two by the diagonal
var c = splitPolygon( a, b );
// filter colinear points around the cuts
a = filterPoints( a, a.next );
c = filterPoints( c, c.next );
// run earcut on each half
earcutLinked( a, triangles, dim, minX, minY, invSize );
earcutLinked( c, triangles, dim, minX, minY, invSize );
return;
}
b = b.next;
}
a = a.next;
} while ( a !== start );
}
// link every hole into the outer loop, producing a single-ring polygon without holes
function eliminateHoles( data, holeIndices, outerNode, dim ) {
var queue = [], i, len, start, end, list;
for ( i = 0, len = holeIndices.length; i < len; i ++ ) {
start = holeIndices[ i ] * dim;
end = i < len - 1 ? holeIndices[ i + 1 ] * dim : data.length;
list = linkedList( data, start, end, dim, false );
if ( list === list.next ) list.steiner = true;
queue.push( getLeftmost( list ) );
}
queue.sort( compareX );
// process holes from left to right
for ( i = 0; i < queue.length; i ++ ) {
eliminateHole( queue[ i ], outerNode );
outerNode = filterPoints( outerNode, outerNode.next );
}
return outerNode;
}
function compareX( a, b ) {
return a.x - b.x;
}
// find a bridge between vertices that connects hole with an outer ring and and link it
function eliminateHole( hole, outerNode ) {
outerNode = findHoleBridge( hole, outerNode );
if ( outerNode ) {
var b = splitPolygon( outerNode, hole );
filterPoints( b, b.next );
}
}
// David Eberly's algorithm for finding a bridge between hole and outer polygon
function findHoleBridge( hole, outerNode ) {
var p = outerNode,
hx = hole.x,
hy = hole.y,
qx = - Infinity,
m;
// find a segment intersected by a ray from the hole's leftmost point to the left;
// segment's endpoint with lesser x will be potential connection point
do {
if ( hy <= p.y && hy >= p.next.y && p.next.y !== p.y ) {
var x = p.x + ( hy - p.y ) * ( p.next.x - p.x ) / ( p.next.y - p.y );
if ( x <= hx && x > qx ) {
qx = x;
if ( x === hx ) {
if ( hy === p.y ) return p;
if ( hy === p.next.y ) return p.next;
}
m = p.x < p.next.x ? p : p.next;
}
}
p = p.next;
} while ( p !== outerNode );
if ( ! m ) return null;
if ( hx === qx ) return m.prev; // hole touches outer segment; pick lower endpoint
// look for points inside the triangle of hole point, segment intersection and endpoint;
// if there are no points found, we have a valid connection;
// otherwise choose the point of the minimum angle with the ray as connection point
var stop = m,
mx = m.x,
my = m.y,
tanMin = Infinity,
tan;
p = m.next;
while ( p !== stop ) {
if ( hx >= p.x && p.x >= mx && hx !== p.x &&
pointInTriangle( hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y ) ) {
tan = Math.abs( hy - p.y ) / ( hx - p.x ); // tangential
if ( ( tan < tanMin || ( tan === tanMin && p.x > m.x ) ) && locallyInside( p, hole ) ) {
m = p;
tanMin = tan;
}
}
p = p.next;
}
return m;
}
// interlink polygon nodes in z-order
function indexCurve( start, minX, minY, invSize ) {
var p = start;
do {
if ( p.z === null ) p.z = zOrder( p.x, p.y, minX, minY, invSize );
p.prevZ = p.prev;
p.nextZ = p.next;
p = p.next;
} while ( p !== start );
p.prevZ.nextZ = null;
p.prevZ = null;
sortLinked( p );
}
// Simon Tatham's linked list merge sort algorithm
// http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html
function sortLinked( list ) {
var i, p, q, e, tail, numMerges, pSize, qSize, inSize = 1;
do {
p = list;
list = null;
tail = null;
numMerges = 0;
while ( p ) {
numMerges ++;
q = p;
pSize = 0;
for ( i = 0; i < inSize; i ++ ) {
pSize ++;
q = q.nextZ;
if ( ! q ) break;
}
qSize = inSize;
while ( pSize > 0 || ( qSize > 0 && q ) ) {
if ( pSize !== 0 && ( qSize === 0 || ! q || p.z <= q.z ) ) {
e = p;
p = p.nextZ;
pSize --;
} else {
e = q;
q = q.nextZ;
qSize --;
}
if ( tail ) tail.nextZ = e;
else list = e;
e.prevZ = tail;
tail = e;
}
p = q;
}
tail.nextZ = null;
inSize *= 2;
} while ( numMerges > 1 );
return list;
}
// z-order of a point given coords and inverse of the longer side of data bbox
function zOrder( x, y, minX, minY, invSize ) {
// coords are transformed into non-negative 15-bit integer range
x = 32767 * ( x - minX ) * invSize;
y = 32767 * ( y - minY ) * invSize;
x = ( x | ( x << 8 ) ) & 0x00FF00FF;
x = ( x | ( x << 4 ) ) & 0x0F0F0F0F;
x = ( x | ( x << 2 ) ) & 0x33333333;
x = ( x | ( x << 1 ) ) & 0x55555555;
y = ( y | ( y << 8 ) ) & 0x00FF00FF;
y = ( y | ( y << 4 ) ) & 0x0F0F0F0F;
y = ( y | ( y << 2 ) ) & 0x33333333;
y = ( y | ( y << 1 ) ) & 0x55555555;
return x | ( y << 1 );
}
// find the leftmost node of a polygon ring
function getLeftmost( start ) {
var p = start, leftmost = start;
do {
if ( p.x < leftmost.x ) leftmost = p;
p = p.next;
} while ( p !== start );
return leftmost;
}
// check if a point lies within a convex triangle
function pointInTriangle( ax, ay, bx, by, cx, cy, px, py ) {
return ( cx - px ) * ( ay - py ) - ( ax - px ) * ( cy - py ) >= 0 &&
( ax - px ) * ( by - py ) - ( bx - px ) * ( ay - py ) >= 0 &&
( bx - px ) * ( cy - py ) - ( cx - px ) * ( by - py ) >= 0;
}
// check if a diagonal between two polygon nodes is valid (lies in polygon interior)
function isValidDiagonal( a, b ) {
return a.next.i !== b.i && a.prev.i !== b.i && ! intersectsPolygon( a, b ) &&
locallyInside( a, b ) && locallyInside( b, a ) && middleInside( a, b );
}
// signed area of a triangle
function area( p, q, r ) {
return ( q.y - p.y ) * ( r.x - q.x ) - ( q.x - p.x ) * ( r.y - q.y );
}
// check if two points are equal
function equals( p1, p2 ) {
return p1.x === p2.x && p1.y === p2.y;
}
// check if two segments intersect
function intersects( p1, q1, p2, q2 ) {
if ( ( equals( p1, q1 ) && equals( p2, q2 ) ) ||
( equals( p1, q2 ) && equals( p2, q1 ) ) ) return true;
return area( p1, q1, p2 ) > 0 !== area( p1, q1, q2 ) > 0 &&
area( p2, q2, p1 ) > 0 !== area( p2, q2, q1 ) > 0;
}
// check if a polygon diagonal intersects any polygon segments
function intersectsPolygon( a, b ) {
var p = a;
do {
if ( p.i !== a.i && p.next.i !== a.i && p.i !== b.i && p.next.i !== b.i &&
intersects( p, p.next, a, b ) ) {
return true;
}
p = p.next;
} while ( p !== a );
return false;
}
// check if a polygon diagonal is locally inside the polygon
function locallyInside( a, b ) {
return area( a.prev, a, a.next ) < 0 ?
area( a, b, a.next ) >= 0 && area( a, a.prev, b ) >= 0 :
area( a, b, a.prev ) < 0 || area( a, a.next, b ) < 0;
}
// check if the middle point of a polygon diagonal is inside the polygon
function middleInside( a, b ) {
var p = a,
inside = false,
px = ( a.x + b.x ) / 2,
py = ( a.y + b.y ) / 2;
do {
if ( ( ( p.y > py ) !== ( p.next.y > py ) ) && p.next.y !== p.y &&
( px < ( p.next.x - p.x ) * ( py - p.y ) / ( p.next.y - p.y ) + p.x ) ) {
inside = ! inside;
}
p = p.next;
} while ( p !== a );
return inside;
}
// link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits polygon into two;
// if one belongs to the outer ring and another to a hole, it merges it into a single ring
function splitPolygon( a, b ) {
var a2 = new Node( a.i, a.x, a.y ),
b2 = new Node( b.i, b.x, b.y ),
an = a.next,
bp = b.prev;
a.next = b;
b.prev = a;
a2.next = an;
an.prev = a2;
b2.next = a2;
a2.prev = b2;
bp.next = b2;
b2.prev = bp;
return b2;
}
// create a node and optionally link it with previous one (in a circular doubly linked list)
function insertNode( i, x, y, last ) {
var p = new Node( i, x, y );
if ( ! last ) {
p.prev = p;
p.next = p;
} else {
p.next = last.next;
p.prev = last;
last.next.prev = p;
last.next = p;
}
return p;
}
function removeNode( p ) {
p.next.prev = p.prev;
p.prev.next = p.next;
if ( p.prevZ ) p.prevZ.nextZ = p.nextZ;
if ( p.nextZ ) p.nextZ.prevZ = p.prevZ;
}
function Node( i, x, y ) {
// vertice index in coordinates array
this.i = i;
// vertex coordinates
this.x = x;
this.y = y;
// previous and next vertice nodes in a polygon ring
this.prev = null;
this.next = null;
// z-order curve value
this.z = null;
// previous and next nodes in z-order
this.prevZ = null;
this.nextZ = null;
// indicates whether this is a steiner point
this.steiner = false;
}
function signedArea( data, start, end, dim ) {
var sum = 0;
for ( var i = start, j = end - dim; i < end; i += dim ) {
sum += ( data[ j ] - data[ i ] ) * ( data[ i + 1 ] + data[ j + 1 ] );
j = i;
}
return sum;
}
/**
* @author zz85 / http://www.lab4games.net/zz85/blog
*/
var ShapeUtils = {
// calculate area of the contour polygon
area: function ( contour ) {
var n = contour.length;
var a = 0.0;
for ( var p = n - 1, q = 0; q < n; p = q ++ ) {
a += contour[ p ].x * contour[ q ].y - contour[ q ].x * contour[ p ].y;
}
return a * 0.5;
},
isClockWise: function ( pts ) {
return ShapeUtils.area( pts ) < 0;
},
triangulateShape: function ( contour, holes ) {
var vertices = []; // flat array of vertices like [ x0,y0, x1,y1, x2,y2, ... ]
var holeIndices = []; // array of hole indices
var faces = []; // final array of vertex indices like [ [ a,b,d ], [ b,c,d ] ]
removeDupEndPts( contour );
addContour( vertices, contour );
//
var holeIndex = contour.length;
holes.forEach( removeDupEndPts );
for ( var i = 0; i < holes.length; i ++ ) {
holeIndices.push( holeIndex );
holeIndex += holes[ i ].length;
addContour( vertices, holes[ i ] );
}
//
var triangles = Earcut.triangulate( vertices, holeIndices );
//
for ( var i = 0; i < triangles.length; i += 3 ) {
faces.push( triangles.slice( i, i + 3 ) );
}
return faces;
}
};
function removeDupEndPts( points ) {
var l = points.length;
if ( l > 2 && points[ l - 1 ].equals( points[ 0 ] ) ) {
points.pop();
}
}
function addContour( vertices, contour ) {
for ( var i = 0; i < contour.length; i ++ ) {
vertices.push( contour[ i ].x );
vertices.push( contour[ i ].y );
}
}
/**
* @author zz85 / http://www.lab4games.net/zz85/blog
*
* Creates extruded geometry from a path shape.
*
* parameters = {
*
* curveSegments: <int>, // number of points on the curves
* steps: <int>, // number of points for z-side extrusions / used for subdividing segments of extrude spline too
* amount: <int>, // Depth to extrude the shape
*
* bevelEnabled: <bool>, // turn on bevel
* bevelThickness: <float>, // how deep into the original shape bevel goes
* bevelSize: <float>, // how far from shape outline is bevel
* bevelSegments: <int>, // number of bevel layers
*
* extrudePath: <THREE.Curve> // curve to extrude shape along
*
* UVGenerator: <Object> // object that provides UV generator functions
*
* }
*/
// ExtrudeGeometry
function ExtrudeGeometry( shapes, options ) {
Geometry.call( this );
this.type = 'ExtrudeGeometry';
this.parameters = {
shapes: shapes,
options: options
};
this.fromBufferGeometry( new ExtrudeBufferGeometry( shapes, options ) );
this.mergeVertices();
}
ExtrudeGeometry.prototype = Object.create( Geometry.prototype );
ExtrudeGeometry.prototype.constructor = ExtrudeGeometry;
// ExtrudeBufferGeometry
function ExtrudeBufferGeometry( shapes, options ) {
BufferGeometry.call( this );
this.type = 'ExtrudeBufferGeometry';
this.parameters = {
shapes: shapes,
options: options
};
shapes = Array.isArray( shapes ) ? shapes : [ shapes ];
var scope = this;
var verticesArray = [];
var uvArray = [];
for ( var i = 0, l = shapes.length; i < l; i ++ ) {
var shape = shapes[ i ];
addShape( shape, options );
}
// build geometry
this.addAttribute( 'position', new Float32BufferAttribute( verticesArray, 3 ) );
this.addAttribute( 'uv', new Float32BufferAttribute( uvArray, 2 ) );
this.computeVertexNormals();
// functions
function addShape( shape ) {
var placeholder = [];
// options
var curveSegments = options.curveSegments !== undefined ? options.curveSegments : 12;
var steps = options.steps !== undefined ? options.steps : 1;
var amount = options.amount !== undefined ? options.amount : 100;
var bevelEnabled = options.bevelEnabled !== undefined ? options.bevelEnabled : true;
var bevelThickness = options.bevelThickness !== undefined ? options.bevelThickness : 6;
var bevelSize = options.bevelSize !== undefined ? options.bevelSize : bevelThickness - 2;
var bevelSegments = options.bevelSegments !== undefined ? options.bevelSegments : 3;
var extrudePath = options.extrudePath;
var uvgen = options.UVGenerator !== undefined ? options.UVGenerator : WorldUVGenerator;
//
var extrudePts, extrudeByPath = false;
var splineTube, binormal, normal, position2;
if ( extrudePath ) {
extrudePts = extrudePath.getSpacedPoints( steps );
extrudeByPath = true;
bevelEnabled = false; // bevels not supported for path extrusion
// SETUP TNB variables
// TODO1 - have a .isClosed in spline?
splineTube = extrudePath.computeFrenetFrames( steps, false );
// console.log(splineTube, 'splineTube', splineTube.normals.length, 'steps', steps, 'extrudePts', extrudePts.length);
binormal = new Vector3();
normal = new Vector3();
position2 = new Vector3();
}
// Safeguards if bevels are not enabled
if ( ! bevelEnabled ) {
bevelSegments = 0;
bevelThickness = 0;
bevelSize = 0;
}
// Variables initialization
var ahole, h, hl; // looping of holes
var shapePoints = shape.extractPoints( curveSegments );
var vertices = shapePoints.shape;
var holes = shapePoints.holes;
var reverse = ! ShapeUtils.isClockWise( vertices );
if ( reverse ) {
vertices = vertices.reverse();
// Maybe we should also check if holes are in the opposite direction, just to be safe ...
for ( h = 0, hl = holes.length; h < hl; h ++ ) {
ahole = holes[ h ];
if ( ShapeUtils.isClockWise( ahole ) ) {
holes[ h ] = ahole.reverse();
}
}
}
var faces = ShapeUtils.triangulateShape( vertices, holes );
/* Vertices */
var contour = vertices; // vertices has all points but contour has only points of circumference
for ( h = 0, hl = holes.length; h < hl; h ++ ) {
ahole = holes[ h ];
vertices = vertices.concat( ahole );
}
function scalePt2( pt, vec, size ) {
if ( ! vec ) console.error( "THREE.ExtrudeGeometry: vec does not exist" );
return vec.clone().multiplyScalar( size ).add( pt );
}
var b, bs, t, z,
vert, vlen = vertices.length,
face, flen = faces.length;
// Find directions for point movement
function getBevelVec( inPt, inPrev, inNext ) {
// computes for inPt the corresponding point inPt' on a new contour
// shifted by 1 unit (length of normalized vector) to the left
// if we walk along contour clockwise, this new contour is outside the old one
//
// inPt' is the intersection of the two lines parallel to the two
// adjacent edges of inPt at a distance of 1 unit on the left side.
var v_trans_x, v_trans_y, shrink_by; // resulting translation vector for inPt
// good reading for geometry algorithms (here: line-line intersection)
// http://geomalgorithms.com/a05-_intersect-1.html
var v_prev_x = inPt.x - inPrev.x,
v_prev_y = inPt.y - inPrev.y;
var v_next_x = inNext.x - inPt.x,
v_next_y = inNext.y - inPt.y;
var v_prev_lensq = ( v_prev_x * v_prev_x + v_prev_y * v_prev_y );
// check for collinear edges
var collinear0 = ( v_prev_x * v_next_y - v_prev_y * v_next_x );
if ( Math.abs( collinear0 ) > Number.EPSILON ) {
// not collinear
// length of vectors for normalizing
var v_prev_len = Math.sqrt( v_prev_lensq );
var v_next_len = Math.sqrt( v_next_x * v_next_x + v_next_y * v_next_y );
// shift adjacent points by unit vectors to the left
var ptPrevShift_x = ( inPrev.x - v_prev_y / v_prev_len );
var ptPrevShift_y = ( inPrev.y + v_prev_x / v_prev_len );
var ptNextShift_x = ( inNext.x - v_next_y / v_next_len );
var ptNextShift_y = ( inNext.y + v_next_x / v_next_len );
// scaling factor for v_prev to intersection point
var sf = ( ( ptNextShift_x - ptPrevShift_x ) * v_next_y -
( ptNextShift_y - ptPrevShift_y ) * v_next_x ) /
( v_prev_x * v_next_y - v_prev_y * v_next_x );
// vector from inPt to intersection point
v_trans_x = ( ptPrevShift_x + v_prev_x * sf - inPt.x );
v_trans_y = ( ptPrevShift_y + v_prev_y * sf - inPt.y );
// Don't normalize!, otherwise sharp corners become ugly
// but prevent crazy spikes
var v_trans_lensq = ( v_trans_x * v_trans_x + v_trans_y * v_trans_y );
if ( v_trans_lensq <= 2 ) {
return new Vector2( v_trans_x, v_trans_y );
} else {
shrink_by = Math.sqrt( v_trans_lensq / 2 );
}
} else {
// handle special case of collinear edges
var direction_eq = false; // assumes: opposite
if ( v_prev_x > Number.EPSILON ) {
if ( v_next_x > Number.EPSILON ) {
direction_eq = true;
}
} else {
if ( v_prev_x < - Number.EPSILON ) {
if ( v_next_x < - Number.EPSILON ) {
direction_eq = true;
}
} else {
if ( Math.sign( v_prev_y ) === Math.sign( v_next_y ) ) {
direction_eq = true;
}
}
}
if ( direction_eq ) {
// console.log("Warning: lines are a straight sequence");
v_trans_x = - v_prev_y;
v_trans_y = v_prev_x;
shrink_by = Math.sqrt( v_prev_lensq );
} else {
// console.log("Warning: lines are a straight spike");
v_trans_x = v_prev_x;
v_trans_y = v_prev_y;
shrink_by = Math.sqrt( v_prev_lensq / 2 );
}
}
return new Vector2( v_trans_x / shrink_by, v_trans_y / shrink_by );
}
var contourMovements = [];
for ( var i = 0, il = contour.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) {
if ( j === il ) j = 0;
if ( k === il ) k = 0;
// (j)---(i)---(k)
// console.log('i,j,k', i, j , k)
contourMovements[ i ] = getBevelVec( contour[ i ], contour[ j ], contour[ k ] );
}
var holesMovements = [],
oneHoleMovements, verticesMovements = contourMovements.concat();
for ( h = 0, hl = holes.length; h < hl; h ++ ) {
ahole = holes[ h ];
oneHoleMovements = [];
for ( i = 0, il = ahole.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) {
if ( j === il ) j = 0;
if ( k === il ) k = 0;
// (j)---(i)---(k)
oneHoleMovements[ i ] = getBevelVec( ahole[ i ], ahole[ j ], ahole[ k ] );
}
holesMovements.push( oneHoleMovements );
verticesMovements = verticesMovements.concat( oneHoleMovements );
}
// Loop bevelSegments, 1 for the front, 1 for the back
for ( b = 0; b < bevelSegments; b ++ ) {
//for ( b = bevelSegments; b > 0; b -- ) {
t = b / bevelSegments;
z = bevelThickness * Math.cos( t * Math.PI / 2 );
bs = bevelSize * Math.sin( t * Math.PI / 2 );
// contract shape
for ( i = 0, il = contour.length; i < il; i ++ ) {
vert = scalePt2( contour[ i ], contourMovements[ i ], bs );
v( vert.x, vert.y, - z );
}
// expand holes
for ( h = 0, hl = holes.length; h < hl; h ++ ) {
ahole = holes[ h ];
oneHoleMovements = holesMovements[ h ];
for ( i = 0, il = ahole.length; i < il; i ++ ) {
vert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs );
v( vert.x, vert.y, - z );
}
}
}
bs = bevelSize;
// Back facing vertices
for ( i = 0; i < vlen; i ++ ) {
vert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ];
if ( ! extrudeByPath ) {
v( vert.x, vert.y, 0 );
} else {
// v( vert.x, vert.y + extrudePts[ 0 ].y, extrudePts[ 0 ].x );
normal.copy( splineTube.normals[ 0 ] ).multiplyScalar( vert.x );
binormal.copy( splineTube.binormals[ 0 ] ).multiplyScalar( vert.y );
position2.copy( extrudePts[ 0 ] ).add( normal ).add( binormal );
v( position2.x, position2.y, position2.z );
}
}
// Add stepped vertices...
// Including front facing vertices
var s;
for ( s = 1; s <= steps; s ++ ) {
for ( i = 0; i < vlen; i ++ ) {
vert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ];
if ( ! extrudeByPath ) {
v( vert.x, vert.y, amount / steps * s );
} else {
// v( vert.x, vert.y + extrudePts[ s - 1 ].y, extrudePts[ s - 1 ].x );
normal.copy( splineTube.normals[ s ] ).multiplyScalar( vert.x );
binormal.copy( splineTube.binormals[ s ] ).multiplyScalar( vert.y );
position2.copy( extrudePts[ s ] ).add( normal ).add( binormal );
v( position2.x, position2.y, position2.z );
}
}
}
// Add bevel segments planes
//for ( b = 1; b <= bevelSegments; b ++ ) {
for ( b = bevelSegments - 1; b >= 0; b -- ) {
t = b / bevelSegments;
z = bevelThickness * Math.cos( t * Math.PI / 2 );
bs = bevelSize * Math.sin( t * Math.PI / 2 );
// contract shape
for ( i = 0, il = contour.length; i < il; i ++ ) {
vert = scalePt2( contour[ i ], contourMovements[ i ], bs );
v( vert.x, vert.y, amount + z );
}
// expand holes
for ( h = 0, hl = holes.length; h < hl; h ++ ) {
ahole = holes[ h ];
oneHoleMovements = holesMovements[ h ];
for ( i = 0, il = ahole.length; i < il; i ++ ) {
vert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs );
if ( ! extrudeByPath ) {
v( vert.x, vert.y, amount + z );
} else {
v( vert.x, vert.y + extrudePts[ steps - 1 ].y, extrudePts[ steps - 1 ].x + z );
}
}
}
}
/* Faces */
// Top and bottom faces
buildLidFaces();
// Sides faces
buildSideFaces();
///// Internal functions
function buildLidFaces() {
var start = verticesArray.length / 3;
if ( bevelEnabled ) {
var layer = 0; // steps + 1
var offset = vlen * layer;
// Bottom faces
for ( i = 0; i < flen; i ++ ) {
face = faces[ i ];
f3( face[ 2 ] + offset, face[ 1 ] + offset, face[ 0 ] + offset );
}
layer = steps + bevelSegments * 2;
offset = vlen * layer;
// Top faces
for ( i = 0; i < flen; i ++ ) {
face = faces[ i ];
f3( face[ 0 ] + offset, face[ 1 ] + offset, face[ 2 ] + offset );
}
} else {
// Bottom faces
for ( i = 0; i < flen; i ++ ) {
face = faces[ i ];
f3( face[ 2 ], face[ 1 ], face[ 0 ] );
}
// Top faces
for ( i = 0; i < flen; i ++ ) {
face = faces[ i ];
f3( face[ 0 ] + vlen * steps, face[ 1 ] + vlen * steps, face[ 2 ] + vlen * steps );
}
}
scope.addGroup( start, verticesArray.length / 3 - start, 0 );
}
// Create faces for the z-sides of the shape
function buildSideFaces() {
var start = verticesArray.length / 3;
var layeroffset = 0;
sidewalls( contour, layeroffset );
layeroffset += contour.length;
for ( h = 0, hl = holes.length; h < hl; h ++ ) {
ahole = holes[ h ];
sidewalls( ahole, layeroffset );
//, true
layeroffset += ahole.length;
}
scope.addGroup( start, verticesArray.length / 3 - start, 1 );
}
function sidewalls( contour, layeroffset ) {
var j, k;
i = contour.length;
while ( -- i >= 0 ) {
j = i;
k = i - 1;
if ( k < 0 ) k = contour.length - 1;
//console.log('b', i,j, i-1, k,vertices.length);
var s = 0,
sl = steps + bevelSegments * 2;
for ( s = 0; s < sl; s ++ ) {
var slen1 = vlen * s;
var slen2 = vlen * ( s + 1 );
var a = layeroffset + j + slen1,
b = layeroffset + k + slen1,
c = layeroffset + k + slen2,
d = layeroffset + j + slen2;
f4( a, b, c, d );
}
}
}
function v( x, y, z ) {
placeholder.push( x );
placeholder.push( y );
placeholder.push( z );
}
function f3( a, b, c ) {
addVertex( a );
addVertex( b );
addVertex( c );
var nextIndex = verticesArray.length / 3;
var uvs = uvgen.generateTopUV( scope, verticesArray, nextIndex - 3, nextIndex - 2, nextIndex - 1 );
addUV( uvs[ 0 ] );
addUV( uvs[ 1 ] );
addUV( uvs[ 2 ] );
}
function f4( a, b, c, d ) {
addVertex( a );
addVertex( b );
addVertex( d );
addVertex( b );
addVertex( c );
addVertex( d );
var nextIndex = verticesArray.length / 3;
var uvs = uvgen.generateSideWallUV( scope, verticesArray, nextIndex - 6, nextIndex - 3, nextIndex - 2, nextIndex - 1 );
addUV( uvs[ 0 ] );
addUV( uvs[ 1 ] );
addUV( uvs[ 3 ] );
addUV( uvs[ 1 ] );
addUV( uvs[ 2 ] );
addUV( uvs[ 3 ] );
}
function addVertex( index ) {
verticesArray.push( placeholder[ index * 3 + 0 ] );
verticesArray.push( placeholder[ index * 3 + 1 ] );
verticesArray.push( placeholder[ index * 3 + 2 ] );
}
function addUV( vector2 ) {
uvArray.push( vector2.x );
uvArray.push( vector2.y );
}
}
}
ExtrudeBufferGeometry.prototype = Object.create( BufferGeometry.prototype );
ExtrudeBufferGeometry.prototype.constructor = ExtrudeBufferGeometry;
var WorldUVGenerator = {
generateTopUV: function ( geometry, vertices, indexA, indexB, indexC ) {
var a_x = vertices[ indexA * 3 ];
var a_y = vertices[ indexA * 3 + 1 ];
var b_x = vertices[ indexB * 3 ];
var b_y = vertices[ indexB * 3 + 1 ];
var c_x = vertices[ indexC * 3 ];
var c_y = vertices[ indexC * 3 + 1 ];
return [
new Vector2( a_x, a_y ),
new Vector2( b_x, b_y ),
new Vector2( c_x, c_y )
];
},
generateSideWallUV: function ( geometry, vertices, indexA, indexB, indexC, indexD ) {
var a_x = vertices[ indexA * 3 ];
var a_y = vertices[ indexA * 3 + 1 ];
var a_z = vertices[ indexA * 3 + 2 ];
var b_x = vertices[ indexB * 3 ];
var b_y = vertices[ indexB * 3 + 1 ];
var b_z = vertices[ indexB * 3 + 2 ];
var c_x = vertices[ indexC * 3 ];
var c_y = vertices[ indexC * 3 + 1 ];
var c_z = vertices[ indexC * 3 + 2 ];
var d_x = vertices[ indexD * 3 ];
var d_y = vertices[ indexD * 3 + 1 ];
var d_z = vertices[ indexD * 3 + 2 ];
if ( Math.abs( a_y - b_y ) < 0.01 ) {
return [
new Vector2( a_x, 1 - a_z ),
new Vector2( b_x, 1 - b_z ),
new Vector2( c_x, 1 - c_z ),
new Vector2( d_x, 1 - d_z )
];
} else {
return [
new Vector2( a_y, 1 - a_z ),
new Vector2( b_y, 1 - b_z ),
new Vector2( c_y, 1 - c_z ),
new Vector2( d_y, 1 - d_z )
];
}
}
};
/**
* @author zz85 / http://www.lab4games.net/zz85/blog
* @author alteredq / http://alteredqualia.com/
*
* Text = 3D Text
*
* parameters = {
* font: <THREE.Font>, // font
*
* size: <float>, // size of the text
* height: <float>, // thickness to extrude text
* curveSegments: <int>, // number of points on the curves
*
* bevelEnabled: <bool>, // turn on bevel
* bevelThickness: <float>, // how deep into text bevel goes
* bevelSize: <float> // how far from text outline is bevel
* }
*/
// TextGeometry
function TextGeometry( text, parameters ) {
Geometry.call( this );
this.type = 'TextGeometry';
this.parameters = {
text: text,
parameters: parameters
};
this.fromBufferGeometry( new TextBufferGeometry( text, parameters ) );
this.mergeVertices();
}
TextGeometry.prototype = Object.create( Geometry.prototype );
TextGeometry.prototype.constructor = TextGeometry;
// TextBufferGeometry
function TextBufferGeometry( text, parameters ) {
parameters = parameters || {};
var font = parameters.font;
if ( ! ( font && font.isFont ) ) {
console.error( 'THREE.TextGeometry: font parameter is not an instance of THREE.Font.' );
return new Geometry();
}
var shapes = font.generateShapes( text, parameters.size, parameters.curveSegments );
// translate parameters to ExtrudeGeometry API
parameters.amount = parameters.height !== undefined ? parameters.height : 50;
// defaults
if ( parameters.bevelThickness === undefined ) parameters.bevelThickness = 10;
if ( parameters.bevelSize === undefined ) parameters.bevelSize = 8;
if ( parameters.bevelEnabled === undefined ) parameters.bevelEnabled = false;
ExtrudeBufferGeometry.call( this, shapes, parameters );
this.type = 'TextBufferGeometry';
}
TextBufferGeometry.prototype = Object.create( ExtrudeBufferGeometry.prototype );
TextBufferGeometry.prototype.constructor = TextBufferGeometry;
/**
* @author mrdoob / http://mrdoob.com/
* @author benaadams / https://twitter.com/ben_a_adams
* @author Mugen87 / https://github.com/Mugen87
*/
// SphereGeometry
function SphereGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) {
Geometry.call( this );
this.type = 'SphereGeometry';
this.parameters = {
radius: radius,
widthSegments: widthSegments,
heightSegments: heightSegments,
phiStart: phiStart,
phiLength: phiLength,
thetaStart: thetaStart,
thetaLength: thetaLength
};
this.fromBufferGeometry( new SphereBufferGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) );
this.mergeVertices();
}
SphereGeometry.prototype = Object.create( Geometry.prototype );
SphereGeometry.prototype.constructor = SphereGeometry;
// SphereBufferGeometry
function SphereBufferGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) {
BufferGeometry.call( this );
this.type = 'SphereBufferGeometry';
this.parameters = {
radius: radius,
widthSegments: widthSegments,
heightSegments: heightSegments,
phiStart: phiStart,
phiLength: phiLength,
thetaStart: thetaStart,
thetaLength: thetaLength
};
radius = radius || 1;
widthSegments = Math.max( 3, Math.floor( widthSegments ) || 8 );
heightSegments = Math.max( 2, Math.floor( heightSegments ) || 6 );
phiStart = phiStart !== undefined ? phiStart : 0;
phiLength = phiLength !== undefined ? phiLength : Math.PI * 2;
thetaStart = thetaStart !== undefined ? thetaStart : 0;
thetaLength = thetaLength !== undefined ? thetaLength : Math.PI;
var thetaEnd = thetaStart + thetaLength;
var ix, iy;
var index = 0;
var grid = [];
var vertex = new Vector3();
var normal = new Vector3();
// buffers
var indices = [];
var vertices = [];
var normals = [];
var uvs = [];
// generate vertices, normals and uvs
for ( iy = 0; iy <= heightSegments; iy ++ ) {
var verticesRow = [];
var v = iy / heightSegments;
for ( ix = 0; ix <= widthSegments; ix ++ ) {
var u = ix / widthSegments;
// vertex
vertex.x = - radius * Math.cos( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength );
vertex.y = radius * Math.cos( thetaStart + v * thetaLength );
vertex.z = radius * Math.sin( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength );
vertices.push( vertex.x, vertex.y, vertex.z );
// normal
normal.set( vertex.x, vertex.y, vertex.z ).normalize();
normals.push( normal.x, normal.y, normal.z );
// uv
uvs.push( u, 1 - v );
verticesRow.push( index ++ );
}
grid.push( verticesRow );
}
// indices
for ( iy = 0; iy < heightSegments; iy ++ ) {
for ( ix = 0; ix < widthSegments; ix ++ ) {
var a = grid[ iy ][ ix + 1 ];
var b = grid[ iy ][ ix ];
var c = grid[ iy + 1 ][ ix ];
var d = grid[ iy + 1 ][ ix + 1 ];
if ( iy !== 0 || thetaStart > 0 ) indices.push( a, b, d );
if ( iy !== heightSegments - 1 || thetaEnd < Math.PI ) indices.push( b, c, d );
}
}
// build geometry
this.setIndex( indices );
this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );
this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );
}
SphereBufferGeometry.prototype = Object.create( BufferGeometry.prototype );
SphereBufferGeometry.prototype.constructor = SphereBufferGeometry;
/**
* @author Kaleb Murphy
* @author Mugen87 / https://github.com/Mugen87
*/
// RingGeometry
function RingGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) {
Geometry.call( this );
this.type = 'RingGeometry';
this.parameters = {
innerRadius: innerRadius,
outerRadius: outerRadius,
thetaSegments: thetaSegments,
phiSegments: phiSegments,
thetaStart: thetaStart,
thetaLength: thetaLength
};
this.fromBufferGeometry( new RingBufferGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) );
this.mergeVertices();
}
RingGeometry.prototype = Object.create( Geometry.prototype );
RingGeometry.prototype.constructor = RingGeometry;
// RingBufferGeometry
function RingBufferGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) {
BufferGeometry.call( this );
this.type = 'RingBufferGeometry';
this.parameters = {
innerRadius: innerRadius,
outerRadius: outerRadius,
thetaSegments: thetaSegments,
phiSegments: phiSegments,
thetaStart: thetaStart,
thetaLength: thetaLength
};
innerRadius = innerRadius || 0.5;
outerRadius = outerRadius || 1;
thetaStart = thetaStart !== undefined ? thetaStart : 0;
thetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2;
thetaSegments = thetaSegments !== undefined ? Math.max( 3, thetaSegments ) : 8;
phiSegments = phiSegments !== undefined ? Math.max( 1, phiSegments ) : 1;
// buffers
var indices = [];
var vertices = [];
var normals = [];
var uvs = [];
// some helper variables
var segment;
var radius = innerRadius;
var radiusStep = ( ( outerRadius - innerRadius ) / phiSegments );
var vertex = new Vector3();
var uv = new Vector2();
var j, i;
// generate vertices, normals and uvs
for ( j = 0; j <= phiSegments; j ++ ) {
for ( i = 0; i <= thetaSegments; i ++ ) {
// values are generate from the inside of the ring to the outside
segment = thetaStart + i / thetaSegments * thetaLength;
// vertex
vertex.x = radius * Math.cos( segment );
vertex.y = radius * Math.sin( segment );
vertices.push( vertex.x, vertex.y, vertex.z );
// normal
normals.push( 0, 0, 1 );
// uv
uv.x = ( vertex.x / outerRadius + 1 ) / 2;
uv.y = ( vertex.y / outerRadius + 1 ) / 2;
uvs.push( uv.x, uv.y );
}
// increase the radius for next row of vertices
radius += radiusStep;
}
// indices
for ( j = 0; j < phiSegments; j ++ ) {
var thetaSegmentLevel = j * ( thetaSegments + 1 );
for ( i = 0; i < thetaSegments; i ++ ) {
segment = i + thetaSegmentLevel;
var a = segment;
var b = segment + thetaSegments + 1;
var c = segment + thetaSegments + 2;
var d = segment + 1;
// faces
indices.push( a, b, d );
indices.push( b, c, d );
}
}
// build geometry
this.setIndex( indices );
this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );
this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );
}
RingBufferGeometry.prototype = Object.create( BufferGeometry.prototype );
RingBufferGeometry.prototype.constructor = RingBufferGeometry;
/**
* @author astrodud / http://astrodud.isgreat.org/
* @author zz85 / https://github.com/zz85
* @author bhouston / http://clara.io
* @author Mugen87 / https://github.com/Mugen87
*/
// LatheGeometry
function LatheGeometry( points, segments, phiStart, phiLength ) {
Geometry.call( this );
this.type = 'LatheGeometry';
this.parameters = {
points: points,
segments: segments,
phiStart: phiStart,
phiLength: phiLength
};
this.fromBufferGeometry( new LatheBufferGeometry( points, segments, phiStart, phiLength ) );
this.mergeVertices();
}
LatheGeometry.prototype = Object.create( Geometry.prototype );
LatheGeometry.prototype.constructor = LatheGeometry;
// LatheBufferGeometry
function LatheBufferGeometry( points, segments, phiStart, phiLength ) {
BufferGeometry.call( this );
this.type = 'LatheBufferGeometry';
this.parameters = {
points: points,
segments: segments,
phiStart: phiStart,
phiLength: phiLength
};
segments = Math.floor( segments ) || 12;
phiStart = phiStart || 0;
phiLength = phiLength || Math.PI * 2;
// clamp phiLength so it's in range of [ 0, 2PI ]
phiLength = _Math.clamp( phiLength, 0, Math.PI * 2 );
// buffers
var indices = [];
var vertices = [];
var uvs = [];
// helper variables
var base;
var inverseSegments = 1.0 / segments;
var vertex = new Vector3();
var uv = new Vector2();
var i, j;
// generate vertices and uvs
for ( i = 0; i <= segments; i ++ ) {
var phi = phiStart + i * inverseSegments * phiLength;
var sin = Math.sin( phi );
var cos = Math.cos( phi );
for ( j = 0; j <= ( points.length - 1 ); j ++ ) {
// vertex
vertex.x = points[ j ].x * sin;
vertex.y = points[ j ].y;
vertex.z = points[ j ].x * cos;
vertices.push( vertex.x, vertex.y, vertex.z );
// uv
uv.x = i / segments;
uv.y = j / ( points.length - 1 );
uvs.push( uv.x, uv.y );
}
}
// indices
for ( i = 0; i < segments; i ++ ) {
for ( j = 0; j < ( points.length - 1 ); j ++ ) {
base = j + i * points.length;
var a = base;
var b = base + points.length;
var c = base + points.length + 1;
var d = base + 1;
// faces
indices.push( a, b, d );
indices.push( b, c, d );
}
}
// build geometry
this.setIndex( indices );
this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );
// generate normals
this.computeVertexNormals();
// if the geometry is closed, we need to average the normals along the seam.
// because the corresponding vertices are identical (but still have different UVs).
if ( phiLength === Math.PI * 2 ) {
var normals = this.attributes.normal.array;
var n1 = new Vector3();
var n2 = new Vector3();
var n = new Vector3();
// this is the buffer offset for the last line of vertices
base = segments * points.length * 3;
for ( i = 0, j = 0; i < points.length; i ++, j += 3 ) {
// select the normal of the vertex in the first line
n1.x = normals[ j + 0 ];
n1.y = normals[ j + 1 ];
n1.z = normals[ j + 2 ];
// select the normal of the vertex in the last line
n2.x = normals[ base + j + 0 ];
n2.y = normals[ base + j + 1 ];
n2.z = normals[ base + j + 2 ];
// average normals
n.addVectors( n1, n2 ).normalize();
// assign the new values to both normals
normals[ j + 0 ] = normals[ base + j + 0 ] = n.x;
normals[ j + 1 ] = normals[ base + j + 1 ] = n.y;
normals[ j + 2 ] = normals[ base + j + 2 ] = n.z;
}
}
}
LatheBufferGeometry.prototype = Object.create( BufferGeometry.prototype );
LatheBufferGeometry.prototype.constructor = LatheBufferGeometry;
/**
* @author jonobr1 / http://jonobr1.com
* @author Mugen87 / https://github.com/Mugen87
*/
// ShapeGeometry
function ShapeGeometry( shapes, curveSegments ) {
Geometry.call( this );
this.type = 'ShapeGeometry';
if ( typeof curveSegments === 'object' ) {
console.warn( 'THREE.ShapeGeometry: Options parameter has been removed.' );
curveSegments = curveSegments.curveSegments;
}
this.parameters = {
shapes: shapes,
curveSegments: curveSegments
};
this.fromBufferGeometry( new ShapeBufferGeometry( shapes, curveSegments ) );
this.mergeVertices();
}
ShapeGeometry.prototype = Object.create( Geometry.prototype );
ShapeGeometry.prototype.constructor = ShapeGeometry;
ShapeGeometry.prototype.toJSON = function () {
var data = Geometry.prototype.toJSON.call( this );
var shapes = this.parameters.shapes;
return toJSON( shapes, data );
};
// ShapeBufferGeometry
function ShapeBufferGeometry( shapes, curveSegments ) {
BufferGeometry.call( this );
this.type = 'ShapeBufferGeometry';
this.parameters = {
shapes: shapes,
curveSegments: curveSegments
};
curveSegments = curveSegments || 12;
// buffers
var indices = [];
var vertices = [];
var normals = [];
var uvs = [];
// helper variables
var groupStart = 0;
var groupCount = 0;
// allow single and array values for "shapes" parameter
if ( Array.isArray( shapes ) === false ) {
addShape( shapes );
} else {
for ( var i = 0; i < shapes.length; i ++ ) {
addShape( shapes[ i ] );
this.addGroup( groupStart, groupCount, i ); // enables MultiMaterial support
groupStart += groupCount;
groupCount = 0;
}
}
// build geometry
this.setIndex( indices );
this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );
this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );
// helper functions
function addShape( shape ) {
var i, l, shapeHole;
var indexOffset = vertices.length / 3;
var points = shape.extractPoints( curveSegments );
var shapeVertices = points.shape;
var shapeHoles = points.holes;
// check direction of vertices
if ( ShapeUtils.isClockWise( shapeVertices ) === false ) {
shapeVertices = shapeVertices.reverse();
// also check if holes are in the opposite direction
for ( i = 0, l = shapeHoles.length; i < l; i ++ ) {
shapeHole = shapeHoles[ i ];
if ( ShapeUtils.isClockWise( shapeHole ) === true ) {
shapeHoles[ i ] = shapeHole.reverse();
}
}
}
var faces = ShapeUtils.triangulateShape( shapeVertices, shapeHoles );
// join vertices of inner and outer paths to a single array
for ( i = 0, l = shapeHoles.length; i < l; i ++ ) {
shapeHole = shapeHoles[ i ];
shapeVertices = shapeVertices.concat( shapeHole );
}
// vertices, normals, uvs
for ( i = 0, l = shapeVertices.length; i < l; i ++ ) {
var vertex = shapeVertices[ i ];
vertices.push( vertex.x, vertex.y, 0 );
normals.push( 0, 0, 1 );
uvs.push( vertex.x, vertex.y ); // world uvs
}
// incides
for ( i = 0, l = faces.length; i < l; i ++ ) {
var face = faces[ i ];
var a = face[ 0 ] + indexOffset;
var b = face[ 1 ] + indexOffset;
var c = face[ 2 ] + indexOffset;
indices.push( a, b, c );
groupCount += 3;
}
}
}
ShapeBufferGeometry.prototype = Object.create( BufferGeometry.prototype );
ShapeBufferGeometry.prototype.constructor = ShapeBufferGeometry;
ShapeBufferGeometry.prototype.toJSON = function () {
var data = BufferGeometry.prototype.toJSON.call( this );
var shapes = this.parameters.shapes;
return toJSON( shapes, data );
};
//
function toJSON( shapes, data ) {
data.shapes = [];
if ( Array.isArray( shapes ) ) {
for ( var i = 0, l = shapes.length; i < l; i ++ ) {
var shape = shapes[ i ];
data.shapes.push( shape.uuid );
}
} else {
data.shapes.push( shapes.uuid );
}
return data;
}
/**
* @author WestLangley / http://github.com/WestLangley
* @author Mugen87 / https://github.com/Mugen87
*/
function EdgesGeometry( geometry, thresholdAngle ) {
BufferGeometry.call( this );
this.type = 'EdgesGeometry';
this.parameters = {
thresholdAngle: thresholdAngle
};
thresholdAngle = ( thresholdAngle !== undefined ) ? thresholdAngle : 1;
// buffer
var vertices = [];
// helper variables
var thresholdDot = Math.cos( _Math.DEG2RAD * thresholdAngle );
var edge = [ 0, 0 ], edges = {}, edge1, edge2;
var key, keys = [ 'a', 'b', 'c' ];
// prepare source geometry
var geometry2;
if ( geometry.isBufferGeometry ) {
geometry2 = new Geometry();
geometry2.fromBufferGeometry( geometry );
} else {
geometry2 = geometry.clone();
}
geometry2.mergeVertices();
geometry2.computeFaceNormals();
var sourceVertices = geometry2.vertices;
var faces = geometry2.faces;
// now create a data structure where each entry represents an edge with its adjoining faces
for ( var i = 0, l = faces.length; i < l; i ++ ) {
var face = faces[ i ];
for ( var j = 0; j < 3; j ++ ) {
edge1 = face[ keys[ j ] ];
edge2 = face[ keys[ ( j + 1 ) % 3 ] ];
edge[ 0 ] = Math.min( edge1, edge2 );
edge[ 1 ] = Math.max( edge1, edge2 );
key = edge[ 0 ] + ',' + edge[ 1 ];
if ( edges[ key ] === undefined ) {
edges[ key ] = { index1: edge[ 0 ], index2: edge[ 1 ], face1: i, face2: undefined };
} else {
edges[ key ].face2 = i;
}
}
}
// generate vertices
for ( key in edges ) {
var e = edges[ key ];
// an edge is only rendered if the angle (in degrees) between the face normals of the adjoining faces exceeds this value. default = 1 degree.
if ( e.face2 === undefined || faces[ e.face1 ].normal.dot( faces[ e.face2 ].normal ) <= thresholdDot ) {
var vertex = sourceVertices[ e.index1 ];
vertices.push( vertex.x, vertex.y, vertex.z );
vertex = sourceVertices[ e.index2 ];
vertices.push( vertex.x, vertex.y, vertex.z );
}
}
// build geometry
this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
}
EdgesGeometry.prototype = Object.create( BufferGeometry.prototype );
EdgesGeometry.prototype.constructor = EdgesGeometry;
/**
* @author mrdoob / http://mrdoob.com/
* @author Mugen87 / https://github.com/Mugen87
*/
// CylinderGeometry
function CylinderGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) {
Geometry.call( this );
this.type = 'CylinderGeometry';
this.parameters = {
radiusTop: radiusTop,
radiusBottom: radiusBottom,
height: height,
radialSegments: radialSegments,
heightSegments: heightSegments,
openEnded: openEnded,
thetaStart: thetaStart,
thetaLength: thetaLength
};
this.fromBufferGeometry( new CylinderBufferGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) );
this.mergeVertices();
}
CylinderGeometry.prototype = Object.create( Geometry.prototype );
CylinderGeometry.prototype.constructor = CylinderGeometry;
// CylinderBufferGeometry
function CylinderBufferGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) {
BufferGeometry.call( this );
this.type = 'CylinderBufferGeometry';
this.parameters = {
radiusTop: radiusTop,
radiusBottom: radiusBottom,
height: height,
radialSegments: radialSegments,
heightSegments: heightSegments,
openEnded: openEnded,
thetaStart: thetaStart,
thetaLength: thetaLength
};
var scope = this;
radiusTop = radiusTop !== undefined ? radiusTop : 1;
radiusBottom = radiusBottom !== undefined ? radiusBottom : 1;
height = height || 1;
radialSegments = Math.floor( radialSegments ) || 8;
heightSegments = Math.floor( heightSegments ) || 1;
openEnded = openEnded !== undefined ? openEnded : false;
thetaStart = thetaStart !== undefined ? thetaStart : 0.0;
thetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2;
// buffers
var indices = [];
var vertices = [];
var normals = [];
var uvs = [];
// helper variables
var index = 0;
var indexArray = [];
var halfHeight = height / 2;
var groupStart = 0;
// generate geometry
generateTorso();
if ( openEnded === false ) {
if ( radiusTop > 0 ) generateCap( true );
if ( radiusBottom > 0 ) generateCap( false );
}
// build geometry
this.setIndex( indices );
this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );
this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );
function generateTorso() {
var x, y;
var normal = new Vector3();
var vertex = new Vector3();
var groupCount = 0;
// this will be used to calculate the normal
var slope = ( radiusBottom - radiusTop ) / height;
// generate vertices, normals and uvs
for ( y = 0; y <= heightSegments; y ++ ) {
var indexRow = [];
var v = y / heightSegments;
// calculate the radius of the current row
var radius = v * ( radiusBottom - radiusTop ) + radiusTop;
for ( x = 0; x <= radialSegments; x ++ ) {
var u = x / radialSegments;
var theta = u * thetaLength + thetaStart;
var sinTheta = Math.sin( theta );
var cosTheta = Math.cos( theta );
// vertex
vertex.x = radius * sinTheta;
vertex.y = - v * height + halfHeight;
vertex.z = radius * cosTheta;
vertices.push( vertex.x, vertex.y, vertex.z );
// normal
normal.set( sinTheta, slope, cosTheta ).normalize();
normals.push( normal.x, normal.y, normal.z );
// uv
uvs.push( u, 1 - v );
// save index of vertex in respective row
indexRow.push( index ++ );
}
// now save vertices of the row in our index array
indexArray.push( indexRow );
}
// generate indices
for ( x = 0; x < radialSegments; x ++ ) {
for ( y = 0; y < heightSegments; y ++ ) {
// we use the index array to access the correct indices
var a = indexArray[ y ][ x ];
var b = indexArray[ y + 1 ][ x ];
var c = indexArray[ y + 1 ][ x + 1 ];
var d = indexArray[ y ][ x + 1 ];
// faces
indices.push( a, b, d );
indices.push( b, c, d );
// update group counter
groupCount += 6;
}
}
// add a group to the geometry. this will ensure multi material support
scope.addGroup( groupStart, groupCount, 0 );
// calculate new start value for groups
groupStart += groupCount;
}
function generateCap( top ) {
var x, centerIndexStart, centerIndexEnd;
var uv = new Vector2();
var vertex = new Vector3();
var groupCount = 0;
var radius = ( top === true ) ? radiusTop : radiusBottom;
var sign = ( top === true ) ? 1 : - 1;
// save the index of the first center vertex
centerIndexStart = index;
// first we generate the center vertex data of the cap.
// because the geometry needs one set of uvs per face,
// we must generate a center vertex per face/segment
for ( x = 1; x <= radialSegments; x ++ ) {
// vertex
vertices.push( 0, halfHeight * sign, 0 );
// normal
normals.push( 0, sign, 0 );
// uv
uvs.push( 0.5, 0.5 );
// increase index
index ++;
}
// save the index of the last center vertex
centerIndexEnd = index;
// now we generate the surrounding vertices, normals and uvs
for ( x = 0; x <= radialSegments; x ++ ) {
var u = x / radialSegments;
var theta = u * thetaLength + thetaStart;
var cosTheta = Math.cos( theta );
var sinTheta = Math.sin( theta );
// vertex
vertex.x = radius * sinTheta;
vertex.y = halfHeight * sign;
vertex.z = radius * cosTheta;
vertices.push( vertex.x, vertex.y, vertex.z );
// normal
normals.push( 0, sign, 0 );
// uv
uv.x = ( cosTheta * 0.5 ) + 0.5;
uv.y = ( sinTheta * 0.5 * sign ) + 0.5;
uvs.push( uv.x, uv.y );
// increase index
index ++;
}
// generate indices
for ( x = 0; x < radialSegments; x ++ ) {
var c = centerIndexStart + x;
var i = centerIndexEnd + x;
if ( top === true ) {
// face top
indices.push( i, i + 1, c );
} else {
// face bottom
indices.push( i + 1, i, c );
}
groupCount += 3;
}
// add a group to the geometry. this will ensure multi material support
scope.addGroup( groupStart, groupCount, top === true ? 1 : 2 );
// calculate new start value for groups
groupStart += groupCount;
}
}
CylinderBufferGeometry.prototype = Object.create( BufferGeometry.prototype );
CylinderBufferGeometry.prototype.constructor = CylinderBufferGeometry;
/**
* @author abelnation / http://github.com/abelnation
*/
// ConeGeometry
function ConeGeometry( radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) {
CylinderGeometry.call( this, 0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength );
this.type = 'ConeGeometry';
this.parameters = {
radius: radius,
height: height,
radialSegments: radialSegments,
heightSegments: heightSegments,
openEnded: openEnded,
thetaStart: thetaStart,
thetaLength: thetaLength
};
}
ConeGeometry.prototype = Object.create( CylinderGeometry.prototype );
ConeGeometry.prototype.constructor = ConeGeometry;
// ConeBufferGeometry
function ConeBufferGeometry( radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) {
CylinderBufferGeometry.call( this, 0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength );
this.type = 'ConeBufferGeometry';
this.parameters = {
radius: radius,
height: height,
radialSegments: radialSegments,
heightSegments: heightSegments,
openEnded: openEnded,
thetaStart: thetaStart,
thetaLength: thetaLength
};
}
ConeBufferGeometry.prototype = Object.create( CylinderBufferGeometry.prototype );
ConeBufferGeometry.prototype.constructor = ConeBufferGeometry;
/**
* @author benaadams / https://twitter.com/ben_a_adams
* @author Mugen87 / https://github.com/Mugen87
* @author hughes
*/
// CircleGeometry
function CircleGeometry( radius, segments, thetaStart, thetaLength ) {
Geometry.call( this );
this.type = 'CircleGeometry';
this.parameters = {
radius: radius,
segments: segments,
thetaStart: thetaStart,
thetaLength: thetaLength
};
this.fromBufferGeometry( new CircleBufferGeometry( radius, segments, thetaStart, thetaLength ) );
this.mergeVertices();
}
CircleGeometry.prototype = Object.create( Geometry.prototype );
CircleGeometry.prototype.constructor = CircleGeometry;
// CircleBufferGeometry
function CircleBufferGeometry( radius, segments, thetaStart, thetaLength ) {
BufferGeometry.call( this );
this.type = 'CircleBufferGeometry';
this.parameters = {
radius: radius,
segments: segments,
thetaStart: thetaStart,
thetaLength: thetaLength
};
radius = radius || 1;
segments = segments !== undefined ? Math.max( 3, segments ) : 8;
thetaStart = thetaStart !== undefined ? thetaStart : 0;
thetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2;
// buffers
var indices = [];
var vertices = [];
var normals = [];
var uvs = [];
// helper variables
var i, s;
var vertex = new Vector3();
var uv = new Vector2();
// center point
vertices.push( 0, 0, 0 );
normals.push( 0, 0, 1 );
uvs.push( 0.5, 0.5 );
for ( s = 0, i = 3; s <= segments; s ++, i += 3 ) {
var segment = thetaStart + s / segments * thetaLength;
// vertex
vertex.x = radius * Math.cos( segment );
vertex.y = radius * Math.sin( segment );
vertices.push( vertex.x, vertex.y, vertex.z );
// normal
normals.push( 0, 0, 1 );
// uvs
uv.x = ( vertices[ i ] / radius + 1 ) / 2;
uv.y = ( vertices[ i + 1 ] / radius + 1 ) / 2;
uvs.push( uv.x, uv.y );
}
// indices
for ( i = 1; i <= segments; i ++ ) {
indices.push( i, i + 1, 0 );
}
// build geometry
this.setIndex( indices );
this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );
this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );
}
CircleBufferGeometry.prototype = Object.create( BufferGeometry.prototype );
CircleBufferGeometry.prototype.constructor = CircleBufferGeometry;
var Geometries = Object.freeze({
WireframeGeometry: WireframeGeometry,
ParametricGeometry: ParametricGeometry,
ParametricBufferGeometry: ParametricBufferGeometry,
TetrahedronGeometry: TetrahedronGeometry,
TetrahedronBufferGeometry: TetrahedronBufferGeometry,
OctahedronGeometry: OctahedronGeometry,
OctahedronBufferGeometry: OctahedronBufferGeometry,
IcosahedronGeometry: IcosahedronGeometry,
IcosahedronBufferGeometry: IcosahedronBufferGeometry,
DodecahedronGeometry: DodecahedronGeometry,
DodecahedronBufferGeometry: DodecahedronBufferGeometry,
PolyhedronGeometry: PolyhedronGeometry,
PolyhedronBufferGeometry: PolyhedronBufferGeometry,
TubeGeometry: TubeGeometry,
TubeBufferGeometry: TubeBufferGeometry,
TorusKnotGeometry: TorusKnotGeometry,
TorusKnotBufferGeometry: TorusKnotBufferGeometry,
TorusGeometry: TorusGeometry,
TorusBufferGeometry: TorusBufferGeometry,
TextGeometry: TextGeometry,
TextBufferGeometry: TextBufferGeometry,
SphereGeometry: SphereGeometry,
SphereBufferGeometry: SphereBufferGeometry,
RingGeometry: RingGeometry,
RingBufferGeometry: RingBufferGeometry,
PlaneGeometry: PlaneGeometry,
PlaneBufferGeometry: PlaneBufferGeometry,
LatheGeometry: LatheGeometry,
LatheBufferGeometry: LatheBufferGeometry,
ShapeGeometry: ShapeGeometry,
ShapeBufferGeometry: ShapeBufferGeometry,
ExtrudeGeometry: ExtrudeGeometry,
ExtrudeBufferGeometry: ExtrudeBufferGeometry,
EdgesGeometry: EdgesGeometry,
ConeGeometry: ConeGeometry,
ConeBufferGeometry: ConeBufferGeometry,
CylinderGeometry: CylinderGeometry,
CylinderBufferGeometry: CylinderBufferGeometry,
CircleGeometry: CircleGeometry,
CircleBufferGeometry: CircleBufferGeometry,
BoxGeometry: BoxGeometry,
BoxBufferGeometry: BoxBufferGeometry
});
/**
* @author mrdoob / http://mrdoob.com/
*
* parameters = {
* color: <THREE.Color>
* }
*/
function ShadowMaterial( parameters ) {
Material.call( this );
this.type = 'ShadowMaterial';
this.color = new Color( 0x000000 );
this.transparent = true;
this.setValues( parameters );
}
ShadowMaterial.prototype = Object.create( Material.prototype );
ShadowMaterial.prototype.constructor = ShadowMaterial;
ShadowMaterial.prototype.isShadowMaterial = true;
ShadowMaterial.prototype.copy = function ( source ) {
Material.prototype.copy.call( this, source );
this.color.copy( source.color );
return this;
};
/**
* @author mrdoob / http://mrdoob.com/
*/
function RawShaderMaterial( parameters ) {
ShaderMaterial.call( this, parameters );
this.type = 'RawShaderMaterial';
}
RawShaderMaterial.prototype = Object.create( ShaderMaterial.prototype );
RawShaderMaterial.prototype.constructor = RawShaderMaterial;
RawShaderMaterial.prototype.isRawShaderMaterial = true;
/**
* @author WestLangley / http://github.com/WestLangley
*
* parameters = {
* color: <hex>,
* roughness: <float>,
* metalness: <float>,
* opacity: <float>,
*
* map: new THREE.Texture( <Image> ),
*
* lightMap: new THREE.Texture( <Image> ),
* lightMapIntensity: <float>
*
* aoMap: new THREE.Texture( <Image> ),
* aoMapIntensity: <float>
*
* emissive: <hex>,
* emissiveIntensity: <float>
* emissiveMap: new THREE.Texture( <Image> ),
*
* bumpMap: new THREE.Texture( <Image> ),
* bumpScale: <float>,
*
* normalMap: new THREE.Texture( <Image> ),
* normalScale: <Vector2>,
*
* displacementMap: new THREE.Texture( <Image> ),
* displacementScale: <float>,
* displacementBias: <float>,
*
* roughnessMap: new THREE.Texture( <Image> ),
*
* metalnessMap: new THREE.Texture( <Image> ),
*
* alphaMap: new THREE.Texture( <Image> ),
*
* envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ),
* envMapIntensity: <float>
*
* refractionRatio: <float>,
*
* wireframe: <boolean>,
* wireframeLinewidth: <float>,
*
* skinning: <bool>,
* morphTargets: <bool>,
* morphNormals: <bool>
* }
*/
function MeshStandardMaterial( parameters ) {
Material.call( this );
this.defines = { 'STANDARD': '' };
this.type = 'MeshStandardMaterial';
this.color = new Color( 0xffffff ); // diffuse
this.roughness = 0.5;
this.metalness = 0.5;
this.map = null;
this.lightMap = null;
this.lightMapIntensity = 1.0;
this.aoMap = null;
this.aoMapIntensity = 1.0;
this.emissive = new Color( 0x000000 );
this.emissiveIntensity = 1.0;
this.emissiveMap = null;
this.bumpMap = null;
this.bumpScale = 1;
this.normalMap = null;
this.normalScale = new Vector2( 1, 1 );
this.displacementMap = null;
this.displacementScale = 1;
this.displacementBias = 0;
this.roughnessMap = null;
this.metalnessMap = null;
this.alphaMap = null;
this.envMap = null;
this.envMapIntensity = 1.0;
this.refractionRatio = 0.98;
this.wireframe = false;
this.wireframeLinewidth = 1;
this.wireframeLinecap = 'round';
this.wireframeLinejoin = 'round';
this.skinning = false;
this.morphTargets = false;
this.morphNormals = false;
this.setValues( parameters );
}
MeshStandardMaterial.prototype = Object.create( Material.prototype );
MeshStandardMaterial.prototype.constructor = MeshStandardMaterial;
MeshStandardMaterial.prototype.isMeshStandardMaterial = true;
MeshStandardMaterial.prototype.copy = function ( source ) {
Material.prototype.copy.call( this, source );
this.defines = { 'STANDARD': '' };
this.color.copy( source.color );
this.roughness = source.roughness;
this.metalness = source.metalness;
this.map = source.map;
this.lightMap = source.lightMap;
this.lightMapIntensity = source.lightMapIntensity;
this.aoMap = source.aoMap;
this.aoMapIntensity = source.aoMapIntensity;
this.emissive.copy( source.emissive );
this.emissiveMap = source.emissiveMap;
this.emissiveIntensity = source.emissiveIntensity;
this.bumpMap = source.bumpMap;
this.bumpScale = source.bumpScale;
this.normalMap = source.normalMap;
this.normalScale.copy( source.normalScale );
this.displacementMap = source.displacementMap;
this.displacementScale = source.displacementScale;
this.displacementBias = source.displacementBias;
this.roughnessMap = source.roughnessMap;
this.metalnessMap = source.metalnessMap;
this.alphaMap = source.alphaMap;
this.envMap = source.envMap;
this.envMapIntensity = source.envMapIntensity;
this.refractionRatio = source.refractionRatio;
this.wireframe = source.wireframe;
this.wireframeLinewidth = source.wireframeLinewidth;
this.wireframeLinecap = source.wireframeLinecap;
this.wireframeLinejoin = source.wireframeLinejoin;
this.skinning = source.skinning;
this.morphTargets = source.morphTargets;
this.morphNormals = source.morphNormals;
return this;
};
/**
* @author WestLangley / http://github.com/WestLangley
*
* parameters = {
* reflectivity: <float>
* }
*/
function MeshPhysicalMaterial( parameters ) {
MeshStandardMaterial.call( this );
this.defines = { 'PHYSICAL': '' };
this.type = 'MeshPhysicalMaterial';
this.reflectivity = 0.5; // maps to F0 = 0.04
this.clearCoat = 0.0;
this.clearCoatRoughness = 0.0;
this.setValues( parameters );
}
MeshPhysicalMaterial.prototype = Object.create( MeshStandardMaterial.prototype );
MeshPhysicalMaterial.prototype.constructor = MeshPhysicalMaterial;
MeshPhysicalMaterial.prototype.isMeshPhysicalMaterial = true;
MeshPhysicalMaterial.prototype.copy = function ( source ) {
MeshStandardMaterial.prototype.copy.call( this, source );
this.defines = { 'PHYSICAL': '' };
this.reflectivity = source.reflectivity;
this.clearCoat = source.clearCoat;
this.clearCoatRoughness = source.clearCoatRoughness;
return this;
};
/**
* @author mrdoob / http://mrdoob.com/
* @author alteredq / http://alteredqualia.com/
*
* parameters = {
* color: <hex>,
* specular: <hex>,
* shininess: <float>,
* opacity: <float>,
*
* map: new THREE.Texture( <Image> ),
*
* lightMap: new THREE.Texture( <Image> ),
* lightMapIntensity: <float>
*
* aoMap: new THREE.Texture( <Image> ),
* aoMapIntensity: <float>
*
* emissive: <hex>,
* emissiveIntensity: <float>
* emissiveMap: new THREE.Texture( <Image> ),
*
* bumpMap: new THREE.Texture( <Image> ),
* bumpScale: <float>,
*
* normalMap: new THREE.Texture( <Image> ),
* normalScale: <Vector2>,
*
* displacementMap: new THREE.Texture( <Image> ),
* displacementScale: <float>,
* displacementBias: <float>,
*
* specularMap: new THREE.Texture( <Image> ),
*
* alphaMap: new THREE.Texture( <Image> ),
*
* envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ),
* combine: THREE.Multiply,
* reflectivity: <float>,
* refractionRatio: <float>,
*
* wireframe: <boolean>,
* wireframeLinewidth: <float>,
*
* skinning: <bool>,
* morphTargets: <bool>,
* morphNormals: <bool>
* }
*/
function MeshPhongMaterial( parameters ) {
Material.call( this );
this.type = 'MeshPhongMaterial';
this.color = new Color( 0xffffff ); // diffuse
this.specular = new Color( 0x111111 );
this.shininess = 30;
this.map = null;
this.lightMap = null;
this.lightMapIntensity = 1.0;
this.aoMap = null;
this.aoMapIntensity = 1.0;
this.emissive = new Color( 0x000000 );
this.emissiveIntensity = 1.0;
this.emissiveMap = null;
this.bumpMap = null;
this.bumpScale = 1;
this.normalMap = null;
this.normalScale = new Vector2( 1, 1 );
this.displacementMap = null;
this.displacementScale = 1;
this.displacementBias = 0;
this.specularMap = null;
this.alphaMap = null;
this.envMap = null;
this.combine = MultiplyOperation;
this.reflectivity = 1;
this.refractionRatio = 0.98;
this.wireframe = false;
this.wireframeLinewidth = 1;
this.wireframeLinecap = 'round';
this.wireframeLinejoin = 'round';
this.skinning = false;
this.morphTargets = false;
this.morphNormals = false;
this.setValues( parameters );
}
MeshPhongMaterial.prototype = Object.create( Material.prototype );
MeshPhongMaterial.prototype.constructor = MeshPhongMaterial;
MeshPhongMaterial.prototype.isMeshPhongMaterial = true;
MeshPhongMaterial.prototype.copy = function ( source ) {
Material.prototype.copy.call( this, source );
this.color.copy( source.color );
this.specular.copy( source.specular );
this.shininess = source.shininess;
this.map = source.map;
this.lightMap = source.lightMap;
this.lightMapIntensity = source.lightMapIntensity;
this.aoMap = source.aoMap;
this.aoMapIntensity = source.aoMapIntensity;
this.emissive.copy( source.emissive );
this.emissiveMap = source.emissiveMap;
this.emissiveIntensity = source.emissiveIntensity;
this.bumpMap = source.bumpMap;
this.bumpScale = source.bumpScale;
this.normalMap = source.normalMap;
this.normalScale.copy( source.normalScale );
this.displacementMap = source.displacementMap;
this.displacementScale = source.displacementScale;
this.displacementBias = source.displacementBias;
this.specularMap = source.specularMap;
this.alphaMap = source.alphaMap;
this.envMap = source.envMap;
this.combine = source.combine;
this.reflectivity = source.reflectivity;
this.refractionRatio = source.refractionRatio;
this.wireframe = source.wireframe;
this.wireframeLinewidth = source.wireframeLinewidth;
this.wireframeLinecap = source.wireframeLinecap;
this.wireframeLinejoin = source.wireframeLinejoin;
this.skinning = source.skinning;
this.morphTargets = source.morphTargets;
this.morphNormals = source.morphNormals;
return this;
};
/**
* @author takahirox / http://github.com/takahirox
*
* parameters = {
* gradientMap: new THREE.Texture( <Image> )
* }
*/
function MeshToonMaterial( parameters ) {
MeshPhongMaterial.call( this );
this.defines = { 'TOON': '' };
this.type = 'MeshToonMaterial';
this.gradientMap = null;
this.setValues( parameters );
}
MeshToonMaterial.prototype = Object.create( MeshPhongMaterial.prototype );
MeshToonMaterial.prototype.constructor = MeshToonMaterial;
MeshToonMaterial.prototype.isMeshToonMaterial = true;
MeshToonMaterial.prototype.copy = function ( source ) {
MeshPhongMaterial.prototype.copy.call( this, source );
this.gradientMap = source.gradientMap;
return this;
};
/**
* @author mrdoob / http://mrdoob.com/
* @author WestLangley / http://github.com/WestLangley
*
* parameters = {
* opacity: <float>,
*
* bumpMap: new THREE.Texture( <Image> ),
* bumpScale: <float>,
*
* normalMap: new THREE.Texture( <Image> ),
* normalScale: <Vector2>,
*
* displacementMap: new THREE.Texture( <Image> ),
* displacementScale: <float>,
* displacementBias: <float>,
*
* wireframe: <boolean>,
* wireframeLinewidth: <float>
*
* skinning: <bool>,
* morphTargets: <bool>,
* morphNormals: <bool>
* }
*/
function MeshNormalMaterial( parameters ) {
Material.call( this );
this.type = 'MeshNormalMaterial';
this.bumpMap = null;
this.bumpScale = 1;
this.normalMap = null;
this.normalScale = new Vector2( 1, 1 );
this.displacementMap = null;
this.displacementScale = 1;
this.displacementBias = 0;
this.wireframe = false;
this.wireframeLinewidth = 1;
this.fog = false;
this.lights = false;
this.skinning = false;
this.morphTargets = false;
this.morphNormals = false;
this.setValues( parameters );
}
MeshNormalMaterial.prototype = Object.create( Material.prototype );
MeshNormalMaterial.prototype.constructor = MeshNormalMaterial;
MeshNormalMaterial.prototype.isMeshNormalMaterial = true;
MeshNormalMaterial.prototype.copy = function ( source ) {
Material.prototype.copy.call( this, source );
this.bumpMap = source.bumpMap;
this.bumpScale = source.bumpScale;
this.normalMap = source.normalMap;
this.normalScale.copy( source.normalScale );
this.displacementMap = source.displacementMap;
this.displacementScale = source.displacementScale;
this.displacementBias = source.displacementBias;
this.wireframe = source.wireframe;
this.wireframeLinewidth = source.wireframeLinewidth;
this.skinning = source.skinning;
this.morphTargets = source.morphTargets;
this.morphNormals = source.morphNormals;
return this;
};
/**
* @author mrdoob / http://mrdoob.com/
* @author alteredq / http://alteredqualia.com/
*
* parameters = {
* color: <hex>,
* opacity: <float>,
*
* map: new THREE.Texture( <Image> ),
*
* lightMap: new THREE.Texture( <Image> ),
* lightMapIntensity: <float>
*
* aoMap: new THREE.Texture( <Image> ),
* aoMapIntensity: <float>
*
* emissive: <hex>,
* emissiveIntensity: <float>
* emissiveMap: new THREE.Texture( <Image> ),
*
* specularMap: new THREE.Texture( <Image> ),
*
* alphaMap: new THREE.Texture( <Image> ),
*
* envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ),
* combine: THREE.Multiply,
* reflectivity: <float>,
* refractionRatio: <float>,
*
* wireframe: <boolean>,
* wireframeLinewidth: <float>,
*
* skinning: <bool>,
* morphTargets: <bool>,
* morphNormals: <bool>
* }
*/
function MeshLambertMaterial( parameters ) {
Material.call( this );
this.type = 'MeshLambertMaterial';
this.color = new Color( 0xffffff ); // diffuse
this.map = null;
this.lightMap = null;
this.lightMapIntensity = 1.0;
this.aoMap = null;
this.aoMapIntensity = 1.0;
this.emissive = new Color( 0x000000 );
this.emissiveIntensity = 1.0;
this.emissiveMap = null;
this.specularMap = null;
this.alphaMap = null;
this.envMap = null;
this.combine = MultiplyOperation;
this.reflectivity = 1;
this.refractionRatio = 0.98;
this.wireframe = false;
this.wireframeLinewidth = 1;
this.wireframeLinecap = 'round';
this.wireframeLinejoin = 'round';
this.skinning = false;
this.morphTargets = false;
this.morphNormals = false;
this.setValues( parameters );
}
MeshLambertMaterial.prototype = Object.create( Material.prototype );
MeshLambertMaterial.prototype.constructor = MeshLambertMaterial;
MeshLambertMaterial.prototype.isMeshLambertMaterial = true;
MeshLambertMaterial.prototype.copy = function ( source ) {
Material.prototype.copy.call( this, source );
this.color.copy( source.color );
this.map = source.map;
this.lightMap = source.lightMap;
this.lightMapIntensity = source.lightMapIntensity;
this.aoMap = source.aoMap;
this.aoMapIntensity = source.aoMapIntensity;
this.emissive.copy( source.emissive );
this.emissiveMap = source.emissiveMap;
this.emissiveIntensity = source.emissiveIntensity;
this.specularMap = source.specularMap;
this.alphaMap = source.alphaMap;
this.envMap = source.envMap;
this.combine = source.combine;
this.reflectivity = source.reflectivity;
this.refractionRatio = source.refractionRatio;
this.wireframe = source.wireframe;
this.wireframeLinewidth = source.wireframeLinewidth;
this.wireframeLinecap = source.wireframeLinecap;
this.wireframeLinejoin = source.wireframeLinejoin;
this.skinning = source.skinning;
this.morphTargets = source.morphTargets;
this.morphNormals = source.morphNormals;
return this;
};
/**
* @author alteredq / http://alteredqualia.com/
*
* parameters = {
* color: <hex>,
* opacity: <float>,
*
* linewidth: <float>,
*
* scale: <float>,
* dashSize: <float>,
* gapSize: <float>
* }
*/
function LineDashedMaterial( parameters ) {
LineBasicMaterial.call( this );
this.type = 'LineDashedMaterial';
this.scale = 1;
this.dashSize = 3;
this.gapSize = 1;
this.setValues( parameters );
}
LineDashedMaterial.prototype = Object.create( LineBasicMaterial.prototype );
LineDashedMaterial.prototype.constructor = LineDashedMaterial;
LineDashedMaterial.prototype.isLineDashedMaterial = true;
LineDashedMaterial.prototype.copy = function ( source ) {
LineBasicMaterial.prototype.copy.call( this, source );
this.scale = source.scale;
this.dashSize = source.dashSize;
this.gapSize = source.gapSize;
return this;
};
var Materials = Object.freeze({
ShadowMaterial: ShadowMaterial,
SpriteMaterial: SpriteMaterial,
RawShaderMaterial: RawShaderMaterial,
ShaderMaterial: ShaderMaterial,
PointsMaterial: PointsMaterial,
MeshPhysicalMaterial: MeshPhysicalMaterial,
MeshStandardMaterial: MeshStandardMaterial,
MeshPhongMaterial: MeshPhongMaterial,
MeshToonMaterial: MeshToonMaterial,
MeshNormalMaterial: MeshNormalMaterial,
MeshLambertMaterial: MeshLambertMaterial,
MeshDepthMaterial: MeshDepthMaterial,
MeshDistanceMaterial: MeshDistanceMaterial,
MeshBasicMaterial: MeshBasicMaterial,
LineDashedMaterial: LineDashedMaterial,
LineBasicMaterial: LineBasicMaterial,
Material: Material
});
/**
* @author mrdoob / http://mrdoob.com/
*/
var Cache = {
enabled: false,
files: {},
add: function ( key, file ) {
if ( this.enabled === false ) return;
// console.log( 'THREE.Cache', 'Adding key:', key );
this.files[ key ] = file;
},
get: function ( key ) {
if ( this.enabled === false ) return;
// console.log( 'THREE.Cache', 'Checking key:', key );
return this.files[ key ];
},
remove: function ( key ) {
delete this.files[ key ];
},
clear: function () {
this.files = {};
}
};
/**
* @author mrdoob / http://mrdoob.com/
*/
function LoadingManager( onLoad, onProgress, onError ) {
var scope = this;
var isLoading = false;
var itemsLoaded = 0;
var itemsTotal = 0;
var urlModifier = undefined;
this.onStart = undefined;
this.onLoad = onLoad;
this.onProgress = onProgress;
this.onError = onError;
this.itemStart = function ( url ) {
itemsTotal ++;
if ( isLoading === false ) {
if ( scope.onStart !== undefined ) {
scope.onStart( url, itemsLoaded, itemsTotal );
}
}
isLoading = true;
};
this.itemEnd = function ( url ) {
itemsLoaded ++;
if ( scope.onProgress !== undefined ) {
scope.onProgress( url, itemsLoaded, itemsTotal );
}
if ( itemsLoaded === itemsTotal ) {
isLoading = false;
if ( scope.onLoad !== undefined ) {
scope.onLoad();
}
}
};
this.itemError = function ( url ) {
if ( scope.onError !== undefined ) {
scope.onError( url );
}
};
this.resolveURL = function ( url ) {
if ( urlModifier ) {
return urlModifier( url );
}
return url;
};
this.setURLModifier = function ( transform ) {
urlModifier = transform;
return this;
};
}
var DefaultLoadingManager = new LoadingManager();
/**
* @author mrdoob / http://mrdoob.com/
*/
var loading = {};
function FileLoader( manager ) {
this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;
}
Object.assign( FileLoader.prototype, {
load: function ( url, onLoad, onProgress, onError ) {
if ( url === undefined ) url = '';
if ( this.path !== undefined ) url = this.path + url;
url = this.manager.resolveURL( url );
var scope = this;
var cached = Cache.get( url );
if ( cached !== undefined ) {
scope.manager.itemStart( url );
setTimeout( function () {
if ( onLoad ) onLoad( cached );
scope.manager.itemEnd( url );
}, 0 );
return cached;
}
// Check if request is duplicate
if ( loading[ url ] !== undefined ) {
loading[ url ].push( {
onLoad: onLoad,
onProgress: onProgress,
onError: onError
} );
return;
}
// Check for data: URI
var dataUriRegex = /^data:(.*?)(;base64)?,(.*)$/;
var dataUriRegexResult = url.match( dataUriRegex );
// Safari can not handle Data URIs through XMLHttpRequest so process manually
if ( dataUriRegexResult ) {
var mimeType = dataUriRegexResult[ 1 ];
var isBase64 = !! dataUriRegexResult[ 2 ];
var data = dataUriRegexResult[ 3 ];
data = window.decodeURIComponent( data );
if ( isBase64 ) data = window.atob( data );
try {
var response;
var responseType = ( this.responseType || '' ).toLowerCase();
switch ( responseType ) {
case 'arraybuffer':
case 'blob':
var view = new Uint8Array( data.length );
for ( var i = 0; i < data.length; i ++ ) {
view[ i ] = data.charCodeAt( i );
}
if ( responseType === 'blob' ) {
response = new Blob( [ view.buffer ], { type: mimeType } );
} else {
response = view.buffer;
}
break;
case 'document':
var parser = new DOMParser();
response = parser.parseFromString( data, mimeType );
break;
case 'json':
response = JSON.parse( data );
break;
default: // 'text' or other
response = data;
break;
}
// Wait for next browser tick like standard XMLHttpRequest event dispatching does
window.setTimeout( function () {
if ( onLoad ) onLoad( response );
scope.manager.itemEnd( url );
}, 0 );
} catch ( error ) {
// Wait for next browser tick like standard XMLHttpRequest event dispatching does
window.setTimeout( function () {
if ( onError ) onError( error );
scope.manager.itemEnd( url );
scope.manager.itemError( url );
}, 0 );
}
} else {
// Initialise array for duplicate requests
loading[ url ] = [];
loading[ url ].push( {
onLoad: onLoad,
onProgress: onProgress,
onError: onError
} );
var request = new XMLHttpRequest();
request.open( 'GET', url, true );
request.addEventListener( 'load', function ( event ) {
var response = this.response;
Cache.add( url, response );
var callbacks = loading[ url ];
delete loading[ url ];
if ( this.status === 200 ) {
for ( var i = 0, il = callbacks.length; i < il; i ++ ) {
var callback = callbacks[ i ];
if ( callback.onLoad ) callback.onLoad( response );
}
scope.manager.itemEnd( url );
} else if ( this.status === 0 ) {
// Some browsers return HTTP Status 0 when using non-http protocol
// e.g. 'file://' or 'data://'. Handle as success.
console.warn( 'THREE.FileLoader: HTTP Status 0 received.' );
for ( var i = 0, il = callbacks.length; i < il; i ++ ) {
var callback = callbacks[ i ];
if ( callback.onLoad ) callback.onLoad( response );
}
scope.manager.itemEnd( url );
} else {
for ( var i = 0, il = callbacks.length; i < il; i ++ ) {
var callback = callbacks[ i ];
if ( callback.onError ) callback.onError( event );
}
scope.manager.itemEnd( url );
scope.manager.itemError( url );
}
}, false );
request.addEventListener( 'progress', function ( event ) {
var callbacks = loading[ url ];
for ( var i = 0, il = callbacks.length; i < il; i ++ ) {
var callback = callbacks[ i ];
if ( callback.onProgress ) callback.onProgress( event );
}
}, false );
request.addEventListener( 'error', function ( event ) {
var callbacks = loading[ url ];
delete loading[ url ];
for ( var i = 0, il = callbacks.length; i < il; i ++ ) {
var callback = callbacks[ i ];
if ( callback.onError ) callback.onError( event );
}
scope.manager.itemEnd( url );
scope.manager.itemError( url );
}, false );
if ( this.responseType !== undefined ) request.responseType = this.responseType;
if ( this.withCredentials !== undefined ) request.withCredentials = this.withCredentials;
if ( request.overrideMimeType ) request.overrideMimeType( this.mimeType !== undefined ? this.mimeType : 'text/plain' );
for ( var header in this.requestHeader ) {
request.setRequestHeader( header, this.requestHeader[ header ] );
}
request.send( null );
}
scope.manager.itemStart( url );
return request;
},
setPath: function ( value ) {
this.path = value;
return this;
},
setResponseType: function ( value ) {
this.responseType = value;
return this;
},
setWithCredentials: function ( value ) {
this.withCredentials = value;
return this;
},
setMimeType: function ( value ) {
this.mimeType = value;
return this;
},
setRequestHeader: function ( value ) {
this.requestHeader = value;
return this;
}
} );
/**
* @author mrdoob / http://mrdoob.com/
*
* Abstract Base class to block based textures loader (dds, pvr, ...)
*/
function CompressedTextureLoader( manager ) {
this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;
// override in sub classes
this._parser = null;
}
Object.assign( CompressedTextureLoader.prototype, {
load: function ( url, onLoad, onProgress, onError ) {
var scope = this;
var images = [];
var texture = new CompressedTexture();
texture.image = images;
var loader = new FileLoader( this.manager );
loader.setPath( this.path );
loader.setResponseType( 'arraybuffer' );
function loadTexture( i ) {
loader.load( url[ i ], function ( buffer ) {
var texDatas = scope._parser( buffer, true );
images[ i ] = {
width: texDatas.width,
height: texDatas.height,
format: texDatas.format,
mipmaps: texDatas.mipmaps
};
loaded += 1;
if ( loaded === 6 ) {
if ( texDatas.mipmapCount === 1 )
texture.minFilter = LinearFilter;
texture.format = texDatas.format;
texture.needsUpdate = true;
if ( onLoad ) onLoad( texture );
}
}, onProgress, onError );
}
if ( Array.isArray( url ) ) {
var loaded = 0;
for ( var i = 0, il = url.length; i < il; ++ i ) {
loadTexture( i );
}
} else {
// compressed cubemap texture stored in a single DDS file
loader.load( url, function ( buffer ) {
var texDatas = scope._parser( buffer, true );
if ( texDatas.isCubemap ) {
var faces = texDatas.mipmaps.length / texDatas.mipmapCount;
for ( var f = 0; f < faces; f ++ ) {
images[ f ] = { mipmaps: [] };
for ( var i = 0; i < texDatas.mipmapCount; i ++ ) {
images[ f ].mipmaps.push( texDatas.mipmaps[ f * texDatas.mipmapCount + i ] );
images[ f ].format = texDatas.format;
images[ f ].width = texDatas.width;
images[ f ].height = texDatas.height;
}
}
} else {
texture.image.width = texDatas.width;
texture.image.height = texDatas.height;
texture.mipmaps = texDatas.mipmaps;
}
if ( texDatas.mipmapCount === 1 ) {
texture.minFilter = LinearFilter;
}
texture.format = texDatas.format;
texture.needsUpdate = true;
if ( onLoad ) onLoad( texture );
}, onProgress, onError );
}
return texture;
},
setPath: function ( value ) {
this.path = value;
return this;
}
} );
/**
* @author Nikos M. / https://github.com/foo123/
*
* Abstract Base class to load generic binary textures formats (rgbe, hdr, ...)
*/
function DataTextureLoader( manager ) {
this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;
// override in sub classes
this._parser = null;
}
Object.assign( DataTextureLoader.prototype, {
load: function ( url, onLoad, onProgress, onError ) {
var scope = this;
var texture = new DataTexture();
var loader = new FileLoader( this.manager );
loader.setResponseType( 'arraybuffer' );
loader.load( url, function ( buffer ) {
var texData = scope._parser( buffer );
if ( ! texData ) return;
if ( undefined !== texData.image ) {
texture.image = texData.image;
} else if ( undefined !== texData.data ) {
texture.image.width = texData.width;
texture.image.height = texData.height;
texture.image.data = texData.data;
}
texture.wrapS = undefined !== texData.wrapS ? texData.wrapS : ClampToEdgeWrapping;
texture.wrapT = undefined !== texData.wrapT ? texData.wrapT : ClampToEdgeWrapping;
texture.magFilter = undefined !== texData.magFilter ? texData.magFilter : LinearFilter;
texture.minFilter = undefined !== texData.minFilter ? texData.minFilter : LinearMipMapLinearFilter;
texture.anisotropy = undefined !== texData.anisotropy ? texData.anisotropy : 1;
if ( undefined !== texData.format ) {
texture.format = texData.format;
}
if ( undefined !== texData.type ) {
texture.type = texData.type;
}
if ( undefined !== texData.mipmaps ) {
texture.mipmaps = texData.mipmaps;
}
if ( 1 === texData.mipmapCount ) {
texture.minFilter = LinearFilter;
}
texture.needsUpdate = true;
if ( onLoad ) onLoad( texture, texData );
}, onProgress, onError );
return texture;
}
} );
/**
* @author mrdoob / http://mrdoob.com/
*/
function ImageLoader( manager ) {
this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;
}
Object.assign( ImageLoader.prototype, {
crossOrigin: 'Anonymous',
load: function ( url, onLoad, onProgress, onError ) {
if ( url === undefined ) url = '';
if ( this.path !== undefined ) url = this.path + url;
url = this.manager.resolveURL( url );
var scope = this;
var cached = Cache.get( url );
if ( cached !== undefined ) {
scope.manager.itemStart( url );
setTimeout( function () {
if ( onLoad ) onLoad( cached );
scope.manager.itemEnd( url );
}, 0 );
return cached;
}
var image = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'img' );
image.addEventListener( 'load', function () {
Cache.add( url, this );
if ( onLoad ) onLoad( this );
scope.manager.itemEnd( url );
}, false );
/*
image.addEventListener( 'progress', function ( event ) {
if ( onProgress ) onProgress( event );
}, false );
*/
image.addEventListener( 'error', function ( event ) {
if ( onError ) onError( event );
scope.manager.itemEnd( url );
scope.manager.itemError( url );
}, false );
if ( url.substr( 0, 5 ) !== 'data:' ) {
if ( this.crossOrigin !== undefined ) image.crossOrigin = this.crossOrigin;
}
scope.manager.itemStart( url );
image.src = url;
return image;
},
setCrossOrigin: function ( value ) {
this.crossOrigin = value;
return this;
},
setPath: function ( value ) {
this.path = value;
return this;
}
} );
/**
* @author mrdoob / http://mrdoob.com/
*/
function CubeTextureLoader( manager ) {
this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;
}
Object.assign( CubeTextureLoader.prototype, {
crossOrigin: 'Anonymous',
load: function ( urls, onLoad, onProgress, onError ) {
var texture = new CubeTexture();
var loader = new ImageLoader( this.manager );
loader.setCrossOrigin( this.crossOrigin );
loader.setPath( this.path );
var loaded = 0;
function loadTexture( i ) {
loader.load( urls[ i ], function ( image ) {
texture.images[ i ] = image;
loaded ++;
if ( loaded === 6 ) {
texture.needsUpdate = true;
if ( onLoad ) onLoad( texture );
}
}, undefined, onError );
}
for ( var i = 0; i < urls.length; ++ i ) {
loadTexture( i );
}
return texture;
},
setCrossOrigin: function ( value ) {
this.crossOrigin = value;
return this;
},
setPath: function ( value ) {
this.path = value;
return this;
}
} );
/**
* @author mrdoob / http://mrdoob.com/
*/
function TextureLoader( manager ) {
this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;
}
Object.assign( TextureLoader.prototype, {
crossOrigin: 'Anonymous',
load: function ( url, onLoad, onProgress, onError ) {
var texture = new Texture();
var loader = new ImageLoader( this.manager );
loader.setCrossOrigin( this.crossOrigin );
loader.setPath( this.path );
loader.load( url, function ( image ) {
texture.image = image;
// JPEGs can't have an alpha channel, so memory can be saved by storing them as RGB.
var isJPEG = url.search( /\.(jpg|jpeg)$/ ) > 0 || url.search( /^data\:image\/jpeg/ ) === 0;
texture.format = isJPEG ? RGBFormat : RGBAFormat;
texture.needsUpdate = true;
if ( onLoad !== undefined ) {
onLoad( texture );
}
}, onProgress, onError );
return texture;
},
setCrossOrigin: function ( value ) {
this.crossOrigin = value;
return this;
},
setPath: function ( value ) {
this.path = value;
return this;
}
} );
/**
* @author zz85 / http://www.lab4games.net/zz85/blog
* Extensible curve object
*
* Some common of curve methods:
* .getPoint( t, optionalTarget ), .getTangent( t )
* .getPointAt( u, optionalTarget ), .getTangentAt( u )
* .getPoints(), .getSpacedPoints()
* .getLength()
* .updateArcLengths()
*
* This following curves inherit from THREE.Curve:
*
* -- 2D curves --
* THREE.ArcCurve
* THREE.CubicBezierCurve
* THREE.EllipseCurve
* THREE.LineCurve
* THREE.QuadraticBezierCurve
* THREE.SplineCurve
*
* -- 3D curves --
* THREE.CatmullRomCurve3
* THREE.CubicBezierCurve3
* THREE.LineCurve3
* THREE.QuadraticBezierCurve3
*
* A series of curves can be represented as a THREE.CurvePath.
*
**/
/**************************************************************
* Abstract Curve base class
**************************************************************/
function Curve() {
this.type = 'Curve';
this.arcLengthDivisions = 200;
}
Object.assign( Curve.prototype, {
// Virtual base class method to overwrite and implement in subclasses
// - t [0 .. 1]
getPoint: function ( /* t, optionalTarget */ ) {
console.warn( 'THREE.Curve: .getPoint() not implemented.' );
return null;
},
// Get point at relative position in curve according to arc length
// - u [0 .. 1]
getPointAt: function ( u, optionalTarget ) {
var t = this.getUtoTmapping( u );
return this.getPoint( t, optionalTarget );
},
// Get sequence of points using getPoint( t )
getPoints: function ( divisions ) {
if ( divisions === undefined ) divisions = 5;
var points = [];
for ( var d = 0; d <= divisions; d ++ ) {
points.push( this.getPoint( d / divisions ) );
}
return points;
},
// Get sequence of points using getPointAt( u )
getSpacedPoints: function ( divisions ) {
if ( divisions === undefined ) divisions = 5;
var points = [];
for ( var d = 0; d <= divisions; d ++ ) {
points.push( this.getPointAt( d / divisions ) );
}
return points;
},
// Get total curve arc length
getLength: function () {
var lengths = this.getLengths();
return lengths[ lengths.length - 1 ];
},
// Get list of cumulative segment lengths
getLengths: function ( divisions ) {
if ( divisions === undefined ) divisions = this.arcLengthDivisions;
if ( this.cacheArcLengths &&
( this.cacheArcLengths.length === divisions + 1 ) &&
! this.needsUpdate ) {
return this.cacheArcLengths;
}
this.needsUpdate = false;
var cache = [];
var current, last = this.getPoint( 0 );
var p, sum = 0;
cache.push( 0 );
for ( p = 1; p <= divisions; p ++ ) {
current = this.getPoint( p / divisions );
sum += current.distanceTo( last );
cache.push( sum );
last = current;
}
this.cacheArcLengths = cache;
return cache; // { sums: cache, sum: sum }; Sum is in the last element.
},
updateArcLengths: function () {
this.needsUpdate = true;
this.getLengths();
},
// Given u ( 0 .. 1 ), get a t to find p. This gives you points which are equidistant
getUtoTmapping: function ( u, distance ) {
var arcLengths = this.getLengths();
var i = 0, il = arcLengths.length;
var targetArcLength; // The targeted u distance value to get
if ( distance ) {
targetArcLength = distance;
} else {
targetArcLength = u * arcLengths[ il - 1 ];
}
// binary search for the index with largest value smaller than target u distance
var low = 0, high = il - 1, comparison;
while ( low <= high ) {
i = Math.floor( low + ( high - low ) / 2 ); // less likely to overflow, though probably not issue here, JS doesn't really have integers, all numbers are floats
comparison = arcLengths[ i ] - targetArcLength;
if ( comparison < 0 ) {
low = i + 1;
} else if ( comparison > 0 ) {
high = i - 1;
} else {
high = i;
break;
// DONE
}
}
i = high;
if ( arcLengths[ i ] === targetArcLength ) {
return i / ( il - 1 );
}
// we could get finer grain at lengths, or use simple interpolation between two points
var lengthBefore = arcLengths[ i ];
var lengthAfter = arcLengths[ i + 1 ];
var segmentLength = lengthAfter - lengthBefore;
// determine where we are between the 'before' and 'after' points
var segmentFraction = ( targetArcLength - lengthBefore ) / segmentLength;
// add that fractional amount to t
var t = ( i + segmentFraction ) / ( il - 1 );
return t;
},
// Returns a unit vector tangent at t
// In case any sub curve does not implement its tangent derivation,
// 2 points a small delta apart will be used to find its gradient
// which seems to give a reasonable approximation
getTangent: function ( t ) {
var delta = 0.0001;
var t1 = t - delta;
var t2 = t + delta;
// Capping in case of danger
if ( t1 < 0 ) t1 = 0;
if ( t2 > 1 ) t2 = 1;
var pt1 = this.getPoint( t1 );
var pt2 = this.getPoint( t2 );
var vec = pt2.clone().sub( pt1 );
return vec.normalize();
},
getTangentAt: function ( u ) {
var t = this.getUtoTmapping( u );
return this.getTangent( t );
},
computeFrenetFrames: function ( segments, closed ) {
// see http://www.cs.indiana.edu/pub/techreports/TR425.pdf
var normal = new Vector3();
var tangents = [];
var normals = [];
var binormals = [];
var vec = new Vector3();
var mat = new Matrix4();
var i, u, theta;
// compute the tangent vectors for each segment on the curve
for ( i = 0; i <= segments; i ++ ) {
u = i / segments;
tangents[ i ] = this.getTangentAt( u );
tangents[ i ].normalize();
}
// select an initial normal vector perpendicular to the first tangent vector,
// and in the direction of the minimum tangent xyz component
normals[ 0 ] = new Vector3();
binormals[ 0 ] = new Vector3();
var min = Number.MAX_VALUE;
var tx = Math.abs( tangents[ 0 ].x );
var ty = Math.abs( tangents[ 0 ].y );
var tz = Math.abs( tangents[ 0 ].z );
if ( tx <= min ) {
min = tx;
normal.set( 1, 0, 0 );
}
if ( ty <= min ) {
min = ty;
normal.set( 0, 1, 0 );
}
if ( tz <= min ) {
normal.set( 0, 0, 1 );
}
vec.crossVectors( tangents[ 0 ], normal ).normalize();
normals[ 0 ].crossVectors( tangents[ 0 ], vec );
binormals[ 0 ].crossVectors( tangents[ 0 ], normals[ 0 ] );
// compute the slowly-varying normal and binormal vectors for each segment on the curve
for ( i = 1; i <= segments; i ++ ) {
normals[ i ] = normals[ i - 1 ].clone();
binormals[ i ] = binormals[ i - 1 ].clone();
vec.crossVectors( tangents[ i - 1 ], tangents[ i ] );
if ( vec.length() > Number.EPSILON ) {
vec.normalize();
theta = Math.acos( _Math.clamp( tangents[ i - 1 ].dot( tangents[ i ] ), - 1, 1 ) ); // clamp for floating pt errors
normals[ i ].applyMatrix4( mat.makeRotationAxis( vec, theta ) );
}
binormals[ i ].crossVectors( tangents[ i ], normals[ i ] );
}
// if the curve is closed, postprocess the vectors so the first and last normal vectors are the same
if ( closed === true ) {
theta = Math.acos( _Math.clamp( normals[ 0 ].dot( normals[ segments ] ), - 1, 1 ) );
theta /= segments;
if ( tangents[ 0 ].dot( vec.crossVectors( normals[ 0 ], normals[ segments ] ) ) > 0 ) {
theta = - theta;
}
for ( i = 1; i <= segments; i ++ ) {
// twist a little...
normals[ i ].applyMatrix4( mat.makeRotationAxis( tangents[ i ], theta * i ) );
binormals[ i ].crossVectors( tangents[ i ], normals[ i ] );
}
}
return {
tangents: tangents,
normals: normals,
binormals: binormals
};
},
clone: function () {
return new this.constructor().copy( this );
},
copy: function ( source ) {
this.arcLengthDivisions = source.arcLengthDivisions;
return this;
},
toJSON: function () {
var data = {
metadata: {
version: 4.5,
type: 'Curve',
generator: 'Curve.toJSON'
}
};
data.arcLengthDivisions = this.arcLengthDivisions;
data.type = this.type;
return data;
},
fromJSON: function ( json ) {
this.arcLengthDivisions = json.arcLengthDivisions;
return this;
}
} );
function EllipseCurve( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {
Curve.call( this );
this.type = 'EllipseCurve';
this.aX = aX || 0;
this.aY = aY || 0;
this.xRadius = xRadius || 1;
this.yRadius = yRadius || 1;
this.aStartAngle = aStartAngle || 0;
this.aEndAngle = aEndAngle || 2 * Math.PI;
this.aClockwise = aClockwise || false;
this.aRotation = aRotation || 0;
}
EllipseCurve.prototype = Object.create( Curve.prototype );
EllipseCurve.prototype.constructor = EllipseCurve;
EllipseCurve.prototype.isEllipseCurve = true;
EllipseCurve.prototype.getPoint = function ( t, optionalTarget ) {
var point = optionalTarget || new Vector2();
var twoPi = Math.PI * 2;
var deltaAngle = this.aEndAngle - this.aStartAngle;
var samePoints = Math.abs( deltaAngle ) < Number.EPSILON;
// ensures that deltaAngle is 0 .. 2 PI
while ( deltaAngle < 0 ) deltaAngle += twoPi;
while ( deltaAngle > twoPi ) deltaAngle -= twoPi;
if ( deltaAngle < Number.EPSILON ) {
if ( samePoints ) {
deltaAngle = 0;
} else {
deltaAngle = twoPi;
}
}
if ( this.aClockwise === true && ! samePoints ) {
if ( deltaAngle === twoPi ) {
deltaAngle = - twoPi;
} else {
deltaAngle = deltaAngle - twoPi;
}
}
var angle = this.aStartAngle + t * deltaAngle;
var x = this.aX + this.xRadius * Math.cos( angle );
var y = this.aY + this.yRadius * Math.sin( angle );
if ( this.aRotation !== 0 ) {
var cos = Math.cos( this.aRotation );
var sin = Math.sin( this.aRotation );
var tx = x - this.aX;
var ty = y - this.aY;
// Rotate the point about the center of the ellipse.
x = tx * cos - ty * sin + this.aX;
y = tx * sin + ty * cos + this.aY;
}
return point.set( x, y );
};
EllipseCurve.prototype.copy = function ( source ) {
Curve.prototype.copy.call( this, source );
this.aX = source.aX;
this.aY = source.aY;
this.xRadius = source.xRadius;
this.yRadius = source.yRadius;
this.aStartAngle = source.aStartAngle;
this.aEndAngle = source.aEndAngle;
this.aClockwise = source.aClockwise;
this.aRotation = source.aRotation;
return this;
};
EllipseCurve.prototype.toJSON = function () {
var data = Curve.prototype.toJSON.call( this );
data.aX = this.aX;
data.aY = this.aY;
data.xRadius = this.xRadius;
data.yRadius = this.yRadius;
data.aStartAngle = this.aStartAngle;
data.aEndAngle = this.aEndAngle;
data.aClockwise = this.aClockwise;
data.aRotation = this.aRotation;
return data;
};
EllipseCurve.prototype.fromJSON = function ( json ) {
Curve.prototype.fromJSON.call( this, json );
this.aX = json.aX;
this.aY = json.aY;
this.xRadius = json.xRadius;
this.yRadius = json.yRadius;
this.aStartAngle = json.aStartAngle;
this.aEndAngle = json.aEndAngle;
this.aClockwise = json.aClockwise;
this.aRotation = json.aRotation;
return this;
};
function ArcCurve( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {
EllipseCurve.call( this, aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise );
this.type = 'ArcCurve';
}
ArcCurve.prototype = Object.create( EllipseCurve.prototype );
ArcCurve.prototype.constructor = ArcCurve;
ArcCurve.prototype.isArcCurve = true;
/**
* @author zz85 https://github.com/zz85
*
* Centripetal CatmullRom Curve - which is useful for avoiding
* cusps and self-intersections in non-uniform catmull rom curves.
* http://www.cemyuksel.com/research/catmullrom_param/catmullrom.pdf
*
* curve.type accepts centripetal(default), chordal and catmullrom
* curve.tension is used for catmullrom which defaults to 0.5
*/
/*
Based on an optimized c++ solution in
- http://stackoverflow.com/questions/9489736/catmull-rom-curve-with-no-cusps-and-no-self-intersections/
- http://ideone.com/NoEbVM
This CubicPoly class could be used for reusing some variables and calculations,
but for three.js curve use, it could be possible inlined and flatten into a single function call
which can be placed in CurveUtils.
*/
function CubicPoly() {
var c0 = 0, c1 = 0, c2 = 0, c3 = 0;
/*
* Compute coefficients for a cubic polynomial
* p(s) = c0 + c1*s + c2*s^2 + c3*s^3
* such that
* p(0) = x0, p(1) = x1
* and
* p'(0) = t0, p'(1) = t1.
*/
function init( x0, x1, t0, t1 ) {
c0 = x0;
c1 = t0;
c2 = - 3 * x0 + 3 * x1 - 2 * t0 - t1;
c3 = 2 * x0 - 2 * x1 + t0 + t1;
}
return {
initCatmullRom: function ( x0, x1, x2, x3, tension ) {
init( x1, x2, tension * ( x2 - x0 ), tension * ( x3 - x1 ) );
},
initNonuniformCatmullRom: function ( x0, x1, x2, x3, dt0, dt1, dt2 ) {
// compute tangents when parameterized in [t1,t2]
var t1 = ( x1 - x0 ) / dt0 - ( x2 - x0 ) / ( dt0 + dt1 ) + ( x2 - x1 ) / dt1;
var t2 = ( x2 - x1 ) / dt1 - ( x3 - x1 ) / ( dt1 + dt2 ) + ( x3 - x2 ) / dt2;
// rescale tangents for parametrization in [0,1]
t1 *= dt1;
t2 *= dt1;
init( x1, x2, t1, t2 );
},
calc: function ( t ) {
var t2 = t * t;
var t3 = t2 * t;
return c0 + c1 * t + c2 * t2 + c3 * t3;
}
};
}
//
var tmp = new Vector3();
var px$1 = new CubicPoly();
var py = new CubicPoly();
var pz = new CubicPoly();
function CatmullRomCurve3( points, closed, curveType, tension ) {
Curve.call( this );
this.type = 'CatmullRomCurve3';
this.points = points || [];
this.closed = closed || false;
this.curveType = curveType || 'centripetal';
this.tension = tension || 0.5;
}
CatmullRomCurve3.prototype = Object.create( Curve.prototype );
CatmullRomCurve3.prototype.constructor = CatmullRomCurve3;
CatmullRomCurve3.prototype.isCatmullRomCurve3 = true;
CatmullRomCurve3.prototype.getPoint = function ( t, optionalTarget ) {
var point = optionalTarget || new Vector3();
var points = this.points;
var l = points.length;
var p = ( l - ( this.closed ? 0 : 1 ) ) * t;
var intPoint = Math.floor( p );
var weight = p - intPoint;
if ( this.closed ) {
intPoint += intPoint > 0 ? 0 : ( Math.floor( Math.abs( intPoint ) / l ) + 1 ) * l;
} else if ( weight === 0 && intPoint === l - 1 ) {
intPoint = l - 2;
weight = 1;
}
var p0, p1, p2, p3; // 4 points
if ( this.closed || intPoint > 0 ) {
p0 = points[ ( intPoint - 1 ) % l ];
} else {
// extrapolate first point
tmp.subVectors( points[ 0 ], points[ 1 ] ).add( points[ 0 ] );
p0 = tmp;
}
p1 = points[ intPoint % l ];
p2 = points[ ( intPoint + 1 ) % l ];
if ( this.closed || intPoint + 2 < l ) {
p3 = points[ ( intPoint + 2 ) % l ];
} else {
// extrapolate last point
tmp.subVectors( points[ l - 1 ], points[ l - 2 ] ).add( points[ l - 1 ] );
p3 = tmp;
}
if ( this.curveType === 'centripetal' || this.curveType === 'chordal' ) {
// init Centripetal / Chordal Catmull-Rom
var pow = this.curveType === 'chordal' ? 0.5 : 0.25;
var dt0 = Math.pow( p0.distanceToSquared( p1 ), pow );
var dt1 = Math.pow( p1.distanceToSquared( p2 ), pow );
var dt2 = Math.pow( p2.distanceToSquared( p3 ), pow );
// safety check for repeated points
if ( dt1 < 1e-4 ) dt1 = 1.0;
if ( dt0 < 1e-4 ) dt0 = dt1;
if ( dt2 < 1e-4 ) dt2 = dt1;
px$1.initNonuniformCatmullRom( p0.x, p1.x, p2.x, p3.x, dt0, dt1, dt2 );
py.initNonuniformCatmullRom( p0.y, p1.y, p2.y, p3.y, dt0, dt1, dt2 );
pz.initNonuniformCatmullRom( p0.z, p1.z, p2.z, p3.z, dt0, dt1, dt2 );
} else if ( this.curveType === 'catmullrom' ) {
px$1.initCatmullRom( p0.x, p1.x, p2.x, p3.x, this.tension );
py.initCatmullRom( p0.y, p1.y, p2.y, p3.y, this.tension );
pz.initCatmullRom( p0.z, p1.z, p2.z, p3.z, this.tension );
}
point.set(
px$1.calc( weight ),
py.calc( weight ),
pz.calc( weight )
);
return point;
};
CatmullRomCurve3.prototype.copy = function ( source ) {
Curve.prototype.copy.call( this, source );
this.points = [];
for ( var i = 0, l = source.points.length; i < l; i ++ ) {
var point = source.points[ i ];
this.points.push( point.clone() );
}
this.closed = source.closed;
this.curveType = source.curveType;
this.tension = source.tension;
return this;
};
CatmullRomCurve3.prototype.toJSON = function () {
var data = Curve.prototype.toJSON.call( this );
data.points = [];
for ( var i = 0, l = this.points.length; i < l; i ++ ) {
var point = this.points[ i ];
data.points.push( point.toArray() );
}
data.closed = this.closed;
data.curveType = this.curveType;
data.tension = this.tension;
return data;
};
CatmullRomCurve3.prototype.fromJSON = function ( json ) {
Curve.prototype.fromJSON.call( this, json );
this.points = [];
for ( var i = 0, l = json.points.length; i < l; i ++ ) {
var point = json.points[ i ];
this.points.push( new Vector3().fromArray( point ) );
}
this.closed = json.closed;
this.curveType = json.curveType;
this.tension = json.tension;
return this;
};
/**
* @author zz85 / http://www.lab4games.net/zz85/blog
*
* Bezier Curves formulas obtained from
* http://en.wikipedia.org/wiki/Bézier_curve
*/
function CatmullRom( t, p0, p1, p2, p3 ) {
var v0 = ( p2 - p0 ) * 0.5;
var v1 = ( p3 - p1 ) * 0.5;
var t2 = t * t;
var t3 = t * t2;
return ( 2 * p1 - 2 * p2 + v0 + v1 ) * t3 + ( - 3 * p1 + 3 * p2 - 2 * v0 - v1 ) * t2 + v0 * t + p1;
}
//
function QuadraticBezierP0( t, p ) {
var k = 1 - t;
return k * k * p;
}
function QuadraticBezierP1( t, p ) {
return 2 * ( 1 - t ) * t * p;
}
function QuadraticBezierP2( t, p ) {
return t * t * p;
}
function QuadraticBezier( t, p0, p1, p2 ) {
return QuadraticBezierP0( t, p0 ) + QuadraticBezierP1( t, p1 ) +
QuadraticBezierP2( t, p2 );
}
//
function CubicBezierP0( t, p ) {
var k = 1 - t;
return k * k * k * p;
}
function CubicBezierP1( t, p ) {
var k = 1 - t;
return 3 * k * k * t * p;
}
function CubicBezierP2( t, p ) {
return 3 * ( 1 - t ) * t * t * p;
}
function CubicBezierP3( t, p ) {
return t * t * t * p;
}
function CubicBezier( t, p0, p1, p2, p3 ) {
return CubicBezierP0( t, p0 ) + CubicBezierP1( t, p1 ) + CubicBezierP2( t, p2 ) +
CubicBezierP3( t, p3 );
}
function CubicBezierCurve( v0, v1, v2, v3 ) {
Curve.call( this );
this.type = 'CubicBezierCurve';
this.v0 = v0 || new Vector2();
this.v1 = v1 || new Vector2();
this.v2 = v2 || new Vector2();
this.v3 = v3 || new Vector2();
}
CubicBezierCurve.prototype = Object.create( Curve.prototype );
CubicBezierCurve.prototype.constructor = CubicBezierCurve;
CubicBezierCurve.prototype.isCubicBezierCurve = true;
CubicBezierCurve.prototype.getPoint = function ( t, optionalTarget ) {
var point = optionalTarget || new Vector2();
var v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3;
point.set(
CubicBezier( t, v0.x, v1.x, v2.x, v3.x ),
CubicBezier( t, v0.y, v1.y, v2.y, v3.y )
);
return point;
};
CubicBezierCurve.prototype.copy = function ( source ) {
Curve.prototype.copy.call( this, source );
this.v0.copy( source.v0 );
this.v1.copy( source.v1 );
this.v2.copy( source.v2 );
this.v3.copy( source.v3 );
return this;
};
CubicBezierCurve.prototype.toJSON = function () {
var data = Curve.prototype.toJSON.call( this );
data.v0 = this.v0.toArray();
data.v1 = this.v1.toArray();
data.v2 = this.v2.toArray();
data.v3 = this.v3.toArray();
return data;
};
CubicBezierCurve.prototype.fromJSON = function ( json ) {
Curve.prototype.fromJSON.call( this, json );
this.v0.fromArray( json.v0 );
this.v1.fromArray( json.v1 );
this.v2.fromArray( json.v2 );
this.v3.fromArray( json.v3 );
return this;
};
function CubicBezierCurve3( v0, v1, v2, v3 ) {
Curve.call( this );
this.type = 'CubicBezierCurve3';
this.v0 = v0 || new Vector3();
this.v1 = v1 || new Vector3();
this.v2 = v2 || new Vector3();
this.v3 = v3 || new Vector3();
}
CubicBezierCurve3.prototype = Object.create( Curve.prototype );
CubicBezierCurve3.prototype.constructor = CubicBezierCurve3;
CubicBezierCurve3.prototype.isCubicBezierCurve3 = true;
CubicBezierCurve3.prototype.getPoint = function ( t, optionalTarget ) {
var point = optionalTarget || new Vector3();
var v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3;
point.set(
CubicBezier( t, v0.x, v1.x, v2.x, v3.x ),
CubicBezier( t, v0.y, v1.y, v2.y, v3.y ),
CubicBezier( t, v0.z, v1.z, v2.z, v3.z )
);
return point;
};
CubicBezierCurve3.prototype.copy = function ( source ) {
Curve.prototype.copy.call( this, source );
this.v0.copy( source.v0 );
this.v1.copy( source.v1 );
this.v2.copy( source.v2 );
this.v3.copy( source.v3 );
return this;
};
CubicBezierCurve3.prototype.toJSON = function () {
var data = Curve.prototype.toJSON.call( this );
data.v0 = this.v0.toArray();
data.v1 = this.v1.toArray();
data.v2 = this.v2.toArray();
data.v3 = this.v3.toArray();
return data;
};
CubicBezierCurve3.prototype.fromJSON = function ( json ) {
Curve.prototype.fromJSON.call( this, json );
this.v0.fromArray( json.v0 );
this.v1.fromArray( json.v1 );
this.v2.fromArray( json.v2 );
this.v3.fromArray( json.v3 );
return this;
};
function LineCurve( v1, v2 ) {
Curve.call( this );
this.type = 'LineCurve';
this.v1 = v1 || new Vector2();
this.v2 = v2 || new Vector2();
}
LineCurve.prototype = Object.create( Curve.prototype );
LineCurve.prototype.constructor = LineCurve;
LineCurve.prototype.isLineCurve = true;
LineCurve.prototype.getPoint = function ( t, optionalTarget ) {
var point = optionalTarget || new Vector2();
if ( t === 1 ) {
point.copy( this.v2 );
} else {
point.copy( this.v2 ).sub( this.v1 );
point.multiplyScalar( t ).add( this.v1 );
}
return point;
};
// Line curve is linear, so we can overwrite default getPointAt
LineCurve.prototype.getPointAt = function ( u, optionalTarget ) {
return this.getPoint( u, optionalTarget );
};
LineCurve.prototype.getTangent = function ( /* t */ ) {
var tangent = this.v2.clone().sub( this.v1 );
return tangent.normalize();
};
LineCurve.prototype.copy = function ( source ) {
Curve.prototype.copy.call( this, source );
this.v1.copy( source.v1 );
this.v2.copy( source.v2 );
return this;
};
LineCurve.prototype.toJSON = function () {
var data = Curve.prototype.toJSON.call( this );
data.v1 = this.v1.toArray();
data.v2 = this.v2.toArray();
return data;
};
LineCurve.prototype.fromJSON = function ( json ) {
Curve.prototype.fromJSON.call( this, json );
this.v1.fromArray( json.v1 );
this.v2.fromArray( json.v2 );
return this;
};
function LineCurve3( v1, v2 ) {
Curve.call( this );
this.type = 'LineCurve3';
this.v1 = v1 || new Vector3();
this.v2 = v2 || new Vector3();
}
LineCurve3.prototype = Object.create( Curve.prototype );
LineCurve3.prototype.constructor = LineCurve3;
LineCurve3.prototype.isLineCurve3 = true;
LineCurve3.prototype.getPoint = function ( t, optionalTarget ) {
var point = optionalTarget || new Vector3();
if ( t === 1 ) {
point.copy( this.v2 );
} else {
point.copy( this.v2 ).sub( this.v1 );
point.multiplyScalar( t ).add( this.v1 );
}
return point;
};
// Line curve is linear, so we can overwrite default getPointAt
LineCurve3.prototype.getPointAt = function ( u, optionalTarget ) {
return this.getPoint( u, optionalTarget );
};
LineCurve3.prototype.copy = function ( source ) {
Curve.prototype.copy.call( this, source );
this.v1.copy( source.v1 );
this.v2.copy( source.v2 );
return this;
};
LineCurve3.prototype.toJSON = function () {
var data = Curve.prototype.toJSON.call( this );
data.v1 = this.v1.toArray();
data.v2 = this.v2.toArray();
return data;
};
LineCurve3.prototype.fromJSON = function ( json ) {
Curve.prototype.fromJSON.call( this, json );
this.v1.fromArray( json.v1 );
this.v2.fromArray( json.v2 );
return this;
};
function QuadraticBezierCurve( v0, v1, v2 ) {
Curve.call( this );
this.type = 'QuadraticBezierCurve';
this.v0 = v0 || new Vector2();
this.v1 = v1 || new Vector2();
this.v2 = v2 || new Vector2();
}
QuadraticBezierCurve.prototype = Object.create( Curve.prototype );
QuadraticBezierCurve.prototype.constructor = QuadraticBezierCurve;
QuadraticBezierCurve.prototype.isQuadraticBezierCurve = true;
QuadraticBezierCurve.prototype.getPoint = function ( t, optionalTarget ) {
var point = optionalTarget || new Vector2();
var v0 = this.v0, v1 = this.v1, v2 = this.v2;
point.set(
QuadraticBezier( t, v0.x, v1.x, v2.x ),
QuadraticBezier( t, v0.y, v1.y, v2.y )
);
return point;
};
QuadraticBezierCurve.prototype.copy = function ( source ) {
Curve.prototype.copy.call( this, source );
this.v0.copy( source.v0 );
this.v1.copy( source.v1 );
this.v2.copy( source.v2 );
return this;
};
QuadraticBezierCurve.prototype.toJSON = function () {
var data = Curve.prototype.toJSON.call( this );
data.v0 = this.v0.toArray();
data.v1 = this.v1.toArray();
data.v2 = this.v2.toArray();
return data;
};
QuadraticBezierCurve.prototype.fromJSON = function ( json ) {
Curve.prototype.fromJSON.call( this, json );
this.v0.fromArray( json.v0 );
this.v1.fromArray( json.v1 );
this.v2.fromArray( json.v2 );
return this;
};
function QuadraticBezierCurve3( v0, v1, v2 ) {
Curve.call( this );
this.type = 'QuadraticBezierCurve3';
this.v0 = v0 || new Vector3();
this.v1 = v1 || new Vector3();
this.v2 = v2 || new Vector3();
}
QuadraticBezierCurve3.prototype = Object.create( Curve.prototype );
QuadraticBezierCurve3.prototype.constructor = QuadraticBezierCurve3;
QuadraticBezierCurve3.prototype.isQuadraticBezierCurve3 = true;
QuadraticBezierCurve3.prototype.getPoint = function ( t, optionalTarget ) {
var point = optionalTarget || new Vector3();
var v0 = this.v0, v1 = this.v1, v2 = this.v2;
point.set(
QuadraticBezier( t, v0.x, v1.x, v2.x ),
QuadraticBezier( t, v0.y, v1.y, v2.y ),
QuadraticBezier( t, v0.z, v1.z, v2.z )
);
return point;
};
QuadraticBezierCurve3.prototype.copy = function ( source ) {
Curve.prototype.copy.call( this, source );
this.v0.copy( source.v0 );
this.v1.copy( source.v1 );
this.v2.copy( source.v2 );
return this;
};
QuadraticBezierCurve3.prototype.toJSON = function () {
var data = Curve.prototype.toJSON.call( this );
data.v0 = this.v0.toArray();
data.v1 = this.v1.toArray();
data.v2 = this.v2.toArray();
return data;
};
QuadraticBezierCurve3.prototype.fromJSON = function ( json ) {
Curve.prototype.fromJSON.call( this, json );
this.v0.fromArray( json.v0 );
this.v1.fromArray( json.v1 );
this.v2.fromArray( json.v2 );
return this;
};
function SplineCurve( points /* array of Vector2 */ ) {
Curve.call( this );
this.type = 'SplineCurve';
this.points = points || [];
}
SplineCurve.prototype = Object.create( Curve.prototype );
SplineCurve.prototype.constructor = SplineCurve;
SplineCurve.prototype.isSplineCurve = true;
SplineCurve.prototype.getPoint = function ( t, optionalTarget ) {
var point = optionalTarget || new Vector2();
var points = this.points;
var p = ( points.length - 1 ) * t;
var intPoint = Math.floor( p );
var weight = p - intPoint;
var p0 = points[ intPoint === 0 ? intPoint : intPoint - 1 ];
var p1 = points[ intPoint ];
var p2 = points[ intPoint > points.length - 2 ? points.length - 1 : intPoint + 1 ];
var p3 = points[ intPoint > points.length - 3 ? points.length - 1 : intPoint + 2 ];
point.set(
CatmullRom( weight, p0.x, p1.x, p2.x, p3.x ),
CatmullRom( weight, p0.y, p1.y, p2.y, p3.y )
);
return point;
};
SplineCurve.prototype.copy = function ( source ) {
Curve.prototype.copy.call( this, source );
this.points = [];
for ( var i = 0, l = source.points.length; i < l; i ++ ) {
var point = source.points[ i ];
this.points.push( point.clone() );
}
return this;
};
SplineCurve.prototype.toJSON = function () {
var data = Curve.prototype.toJSON.call( this );
data.points = [];
for ( var i = 0, l = this.points.length; i < l; i ++ ) {
var point = this.points[ i ];
data.points.push( point.toArray() );
}
return data;
};
SplineCurve.prototype.fromJSON = function ( json ) {
Curve.prototype.fromJSON.call( this, json );
this.points = [];
for ( var i = 0, l = json.points.length; i < l; i ++ ) {
var point = json.points[ i ];
this.points.push( new Vector2().fromArray( point ) );
}
return this;
};
var Curves = Object.freeze({
ArcCurve: ArcCurve,
CatmullRomCurve3: CatmullRomCurve3,
CubicBezierCurve: CubicBezierCurve,
CubicBezierCurve3: CubicBezierCurve3,
EllipseCurve: EllipseCurve,
LineCurve: LineCurve,
LineCurve3: LineCurve3,
QuadraticBezierCurve: QuadraticBezierCurve,
QuadraticBezierCurve3: QuadraticBezierCurve3,
SplineCurve: SplineCurve
});
/**
* @author zz85 / http://www.lab4games.net/zz85/blog
*
**/
/**************************************************************
* Curved Path - a curve path is simply a array of connected
* curves, but retains the api of a curve
**************************************************************/
function CurvePath() {
Curve.call( this );
this.type = 'CurvePath';
this.curves = [];
this.autoClose = false; // Automatically closes the path
}
CurvePath.prototype = Object.assign( Object.create( Curve.prototype ), {
constructor: CurvePath,
add: function ( curve ) {
this.curves.push( curve );
},
closePath: function () {
// Add a line curve if start and end of lines are not connected
var startPoint = this.curves[ 0 ].getPoint( 0 );
var endPoint = this.curves[ this.curves.length - 1 ].getPoint( 1 );
if ( ! startPoint.equals( endPoint ) ) {
this.curves.push( new LineCurve( endPoint, startPoint ) );
}
},
// To get accurate point with reference to
// entire path distance at time t,
// following has to be done:
// 1. Length of each sub path have to be known
// 2. Locate and identify type of curve
// 3. Get t for the curve
// 4. Return curve.getPointAt(t')
getPoint: function ( t ) {
var d = t * this.getLength();
var curveLengths = this.getCurveLengths();
var i = 0;
// To think about boundaries points.
while ( i < curveLengths.length ) {
if ( curveLengths[ i ] >= d ) {
var diff = curveLengths[ i ] - d;
var curve = this.curves[ i ];
var segmentLength = curve.getLength();
var u = segmentLength === 0 ? 0 : 1 - diff / segmentLength;
return curve.getPointAt( u );
}
i ++;
}
return null;
// loop where sum != 0, sum > d , sum+1 <d
},
// We cannot use the default THREE.Curve getPoint() with getLength() because in
// THREE.Curve, getLength() depends on getPoint() but in THREE.CurvePath
// getPoint() depends on getLength
getLength: function () {
var lens = this.getCurveLengths();
return lens[ lens.length - 1 ];
},
// cacheLengths must be recalculated.
updateArcLengths: function () {
this.needsUpdate = true;
this.cacheLengths = null;
this.getCurveLengths();
},
// Compute lengths and cache them
// We cannot overwrite getLengths() because UtoT mapping uses it.
getCurveLengths: function () {
// We use cache values if curves and cache array are same length
if ( this.cacheLengths && this.cacheLengths.length === this.curves.length ) {
return this.cacheLengths;
}
// Get length of sub-curve
// Push sums into cached array
var lengths = [], sums = 0;
for ( var i = 0, l = this.curves.length; i < l; i ++ ) {
sums += this.curves[ i ].getLength();
lengths.push( sums );
}
this.cacheLengths = lengths;
return lengths;
},
getSpacedPoints: function ( divisions ) {
if ( divisions === undefined ) divisions = 40;
var points = [];
for ( var i = 0; i <= divisions; i ++ ) {
points.push( this.getPoint( i / divisions ) );
}
if ( this.autoClose ) {
points.push( points[ 0 ] );
}
return points;
},
getPoints: function ( divisions ) {
divisions = divisions || 12;
var points = [], last;
for ( var i = 0, curves = this.curves; i < curves.length; i ++ ) {
var curve = curves[ i ];
var resolution = ( curve && curve.isEllipseCurve ) ? divisions * 2
: ( curve && curve.isLineCurve ) ? 1
: ( curve && curve.isSplineCurve ) ? divisions * curve.points.length
: divisions;
var pts = curve.getPoints( resolution );
for ( var j = 0; j < pts.length; j ++ ) {
var point = pts[ j ];
if ( last && last.equals( point ) ) continue; // ensures no consecutive points are duplicates
points.push( point );
last = point;
}
}
if ( this.autoClose && points.length > 1 && ! points[ points.length - 1 ].equals( points[ 0 ] ) ) {
points.push( points[ 0 ] );
}
return points;
},
copy: function ( source ) {
Curve.prototype.copy.call( this, source );
this.curves = [];
for ( var i = 0, l = source.curves.length; i < l; i ++ ) {
var curve = source.curves[ i ];
this.curves.push( curve.clone() );
}
this.autoClose = source.autoClose;
return this;
},
toJSON: function () {
var data = Curve.prototype.toJSON.call( this );
data.autoClose = this.autoClose;
data.curves = [];
for ( var i = 0, l = this.curves.length; i < l; i ++ ) {
var curve = this.curves[ i ];
data.curves.push( curve.toJSON() );
}
return data;
},
fromJSON: function ( json ) {
Curve.prototype.fromJSON.call( this, json );
this.autoClose = json.autoClose;
this.curves = [];
for ( var i = 0, l = json.curves.length; i < l; i ++ ) {
var curve = json.curves[ i ];
this.curves.push( new Curves[ curve.type ]().fromJSON( curve ) );
}
return this;
}
} );
/**
* @author zz85 / http://www.lab4games.net/zz85/blog
* Creates free form 2d path using series of points, lines or curves.
**/
function Path( points ) {
CurvePath.call( this );
this.type = 'Path';
this.currentPoint = new Vector2();
if ( points ) {
this.setFromPoints( points );
}
}
Path.prototype = Object.assign( Object.create( CurvePath.prototype ), {
constructor: Path,
setFromPoints: function ( points ) {
this.moveTo( points[ 0 ].x, points[ 0 ].y );
for ( var i = 1, l = points.length; i < l; i ++ ) {
this.lineTo( points[ i ].x, points[ i ].y );
}
},
moveTo: function ( x, y ) {
this.currentPoint.set( x, y ); // TODO consider referencing vectors instead of copying?
},
lineTo: function ( x, y ) {
var curve = new LineCurve( this.currentPoint.clone(), new Vector2( x, y ) );
this.curves.push( curve );
this.currentPoint.set( x, y );
},
quadraticCurveTo: function ( aCPx, aCPy, aX, aY ) {
var curve = new QuadraticBezierCurve(
this.currentPoint.clone(),
new Vector2( aCPx, aCPy ),
new Vector2( aX, aY )
);
this.curves.push( curve );
this.currentPoint.set( aX, aY );
},
bezierCurveTo: function ( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) {
var curve = new CubicBezierCurve(
this.currentPoint.clone(),
new Vector2( aCP1x, aCP1y ),
new Vector2( aCP2x, aCP2y ),
new Vector2( aX, aY )
);
this.curves.push( curve );
this.currentPoint.set( aX, aY );
},
splineThru: function ( pts /*Array of Vector*/ ) {
var npts = [ this.currentPoint.clone() ].concat( pts );
var curve = new SplineCurve( npts );
this.curves.push( curve );
this.currentPoint.copy( pts[ pts.length - 1 ] );
},
arc: function ( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {
var x0 = this.currentPoint.x;
var y0 = this.currentPoint.y;
this.absarc( aX + x0, aY + y0, aRadius,
aStartAngle, aEndAngle, aClockwise );
},
absarc: function ( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {
this.absellipse( aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise );
},
ellipse: function ( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {
var x0 = this.currentPoint.x;
var y0 = this.currentPoint.y;
this.absellipse( aX + x0, aY + y0, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation );
},
absellipse: function ( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {
var curve = new EllipseCurve( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation );
if ( this.curves.length > 0 ) {
// if a previous curve is present, attempt to join
var firstPoint = curve.getPoint( 0 );
if ( ! firstPoint.equals( this.currentPoint ) ) {
this.lineTo( firstPoint.x, firstPoint.y );
}
}
this.curves.push( curve );
var lastPoint = curve.getPoint( 1 );
this.currentPoint.copy( lastPoint );
},
copy: function ( source ) {
CurvePath.prototype.copy.call( this, source );
this.currentPoint.copy( source.currentPoint );
return this;
},
toJSON: function () {
var data = CurvePath.prototype.toJSON.call( this );
data.currentPoint = this.currentPoint.toArray();
return data;
},
fromJSON: function ( json ) {
CurvePath.prototype.fromJSON.call( this, json );
this.currentPoint.fromArray( json.currentPoint );
return this;
}
} );
/**
* @author zz85 / http://www.lab4games.net/zz85/blog
* Defines a 2d shape plane using paths.
**/
// STEP 1 Create a path.
// STEP 2 Turn path into shape.
// STEP 3 ExtrudeGeometry takes in Shape/Shapes
// STEP 3a - Extract points from each shape, turn to vertices
// STEP 3b - Triangulate each shape, add faces.
function Shape( points ) {
Path.call( this, points );
this.uuid = _Math.generateUUID();
this.type = 'Shape';
this.holes = [];
}
Shape.prototype = Object.assign( Object.create( Path.prototype ), {
constructor: Shape,
getPointsHoles: function ( divisions ) {
var holesPts = [];
for ( var i = 0, l = this.holes.length; i < l; i ++ ) {
holesPts[ i ] = this.holes[ i ].getPoints( divisions );
}
return holesPts;
},
// get points of shape and holes (keypoints based on segments parameter)
extractPoints: function ( divisions ) {
return {
shape: this.getPoints( divisions ),
holes: this.getPointsHoles( divisions )
};
},
copy: function ( source ) {
Path.prototype.copy.call( this, source );
this.holes = [];
for ( var i = 0, l = source.holes.length; i < l; i ++ ) {
var hole = source.holes[ i ];
this.holes.push( hole.clone() );
}
return this;
},
toJSON: function () {
var data = Path.prototype.toJSON.call( this );
data.uuid = this.uuid;
data.holes = [];
for ( var i = 0, l = this.holes.length; i < l; i ++ ) {
var hole = this.holes[ i ];
data.holes.push( hole.toJSON() );
}
return data;
},
fromJSON: function ( json ) {
Path.prototype.fromJSON.call( this, json );
this.uuid = json.uuid;
this.holes = [];
for ( var i = 0, l = json.holes.length; i < l; i ++ ) {
var hole = json.holes[ i ];
this.holes.push( new Path().fromJSON( hole ) );
}
return this;
}
} );
/**
* @author mrdoob / http://mrdoob.com/
* @author alteredq / http://alteredqualia.com/
*/
function Light( color, intensity ) {
Object3D.call( this );
this.type = 'Light';
this.color = new Color( color );
this.intensity = intensity !== undefined ? intensity : 1;
this.receiveShadow = undefined;
}
Light.prototype = Object.assign( Object.create( Object3D.prototype ), {
constructor: Light,
isLight: true,
copy: function ( source ) {
Object3D.prototype.copy.call( this, source );
this.color.copy( source.color );
this.intensity = source.intensity;
return this;
},
toJSON: function ( meta ) {
var data = Object3D.prototype.toJSON.call( this, meta );
data.object.color = this.color.getHex();
data.object.intensity = this.intensity;
if ( this.groundColor !== undefined ) data.object.groundColor = this.groundColor.getHex();
if ( this.distance !== undefined ) data.object.distance = this.distance;
if ( this.angle !== undefined ) data.object.angle = this.angle;
if ( this.decay !== undefined ) data.object.decay = this.decay;
if ( this.penumbra !== undefined ) data.object.penumbra = this.penumbra;
if ( this.shadow !== undefined ) data.object.shadow = this.shadow.toJSON();
return data;
}
} );
/**
* @author alteredq / http://alteredqualia.com/
*/
function HemisphereLight( skyColor, groundColor, intensity ) {
Light.call( this, skyColor, intensity );
this.type = 'HemisphereLight';
this.castShadow = undefined;
this.position.copy( Object3D.DefaultUp );
this.updateMatrix();
this.groundColor = new Color( groundColor );
}
HemisphereLight.prototype = Object.assign( Object.create( Light.prototype ), {
constructor: HemisphereLight,
isHemisphereLight: true,
copy: function ( source ) {
Light.prototype.copy.call( this, source );
this.groundColor.copy( source.groundColor );
return this;
}
} );
/**
* @author mrdoob / http://mrdoob.com/
*/
function LightShadow( camera ) {
this.camera = camera;
this.bias = 0;
this.radius = 1;
this.mapSize = new Vector2( 512, 512 );
this.map = null;
this.matrix = new Matrix4();
}
Object.assign( LightShadow.prototype, {
copy: function ( source ) {
this.camera = source.camera.clone();
this.bias = source.bias;
this.radius = source.radius;
this.mapSize.copy( source.mapSize );
return this;
},
clone: function () {
return new this.constructor().copy( this );
},
toJSON: function () {
var object = {};
if ( this.bias !== 0 ) object.bias = this.bias;
if ( this.radius !== 1 ) object.radius = this.radius;
if ( this.mapSize.x !== 512 || this.mapSize.y !== 512 ) object.mapSize = this.mapSize.toArray();
object.camera = this.camera.toJSON( false ).object;
delete object.camera.matrix;
return object;
}
} );
/**
* @author mrdoob / http://mrdoob.com/
*/
function SpotLightShadow() {
LightShadow.call( this, new PerspectiveCamera( 50, 1, 0.5, 500 ) );
}
SpotLightShadow.prototype = Object.assign( Object.create( LightShadow.prototype ), {
constructor: SpotLightShadow,
isSpotLightShadow: true,
update: function ( light ) {
var camera = this.camera;
var fov = _Math.RAD2DEG * 2 * light.angle;
var aspect = this.mapSize.width / this.mapSize.height;
var far = light.distance || camera.far;
if ( fov !== camera.fov || aspect !== camera.aspect || far !== camera.far ) {
camera.fov = fov;
camera.aspect = aspect;
camera.far = far;
camera.updateProjectionMatrix();
}
}
} );
/**
* @author alteredq / http://alteredqualia.com/
*/
function SpotLight( color, intensity, distance, angle, penumbra, decay ) {
Light.call( this, color, intensity );
this.type = 'SpotLight';
this.position.copy( Object3D.DefaultUp );
this.updateMatrix();
this.target = new Object3D();
Object.defineProperty( this, 'power', {
get: function () {
// intensity = power per solid angle.
// ref: equation (17) from https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf
return this.intensity * Math.PI;
},
set: function ( power ) {
// intensity = power per solid angle.
// ref: equation (17) from https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf
this.intensity = power / Math.PI;
}
} );
this.distance = ( distance !== undefined ) ? distance : 0;
this.angle = ( angle !== undefined ) ? angle : Math.PI / 3;
this.penumbra = ( penumbra !== undefined ) ? penumbra : 0;
this.decay = ( decay !== undefined ) ? decay : 1; // for physically correct lights, should be 2.
this.shadow = new SpotLightShadow();
}
SpotLight.prototype = Object.assign( Object.create( Light.prototype ), {
constructor: SpotLight,
isSpotLight: true,
copy: function ( source ) {
Light.prototype.copy.call( this, source );
this.distance = source.distance;
this.angle = source.angle;
this.penumbra = source.penumbra;
this.decay = source.decay;
this.target = source.target.clone();
this.shadow = source.shadow.clone();
return this;
}
} );
/**
* @author mrdoob / http://mrdoob.com/
*/
function PointLight( color, intensity, distance, decay ) {
Light.call( this, color, intensity );
this.type = 'PointLight';
Object.defineProperty( this, 'power', {
get: function () {
// intensity = power per solid angle.
// ref: equation (15) from https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf
return this.intensity * 4 * Math.PI;
},
set: function ( power ) {
// intensity = power per solid angle.
// ref: equation (15) from https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf
this.intensity = power / ( 4 * Math.PI );
}
} );
this.distance = ( distance !== undefined ) ? distance : 0;
this.decay = ( decay !== undefined ) ? decay : 1; // for physically correct lights, should be 2.
this.shadow = new LightShadow( new PerspectiveCamera( 90, 1, 0.5, 500 ) );
}
PointLight.prototype = Object.assign( Object.create( Light.prototype ), {
constructor: PointLight,
isPointLight: true,
copy: function ( source ) {
Light.prototype.copy.call( this, source );
this.distance = source.distance;
this.decay = source.decay;
this.shadow = source.shadow.clone();
return this;
}
} );
/**
* @author mrdoob / http://mrdoob.com/
*/
function DirectionalLightShadow( ) {
LightShadow.call( this, new OrthographicCamera( - 5, 5, 5, - 5, 0.5, 500 ) );
}
DirectionalLightShadow.prototype = Object.assign( Object.create( LightShadow.prototype ), {
constructor: DirectionalLightShadow
} );
/**
* @author mrdoob / http://mrdoob.com/
* @author alteredq / http://alteredqualia.com/
*/
function DirectionalLight( color, intensity ) {
Light.call( this, color, intensity );
this.type = 'DirectionalLight';
this.position.copy( Object3D.DefaultUp );
this.updateMatrix();
this.target = new Object3D();
this.shadow = new DirectionalLightShadow();
}
DirectionalLight.prototype = Object.assign( Object.create( Light.prototype ), {
constructor: DirectionalLight,
isDirectionalLight: true,
copy: function ( source ) {
Light.prototype.copy.call( this, source );
this.target = source.target.clone();
this.shadow = source.shadow.clone();
return this;
}
} );
/**
* @author mrdoob / http://mrdoob.com/
*/
function AmbientLight( color, intensity ) {
Light.call( this, color, intensity );
this.type = 'AmbientLight';
this.castShadow = undefined;
}
AmbientLight.prototype = Object.assign( Object.create( Light.prototype ), {
constructor: AmbientLight,
isAmbientLight: true
} );
/**
* @author abelnation / http://github.com/abelnation
*/
function RectAreaLight( color, intensity, width, height ) {
Light.call( this, color, intensity );
this.type = 'RectAreaLight';
this.width = ( width !== undefined ) ? width : 10;
this.height = ( height !== undefined ) ? height : 10;
}
RectAreaLight.prototype = Object.assign( Object.create( Light.prototype ), {
constructor: RectAreaLight,
isRectAreaLight: true,
copy: function ( source ) {
Light.prototype.copy.call( this, source );
this.width = source.width;
this.height = source.height;
return this;
},
toJSON: function ( meta ) {
var data = Light.prototype.toJSON.call( this, meta );
data.object.width = this.width;
data.object.height = this.height;
return data;
}
} );
/**
*
* A Track that interpolates Strings
*
*
* @author Ben Houston / http://clara.io/
* @author David Sarno / http://lighthaus.us/
* @author tschw
*/
function StringKeyframeTrack( name, times, values, interpolation ) {
KeyframeTrack.call( this, name, times, values, interpolation );
}
StringKeyframeTrack.prototype = Object.assign( Object.create( KeyframeTrack.prototype ), {
constructor: StringKeyframeTrack,
ValueTypeName: 'string',
ValueBufferType: Array,
DefaultInterpolation: InterpolateDiscrete,
InterpolantFactoryMethodLinear: undefined,
InterpolantFactoryMethodSmooth: undefined
} );
/**
*
* A Track of Boolean keyframe values.
*
*
* @author Ben Houston / http://clara.io/
* @author David Sarno / http://lighthaus.us/
* @author tschw
*/
function BooleanKeyframeTrack( name, times, values ) {
KeyframeTrack.call( this, name, times, values );
}
BooleanKeyframeTrack.prototype = Object.assign( Object.create( KeyframeTrack.prototype ), {
constructor: BooleanKeyframeTrack,
ValueTypeName: 'bool',
ValueBufferType: Array,
DefaultInterpolation: InterpolateDiscrete,
InterpolantFactoryMethodLinear: undefined,
InterpolantFactoryMethodSmooth: undefined
// Note: Actually this track could have a optimized / compressed
// representation of a single value and a custom interpolant that
// computes "firstValue ^ isOdd( index )".
} );
/**
* Abstract base class of interpolants over parametric samples.
*
* The parameter domain is one dimensional, typically the time or a path
* along a curve defined by the data.
*
* The sample values can have any dimensionality and derived classes may
* apply special interpretations to the data.
*
* This class provides the interval seek in a Template Method, deferring
* the actual interpolation to derived classes.
*
* Time complexity is O(1) for linear access crossing at most two points
* and O(log N) for random access, where N is the number of positions.
*
* References:
*
* http://www.oodesign.com/template-method-pattern.html
*
* @author tschw
*/
function Interpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) {
this.parameterPositions = parameterPositions;
this._cachedIndex = 0;
this.resultBuffer = resultBuffer !== undefined ?
resultBuffer : new sampleValues.constructor( sampleSize );
this.sampleValues = sampleValues;
this.valueSize = sampleSize;
}
Object.assign( Interpolant.prototype, {
evaluate: function ( t ) {
var pp = this.parameterPositions,
i1 = this._cachedIndex,
t1 = pp[ i1 ],
t0 = pp[ i1 - 1 ];
validate_interval: {
seek: {
var right;
linear_scan: {
//- See http://jsperf.com/comparison-to-undefined/3
//- slower code:
//-
//- if ( t >= t1 || t1 === undefined ) {
forward_scan: if ( ! ( t < t1 ) ) {
for ( var giveUpAt = i1 + 2; ; ) {
if ( t1 === undefined ) {
if ( t < t0 ) break forward_scan;
// after end
i1 = pp.length;
this._cachedIndex = i1;
return this.afterEnd_( i1 - 1, t, t0 );
}
if ( i1 === giveUpAt ) break; // this loop
t0 = t1;
t1 = pp[ ++ i1 ];
if ( t < t1 ) {
// we have arrived at the sought interval
break seek;
}
}
// prepare binary search on the right side of the index
right = pp.length;
break linear_scan;
}
//- slower code:
//- if ( t < t0 || t0 === undefined ) {
if ( ! ( t >= t0 ) ) {
// looping?
var t1global = pp[ 1 ];
if ( t < t1global ) {
i1 = 2; // + 1, using the scan for the details
t0 = t1global;
}
// linear reverse scan
for ( var giveUpAt = i1 - 2; ; ) {
if ( t0 === undefined ) {
// before start
this._cachedIndex = 0;
return this.beforeStart_( 0, t, t1 );
}
if ( i1 === giveUpAt ) break; // this loop
t1 = t0;
t0 = pp[ -- i1 - 1 ];
if ( t >= t0 ) {
// we have arrived at the sought interval
break seek;
}
}
// prepare binary search on the left side of the index
right = i1;
i1 = 0;
break linear_scan;
}
// the interval is valid
break validate_interval;
} // linear scan
// binary search
while ( i1 < right ) {
var mid = ( i1 + right ) >>> 1;
if ( t < pp[ mid ] ) {
right = mid;
} else {
i1 = mid + 1;
}
}
t1 = pp[ i1 ];
t0 = pp[ i1 - 1 ];
// check boundary cases, again
if ( t0 === undefined ) {
this._cachedIndex = 0;
return this.beforeStart_( 0, t, t1 );
}
if ( t1 === undefined ) {
i1 = pp.length;
this._cachedIndex = i1;
return this.afterEnd_( i1 - 1, t0, t );
}
} // seek
this._cachedIndex = i1;
this.intervalChanged_( i1, t0, t1 );
} // validate_interval
return this.interpolate_( i1, t0, t, t1 );
},
settings: null, // optional, subclass-specific settings structure
// Note: The indirection allows central control of many interpolants.
// --- Protected interface
DefaultSettings_: {},
getSettings_: function () {
return this.settings || this.DefaultSettings_;
},
copySampleValue_: function ( index ) {
// copies a sample value to the result buffer
var result = this.resultBuffer,
values = this.sampleValues,
stride = this.valueSize,
offset = index * stride;
for ( var i = 0; i !== stride; ++ i ) {
result[ i ] = values[ offset + i ];
}
return result;
},
// Template methods for derived classes:
interpolate_: function ( /* i1, t0, t, t1 */ ) {
throw new Error( 'call to abstract method' );
// implementations shall return this.resultBuffer
},
intervalChanged_: function ( /* i1, t0, t1 */ ) {
// empty
}
} );
//!\ DECLARE ALIAS AFTER assign prototype !
Object.assign( Interpolant.prototype, {
//( 0, t, t0 ), returns this.resultBuffer
beforeStart_: Interpolant.prototype.copySampleValue_,
//( N-1, tN-1, t ), returns this.resultBuffer
afterEnd_: Interpolant.prototype.copySampleValue_,
} );
/**
* Spherical linear unit quaternion interpolant.
*
* @author tschw
*/
function QuaternionLinearInterpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) {
Interpolant.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer );
}
QuaternionLinearInterpolant.prototype = Object.assign( Object.create( Interpolant.prototype ), {
constructor: QuaternionLinearInterpolant,
interpolate_: function ( i1, t0, t, t1 ) {
var result = this.resultBuffer,
values = this.sampleValues,
stride = this.valueSize,
offset = i1 * stride,
alpha = ( t - t0 ) / ( t1 - t0 );
for ( var end = offset + stride; offset !== end; offset += 4 ) {
Quaternion.slerpFlat( result, 0, values, offset - stride, values, offset, alpha );
}
return result;
}
} );
/**
*
* A Track of quaternion keyframe values.
*
* @author Ben Houston / http://clara.io/
* @author David Sarno / http://lighthaus.us/
* @author tschw
*/
function QuaternionKeyframeTrack( name, times, values, interpolation ) {
KeyframeTrack.call( this, name, times, values, interpolation );
}
QuaternionKeyframeTrack.prototype = Object.assign( Object.create( KeyframeTrack.prototype ), {
constructor: QuaternionKeyframeTrack,
ValueTypeName: 'quaternion',
// ValueBufferType is inherited
DefaultInterpolation: InterpolateLinear,
InterpolantFactoryMethodLinear: function ( result ) {
return new QuaternionLinearInterpolant( this.times, this.values, this.getValueSize(), result );
},
InterpolantFactoryMethodSmooth: undefined // not yet implemented
} );
/**
*
* A Track of keyframe values that represent color.
*
*
* @author Ben Houston / http://clara.io/
* @author David Sarno / http://lighthaus.us/
* @author tschw
*/
function ColorKeyframeTrack( name, times, values, interpolation ) {
KeyframeTrack.call( this, name, times, values, interpolation );
}
ColorKeyframeTrack.prototype = Object.assign( Object.create( KeyframeTrack.prototype ), {
constructor: ColorKeyframeTrack,
ValueTypeName: 'color'
// ValueBufferType is inherited
// DefaultInterpolation is inherited
// Note: Very basic implementation and nothing special yet.
// However, this is the place for color space parameterization.
} );
/**
*
* A Track of numeric keyframe values.
*
* @author Ben Houston / http://clara.io/
* @author David Sarno / http://lighthaus.us/
* @author tschw
*/
function NumberKeyframeTrack( name, times, values, interpolation ) {
KeyframeTrack.call( this, name, times, values, interpolation );
}
NumberKeyframeTrack.prototype = Object.assign( Object.create( KeyframeTrack.prototype ), {
constructor: NumberKeyframeTrack,
ValueTypeName: 'number'
// ValueBufferType is inherited
// DefaultInterpolation is inherited
} );
/**
* Fast and simple cubic spline interpolant.
*
* It was derived from a Hermitian construction setting the first derivative
* at each sample position to the linear slope between neighboring positions
* over their parameter interval.
*
* @author tschw
*/
function CubicInterpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) {
Interpolant.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer );
this._weightPrev = - 0;
this._offsetPrev = - 0;
this._weightNext = - 0;
this._offsetNext = - 0;
}
CubicInterpolant.prototype = Object.assign( Object.create( Interpolant.prototype ), {
constructor: CubicInterpolant,
DefaultSettings_: {
endingStart: ZeroCurvatureEnding,
endingEnd: ZeroCurvatureEnding
},
intervalChanged_: function ( i1, t0, t1 ) {
var pp = this.parameterPositions,
iPrev = i1 - 2,
iNext = i1 + 1,
tPrev = pp[ iPrev ],
tNext = pp[ iNext ];
if ( tPrev === undefined ) {
switch ( this.getSettings_().endingStart ) {
case ZeroSlopeEnding:
// f'(t0) = 0
iPrev = i1;
tPrev = 2 * t0 - t1;
break;
case WrapAroundEnding:
// use the other end of the curve
iPrev = pp.length - 2;
tPrev = t0 + pp[ iPrev ] - pp[ iPrev + 1 ];
break;
default: // ZeroCurvatureEnding
// f''(t0) = 0 a.k.a. Natural Spline
iPrev = i1;
tPrev = t1;
}
}
if ( tNext === undefined ) {
switch ( this.getSettings_().endingEnd ) {
case ZeroSlopeEnding:
// f'(tN) = 0
iNext = i1;
tNext = 2 * t1 - t0;
break;
case WrapAroundEnding:
// use the other end of the curve
iNext = 1;
tNext = t1 + pp[ 1 ] - pp[ 0 ];
break;
default: // ZeroCurvatureEnding
// f''(tN) = 0, a.k.a. Natural Spline
iNext = i1 - 1;
tNext = t0;
}
}
var halfDt = ( t1 - t0 ) * 0.5,
stride = this.valueSize;
this._weightPrev = halfDt / ( t0 - tPrev );
this._weightNext = halfDt / ( tNext - t1 );
this._offsetPrev = iPrev * stride;
this._offsetNext = iNext * stride;
},
interpolate_: function ( i1, t0, t, t1 ) {
var result = this.resultBuffer,
values = this.sampleValues,
stride = this.valueSize,
o1 = i1 * stride, o0 = o1 - stride,
oP = this._offsetPrev, oN = this._offsetNext,
wP = this._weightPrev, wN = this._weightNext,
p = ( t - t0 ) / ( t1 - t0 ),
pp = p * p,
ppp = pp * p;
// evaluate polynomials
var sP = - wP * ppp + 2 * wP * pp - wP * p;
var s0 = ( 1 + wP ) * ppp + ( - 1.5 - 2 * wP ) * pp + ( - 0.5 + wP ) * p + 1;
var s1 = ( - 1 - wN ) * ppp + ( 1.5 + wN ) * pp + 0.5 * p;
var sN = wN * ppp - wN * pp;
// combine data linearly
for ( var i = 0; i !== stride; ++ i ) {
result[ i ] =
sP * values[ oP + i ] +
s0 * values[ o0 + i ] +
s1 * values[ o1 + i ] +
sN * values[ oN + i ];
}
return result;
}
} );
/**
* @author tschw
*/
function LinearInterpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) {
Interpolant.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer );
}
LinearInterpolant.prototype = Object.assign( Object.create( Interpolant.prototype ), {
constructor: LinearInterpolant,
interpolate_: function ( i1, t0, t, t1 ) {
var result = this.resultBuffer,
values = this.sampleValues,
stride = this.valueSize,
offset1 = i1 * stride,
offset0 = offset1 - stride,
weight1 = ( t - t0 ) / ( t1 - t0 ),
weight0 = 1 - weight1;
for ( var i = 0; i !== stride; ++ i ) {
result[ i ] =
values[ offset0 + i ] * weight0 +
values[ offset1 + i ] * weight1;
}
return result;
}
} );
/**
*
* Interpolant that evaluates to the sample value at the position preceeding
* the parameter.
*
* @author tschw
*/
function DiscreteInterpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) {
Interpolant.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer );
}
DiscreteInterpolant.prototype = Object.assign( Object.create( Interpolant.prototype ), {
constructor: DiscreteInterpolant,
interpolate_: function ( i1 /*, t0, t, t1 */ ) {
return this.copySampleValue_( i1 - 1 );
}
} );
/**
* @author tschw
* @author Ben Houston / http://clara.io/
* @author David Sarno / http://lighthaus.us/
*/
var AnimationUtils = {
// same as Array.prototype.slice, but also works on typed arrays
arraySlice: function ( array, from, to ) {
if ( AnimationUtils.isTypedArray( array ) ) {
// in ios9 array.subarray(from, undefined) will return empty array
// but array.subarray(from) or array.subarray(from, len) is correct
return new array.constructor( array.subarray( from, to !== undefined ? to : array.length ) );
}
return array.slice( from, to );
},
// converts an array to a specific type
convertArray: function ( array, type, forceClone ) {
if ( ! array || // let 'undefined' and 'null' pass
! forceClone && array.constructor === type ) return array;
if ( typeof type.BYTES_PER_ELEMENT === 'number' ) {
return new type( array ); // create typed array
}
return Array.prototype.slice.call( array ); // create Array
},
isTypedArray: function ( object ) {
return ArrayBuffer.isView( object ) &&
! ( object instanceof DataView );
},
// returns an array by which times and values can be sorted
getKeyframeOrder: function ( times ) {
function compareTime( i, j ) {
return times[ i ] - times[ j ];
}
var n = times.length;
var result = new Array( n );
for ( var i = 0; i !== n; ++ i ) result[ i ] = i;
result.sort( compareTime );
return result;
},
// uses the array previously returned by 'getKeyframeOrder' to sort data
sortedArray: function ( values, stride, order ) {
var nValues = values.length;
var result = new values.constructor( nValues );
for ( var i = 0, dstOffset = 0; dstOffset !== nValues; ++ i ) {
var srcOffset = order[ i ] * stride;
for ( var j = 0; j !== stride; ++ j ) {
result[ dstOffset ++ ] = values[ srcOffset + j ];
}
}
return result;
},
// function for parsing AOS keyframe formats
flattenJSON: function ( jsonKeys, times, values, valuePropertyName ) {
var i = 1, key = jsonKeys[ 0 ];
while ( key !== undefined && key[ valuePropertyName ] === undefined ) {
key = jsonKeys[ i ++ ];
}
if ( key === undefined ) return; // no data
var value = key[ valuePropertyName ];
if ( value === undefined ) return; // no data
if ( Array.isArray( value ) ) {
do {
value = key[ valuePropertyName ];
if ( value !== undefined ) {
times.push( key.time );
values.push.apply( values, value ); // push all elements
}
key = jsonKeys[ i ++ ];
} while ( key !== undefined );
} else if ( value.toArray !== undefined ) {
// ...assume THREE.Math-ish
do {
value = key[ valuePropertyName ];
if ( value !== undefined ) {
times.push( key.time );
value.toArray( values, values.length );
}
key = jsonKeys[ i ++ ];
} while ( key !== undefined );
} else {
// otherwise push as-is
do {
value = key[ valuePropertyName ];
if ( value !== undefined ) {
times.push( key.time );
values.push( value );
}
key = jsonKeys[ i ++ ];
} while ( key !== undefined );
}
}
};
/**
*
* A timed sequence of keyframes for a specific property.
*
*
* @author Ben Houston / http://clara.io/
* @author David Sarno / http://lighthaus.us/
* @author tschw
*/
function KeyframeTrack( name, times, values, interpolation ) {
if ( name === undefined ) throw new Error( 'THREE.KeyframeTrack: track name is undefined' );
if ( times === undefined || times.length === 0 ) throw new Error( 'THREE.KeyframeTrack: no keyframes in track named ' + name );
this.name = name;
this.times = AnimationUtils.convertArray( times, this.TimeBufferType );
this.values = AnimationUtils.convertArray( values, this.ValueBufferType );
this.setInterpolation( interpolation || this.DefaultInterpolation );
this.validate();
this.optimize();
}
// Static methods:
Object.assign( KeyframeTrack, {
// Serialization (in static context, because of constructor invocation
// and automatic invocation of .toJSON):
parse: function ( json ) {
if ( json.type === undefined ) {
throw new Error( 'THREE.KeyframeTrack: track type undefined, can not parse' );
}
var trackType = KeyframeTrack._getTrackTypeForValueTypeName( json.type );
if ( json.times === undefined ) {
var times = [], values = [];
AnimationUtils.flattenJSON( json.keys, times, values, 'value' );
json.times = times;
json.values = values;
}
// derived classes can define a static parse method
if ( trackType.parse !== undefined ) {
return trackType.parse( json );
} else {
// by default, we assume a constructor compatible with the base
return new trackType( json.name, json.times, json.values, json.interpolation );
}
},
toJSON: function ( track ) {
var trackType = track.constructor;
var json;
// derived classes can define a static toJSON method
if ( trackType.toJSON !== undefined ) {
json = trackType.toJSON( track );
} else {
// by default, we assume the data can be serialized as-is
json = {
'name': track.name,
'times': AnimationUtils.convertArray( track.times, Array ),
'values': AnimationUtils.convertArray( track.values, Array )
};
var interpolation = track.getInterpolation();
if ( interpolation !== track.DefaultInterpolation ) {
json.interpolation = interpolation;
}
}
json.type = track.ValueTypeName; // mandatory
return json;
},
_getTrackTypeForValueTypeName: function ( typeName ) {
switch ( typeName.toLowerCase() ) {
case 'scalar':
case 'double':
case 'float':
case 'number':
case 'integer':
return NumberKeyframeTrack;
case 'vector':
case 'vector2':
case 'vector3':
case 'vector4':
return VectorKeyframeTrack;
case 'color':
return ColorKeyframeTrack;
case 'quaternion':
return QuaternionKeyframeTrack;
case 'bool':
case 'boolean':
return BooleanKeyframeTrack;
case 'string':
return StringKeyframeTrack;
}
throw new Error( 'THREE.KeyframeTrack: Unsupported typeName: ' + typeName );
}
} );
Object.assign( KeyframeTrack.prototype, {
constructor: KeyframeTrack,
TimeBufferType: Float32Array,
ValueBufferType: Float32Array,
DefaultInterpolation: InterpolateLinear,
InterpolantFactoryMethodDiscrete: function ( result ) {
return new DiscreteInterpolant( this.times, this.values, this.getValueSize(), result );
},
InterpolantFactoryMethodLinear: function ( result ) {
return new LinearInterpolant( this.times, this.values, this.getValueSize(), result );
},
InterpolantFactoryMethodSmooth: function ( result ) {
return new CubicInterpolant( this.times, this.values, this.getValueSize(), result );
},
setInterpolation: function ( interpolation ) {
var factoryMethod;
switch ( interpolation ) {
case InterpolateDiscrete:
factoryMethod = this.InterpolantFactoryMethodDiscrete;
break;
case InterpolateLinear:
factoryMethod = this.InterpolantFactoryMethodLinear;
break;
case InterpolateSmooth:
factoryMethod = this.InterpolantFactoryMethodSmooth;
break;
}
if ( factoryMethod === undefined ) {
var message = "unsupported interpolation for " +
this.ValueTypeName + " keyframe track named " + this.name;
if ( this.createInterpolant === undefined ) {
// fall back to default, unless the default itself is messed up
if ( interpolation !== this.DefaultInterpolation ) {
this.setInterpolation( this.DefaultInterpolation );
} else {
throw new Error( message ); // fatal, in this case
}
}
console.warn( 'THREE.KeyframeTrack:', message );
return;
}
this.createInterpolant = factoryMethod;
},
getInterpolation: function () {
switch ( this.createInterpolant ) {
case this.InterpolantFactoryMethodDiscrete:
return InterpolateDiscrete;
case this.InterpolantFactoryMethodLinear:
return InterpolateLinear;
case this.InterpolantFactoryMethodSmooth:
return InterpolateSmooth;
}
},
getValueSize: function () {
return this.values.length / this.times.length;
},
// move all keyframes either forwards or backwards in time
shift: function ( timeOffset ) {
if ( timeOffset !== 0.0 ) {
var times = this.times;
for ( var i = 0, n = times.length; i !== n; ++ i ) {
times[ i ] += timeOffset;
}
}
return this;
},
// scale all keyframe times by a factor (useful for frame <-> seconds conversions)
scale: function ( timeScale ) {
if ( timeScale !== 1.0 ) {
var times = this.times;
for ( var i = 0, n = times.length; i !== n; ++ i ) {
times[ i ] *= timeScale;
}
}
return this;
},
// removes keyframes before and after animation without changing any values within the range [startTime, endTime].
// IMPORTANT: We do not shift around keys to the start of the track time, because for interpolated keys this will change their values
trim: function ( startTime, endTime ) {
var times = this.times,
nKeys = times.length,
from = 0,
to = nKeys - 1;
while ( from !== nKeys && times[ from ] < startTime ) {
++ from;
}
while ( to !== - 1 && times[ to ] > endTime ) {
-- to;
}
++ to; // inclusive -> exclusive bound
if ( from !== 0 || to !== nKeys ) {
// empty tracks are forbidden, so keep at least one keyframe
if ( from >= to ) to = Math.max( to, 1 ), from = to - 1;
var stride = this.getValueSize();
this.times = AnimationUtils.arraySlice( times, from, to );
this.values = AnimationUtils.arraySlice( this.values, from * stride, to * stride );
}
return this;
},
// ensure we do not get a GarbageInGarbageOut situation, make sure tracks are at least minimally viable
validate: function () {
var valid = true;
var valueSize = this.getValueSize();
if ( valueSize - Math.floor( valueSize ) !== 0 ) {
console.error( 'THREE.KeyframeTrack: Invalid value size in track.', this );
valid = false;
}
var times = this.times,
values = this.values,
nKeys = times.length;
if ( nKeys === 0 ) {
console.error( 'THREE.KeyframeTrack: Track is empty.', this );
valid = false;
}
var prevTime = null;
for ( var i = 0; i !== nKeys; i ++ ) {
var currTime = times[ i ];
if ( typeof currTime === 'number' && isNaN( currTime ) ) {
console.error( 'THREE.KeyframeTrack: Time is not a valid number.', this, i, currTime );
valid = false;
break;
}
if ( prevTime !== null && prevTime > currTime ) {
console.error( 'THREE.KeyframeTrack: Out of order keys.', this, i, currTime, prevTime );
valid = false;
break;
}
prevTime = currTime;
}
if ( values !== undefined ) {
if ( AnimationUtils.isTypedArray( values ) ) {
for ( var i = 0, n = values.length; i !== n; ++ i ) {
var value = values[ i ];
if ( isNaN( value ) ) {
console.error( 'THREE.KeyframeTrack: Value is not a valid number.', this, i, value );
valid = false;
break;
}
}
}
}
return valid;
},
// removes equivalent sequential keys as common in morph target sequences
// (0,0,0,0,1,1,1,0,0,0,0,0,0,0) --> (0,0,1,1,0,0)
optimize: function () {
var times = this.times,
values = this.values,
stride = this.getValueSize(),
smoothInterpolation = this.getInterpolation() === InterpolateSmooth,
writeIndex = 1,
lastIndex = times.length - 1;
for ( var i = 1; i < lastIndex; ++ i ) {
var keep = false;
var time = times[ i ];
var timeNext = times[ i + 1 ];
// remove adjacent keyframes scheduled at the same time
if ( time !== timeNext && ( i !== 1 || time !== time[ 0 ] ) ) {
if ( ! smoothInterpolation ) {
// remove unnecessary keyframes same as their neighbors
var offset = i * stride,
offsetP = offset - stride,
offsetN = offset + stride;
for ( var j = 0; j !== stride; ++ j ) {
var value = values[ offset + j ];
if ( value !== values[ offsetP + j ] ||
value !== values[ offsetN + j ] ) {
keep = true;
break;
}
}
} else {
keep = true;
}
}
// in-place compaction
if ( keep ) {
if ( i !== writeIndex ) {
times[ writeIndex ] = times[ i ];
var readOffset = i * stride,
writeOffset = writeIndex * stride;
for ( var j = 0; j !== stride; ++ j ) {
values[ writeOffset + j ] = values[ readOffset + j ];
}
}
++ writeIndex;
}
}
// flush last keyframe (compaction looks ahead)
if ( lastIndex > 0 ) {
times[ writeIndex ] = times[ lastIndex ];
for ( var readOffset = lastIndex * stride, writeOffset = writeIndex * stride, j = 0; j !== stride; ++ j ) {
values[ writeOffset + j ] = values[ readOffset + j ];
}
++ writeIndex;
}
if ( writeIndex !== times.length ) {
this.times = AnimationUtils.arraySlice( times, 0, writeIndex );
this.values = AnimationUtils.arraySlice( values, 0, writeIndex * stride );
}
return this;
}
} );
/**
*
* A Track of vectored keyframe values.
*
*
* @author Ben Houston / http://clara.io/
* @author David Sarno / http://lighthaus.us/
* @author tschw
*/
function VectorKeyframeTrack( name, times, values, interpolation ) {
KeyframeTrack.call( this, name, times, values, interpolation );
}
VectorKeyframeTrack.prototype = Object.assign( Object.create( KeyframeTrack.prototype ), {
constructor: VectorKeyframeTrack,
ValueTypeName: 'vector'
// ValueBufferType is inherited
// DefaultInterpolation is inherited
} );
/**
*
* Reusable set of Tracks that represent an animation.
*
* @author Ben Houston / http://clara.io/
* @author David Sarno / http://lighthaus.us/
*/
function AnimationClip( name, duration, tracks ) {
this.name = name;
this.tracks = tracks;
this.duration = ( duration !== undefined ) ? duration : - 1;
this.uuid = _Math.generateUUID();
// this means it should figure out its duration by scanning the tracks
if ( this.duration < 0 ) {
this.resetDuration();
}
this.optimize();
}
Object.assign( AnimationClip, {
parse: function ( json ) {
var tracks = [],
jsonTracks = json.tracks,
frameTime = 1.0 / ( json.fps || 1.0 );
for ( var i = 0, n = jsonTracks.length; i !== n; ++ i ) {
tracks.push( KeyframeTrack.parse( jsonTracks[ i ] ).scale( frameTime ) );
}
return new AnimationClip( json.name, json.duration, tracks );
},
toJSON: function ( clip ) {
var tracks = [],
clipTracks = clip.tracks;
var json = {
'name': clip.name,
'duration': clip.duration,
'tracks': tracks
};
for ( var i = 0, n = clipTracks.length; i !== n; ++ i ) {
tracks.push( KeyframeTrack.toJSON( clipTracks[ i ] ) );
}
return json;
},
CreateFromMorphTargetSequence: function ( name, morphTargetSequence, fps, noLoop ) {
var numMorphTargets = morphTargetSequence.length;
var tracks = [];
for ( var i = 0; i < numMorphTargets; i ++ ) {
var times = [];
var values = [];
times.push(
( i + numMorphTargets - 1 ) % numMorphTargets,
i,
( i + 1 ) % numMorphTargets );
values.push( 0, 1, 0 );
var order = AnimationUtils.getKeyframeOrder( times );
times = AnimationUtils.sortedArray( times, 1, order );
values = AnimationUtils.sortedArray( values, 1, order );
// if there is a key at the first frame, duplicate it as the
// last frame as well for perfect loop.
if ( ! noLoop && times[ 0 ] === 0 ) {
times.push( numMorphTargets );
values.push( values[ 0 ] );
}
tracks.push(
new NumberKeyframeTrack(
'.morphTargetInfluences[' + morphTargetSequence[ i ].name + ']',
times, values
).scale( 1.0 / fps ) );
}
return new AnimationClip( name, - 1, tracks );
},
findByName: function ( objectOrClipArray, name ) {
var clipArray = objectOrClipArray;
if ( ! Array.isArray( objectOrClipArray ) ) {
var o = objectOrClipArray;
clipArray = o.geometry && o.geometry.animations || o.animations;
}
for ( var i = 0; i < clipArray.length; i ++ ) {
if ( clipArray[ i ].name === name ) {
return clipArray[ i ];
}
}
return null;
},
CreateClipsFromMorphTargetSequences: function ( morphTargets, fps, noLoop ) {
var animationToMorphTargets = {};
// tested with https://regex101.com/ on trick sequences
// such flamingo_flyA_003, flamingo_run1_003, crdeath0059
var pattern = /^([\w-]*?)([\d]+)$/;
// sort morph target names into animation groups based
// patterns like Walk_001, Walk_002, Run_001, Run_002
for ( var i = 0, il = morphTargets.length; i < il; i ++ ) {
var morphTarget = morphTargets[ i ];
var parts = morphTarget.name.match( pattern );
if ( parts && parts.length > 1 ) {
var name = parts[ 1 ];
var animationMorphTargets = animationToMorphTargets[ name ];
if ( ! animationMorphTargets ) {
animationToMorphTargets[ name ] = animationMorphTargets = [];
}
animationMorphTargets.push( morphTarget );
}
}
var clips = [];
for ( var name in animationToMorphTargets ) {
clips.push( AnimationClip.CreateFromMorphTargetSequence( name, animationToMorphTargets[ name ], fps, noLoop ) );
}
return clips;
},
// parse the animation.hierarchy format
parseAnimation: function ( animation, bones ) {
if ( ! animation ) {
console.error( 'THREE.AnimationClip: No animation in JSONLoader data.' );
return null;
}
var addNonemptyTrack = function ( trackType, trackName, animationKeys, propertyName, destTracks ) {
// only return track if there are actually keys.
if ( animationKeys.length !== 0 ) {
var times = [];
var values = [];
AnimationUtils.flattenJSON( animationKeys, times, values, propertyName );
// empty keys are filtered out, so check again
if ( times.length !== 0 ) {
destTracks.push( new trackType( trackName, times, values ) );
}
}
};
var tracks = [];
var clipName = animation.name || 'default';
// automatic length determination in AnimationClip.
var duration = animation.length || - 1;
var fps = animation.fps || 30;
var hierarchyTracks = animation.hierarchy || [];
for ( var h = 0; h < hierarchyTracks.length; h ++ ) {
var animationKeys = hierarchyTracks[ h ].keys;
// skip empty tracks
if ( ! animationKeys || animationKeys.length === 0 ) continue;
// process morph targets
if ( animationKeys[ 0 ].morphTargets ) {
// figure out all morph targets used in this track
var morphTargetNames = {};
for ( var k = 0; k < animationKeys.length; k ++ ) {
if ( animationKeys[ k ].morphTargets ) {
for ( var m = 0; m < animationKeys[ k ].morphTargets.length; m ++ ) {
morphTargetNames[ animationKeys[ k ].morphTargets[ m ] ] = - 1;
}
}
}
// create a track for each morph target with all zero
// morphTargetInfluences except for the keys in which
// the morphTarget is named.
for ( var morphTargetName in morphTargetNames ) {
var times = [];
var values = [];
for ( var m = 0; m !== animationKeys[ k ].morphTargets.length; ++ m ) {
var animationKey = animationKeys[ k ];
times.push( animationKey.time );
values.push( ( animationKey.morphTarget === morphTargetName ) ? 1 : 0 );
}
tracks.push( new NumberKeyframeTrack( '.morphTargetInfluence[' + morphTargetName + ']', times, values ) );
}
duration = morphTargetNames.length * ( fps || 1.0 );
} else {
// ...assume skeletal animation
var boneName = '.bones[' + bones[ h ].name + ']';
addNonemptyTrack(
VectorKeyframeTrack, boneName + '.position',
animationKeys, 'pos', tracks );
addNonemptyTrack(
QuaternionKeyframeTrack, boneName + '.quaternion',
animationKeys, 'rot', tracks );
addNonemptyTrack(
VectorKeyframeTrack, boneName + '.scale',
animationKeys, 'scl', tracks );
}
}
if ( tracks.length === 0 ) {
return null;
}
var clip = new AnimationClip( clipName, duration, tracks );
return clip;
}
} );
Object.assign( AnimationClip.prototype, {
resetDuration: function () {
var tracks = this.tracks, duration = 0;
for ( var i = 0, n = tracks.length; i !== n; ++ i ) {
var track = this.tracks[ i ];
duration = Math.max( duration, track.times[ track.times.length - 1 ] );
}
this.duration = duration;
},
trim: function () {
for ( var i = 0; i < this.tracks.length; i ++ ) {
this.tracks[ i ].trim( 0, this.duration );
}
return this;
},
optimize: function () {
for ( var i = 0; i < this.tracks.length; i ++ ) {
this.tracks[ i ].optimize();
}
return this;
}
} );
/**
* @author mrdoob / http://mrdoob.com/
*/
function MaterialLoader( manager ) {
this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;
this.textures = {};
}
Object.assign( MaterialLoader.prototype, {
load: function ( url, onLoad, onProgress, onError ) {
var scope = this;
var loader = new FileLoader( scope.manager );
loader.load( url, function ( text ) {
onLoad( scope.parse( JSON.parse( text ) ) );
}, onProgress, onError );
},
setTextures: function ( value ) {
this.textures = value;
},
parse: function ( json ) {
var textures = this.textures;
function getTexture( name ) {
if ( textures[ name ] === undefined ) {
console.warn( 'THREE.MaterialLoader: Undefined texture', name );
}
return textures[ name ];
}
var material = new Materials[ json.type ]();
if ( json.uuid !== undefined ) material.uuid = json.uuid;
if ( json.name !== undefined ) material.name = json.name;
if ( json.color !== undefined ) material.color.setHex( json.color );
if ( json.roughness !== undefined ) material.roughness = json.roughness;
if ( json.metalness !== undefined ) material.metalness = json.metalness;
if ( json.emissive !== undefined ) material.emissive.setHex( json.emissive );
if ( json.specular !== undefined ) material.specular.setHex( json.specular );
if ( json.shininess !== undefined ) material.shininess = json.shininess;
if ( json.clearCoat !== undefined ) material.clearCoat = json.clearCoat;
if ( json.clearCoatRoughness !== undefined ) material.clearCoatRoughness = json.clearCoatRoughness;
if ( json.uniforms !== undefined ) material.uniforms = json.uniforms;
if ( json.vertexShader !== undefined ) material.vertexShader = json.vertexShader;
if ( json.fragmentShader !== undefined ) material.fragmentShader = json.fragmentShader;
if ( json.vertexColors !== undefined ) material.vertexColors = json.vertexColors;
if ( json.fog !== undefined ) material.fog = json.fog;
if ( json.flatShading !== undefined ) material.flatShading = json.flatShading;
if ( json.blending !== undefined ) material.blending = json.blending;
if ( json.side !== undefined ) material.side = json.side;
if ( json.opacity !== undefined ) material.opacity = json.opacity;
if ( json.transparent !== undefined ) material.transparent = json.transparent;
if ( json.alphaTest !== undefined ) material.alphaTest = json.alphaTest;
if ( json.depthTest !== undefined ) material.depthTest = json.depthTest;
if ( json.depthWrite !== undefined ) material.depthWrite = json.depthWrite;
if ( json.colorWrite !== undefined ) material.colorWrite = json.colorWrite;
if ( json.wireframe !== undefined ) material.wireframe = json.wireframe;
if ( json.wireframeLinewidth !== undefined ) material.wireframeLinewidth = json.wireframeLinewidth;
if ( json.wireframeLinecap !== undefined ) material.wireframeLinecap = json.wireframeLinecap;
if ( json.wireframeLinejoin !== undefined ) material.wireframeLinejoin = json.wireframeLinejoin;
if ( json.rotation !== undefined ) material.rotation = json.rotation;
if ( json.linewidth !== 1 ) material.linewidth = json.linewidth;
if ( json.dashSize !== undefined ) material.dashSize = json.dashSize;
if ( json.gapSize !== undefined ) material.gapSize = json.gapSize;
if ( json.scale !== undefined ) material.scale = json.scale;
if ( json.polygonOffset !== undefined ) material.polygonOffset = json.polygonOffset;
if ( json.polygonOffsetFactor !== undefined ) material.polygonOffsetFactor = json.polygonOffsetFactor;
if ( json.polygonOffsetUnits !== undefined ) material.polygonOffsetUnits = json.polygonOffsetUnits;
if ( json.skinning !== undefined ) material.skinning = json.skinning;
if ( json.morphTargets !== undefined ) material.morphTargets = json.morphTargets;
if ( json.dithering !== undefined ) material.dithering = json.dithering;
if ( json.visible !== undefined ) material.visible = json.visible;
if ( json.userData !== undefined ) material.userData = json.userData;
// Deprecated
if ( json.shading !== undefined ) material.flatShading = json.shading === 1; // THREE.FlatShading
// for PointsMaterial
if ( json.size !== undefined ) material.size = json.size;
if ( json.sizeAttenuation !== undefined ) material.sizeAttenuation = json.sizeAttenuation;
// maps
if ( json.map !== undefined ) material.map = getTexture( json.map );
if ( json.alphaMap !== undefined ) {
material.alphaMap = getTexture( json.alphaMap );
material.transparent = true;
}
if ( json.bumpMap !== undefined ) material.bumpMap = getTexture( json.bumpMap );
if ( json.bumpScale !== undefined ) material.bumpScale = json.bumpScale;
if ( json.normalMap !== undefined ) material.normalMap = getTexture( json.normalMap );
if ( json.normalScale !== undefined ) {
var normalScale = json.normalScale;
if ( Array.isArray( normalScale ) === false ) {
// Blender exporter used to export a scalar. See #7459
normalScale = [ normalScale, normalScale ];
}
material.normalScale = new Vector2().fromArray( normalScale );
}
if ( json.displacementMap !== undefined ) material.displacementMap = getTexture( json.displacementMap );
if ( json.displacementScale !== undefined ) material.displacementScale = json.displacementScale;
if ( json.displacementBias !== undefined ) material.displacementBias = json.displacementBias;
if ( json.roughnessMap !== undefined ) material.roughnessMap = getTexture( json.roughnessMap );
if ( json.metalnessMap !== undefined ) material.metalnessMap = getTexture( json.metalnessMap );
if ( json.emissiveMap !== undefined ) material.emissiveMap = getTexture( json.emissiveMap );
if ( json.emissiveIntensity !== undefined ) material.emissiveIntensity = json.emissiveIntensity;
if ( json.specularMap !== undefined ) material.specularMap = getTexture( json.specularMap );
if ( json.envMap !== undefined ) material.envMap = getTexture( json.envMap );
if ( json.reflectivity !== undefined ) material.reflectivity = json.reflectivity;
if ( json.lightMap !== undefined ) material.lightMap = getTexture( json.lightMap );
if ( json.lightMapIntensity !== undefined ) material.lightMapIntensity = json.lightMapIntensity;
if ( json.aoMap !== undefined ) material.aoMap = getTexture( json.aoMap );
if ( json.aoMapIntensity !== undefined ) material.aoMapIntensity = json.aoMapIntensity;
if ( json.gradientMap !== undefined ) material.gradientMap = getTexture( json.gradientMap );
return material;
}
} );
/**
* @author mrdoob / http://mrdoob.com/
*/
function BufferGeometryLoader( manager ) {
this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;
}
Object.assign( BufferGeometryLoader.prototype, {
load: function ( url, onLoad, onProgress, onError ) {
var scope = this;
var loader = new FileLoader( scope.manager );
loader.load( url, function ( text ) {
onLoad( scope.parse( JSON.parse( text ) ) );
}, onProgress, onError );
},
parse: function ( json ) {
var geometry = new BufferGeometry();
var index = json.data.index;
if ( index !== undefined ) {
var typedArray = new TYPED_ARRAYS[ index.type ]( index.array );
geometry.setIndex( new BufferAttribute( typedArray, 1 ) );
}
var attributes = json.data.attributes;
for ( var key in attributes ) {
var attribute = attributes[ key ];
var typedArray = new TYPED_ARRAYS[ attribute.type ]( attribute.array );
geometry.addAttribute( key, new BufferAttribute( typedArray, attribute.itemSize, attribute.normalized ) );
}
var groups = json.data.groups || json.data.drawcalls || json.data.offsets;
if ( groups !== undefined ) {
for ( var i = 0, n = groups.length; i !== n; ++ i ) {
var group = groups[ i ];
geometry.addGroup( group.start, group.count, group.materialIndex );
}
}
var boundingSphere = json.data.boundingSphere;
if ( boundingSphere !== undefined ) {
var center = new Vector3();
if ( boundingSphere.center !== undefined ) {
center.fromArray( boundingSphere.center );
}
geometry.boundingSphere = new Sphere( center, boundingSphere.radius );
}
return geometry;
}
} );
var TYPED_ARRAYS = {
Int8Array: Int8Array,
Uint8Array: Uint8Array,
// Workaround for IE11 pre KB2929437. See #11440
Uint8ClampedArray: typeof Uint8ClampedArray !== 'undefined' ? Uint8ClampedArray : Uint8Array,
Int16Array: Int16Array,
Uint16Array: Uint16Array,
Int32Array: Int32Array,
Uint32Array: Uint32Array,
Float32Array: Float32Array,
Float64Array: Float64Array
};
/**
* @author alteredq / http://alteredqualia.com/
*/
function Loader() {}
Loader.Handlers = {
handlers: [],
add: function ( regex, loader ) {
this.handlers.push( regex, loader );
},
get: function ( file ) {
var handlers = this.handlers;
for ( var i = 0, l = handlers.length; i < l; i += 2 ) {
var regex = handlers[ i ];
var loader = handlers[ i + 1 ];
if ( regex.test( file ) ) {
return loader;
}
}
return null;
}
};
Object.assign( Loader.prototype, {
crossOrigin: undefined,
onLoadStart: function () {},
onLoadProgress: function () {},
onLoadComplete: function () {},
initMaterials: function ( materials, texturePath, crossOrigin ) {
var array = [];
for ( var i = 0; i < materials.length; ++ i ) {
array[ i ] = this.createMaterial( materials[ i ], texturePath, crossOrigin );
}
return array;
},
createMaterial: ( function () {
var BlendingMode = {
NoBlending: NoBlending,
NormalBlending: NormalBlending,
AdditiveBlending: AdditiveBlending,
SubtractiveBlending: SubtractiveBlending,
MultiplyBlending: MultiplyBlending,
CustomBlending: CustomBlending
};
var color = new Color();
var textureLoader = new TextureLoader();
var materialLoader = new MaterialLoader();
return function createMaterial( m, texturePath, crossOrigin ) {
// convert from old material format
var textures = {};
function loadTexture( path, repeat, offset, wrap, anisotropy ) {
var fullPath = texturePath + path;
var loader = Loader.Handlers.get( fullPath );
var texture;
if ( loader !== null ) {
texture = loader.load( fullPath );
} else {
textureLoader.setCrossOrigin( crossOrigin );
texture = textureLoader.load( fullPath );
}
if ( repeat !== undefined ) {
texture.repeat.fromArray( repeat );
if ( repeat[ 0 ] !== 1 ) texture.wrapS = RepeatWrapping;
if ( repeat[ 1 ] !== 1 ) texture.wrapT = RepeatWrapping;
}
if ( offset !== undefined ) {
texture.offset.fromArray( offset );
}
if ( wrap !== undefined ) {
if ( wrap[ 0 ] === 'repeat' ) texture.wrapS = RepeatWrapping;
if ( wrap[ 0 ] === 'mirror' ) texture.wrapS = MirroredRepeatWrapping;
if ( wrap[ 1 ] === 'repeat' ) texture.wrapT = RepeatWrapping;
if ( wrap[ 1 ] === 'mirror' ) texture.wrapT = MirroredRepeatWrapping;
}
if ( anisotropy !== undefined ) {
texture.anisotropy = anisotropy;
}
var uuid = _Math.generateUUID();
textures[ uuid ] = texture;
return uuid;
}
//
var json = {
uuid: _Math.generateUUID(),
type: 'MeshLambertMaterial'
};
for ( var name in m ) {
var value = m[ name ];
switch ( name ) {
case 'DbgColor':
case 'DbgIndex':
case 'opticalDensity':
case 'illumination':
break;
case 'DbgName':
json.name = value;
break;
case 'blending':
json.blending = BlendingMode[ value ];
break;
case 'colorAmbient':
case 'mapAmbient':
console.warn( 'THREE.Loader.createMaterial:', name, 'is no longer supported.' );
break;
case 'colorDiffuse':
json.color = color.fromArray( value ).getHex();
break;
case 'colorSpecular':
json.specular = color.fromArray( value ).getHex();
break;
case 'colorEmissive':
json.emissive = color.fromArray( value ).getHex();
break;
case 'specularCoef':
json.shininess = value;
break;
case 'shading':
if ( value.toLowerCase() === 'basic' ) json.type = 'MeshBasicMaterial';
if ( value.toLowerCase() === 'phong' ) json.type = 'MeshPhongMaterial';
if ( value.toLowerCase() === 'standard' ) json.type = 'MeshStandardMaterial';
break;
case 'mapDiffuse':
json.map = loadTexture( value, m.mapDiffuseRepeat, m.mapDiffuseOffset, m.mapDiffuseWrap, m.mapDiffuseAnisotropy );
break;
case 'mapDiffuseRepeat':
case 'mapDiffuseOffset':
case 'mapDiffuseWrap':
case 'mapDiffuseAnisotropy':
break;
case 'mapEmissive':
json.emissiveMap = loadTexture( value, m.mapEmissiveRepeat, m.mapEmissiveOffset, m.mapEmissiveWrap, m.mapEmissiveAnisotropy );
break;
case 'mapEmissiveRepeat':
case 'mapEmissiveOffset':
case 'mapEmissiveWrap':
case 'mapEmissiveAnisotropy':
break;
case 'mapLight':
json.lightMap = loadTexture( value, m.mapLightRepeat, m.mapLightOffset, m.mapLightWrap, m.mapLightAnisotropy );
break;
case 'mapLightRepeat':
case 'mapLightOffset':
case 'mapLightWrap':
case 'mapLightAnisotropy':
break;
case 'mapAO':
json.aoMap = loadTexture( value, m.mapAORepeat, m.mapAOOffset, m.mapAOWrap, m.mapAOAnisotropy );
break;
case 'mapAORepeat':
case 'mapAOOffset':
case 'mapAOWrap':
case 'mapAOAnisotropy':
break;
case 'mapBump':
json.bumpMap = loadTexture( value, m.mapBumpRepeat, m.mapBumpOffset, m.mapBumpWrap, m.mapBumpAnisotropy );
break;
case 'mapBumpScale':
json.bumpScale = value;
break;
case 'mapBumpRepeat':
case 'mapBumpOffset':
case 'mapBumpWrap':
case 'mapBumpAnisotropy':
break;
case 'mapNormal':
json.normalMap = loadTexture( value, m.mapNormalRepeat, m.mapNormalOffset, m.mapNormalWrap, m.mapNormalAnisotropy );
break;
case 'mapNormalFactor':
json.normalScale = value;
break;
case 'mapNormalRepeat':
case 'mapNormalOffset':
case 'mapNormalWrap':
case 'mapNormalAnisotropy':
break;
case 'mapSpecular':
json.specularMap = loadTexture( value, m.mapSpecularRepeat, m.mapSpecularOffset, m.mapSpecularWrap, m.mapSpecularAnisotropy );
break;
case 'mapSpecularRepeat':
case 'mapSpecularOffset':
case 'mapSpecularWrap':
case 'mapSpecularAnisotropy':
break;
case 'mapMetalness':
json.metalnessMap = loadTexture( value, m.mapMetalnessRepeat, m.mapMetalnessOffset, m.mapMetalnessWrap, m.mapMetalnessAnisotropy );
break;
case 'mapMetalnessRepeat':
case 'mapMetalnessOffset':
case 'mapMetalnessWrap':
case 'mapMetalnessAnisotropy':
break;
case 'mapRoughness':
json.roughnessMap = loadTexture( value, m.mapRoughnessRepeat, m.mapRoughnessOffset, m.mapRoughnessWrap, m.mapRoughnessAnisotropy );
break;
case 'mapRoughnessRepeat':
case 'mapRoughnessOffset':
case 'mapRoughnessWrap':
case 'mapRoughnessAnisotropy':
break;
case 'mapAlpha':
json.alphaMap = loadTexture( value, m.mapAlphaRepeat, m.mapAlphaOffset, m.mapAlphaWrap, m.mapAlphaAnisotropy );
break;
case 'mapAlphaRepeat':
case 'mapAlphaOffset':
case 'mapAlphaWrap':
case 'mapAlphaAnisotropy':
break;
case 'flipSided':
json.side = BackSide;
break;
case 'doubleSided':
json.side = DoubleSide;
break;
case 'transparency':
console.warn( 'THREE.Loader.createMaterial: transparency has been renamed to opacity' );
json.opacity = value;
break;
case 'depthTest':
case 'depthWrite':
case 'colorWrite':
case 'opacity':
case 'reflectivity':
case 'transparent':
case 'visible':
case 'wireframe':
json[ name ] = value;
break;
case 'vertexColors':
if ( value === true ) json.vertexColors = VertexColors;
if ( value === 'face' ) json.vertexColors = FaceColors;
break;
default:
console.error( 'THREE.Loader.createMaterial: Unsupported', name, value );
break;
}
}
if ( json.type === 'MeshBasicMaterial' ) delete json.emissive;
if ( json.type !== 'MeshPhongMaterial' ) delete json.specular;
if ( json.opacity < 1 ) json.transparent = true;
materialLoader.setTextures( textures );
return materialLoader.parse( json );
};
} )()
} );
/**
* @author Don McCurdy / https://www.donmccurdy.com
*/
var LoaderUtils = {
decodeText: function ( array ) {
if ( typeof TextDecoder !== 'undefined' ) {
return new TextDecoder().decode( array );
}
// Avoid the String.fromCharCode.apply(null, array) shortcut, which
// throws a "maximum call stack size exceeded" error for large arrays.
var s = '';
for ( var i = 0, il = array.length; i < il; i ++ ) {
// Implicitly assumes little-endian.
s += String.fromCharCode( array[ i ] );
}
// Merges multi-byte utf-8 characters.
return decodeURIComponent( escape( s ) );
},
extractUrlBase: function ( url ) {
var index = url.lastIndexOf( '/' );
if ( index === - 1 ) return './';
return url.substr( 0, index + 1 );
}
};
/**
* @author mrdoob / http://mrdoob.com/
* @author alteredq / http://alteredqualia.com/
*/
function JSONLoader( manager ) {
if ( typeof manager === 'boolean' ) {
console.warn( 'THREE.JSONLoader: showStatus parameter has been removed from constructor.' );
manager = undefined;
}
this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;
this.withCredentials = false;
}
Object.assign( JSONLoader.prototype, {
load: function ( url, onLoad, onProgress, onError ) {
var scope = this;
var texturePath = this.texturePath && ( typeof this.texturePath === 'string' ) ? this.texturePath : LoaderUtils.extractUrlBase( url );
var loader = new FileLoader( this.manager );
loader.setWithCredentials( this.withCredentials );
loader.load( url, function ( text ) {
var json = JSON.parse( text );
var metadata = json.metadata;
if ( metadata !== undefined ) {
var type = metadata.type;
if ( type !== undefined ) {
if ( type.toLowerCase() === 'object' ) {
console.error( 'THREE.JSONLoader: ' + url + ' should be loaded with THREE.ObjectLoader instead.' );
return;
}
}
}
var object = scope.parse( json, texturePath );
onLoad( object.geometry, object.materials );
}, onProgress, onError );
},
setTexturePath: function ( value ) {
this.texturePath = value;
},
parse: ( function () {
function parseModel( json, geometry ) {
function isBitSet( value, position ) {
return value & ( 1 << position );
}
var i, j, fi,
offset, zLength,
colorIndex, normalIndex, uvIndex, materialIndex,
type,
isQuad,
hasMaterial,
hasFaceVertexUv,
hasFaceNormal, hasFaceVertexNormal,
hasFaceColor, hasFaceVertexColor,
vertex, face, faceA, faceB, hex, normal,
uvLayer, uv, u, v,
faces = json.faces,
vertices = json.vertices,
normals = json.normals,
colors = json.colors,
scale = json.scale,
nUvLayers = 0;
if ( json.uvs !== undefined ) {
// disregard empty arrays
for ( i = 0; i < json.uvs.length; i ++ ) {
if ( json.uvs[ i ].length ) nUvLayers ++;
}
for ( i = 0; i < nUvLayers; i ++ ) {
geometry.faceVertexUvs[ i ] = [];
}
}
offset = 0;
zLength = vertices.length;
while ( offset < zLength ) {
vertex = new Vector3();
vertex.x = vertices[ offset ++ ] * scale;
vertex.y = vertices[ offset ++ ] * scale;
vertex.z = vertices[ offset ++ ] * scale;
geometry.vertices.push( vertex );
}
offset = 0;
zLength = faces.length;
while ( offset < zLength ) {
type = faces[ offset ++ ];
isQuad = isBitSet( type, 0 );
hasMaterial = isBitSet( type, 1 );
hasFaceVertexUv = isBitSet( type, 3 );
hasFaceNormal = isBitSet( type, 4 );
hasFaceVertexNormal = isBitSet( type, 5 );
hasFaceColor = isBitSet( type, 6 );
hasFaceVertexColor = isBitSet( type, 7 );
// console.log("type", type, "bits", isQuad, hasMaterial, hasFaceVertexUv, hasFaceNormal, hasFaceVertexNormal, hasFaceColor, hasFaceVertexColor);
if ( isQuad ) {
faceA = new Face3();
faceA.a = faces[ offset ];
faceA.b = faces[ offset + 1 ];
faceA.c = faces[ offset + 3 ];
faceB = new Face3();
faceB.a = faces[ offset + 1 ];
faceB.b = faces[ offset + 2 ];
faceB.c = faces[ offset + 3 ];
offset += 4;
if ( hasMaterial ) {
materialIndex = faces[ offset ++ ];
faceA.materialIndex = materialIndex;
faceB.materialIndex = materialIndex;
}
// to get face <=> uv index correspondence
fi = geometry.faces.length;
if ( hasFaceVertexUv ) {
for ( i = 0; i < nUvLayers; i ++ ) {
uvLayer = json.uvs[ i ];
geometry.faceVertexUvs[ i ][ fi ] = [];
geometry.faceVertexUvs[ i ][ fi + 1 ] = [];
for ( j = 0; j < 4; j ++ ) {
uvIndex = faces[ offset ++ ];
u = uvLayer[ uvIndex * 2 ];
v = uvLayer[ uvIndex * 2 + 1 ];
uv = new Vector2( u, v );
if ( j !== 2 ) geometry.faceVertexUvs[ i ][ fi ].push( uv );
if ( j !== 0 ) geometry.faceVertexUvs[ i ][ fi + 1 ].push( uv );
}
}
}
if ( hasFaceNormal ) {
normalIndex = faces[ offset ++ ] * 3;
faceA.normal.set(
normals[ normalIndex ++ ],
normals[ normalIndex ++ ],
normals[ normalIndex ]
);
faceB.normal.copy( faceA.normal );
}
if ( hasFaceVertexNormal ) {
for ( i = 0; i < 4; i ++ ) {
normalIndex = faces[ offset ++ ] * 3;
normal = new Vector3(
normals[ normalIndex ++ ],
normals[ normalIndex ++ ],
normals[ normalIndex ]
);
if ( i !== 2 ) faceA.vertexNormals.push( normal );
if ( i !== 0 ) faceB.vertexNormals.push( normal );
}
}
if ( hasFaceColor ) {
colorIndex = faces[ offset ++ ];
hex = colors[ colorIndex ];
faceA.color.setHex( hex );
faceB.color.setHex( hex );
}
if ( hasFaceVertexColor ) {
for ( i = 0; i < 4; i ++ ) {
colorIndex = faces[ offset ++ ];
hex = colors[ colorIndex ];
if ( i !== 2 ) faceA.vertexColors.push( new Color( hex ) );
if ( i !== 0 ) faceB.vertexColors.push( new Color( hex ) );
}
}
geometry.faces.push( faceA );
geometry.faces.push( faceB );
} else {
face = new Face3();
face.a = faces[ offset ++ ];
face.b = faces[ offset ++ ];
face.c = faces[ offset ++ ];
if ( hasMaterial ) {
materialIndex = faces[ offset ++ ];
face.materialIndex = materialIndex;
}
// to get face <=> uv index correspondence
fi = geometry.faces.length;
if ( hasFaceVertexUv ) {
for ( i = 0; i < nUvLayers; i ++ ) {
uvLayer = json.uvs[ i ];
geometry.faceVertexUvs[ i ][ fi ] = [];
for ( j = 0; j < 3; j ++ ) {
uvIndex = faces[ offset ++ ];
u = uvLayer[ uvIndex * 2 ];
v = uvLayer[ uvIndex * 2 + 1 ];
uv = new Vector2( u, v );
geometry.faceVertexUvs[ i ][ fi ].push( uv );
}
}
}
if ( hasFaceNormal ) {
normalIndex = faces[ offset ++ ] * 3;
face.normal.set(
normals[ normalIndex ++ ],
normals[ normalIndex ++ ],
normals[ normalIndex ]
);
}
if ( hasFaceVertexNormal ) {
for ( i = 0; i < 3; i ++ ) {
normalIndex = faces[ offset ++ ] * 3;
normal = new Vector3(
normals[ normalIndex ++ ],
normals[ normalIndex ++ ],
normals[ normalIndex ]
);
face.vertexNormals.push( normal );
}
}
if ( hasFaceColor ) {
colorIndex = faces[ offset ++ ];
face.color.setHex( colors[ colorIndex ] );
}
if ( hasFaceVertexColor ) {
for ( i = 0; i < 3; i ++ ) {
colorIndex = faces[ offset ++ ];
face.vertexColors.push( new Color( colors[ colorIndex ] ) );
}
}
geometry.faces.push( face );
}
}
}
function parseSkin( json, geometry ) {
var influencesPerVertex = ( json.influencesPerVertex !== undefined ) ? json.influencesPerVertex : 2;
if ( json.skinWeights ) {
for ( var i = 0, l = json.skinWeights.length; i < l; i += influencesPerVertex ) {
var x = json.skinWeights[ i ];
var y = ( influencesPerVertex > 1 ) ? json.skinWeights[ i + 1 ] : 0;
var z = ( influencesPerVertex > 2 ) ? json.skinWeights[ i + 2 ] : 0;
var w = ( influencesPerVertex > 3 ) ? json.skinWeights[ i + 3 ] : 0;
geometry.skinWeights.push( new Vector4( x, y, z, w ) );
}
}
if ( json.skinIndices ) {
for ( var i = 0, l = json.skinIndices.length; i < l; i += influencesPerVertex ) {
var a = json.skinIndices[ i ];
var b = ( influencesPerVertex > 1 ) ? json.skinIndices[ i + 1 ] : 0;
var c = ( influencesPerVertex > 2 ) ? json.skinIndices[ i + 2 ] : 0;
var d = ( influencesPerVertex > 3 ) ? json.skinIndices[ i + 3 ] : 0;
geometry.skinIndices.push( new Vector4( a, b, c, d ) );
}
}
geometry.bones = json.bones;
if ( geometry.bones && geometry.bones.length > 0 && ( geometry.skinWeights.length !== geometry.skinIndices.length || geometry.skinIndices.length !== geometry.vertices.length ) ) {
console.warn( 'When skinning, number of vertices (' + geometry.vertices.length + '), skinIndices (' +
geometry.skinIndices.length + '), and skinWeights (' + geometry.skinWeights.length + ') should match.' );
}
}
function parseMorphing( json, geometry ) {
var scale = json.scale;
if ( json.morphTargets !== undefined ) {
for ( var i = 0, l = json.morphTargets.length; i < l; i ++ ) {
geometry.morphTargets[ i ] = {};
geometry.morphTargets[ i ].name = json.morphTargets[ i ].name;
geometry.morphTargets[ i ].vertices = [];
var dstVertices = geometry.morphTargets[ i ].vertices;
var srcVertices = json.morphTargets[ i ].vertices;
for ( var v = 0, vl = srcVertices.length; v < vl; v += 3 ) {
var vertex = new Vector3();
vertex.x = srcVertices[ v ] * scale;
vertex.y = srcVertices[ v + 1 ] * scale;
vertex.z = srcVertices[ v + 2 ] * scale;
dstVertices.push( vertex );
}
}
}
if ( json.morphColors !== undefined && json.morphColors.length > 0 ) {
console.warn( 'THREE.JSONLoader: "morphColors" no longer supported. Using them as face colors.' );
var faces = geometry.faces;
var morphColors = json.morphColors[ 0 ].colors;
for ( var i = 0, l = faces.length; i < l; i ++ ) {
faces[ i ].color.fromArray( morphColors, i * 3 );
}
}
}
function parseAnimations( json, geometry ) {
var outputAnimations = [];
// parse old style Bone/Hierarchy animations
var animations = [];
if ( json.animation !== undefined ) {
animations.push( json.animation );
}
if ( json.animations !== undefined ) {
if ( json.animations.length ) {
animations = animations.concat( json.animations );
} else {
animations.push( json.animations );
}
}
for ( var i = 0; i < animations.length; i ++ ) {
var clip = AnimationClip.parseAnimation( animations[ i ], geometry.bones );
if ( clip ) outputAnimations.push( clip );
}
// parse implicit morph animations
if ( geometry.morphTargets ) {
// TODO: Figure out what an appropraite FPS is for morph target animations -- defaulting to 10, but really it is completely arbitrary.
var morphAnimationClips = AnimationClip.CreateClipsFromMorphTargetSequences( geometry.morphTargets, 10 );
outputAnimations = outputAnimations.concat( morphAnimationClips );
}
if ( outputAnimations.length > 0 ) geometry.animations = outputAnimations;
}
return function parse( json, texturePath ) {
if ( json.data !== undefined ) {
// Geometry 4.0 spec
json = json.data;
}
if ( json.scale !== undefined ) {
json.scale = 1.0 / json.scale;
} else {
json.scale = 1.0;
}
var geometry = new Geometry();
parseModel( json, geometry );
parseSkin( json, geometry );
parseMorphing( json, geometry );
parseAnimations( json, geometry );
geometry.computeFaceNormals();
geometry.computeBoundingSphere();
if ( json.materials === undefined || json.materials.length === 0 ) {
return { geometry: geometry };
} else {
var materials = Loader.prototype.initMaterials( json.materials, texturePath, this.crossOrigin );
return { geometry: geometry, materials: materials };
}
};
} )()
} );
/**
* @author mrdoob / http://mrdoob.com/
*/
function ObjectLoader( manager ) {
this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;
this.texturePath = '';
}
Object.assign( ObjectLoader.prototype, {
load: function ( url, onLoad, onProgress, onError ) {
if ( this.texturePath === '' ) {
this.texturePath = url.substring( 0, url.lastIndexOf( '/' ) + 1 );
}
var scope = this;
var loader = new FileLoader( scope.manager );
loader.load( url, function ( text ) {
var json = null;
try {
json = JSON.parse( text );
} catch ( error ) {
if ( onError !== undefined ) onError( error );
console.error( 'THREE:ObjectLoader: Can\'t parse ' + url + '.', error.message );
return;
}
var metadata = json.metadata;
if ( metadata === undefined || metadata.type === undefined || metadata.type.toLowerCase() === 'geometry' ) {
console.error( 'THREE.ObjectLoader: Can\'t load ' + url + '. Use THREE.JSONLoader instead.' );
return;
}
scope.parse( json, onLoad );
}, onProgress, onError );
},
setTexturePath: function ( value ) {
this.texturePath = value;
},
setCrossOrigin: function ( value ) {
this.crossOrigin = value;
},
parse: function ( json, onLoad ) {
var shapes = this.parseShape( json.shapes );
var geometries = this.parseGeometries( json.geometries, shapes );
var images = this.parseImages( json.images, function () {
if ( onLoad !== undefined ) onLoad( object );
} );
var textures = this.parseTextures( json.textures, images );
var materials = this.parseMaterials( json.materials, textures );
var object = this.parseObject( json.object, geometries, materials );
if ( json.animations ) {
object.animations = this.parseAnimations( json.animations );
}
if ( json.images === undefined || json.images.length === 0 ) {
if ( onLoad !== undefined ) onLoad( object );
}
return object;
},
parseShape: function ( json ) {
var shapes = {};
if ( json !== undefined ) {
for ( var i = 0, l = json.length; i < l; i ++ ) {
var shape = new Shape().fromJSON( json[ i ] );
shapes[ shape.uuid ] = shape;
}
}
return shapes;
},
parseGeometries: function ( json, shapes ) {
var geometries = {};
if ( json !== undefined ) {
var geometryLoader = new JSONLoader();
var bufferGeometryLoader = new BufferGeometryLoader();
for ( var i = 0, l = json.length; i < l; i ++ ) {
var geometry;
var data = json[ i ];
switch ( data.type ) {
case 'PlaneGeometry':
case 'PlaneBufferGeometry':
geometry = new Geometries[ data.type ](
data.width,
data.height,
data.widthSegments,
data.heightSegments
);
break;
case 'BoxGeometry':
case 'BoxBufferGeometry':
case 'CubeGeometry': // backwards compatible
geometry = new Geometries[ data.type ](
data.width,
data.height,
data.depth,
data.widthSegments,
data.heightSegments,
data.depthSegments
);
break;
case 'CircleGeometry':
case 'CircleBufferGeometry':
geometry = new Geometries[ data.type ](
data.radius,
data.segments,
data.thetaStart,
data.thetaLength
);
break;
case 'CylinderGeometry':
case 'CylinderBufferGeometry':
geometry = new Geometries[ data.type ](
data.radiusTop,
data.radiusBottom,
data.height,
data.radialSegments,
data.heightSegments,
data.openEnded,
data.thetaStart,
data.thetaLength
);
break;
case 'ConeGeometry':
case 'ConeBufferGeometry':
geometry = new Geometries[ data.type ](
data.radius,
data.height,
data.radialSegments,
data.heightSegments,
data.openEnded,
data.thetaStart,
data.thetaLength
);
break;
case 'SphereGeometry':
case 'SphereBufferGeometry':
geometry = new Geometries[ data.type ](
data.radius,
data.widthSegments,
data.heightSegments,
data.phiStart,
data.phiLength,
data.thetaStart,
data.thetaLength
);
break;
case 'DodecahedronGeometry':
case 'DodecahedronBufferGeometry':
case 'IcosahedronGeometry':
case 'IcosahedronBufferGeometry':
case 'OctahedronGeometry':
case 'OctahedronBufferGeometry':
case 'TetrahedronGeometry':
case 'TetrahedronBufferGeometry':
geometry = new Geometries[ data.type ](
data.radius,
data.detail
);
break;
case 'RingGeometry':
case 'RingBufferGeometry':
geometry = new Geometries[ data.type ](
data.innerRadius,
data.outerRadius,
data.thetaSegments,
data.phiSegments,
data.thetaStart,
data.thetaLength
);
break;
case 'TorusGeometry':
case 'TorusBufferGeometry':
geometry = new Geometries[ data.type ](
data.radius,
data.tube,
data.radialSegments,
data.tubularSegments,
data.arc
);
break;
case 'TorusKnotGeometry':
case 'TorusKnotBufferGeometry':
geometry = new Geometries[ data.type ](
data.radius,
data.tube,
data.tubularSegments,
data.radialSegments,
data.p,
data.q
);
break;
case 'LatheGeometry':
case 'LatheBufferGeometry':
geometry = new Geometries[ data.type ](
data.points,
data.segments,
data.phiStart,
data.phiLength
);
break;
case 'PolyhedronGeometry':
case 'PolyhedronBufferGeometry':
geometry = new Geometries[ data.type ](
data.vertices,
data.indices,
data.radius,
data.details
);
break;
case 'ShapeGeometry':
case 'ShapeBufferGeometry':
var geometryShapes = [];
for ( var j = 0, jl = data.shapes.length; j < jl; j ++ ) {
var shape = shapes[ data.shapes[ j ] ];
geometryShapes.push( shape );
}
geometry = new Geometries[ data.type ](
geometryShapes,
data.curveSegments
);
break;
case 'BufferGeometry':
geometry = bufferGeometryLoader.parse( data );
break;
case 'Geometry':
geometry = geometryLoader.parse( data, this.texturePath ).geometry;
break;
default:
console.warn( 'THREE.ObjectLoader: Unsupported geometry type "' + data.type + '"' );
continue;
}
geometry.uuid = data.uuid;
if ( data.name !== undefined ) geometry.name = data.name;
geometries[ data.uuid ] = geometry;
}
}
return geometries;
},
parseMaterials: function ( json, textures ) {
var materials = {};
if ( json !== undefined ) {
var loader = new MaterialLoader();
loader.setTextures( textures );
for ( var i = 0, l = json.length; i < l; i ++ ) {
var data = json[ i ];
if ( data.type === 'MultiMaterial' ) {
// Deprecated
var array = [];
for ( var j = 0; j < data.materials.length; j ++ ) {
array.push( loader.parse( data.materials[ j ] ) );
}
materials[ data.uuid ] = array;
} else {
materials[ data.uuid ] = loader.parse( data );
}
}
}
return materials;
},
parseAnimations: function ( json ) {
var animations = [];
for ( var i = 0; i < json.length; i ++ ) {
var clip = AnimationClip.parse( json[ i ] );
animations.push( clip );
}
return animations;
},
parseImages: function ( json, onLoad ) {
var scope = this;
var images = {};
function loadImage( url ) {
scope.manager.itemStart( url );
return loader.load( url, function () {
scope.manager.itemEnd( url );
}, undefined, function () {
scope.manager.itemEnd( url );
scope.manager.itemError( url );
} );
}
if ( json !== undefined && json.length > 0 ) {
var manager = new LoadingManager( onLoad );
var loader = new ImageLoader( manager );
loader.setCrossOrigin( this.crossOrigin );
for ( var i = 0, l = json.length; i < l; i ++ ) {
var image = json[ i ];
var path = /^(\/\/)|([a-z]+:(\/\/)?)/i.test( image.url ) ? image.url : scope.texturePath + image.url;
images[ image.uuid ] = loadImage( path );
}
}
return images;
},
parseTextures: function ( json, images ) {
function parseConstant( value, type ) {
if ( typeof value === 'number' ) return value;
console.warn( 'THREE.ObjectLoader.parseTexture: Constant should be in numeric form.', value );
return type[ value ];
}
var textures = {};
if ( json !== undefined ) {
for ( var i = 0, l = json.length; i < l; i ++ ) {
var data = json[ i ];
if ( data.image === undefined ) {
console.warn( 'THREE.ObjectLoader: No "image" specified for', data.uuid );
}
if ( images[ data.image ] === undefined ) {
console.warn( 'THREE.ObjectLoader: Undefined image', data.image );
}
var texture = new Texture( images[ data.image ] );
texture.needsUpdate = true;
texture.uuid = data.uuid;
if ( data.name !== undefined ) texture.name = data.name;
if ( data.mapping !== undefined ) texture.mapping = parseConstant( data.mapping, TEXTURE_MAPPING );
if ( data.offset !== undefined ) texture.offset.fromArray( data.offset );
if ( data.repeat !== undefined ) texture.repeat.fromArray( data.repeat );
if ( data.center !== undefined ) texture.center.fromArray( data.center );
if ( data.rotation !== undefined ) texture.rotation = data.rotation;
if ( data.wrap !== undefined ) {
texture.wrapS = parseConstant( data.wrap[ 0 ], TEXTURE_WRAPPING );
texture.wrapT = parseConstant( data.wrap[ 1 ], TEXTURE_WRAPPING );
}
if ( data.format !== undefined ) texture.format = data.format;
if ( data.minFilter !== undefined ) texture.minFilter = parseConstant( data.minFilter, TEXTURE_FILTER );
if ( data.magFilter !== undefined ) texture.magFilter = parseConstant( data.magFilter, TEXTURE_FILTER );
if ( data.anisotropy !== undefined ) texture.anisotropy = data.anisotropy;
if ( data.flipY !== undefined ) texture.flipY = data.flipY;
textures[ data.uuid ] = texture;
}
}
return textures;
},
parseObject: function ( data, geometries, materials ) {
var object;
function getGeometry( name ) {
if ( geometries[ name ] === undefined ) {
console.warn( 'THREE.ObjectLoader: Undefined geometry', name );
}
return geometries[ name ];
}
function getMaterial( name ) {
if ( name === undefined ) return undefined;
if ( Array.isArray( name ) ) {
var array = [];
for ( var i = 0, l = name.length; i < l; i ++ ) {
var uuid = name[ i ];
if ( materials[ uuid ] === undefined ) {
console.warn( 'THREE.ObjectLoader: Undefined material', uuid );
}
array.push( materials[ uuid ] );
}
return array;
}
if ( materials[ name ] === undefined ) {
console.warn( 'THREE.ObjectLoader: Undefined material', name );
}
return materials[ name ];
}
switch ( data.type ) {
case 'Scene':
object = new Scene();
if ( data.background !== undefined ) {
if ( Number.isInteger( data.background ) ) {
object.background = new Color( data.background );
}
}
if ( data.fog !== undefined ) {
if ( data.fog.type === 'Fog' ) {
object.fog = new Fog( data.fog.color, data.fog.near, data.fog.far );
} else if ( data.fog.type === 'FogExp2' ) {
object.fog = new FogExp2( data.fog.color, data.fog.density );
}
}
break;
case 'PerspectiveCamera':
object = new PerspectiveCamera( data.fov, data.aspect, data.near, data.far );
if ( data.focus !== undefined ) object.focus = data.focus;
if ( data.zoom !== undefined ) object.zoom = data.zoom;
if ( data.filmGauge !== undefined ) object.filmGauge = data.filmGauge;
if ( data.filmOffset !== undefined ) object.filmOffset = data.filmOffset;
if ( data.view !== undefined ) object.view = Object.assign( {}, data.view );
break;
case 'OrthographicCamera':
object = new OrthographicCamera( data.left, data.right, data.top, data.bottom, data.near, data.far );
if ( data.zoom !== undefined ) object.zoom = data.zoom;
if ( data.view !== undefined ) object.view = Object.assign( {}, data.view );
break;
case 'AmbientLight':
object = new AmbientLight( data.color, data.intensity );
break;
case 'DirectionalLight':
object = new DirectionalLight( data.color, data.intensity );
break;
case 'PointLight':
object = new PointLight( data.color, data.intensity, data.distance, data.decay );
break;
case 'RectAreaLight':
object = new RectAreaLight( data.color, data.intensity, data.width, data.height );
break;
case 'SpotLight':
object = new SpotLight( data.color, data.intensity, data.distance, data.angle, data.penumbra, data.decay );
break;
case 'HemisphereLight':
object = new HemisphereLight( data.color, data.groundColor, data.intensity );
break;
case 'SkinnedMesh':
console.warn( 'THREE.ObjectLoader.parseObject() does not support SkinnedMesh yet.' );
case 'Mesh':
var geometry = getGeometry( data.geometry );
var material = getMaterial( data.material );
if ( geometry.bones && geometry.bones.length > 0 ) {
object = new SkinnedMesh( geometry, material );
} else {
object = new Mesh( geometry, material );
}
break;
case 'LOD':
object = new LOD();
break;
case 'Line':
object = new Line( getGeometry( data.geometry ), getMaterial( data.material ), data.mode );
break;
case 'LineLoop':
object = new LineLoop( getGeometry( data.geometry ), getMaterial( data.material ) );
break;
case 'LineSegments':
object = new LineSegments( getGeometry( data.geometry ), getMaterial( data.material ) );
break;
case 'PointCloud':
case 'Points':
object = new Points( getGeometry( data.geometry ), getMaterial( data.material ) );
break;
case 'Sprite':
object = new Sprite( getMaterial( data.material ) );
break;
case 'Group':
object = new Group();
break;
default:
object = new Object3D();
}
object.uuid = data.uuid;
if ( data.name !== undefined ) object.name = data.name;
if ( data.matrix !== undefined ) {
object.matrix.fromArray( data.matrix );
if ( data.matrixAutoUpdate !== undefined ) object.matrixAutoUpdate = data.matrixAutoUpdate;
if ( object.matrixAutoUpdate ) object.matrix.decompose( object.position, object.quaternion, object.scale );
} else {
if ( data.position !== undefined ) object.position.fromArray( data.position );
if ( data.rotation !== undefined ) object.rotation.fromArray( data.rotation );
if ( data.quaternion !== undefined ) object.quaternion.fromArray( data.quaternion );
if ( data.scale !== undefined ) object.scale.fromArray( data.scale );
}
if ( data.castShadow !== undefined ) object.castShadow = data.castShadow;
if ( data.receiveShadow !== undefined ) object.receiveShadow = data.receiveShadow;
if ( data.shadow ) {
if ( data.shadow.bias !== undefined ) object.shadow.bias = data.shadow.bias;
if ( data.shadow.radius !== undefined ) object.shadow.radius = data.shadow.radius;
if ( data.shadow.mapSize !== undefined ) object.shadow.mapSize.fromArray( data.shadow.mapSize );
if ( data.shadow.camera !== undefined ) object.shadow.camera = this.parseObject( data.shadow.camera );
}
if ( data.visible !== undefined ) object.visible = data.visible;
if ( data.frustumCulled !== undefined ) object.frustumCulled = data.frustumCulled;
if ( data.renderOrder !== undefined ) object.renderOrder = data.renderOrder;
if ( data.userData !== undefined ) object.userData = data.userData;
if ( data.children !== undefined ) {
var children = data.children;
for ( var i = 0; i < children.length; i ++ ) {
object.add( this.parseObject( children[ i ], geometries, materials ) );
}
}
if ( data.type === 'LOD' ) {
var levels = data.levels;
for ( var l = 0; l < levels.length; l ++ ) {
var level = levels[ l ];
var child = object.getObjectByProperty( 'uuid', level.object );
if ( child !== undefined ) {
object.addLevel( child, level.distance );
}
}
}
return object;
}
} );
var TEXTURE_MAPPING = {
UVMapping: UVMapping,
CubeReflectionMapping: CubeReflectionMapping,
CubeRefractionMapping: CubeRefractionMapping,
EquirectangularReflectionMapping: EquirectangularReflectionMapping,
EquirectangularRefractionMapping: EquirectangularRefractionMapping,
SphericalReflectionMapping: SphericalReflectionMapping,
CubeUVReflectionMapping: CubeUVReflectionMapping,
CubeUVRefractionMapping: CubeUVRefractionMapping
};
var TEXTURE_WRAPPING = {
RepeatWrapping: RepeatWrapping,
ClampToEdgeWrapping: ClampToEdgeWrapping,
MirroredRepeatWrapping: MirroredRepeatWrapping
};
var TEXTURE_FILTER = {
NearestFilter: NearestFilter,
NearestMipMapNearestFilter: NearestMipMapNearestFilter,
NearestMipMapLinearFilter: NearestMipMapLinearFilter,
LinearFilter: LinearFilter,
LinearMipMapNearestFilter: LinearMipMapNearestFilter,
LinearMipMapLinearFilter: LinearMipMapLinearFilter
};
/**
* @author zz85 / http://www.lab4games.net/zz85/blog
* minimal class for proxing functions to Path. Replaces old "extractSubpaths()"
**/
function ShapePath() {
this.type = 'ShapePath';
this.color = new Color();
this.subPaths = [];
this.currentPath = null;
}
Object.assign( ShapePath.prototype, {
moveTo: function ( x, y ) {
this.currentPath = new Path();
this.subPaths.push( this.currentPath );
this.currentPath.moveTo( x, y );
},
lineTo: function ( x, y ) {
this.currentPath.lineTo( x, y );
},
quadraticCurveTo: function ( aCPx, aCPy, aX, aY ) {
this.currentPath.quadraticCurveTo( aCPx, aCPy, aX, aY );
},
bezierCurveTo: function ( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) {
this.currentPath.bezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY );
},
splineThru: function ( pts ) {
this.currentPath.splineThru( pts );
},
toShapes: function ( isCCW, noHoles ) {
function toShapesNoHoles( inSubpaths ) {
var shapes = [];
for ( var i = 0, l = inSubpaths.length; i < l; i ++ ) {
var tmpPath = inSubpaths[ i ];
var tmpShape = new Shape();
tmpShape.curves = tmpPath.curves;
shapes.push( tmpShape );
}
return shapes;
}
function isPointInsidePolygon( inPt, inPolygon ) {
var polyLen = inPolygon.length;
// inPt on polygon contour => immediate success or
// toggling of inside/outside at every single! intersection point of an edge
// with the horizontal line through inPt, left of inPt
// not counting lowerY endpoints of edges and whole edges on that line
var inside = false;
for ( var p = polyLen - 1, q = 0; q < polyLen; p = q ++ ) {
var edgeLowPt = inPolygon[ p ];
var edgeHighPt = inPolygon[ q ];
var edgeDx = edgeHighPt.x - edgeLowPt.x;
var edgeDy = edgeHighPt.y - edgeLowPt.y;
if ( Math.abs( edgeDy ) > Number.EPSILON ) {
// not parallel
if ( edgeDy < 0 ) {
edgeLowPt = inPolygon[ q ]; edgeDx = - edgeDx;
edgeHighPt = inPolygon[ p ]; edgeDy = - edgeDy;
}
if ( ( inPt.y < edgeLowPt.y ) || ( inPt.y > edgeHighPt.y ) ) continue;
if ( inPt.y === edgeLowPt.y ) {
if ( inPt.x === edgeLowPt.x ) return true; // inPt is on contour ?
// continue; // no intersection or edgeLowPt => doesn't count !!!
} else {
var perpEdge = edgeDy * ( inPt.x - edgeLowPt.x ) - edgeDx * ( inPt.y - edgeLowPt.y );
if ( perpEdge === 0 ) return true; // inPt is on contour ?
if ( perpEdge < 0 ) continue;
inside = ! inside; // true intersection left of inPt
}
} else {
// parallel or collinear
if ( inPt.y !== edgeLowPt.y ) continue; // parallel
// edge lies on the same horizontal line as inPt
if ( ( ( edgeHighPt.x <= inPt.x ) && ( inPt.x <= edgeLowPt.x ) ) ||
( ( edgeLowPt.x <= inPt.x ) && ( inPt.x <= edgeHighPt.x ) ) ) return true; // inPt: Point on contour !
// continue;
}
}
return inside;
}
var isClockWise = ShapeUtils.isClockWise;
var subPaths = this.subPaths;
if ( subPaths.length === 0 ) return [];
if ( noHoles === true ) return toShapesNoHoles( subPaths );
var solid, tmpPath, tmpShape, shapes = [];
if ( subPaths.length === 1 ) {
tmpPath = subPaths[ 0 ];
tmpShape = new Shape();
tmpShape.curves = tmpPath.curves;
shapes.push( tmpShape );
return shapes;
}
var holesFirst = ! isClockWise( subPaths[ 0 ].getPoints() );
holesFirst = isCCW ? ! holesFirst : holesFirst;
// console.log("Holes first", holesFirst);
var betterShapeHoles = [];
var newShapes = [];
var newShapeHoles = [];
var mainIdx = 0;
var tmpPoints;
newShapes[ mainIdx ] = undefined;
newShapeHoles[ mainIdx ] = [];
for ( var i = 0, l = subPaths.length; i < l; i ++ ) {
tmpPath = subPaths[ i ];
tmpPoints = tmpPath.getPoints();
solid = isClockWise( tmpPoints );
solid = isCCW ? ! solid : solid;
if ( solid ) {
if ( ( ! holesFirst ) && ( newShapes[ mainIdx ] ) ) mainIdx ++;
newShapes[ mainIdx ] = { s: new Shape(), p: tmpPoints };
newShapes[ mainIdx ].s.curves = tmpPath.curves;
if ( holesFirst ) mainIdx ++;
newShapeHoles[ mainIdx ] = [];
//console.log('cw', i);
} else {
newShapeHoles[ mainIdx ].push( { h: tmpPath, p: tmpPoints[ 0 ] } );
//console.log('ccw', i);
}
}
// only Holes? -> probably all Shapes with wrong orientation
if ( ! newShapes[ 0 ] ) return toShapesNoHoles( subPaths );
if ( newShapes.length > 1 ) {
var ambiguous = false;
var toChange = [];
for ( var sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) {
betterShapeHoles[ sIdx ] = [];
}
for ( var sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) {
var sho = newShapeHoles[ sIdx ];
for ( var hIdx = 0; hIdx < sho.length; hIdx ++ ) {
var ho = sho[ hIdx ];
var hole_unassigned = true;
for ( var s2Idx = 0; s2Idx < newShapes.length; s2Idx ++ ) {
if ( isPointInsidePolygon( ho.p, newShapes[ s2Idx ].p ) ) {
if ( sIdx !== s2Idx ) toChange.push( { froms: sIdx, tos: s2Idx, hole: hIdx } );
if ( hole_unassigned ) {
hole_unassigned = false;
betterShapeHoles[ s2Idx ].push( ho );
} else {
ambiguous = true;
}
}
}
if ( hole_unassigned ) {
betterShapeHoles[ sIdx ].push( ho );
}
}
}
// console.log("ambiguous: ", ambiguous);
if ( toChange.length > 0 ) {
// console.log("to change: ", toChange);
if ( ! ambiguous ) newShapeHoles = betterShapeHoles;
}
}
var tmpHoles;
for ( var i = 0, il = newShapes.length; i < il; i ++ ) {
tmpShape = newShapes[ i ].s;
shapes.push( tmpShape );
tmpHoles = newShapeHoles[ i ];
for ( var j = 0, jl = tmpHoles.length; j < jl; j ++ ) {
tmpShape.holes.push( tmpHoles[ j ].h );
}
}
//console.log("shape", shapes);
return shapes;
}
} );
/**
* @author zz85 / http://www.lab4games.net/zz85/blog
* @author mrdoob / http://mrdoob.com/
*/
function Font( data ) {
this.type = 'Font';
this.data = data;
}
Object.assign( Font.prototype, {
isFont: true,
generateShapes: function ( text, size, divisions ) {
if ( size === undefined ) size = 100;
if ( divisions === undefined ) divisions = 4;
var shapes = [];
var paths = createPaths( text, size, divisions, this.data );
for ( var p = 0, pl = paths.length; p < pl; p ++ ) {
Array.prototype.push.apply( shapes, paths[ p ].toShapes() );
}
return shapes;
}
} );
function createPaths( text, size, divisions, data ) {
var chars = String( text ).split( '' );
var scale = size / data.resolution;
var line_height = ( data.boundingBox.yMax - data.boundingBox.yMin + data.underlineThickness ) * scale;
var paths = [];
var offsetX = 0, offsetY = 0;
for ( var i = 0; i < chars.length; i ++ ) {
var char = chars[ i ];
if ( char === '\n' ) {
offsetX = 0;
offsetY -= line_height;
} else {
var ret = createPath( char, divisions, scale, offsetX, offsetY, data );
offsetX += ret.offsetX;
paths.push( ret.path );
}
}
return paths;
}
function createPath( char, divisions, scale, offsetX, offsetY, data ) {
var glyph = data.glyphs[ char ] || data.glyphs[ '?' ];
if ( ! glyph ) return;
var path = new ShapePath();
var x, y, cpx, cpy, cpx1, cpy1, cpx2, cpy2;
if ( glyph.o ) {
var outline = glyph._cachedOutline || ( glyph._cachedOutline = glyph.o.split( ' ' ) );
for ( var i = 0, l = outline.length; i < l; ) {
var action = outline[ i ++ ];
switch ( action ) {
case 'm': // moveTo
x = outline[ i ++ ] * scale + offsetX;
y = outline[ i ++ ] * scale + offsetY;
path.moveTo( x, y );
break;
case 'l': // lineTo
x = outline[ i ++ ] * scale + offsetX;
y = outline[ i ++ ] * scale + offsetY;
path.lineTo( x, y );
break;
case 'q': // quadraticCurveTo
cpx = outline[ i ++ ] * scale + offsetX;
cpy = outline[ i ++ ] * scale + offsetY;
cpx1 = outline[ i ++ ] * scale + offsetX;
cpy1 = outline[ i ++ ] * scale + offsetY;
path.quadraticCurveTo( cpx1, cpy1, cpx, cpy );
break;
case 'b': // bezierCurveTo
cpx = outline[ i ++ ] * scale + offsetX;
cpy = outline[ i ++ ] * scale + offsetY;
cpx1 = outline[ i ++ ] * scale + offsetX;
cpy1 = outline[ i ++ ] * scale + offsetY;
cpx2 = outline[ i ++ ] * scale + offsetX;
cpy2 = outline[ i ++ ] * scale + offsetY;
path.bezierCurveTo( cpx1, cpy1, cpx2, cpy2, cpx, cpy );
break;
}
}
}
return { offsetX: glyph.ha * scale, path: path };
}
/**
* @author mrdoob / http://mrdoob.com/
*/
function FontLoader( manager ) {
this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;
}
Object.assign( FontLoader.prototype, {
load: function ( url, onLoad, onProgress, onError ) {
var scope = this;
var loader = new FileLoader( this.manager );
loader.setPath( this.path );
loader.load( url, function ( text ) {
var json;
try {
json = JSON.parse( text );
} catch ( e ) {
console.warn( 'THREE.FontLoader: typeface.js support is being deprecated. Use typeface.json instead.' );
json = JSON.parse( text.substring( 65, text.length - 2 ) );
}
var font = scope.parse( json );
if ( onLoad ) onLoad( font );
}, onProgress, onError );
},
parse: function ( json ) {
return new Font( json );
},
setPath: function ( value ) {
this.path = value;
return this;
}
} );
/**
* @author mrdoob / http://mrdoob.com/
*/
var context;
var AudioContext = {
getContext: function () {
if ( context === undefined ) {
context = new ( window.AudioContext || window.webkitAudioContext )();
}
return context;
},
setContext: function ( value ) {
context = value;
}
};
/**
* @author Reece Aaron Lecrivain / http://reecenotes.com/
*/
function AudioLoader( manager ) {
this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;
}
Object.assign( AudioLoader.prototype, {
load: function ( url, onLoad, onProgress, onError ) {
var loader = new FileLoader( this.manager );
loader.setResponseType( 'arraybuffer' );
loader.load( url, function ( buffer ) {
var context = AudioContext.getContext();
context.decodeAudioData( buffer, function ( audioBuffer ) {
onLoad( audioBuffer );
} );
}, onProgress, onError );
}
} );
/**
* @author mrdoob / http://mrdoob.com/
*/
function StereoCamera() {
this.type = 'StereoCamera';
this.aspect = 1;
this.eyeSep = 0.064;
this.cameraL = new PerspectiveCamera();
this.cameraL.layers.enable( 1 );
this.cameraL.matrixAutoUpdate = false;
this.cameraR = new PerspectiveCamera();
this.cameraR.layers.enable( 2 );
this.cameraR.matrixAutoUpdate = false;
}
Object.assign( StereoCamera.prototype, {
update: ( function () {
var instance, focus, fov, aspect, near, far, zoom, eyeSep;
var eyeRight = new Matrix4();
var eyeLeft = new Matrix4();
return function update( camera ) {
var needsUpdate = instance !== this || focus !== camera.focus || fov !== camera.fov ||
aspect !== camera.aspect * this.aspect || near !== camera.near ||
far !== camera.far || zoom !== camera.zoom || eyeSep !== this.eyeSep;
if ( needsUpdate ) {
instance = this;
focus = camera.focus;
fov = camera.fov;
aspect = camera.aspect * this.aspect;
near = camera.near;
far = camera.far;
zoom = camera.zoom;
// Off-axis stereoscopic effect based on
// http://paulbourke.net/stereographics/stereorender/
var projectionMatrix = camera.projectionMatrix.clone();
eyeSep = this.eyeSep / 2;
var eyeSepOnProjection = eyeSep * near / focus;
var ymax = ( near * Math.tan( _Math.DEG2RAD * fov * 0.5 ) ) / zoom;
var xmin, xmax;
// translate xOffset
eyeLeft.elements[ 12 ] = - eyeSep;
eyeRight.elements[ 12 ] = eyeSep;
// for left eye
xmin = - ymax * aspect + eyeSepOnProjection;
xmax = ymax * aspect + eyeSepOnProjection;
projectionMatrix.elements[ 0 ] = 2 * near / ( xmax - xmin );
projectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin );
this.cameraL.projectionMatrix.copy( projectionMatrix );
// for right eye
xmin = - ymax * aspect - eyeSepOnProjection;
xmax = ymax * aspect - eyeSepOnProjection;
projectionMatrix.elements[ 0 ] = 2 * near / ( xmax - xmin );
projectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin );
this.cameraR.projectionMatrix.copy( projectionMatrix );
}
this.cameraL.matrixWorld.copy( camera.matrixWorld ).multiply( eyeLeft );
this.cameraR.matrixWorld.copy( camera.matrixWorld ).multiply( eyeRight );
};
} )()
} );
/**
* Camera for rendering cube maps
* - renders scene into axis-aligned cube
*
* @author alteredq / http://alteredqualia.com/
*/
function CubeCamera( near, far, cubeResolution ) {
Object3D.call( this );
this.type = 'CubeCamera';
var fov = 90, aspect = 1;
var cameraPX = new PerspectiveCamera( fov, aspect, near, far );
cameraPX.up.set( 0, - 1, 0 );
cameraPX.lookAt( new Vector3( 1, 0, 0 ) );
this.add( cameraPX );
var cameraNX = new PerspectiveCamera( fov, aspect, near, far );
cameraNX.up.set( 0, - 1, 0 );
cameraNX.lookAt( new Vector3( - 1, 0, 0 ) );
this.add( cameraNX );
var cameraPY = new PerspectiveCamera( fov, aspect, near, far );
cameraPY.up.set( 0, 0, 1 );
cameraPY.lookAt( new Vector3( 0, 1, 0 ) );
this.add( cameraPY );
var cameraNY = new PerspectiveCamera( fov, aspect, near, far );
cameraNY.up.set( 0, 0, - 1 );
cameraNY.lookAt( new Vector3( 0, - 1, 0 ) );
this.add( cameraNY );
var cameraPZ = new PerspectiveCamera( fov, aspect, near, far );
cameraPZ.up.set( 0, - 1, 0 );
cameraPZ.lookAt( new Vector3( 0, 0, 1 ) );
this.add( cameraPZ );
var cameraNZ = new PerspectiveCamera( fov, aspect, near, far );
cameraNZ.up.set( 0, - 1, 0 );
cameraNZ.lookAt( new Vector3( 0, 0, - 1 ) );
this.add( cameraNZ );
var options = { format: RGBFormat, magFilter: LinearFilter, minFilter: LinearFilter };
this.renderTarget = new WebGLRenderTargetCube( cubeResolution, cubeResolution, options );
this.renderTarget.texture.name = "CubeCamera";
this.update = function ( renderer, scene ) {
if ( this.parent === null ) this.updateMatrixWorld();
var renderTarget = this.renderTarget;
var generateMipmaps = renderTarget.texture.generateMipmaps;
renderTarget.texture.generateMipmaps = false;
renderTarget.activeCubeFace = 0;
renderer.render( scene, cameraPX, renderTarget );
renderTarget.activeCubeFace = 1;
renderer.render( scene, cameraNX, renderTarget );
renderTarget.activeCubeFace = 2;
renderer.render( scene, cameraPY, renderTarget );
renderTarget.activeCubeFace = 3;
renderer.render( scene, cameraNY, renderTarget );
renderTarget.activeCubeFace = 4;
renderer.render( scene, cameraPZ, renderTarget );
renderTarget.texture.generateMipmaps = generateMipmaps;
renderTarget.activeCubeFace = 5;
renderer.render( scene, cameraNZ, renderTarget );
renderer.setRenderTarget( null );
};
this.clear = function ( renderer, color, depth, stencil ) {
var renderTarget = this.renderTarget;
for ( var i = 0; i < 6; i ++ ) {
renderTarget.activeCubeFace = i;
renderer.setRenderTarget( renderTarget );
renderer.clear( color, depth, stencil );
}
renderer.setRenderTarget( null );
};
}
CubeCamera.prototype = Object.create( Object3D.prototype );
CubeCamera.prototype.constructor = CubeCamera;
/**
* @author mrdoob / http://mrdoob.com/
*/
function AudioListener() {
Object3D.call( this );
this.type = 'AudioListener';
this.context = AudioContext.getContext();
this.gain = this.context.createGain();
this.gain.connect( this.context.destination );
this.filter = null;
}
AudioListener.prototype = Object.assign( Object.create( Object3D.prototype ), {
constructor: AudioListener,
getInput: function () {
return this.gain;
},
removeFilter: function ( ) {
if ( this.filter !== null ) {
this.gain.disconnect( this.filter );
this.filter.disconnect( this.context.destination );
this.gain.connect( this.context.destination );
this.filter = null;
}
},
getFilter: function () {
return this.filter;
},
setFilter: function ( value ) {
if ( this.filter !== null ) {
this.gain.disconnect( this.filter );
this.filter.disconnect( this.context.destination );
} else {
this.gain.disconnect( this.context.destination );
}
this.filter = value;
this.gain.connect( this.filter );
this.filter.connect( this.context.destination );
},
getMasterVolume: function () {
return this.gain.gain.value;
},
setMasterVolume: function ( value ) {
this.gain.gain.setTargetAtTime( value, this.context.currentTime, 0.01 );
},
updateMatrixWorld: ( function () {
var position = new Vector3();
var quaternion = new Quaternion();
var scale = new Vector3();
var orientation = new Vector3();
return function updateMatrixWorld( force ) {
Object3D.prototype.updateMatrixWorld.call( this, force );
var listener = this.context.listener;
var up = this.up;
this.matrixWorld.decompose( position, quaternion, scale );
orientation.set( 0, 0, - 1 ).applyQuaternion( quaternion );
if ( listener.positionX ) {
listener.positionX.setValueAtTime( position.x, this.context.currentTime );
listener.positionY.setValueAtTime( position.y, this.context.currentTime );
listener.positionZ.setValueAtTime( position.z, this.context.currentTime );
listener.forwardX.setValueAtTime( orientation.x, this.context.currentTime );
listener.forwardY.setValueAtTime( orientation.y, this.context.currentTime );
listener.forwardZ.setValueAtTime( orientation.z, this.context.currentTime );
listener.upX.setValueAtTime( up.x, this.context.currentTime );
listener.upY.setValueAtTime( up.y, this.context.currentTime );
listener.upZ.setValueAtTime( up.z, this.context.currentTime );
} else {
listener.setPosition( position.x, position.y, position.z );
listener.setOrientation( orientation.x, orientation.y, orientation.z, up.x, up.y, up.z );
}
};
} )()
} );
/**
* @author mrdoob / http://mrdoob.com/
* @author Reece Aaron Lecrivain / http://reecenotes.com/
*/
function Audio( listener ) {
Object3D.call( this );
this.type = 'Audio';
this.context = listener.context;
this.gain = this.context.createGain();
this.gain.connect( listener.getInput() );
this.autoplay = false;
this.buffer = null;
this.loop = false;
this.startTime = 0;
this.offset = 0;
this.playbackRate = 1;
this.isPlaying = false;
this.hasPlaybackControl = true;
this.sourceType = 'empty';
this.filters = [];
}
Audio.prototype = Object.assign( Object.create( Object3D.prototype ), {
constructor: Audio,
getOutput: function () {
return this.gain;
},
setNodeSource: function ( audioNode ) {
this.hasPlaybackControl = false;
this.sourceType = 'audioNode';
this.source = audioNode;
this.connect();
return this;
},
setBuffer: function ( audioBuffer ) {
this.buffer = audioBuffer;
this.sourceType = 'buffer';
if ( this.autoplay ) this.play();
return this;
},
play: function () {
if ( this.isPlaying === true ) {
console.warn( 'THREE.Audio: Audio is already playing.' );
return;
}
if ( this.hasPlaybackControl === false ) {
console.warn( 'THREE.Audio: this Audio has no playback control.' );
return;
}
var source = this.context.createBufferSource();
source.buffer = this.buffer;
source.loop = this.loop;
source.onended = this.onEnded.bind( this );
source.playbackRate.setValueAtTime( this.playbackRate, this.startTime );
this.startTime = this.context.currentTime;
source.start( this.startTime, this.offset );
this.isPlaying = true;
this.source = source;
return this.connect();
},
pause: function () {
if ( this.hasPlaybackControl === false ) {
console.warn( 'THREE.Audio: this Audio has no playback control.' );
return;
}
if ( this.isPlaying === true ) {
this.source.stop();
this.offset += ( this.context.currentTime - this.startTime ) * this.playbackRate;
this.isPlaying = false;
}
return this;
},
stop: function () {
if ( this.hasPlaybackControl === false ) {
console.warn( 'THREE.Audio: this Audio has no playback control.' );
return;
}
this.source.stop();
this.offset = 0;
this.isPlaying = false;
return this;
},
connect: function () {
if ( this.filters.length > 0 ) {
this.source.connect( this.filters[ 0 ] );
for ( var i = 1, l = this.filters.length; i < l; i ++ ) {
this.filters[ i - 1 ].connect( this.filters[ i ] );
}
this.filters[ this.filters.length - 1 ].connect( this.getOutput() );
} else {
this.source.connect( this.getOutput() );
}
return this;
},
disconnect: function () {
if ( this.filters.length > 0 ) {
this.source.disconnect( this.filters[ 0 ] );
for ( var i = 1, l = this.filters.length; i < l; i ++ ) {
this.filters[ i - 1 ].disconnect( this.filters[ i ] );
}
this.filters[ this.filters.length - 1 ].disconnect( this.getOutput() );
} else {
this.source.disconnect( this.getOutput() );
}
return this;
},
getFilters: function () {
return this.filters;
},
setFilters: function ( value ) {
if ( ! value ) value = [];
if ( this.isPlaying === true ) {
this.disconnect();
this.filters = value;
this.connect();
} else {
this.filters = value;
}
return this;
},
getFilter: function () {
return this.getFilters()[ 0 ];
},
setFilter: function ( filter ) {
return this.setFilters( filter ? [ filter ] : [] );
},
setPlaybackRate: function ( value ) {
if ( this.hasPlaybackControl === false ) {
console.warn( 'THREE.Audio: this Audio has no playback control.' );
return;
}
this.playbackRate = value;
if ( this.isPlaying === true ) {
this.source.playbackRate.setValueAtTime( this.playbackRate, this.context.currentTime );
}
return this;
},
getPlaybackRate: function () {
return this.playbackRate;
},
onEnded: function () {
this.isPlaying = false;
},
getLoop: function () {
if ( this.hasPlaybackControl === false ) {
console.warn( 'THREE.Audio: this Audio has no playback control.' );
return false;
}
return this.loop;
},
setLoop: function ( value ) {
if ( this.hasPlaybackControl === false ) {
console.warn( 'THREE.Audio: this Audio has no playback control.' );
return;
}
this.loop = value;
if ( this.isPlaying === true ) {
this.source.loop = this.loop;
}
return this;
},
getVolume: function () {
return this.gain.gain.value;
},
setVolume: function ( value ) {
this.gain.gain.setTargetAtTime( value, this.context.currentTime, 0.01 );
return this;
}
} );
/**
* @author mrdoob / http://mrdoob.com/
*/
function PositionalAudio( listener ) {
Audio.call( this, listener );
this.panner = this.context.createPanner();
this.panner.connect( this.gain );
}
PositionalAudio.prototype = Object.assign( Object.create( Audio.prototype ), {
constructor: PositionalAudio,
getOutput: function () {
return this.panner;
},
getRefDistance: function () {
return this.panner.refDistance;
},
setRefDistance: function ( value ) {
this.panner.refDistance = value;
},
getRolloffFactor: function () {
return this.panner.rolloffFactor;
},
setRolloffFactor: function ( value ) {
this.panner.rolloffFactor = value;
},
getDistanceModel: function () {
return this.panner.distanceModel;
},
setDistanceModel: function ( value ) {
this.panner.distanceModel = value;
},
getMaxDistance: function () {
return this.panner.maxDistance;
},
setMaxDistance: function ( value ) {
this.panner.maxDistance = value;
},
updateMatrixWorld: ( function () {
var position = new Vector3();
return function updateMatrixWorld( force ) {
Object3D.prototype.updateMatrixWorld.call( this, force );
position.setFromMatrixPosition( this.matrixWorld );
this.panner.setPosition( position.x, position.y, position.z );
};
} )()
} );
/**
* @author mrdoob / http://mrdoob.com/
*/
function AudioAnalyser( audio, fftSize ) {
this.analyser = audio.context.createAnalyser();
this.analyser.fftSize = fftSize !== undefined ? fftSize : 2048;
this.data = new Uint8Array( this.analyser.frequencyBinCount );
audio.getOutput().connect( this.analyser );
}
Object.assign( AudioAnalyser.prototype, {
getFrequencyData: function () {
this.analyser.getByteFrequencyData( this.data );
return this.data;
},
getAverageFrequency: function () {
var value = 0, data = this.getFrequencyData();
for ( var i = 0; i < data.length; i ++ ) {
value += data[ i ];
}
return value / data.length;
}
} );
/**
*
* Buffered scene graph property that allows weighted accumulation.
*
*
* @author Ben Houston / http://clara.io/
* @author David Sarno / http://lighthaus.us/
* @author tschw
*/
function PropertyMixer( binding, typeName, valueSize ) {
this.binding = binding;
this.valueSize = valueSize;
var bufferType = Float64Array,
mixFunction;
switch ( typeName ) {
case 'quaternion':
mixFunction = this._slerp;
break;
case 'string':
case 'bool':
bufferType = Array;
mixFunction = this._select;
break;
default:
mixFunction = this._lerp;
}
this.buffer = new bufferType( valueSize * 4 );
// layout: [ incoming | accu0 | accu1 | orig ]
//
// interpolators can use .buffer as their .result
// the data then goes to 'incoming'
//
// 'accu0' and 'accu1' are used frame-interleaved for
// the cumulative result and are compared to detect
// changes
//
// 'orig' stores the original state of the property
this._mixBufferRegion = mixFunction;
this.cumulativeWeight = 0;
this.useCount = 0;
this.referenceCount = 0;
}
Object.assign( PropertyMixer.prototype, {
// accumulate data in the 'incoming' region into 'accu<i>'
accumulate: function ( accuIndex, weight ) {
// note: happily accumulating nothing when weight = 0, the caller knows
// the weight and shouldn't have made the call in the first place
var buffer = this.buffer,
stride = this.valueSize,
offset = accuIndex * stride + stride,
currentWeight = this.cumulativeWeight;
if ( currentWeight === 0 ) {
// accuN := incoming * weight
for ( var i = 0; i !== stride; ++ i ) {
buffer[ offset + i ] = buffer[ i ];
}
currentWeight = weight;
} else {
// accuN := accuN + incoming * weight
currentWeight += weight;
var mix = weight / currentWeight;
this._mixBufferRegion( buffer, offset, 0, mix, stride );
}
this.cumulativeWeight = currentWeight;
},
// apply the state of 'accu<i>' to the binding when accus differ
apply: function ( accuIndex ) {
var stride = this.valueSize,
buffer = this.buffer,
offset = accuIndex * stride + stride,
weight = this.cumulativeWeight,
binding = this.binding;
this.cumulativeWeight = 0;
if ( weight < 1 ) {
// accuN := accuN + original * ( 1 - cumulativeWeight )
var originalValueOffset = stride * 3;
this._mixBufferRegion(
buffer, offset, originalValueOffset, 1 - weight, stride );
}
for ( var i = stride, e = stride + stride; i !== e; ++ i ) {
if ( buffer[ i ] !== buffer[ i + stride ] ) {
// value has changed -> update scene graph
binding.setValue( buffer, offset );
break;
}
}
},
// remember the state of the bound property and copy it to both accus
saveOriginalState: function () {
var binding = this.binding;
var buffer = this.buffer,
stride = this.valueSize,
originalValueOffset = stride * 3;
binding.getValue( buffer, originalValueOffset );
// accu[0..1] := orig -- initially detect changes against the original
for ( var i = stride, e = originalValueOffset; i !== e; ++ i ) {
buffer[ i ] = buffer[ originalValueOffset + ( i % stride ) ];
}
this.cumulativeWeight = 0;
},
// apply the state previously taken via 'saveOriginalState' to the binding
restoreOriginalState: function () {
var originalValueOffset = this.valueSize * 3;
this.binding.setValue( this.buffer, originalValueOffset );
},
// mix functions
_select: function ( buffer, dstOffset, srcOffset, t, stride ) {
if ( t >= 0.5 ) {
for ( var i = 0; i !== stride; ++ i ) {
buffer[ dstOffset + i ] = buffer[ srcOffset + i ];
}
}
},
_slerp: function ( buffer, dstOffset, srcOffset, t ) {
Quaternion.slerpFlat( buffer, dstOffset, buffer, dstOffset, buffer, srcOffset, t );
},
_lerp: function ( buffer, dstOffset, srcOffset, t, stride ) {
var s = 1 - t;
for ( var i = 0; i !== stride; ++ i ) {
var j = dstOffset + i;
buffer[ j ] = buffer[ j ] * s + buffer[ srcOffset + i ] * t;
}
}
} );
/**
*
* A reference to a real property in the scene graph.
*
*
* @author Ben Houston / http://clara.io/
* @author David Sarno / http://lighthaus.us/
* @author tschw
*/
// Characters [].:/ are reserved for track binding syntax.
var RESERVED_CHARS_RE = '\\[\\]\\.:\\/';
function Composite( targetGroup, path, optionalParsedPath ) {
var parsedPath = optionalParsedPath || PropertyBinding.parseTrackName( path );
this._targetGroup = targetGroup;
this._bindings = targetGroup.subscribe_( path, parsedPath );
}
Object.assign( Composite.prototype, {
getValue: function ( array, offset ) {
this.bind(); // bind all binding
var firstValidIndex = this._targetGroup.nCachedObjects_,
binding = this._bindings[ firstValidIndex ];
// and only call .getValue on the first
if ( binding !== undefined ) binding.getValue( array, offset );
},
setValue: function ( array, offset ) {
var bindings = this._bindings;
for ( var i = this._targetGroup.nCachedObjects_,
n = bindings.length; i !== n; ++ i ) {
bindings[ i ].setValue( array, offset );
}
},
bind: function () {
var bindings = this._bindings;
for ( var i = this._targetGroup.nCachedObjects_,
n = bindings.length; i !== n; ++ i ) {
bindings[ i ].bind();
}
},
unbind: function () {
var bindings = this._bindings;
for ( var i = this._targetGroup.nCachedObjects_,
n = bindings.length; i !== n; ++ i ) {
bindings[ i ].unbind();
}
}
} );
function PropertyBinding( rootNode, path, parsedPath ) {
this.path = path;
this.parsedPath = parsedPath || PropertyBinding.parseTrackName( path );
this.node = PropertyBinding.findNode( rootNode, this.parsedPath.nodeName ) || rootNode;
this.rootNode = rootNode;
}
Object.assign( PropertyBinding, {
Composite: Composite,
create: function ( root, path, parsedPath ) {
if ( ! ( root && root.isAnimationObjectGroup ) ) {
return new PropertyBinding( root, path, parsedPath );
} else {
return new PropertyBinding.Composite( root, path, parsedPath );
}
},
/**
* Replaces spaces with underscores and removes unsupported characters from
* node names, to ensure compatibility with parseTrackName().
*
* @param {string} name Node name to be sanitized.
* @return {string}
*/
sanitizeNodeName: ( function () {
var reservedRe = new RegExp( '[' + RESERVED_CHARS_RE + ']', 'g' );
return function sanitizeNodeName( name ) {
return name.replace( /\s/g, '_' ).replace( reservedRe, '' );
};
}() ),
parseTrackName: function () {
// Attempts to allow node names from any language. ES5's `\w` regexp matches
// only latin characters, and the unicode \p{L} is not yet supported. So
// instead, we exclude reserved characters and match everything else.
var wordChar = '[^' + RESERVED_CHARS_RE + ']';
var wordCharOrDot = '[^' + RESERVED_CHARS_RE.replace( '\\.', '' ) + ']';
// Parent directories, delimited by '/' or ':'. Currently unused, but must
// be matched to parse the rest of the track name.
var directoryRe = /((?:WC+[\/:])*)/.source.replace( 'WC', wordChar );
// Target node. May contain word characters (a-zA-Z0-9_) and '.' or '-'.
var nodeRe = /(WCOD+)?/.source.replace( 'WCOD', wordCharOrDot );
// Object on target node, and accessor. May not contain reserved
// characters. Accessor may contain any character except closing bracket.
var objectRe = /(?:\.(WC+)(?:\[(.+)\])?)?/.source.replace( 'WC', wordChar );
// Property and accessor. May not contain reserved characters. Accessor may
// contain any non-bracket characters.
var propertyRe = /\.(WC+)(?:\[(.+)\])?/.source.replace( 'WC', wordChar );
var trackRe = new RegExp( ''
+ '^'
+ directoryRe
+ nodeRe
+ objectRe
+ propertyRe
+ '$'
);
var supportedObjectNames = [ 'material', 'materials', 'bones' ];
return function parseTrackName( trackName ) {
var matches = trackRe.exec( trackName );
if ( ! matches ) {
throw new Error( 'PropertyBinding: Cannot parse trackName: ' + trackName );
}
var results = {
// directoryName: matches[ 1 ], // (tschw) currently unused
nodeName: matches[ 2 ],
objectName: matches[ 3 ],
objectIndex: matches[ 4 ],
propertyName: matches[ 5 ], // required
propertyIndex: matches[ 6 ]
};
var lastDot = results.nodeName && results.nodeName.lastIndexOf( '.' );
if ( lastDot !== undefined && lastDot !== - 1 ) {
var objectName = results.nodeName.substring( lastDot + 1 );
// Object names must be checked against a whitelist. Otherwise, there
// is no way to parse 'foo.bar.baz': 'baz' must be a property, but
// 'bar' could be the objectName, or part of a nodeName (which can
// include '.' characters).
if ( supportedObjectNames.indexOf( objectName ) !== - 1 ) {
results.nodeName = results.nodeName.substring( 0, lastDot );
results.objectName = objectName;
}
}
if ( results.propertyName === null || results.propertyName.length === 0 ) {
throw new Error( 'PropertyBinding: can not parse propertyName from trackName: ' + trackName );
}
return results;
};
}(),
findNode: function ( root, nodeName ) {
if ( ! nodeName || nodeName === "" || nodeName === "root" || nodeName === "." || nodeName === - 1 || nodeName === root.name || nodeName === root.uuid ) {
return root;
}
// search into skeleton bones.
if ( root.skeleton ) {
var bone = root.skeleton.getBoneByName( nodeName );
if ( bone !== undefined ) {
return bone;
}
}
// search into node subtree.
if ( root.children ) {
var searchNodeSubtree = function ( children ) {
for ( var i = 0; i < children.length; i ++ ) {
var childNode = children[ i ];
if ( childNode.name === nodeName || childNode.uuid === nodeName ) {
return childNode;
}
var result = searchNodeSubtree( childNode.children );
if ( result ) return result;
}
return null;
};
var subTreeNode = searchNodeSubtree( root.children );
if ( subTreeNode ) {
return subTreeNode;
}
}
return null;
}
} );
Object.assign( PropertyBinding.prototype, { // prototype, continued
// these are used to "bind" a nonexistent property
_getValue_unavailable: function () {},
_setValue_unavailable: function () {},
BindingType: {
Direct: 0,
EntireArray: 1,
ArrayElement: 2,
HasFromToArray: 3
},
Versioning: {
None: 0,
NeedsUpdate: 1,
MatrixWorldNeedsUpdate: 2
},
GetterByBindingType: [
function getValue_direct( buffer, offset ) {
buffer[ offset ] = this.node[ this.propertyName ];
},
function getValue_array( buffer, offset ) {
var source = this.resolvedProperty;
for ( var i = 0, n = source.length; i !== n; ++ i ) {
buffer[ offset ++ ] = source[ i ];
}
},
function getValue_arrayElement( buffer, offset ) {
buffer[ offset ] = this.resolvedProperty[ this.propertyIndex ];
},
function getValue_toArray( buffer, offset ) {
this.resolvedProperty.toArray( buffer, offset );
}
],
SetterByBindingTypeAndVersioning: [
[
// Direct
function setValue_direct( buffer, offset ) {
this.targetObject[ this.propertyName ] = buffer[ offset ];
},
function setValue_direct_setNeedsUpdate( buffer, offset ) {
this.targetObject[ this.propertyName ] = buffer[ offset ];
this.targetObject.needsUpdate = true;
},
function setValue_direct_setMatrixWorldNeedsUpdate( buffer, offset ) {
this.targetObject[ this.propertyName ] = buffer[ offset ];
this.targetObject.matrixWorldNeedsUpdate = true;
}
], [
// EntireArray
function setValue_array( buffer, offset ) {
var dest = this.resolvedProperty;
for ( var i = 0, n = dest.length; i !== n; ++ i ) {
dest[ i ] = buffer[ offset ++ ];
}
},
function setValue_array_setNeedsUpdate( buffer, offset ) {
var dest = this.resolvedProperty;
for ( var i = 0, n = dest.length; i !== n; ++ i ) {
dest[ i ] = buffer[ offset ++ ];
}
this.targetObject.needsUpdate = true;
},
function setValue_array_setMatrixWorldNeedsUpdate( buffer, offset ) {
var dest = this.resolvedProperty;
for ( var i = 0, n = dest.length; i !== n; ++ i ) {
dest[ i ] = buffer[ offset ++ ];
}
this.targetObject.matrixWorldNeedsUpdate = true;
}
], [
// ArrayElement
function setValue_arrayElement( buffer, offset ) {
this.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];
},
function setValue_arrayElement_setNeedsUpdate( buffer, offset ) {
this.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];
this.targetObject.needsUpdate = true;
},
function setValue_arrayElement_setMatrixWorldNeedsUpdate( buffer, offset ) {
this.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];
this.targetObject.matrixWorldNeedsUpdate = true;
}
], [
// HasToFromArray
function setValue_fromArray( buffer, offset ) {
this.resolvedProperty.fromArray( buffer, offset );
},
function setValue_fromArray_setNeedsUpdate( buffer, offset ) {
this.resolvedProperty.fromArray( buffer, offset );
this.targetObject.needsUpdate = true;
},
function setValue_fromArray_setMatrixWorldNeedsUpdate( buffer, offset ) {
this.resolvedProperty.fromArray( buffer, offset );
this.targetObject.matrixWorldNeedsUpdate = true;
}
]
],
getValue: function getValue_unbound( targetArray, offset ) {
this.bind();
this.getValue( targetArray, offset );
// Note: This class uses a State pattern on a per-method basis:
// 'bind' sets 'this.getValue' / 'setValue' and shadows the
// prototype version of these methods with one that represents
// the bound state. When the property is not found, the methods
// become no-ops.
},
setValue: function getValue_unbound( sourceArray, offset ) {
this.bind();
this.setValue( sourceArray, offset );
},
// create getter / setter pair for a property in the scene graph
bind: function () {
var targetObject = this.node,
parsedPath = this.parsedPath,
objectName = parsedPath.objectName,
propertyName = parsedPath.propertyName,
propertyIndex = parsedPath.propertyIndex;
if ( ! targetObject ) {
targetObject = PropertyBinding.findNode( this.rootNode, parsedPath.nodeName ) || this.rootNode;
this.node = targetObject;
}
// set fail state so we can just 'return' on error
this.getValue = this._getValue_unavailable;
this.setValue = this._setValue_unavailable;
// ensure there is a value node
if ( ! targetObject ) {
console.error( 'THREE.PropertyBinding: Trying to update node for track: ' + this.path + ' but it wasn\'t found.' );
return;
}
if ( objectName ) {
var objectIndex = parsedPath.objectIndex;
// special cases were we need to reach deeper into the hierarchy to get the face materials....
switch ( objectName ) {
case 'materials':
if ( ! targetObject.material ) {
console.error( 'THREE.PropertyBinding: Can not bind to material as node does not have a material.', this );
return;
}
if ( ! targetObject.material.materials ) {
console.error( 'THREE.PropertyBinding: Can not bind to material.materials as node.material does not have a materials array.', this );
return;
}
targetObject = targetObject.material.materials;
break;
case 'bones':
if ( ! targetObject.skeleton ) {
console.error( 'THREE.PropertyBinding: Can not bind to bones as node does not have a skeleton.', this );
return;
}
// potential future optimization: skip this if propertyIndex is already an integer
// and convert the integer string to a true integer.
targetObject = targetObject.skeleton.bones;
// support resolving morphTarget names into indices.
for ( var i = 0; i < targetObject.length; i ++ ) {
if ( targetObject[ i ].name === objectIndex ) {
objectIndex = i;
break;
}
}
break;
default:
if ( targetObject[ objectName ] === undefined ) {
console.error( 'THREE.PropertyBinding: Can not bind to objectName of node undefined.', this );
return;
}
targetObject = targetObject[ objectName ];
}
if ( objectIndex !== undefined ) {
if ( targetObject[ objectIndex ] === undefined ) {
console.error( 'THREE.PropertyBinding: Trying to bind to objectIndex of objectName, but is undefined.', this, targetObject );
return;
}
targetObject = targetObject[ objectIndex ];
}
}
// resolve property
var nodeProperty = targetObject[ propertyName ];
if ( nodeProperty === undefined ) {
var nodeName = parsedPath.nodeName;
console.error( 'THREE.PropertyBinding: Trying to update property for track: ' + nodeName +
'.' + propertyName + ' but it wasn\'t found.', targetObject );
return;
}
// determine versioning scheme
var versioning = this.Versioning.None;
if ( targetObject.needsUpdate !== undefined ) { // material
versioning = this.Versioning.NeedsUpdate;
this.targetObject = targetObject;
} else if ( targetObject.matrixWorldNeedsUpdate !== undefined ) { // node transform
versioning = this.Versioning.MatrixWorldNeedsUpdate;
this.targetObject = targetObject;
}
// determine how the property gets bound
var bindingType = this.BindingType.Direct;
if ( propertyIndex !== undefined ) {
// access a sub element of the property array (only primitives are supported right now)
if ( propertyName === "morphTargetInfluences" ) {
// potential optimization, skip this if propertyIndex is already an integer, and convert the integer string to a true integer.
// support resolving morphTarget names into indices.
if ( ! targetObject.geometry ) {
console.error( 'THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.', this );
return;
}
if ( targetObject.geometry.isBufferGeometry ) {
if ( ! targetObject.geometry.morphAttributes ) {
console.error( 'THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphAttributes.', this );
return;
}
for ( var i = 0; i < this.node.geometry.morphAttributes.position.length; i ++ ) {
if ( targetObject.geometry.morphAttributes.position[ i ].name === propertyIndex ) {
propertyIndex = i;
break;
}
}
} else {
if ( ! targetObject.geometry.morphTargets ) {
console.error( 'THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphTargets.', this );
return;
}
for ( var i = 0; i < this.node.geometry.morphTargets.length; i ++ ) {
if ( targetObject.geometry.morphTargets[ i ].name === propertyIndex ) {
propertyIndex = i;
break;
}
}
}
}
bindingType = this.BindingType.ArrayElement;
this.resolvedProperty = nodeProperty;
this.propertyIndex = propertyIndex;
} else if ( nodeProperty.fromArray !== undefined && nodeProperty.toArray !== undefined ) {
// must use copy for Object3D.Euler/Quaternion
bindingType = this.BindingType.HasFromToArray;
this.resolvedProperty = nodeProperty;
} else if ( Array.isArray( nodeProperty ) ) {
bindingType = this.BindingType.EntireArray;
this.resolvedProperty = nodeProperty;
} else {
this.propertyName = propertyName;
}
// select getter / setter
this.getValue = this.GetterByBindingType[ bindingType ];
this.setValue = this.SetterByBindingTypeAndVersioning[ bindingType ][ versioning ];
},
unbind: function () {
this.node = null;
// back to the prototype version of getValue / setValue
// note: avoiding to mutate the shape of 'this' via 'delete'
this.getValue = this._getValue_unbound;
this.setValue = this._setValue_unbound;
}
} );
//!\ DECLARE ALIAS AFTER assign prototype !
Object.assign( PropertyBinding.prototype, {
// initial state of these methods that calls 'bind'
_getValue_unbound: PropertyBinding.prototype.getValue,
_setValue_unbound: PropertyBinding.prototype.setValue,
} );
/**
*
* A group of objects that receives a shared animation state.
*
* Usage:
*
* - Add objects you would otherwise pass as 'root' to the
* constructor or the .clipAction method of AnimationMixer.
*
* - Instead pass this object as 'root'.
*
* - You can also add and remove objects later when the mixer
* is running.
*
* Note:
*
* Objects of this class appear as one object to the mixer,
* so cache control of the individual objects must be done
* on the group.
*
* Limitation:
*
* - The animated properties must be compatible among the
* all objects in the group.
*
* - A single property can either be controlled through a
* target group or directly, but not both.
*
* @author tschw
*/
function AnimationObjectGroup() {
this.uuid = _Math.generateUUID();
// cached objects followed by the active ones
this._objects = Array.prototype.slice.call( arguments );
this.nCachedObjects_ = 0; // threshold
// note: read by PropertyBinding.Composite
var indices = {};
this._indicesByUUID = indices; // for bookkeeping
for ( var i = 0, n = arguments.length; i !== n; ++ i ) {
indices[ arguments[ i ].uuid ] = i;
}
this._paths = []; // inside: string
this._parsedPaths = []; // inside: { we don't care, here }
this._bindings = []; // inside: Array< PropertyBinding >
this._bindingsIndicesByPath = {}; // inside: indices in these arrays
var scope = this;
this.stats = {
objects: {
get total() {
return scope._objects.length;
},
get inUse() {
return this.total - scope.nCachedObjects_;
}
},
get bindingsPerObject() {
return scope._bindings.length;
}
};
}
Object.assign( AnimationObjectGroup.prototype, {
isAnimationObjectGroup: true,
add: function () {
var objects = this._objects,
nObjects = objects.length,
nCachedObjects = this.nCachedObjects_,
indicesByUUID = this._indicesByUUID,
paths = this._paths,
parsedPaths = this._parsedPaths,
bindings = this._bindings,
nBindings = bindings.length,
knownObject = undefined;
for ( var i = 0, n = arguments.length; i !== n; ++ i ) {
var object = arguments[ i ],
uuid = object.uuid,
index = indicesByUUID[ uuid ];
if ( index === undefined ) {
// unknown object -> add it to the ACTIVE region
index = nObjects ++;
indicesByUUID[ uuid ] = index;
objects.push( object );
// accounting is done, now do the same for all bindings
for ( var j = 0, m = nBindings; j !== m; ++ j ) {
bindings[ j ].push( new PropertyBinding( object, paths[ j ], parsedPaths[ j ] ) );
}
} else if ( index < nCachedObjects ) {
knownObject = objects[ index ];
// move existing object to the ACTIVE region
var firstActiveIndex = -- nCachedObjects,
lastCachedObject = objects[ firstActiveIndex ];
indicesByUUID[ lastCachedObject.uuid ] = index;
objects[ index ] = lastCachedObject;
indicesByUUID[ uuid ] = firstActiveIndex;
objects[ firstActiveIndex ] = object;
// accounting is done, now do the same for all bindings
for ( var j = 0, m = nBindings; j !== m; ++ j ) {
var bindingsForPath = bindings[ j ],
lastCached = bindingsForPath[ firstActiveIndex ],
binding = bindingsForPath[ index ];
bindingsForPath[ index ] = lastCached;
if ( binding === undefined ) {
// since we do not bother to create new bindings
// for objects that are cached, the binding may
// or may not exist
binding = new PropertyBinding( object, paths[ j ], parsedPaths[ j ] );
}
bindingsForPath[ firstActiveIndex ] = binding;
}
} else if ( objects[ index ] !== knownObject ) {
console.error( 'THREE.AnimationObjectGroup: Different objects with the same UUID ' +
'detected. Clean the caches or recreate your infrastructure when reloading scenes.' );
} // else the object is already where we want it to be
} // for arguments
this.nCachedObjects_ = nCachedObjects;
},
remove: function () {
var objects = this._objects,
nCachedObjects = this.nCachedObjects_,
indicesByUUID = this._indicesByUUID,
bindings = this._bindings,
nBindings = bindings.length;
for ( var i = 0, n = arguments.length; i !== n; ++ i ) {
var object = arguments[ i ],
uuid = object.uuid,
index = indicesByUUID[ uuid ];
if ( index !== undefined && index >= nCachedObjects ) {
// move existing object into the CACHED region
var lastCachedIndex = nCachedObjects ++,
firstActiveObject = objects[ lastCachedIndex ];
indicesByUUID[ firstActiveObject.uuid ] = index;
objects[ index ] = firstActiveObject;
indicesByUUID[ uuid ] = lastCachedIndex;
objects[ lastCachedIndex ] = object;
// accounting is done, now do the same for all bindings
for ( var j = 0, m = nBindings; j !== m; ++ j ) {
var bindingsForPath = bindings[ j ],
firstActive = bindingsForPath[ lastCachedIndex ],
binding = bindingsForPath[ index ];
bindingsForPath[ index ] = firstActive;
bindingsForPath[ lastCachedIndex ] = binding;
}
}
} // for arguments
this.nCachedObjects_ = nCachedObjects;
},
// remove & forget
uncache: function () {
var objects = this._objects,
nObjects = objects.length,
nCachedObjects = this.nCachedObjects_,
indicesByUUID = this._indicesByUUID,
bindings = this._bindings,
nBindings = bindings.length;
for ( var i = 0, n = arguments.length; i !== n; ++ i ) {
var object = arguments[ i ],
uuid = object.uuid,
index = indicesByUUID[ uuid ];
if ( index !== undefined ) {
delete indicesByUUID[ uuid ];
if ( index < nCachedObjects ) {
// object is cached, shrink the CACHED region
var firstActiveIndex = -- nCachedObjects,
lastCachedObject = objects[ firstActiveIndex ],
lastIndex = -- nObjects,
lastObject = objects[ lastIndex ];
// last cached object takes this object's place
indicesByUUID[ lastCachedObject.uuid ] = index;
objects[ index ] = lastCachedObject;
// last object goes to the activated slot and pop
indicesByUUID[ lastObject.uuid ] = firstActiveIndex;
objects[ firstActiveIndex ] = lastObject;
objects.pop();
// accounting is done, now do the same for all bindings
for ( var j = 0, m = nBindings; j !== m; ++ j ) {
var bindingsForPath = bindings[ j ],
lastCached = bindingsForPath[ firstActiveIndex ],
last = bindingsForPath[ lastIndex ];
bindingsForPath[ index ] = lastCached;
bindingsForPath[ firstActiveIndex ] = last;
bindingsForPath.pop();
}
} else {
// object is active, just swap with the last and pop
var lastIndex = -- nObjects,
lastObject = objects[ lastIndex ];
indicesByUUID[ lastObject.uuid ] = index;
objects[ index ] = lastObject;
objects.pop();
// accounting is done, now do the same for all bindings
for ( var j = 0, m = nBindings; j !== m; ++ j ) {
var bindingsForPath = bindings[ j ];
bindingsForPath[ index ] = bindingsForPath[ lastIndex ];
bindingsForPath.pop();
}
} // cached or active
} // if object is known
} // for arguments
this.nCachedObjects_ = nCachedObjects;
},
// Internal interface used by befriended PropertyBinding.Composite:
subscribe_: function ( path, parsedPath ) {
// returns an array of bindings for the given path that is changed
// according to the contained objects in the group
var indicesByPath = this._bindingsIndicesByPath,
index = indicesByPath[ path ],
bindings = this._bindings;
if ( index !== undefined ) return bindings[ index ];
var paths = this._paths,
parsedPaths = this._parsedPaths,
objects = this._objects,
nObjects = objects.length,
nCachedObjects = this.nCachedObjects_,
bindingsForPath = new Array( nObjects );
index = bindings.length;
indicesByPath[ path ] = index;
paths.push( path );
parsedPaths.push( parsedPath );
bindings.push( bindingsForPath );
for ( var i = nCachedObjects, n = objects.length; i !== n; ++ i ) {
var object = objects[ i ];
bindingsForPath[ i ] = new PropertyBinding( object, path, parsedPath );
}
return bindingsForPath;
},
unsubscribe_: function ( path ) {
// tells the group to forget about a property path and no longer
// update the array previously obtained with 'subscribe_'
var indicesByPath = this._bindingsIndicesByPath,
index = indicesByPath[ path ];
if ( index !== undefined ) {
var paths = this._paths,
parsedPaths = this._parsedPaths,
bindings = this._bindings,
lastBindingsIndex = bindings.length - 1,
lastBindings = bindings[ lastBindingsIndex ],
lastBindingsPath = path[ lastBindingsIndex ];
indicesByPath[ lastBindingsPath ] = index;
bindings[ index ] = lastBindings;
bindings.pop();
parsedPaths[ index ] = parsedPaths[ lastBindingsIndex ];
parsedPaths.pop();
paths[ index ] = paths[ lastBindingsIndex ];
paths.pop();
}
}
} );
/**
*
* Action provided by AnimationMixer for scheduling clip playback on specific
* objects.
*
* @author Ben Houston / http://clara.io/
* @author David Sarno / http://lighthaus.us/
* @author tschw
*
*/
function AnimationAction( mixer, clip, localRoot ) {
this._mixer = mixer;
this._clip = clip;
this._localRoot = localRoot || null;
var tracks = clip.tracks,
nTracks = tracks.length,
interpolants = new Array( nTracks );
var interpolantSettings = {
endingStart: ZeroCurvatureEnding,
endingEnd: ZeroCurvatureEnding
};
for ( var i = 0; i !== nTracks; ++ i ) {
var interpolant = tracks[ i ].createInterpolant( null );
interpolants[ i ] = interpolant;
interpolant.settings = interpolantSettings;
}
this._interpolantSettings = interpolantSettings;
this._interpolants = interpolants; // bound by the mixer
// inside: PropertyMixer (managed by the mixer)
this._propertyBindings = new Array( nTracks );
this._cacheIndex = null; // for the memory manager
this._byClipCacheIndex = null; // for the memory manager
this._timeScaleInterpolant = null;
this._weightInterpolant = null;
this.loop = LoopRepeat;
this._loopCount = - 1;
// global mixer time when the action is to be started
// it's set back to 'null' upon start of the action
this._startTime = null;
// scaled local time of the action
// gets clamped or wrapped to 0..clip.duration according to loop
this.time = 0;
this.timeScale = 1;
this._effectiveTimeScale = 1;
this.weight = 1;
this._effectiveWeight = 1;
this.repetitions = Infinity; // no. of repetitions when looping
this.paused = false; // true -> zero effective time scale
this.enabled = true; // false -> zero effective weight
this.clampWhenFinished = false; // keep feeding the last frame?
this.zeroSlopeAtStart = true; // for smooth interpolation w/o separate
this.zeroSlopeAtEnd = true; // clips for start, loop and end
}
Object.assign( AnimationAction.prototype, {
// State & Scheduling
play: function () {
this._mixer._activateAction( this );
return this;
},
stop: function () {
this._mixer._deactivateAction( this );
return this.reset();
},
reset: function () {
this.paused = false;
this.enabled = true;
this.time = 0; // restart clip
this._loopCount = - 1; // forget previous loops
this._startTime = null; // forget scheduling
return this.stopFading().stopWarping();
},
isRunning: function () {
return this.enabled && ! this.paused && this.timeScale !== 0 &&
this._startTime === null && this._mixer._isActiveAction( this );
},
// return true when play has been called
isScheduled: function () {
return this._mixer._isActiveAction( this );
},
startAt: function ( time ) {
this._startTime = time;
return this;
},
setLoop: function ( mode, repetitions ) {
this.loop = mode;
this.repetitions = repetitions;
return this;
},
// Weight
// set the weight stopping any scheduled fading
// although .enabled = false yields an effective weight of zero, this
// method does *not* change .enabled, because it would be confusing
setEffectiveWeight: function ( weight ) {
this.weight = weight;
// note: same logic as when updated at runtime
this._effectiveWeight = this.enabled ? weight : 0;
return this.stopFading();
},
// return the weight considering fading and .enabled
getEffectiveWeight: function () {
return this._effectiveWeight;
},
fadeIn: function ( duration ) {
return this._scheduleFading( duration, 0, 1 );
},
fadeOut: function ( duration ) {
return this._scheduleFading( duration, 1, 0 );
},
crossFadeFrom: function ( fadeOutAction, duration, warp ) {
fadeOutAction.fadeOut( duration );
this.fadeIn( duration );
if ( warp ) {
var fadeInDuration = this._clip.duration,
fadeOutDuration = fadeOutAction._clip.duration,
startEndRatio = fadeOutDuration / fadeInDuration,
endStartRatio = fadeInDuration / fadeOutDuration;
fadeOutAction.warp( 1.0, startEndRatio, duration );
this.warp( endStartRatio, 1.0, duration );
}
return this;
},
crossFadeTo: function ( fadeInAction, duration, warp ) {
return fadeInAction.crossFadeFrom( this, duration, warp );
},
stopFading: function () {
var weightInterpolant = this._weightInterpolant;
if ( weightInterpolant !== null ) {
this._weightInterpolant = null;
this._mixer._takeBackControlInterpolant( weightInterpolant );
}
return this;
},
// Time Scale Control
// set the time scale stopping any scheduled warping
// although .paused = true yields an effective time scale of zero, this
// method does *not* change .paused, because it would be confusing
setEffectiveTimeScale: function ( timeScale ) {
this.timeScale = timeScale;
this._effectiveTimeScale = this.paused ? 0 : timeScale;
return this.stopWarping();
},
// return the time scale considering warping and .paused
getEffectiveTimeScale: function () {
return this._effectiveTimeScale;
},
setDuration: function ( duration ) {
this.timeScale = this._clip.duration / duration;
return this.stopWarping();
},
syncWith: function ( action ) {
this.time = action.time;
this.timeScale = action.timeScale;
return this.stopWarping();
},
halt: function ( duration ) {
return this.warp( this._effectiveTimeScale, 0, duration );
},
warp: function ( startTimeScale, endTimeScale, duration ) {
var mixer = this._mixer, now = mixer.time,
interpolant = this._timeScaleInterpolant,
timeScale = this.timeScale;
if ( interpolant === null ) {
interpolant = mixer._lendControlInterpolant();
this._timeScaleInterpolant = interpolant;
}
var times = interpolant.parameterPositions,
values = interpolant.sampleValues;
times[ 0 ] = now;
times[ 1 ] = now + duration;
values[ 0 ] = startTimeScale / timeScale;
values[ 1 ] = endTimeScale / timeScale;
return this;
},
stopWarping: function () {
var timeScaleInterpolant = this._timeScaleInterpolant;
if ( timeScaleInterpolant !== null ) {
this._timeScaleInterpolant = null;
this._mixer._takeBackControlInterpolant( timeScaleInterpolant );
}
return this;
},
// Object Accessors
getMixer: function () {
return this._mixer;
},
getClip: function () {
return this._clip;
},
getRoot: function () {
return this._localRoot || this._mixer._root;
},
// Interna
_update: function ( time, deltaTime, timeDirection, accuIndex ) {
// called by the mixer
if ( ! this.enabled ) {
// call ._updateWeight() to update ._effectiveWeight
this._updateWeight( time );
return;
}
var startTime = this._startTime;
if ( startTime !== null ) {
// check for scheduled start of action
var timeRunning = ( time - startTime ) * timeDirection;
if ( timeRunning < 0 || timeDirection === 0 ) {
return; // yet to come / don't decide when delta = 0
}
// start
this._startTime = null; // unschedule
deltaTime = timeDirection * timeRunning;
}
// apply time scale and advance time
deltaTime *= this._updateTimeScale( time );
var clipTime = this._updateTime( deltaTime );
// note: _updateTime may disable the action resulting in
// an effective weight of 0
var weight = this._updateWeight( time );
if ( weight > 0 ) {
var interpolants = this._interpolants;
var propertyMixers = this._propertyBindings;
for ( var j = 0, m = interpolants.length; j !== m; ++ j ) {
interpolants[ j ].evaluate( clipTime );
propertyMixers[ j ].accumulate( accuIndex, weight );
}
}
},
_updateWeight: function ( time ) {
var weight = 0;
if ( this.enabled ) {
weight = this.weight;
var interpolant = this._weightInterpolant;
if ( interpolant !== null ) {
var interpolantValue = interpolant.evaluate( time )[ 0 ];
weight *= interpolantValue;
if ( time > interpolant.parameterPositions[ 1 ] ) {
this.stopFading();
if ( interpolantValue === 0 ) {
// faded out, disable
this.enabled = false;
}
}
}
}
this._effectiveWeight = weight;
return weight;
},
_updateTimeScale: function ( time ) {
var timeScale = 0;
if ( ! this.paused ) {
timeScale = this.timeScale;
var interpolant = this._timeScaleInterpolant;
if ( interpolant !== null ) {
var interpolantValue = interpolant.evaluate( time )[ 0 ];
timeScale *= interpolantValue;
if ( time > interpolant.parameterPositions[ 1 ] ) {
this.stopWarping();
if ( timeScale === 0 ) {
// motion has halted, pause
this.paused = true;
} else {
// warp done - apply final time scale
this.timeScale = timeScale;
}
}
}
}
this._effectiveTimeScale = timeScale;
return timeScale;
},
_updateTime: function ( deltaTime ) {
var time = this.time + deltaTime;
if ( deltaTime === 0 ) return time;
var duration = this._clip.duration,
loop = this.loop,
loopCount = this._loopCount;
if ( loop === LoopOnce ) {
if ( loopCount === - 1 ) {
// just started
this._loopCount = 0;
this._setEndings( true, true, false );
}
handle_stop: {
if ( time >= duration ) {
time = duration;
} else if ( time < 0 ) {
time = 0;
} else break handle_stop;
if ( this.clampWhenFinished ) this.paused = true;
else this.enabled = false;
this._mixer.dispatchEvent( {
type: 'finished', action: this,
direction: deltaTime < 0 ? - 1 : 1
} );
}
} else { // repetitive Repeat or PingPong
var pingPong = ( loop === LoopPingPong );
if ( loopCount === - 1 ) {
// just started
if ( deltaTime >= 0 ) {
loopCount = 0;
this._setEndings( true, this.repetitions === 0, pingPong );
} else {
// when looping in reverse direction, the initial
// transition through zero counts as a repetition,
// so leave loopCount at -1
this._setEndings( this.repetitions === 0, true, pingPong );
}
}
if ( time >= duration || time < 0 ) {
// wrap around
var loopDelta = Math.floor( time / duration ); // signed
time -= duration * loopDelta;
loopCount += Math.abs( loopDelta );
var pending = this.repetitions - loopCount;
if ( pending <= 0 ) {
// have to stop (switch state, clamp time, fire event)
if ( this.clampWhenFinished ) this.paused = true;
else this.enabled = false;
time = deltaTime > 0 ? duration : 0;
this._mixer.dispatchEvent( {
type: 'finished', action: this,
direction: deltaTime > 0 ? 1 : - 1
} );
} else {
// keep running
if ( pending === 1 ) {
// entering the last round
var atStart = deltaTime < 0;
this._setEndings( atStart, ! atStart, pingPong );
} else {
this._setEndings( false, false, pingPong );
}
this._loopCount = loopCount;
this._mixer.dispatchEvent( {
type: 'loop', action: this, loopDelta: loopDelta
} );
}
}
if ( pingPong && ( loopCount & 1 ) === 1 ) {
// invert time for the "pong round"
this.time = time;
return duration - time;
}
}
this.time = time;
return time;
},
_setEndings: function ( atStart, atEnd, pingPong ) {
var settings = this._interpolantSettings;
if ( pingPong ) {
settings.endingStart = ZeroSlopeEnding;
settings.endingEnd = ZeroSlopeEnding;
} else {
// assuming for LoopOnce atStart == atEnd == true
if ( atStart ) {
settings.endingStart = this.zeroSlopeAtStart ? ZeroSlopeEnding : ZeroCurvatureEnding;
} else {
settings.endingStart = WrapAroundEnding;
}
if ( atEnd ) {
settings.endingEnd = this.zeroSlopeAtEnd ? ZeroSlopeEnding : ZeroCurvatureEnding;
} else {
settings.endingEnd = WrapAroundEnding;
}
}
},
_scheduleFading: function ( duration, weightNow, weightThen ) {
var mixer = this._mixer, now = mixer.time,
interpolant = this._weightInterpolant;
if ( interpolant === null ) {
interpolant = mixer._lendControlInterpolant();
this._weightInterpolant = interpolant;
}
var times = interpolant.parameterPositions,
values = interpolant.sampleValues;
times[ 0 ] = now; values[ 0 ] = weightNow;
times[ 1 ] = now + duration; values[ 1 ] = weightThen;
return this;
}
} );
/**
*
* Player for AnimationClips.
*
*
* @author Ben Houston / http://clara.io/
* @author David Sarno / http://lighthaus.us/
* @author tschw
*/
function AnimationMixer( root ) {
this._root = root;
this._initMemoryManager();
this._accuIndex = 0;
this.time = 0;
this.timeScale = 1.0;
}
AnimationMixer.prototype = Object.assign( Object.create( EventDispatcher.prototype ), {
constructor: AnimationMixer,
_bindAction: function ( action, prototypeAction ) {
var root = action._localRoot || this._root,
tracks = action._clip.tracks,
nTracks = tracks.length,
bindings = action._propertyBindings,
interpolants = action._interpolants,
rootUuid = root.uuid,
bindingsByRoot = this._bindingsByRootAndName,
bindingsByName = bindingsByRoot[ rootUuid ];
if ( bindingsByName === undefined ) {
bindingsByName = {};
bindingsByRoot[ rootUuid ] = bindingsByName;
}
for ( var i = 0; i !== nTracks; ++ i ) {
var track = tracks[ i ],
trackName = track.name,
binding = bindingsByName[ trackName ];
if ( binding !== undefined ) {
bindings[ i ] = binding;
} else {
binding = bindings[ i ];
if ( binding !== undefined ) {
// existing binding, make sure the cache knows
if ( binding._cacheIndex === null ) {
++ binding.referenceCount;
this._addInactiveBinding( binding, rootUuid, trackName );
}
continue;
}
var path = prototypeAction && prototypeAction.
_propertyBindings[ i ].binding.parsedPath;
binding = new PropertyMixer(
PropertyBinding.create( root, trackName, path ),
track.ValueTypeName, track.getValueSize() );
++ binding.referenceCount;
this._addInactiveBinding( binding, rootUuid, trackName );
bindings[ i ] = binding;
}
interpolants[ i ].resultBuffer = binding.buffer;
}
},
_activateAction: function ( action ) {
if ( ! this._isActiveAction( action ) ) {
if ( action._cacheIndex === null ) {
// this action has been forgotten by the cache, but the user
// appears to be still using it -> rebind
var rootUuid = ( action._localRoot || this._root ).uuid,
clipUuid = action._clip.uuid,
actionsForClip = this._actionsByClip[ clipUuid ];
this._bindAction( action,
actionsForClip && actionsForClip.knownActions[ 0 ] );
this._addInactiveAction( action, clipUuid, rootUuid );
}
var bindings = action._propertyBindings;
// increment reference counts / sort out state
for ( var i = 0, n = bindings.length; i !== n; ++ i ) {
var binding = bindings[ i ];
if ( binding.useCount ++ === 0 ) {
this._lendBinding( binding );
binding.saveOriginalState();
}
}
this._lendAction( action );
}
},
_deactivateAction: function ( action ) {
if ( this._isActiveAction( action ) ) {
var bindings = action._propertyBindings;
// decrement reference counts / sort out state
for ( var i = 0, n = bindings.length; i !== n; ++ i ) {
var binding = bindings[ i ];
if ( -- binding.useCount === 0 ) {
binding.restoreOriginalState();
this._takeBackBinding( binding );
}
}
this._takeBackAction( action );
}
},
// Memory manager
_initMemoryManager: function () {
this._actions = []; // 'nActiveActions' followed by inactive ones
this._nActiveActions = 0;
this._actionsByClip = {};
// inside:
// {
// knownActions: Array< AnimationAction > - used as prototypes
// actionByRoot: AnimationAction - lookup
// }
this._bindings = []; // 'nActiveBindings' followed by inactive ones
this._nActiveBindings = 0;
this._bindingsByRootAndName = {}; // inside: Map< name, PropertyMixer >
this._controlInterpolants = []; // same game as above
this._nActiveControlInterpolants = 0;
var scope = this;
this.stats = {
actions: {
get total() {
return scope._actions.length;
},
get inUse() {
return scope._nActiveActions;
}
},
bindings: {
get total() {
return scope._bindings.length;
},
get inUse() {
return scope._nActiveBindings;
}
},
controlInterpolants: {
get total() {
return scope._controlInterpolants.length;
},
get inUse() {
return scope._nActiveControlInterpolants;
}
}
};
},
// Memory management for AnimationAction objects
_isActiveAction: function ( action ) {
var index = action._cacheIndex;
return index !== null && index < this._nActiveActions;
},
_addInactiveAction: function ( action, clipUuid, rootUuid ) {
var actions = this._actions,
actionsByClip = this._actionsByClip,
actionsForClip = actionsByClip[ clipUuid ];
if ( actionsForClip === undefined ) {
actionsForClip = {
knownActions: [ action ],
actionByRoot: {}
};
action._byClipCacheIndex = 0;
actionsByClip[ clipUuid ] = actionsForClip;
} else {
var knownActions = actionsForClip.knownActions;
action._byClipCacheIndex = knownActions.length;
knownActions.push( action );
}
action._cacheIndex = actions.length;
actions.push( action );
actionsForClip.actionByRoot[ rootUuid ] = action;
},
_removeInactiveAction: function ( action ) {
var actions = this._actions,
lastInactiveAction = actions[ actions.length - 1 ],
cacheIndex = action._cacheIndex;
lastInactiveAction._cacheIndex = cacheIndex;
actions[ cacheIndex ] = lastInactiveAction;
actions.pop();
action._cacheIndex = null;
var clipUuid = action._clip.uuid,
actionsByClip = this._actionsByClip,
actionsForClip = actionsByClip[ clipUuid ],
knownActionsForClip = actionsForClip.knownActions,
lastKnownAction =
knownActionsForClip[ knownActionsForClip.length - 1 ],
byClipCacheIndex = action._byClipCacheIndex;
lastKnownAction._byClipCacheIndex = byClipCacheIndex;
knownActionsForClip[ byClipCacheIndex ] = lastKnownAction;
knownActionsForClip.pop();
action._byClipCacheIndex = null;
var actionByRoot = actionsForClip.actionByRoot,
rootUuid = ( action._localRoot || this._root ).uuid;
delete actionByRoot[ rootUuid ];
if ( knownActionsForClip.length === 0 ) {
delete actionsByClip[ clipUuid ];
}
this._removeInactiveBindingsForAction( action );
},
_removeInactiveBindingsForAction: function ( action ) {
var bindings = action._propertyBindings;
for ( var i = 0, n = bindings.length; i !== n; ++ i ) {
var binding = bindings[ i ];
if ( -- binding.referenceCount === 0 ) {
this._removeInactiveBinding( binding );
}
}
},
_lendAction: function ( action ) {
// [ active actions | inactive actions ]
// [ active actions >| inactive actions ]
// s a
// <-swap->
// a s
var actions = this._actions,
prevIndex = action._cacheIndex,
lastActiveIndex = this._nActiveActions ++,
firstInactiveAction = actions[ lastActiveIndex ];
action._cacheIndex = lastActiveIndex;
actions[ lastActiveIndex ] = action;
firstInactiveAction._cacheIndex = prevIndex;
actions[ prevIndex ] = firstInactiveAction;
},
_takeBackAction: function ( action ) {
// [ active actions | inactive actions ]
// [ active actions |< inactive actions ]
// a s
// <-swap->
// s a
var actions = this._actions,
prevIndex = action._cacheIndex,
firstInactiveIndex = -- this._nActiveActions,
lastActiveAction = actions[ firstInactiveIndex ];
action._cacheIndex = firstInactiveIndex;
actions[ firstInactiveIndex ] = action;
lastActiveAction._cacheIndex = prevIndex;
actions[ prevIndex ] = lastActiveAction;
},
// Memory management for PropertyMixer objects
_addInactiveBinding: function ( binding, rootUuid, trackName ) {
var bindingsByRoot = this._bindingsByRootAndName,
bindingByName = bindingsByRoot[ rootUuid ],
bindings = this._bindings;
if ( bindingByName === undefined ) {
bindingByName = {};
bindingsByRoot[ rootUuid ] = bindingByName;
}
bindingByName[ trackName ] = binding;
binding._cacheIndex = bindings.length;
bindings.push( binding );
},
_removeInactiveBinding: function ( binding ) {
var bindings = this._bindings,
propBinding = binding.binding,
rootUuid = propBinding.rootNode.uuid,
trackName = propBinding.path,
bindingsByRoot = this._bindingsByRootAndName,
bindingByName = bindingsByRoot[ rootUuid ],
lastInactiveBinding = bindings[ bindings.length - 1 ],
cacheIndex = binding._cacheIndex;
lastInactiveBinding._cacheIndex = cacheIndex;
bindings[ cacheIndex ] = lastInactiveBinding;
bindings.pop();
delete bindingByName[ trackName ];
remove_empty_map: {
for ( var _ in bindingByName ) break remove_empty_map; // eslint-disable-line no-unused-vars
delete bindingsByRoot[ rootUuid ];
}
},
_lendBinding: function ( binding ) {
var bindings = this._bindings,
prevIndex = binding._cacheIndex,
lastActiveIndex = this._nActiveBindings ++,
firstInactiveBinding = bindings[ lastActiveIndex ];
binding._cacheIndex = lastActiveIndex;
bindings[ lastActiveIndex ] = binding;
firstInactiveBinding._cacheIndex = prevIndex;
bindings[ prevIndex ] = firstInactiveBinding;
},
_takeBackBinding: function ( binding ) {
var bindings = this._bindings,
prevIndex = binding._cacheIndex,
firstInactiveIndex = -- this._nActiveBindings,
lastActiveBinding = bindings[ firstInactiveIndex ];
binding._cacheIndex = firstInactiveIndex;
bindings[ firstInactiveIndex ] = binding;
lastActiveBinding._cacheIndex = prevIndex;
bindings[ prevIndex ] = lastActiveBinding;
},
// Memory management of Interpolants for weight and time scale
_lendControlInterpolant: function () {
var interpolants = this._controlInterpolants,
lastActiveIndex = this._nActiveControlInterpolants ++,
interpolant = interpolants[ lastActiveIndex ];
if ( interpolant === undefined ) {
interpolant = new LinearInterpolant(
new Float32Array( 2 ), new Float32Array( 2 ),
1, this._controlInterpolantsResultBuffer );
interpolant.__cacheIndex = lastActiveIndex;
interpolants[ lastActiveIndex ] = interpolant;
}
return interpolant;
},
_takeBackControlInterpolant: function ( interpolant ) {
var interpolants = this._controlInterpolants,
prevIndex = interpolant.__cacheIndex,
firstInactiveIndex = -- this._nActiveControlInterpolants,
lastActiveInterpolant = interpolants[ firstInactiveIndex ];
interpolant.__cacheIndex = firstInactiveIndex;
interpolants[ firstInactiveIndex ] = interpolant;
lastActiveInterpolant.__cacheIndex = prevIndex;
interpolants[ prevIndex ] = lastActiveInterpolant;
},
_controlInterpolantsResultBuffer: new Float32Array( 1 ),
// return an action for a clip optionally using a custom root target
// object (this method allocates a lot of dynamic memory in case a
// previously unknown clip/root combination is specified)
clipAction: function ( clip, optionalRoot ) {
var root = optionalRoot || this._root,
rootUuid = root.uuid,
clipObject = typeof clip === 'string' ?
AnimationClip.findByName( root, clip ) : clip,
clipUuid = clipObject !== null ? clipObject.uuid : clip,
actionsForClip = this._actionsByClip[ clipUuid ],
prototypeAction = null;
if ( actionsForClip !== undefined ) {
var existingAction =
actionsForClip.actionByRoot[ rootUuid ];
if ( existingAction !== undefined ) {
return existingAction;
}
// we know the clip, so we don't have to parse all
// the bindings again but can just copy
prototypeAction = actionsForClip.knownActions[ 0 ];
// also, take the clip from the prototype action
if ( clipObject === null )
clipObject = prototypeAction._clip;
}
// clip must be known when specified via string
if ( clipObject === null ) return null;
// allocate all resources required to run it
var newAction = new AnimationAction( this, clipObject, optionalRoot );
this._bindAction( newAction, prototypeAction );
// and make the action known to the memory manager
this._addInactiveAction( newAction, clipUuid, rootUuid );
return newAction;
},
// get an existing action
existingAction: function ( clip, optionalRoot ) {
var root = optionalRoot || this._root,
rootUuid = root.uuid,
clipObject = typeof clip === 'string' ?
AnimationClip.findByName( root, clip ) : clip,
clipUuid = clipObject ? clipObject.uuid : clip,
actionsForClip = this._actionsByClip[ clipUuid ];
if ( actionsForClip !== undefined ) {
return actionsForClip.actionByRoot[ rootUuid ] || null;
}
return null;
},
// deactivates all previously scheduled actions
stopAllAction: function () {
var actions = this._actions,
nActions = this._nActiveActions,
bindings = this._bindings,
nBindings = this._nActiveBindings;
this._nActiveActions = 0;
this._nActiveBindings = 0;
for ( var i = 0; i !== nActions; ++ i ) {
actions[ i ].reset();
}
for ( var i = 0; i !== nBindings; ++ i ) {
bindings[ i ].useCount = 0;
}
return this;
},
// advance the time and update apply the animation
update: function ( deltaTime ) {
deltaTime *= this.timeScale;
var actions = this._actions,
nActions = this._nActiveActions,
time = this.time += deltaTime,
timeDirection = Math.sign( deltaTime ),
accuIndex = this._accuIndex ^= 1;
// run active actions
for ( var i = 0; i !== nActions; ++ i ) {
var action = actions[ i ];
action._update( time, deltaTime, timeDirection, accuIndex );
}
// update scene graph
var bindings = this._bindings,
nBindings = this._nActiveBindings;
for ( var i = 0; i !== nBindings; ++ i ) {
bindings[ i ].apply( accuIndex );
}
return this;
},
// return this mixer's root target object
getRoot: function () {
return this._root;
},
// free all resources specific to a particular clip
uncacheClip: function ( clip ) {
var actions = this._actions,
clipUuid = clip.uuid,
actionsByClip = this._actionsByClip,
actionsForClip = actionsByClip[ clipUuid ];
if ( actionsForClip !== undefined ) {
// note: just calling _removeInactiveAction would mess up the
// iteration state and also require updating the state we can
// just throw away
var actionsToRemove = actionsForClip.knownActions;
for ( var i = 0, n = actionsToRemove.length; i !== n; ++ i ) {
var action = actionsToRemove[ i ];
this._deactivateAction( action );
var cacheIndex = action._cacheIndex,
lastInactiveAction = actions[ actions.length - 1 ];
action._cacheIndex = null;
action._byClipCacheIndex = null;
lastInactiveAction._cacheIndex = cacheIndex;
actions[ cacheIndex ] = lastInactiveAction;
actions.pop();
this._removeInactiveBindingsForAction( action );
}
delete actionsByClip[ clipUuid ];
}
},
// free all resources specific to a particular root target object
uncacheRoot: function ( root ) {
var rootUuid = root.uuid,
actionsByClip = this._actionsByClip;
for ( var clipUuid in actionsByClip ) {
var actionByRoot = actionsByClip[ clipUuid ].actionByRoot,
action = actionByRoot[ rootUuid ];
if ( action !== undefined ) {
this._deactivateAction( action );
this._removeInactiveAction( action );
}
}
var bindingsByRoot = this._bindingsByRootAndName,
bindingByName = bindingsByRoot[ rootUuid ];
if ( bindingByName !== undefined ) {
for ( var trackName in bindingByName ) {
var binding = bindingByName[ trackName ];
binding.restoreOriginalState();
this._removeInactiveBinding( binding );
}
}
},
// remove a targeted clip from the cache
uncacheAction: function ( clip, optionalRoot ) {
var action = this.existingAction( clip, optionalRoot );
if ( action !== null ) {
this._deactivateAction( action );
this._removeInactiveAction( action );
}
}
} );
/**
* @author mrdoob / http://mrdoob.com/
*/
function Uniform( value ) {
if ( typeof value === 'string' ) {
console.warn( 'THREE.Uniform: Type parameter is no longer needed.' );
value = arguments[ 1 ];
}
this.value = value;
}
Uniform.prototype.clone = function () {
return new Uniform( this.value.clone === undefined ? this.value : this.value.clone() );
};
/**
* @author benaadams / https://twitter.com/ben_a_adams
*/
function InstancedBufferGeometry() {
BufferGeometry.call( this );
this.type = 'InstancedBufferGeometry';
this.maxInstancedCount = undefined;
}
InstancedBufferGeometry.prototype = Object.assign( Object.create( BufferGeometry.prototype ), {
constructor: InstancedBufferGeometry,
isInstancedBufferGeometry: true,
copy: function ( source ) {
BufferGeometry.prototype.copy.call( this, source );
this.maxInstancedCount = source.maxInstancedCount;
return this;
},
clone: function () {
return new this.constructor().copy( this );
}
} );
/**
* @author benaadams / https://twitter.com/ben_a_adams
*/
function InterleavedBufferAttribute( interleavedBuffer, itemSize, offset, normalized ) {
this.data = interleavedBuffer;
this.itemSize = itemSize;
this.offset = offset;
this.normalized = normalized === true;
}
Object.defineProperties( InterleavedBufferAttribute.prototype, {
count: {
get: function () {
return this.data.count;
}
},
array: {
get: function () {
return this.data.array;
}
}
} );
Object.assign( InterleavedBufferAttribute.prototype, {
isInterleavedBufferAttribute: true,
setX: function ( index, x ) {
this.data.array[ index * this.data.stride + this.offset ] = x;
return this;
},
setY: function ( index, y ) {
this.data.array[ index * this.data.stride + this.offset + 1 ] = y;
return this;
},
setZ: function ( index, z ) {
this.data.array[ index * this.data.stride + this.offset + 2 ] = z;
return this;
},
setW: function ( index, w ) {
this.data.array[ index * this.data.stride + this.offset + 3 ] = w;
return this;
},
getX: function ( index ) {
return this.data.array[ index * this.data.stride + this.offset ];
},
getY: function ( index ) {
return this.data.array[ index * this.data.stride + this.offset + 1 ];
},
getZ: function ( index ) {
return this.data.array[ index * this.data.stride + this.offset + 2 ];
},
getW: function ( index ) {
return this.data.array[ index * this.data.stride + this.offset + 3 ];
},
setXY: function ( index, x, y ) {
index = index * this.data.stride + this.offset;
this.data.array[ index + 0 ] = x;
this.data.array[ index + 1 ] = y;
return this;
},
setXYZ: function ( index, x, y, z ) {
index = index * this.data.stride + this.offset;
this.data.array[ index + 0 ] = x;
this.data.array[ index + 1 ] = y;
this.data.array[ index + 2 ] = z;
return this;
},
setXYZW: function ( index, x, y, z, w ) {
index = index * this.data.stride + this.offset;
this.data.array[ index + 0 ] = x;
this.data.array[ index + 1 ] = y;
this.data.array[ index + 2 ] = z;
this.data.array[ index + 3 ] = w;
return this;
}
} );
/**
* @author benaadams / https://twitter.com/ben_a_adams
*/
function InterleavedBuffer( array, stride ) {
this.array = array;
this.stride = stride;
this.count = array !== undefined ? array.length / stride : 0;
this.dynamic = false;
this.updateRange = { offset: 0, count: - 1 };
this.version = 0;
}
Object.defineProperty( InterleavedBuffer.prototype, 'needsUpdate', {
set: function ( value ) {
if ( value === true ) this.version ++;
}
} );
Object.assign( InterleavedBuffer.prototype, {
isInterleavedBuffer: true,
onUploadCallback: function () {},
setArray: function ( array ) {
if ( Array.isArray( array ) ) {
throw new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' );
}
this.count = array !== undefined ? array.length / this.stride : 0;
this.array = array;
return this;
},
setDynamic: function ( value ) {
this.dynamic = value;
return this;
},
copy: function ( source ) {
this.array = new source.array.constructor( source.array );
this.count = source.count;
this.stride = source.stride;
this.dynamic = source.dynamic;
return this;
},
copyAt: function ( index1, attribute, index2 ) {
index1 *= this.stride;
index2 *= attribute.stride;
for ( var i = 0, l = this.stride; i < l; i ++ ) {
this.array[ index1 + i ] = attribute.array[ index2 + i ];
}
return this;
},
set: function ( value, offset ) {
if ( offset === undefined ) offset = 0;
this.array.set( value, offset );
return this;
},
clone: function () {
return new this.constructor().copy( this );
},
onUpload: function ( callback ) {
this.onUploadCallback = callback;
return this;
}
} );
/**
* @author benaadams / https://twitter.com/ben_a_adams
*/
function InstancedInterleavedBuffer( array, stride, meshPerAttribute ) {
InterleavedBuffer.call( this, array, stride );
this.meshPerAttribute = meshPerAttribute || 1;
}
InstancedInterleavedBuffer.prototype = Object.assign( Object.create( InterleavedBuffer.prototype ), {
constructor: InstancedInterleavedBuffer,
isInstancedInterleavedBuffer: true,
copy: function ( source ) {
InterleavedBuffer.prototype.copy.call( this, source );
this.meshPerAttribute = source.meshPerAttribute;
return this;
}
} );
/**
* @author benaadams / https://twitter.com/ben_a_adams
*/
function InstancedBufferAttribute( array, itemSize, meshPerAttribute ) {
BufferAttribute.call( this, array, itemSize );
this.meshPerAttribute = meshPerAttribute || 1;
}
InstancedBufferAttribute.prototype = Object.assign( Object.create( BufferAttribute.prototype ), {
constructor: InstancedBufferAttribute,
isInstancedBufferAttribute: true,
copy: function ( source ) {
BufferAttribute.prototype.copy.call( this, source );
this.meshPerAttribute = source.meshPerAttribute;
return this;
}
} );
/**
* @author mrdoob / http://mrdoob.com/
* @author bhouston / http://clara.io/
* @author stephomi / http://stephaneginier.com/
*/
function Raycaster( origin, direction, near, far ) {
this.ray = new Ray( origin, direction );
// direction is assumed to be normalized (for accurate distance calculations)
this.near = near || 0;
this.far = far || Infinity;
this.params = {
Mesh: {},
Line: {},
LOD: {},
Points: { threshold: 1 },
Sprite: {}
};
Object.defineProperties( this.params, {
PointCloud: {
get: function () {
console.warn( 'THREE.Raycaster: params.PointCloud has been renamed to params.Points.' );
return this.Points;
}
}
} );
}
function ascSort( a, b ) {
return a.distance - b.distance;
}
function intersectObject( object, raycaster, intersects, recursive ) {
if ( object.visible === false ) return;
object.raycast( raycaster, intersects );
if ( recursive === true ) {
var children = object.children;
for ( var i = 0, l = children.length; i < l; i ++ ) {
intersectObject( children[ i ], raycaster, intersects, true );
}
}
}
Object.assign( Raycaster.prototype, {
linePrecision: 1,
set: function ( origin, direction ) {
// direction is assumed to be normalized (for accurate distance calculations)
this.ray.set( origin, direction );
},
setFromCamera: function ( coords, camera ) {
if ( ( camera && camera.isPerspectiveCamera ) ) {
this.ray.origin.setFromMatrixPosition( camera.matrixWorld );
this.ray.direction.set( coords.x, coords.y, 0.5 ).unproject( camera ).sub( this.ray.origin ).normalize();
} else if ( ( camera && camera.isOrthographicCamera ) ) {
this.ray.origin.set( coords.x, coords.y, ( camera.near + camera.far ) / ( camera.near - camera.far ) ).unproject( camera ); // set origin in plane of camera
this.ray.direction.set( 0, 0, - 1 ).transformDirection( camera.matrixWorld );
} else {
console.error( 'THREE.Raycaster: Unsupported camera type.' );
}
},
intersectObject: function ( object, recursive, optionalTarget ) {
var intersects = optionalTarget || [];
intersectObject( object, this, intersects, recursive );
intersects.sort( ascSort );
return intersects;
},
intersectObjects: function ( objects, recursive, optionalTarget ) {
var intersects = optionalTarget || [];
if ( Array.isArray( objects ) === false ) {
console.warn( 'THREE.Raycaster.intersectObjects: objects is not an Array.' );
return intersects;
}
for ( var i = 0, l = objects.length; i < l; i ++ ) {
intersectObject( objects[ i ], this, intersects, recursive );
}
intersects.sort( ascSort );
return intersects;
}
} );
/**
* @author alteredq / http://alteredqualia.com/
*/
function Clock( autoStart ) {
this.autoStart = ( autoStart !== undefined ) ? autoStart : true;
this.startTime = 0;
this.oldTime = 0;
this.elapsedTime = 0;
this.running = false;
}
Object.assign( Clock.prototype, {
start: function () {
this.startTime = ( typeof performance === 'undefined' ? Date : performance ).now(); // see #10732
this.oldTime = this.startTime;
this.elapsedTime = 0;
this.running = true;
},
stop: function () {
this.getElapsedTime();
this.running = false;
this.autoStart = false;
},
getElapsedTime: function () {
this.getDelta();
return this.elapsedTime;
},
getDelta: function () {
var diff = 0;
if ( this.autoStart && ! this.running ) {
this.start();
return 0;
}
if ( this.running ) {
var newTime = ( typeof performance === 'undefined' ? Date : performance ).now();
diff = ( newTime - this.oldTime ) / 1000;
this.oldTime = newTime;
this.elapsedTime += diff;
}
return diff;
}
} );
/**
* @author bhouston / http://clara.io
* @author WestLangley / http://github.com/WestLangley
*
* Ref: https://en.wikipedia.org/wiki/Spherical_coordinate_system
*
* The poles (phi) are at the positive and negative y axis.
* The equator starts at positive z.
*/
function Spherical( radius, phi, theta ) {
this.radius = ( radius !== undefined ) ? radius : 1.0;
this.phi = ( phi !== undefined ) ? phi : 0; // up / down towards top and bottom pole
this.theta = ( theta !== undefined ) ? theta : 0; // around the equator of the sphere
return this;
}
Object.assign( Spherical.prototype, {
set: function ( radius, phi, theta ) {
this.radius = radius;
this.phi = phi;
this.theta = theta;
return this;
},
clone: function () {
return new this.constructor().copy( this );
},
copy: function ( other ) {
this.radius = other.radius;
this.phi = other.phi;
this.theta = other.theta;
return this;
},
// restrict phi to be betwee EPS and PI-EPS
makeSafe: function () {
var EPS = 0.000001;
this.phi = Math.max( EPS, Math.min( Math.PI - EPS, this.phi ) );
return this;
},
setFromVector3: function ( vec3 ) {
this.radius = vec3.length();
if ( this.radius === 0 ) {
this.theta = 0;
this.phi = 0;
} else {
this.theta = Math.atan2( vec3.x, vec3.z ); // equator angle around y-up axis
this.phi = Math.acos( _Math.clamp( vec3.y / this.radius, - 1, 1 ) ); // polar angle
}
return this;
}
} );
/**
* @author Mugen87 / https://github.com/Mugen87
*
* Ref: https://en.wikipedia.org/wiki/Cylindrical_coordinate_system
*
*/
function Cylindrical( radius, theta, y ) {
this.radius = ( radius !== undefined ) ? radius : 1.0; // distance from the origin to a point in the x-z plane
this.theta = ( theta !== undefined ) ? theta : 0; // counterclockwise angle in the x-z plane measured in radians from the positive z-axis
this.y = ( y !== undefined ) ? y : 0; // height above the x-z plane
return this;
}
Object.assign( Cylindrical.prototype, {
set: function ( radius, theta, y ) {
this.radius = radius;
this.theta = theta;
this.y = y;
return this;
},
clone: function () {
return new this.constructor().copy( this );
},
copy: function ( other ) {
this.radius = other.radius;
this.theta = other.theta;
this.y = other.y;
return this;
},
setFromVector3: function ( vec3 ) {
this.radius = Math.sqrt( vec3.x * vec3.x + vec3.z * vec3.z );
this.theta = Math.atan2( vec3.x, vec3.z );
this.y = vec3.y;
return this;
}
} );
/**
* @author bhouston / http://clara.io
*/
function Box2( min, max ) {
this.min = ( min !== undefined ) ? min : new Vector2( + Infinity, + Infinity );
this.max = ( max !== undefined ) ? max : new Vector2( - Infinity, - Infinity );
}
Object.assign( Box2.prototype, {
set: function ( min, max ) {
this.min.copy( min );
this.max.copy( max );
return this;
},
setFromPoints: function ( points ) {
this.makeEmpty();
for ( var i = 0, il = points.length; i < il; i ++ ) {
this.expandByPoint( points[ i ] );
}
return this;
},
setFromCenterAndSize: function () {
var v1 = new Vector2();
return function setFromCenterAndSize( center, size ) {
var halfSize = v1.copy( size ).multiplyScalar( 0.5 );
this.min.copy( center ).sub( halfSize );
this.max.copy( center ).add( halfSize );
return this;
};
}(),
clone: function () {
return new this.constructor().copy( this );
},
copy: function ( box ) {
this.min.copy( box.min );
this.max.copy( box.max );
return this;
},
makeEmpty: function () {
this.min.x = this.min.y = + Infinity;
this.max.x = this.max.y = - Infinity;
return this;
},
isEmpty: function () {
// this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes
return ( this.max.x < this.min.x ) || ( this.max.y < this.min.y );
},
getCenter: function ( target ) {
if ( target === undefined ) {
console.warn( 'THREE.Box2: .getCenter() target is now required' );
target = new Vector2();
}
return this.isEmpty() ? target.set( 0, 0 ) : target.addVectors( this.min, this.max ).multiplyScalar( 0.5 );
},
getSize: function ( target ) {
if ( target === undefined ) {
console.warn( 'THREE.Box2: .getSize() target is now required' );
target = new Vector2();
}
return this.isEmpty() ? target.set( 0, 0 ) : target.subVectors( this.max, this.min );
},
expandByPoint: function ( point ) {
this.min.min( point );
this.max.max( point );
return this;
},
expandByVector: function ( vector ) {
this.min.sub( vector );
this.max.add( vector );
return this;
},
expandByScalar: function ( scalar ) {
this.min.addScalar( - scalar );
this.max.addScalar( scalar );
return this;
},
containsPoint: function ( point ) {
return point.x < this.min.x || point.x > this.max.x ||
point.y < this.min.y || point.y > this.max.y ? false : true;
},
containsBox: function ( box ) {
return this.min.x <= box.min.x && box.max.x <= this.max.x &&
this.min.y <= box.min.y && box.max.y <= this.max.y;
},
getParameter: function ( point, target ) {
// This can potentially have a divide by zero if the box
// has a size dimension of 0.
if ( target === undefined ) {
console.warn( 'THREE.Box2: .getParameter() target is now required' );
target = new Vector2();
}
return target.set(
( point.x - this.min.x ) / ( this.max.x - this.min.x ),
( point.y - this.min.y ) / ( this.max.y - this.min.y )
);
},
intersectsBox: function ( box ) {
// using 4 splitting planes to rule out intersections
return box.max.x < this.min.x || box.min.x > this.max.x ||
box.max.y < this.min.y || box.min.y > this.max.y ? false : true;
},
clampPoint: function ( point, target ) {
if ( target === undefined ) {
console.warn( 'THREE.Box2: .clampPoint() target is now required' );
target = new Vector2();
}
return target.copy( point ).clamp( this.min, this.max );
},
distanceToPoint: function () {
var v1 = new Vector2();
return function distanceToPoint( point ) {
var clampedPoint = v1.copy( point ).clamp( this.min, this.max );
return clampedPoint.sub( point ).length();
};
}(),
intersect: function ( box ) {
this.min.max( box.min );
this.max.min( box.max );
return this;
},
union: function ( box ) {
this.min.min( box.min );
this.max.max( box.max );
return this;
},
translate: function ( offset ) {
this.min.add( offset );
this.max.add( offset );
return this;
},
equals: function ( box ) {
return box.min.equals( this.min ) && box.max.equals( this.max );
}
} );
/**
* @author alteredq / http://alteredqualia.com/
*/
function ImmediateRenderObject( material ) {
Object3D.call( this );
this.material = material;
this.render = function ( /* renderCallback */ ) {};
}
ImmediateRenderObject.prototype = Object.create( Object3D.prototype );
ImmediateRenderObject.prototype.constructor = ImmediateRenderObject;
ImmediateRenderObject.prototype.isImmediateRenderObject = true;
/**
* @author mrdoob / http://mrdoob.com/
* @author WestLangley / http://github.com/WestLangley
*/
function VertexNormalsHelper( object, size, hex, linewidth ) {
this.object = object;
this.size = ( size !== undefined ) ? size : 1;
var color = ( hex !== undefined ) ? hex : 0xff0000;
var width = ( linewidth !== undefined ) ? linewidth : 1;
//
var nNormals = 0;
var objGeometry = this.object.geometry;
if ( objGeometry && objGeometry.isGeometry ) {
nNormals = objGeometry.faces.length * 3;
} else if ( objGeometry && objGeometry.isBufferGeometry ) {
nNormals = objGeometry.attributes.normal.count;
}
//
var geometry = new BufferGeometry();
var positions = new Float32BufferAttribute( nNormals * 2 * 3, 3 );
geometry.addAttribute( 'position', positions );
LineSegments.call( this, geometry, new LineBasicMaterial( { color: color, linewidth: width } ) );
//
this.matrixAutoUpdate = false;
this.update();
}
VertexNormalsHelper.prototype = Object.create( LineSegments.prototype );
VertexNormalsHelper.prototype.constructor = VertexNormalsHelper;
VertexNormalsHelper.prototype.update = ( function () {
var v1 = new Vector3();
var v2 = new Vector3();
var normalMatrix = new Matrix3();
return function update() {
var keys = [ 'a', 'b', 'c' ];
this.object.updateMatrixWorld( true );
normalMatrix.getNormalMatrix( this.object.matrixWorld );
var matrixWorld = this.object.matrixWorld;
var position = this.geometry.attributes.position;
//
var objGeometry = this.object.geometry;
if ( objGeometry && objGeometry.isGeometry ) {
var vertices = objGeometry.vertices;
var faces = objGeometry.faces;
var idx = 0;
for ( var i = 0, l = faces.length; i < l; i ++ ) {
var face = faces[ i ];
for ( var j = 0, jl = face.vertexNormals.length; j < jl; j ++ ) {
var vertex = vertices[ face[ keys[ j ] ] ];
var normal = face.vertexNormals[ j ];
v1.copy( vertex ).applyMatrix4( matrixWorld );
v2.copy( normal ).applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 );
position.setXYZ( idx, v1.x, v1.y, v1.z );
idx = idx + 1;
position.setXYZ( idx, v2.x, v2.y, v2.z );
idx = idx + 1;
}
}
} else if ( objGeometry && objGeometry.isBufferGeometry ) {
var objPos = objGeometry.attributes.position;
var objNorm = objGeometry.attributes.normal;
var idx = 0;
// for simplicity, ignore index and drawcalls, and render every normal
for ( var j = 0, jl = objPos.count; j < jl; j ++ ) {
v1.set( objPos.getX( j ), objPos.getY( j ), objPos.getZ( j ) ).applyMatrix4( matrixWorld );
v2.set( objNorm.getX( j ), objNorm.getY( j ), objNorm.getZ( j ) );
v2.applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 );
position.setXYZ( idx, v1.x, v1.y, v1.z );
idx = idx + 1;
position.setXYZ( idx, v2.x, v2.y, v2.z );
idx = idx + 1;
}
}
position.needsUpdate = true;
};
}() );
/**
* @author alteredq / http://alteredqualia.com/
* @author mrdoob / http://mrdoob.com/
* @author WestLangley / http://github.com/WestLangley
*/
function SpotLightHelper( light, color ) {
Object3D.call( this );
this.light = light;
this.light.updateMatrixWorld();
this.matrix = light.matrixWorld;
this.matrixAutoUpdate = false;
this.color = color;
var geometry = new BufferGeometry();
var positions = [
0, 0, 0, 0, 0, 1,
0, 0, 0, 1, 0, 1,
0, 0, 0, - 1, 0, 1,
0, 0, 0, 0, 1, 1,
0, 0, 0, 0, - 1, 1
];
for ( var i = 0, j = 1, l = 32; i < l; i ++, j ++ ) {
var p1 = ( i / l ) * Math.PI * 2;
var p2 = ( j / l ) * Math.PI * 2;
positions.push(
Math.cos( p1 ), Math.sin( p1 ), 1,
Math.cos( p2 ), Math.sin( p2 ), 1
);
}
geometry.addAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );
var material = new LineBasicMaterial( { fog: false } );
this.cone = new LineSegments( geometry, material );
this.add( this.cone );
this.update();
}
SpotLightHelper.prototype = Object.create( Object3D.prototype );
SpotLightHelper.prototype.constructor = SpotLightHelper;
SpotLightHelper.prototype.dispose = function () {
this.cone.geometry.dispose();
this.cone.material.dispose();
};
SpotLightHelper.prototype.update = function () {
var vector = new Vector3();
var vector2 = new Vector3();
return function update() {
this.light.updateMatrixWorld();
var coneLength = this.light.distance ? this.light.distance : 1000;
var coneWidth = coneLength * Math.tan( this.light.angle );
this.cone.scale.set( coneWidth, coneWidth, coneLength );
vector.setFromMatrixPosition( this.light.matrixWorld );
vector2.setFromMatrixPosition( this.light.target.matrixWorld );
this.cone.lookAt( vector2.sub( vector ) );
if ( this.color !== undefined ) {
this.cone.material.color.set( this.color );
} else {
this.cone.material.color.copy( this.light.color );
}
};
}();
/**
* @author Sean Griffin / http://twitter.com/sgrif
* @author Michael Guerrero / http://realitymeltdown.com
* @author mrdoob / http://mrdoob.com/
* @author ikerr / http://verold.com
* @author Mugen87 / https://github.com/Mugen87
*/
function getBoneList( object ) {
var boneList = [];
if ( object && object.isBone ) {
boneList.push( object );
}
for ( var i = 0; i < object.children.length; i ++ ) {
boneList.push.apply( boneList, getBoneList( object.children[ i ] ) );
}
return boneList;
}
function SkeletonHelper( object ) {
var bones = getBoneList( object );
var geometry = new BufferGeometry();
var vertices = [];
var colors = [];
var color1 = new Color( 0, 0, 1 );
var color2 = new Color( 0, 1, 0 );
for ( var i = 0; i < bones.length; i ++ ) {
var bone = bones[ i ];
if ( bone.parent && bone.parent.isBone ) {
vertices.push( 0, 0, 0 );
vertices.push( 0, 0, 0 );
colors.push( color1.r, color1.g, color1.b );
colors.push( color2.r, color2.g, color2.b );
}
}
geometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
geometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );
var material = new LineBasicMaterial( { vertexColors: VertexColors, depthTest: false, depthWrite: false, transparent: true } );
LineSegments.call( this, geometry, material );
this.root = object;
this.bones = bones;
this.matrix = object.matrixWorld;
this.matrixAutoUpdate = false;
}
SkeletonHelper.prototype = Object.create( LineSegments.prototype );
SkeletonHelper.prototype.constructor = SkeletonHelper;
SkeletonHelper.prototype.updateMatrixWorld = function () {
var vector = new Vector3();
var boneMatrix = new Matrix4();
var matrixWorldInv = new Matrix4();
return function updateMatrixWorld( force ) {
var bones = this.bones;
var geometry = this.geometry;
var position = geometry.getAttribute( 'position' );
matrixWorldInv.getInverse( this.root.matrixWorld );
for ( var i = 0, j = 0; i < bones.length; i ++ ) {
var bone = bones[ i ];
if ( bone.parent && bone.parent.isBone ) {
boneMatrix.multiplyMatrices( matrixWorldInv, bone.matrixWorld );
vector.setFromMatrixPosition( boneMatrix );
position.setXYZ( j, vector.x, vector.y, vector.z );
boneMatrix.multiplyMatrices( matrixWorldInv, bone.parent.matrixWorld );
vector.setFromMatrixPosition( boneMatrix );
position.setXYZ( j + 1, vector.x, vector.y, vector.z );
j += 2;
}
}
geometry.getAttribute( 'position' ).needsUpdate = true;
Object3D.prototype.updateMatrixWorld.call( this, force );
};
}();
/**
* @author alteredq / http://alteredqualia.com/
* @author mrdoob / http://mrdoob.com/
*/
function PointLightHelper( light, sphereSize, color ) {
this.light = light;
this.light.updateMatrixWorld();
this.color = color;
var geometry = new SphereBufferGeometry( sphereSize, 4, 2 );
var material = new MeshBasicMaterial( { wireframe: true, fog: false } );
Mesh.call( this, geometry, material );
this.matrix = this.light.matrixWorld;
this.matrixAutoUpdate = false;
this.update();
/*
var distanceGeometry = new THREE.IcosahedronGeometry( 1, 2 );
var distanceMaterial = new THREE.MeshBasicMaterial( { color: hexColor, fog: false, wireframe: true, opacity: 0.1, transparent: true } );
this.lightSphere = new THREE.Mesh( bulbGeometry, bulbMaterial );
this.lightDistance = new THREE.Mesh( distanceGeometry, distanceMaterial );
var d = light.distance;
if ( d === 0.0 ) {
this.lightDistance.visible = false;
} else {
this.lightDistance.scale.set( d, d, d );
}
this.add( this.lightDistance );
*/
}
PointLightHelper.prototype = Object.create( Mesh.prototype );
PointLightHelper.prototype.constructor = PointLightHelper;
PointLightHelper.prototype.dispose = function () {
this.geometry.dispose();
this.material.dispose();
};
PointLightHelper.prototype.update = function () {
if ( this.color !== undefined ) {
this.material.color.set( this.color );
} else {
this.material.color.copy( this.light.color );
}
/*
var d = this.light.distance;
if ( d === 0.0 ) {
this.lightDistance.visible = false;
} else {
this.lightDistance.visible = true;
this.lightDistance.scale.set( d, d, d );
}
*/
};
/**
* @author abelnation / http://github.com/abelnation
* @author Mugen87 / http://github.com/Mugen87
* @author WestLangley / http://github.com/WestLangley
*/
function RectAreaLightHelper( light, color ) {
Object3D.call( this );
this.light = light;
this.light.updateMatrixWorld();
this.matrix = light.matrixWorld;
this.matrixAutoUpdate = false;
this.color = color;
var material = new LineBasicMaterial( { fog: false } );
var geometry = new BufferGeometry();
geometry.addAttribute( 'position', new BufferAttribute( new Float32Array( 5 * 3 ), 3 ) );
this.line = new Line( geometry, material );
this.add( this.line );
this.update();
}
RectAreaLightHelper.prototype = Object.create( Object3D.prototype );
RectAreaLightHelper.prototype.constructor = RectAreaLightHelper;
RectAreaLightHelper.prototype.dispose = function () {
this.children[ 0 ].geometry.dispose();
this.children[ 0 ].material.dispose();
};
RectAreaLightHelper.prototype.update = function () {
// calculate new dimensions of the helper
var hx = this.light.width * 0.5;
var hy = this.light.height * 0.5;
var position = this.line.geometry.attributes.position;
var array = position.array;
// update vertices
array[ 0 ] = hx; array[ 1 ] = - hy; array[ 2 ] = 0;
array[ 3 ] = hx; array[ 4 ] = hy; array[ 5 ] = 0;
array[ 6 ] = - hx; array[ 7 ] = hy; array[ 8 ] = 0;
array[ 9 ] = - hx; array[ 10 ] = - hy; array[ 11 ] = 0;
array[ 12 ] = hx; array[ 13 ] = - hy; array[ 14 ] = 0;
position.needsUpdate = true;
if ( this.color !== undefined ) {
this.line.material.color.set( this.color );
} else {
this.line.material.color.copy( this.light.color );
}
};
/**
* @author alteredq / http://alteredqualia.com/
* @author mrdoob / http://mrdoob.com/
* @author Mugen87 / https://github.com/Mugen87
*/
function HemisphereLightHelper( light, size, color ) {
Object3D.call( this );
this.light = light;
this.light.updateMatrixWorld();
this.matrix = light.matrixWorld;
this.matrixAutoUpdate = false;
this.color = color;
var geometry = new OctahedronBufferGeometry( size );
geometry.rotateY( Math.PI * 0.5 );
this.material = new MeshBasicMaterial( { wireframe: true, fog: false } );
if ( this.color === undefined ) this.material.vertexColors = VertexColors;
var position = geometry.getAttribute( 'position' );
var colors = new Float32Array( position.count * 3 );
geometry.addAttribute( 'color', new BufferAttribute( colors, 3 ) );
this.add( new Mesh( geometry, this.material ) );
this.update();
}
HemisphereLightHelper.prototype = Object.create( Object3D.prototype );
HemisphereLightHelper.prototype.constructor = HemisphereLightHelper;
HemisphereLightHelper.prototype.dispose = function () {
this.children[ 0 ].geometry.dispose();
this.children[ 0 ].material.dispose();
};
HemisphereLightHelper.prototype.update = function () {
var vector = new Vector3();
var color1 = new Color();
var color2 = new Color();
return function update() {
var mesh = this.children[ 0 ];
if ( this.color !== undefined ) {
this.material.color.set( this.color );
} else {
var colors = mesh.geometry.getAttribute( 'color' );
color1.copy( this.light.color );
color2.copy( this.light.groundColor );
for ( var i = 0, l = colors.count; i < l; i ++ ) {
var color = ( i < ( l / 2 ) ) ? color1 : color2;
colors.setXYZ( i, color.r, color.g, color.b );
}
colors.needsUpdate = true;
}
mesh.lookAt( vector.setFromMatrixPosition( this.light.matrixWorld ).negate() );
};
}();
/**
* @author mrdoob / http://mrdoob.com/
*/
function GridHelper( size, divisions, color1, color2 ) {
size = size || 10;
divisions = divisions || 10;
color1 = new Color( color1 !== undefined ? color1 : 0x444444 );
color2 = new Color( color2 !== undefined ? color2 : 0x888888 );
var center = divisions / 2;
var step = size / divisions;
var halfSize = size / 2;
var vertices = [], colors = [];
for ( var i = 0, j = 0, k = - halfSize; i <= divisions; i ++, k += step ) {
vertices.push( - halfSize, 0, k, halfSize, 0, k );
vertices.push( k, 0, - halfSize, k, 0, halfSize );
var color = i === center ? color1 : color2;
color.toArray( colors, j ); j += 3;
color.toArray( colors, j ); j += 3;
color.toArray( colors, j ); j += 3;
color.toArray( colors, j ); j += 3;
}
var geometry = new BufferGeometry();
geometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
geometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );
var material = new LineBasicMaterial( { vertexColors: VertexColors } );
LineSegments.call( this, geometry, material );
}
GridHelper.prototype = Object.create( LineSegments.prototype );
GridHelper.prototype.constructor = GridHelper;
/**
* @author mrdoob / http://mrdoob.com/
* @author Mugen87 / http://github.com/Mugen87
* @author Hectate / http://www.github.com/Hectate
*/
function PolarGridHelper( radius, radials, circles, divisions, color1, color2 ) {
radius = radius || 10;
radials = radials || 16;
circles = circles || 8;
divisions = divisions || 64;
color1 = new Color( color1 !== undefined ? color1 : 0x444444 );
color2 = new Color( color2 !== undefined ? color2 : 0x888888 );
var vertices = [];
var colors = [];
var x, z;
var v, i, j, r, color;
// create the radials
for ( i = 0; i <= radials; i ++ ) {
v = ( i / radials ) * ( Math.PI * 2 );
x = Math.sin( v ) * radius;
z = Math.cos( v ) * radius;
vertices.push( 0, 0, 0 );
vertices.push( x, 0, z );
color = ( i & 1 ) ? color1 : color2;
colors.push( color.r, color.g, color.b );
colors.push( color.r, color.g, color.b );
}
// create the circles
for ( i = 0; i <= circles; i ++ ) {
color = ( i & 1 ) ? color1 : color2;
r = radius - ( radius / circles * i );
for ( j = 0; j < divisions; j ++ ) {
// first vertex
v = ( j / divisions ) * ( Math.PI * 2 );
x = Math.sin( v ) * r;
z = Math.cos( v ) * r;
vertices.push( x, 0, z );
colors.push( color.r, color.g, color.b );
// second vertex
v = ( ( j + 1 ) / divisions ) * ( Math.PI * 2 );
x = Math.sin( v ) * r;
z = Math.cos( v ) * r;
vertices.push( x, 0, z );
colors.push( color.r, color.g, color.b );
}
}
var geometry = new BufferGeometry();
geometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
geometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );
var material = new LineBasicMaterial( { vertexColors: VertexColors } );
LineSegments.call( this, geometry, material );
}
PolarGridHelper.prototype = Object.create( LineSegments.prototype );
PolarGridHelper.prototype.constructor = PolarGridHelper;
/**
* @author mrdoob / http://mrdoob.com/
* @author WestLangley / http://github.com/WestLangley
*/
function FaceNormalsHelper( object, size, hex, linewidth ) {
// FaceNormalsHelper only supports THREE.Geometry
this.object = object;
this.size = ( size !== undefined ) ? size : 1;
var color = ( hex !== undefined ) ? hex : 0xffff00;
var width = ( linewidth !== undefined ) ? linewidth : 1;
//
var nNormals = 0;
var objGeometry = this.object.geometry;
if ( objGeometry && objGeometry.isGeometry ) {
nNormals = objGeometry.faces.length;
} else {
console.warn( 'THREE.FaceNormalsHelper: only THREE.Geometry is supported. Use THREE.VertexNormalsHelper, instead.' );
}
//
var geometry = new BufferGeometry();
var positions = new Float32BufferAttribute( nNormals * 2 * 3, 3 );
geometry.addAttribute( 'position', positions );
LineSegments.call( this, geometry, new LineBasicMaterial( { color: color, linewidth: width } ) );
//
this.matrixAutoUpdate = false;
this.update();
}
FaceNormalsHelper.prototype = Object.create( LineSegments.prototype );
FaceNormalsHelper.prototype.constructor = FaceNormalsHelper;
FaceNormalsHelper.prototype.update = ( function () {
var v1 = new Vector3();
var v2 = new Vector3();
var normalMatrix = new Matrix3();
return function update() {
this.object.updateMatrixWorld( true );
normalMatrix.getNormalMatrix( this.object.matrixWorld );
var matrixWorld = this.object.matrixWorld;
var position = this.geometry.attributes.position;
//
var objGeometry = this.object.geometry;
var vertices = objGeometry.vertices;
var faces = objGeometry.faces;
var idx = 0;
for ( var i = 0, l = faces.length; i < l; i ++ ) {
var face = faces[ i ];
var normal = face.normal;
v1.copy( vertices[ face.a ] )
.add( vertices[ face.b ] )
.add( vertices[ face.c ] )
.divideScalar( 3 )
.applyMatrix4( matrixWorld );
v2.copy( normal ).applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 );
position.setXYZ( idx, v1.x, v1.y, v1.z );
idx = idx + 1;
position.setXYZ( idx, v2.x, v2.y, v2.z );
idx = idx + 1;
}
position.needsUpdate = true;
};
}() );
/**
* @author alteredq / http://alteredqualia.com/
* @author mrdoob / http://mrdoob.com/
* @author WestLangley / http://github.com/WestLangley
*/
function DirectionalLightHelper( light, size, color ) {
Object3D.call( this );
this.light = light;
this.light.updateMatrixWorld();
this.matrix = light.matrixWorld;
this.matrixAutoUpdate = false;
this.color = color;
if ( size === undefined ) size = 1;
var geometry = new BufferGeometry();
geometry.addAttribute( 'position', new Float32BufferAttribute( [
- size, size, 0,
size, size, 0,
size, - size, 0,
- size, - size, 0,
- size, size, 0
], 3 ) );
var material = new LineBasicMaterial( { fog: false } );
this.lightPlane = new Line( geometry, material );
this.add( this.lightPlane );
geometry = new BufferGeometry();
geometry.addAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 0, 1 ], 3 ) );
this.targetLine = new Line( geometry, material );
this.add( this.targetLine );
this.update();
}
DirectionalLightHelper.prototype = Object.create( Object3D.prototype );
DirectionalLightHelper.prototype.constructor = DirectionalLightHelper;
DirectionalLightHelper.prototype.dispose = function () {
this.lightPlane.geometry.dispose();
this.lightPlane.material.dispose();
this.targetLine.geometry.dispose();
this.targetLine.material.dispose();
};
DirectionalLightHelper.prototype.update = function () {
var v1 = new Vector3();
var v2 = new Vector3();
var v3 = new Vector3();
return function update() {
v1.setFromMatrixPosition( this.light.matrixWorld );
v2.setFromMatrixPosition( this.light.target.matrixWorld );
v3.subVectors( v2, v1 );
this.lightPlane.lookAt( v3 );
if ( this.color !== undefined ) {
this.lightPlane.material.color.set( this.color );
this.targetLine.material.color.set( this.color );
} else {
this.lightPlane.material.color.copy( this.light.color );
this.targetLine.material.color.copy( this.light.color );
}
this.targetLine.lookAt( v3 );
this.targetLine.scale.z = v3.length();
};
}();
/**
* @author alteredq / http://alteredqualia.com/
* @author Mugen87 / https://github.com/Mugen87
*
* - shows frustum, line of sight and up of the camera
* - suitable for fast updates
* - based on frustum visualization in lightgl.js shadowmap example
* http://evanw.github.com/lightgl.js/tests/shadowmap.html
*/
function CameraHelper( camera ) {
var geometry = new BufferGeometry();
var material = new LineBasicMaterial( { color: 0xffffff, vertexColors: FaceColors } );
var vertices = [];
var colors = [];
var pointMap = {};
// colors
var colorFrustum = new Color( 0xffaa00 );
var colorCone = new Color( 0xff0000 );
var colorUp = new Color( 0x00aaff );
var colorTarget = new Color( 0xffffff );
var colorCross = new Color( 0x333333 );
// near
addLine( 'n1', 'n2', colorFrustum );
addLine( 'n2', 'n4', colorFrustum );
addLine( 'n4', 'n3', colorFrustum );
addLine( 'n3', 'n1', colorFrustum );
// far
addLine( 'f1', 'f2', colorFrustum );
addLine( 'f2', 'f4', colorFrustum );
addLine( 'f4', 'f3', colorFrustum );
addLine( 'f3', 'f1', colorFrustum );
// sides
addLine( 'n1', 'f1', colorFrustum );
addLine( 'n2', 'f2', colorFrustum );
addLine( 'n3', 'f3', colorFrustum );
addLine( 'n4', 'f4', colorFrustum );
// cone
addLine( 'p', 'n1', colorCone );
addLine( 'p', 'n2', colorCone );
addLine( 'p', 'n3', colorCone );
addLine( 'p', 'n4', colorCone );
// up
addLine( 'u1', 'u2', colorUp );
addLine( 'u2', 'u3', colorUp );
addLine( 'u3', 'u1', colorUp );
// target
addLine( 'c', 't', colorTarget );
addLine( 'p', 'c', colorCross );
// cross
addLine( 'cn1', 'cn2', colorCross );
addLine( 'cn3', 'cn4', colorCross );
addLine( 'cf1', 'cf2', colorCross );
addLine( 'cf3', 'cf4', colorCross );
function addLine( a, b, color ) {
addPoint( a, color );
addPoint( b, color );
}
function addPoint( id, color ) {
vertices.push( 0, 0, 0 );
colors.push( color.r, color.g, color.b );
if ( pointMap[ id ] === undefined ) {
pointMap[ id ] = [];
}
pointMap[ id ].push( ( vertices.length / 3 ) - 1 );
}
geometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
geometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );
LineSegments.call( this, geometry, material );
this.camera = camera;
if ( this.camera.updateProjectionMatrix ) this.camera.updateProjectionMatrix();
this.matrix = camera.matrixWorld;
this.matrixAutoUpdate = false;
this.pointMap = pointMap;
this.update();
}
CameraHelper.prototype = Object.create( LineSegments.prototype );
CameraHelper.prototype.constructor = CameraHelper;
CameraHelper.prototype.update = function () {
var geometry, pointMap;
var vector = new Vector3();
var camera = new Camera();
function setPoint( point, x, y, z ) {
vector.set( x, y, z ).unproject( camera );
var points = pointMap[ point ];
if ( points !== undefined ) {
var position = geometry.getAttribute( 'position' );
for ( var i = 0, l = points.length; i < l; i ++ ) {
position.setXYZ( points[ i ], vector.x, vector.y, vector.z );
}
}
}
return function update() {
geometry = this.geometry;
pointMap = this.pointMap;
var w = 1, h = 1;
// we need just camera projection matrix
// world matrix must be identity
camera.projectionMatrix.copy( this.camera.projectionMatrix );
// center / target
setPoint( 'c', 0, 0, - 1 );
setPoint( 't', 0, 0, 1 );
// near
setPoint( 'n1', - w, - h, - 1 );
setPoint( 'n2', w, - h, - 1 );
setPoint( 'n3', - w, h, - 1 );
setPoint( 'n4', w, h, - 1 );
// far
setPoint( 'f1', - w, - h, 1 );
setPoint( 'f2', w, - h, 1 );
setPoint( 'f3', - w, h, 1 );
setPoint( 'f4', w, h, 1 );
// up
setPoint( 'u1', w * 0.7, h * 1.1, - 1 );
setPoint( 'u2', - w * 0.7, h * 1.1, - 1 );
setPoint( 'u3', 0, h * 2, - 1 );
// cross
setPoint( 'cf1', - w, 0, 1 );
setPoint( 'cf2', w, 0, 1 );
setPoint( 'cf3', 0, - h, 1 );
setPoint( 'cf4', 0, h, 1 );
setPoint( 'cn1', - w, 0, - 1 );
setPoint( 'cn2', w, 0, - 1 );
setPoint( 'cn3', 0, - h, - 1 );
setPoint( 'cn4', 0, h, - 1 );
geometry.getAttribute( 'position' ).needsUpdate = true;
};
}();
/**
* @author mrdoob / http://mrdoob.com/
* @author Mugen87 / http://github.com/Mugen87
*/
function BoxHelper( object, color ) {
this.object = object;
if ( color === undefined ) color = 0xffff00;
var indices = new Uint16Array( [ 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 ] );
var positions = new Float32Array( 8 * 3 );
var geometry = new BufferGeometry();
geometry.setIndex( new BufferAttribute( indices, 1 ) );
geometry.addAttribute( 'position', new BufferAttribute( positions, 3 ) );
LineSegments.call( this, geometry, new LineBasicMaterial( { color: color } ) );
this.matrixAutoUpdate = false;
this.update();
}
BoxHelper.prototype = Object.create( LineSegments.prototype );
BoxHelper.prototype.constructor = BoxHelper;
BoxHelper.prototype.update = ( function () {
var box = new Box3();
return function update( object ) {
if ( object !== undefined ) {
console.warn( 'THREE.BoxHelper: .update() has no longer arguments.' );
}
if ( this.object !== undefined ) {
box.setFromObject( this.object );
}
if ( box.isEmpty() ) return;
var min = box.min;
var max = box.max;
/*
5____4
1/___0/|
| 6__|_7
2/___3/
0: max.x, max.y, max.z
1: min.x, max.y, max.z
2: min.x, min.y, max.z
3: max.x, min.y, max.z
4: max.x, max.y, min.z
5: min.x, max.y, min.z
6: min.x, min.y, min.z
7: max.x, min.y, min.z
*/
var position = this.geometry.attributes.position;
var array = position.array;
array[ 0 ] = max.x; array[ 1 ] = max.y; array[ 2 ] = max.z;
array[ 3 ] = min.x; array[ 4 ] = max.y; array[ 5 ] = max.z;
array[ 6 ] = min.x; array[ 7 ] = min.y; array[ 8 ] = max.z;
array[ 9 ] = max.x; array[ 10 ] = min.y; array[ 11 ] = max.z;
array[ 12 ] = max.x; array[ 13 ] = max.y; array[ 14 ] = min.z;
array[ 15 ] = min.x; array[ 16 ] = max.y; array[ 17 ] = min.z;
array[ 18 ] = min.x; array[ 19 ] = min.y; array[ 20 ] = min.z;
array[ 21 ] = max.x; array[ 22 ] = min.y; array[ 23 ] = min.z;
position.needsUpdate = true;
this.geometry.computeBoundingSphere();
};
} )();
BoxHelper.prototype.setFromObject = function ( object ) {
this.object = object;
this.update();
return this;
};
/**
* @author WestLangley / http://github.com/WestLangley
*/
function Box3Helper( box, hex ) {
this.type = 'Box3Helper';
this.box = box;
var color = ( hex !== undefined ) ? hex : 0xffff00;
var indices = new Uint16Array( [ 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 ] );
var positions = [ 1, 1, 1, - 1, 1, 1, - 1, - 1, 1, 1, - 1, 1, 1, 1, - 1, - 1, 1, - 1, - 1, - 1, - 1, 1, - 1, - 1 ];
var geometry = new BufferGeometry();
geometry.setIndex( new BufferAttribute( indices, 1 ) );
geometry.addAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );
LineSegments.call( this, geometry, new LineBasicMaterial( { color: color } ) );
this.geometry.computeBoundingSphere();
}
Box3Helper.prototype = Object.create( LineSegments.prototype );
Box3Helper.prototype.constructor = Box3Helper;
Box3Helper.prototype.updateMatrixWorld = function ( force ) {
var box = this.box;
if ( box.isEmpty() ) return;
box.getCenter( this.position );
box.getSize( this.scale );
this.scale.multiplyScalar( 0.5 );
Object3D.prototype.updateMatrixWorld.call( this, force );
};
/**
* @author WestLangley / http://github.com/WestLangley
*/
function PlaneHelper( plane, size, hex ) {
this.type = 'PlaneHelper';
this.plane = plane;
this.size = ( size === undefined ) ? 1 : size;
var color = ( hex !== undefined ) ? hex : 0xffff00;
var positions = [ 1, - 1, 1, - 1, 1, 1, - 1, - 1, 1, 1, 1, 1, - 1, 1, 1, - 1, - 1, 1, 1, - 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0 ];
var geometry = new BufferGeometry();
geometry.addAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );
geometry.computeBoundingSphere();
Line.call( this, geometry, new LineBasicMaterial( { color: color } ) );
//
var positions2 = [ 1, 1, 1, - 1, 1, 1, - 1, - 1, 1, 1, 1, 1, - 1, - 1, 1, 1, - 1, 1 ];
var geometry2 = new BufferGeometry();
geometry2.addAttribute( 'position', new Float32BufferAttribute( positions2, 3 ) );
geometry2.computeBoundingSphere();
this.add( new Mesh( geometry2, new MeshBasicMaterial( { color: color, opacity: 0.2, transparent: true, depthWrite: false } ) ) );
}
PlaneHelper.prototype = Object.create( Line.prototype );
PlaneHelper.prototype.constructor = PlaneHelper;
PlaneHelper.prototype.updateMatrixWorld = function ( force ) {
var scale = - this.plane.constant;
if ( Math.abs( scale ) < 1e-8 ) scale = 1e-8; // sign does not matter
this.scale.set( 0.5 * this.size, 0.5 * this.size, scale );
this.lookAt( this.plane.normal );
Object3D.prototype.updateMatrixWorld.call( this, force );
};
/**
* @author WestLangley / http://github.com/WestLangley
* @author zz85 / http://github.com/zz85
* @author bhouston / http://clara.io
*
* Creates an arrow for visualizing directions
*
* Parameters:
* dir - Vector3
* origin - Vector3
* length - Number
* color - color in hex value
* headLength - Number
* headWidth - Number
*/
var lineGeometry;
var coneGeometry;
function ArrowHelper( dir, origin, length, color, headLength, headWidth ) {
// dir is assumed to be normalized
Object3D.call( this );
if ( color === undefined ) color = 0xffff00;
if ( length === undefined ) length = 1;
if ( headLength === undefined ) headLength = 0.2 * length;
if ( headWidth === undefined ) headWidth = 0.2 * headLength;
if ( lineGeometry === undefined ) {
lineGeometry = new BufferGeometry();
lineGeometry.addAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 1, 0 ], 3 ) );
coneGeometry = new CylinderBufferGeometry( 0, 0.5, 1, 5, 1 );
coneGeometry.translate( 0, - 0.5, 0 );
}
this.position.copy( origin );
this.line = new Line( lineGeometry, new LineBasicMaterial( { color: color } ) );
this.line.matrixAutoUpdate = false;
this.add( this.line );
this.cone = new Mesh( coneGeometry, new MeshBasicMaterial( { color: color } ) );
this.cone.matrixAutoUpdate = false;
this.add( this.cone );
this.setDirection( dir );
this.setLength( length, headLength, headWidth );
}
ArrowHelper.prototype = Object.create( Object3D.prototype );
ArrowHelper.prototype.constructor = ArrowHelper;
ArrowHelper.prototype.setDirection = ( function () {
var axis = new Vector3();
var radians;
return function setDirection( dir ) {
// dir is assumed to be normalized
if ( dir.y > 0.99999 ) {
this.quaternion.set( 0, 0, 0, 1 );
} else if ( dir.y < - 0.99999 ) {
this.quaternion.set( 1, 0, 0, 0 );
} else {
axis.set( dir.z, 0, - dir.x ).normalize();
radians = Math.acos( dir.y );
this.quaternion.setFromAxisAngle( axis, radians );
}
};
}() );
ArrowHelper.prototype.setLength = function ( length, headLength, headWidth ) {
if ( headLength === undefined ) headLength = 0.2 * length;
if ( headWidth === undefined ) headWidth = 0.2 * headLength;
this.line.scale.set( 1, Math.max( 0, length - headLength ), 1 );
this.line.updateMatrix();
this.cone.scale.set( headWidth, headLength, headWidth );
this.cone.position.y = length;
this.cone.updateMatrix();
};
ArrowHelper.prototype.setColor = function ( color ) {
this.line.material.color.copy( color );
this.cone.material.color.copy( color );
};
/**
* @author sroucheray / http://sroucheray.org/
* @author mrdoob / http://mrdoob.com/
*/
function AxesHelper( size ) {
size = size || 1;
var vertices = [
0, 0, 0, size, 0, 0,
0, 0, 0, 0, size, 0,
0, 0, 0, 0, 0, size
];
var colors = [
1, 0, 0, 1, 0.6, 0,
0, 1, 0, 0.6, 1, 0,
0, 0, 1, 0, 0.6, 1
];
var geometry = new BufferGeometry();
geometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
geometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );
var material = new LineBasicMaterial( { vertexColors: VertexColors } );
LineSegments.call( this, geometry, material );
}
AxesHelper.prototype = Object.create( LineSegments.prototype );
AxesHelper.prototype.constructor = AxesHelper;
//
Curve.create = function ( construct, getPoint ) {
console.log( 'THREE.Curve.create() has been deprecated' );
construct.prototype = Object.create( Curve.prototype );
construct.prototype.constructor = construct;
construct.prototype.getPoint = getPoint;
return construct;
};
//
Object.assign( CurvePath.prototype, {
createPointsGeometry: function ( divisions ) {
console.warn( 'THREE.CurvePath: .createPointsGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.' );
// generate geometry from path points (for Line or Points objects)
var pts = this.getPoints( divisions );
return this.createGeometry( pts );
},
createSpacedPointsGeometry: function ( divisions ) {
console.warn( 'THREE.CurvePath: .createSpacedPointsGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.' );
// generate geometry from equidistant sampling along the path
var pts = this.getSpacedPoints( divisions );
return this.createGeometry( pts );
},
createGeometry: function ( points ) {
console.warn( 'THREE.CurvePath: .createGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.' );
var geometry = new Geometry();
for ( var i = 0, l = points.length; i < l; i ++ ) {
var point = points[ i ];
geometry.vertices.push( new Vector3( point.x, point.y, point.z || 0 ) );
}
return geometry;
}
} );
//
Object.assign( Path.prototype, {
fromPoints: function ( points ) {
console.warn( 'THREE.Path: .fromPoints() has been renamed to .setFromPoints().' );
this.setFromPoints( points );
}
} );
//
function Spline( points ) {
console.warn( 'THREE.Spline has been removed. Use THREE.CatmullRomCurve3 instead.' );
CatmullRomCurve3.call( this, points );
this.type = 'catmullrom';
}
Spline.prototype = Object.create( CatmullRomCurve3.prototype );
Object.assign( Spline.prototype, {
initFromArray: function ( /* a */ ) {
console.error( 'THREE.Spline: .initFromArray() has been removed.' );
},
getControlPointsArray: function ( /* optionalTarget */ ) {
console.error( 'THREE.Spline: .getControlPointsArray() has been removed.' );
},
reparametrizeByArcLength: function ( /* samplingCoef */ ) {
console.error( 'THREE.Spline: .reparametrizeByArcLength() has been removed.' );
}
} );
GridHelper.prototype.setColors = function () {
console.error( 'THREE.GridHelper: setColors() has been deprecated, pass them in the constructor instead.' );
};
SkeletonHelper.prototype.update = function () {
console.error( 'THREE.SkeletonHelper: update() no longer needs to be called.' );
};
//
Object.assign( Loader.prototype, {
extractUrlBase: function ( url ) {
console.warn( 'THREE.Loader: .extractUrlBase() has been deprecated. Use THREE.LoaderUtils.extractUrlBase() instead.' );
return LoaderUtils.extractUrlBase( url );
}
} );
//
Object.assign( Box2.prototype, {
center: function ( optionalTarget ) {
console.warn( 'THREE.Box2: .center() has been renamed to .getCenter().' );
return this.getCenter( optionalTarget );
},
empty: function () {
console.warn( 'THREE.Box2: .empty() has been renamed to .isEmpty().' );
return this.isEmpty();
},
isIntersectionBox: function ( box ) {
console.warn( 'THREE.Box2: .isIntersectionBox() has been renamed to .intersectsBox().' );
return this.intersectsBox( box );
},
size: function ( optionalTarget ) {
console.warn( 'THREE.Box2: .size() has been renamed to .getSize().' );
return this.getSize( optionalTarget );
}
} );
Object.assign( Box3.prototype, {
center: function ( optionalTarget ) {
console.warn( 'THREE.Box3: .center() has been renamed to .getCenter().' );
return this.getCenter( optionalTarget );
},
empty: function () {
console.warn( 'THREE.Box3: .empty() has been renamed to .isEmpty().' );
return this.isEmpty();
},
isIntersectionBox: function ( box ) {
console.warn( 'THREE.Box3: .isIntersectionBox() has been renamed to .intersectsBox().' );
return this.intersectsBox( box );
},
isIntersectionSphere: function ( sphere ) {
console.warn( 'THREE.Box3: .isIntersectionSphere() has been renamed to .intersectsSphere().' );
return this.intersectsSphere( sphere );
},
size: function ( optionalTarget ) {
console.warn( 'THREE.Box3: .size() has been renamed to .getSize().' );
return this.getSize( optionalTarget );
}
} );
Line3.prototype.center = function ( optionalTarget ) {
console.warn( 'THREE.Line3: .center() has been renamed to .getCenter().' );
return this.getCenter( optionalTarget );
};
Object.assign( _Math, {
random16: function () {
console.warn( 'THREE.Math: .random16() has been deprecated. Use Math.random() instead.' );
return Math.random();
},
nearestPowerOfTwo: function ( value ) {
console.warn( 'THREE.Math: .nearestPowerOfTwo() has been renamed to .floorPowerOfTwo().' );
return _Math.floorPowerOfTwo( value );
},
nextPowerOfTwo: function ( value ) {
console.warn( 'THREE.Math: .nextPowerOfTwo() has been renamed to .ceilPowerOfTwo().' );
return _Math.ceilPowerOfTwo( value );
}
} );
Object.assign( Matrix3.prototype, {
flattenToArrayOffset: function ( array, offset ) {
console.warn( "THREE.Matrix3: .flattenToArrayOffset() has been deprecated. Use .toArray() instead." );
return this.toArray( array, offset );
},
multiplyVector3: function ( vector ) {
console.warn( 'THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead.' );
return vector.applyMatrix3( this );
},
multiplyVector3Array: function ( /* a */ ) {
console.error( 'THREE.Matrix3: .multiplyVector3Array() has been removed.' );
},
applyToBuffer: function ( buffer /*, offset, length */ ) {
console.warn( 'THREE.Matrix3: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute( attribute ) instead.' );
return this.applyToBufferAttribute( buffer );
},
applyToVector3Array: function ( /* array, offset, length */ ) {
console.error( 'THREE.Matrix3: .applyToVector3Array() has been removed.' );
}
} );
Object.assign( Matrix4.prototype, {
extractPosition: function ( m ) {
console.warn( 'THREE.Matrix4: .extractPosition() has been renamed to .copyPosition().' );
return this.copyPosition( m );
},
flattenToArrayOffset: function ( array, offset ) {
console.warn( "THREE.Matrix4: .flattenToArrayOffset() has been deprecated. Use .toArray() instead." );
return this.toArray( array, offset );
},
getPosition: function () {
var v1;
return function getPosition() {
if ( v1 === undefined ) v1 = new Vector3();
console.warn( 'THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead.' );
return v1.setFromMatrixColumn( this, 3 );
};
}(),
setRotationFromQuaternion: function ( q ) {
console.warn( 'THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion().' );
return this.makeRotationFromQuaternion( q );
},
multiplyToArray: function () {
console.warn( 'THREE.Matrix4: .multiplyToArray() has been removed.' );
},
multiplyVector3: function ( vector ) {
console.warn( 'THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) instead.' );
return vector.applyMatrix4( this );
},
multiplyVector4: function ( vector ) {
console.warn( 'THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead.' );
return vector.applyMatrix4( this );
},
multiplyVector3Array: function ( /* a */ ) {
console.error( 'THREE.Matrix4: .multiplyVector3Array() has been removed.' );
},
rotateAxis: function ( v ) {
console.warn( 'THREE.Matrix4: .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead.' );
v.transformDirection( this );
},
crossVector: function ( vector ) {
console.warn( 'THREE.Matrix4: .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead.' );
return vector.applyMatrix4( this );
},
translate: function () {
console.error( 'THREE.Matrix4: .translate() has been removed.' );
},
rotateX: function () {
console.error( 'THREE.Matrix4: .rotateX() has been removed.' );
},
rotateY: function () {
console.error( 'THREE.Matrix4: .rotateY() has been removed.' );
},
rotateZ: function () {
console.error( 'THREE.Matrix4: .rotateZ() has been removed.' );
},
rotateByAxis: function () {
console.error( 'THREE.Matrix4: .rotateByAxis() has been removed.' );
},
applyToBuffer: function ( buffer /*, offset, length */ ) {
console.warn( 'THREE.Matrix4: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute( attribute ) instead.' );
return this.applyToBufferAttribute( buffer );
},
applyToVector3Array: function ( /* array, offset, length */ ) {
console.error( 'THREE.Matrix4: .applyToVector3Array() has been removed.' );
},
makeFrustum: function ( left, right, bottom, top, near, far ) {
console.warn( 'THREE.Matrix4: .makeFrustum() has been removed. Use .makePerspective( left, right, top, bottom, near, far ) instead.' );
return this.makePerspective( left, right, top, bottom, near, far );
}
} );
Plane.prototype.isIntersectionLine = function ( line ) {
console.warn( 'THREE.Plane: .isIntersectionLine() has been renamed to .intersectsLine().' );
return this.intersectsLine( line );
};
Quaternion.prototype.multiplyVector3 = function ( vector ) {
console.warn( 'THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead.' );
return vector.applyQuaternion( this );
};
Object.assign( Ray.prototype, {
isIntersectionBox: function ( box ) {
console.warn( 'THREE.Ray: .isIntersectionBox() has been renamed to .intersectsBox().' );
return this.intersectsBox( box );
},
isIntersectionPlane: function ( plane ) {
console.warn( 'THREE.Ray: .isIntersectionPlane() has been renamed to .intersectsPlane().' );
return this.intersectsPlane( plane );
},
isIntersectionSphere: function ( sphere ) {
console.warn( 'THREE.Ray: .isIntersectionSphere() has been renamed to .intersectsSphere().' );
return this.intersectsSphere( sphere );
}
} );
Object.assign( Triangle.prototype, {
area: function () {
console.warn( 'THREE.Triangle: .area() has been renamed to .getArea().' );
return this.getArea();
},
barycoordFromPoint: function ( point, target ) {
console.warn( 'THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord().' );
return this.getBarycoord( point, target );
},
midpoint: function ( target ) {
console.warn( 'THREE.Triangle: .midpoint() has been renamed to .getMidpoint().' );
return this.getMidpoint( target );
},
normal: function ( target ) {
console.warn( 'THREE.Triangle: .normal() has been renamed to .getNormal().' );
return this.getNormal( target );
},
plane: function ( target ) {
console.warn( 'THREE.Triangle: .plane() has been renamed to .getPlane().' );
return this.getPlane( target );
}
} );
Object.assign( Triangle, {
barycoordFromPoint: function ( point, a, b, c, target ) {
console.warn( 'THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord().' );
return Triangle.getBarycoord( point, a, b, c, target );
},
normal: function ( a, b, c, target ) {
console.warn( 'THREE.Triangle: .normal() has been renamed to .getNormal().' );
return Triangle.getNormal( a, b, c, target );
}
} );
Object.assign( Shape.prototype, {
extractAllPoints: function ( divisions ) {
console.warn( 'THREE.Shape: .extractAllPoints() has been removed. Use .extractPoints() instead.' );
return this.extractPoints( divisions );
},
extrude: function ( options ) {
console.warn( 'THREE.Shape: .extrude() has been removed. Use ExtrudeGeometry() instead.' );
return new ExtrudeGeometry( this, options );
},
makeGeometry: function ( options ) {
console.warn( 'THREE.Shape: .makeGeometry() has been removed. Use ShapeGeometry() instead.' );
return new ShapeGeometry( this, options );
}
} );
Object.assign( Vector2.prototype, {
fromAttribute: function ( attribute, index, offset ) {
console.warn( 'THREE.Vector2: .fromAttribute() has been renamed to .fromBufferAttribute().' );
return this.fromBufferAttribute( attribute, index, offset );
},
distanceToManhattan: function ( v ) {
console.warn( 'THREE.Vector2: .distanceToManhattan() has been renamed to .manhattanDistanceTo().' );
return this.manhattanDistanceTo( v );
},
lengthManhattan: function () {
console.warn( 'THREE.Vector2: .lengthManhattan() has been renamed to .manhattanLength().' );
return this.manhattanLength();
}
} );
Object.assign( Vector3.prototype, {
setEulerFromRotationMatrix: function () {
console.error( 'THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.' );
},
setEulerFromQuaternion: function () {
console.error( 'THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.' );
},
getPositionFromMatrix: function ( m ) {
console.warn( 'THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition().' );
return this.setFromMatrixPosition( m );
},
getScaleFromMatrix: function ( m ) {
console.warn( 'THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale().' );
return this.setFromMatrixScale( m );
},
getColumnFromMatrix: function ( index, matrix ) {
console.warn( 'THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn().' );
return this.setFromMatrixColumn( matrix, index );
},
applyProjection: function ( m ) {
console.warn( 'THREE.Vector3: .applyProjection() has been removed. Use .applyMatrix4( m ) instead.' );
return this.applyMatrix4( m );
},
fromAttribute: function ( attribute, index, offset ) {
console.warn( 'THREE.Vector3: .fromAttribute() has been renamed to .fromBufferAttribute().' );
return this.fromBufferAttribute( attribute, index, offset );
},
distanceToManhattan: function ( v ) {
console.warn( 'THREE.Vector3: .distanceToManhattan() has been renamed to .manhattanDistanceTo().' );
return this.manhattanDistanceTo( v );
},
lengthManhattan: function () {
console.warn( 'THREE.Vector3: .lengthManhattan() has been renamed to .manhattanLength().' );
return this.manhattanLength();
}
} );
Object.assign( Vector4.prototype, {
fromAttribute: function ( attribute, index, offset ) {
console.warn( 'THREE.Vector4: .fromAttribute() has been renamed to .fromBufferAttribute().' );
return this.fromBufferAttribute( attribute, index, offset );
},
lengthManhattan: function () {
console.warn( 'THREE.Vector4: .lengthManhattan() has been renamed to .manhattanLength().' );
return this.manhattanLength();
}
} );
//
Object.assign( Geometry.prototype, {
computeTangents: function () {
console.error( 'THREE.Geometry: .computeTangents() has been removed.' );
},
computeLineDistances: function () {
console.error( 'THREE.Geometry: .computeLineDistances() has been removed. Use THREE.Line.computeLineDistances() instead.' );
}
} );
Object.assign( Object3D.prototype, {
getChildByName: function ( name ) {
console.warn( 'THREE.Object3D: .getChildByName() has been renamed to .getObjectByName().' );
return this.getObjectByName( name );
},
renderDepth: function () {
console.warn( 'THREE.Object3D: .renderDepth has been removed. Use .renderOrder, instead.' );
},
translate: function ( distance, axis ) {
console.warn( 'THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead.' );
return this.translateOnAxis( axis, distance );
},
getWorldRotation: function () {
console.error( 'THREE.Object3D: .getWorldRotation() has been removed. Use THREE.Object3D.getWorldQuaternion( target ) instead.' );
}
} );
Object.defineProperties( Object3D.prototype, {
eulerOrder: {
get: function () {
console.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' );
return this.rotation.order;
},
set: function ( value ) {
console.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' );
this.rotation.order = value;
}
},
useQuaternion: {
get: function () {
console.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' );
},
set: function () {
console.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' );
}
}
} );
Object.defineProperties( LOD.prototype, {
objects: {
get: function () {
console.warn( 'THREE.LOD: .objects has been renamed to .levels.' );
return this.levels;
}
}
} );
Object.defineProperty( Skeleton.prototype, 'useVertexTexture', {
get: function () {
console.warn( 'THREE.Skeleton: useVertexTexture has been removed.' );
},
set: function () {
console.warn( 'THREE.Skeleton: useVertexTexture has been removed.' );
}
} );
Object.defineProperty( Curve.prototype, '__arcLengthDivisions', {
get: function () {
console.warn( 'THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions.' );
return this.arcLengthDivisions;
},
set: function ( value ) {
console.warn( 'THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions.' );
this.arcLengthDivisions = value;
}
} );
//
PerspectiveCamera.prototype.setLens = function ( focalLength, filmGauge ) {
console.warn( "THREE.PerspectiveCamera.setLens is deprecated. " +
"Use .setFocalLength and .filmGauge for a photographic setup." );
if ( filmGauge !== undefined ) this.filmGauge = filmGauge;
this.setFocalLength( focalLength );
};
//
Object.defineProperties( Light.prototype, {
onlyShadow: {
set: function () {
console.warn( 'THREE.Light: .onlyShadow has been removed.' );
}
},
shadowCameraFov: {
set: function ( value ) {
console.warn( 'THREE.Light: .shadowCameraFov is now .shadow.camera.fov.' );
this.shadow.camera.fov = value;
}
},
shadowCameraLeft: {
set: function ( value ) {
console.warn( 'THREE.Light: .shadowCameraLeft is now .shadow.camera.left.' );
this.shadow.camera.left = value;
}
},
shadowCameraRight: {
set: function ( value ) {
console.warn( 'THREE.Light: .shadowCameraRight is now .shadow.camera.right.' );
this.shadow.camera.right = value;
}
},
shadowCameraTop: {
set: function ( value ) {
console.warn( 'THREE.Light: .shadowCameraTop is now .shadow.camera.top.' );
this.shadow.camera.top = value;
}
},
shadowCameraBottom: {
set: function ( value ) {
console.warn( 'THREE.Light: .shadowCameraBottom is now .shadow.camera.bottom.' );
this.shadow.camera.bottom = value;
}
},
shadowCameraNear: {
set: function ( value ) {
console.warn( 'THREE.Light: .shadowCameraNear is now .shadow.camera.near.' );
this.shadow.camera.near = value;
}
},
shadowCameraFar: {
set: function ( value ) {
console.warn( 'THREE.Light: .shadowCameraFar is now .shadow.camera.far.' );
this.shadow.camera.far = value;
}
},
shadowCameraVisible: {
set: function () {
console.warn( 'THREE.Light: .shadowCameraVisible has been removed. Use new THREE.CameraHelper( light.shadow.camera ) instead.' );
}
},
shadowBias: {
set: function ( value ) {
console.warn( 'THREE.Light: .shadowBias is now .shadow.bias.' );
this.shadow.bias = value;
}
},
shadowDarkness: {
set: function () {
console.warn( 'THREE.Light: .shadowDarkness has been removed.' );
}
},
shadowMapWidth: {
set: function ( value ) {
console.warn( 'THREE.Light: .shadowMapWidth is now .shadow.mapSize.width.' );
this.shadow.mapSize.width = value;
}
},
shadowMapHeight: {
set: function ( value ) {
console.warn( 'THREE.Light: .shadowMapHeight is now .shadow.mapSize.height.' );
this.shadow.mapSize.height = value;
}
}
} );
//
Object.defineProperties( BufferAttribute.prototype, {
length: {
get: function () {
console.warn( 'THREE.BufferAttribute: .length has been deprecated. Use .count instead.' );
return this.array.length;
}
},
copyIndicesArray: function ( /* indices */ ) {
console.error( 'THREE.BufferAttribute: .copyIndicesArray() has been removed.' );
}
} );
Object.assign( BufferGeometry.prototype, {
addIndex: function ( index ) {
console.warn( 'THREE.BufferGeometry: .addIndex() has been renamed to .setIndex().' );
this.setIndex( index );
},
addDrawCall: function ( start, count, indexOffset ) {
if ( indexOffset !== undefined ) {
console.warn( 'THREE.BufferGeometry: .addDrawCall() no longer supports indexOffset.' );
}
console.warn( 'THREE.BufferGeometry: .addDrawCall() is now .addGroup().' );
this.addGroup( start, count );
},
clearDrawCalls: function () {
console.warn( 'THREE.BufferGeometry: .clearDrawCalls() is now .clearGroups().' );
this.clearGroups();
},
computeTangents: function () {
console.warn( 'THREE.BufferGeometry: .computeTangents() has been removed.' );
},
computeOffsets: function () {
console.warn( 'THREE.BufferGeometry: .computeOffsets() has been removed.' );
}
} );
Object.defineProperties( BufferGeometry.prototype, {
drawcalls: {
get: function () {
console.error( 'THREE.BufferGeometry: .drawcalls has been renamed to .groups.' );
return this.groups;
}
},
offsets: {
get: function () {
console.warn( 'THREE.BufferGeometry: .offsets has been renamed to .groups.' );
return this.groups;
}
}
} );
//
Object.assign( ExtrudeBufferGeometry.prototype, {
getArrays: function () {
console.error( 'THREE.ExtrudeBufferGeometry: .getArrays() has been removed.' );
},
addShapeList: function () {
console.error( 'THREE.ExtrudeBufferGeometry: .addShapeList() has been removed.' );
},
addShape: function () {
console.error( 'THREE.ExtrudeBufferGeometry: .addShape() has been removed.' );
}
} );
//
Object.defineProperties( Uniform.prototype, {
dynamic: {
set: function () {
console.warn( 'THREE.Uniform: .dynamic has been removed. Use object.onBeforeRender() instead.' );
}
},
onUpdate: {
value: function () {
console.warn( 'THREE.Uniform: .onUpdate() has been removed. Use object.onBeforeRender() instead.' );
return this;
}
}
} );
//
Object.defineProperties( Material.prototype, {
wrapAround: {
get: function () {
console.warn( 'THREE.Material: .wrapAround has been removed.' );
},
set: function () {
console.warn( 'THREE.Material: .wrapAround has been removed.' );
}
},
wrapRGB: {
get: function () {
console.warn( 'THREE.Material: .wrapRGB has been removed.' );
return new Color();
}
},
shading: {
get: function () {
console.error( 'THREE.' + this.type + ': .shading has been removed. Use the boolean .flatShading instead.' );
},
set: function ( value ) {
console.warn( 'THREE.' + this.type + ': .shading has been removed. Use the boolean .flatShading instead.' );
this.flatShading = ( value === FlatShading );
}
}
} );
Object.defineProperties( MeshPhongMaterial.prototype, {
metal: {
get: function () {
console.warn( 'THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead.' );
return false;
},
set: function () {
console.warn( 'THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead' );
}
}
} );
Object.defineProperties( ShaderMaterial.prototype, {
derivatives: {
get: function () {
console.warn( 'THREE.ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' );
return this.extensions.derivatives;
},
set: function ( value ) {
console.warn( 'THREE. ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' );
this.extensions.derivatives = value;
}
}
} );
//
Object.assign( WebGLRenderer.prototype, {
getCurrentRenderTarget: function () {
console.warn( 'THREE.WebGLRenderer: .getCurrentRenderTarget() is now .getRenderTarget().' );
return this.getRenderTarget();
},
getMaxAnisotropy: function () {
console.warn( 'THREE.WebGLRenderer: .getMaxAnisotropy() is now .capabilities.getMaxAnisotropy().' );
return this.capabilities.getMaxAnisotropy();
},
getPrecision: function () {
console.warn( 'THREE.WebGLRenderer: .getPrecision() is now .capabilities.precision.' );
return this.capabilities.precision;
},
resetGLState: function () {
console.warn( 'THREE.WebGLRenderer: .resetGLState() is now .state.reset().' );
return this.state.reset();
},
supportsFloatTextures: function () {
console.warn( 'THREE.WebGLRenderer: .supportsFloatTextures() is now .extensions.get( \'OES_texture_float\' ).' );
return this.extensions.get( 'OES_texture_float' );
},
supportsHalfFloatTextures: function () {
console.warn( 'THREE.WebGLRenderer: .supportsHalfFloatTextures() is now .extensions.get( \'OES_texture_half_float\' ).' );
return this.extensions.get( 'OES_texture_half_float' );
},
supportsStandardDerivatives: function () {
console.warn( 'THREE.WebGLRenderer: .supportsStandardDerivatives() is now .extensions.get( \'OES_standard_derivatives\' ).' );
return this.extensions.get( 'OES_standard_derivatives' );
},
supportsCompressedTextureS3TC: function () {
console.warn( 'THREE.WebGLRenderer: .supportsCompressedTextureS3TC() is now .extensions.get( \'WEBGL_compressed_texture_s3tc\' ).' );
return this.extensions.get( 'WEBGL_compressed_texture_s3tc' );
},
supportsCompressedTexturePVRTC: function () {
console.warn( 'THREE.WebGLRenderer: .supportsCompressedTexturePVRTC() is now .extensions.get( \'WEBGL_compressed_texture_pvrtc\' ).' );
return this.extensions.get( 'WEBGL_compressed_texture_pvrtc' );
},
supportsBlendMinMax: function () {
console.warn( 'THREE.WebGLRenderer: .supportsBlendMinMax() is now .extensions.get( \'EXT_blend_minmax\' ).' );
return this.extensions.get( 'EXT_blend_minmax' );
},
supportsVertexTextures: function () {
console.warn( 'THREE.WebGLRenderer: .supportsVertexTextures() is now .capabilities.vertexTextures.' );
return this.capabilities.vertexTextures;
},
supportsInstancedArrays: function () {
console.warn( 'THREE.WebGLRenderer: .supportsInstancedArrays() is now .extensions.get( \'ANGLE_instanced_arrays\' ).' );
return this.extensions.get( 'ANGLE_instanced_arrays' );
},
enableScissorTest: function ( boolean ) {
console.warn( 'THREE.WebGLRenderer: .enableScissorTest() is now .setScissorTest().' );
this.setScissorTest( boolean );
},
initMaterial: function () {
console.warn( 'THREE.WebGLRenderer: .initMaterial() has been removed.' );
},
addPrePlugin: function () {
console.warn( 'THREE.WebGLRenderer: .addPrePlugin() has been removed.' );
},
addPostPlugin: function () {
console.warn( 'THREE.WebGLRenderer: .addPostPlugin() has been removed.' );
},
updateShadowMap: function () {
console.warn( 'THREE.WebGLRenderer: .updateShadowMap() has been removed.' );
},
setFaceCulling: function () {
console.warn( 'THREE.WebGLRenderer: .setFaceCulling() has been removed.' );
}
} );
Object.defineProperties( WebGLRenderer.prototype, {
shadowMapEnabled: {
get: function () {
return this.shadowMap.enabled;
},
set: function ( value ) {
console.warn( 'THREE.WebGLRenderer: .shadowMapEnabled is now .shadowMap.enabled.' );
this.shadowMap.enabled = value;
}
},
shadowMapType: {
get: function () {
return this.shadowMap.type;
},
set: function ( value ) {
console.warn( 'THREE.WebGLRenderer: .shadowMapType is now .shadowMap.type.' );
this.shadowMap.type = value;
}
},
shadowMapCullFace: {
get: function () {
console.warn( 'THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.' );
return undefined;
},
set: function ( /* value */ ) {
console.warn( 'THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.' );
}
}
} );
Object.defineProperties( WebGLShadowMap.prototype, {
cullFace: {
get: function () {
console.warn( 'THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.' );
return undefined;
},
set: function ( /* cullFace */ ) {
console.warn( 'THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.' );
}
},
renderReverseSided: {
get: function () {
console.warn( 'THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.' );
return undefined;
},
set: function () {
console.warn( 'THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.' );
}
},
renderSingleSided: {
get: function () {
console.warn( 'THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.' );
return undefined;
},
set: function () {
console.warn( 'THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.' );
}
}
} );
//
Object.defineProperties( WebGLRenderTarget.prototype, {
wrapS: {
get: function () {
console.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' );
return this.texture.wrapS;
},
set: function ( value ) {
console.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' );
this.texture.wrapS = value;
}
},
wrapT: {
get: function () {
console.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' );
return this.texture.wrapT;
},
set: function ( value ) {
console.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' );
this.texture.wrapT = value;
}
},
magFilter: {
get: function () {
console.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' );
return this.texture.magFilter;
},
set: function ( value ) {
console.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' );
this.texture.magFilter = value;
}
},
minFilter: {
get: function () {
console.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' );
return this.texture.minFilter;
},
set: function ( value ) {
console.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' );
this.texture.minFilter = value;
}
},
anisotropy: {
get: function () {
console.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' );
return this.texture.anisotropy;
},
set: function ( value ) {
console.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' );
this.texture.anisotropy = value;
}
},
offset: {
get: function () {
console.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' );
return this.texture.offset;
},
set: function ( value ) {
console.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' );
this.texture.offset = value;
}
},
repeat: {
get: function () {
console.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' );
return this.texture.repeat;
},
set: function ( value ) {
console.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' );
this.texture.repeat = value;
}
},
format: {
get: function () {
console.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' );
return this.texture.format;
},
set: function ( value ) {
console.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' );
this.texture.format = value;
}
},
type: {
get: function () {
console.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' );
return this.texture.type;
},
set: function ( value ) {
console.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' );
this.texture.type = value;
}
},
generateMipmaps: {
get: function () {
console.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' );
return this.texture.generateMipmaps;
},
set: function ( value ) {
console.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' );
this.texture.generateMipmaps = value;
}
}
} );
//
Object.defineProperties( WebVRManager.prototype, {
standing: {
set: function ( /* value */ ) {
console.warn( 'THREE.WebVRManager: .standing has been removed.' );
}
}
} );
//
Audio.prototype.load = function ( file ) {
console.warn( 'THREE.Audio: .load has been deprecated. Use THREE.AudioLoader instead.' );
var scope = this;
var audioLoader = new AudioLoader();
audioLoader.load( file, function ( buffer ) {
scope.setBuffer( buffer );
} );
return this;
};
AudioAnalyser.prototype.getData = function () {
console.warn( 'THREE.AudioAnalyser: .getData() is now .getFrequencyData().' );
return this.getFrequencyData();
};
//
CubeCamera.prototype.updateCubeMap = function ( renderer, scene ) {
console.warn( 'THREE.CubeCamera: .updateCubeMap() is now .update().' );
return this.update( renderer, scene );
};
var minivents_commonjs = function Events(target){
var events = {}, empty = [];
target = target || this;
/**
* On: listen to events
*/
target.on = function(type, func, ctx){
(events[type] = events[type] || []).push([func, ctx]);
return target
};
/**
* Off: stop listening to event / specific callback
*/
target.off = function(type, func){
type || (events = {});
var list = events[type] || empty,
i = list.length = func ? list.length : 0;
while(i--) func == list[i][0] && list.splice(i,1);
return target
};
/**
* Emit: send event, callbacks will be triggered
*/
target.emit = function(type){
var e = events[type] || empty, list = e.length > 0 ? e.slice(0, e.length) : e, i=0, j;
while(j=list[i++]) j[0].apply(j[1], empty.slice.call(arguments, 1));
return target
};
};
// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])
_export(_export.S, 'Object', { create: _objectCreate });
var $Object$2 = _core.Object;
var create = function create(P, D) {
return $Object$2.create(P, D);
};
var create$1 = create;
var _validateCollection = function (it, TYPE) {
if (!_isObject(it) || it._t !== TYPE) throw TypeError('Incompatible receiver, ' + TYPE + ' required!');
return it;
};
var dP$2 = _objectDp.f;
var fastKey = _meta.fastKey;
var SIZE = _descriptors ? '_s' : 'size';
var getEntry = function (that, key) {
// fast case
var index = fastKey(key);
var entry;
if (index !== 'F') return that._i[index];
// frozen object case
for (entry = that._f; entry; entry = entry.n) {
if (entry.k == key) return entry;
}
};
var _collectionStrong = {
getConstructor: function (wrapper, NAME, IS_MAP, ADDER) {
var C = wrapper(function (that, iterable) {
_anInstance(that, C, NAME, '_i');
that._t = NAME; // collection type
that._i = _objectCreate(null); // index
that._f = undefined; // first entry
that._l = undefined; // last entry
that[SIZE] = 0; // size
if (iterable != undefined) _forOf(iterable, IS_MAP, that[ADDER], that);
});
_redefineAll(C.prototype, {
// 23.1.3.1 Map.prototype.clear()
// 23.2.3.2 Set.prototype.clear()
clear: function clear() {
for (var that = _validateCollection(this, NAME), data = that._i, entry = that._f; entry; entry = entry.n) {
entry.r = true;
if (entry.p) entry.p = entry.p.n = undefined;
delete data[entry.i];
}
that._f = that._l = undefined;
that[SIZE] = 0;
},
// 23.1.3.3 Map.prototype.delete(key)
// 23.2.3.4 Set.prototype.delete(value)
'delete': function (key) {
var that = _validateCollection(this, NAME);
var entry = getEntry(that, key);
if (entry) {
var next = entry.n;
var prev = entry.p;
delete that._i[entry.i];
entry.r = true;
if (prev) prev.n = next;
if (next) next.p = prev;
if (that._f == entry) that._f = next;
if (that._l == entry) that._l = prev;
that[SIZE]--;
} return !!entry;
},
// 23.2.3.6 Set.prototype.forEach(callbackfn, thisArg = undefined)
// 23.1.3.5 Map.prototype.forEach(callbackfn, thisArg = undefined)
forEach: function forEach(callbackfn /* , that = undefined */) {
_validateCollection(this, NAME);
var f = _ctx(callbackfn, arguments.length > 1 ? arguments[1] : undefined, 3);
var entry;
while (entry = entry ? entry.n : this._f) {
f(entry.v, entry.k, this);
// revert to the last existing entry
while (entry && entry.r) entry = entry.p;
}
},
// 23.1.3.7 Map.prototype.has(key)
// 23.2.3.7 Set.prototype.has(value)
has: function has(key) {
return !!getEntry(_validateCollection(this, NAME), key);
}
});
if (_descriptors) dP$2(C.prototype, 'size', {
get: function () {
return _validateCollection(this, NAME)[SIZE];
}
});
return C;
},
def: function (that, key, value) {
var entry = getEntry(that, key);
var prev, index;
// change existing entry
if (entry) {
entry.v = value;
// create new entry
} else {
that._l = entry = {
i: index = fastKey(key, true), // <- index
k: key, // <- key
v: value, // <- value
p: prev = that._l, // <- previous entry
n: undefined, // <- next entry
r: false // <- removed
};
if (!that._f) that._f = entry;
if (prev) prev.n = entry;
that[SIZE]++;
// add to index
if (index !== 'F') that._i[index] = entry;
} return that;
},
getEntry: getEntry,
setStrong: function (C, NAME, IS_MAP) {
// add .keys, .values, .entries, [@@iterator]
// 23.1.3.4, 23.1.3.8, 23.1.3.11, 23.1.3.12, 23.2.3.5, 23.2.3.8, 23.2.3.10, 23.2.3.11
_iterDefine(C, NAME, function (iterated, kind) {
this._t = _validateCollection(iterated, NAME); // target
this._k = kind; // kind
this._l = undefined; // previous
}, function () {
var that = this;
var kind = that._k;
var entry = that._l;
// revert to the last existing entry
while (entry && entry.r) entry = entry.p;
// get next entry
if (!that._t || !(that._l = entry = entry ? entry.n : that._t._f)) {
// or finish the iteration
that._t = undefined;
return _iterStep(1);
}
// return step by kind
if (kind == 'keys') return _iterStep(0, entry.k);
if (kind == 'values') return _iterStep(0, entry.v);
return _iterStep(0, [entry.k, entry.v]);
}, IS_MAP ? 'entries' : 'values', !IS_MAP, true);
// add [@@species], 23.1.2.2, 23.2.2.2
_setSpecies(NAME);
}
};
var SPECIES$2 = _wks('species');
var _arraySpeciesConstructor = function (original) {
var C;
if (_isArray(original)) {
C = original.constructor;
// cross-realm fallback
if (typeof C == 'function' && (C === Array || _isArray(C.prototype))) C = undefined;
if (_isObject(C)) {
C = C[SPECIES$2];
if (C === null) C = undefined;
}
} return C === undefined ? Array : C;
};
// 9.4.2.3 ArraySpeciesCreate(originalArray, length)
var _arraySpeciesCreate = function (original, length) {
return new (_arraySpeciesConstructor(original))(length);
};
// 0 -> Array#forEach
// 1 -> Array#map
// 2 -> Array#filter
// 3 -> Array#some
// 4 -> Array#every
// 5 -> Array#find
// 6 -> Array#findIndex
var _arrayMethods = function (TYPE, $create) {
var IS_MAP = TYPE == 1;
var IS_FILTER = TYPE == 2;
var IS_SOME = TYPE == 3;
var IS_EVERY = TYPE == 4;
var IS_FIND_INDEX = TYPE == 6;
var NO_HOLES = TYPE == 5 || IS_FIND_INDEX;
var create = $create || _arraySpeciesCreate;
return function ($this, callbackfn, that) {
var O = _toObject($this);
var self = _iobject(O);
var f = _ctx(callbackfn, that, 3);
var length = _toLength(self.length);
var index = 0;
var result = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined;
var val, res;
for (;length > index; index++) if (NO_HOLES || index in self) {
val = self[index];
res = f(val, index, O);
if (TYPE) {
if (IS_MAP) result[index] = res; // map
else if (res) switch (TYPE) {
case 3: return true; // some
case 5: return val; // find
case 6: return index; // findIndex
case 2: result.push(val); // filter
} else if (IS_EVERY) return false; // every
}
}
return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : result;
};
};
var dP$3 = _objectDp.f;
var each = _arrayMethods(0);
var _collection = function (NAME, wrapper, methods, common, IS_MAP, IS_WEAK) {
var Base = _global[NAME];
var C = Base;
var ADDER = IS_MAP ? 'set' : 'add';
var proto = C && C.prototype;
var O = {};
if (!_descriptors || typeof C != 'function' || !(IS_WEAK || proto.forEach && !_fails(function () {
new C().entries().next();
}))) {
// create collection constructor
C = common.getConstructor(wrapper, NAME, IS_MAP, ADDER);
_redefineAll(C.prototype, methods);
_meta.NEED = true;
} else {
C = wrapper(function (target, iterable) {
_anInstance(target, C, NAME, '_c');
target._c = new Base();
if (iterable != undefined) _forOf(iterable, IS_MAP, target[ADDER], target);
});
each('add,clear,delete,forEach,get,has,set,keys,values,entries,toJSON'.split(','), function (KEY) {
var IS_ADDER = KEY == 'add' || KEY == 'set';
if (KEY in proto && !(IS_WEAK && KEY == 'clear')) _hide(C.prototype, KEY, function (a, b) {
_anInstance(this, C, KEY);
if (!IS_ADDER && IS_WEAK && !_isObject(a)) return KEY == 'get' ? undefined : false;
var result = this._c[KEY](a === 0 ? 0 : a, b);
return IS_ADDER ? this : result;
});
});
IS_WEAK || dP$3(C.prototype, 'size', {
get: function () {
return this._c.size;
}
});
}
_setToStringTag(C, NAME);
O[NAME] = C;
_export(_export.G + _export.W + _export.F, O);
if (!IS_WEAK) common.setStrong(C, NAME, IS_MAP);
return C;
};
var MAP = 'Map';
// 23.1 Map Objects
var es6_map = _collection(MAP, function (get) {
return function Map() { return get(this, arguments.length > 0 ? arguments[0] : undefined); };
}, {
// 23.1.3.6 Map.prototype.get(key)
get: function get(key) {
var entry = _collectionStrong.getEntry(_validateCollection(this, MAP), key);
return entry && entry.v;
},
// 23.1.3.9 Map.prototype.set(key, value)
set: function set(key, value) {
return _collectionStrong.def(_validateCollection(this, MAP), key === 0 ? 0 : key, value);
}
}, _collectionStrong, true);
var _arrayFromIterable = function (iter, ITERATOR) {
var result = [];
_forOf(iter, false, result.push, result, ITERATOR);
return result;
};
// https://github.com/DavidBruant/Map-Set.prototype.toJSON
var _collectionToJson = function (NAME) {
return function toJSON() {
if (_classof(this) != NAME) throw TypeError(NAME + "#toJSON isn't generic");
return _arrayFromIterable(this);
};
};
// https://github.com/DavidBruant/Map-Set.prototype.toJSON
_export(_export.P + _export.R, 'Map', { toJSON: _collectionToJson('Map') });
// https://tc39.github.io/proposal-setmap-offrom/
var _setCollectionOf = function (COLLECTION) {
_export(_export.S, COLLECTION, { of: function of() {
var length = arguments.length;
var A = new Array(length);
while (length--) A[length] = arguments[length];
return new this(A);
} });
};
// https://tc39.github.io/proposal-setmap-offrom/#sec-map.of
_setCollectionOf('Map');
// https://tc39.github.io/proposal-setmap-offrom/
var _setCollectionFrom = function (COLLECTION) {
_export(_export.S, COLLECTION, { from: function from(source /* , mapFn, thisArg */) {
var mapFn = arguments[1];
var mapping, A, n, cb;
_aFunction(this);
mapping = mapFn !== undefined;
if (mapping) _aFunction(mapFn);
if (source == undefined) return new this();
A = [];
if (mapping) {
n = 0;
cb = _ctx(mapFn, arguments[2], 2);
_forOf(source, false, function (nextItem) {
A.push(cb(nextItem, n++));
});
} else {
_forOf(source, false, A.push, A);
}
return new this(A);
} });
};
// https://tc39.github.io/proposal-setmap-offrom/#sec-map.from
_setCollectionFrom('Map');
var map = _core.Map;
var map$1 = map;
var arraySlice = [].slice;
var factories = {};
var construct = function (F, len, args) {
if (!(len in factories)) {
for (var n = [], i = 0; i < len; i++) n[i] = 'a[' + i + ']';
// eslint-disable-next-line no-new-func
factories[len] = Function('F,a', 'return new F(' + n.join(',') + ')');
} return factories[len](F, args);
};
var _bind = Function.bind || function bind(that /* , ...args */) {
var fn = _aFunction(this);
var partArgs = arraySlice.call(arguments, 1);
var bound = function (/* args... */) {
var args = partArgs.concat(arraySlice.call(arguments));
return this instanceof bound ? construct(fn, args.length, args) : _invoke(fn, args, that);
};
if (_isObject(fn.prototype)) bound.prototype = fn.prototype;
return bound;
};
// 26.1.2 Reflect.construct(target, argumentsList [, newTarget])
var rConstruct = (_global.Reflect || {}).construct;
// MS Edge supports only 2 arguments and argumentsList argument is optional
// FF Nightly sets third argument as `new.target`, but does not create `this` from it
var NEW_TARGET_BUG = _fails(function () {
function F() { /* empty */ }
return !(rConstruct(function () { /* empty */ }, [], F) instanceof F);
});
var ARGS_BUG = !_fails(function () {
rConstruct(function () { /* empty */ });
});
_export(_export.S + _export.F * (NEW_TARGET_BUG || ARGS_BUG), 'Reflect', {
construct: function construct(Target, args /* , newTarget */) {
_aFunction(Target);
_anObject(args);
var newTarget = arguments.length < 3 ? Target : _aFunction(arguments[2]);
if (ARGS_BUG && !NEW_TARGET_BUG) return rConstruct(Target, args, newTarget);
if (Target == newTarget) {
// w/o altered newTarget, optimization for 0-4 arguments
switch (args.length) {
case 0: return new Target();
case 1: return new Target(args[0]);
case 2: return new Target(args[0], args[1]);
case 3: return new Target(args[0], args[1], args[2]);
case 4: return new Target(args[0], args[1], args[2], args[3]);
}
// w/o altered newTarget, lot of arguments case
var $args = [null];
$args.push.apply($args, args);
return new (_bind.apply(Target, $args))();
}
// with altered newTarget, not support built-in constructors
var proto = newTarget.prototype;
var instance = _objectCreate(_isObject(proto) ? proto : Object.prototype);
var result = Function.apply.call(Target, instance, args);
return _isObject(result) ? result : instance;
}
});
var construct$1 = _core.Reflect.construct;
var construct$2 = construct$1;
var construct$3 = createCommonjsModule(function (module) {
function _construct(Parent, args, Class) {
if (typeof Reflect !== "undefined" && construct$2) {
module.exports = _construct = construct$2;
} else {
module.exports = _construct = function _construct(Parent, args, Class) {
var a = [null];
a.push.apply(a, args);
var Constructor = Parent.bind.apply(Parent, a);
var instance = new Constructor();
if (Class) setPrototypeOf$2(instance, Class.prototype);
return instance;
};
}
return _construct.apply(null, arguments);
}
module.exports = _construct;
});
var wrapNativeSuper = createCommonjsModule(function (module) {
function _wrapNativeSuper(Class) {
var _cache = typeof map$1 === "function" ? new map$1() : undefined;
module.exports = _wrapNativeSuper = function _wrapNativeSuper(Class) {
if (typeof Class !== "function") {
throw new TypeError("Super expression must either be null or a function");
}
if (typeof _cache !== "undefined") {
if (_cache.has(Class)) return _cache.get(Class);
_cache.set(Class, Wrapper);
}
function Wrapper() {}
Wrapper.prototype = create$1(Class.prototype, {
constructor: {
value: Wrapper,
enumerable: false,
writable: true,
configurable: true
}
});
return setPrototypeOf$2(Wrapper, setPrototypeOf$2(function Super() {
return construct$3(Class, arguments, getPrototypeOf$2(this).constructor);
}, Class));
};
return _wrapNativeSuper(Class);
}
module.exports = _wrapNativeSuper;
});
var CompositionError$1 =
/*#__PURE__*/
function (_Error) {
function CompositionError(classInstance, message, component) {
var _this;
classCallCheck(this, CompositionError);
_this = possibleConstructorReturn(this, getPrototypeOf$2(CompositionError).call(this, "@".concat(classInstance, ": ").concat(message)));
var stackArray = _this.stack.split('\n');
stackArray.splice(1, 2);
_this.stack = stackArray.join('\n');
if (console) console.error('Component:', component);
_this.name = 'CompositionError';
return _this;
}
inherits(CompositionError, _Error);
return CompositionError;
}(wrapNativeSuper(Error));
var DependencyError =
/*#__PURE__*/
function (_Error2) {
function DependencyError(classInstance, message, activeModule) {
var _this2;
var dependencyModule = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
classCallCheck(this, DependencyError);
_this2 = possibleConstructorReturn(this, getPrototypeOf$2(DependencyError).call(this, "@".concat(classInstance, ": ").concat(message)));
var stackArray = _this2.stack.split('\n');
stackArray.splice(1, 2);
_this2.stack = stackArray.join('\n');
if (console) console.error('Active module:', activeModule);
if (console && dependencyModule) console.error('Dependency published by module:', dependencyModule);
_this2.name = 'DependencyError';
return _this2;
}
inherits(DependencyError, _Error2);
return DependencyError;
}(wrapNativeSuper(Error));
var ManagerError =
/*#__PURE__*/
function (_Error3) {
function ManagerError(classInstance, message, component) {
var _this3;
var activeModule = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
classCallCheck(this, ManagerError);
_this3 = possibleConstructorReturn(this, getPrototypeOf$2(ManagerError).call(this, "@".concat(classInstance, ": ").concat(message)));
var stackArray = _this3.stack.split('\n');
stackArray.splice(1, 2);
_this3.stack = stackArray.join('\n');
if (console) console.error('Component:', component);
if (console && activeModule) console.error('Active module:', activeModule);
_this3.name = 'ManagerError';
return _this3;
}
inherits(ManagerError, _Error3);
return ManagerError;
}(wrapNativeSuper(Error));
var warnDeps = function warnDeps() {
throw new Error('WhitestormJS Framework requ ires Three.js r92. https://threejs.org/');
};
try {
if (!REVISION) warnDeps();
} catch (err) {
warnDeps();
}
/**
* @class ModuleSystem
* @category core
* @description Provides API for classes that will use Modules.<br/>
* This class includes basic event system with those supported methods:
* <pre>.on()</pre><pre>.off()</pre><pre>.emit()</pre>
* @extends Events
* @memberof module:core
*/
var ModuleSystem =
/*#__PURE__*/
function (_Events) {
function ModuleSystem() {
classCallCheck(this, ModuleSystem);
return possibleConstructorReturn(this, getPrototypeOf$2(ModuleSystem).apply(this, arguments));
}
createClass(ModuleSystem, [{
key: "integrateModules",
// INTEGRATING
/**
* @method integrateModules
* @instance
* @description This method applies all modules from .modules collection.
* @param {Object} [source] If source (should be a component) is provided, will replace .modules with source's one before executing modules.
* @memberof module:core.ModuleSystem
*/
value: function integrateModules(source) {
if (!this.modules && !source) return;
if (source && source.modules) this.modules = source.modules.slice(0);
if (this.modules) {
for (var i = 0, max = this.modules.length; i < max; i++) {
this.applyModule(this.modules[i], false);
}
}
if (source) this.applyBridge({
onCopy: source
});
} // APPLYING MODULE (...and a "bridge" for module)
/**
* @method applyBridge
* @instance
* @description Makes component-specific API to work with modules.
* @param {Object} bridgeMap
* @return {Object} Returns object with modified values.
* @memberof module:core.ModuleSystem
*/
}, {
key: "applyBridge",
value: function applyBridge() {
var bridgeMap = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var modules = this.modules;
if (!modules) return bridgeMap;
for (var i = 0, max = modules.length; i < max; i++) {
for (var key in bridgeMap) {
if (bridgeMap[key]) {
var module = modules[i];
if (module && module.bridge && module.bridge[key]) bridgeMap[key] = module.bridge[key].apply(this, [bridgeMap[key], module]);
}
}
}
return bridgeMap;
}
/**
* @method applyCommand
* @instance
* @description .applyCommand runs a method called `name` on all modules.
* @param {String} name the method name.
* @param {Function} [cb=(func, moduleScope) => func.apply(this, [moduleScope])] How the function is wrapped/
* @memberof module:core.ModuleSystem
*/
}, {
key: "applyCommand",
value: function applyCommand(name) {
var _this = this;
var cb = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function (func, moduleScope) {
return func.apply(_this, [moduleScope]);
};
var modules = this.modules;
if (!modules) return;
for (var i = 0, max = modules.length; i < max; i++) {
var module = modules[i];
if (name in module) cb(module[name], module);
}
}
/**
* @method applyModule
* @instance
* @description .applyModule is also used in .integrateModules() function.
* It does exactly what its name says (applies module to component or app).
* @param {Object} module the module to apply
* @param {Boolean} [push=true]
* @return {Object} Returns module that was applied.
* @throws {ManagerError}
* @memberof module:core.ModuleSystem
*/
}, {
key: "applyModule",
value: function applyModule(module) {
var push = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
if (!module) return;
if (push && this.modules) this.modules.push(module);else if (push) this.modules = [module];
if (this.manager) this.manager.active(module);
if (module.manager && this.manager) module.manager(this.manager);else if (module.manager) {
throw new ManagerError('Component', "Module requires ModuleManager that is turned off for this component", this, module);
}
if (module.integrate) module.integrate.bind(this)(module);
return module;
}
/**
* @method disposeModules
* @instance
* @description Disposes of all modules
* @memberof module:core.ModuleSystem
*/
}, {
key: "disposeModules",
value: function disposeModules() {
while (this.modules.length) {
this.disposeModule(this.modules[0]);
}
}
/**
* @method disposeModule
* @instance
* @description Disposes of the given module
* @param {Object} module the module to dispose
* @return {Module} Returns module that was removed.
* @memberof module:core.ModuleSystem
*/
}, {
key: "disposeModule",
value: function disposeModule(module) {
if (!module) return;
this.modules.splice(this.modules.indexOf(module), 1);
if (module.dispose) module.dispose.bind(this)(module);
return module;
} // PIPED METHOD
/**
* @method module
* @instance
* @description piped version of .applyModule().
* @param {Object} module the module to apply
* @return {this} returns this - app/component
* @throws {ManagerError}
* @memberof module:core.ModuleSystem
* @example <caption>Piped modules</caption>
* component
* .module(new Module1())
* .module(new Module2())
* .module(new Module3())
*/
}, {
key: "module",
value: function module(_module) {
this.applyModule(_module);
return this;
}
}]);
inherits(ModuleSystem, _Events);
return ModuleSystem;
}(minivents_commonjs);
function _arrayWithHoles(arr) {
if (Array.isArray(arr)) return arr;
}
var arrayWithHoles = _arrayWithHoles;
var core_getIterator = _core.getIterator = function (it) {
var iterFn = core_getIteratorMethod(it);
if (typeof iterFn != 'function') throw TypeError(it + ' is not iterable!');
return _anObject(iterFn.call(it));
};
var getIterator = core_getIterator;
var getIterator$1 = getIterator;
function _iterableToArrayLimit(arr, i) {
var _arr = [];
var _n = true;
var _d = false;
var _e = undefined;
try {
for (var _i = getIterator$1(arr), _s; !(_n = (_s = _i.next()).done); _n = true) {
_arr.push(_s.value);
if (i && _arr.length === i) break;
}
} catch (err) {
_d = true;
_e = err;
} finally {
try {
if (!_n && _i["return"] != null) _i["return"]();
} finally {
if (_d) throw _e;
}
}
return _arr;
}
var iterableToArrayLimit = _iterableToArrayLimit;
function _nonIterableRest() {
throw new TypeError("Invalid attempt to destructure non-iterable instance");
}
var nonIterableRest = _nonIterableRest;
function _slicedToArray(arr, i) {
return arrayWithHoles(arr) || iterableToArrayLimit(arr, i) || nonIterableRest();
}
var slicedToArray = _slicedToArray;
function symbolObservablePonyfill(root) {
var result;
var Symbol = root.Symbol;
if (typeof Symbol === 'function') {
if (Symbol.observable) {
result = Symbol.observable;
} else {
result = Symbol('observable');
Symbol.observable = result;
}
} else {
result = '@@observable';
}
return result;
}
/* global window */
var root;
if (typeof self !== 'undefined') {
root = self;
} else if (typeof window !== 'undefined') {
root = window;
} else if (typeof global !== 'undefined') {
root = global;
} else if (typeof module !== 'undefined') {
root = module;
} else {
root = Function('return this')();
}
var result = symbolObservablePonyfill(root);
/**
* These are private action types reserved by Redux.
* For any unknown actions, you must return the current state.
* If the current state is undefined, you must return the initial state.
* Do not reference these action types directly in your code.
*/
var ActionTypes = {
INIT: '@@redux/INIT' + Math.random().toString(36).substring(7).split('').join('.'),
REPLACE: '@@redux/REPLACE' + Math.random().toString(36).substring(7).split('').join('.')
};
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) {
return typeof obj;
} : function (obj) {
return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
};
/**
* @param {any} obj The object to inspect.
* @returns {boolean} True if the argument appears to be a plain object.
*/
function isPlainObject(obj) {
if ((typeof obj === 'undefined' ? 'undefined' : _typeof(obj)) !== 'object' || obj === null) return false;
var proto = obj;
while (Object.getPrototypeOf(proto) !== null) {
proto = Object.getPrototypeOf(proto);
}
return Object.getPrototypeOf(obj) === proto;
}
/**
* Creates a Redux store that holds the state tree.
* The only way to change the data in the store is to call `dispatch()` on it.
*
* There should only be a single store in your app. To specify how different
* parts of the state tree respond to actions, you may combine several reducers
* into a single reducer function by using `combineReducers`.
*
* @param {Function} reducer A function that returns the next state tree, given
* the current state tree and the action to handle.
*
* @param {any} [preloadedState] The initial state. You may optionally specify it
* to hydrate the state from the server in universal apps, or to restore a
* previously serialized user session.
* If you use `combineReducers` to produce the root reducer function, this must be
* an object with the same shape as `combineReducers` keys.
*
* @param {Function} [enhancer] The store enhancer. You may optionally specify it
* to enhance the store with third-party capabilities such as middleware,
* time travel, persistence, etc. The only store enhancer that ships with Redux
* is `applyMiddleware()`.
*
* @returns {Store} A Redux store that lets you read the state, dispatch actions
* and subscribe to changes.
*/
function createStore(reducer, preloadedState, enhancer) {
var _ref2;
if (typeof preloadedState === 'function' && typeof enhancer === 'undefined') {
enhancer = preloadedState;
preloadedState = undefined;
}
if (typeof enhancer !== 'undefined') {
if (typeof enhancer !== 'function') {
throw new Error('Expected the enhancer to be a function.');
}
return enhancer(createStore)(reducer, preloadedState);
}
if (typeof reducer !== 'function') {
throw new Error('Expected the reducer to be a function.');
}
var currentReducer = reducer;
var currentState = preloadedState;
var currentListeners = [];
var nextListeners = currentListeners;
var isDispatching = false;
function ensureCanMutateNextListeners() {
if (nextListeners === currentListeners) {
nextListeners = currentListeners.slice();
}
}
/**
* Reads the state tree managed by the store.
*
* @returns {any} The current state tree of your application.
*/
function getState() {
if (isDispatching) {
throw new Error('You may not call store.getState() while the reducer is executing. ' + 'The reducer has already received the state as an argument. ' + 'Pass it down from the top reducer instead of reading it from the store.');
}
return currentState;
}
/**
* Adds a change listener. It will be called any time an action is dispatched,
* and some part of the state tree may potentially have changed. You may then
* call `getState()` to read the current state tree inside the callback.
*
* You may call `dispatch()` from a change listener, with the following
* caveats:
*
* 1. The subscriptions are snapshotted just before every `dispatch()` call.
* If you subscribe or unsubscribe while the listeners are being invoked, this
* will not have any effect on the `dispatch()` that is currently in progress.
* However, the next `dispatch()` call, whether nested or not, will use a more
* recent snapshot of the subscription list.
*
* 2. The listener should not expect to see all state changes, as the state
* might have been updated multiple times during a nested `dispatch()` before
* the listener is called. It is, however, guaranteed that all subscribers
* registered before the `dispatch()` started will be called with the latest
* state by the time it exits.
*
* @param {Function} listener A callback to be invoked on every dispatch.
* @returns {Function} A function to remove this change listener.
*/
function subscribe(listener) {
if (typeof listener !== 'function') {
throw new Error('Expected the listener to be a function.');
}
if (isDispatching) {
throw new Error('You may not call store.subscribe() while the reducer is executing. ' + 'If you would like to be notified after the store has been updated, subscribe from a ' + 'component and invoke store.getState() in the callback to access the latest state. ' + 'See https://redux.js.org/api-reference/store#subscribe(listener) for more details.');
}
var isSubscribed = true;
ensureCanMutateNextListeners();
nextListeners.push(listener);
return function unsubscribe() {
if (!isSubscribed) {
return;
}
if (isDispatching) {
throw new Error('You may not unsubscribe from a store listener while the reducer is executing. ' + 'See https://redux.js.org/api-reference/store#subscribe(listener) for more details.');
}
isSubscribed = false;
ensureCanMutateNextListeners();
var index = nextListeners.indexOf(listener);
nextListeners.splice(index, 1);
};
}
/**
* Dispatches an action. It is the only way to trigger a state change.
*
* The `reducer` function, used to create the store, will be called with the
* current state tree and the given `action`. Its return value will
* be considered the **next** state of the tree, and the change listeners
* will be notified.
*
* The base implementation only supports plain object actions. If you want to
* dispatch a Promise, an Observable, a thunk, or something else, you need to
* wrap your store creating function into the corresponding middleware. For
* example, see the documentation for the `redux-thunk` package. Even the
* middleware will eventually dispatch plain object actions using this method.
*
* @param {Object} action A plain object representing “what changed”. It is
* a good idea to keep actions serializable so you can record and replay user
* sessions, or use the time travelling `redux-devtools`. An action must have
* a `type` property which may not be `undefined`. It is a good idea to use
* string constants for action types.
*
* @returns {Object} For convenience, the same action object you dispatched.
*
* Note that, if you use a custom middleware, it may wrap `dispatch()` to
* return something else (for example, a Promise you can await).
*/
function dispatch(action) {
if (!isPlainObject(action)) {
throw new Error('Actions must be plain objects. ' + 'Use custom middleware for async actions.');
}
if (typeof action.type === 'undefined') {
throw new Error('Actions may not have an undefined "type" property. ' + 'Have you misspelled a constant?');
}
if (isDispatching) {
throw new Error('Reducers may not dispatch actions.');
}
try {
isDispatching = true;
currentState = currentReducer(currentState, action);
} finally {
isDispatching = false;
}
var listeners = currentListeners = nextListeners;
for (var i = 0; i < listeners.length; i++) {
var listener = listeners[i];
listener();
}
return action;
}
/**
* Replaces the reducer currently used by the store to calculate the state.
*
* You might need this if your app implements code splitting and you want to
* load some of the reducers dynamically. You might also need this if you
* implement a hot reloading mechanism for Redux.
*
* @param {Function} nextReducer The reducer for the store to use instead.
* @returns {void}
*/
function replaceReducer(nextReducer) {
if (typeof nextReducer !== 'function') {
throw new Error('Expected the nextReducer to be a function.');
}
currentReducer = nextReducer;
dispatch({ type: ActionTypes.REPLACE });
}
/**
* Interoperability point for observable/reactive libraries.
* @returns {observable} A minimal observable of state changes.
* For more information, see the observable proposal:
* https://github.com/tc39/proposal-observable
*/
function observable() {
var _ref;
var outerSubscribe = subscribe;
return _ref = {
/**
* The minimal observable subscription method.
* @param {Object} observer Any object that can be used as an observer.
* The observer object should have a `next` method.
* @returns {subscription} An object with an `unsubscribe` method that can
* be used to unsubscribe the observable from the store, and prevent further
* emission of values from the observable.
*/
subscribe: function subscribe(observer) {
if ((typeof observer === 'undefined' ? 'undefined' : _typeof(observer)) !== 'object' || observer === null) {
throw new TypeError('Expected the observer to be an object.');
}
function observeState() {
if (observer.next) {
observer.next(getState());
}
}
observeState();
var unsubscribe = outerSubscribe(observeState);
return { unsubscribe: unsubscribe };
}
}, _ref[result] = function () {
return this;
}, _ref;
}
// When a store is created, an "INIT" action is dispatched so that every
// reducer returns their initial state. This effectively populates
// the initial state tree.
dispatch({ type: ActionTypes.INIT });
return _ref2 = {
dispatch: dispatch,
subscribe: subscribe,
getState: getState,
replaceReducer: replaceReducer
}, _ref2[result] = observable, _ref2;
}
/**
* Prints a warning in the console if it exists.
*
* @param {String} message The warning message.
* @returns {void}
*/
function warning(message) {
/* eslint-disable no-console */
if (typeof console !== 'undefined' && typeof console.error === 'function') {
console.error(message);
}
/* eslint-enable no-console */
try {
// This error was thrown as a convenience so that if you enable
// "break on all exceptions" in your console,
// it would pause the execution at this line.
throw new Error(message);
} catch (e) {} // eslint-disable-line no-empty
}
/*
* This is a dummy function to check if the function name has been altered by minification.
* If the function has been minified and NODE_ENV !== 'production', warn the user.
*/
function isCrushed() {}
if (undefined !== 'production' && typeof isCrushed.name === 'string' && isCrushed.name !== 'isCrushed') {
warning("You are currently using minified code outside of NODE_ENV === 'production'. " + 'This means that you are running a slower development build of Redux. ' + 'You can use loose-envify (https://github.com/zertosh/loose-envify) for browserify ' + 'or DefinePlugin for webpack (http://stackoverflow.com/questions/30030031) ' + 'to ensure you have the correct code for your production build.');
}
/**
* @class ModuleManager
* @category core
* @param {Object} object handler
* @description Solves modules dependencies
* @memberof module:core
*/
var ModuleManager =
/*#__PURE__*/
function () {
function ModuleManager(object) {
classCallCheck(this, ModuleManager);
this.handler = object;
this.currentModule = null;
this.store = createStore(function () {
var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [{}, ''];
var action = arguments.length > 1 ? arguments[1] : undefined;
state[0][action.key] = action.data;
state[1] = action.key;
return state;
});
this.modules = {};
}
/**
* @method active
* @instance
* @description Sets .currentModule to provided module.
* @param {Object} module the module to make current
* @memberof module:core.ModuleManager
*/
createClass(ModuleManager, [{
key: "active",
value: function active(module) {
this.currentModule = module;
}
/**
* @method reset
* @instance
* @description Set's .currentModule to null.
* @memberof module:core.ModuleManager
*/
}, {
key: "reset",
value: function reset() {
this.currentModule = null;
}
/**
* @method define
* @instance
* @description Define the module in manager
* @param name The module name
* @memberof module:core.ModuleManager
*/
}, {
key: "define",
value: function define(name) {
this.modules[name] = this.currentModule;
}
/**
* @method use
* @instance
* @description Get the defined module from manager
* @param name The module name
* @memberof module:core.ModuleManager
*/
}, {
key: "use",
value: function use(name) {
return this.modules[name];
}
/**
* @method set
* @instance
* @description An alias for .add() <br/><br/>
* Use this method if you know that you will overwrite existing dependency.<br/>
* Use it in your app, but not in module that you provide to other people.
* @param {String} key the key of the dependency
* @param {Object} data the value of the dependency
* @memberof module:core.ModuleManager
*/
}, {
key: "set",
value: function set(key, data) {
this.store.dispatch({
type: 'ADD',
key: key,
data: data
});
}
/**
* @method get
* @instance
* @description Returns dependency in store object, by key.
* @param {String} key the key of the dependency
* @memberof module:core.ModuleManager
* @return {Object|Module}
* @throws {DependencyError} if dependency is not in the store
* @example <caption>Get the 'hello' dependency</caption>
* manager.get('hello'); // -> {world: true}
*/
}, {
key: "get",
value: function get(key) {
if (!this.store.getState()[0][key]) {
throw new DependencyError('ModuleManager', "Module requires '".concat(key, "' dependency"), this.currentModule);
}
return this.store.getState()[0][key];
}
/**
* @method has
* @instance
* @description Returns whether manager has a dependency with the given key
* @param {String} key the key of the dependency
* @memberof module:core.ModuleManager
* @return {Boolean} Promise that is resolved when all promises completed.
* @example <caption>Check whether the store has the 'hello' dependency</caption>
* manager.has('hello'); // -> true
*/
}, {
key: "has",
value: function has(key) {
return Boolean(this.store.getState()[0][key]);
}
/**
* @method update
* @instance
* @description Updates deps
* @param {Object} [depsMap={}]
* @memberof module:core.ModuleManager
*/
}, {
key: "update",
value: function update() {
var _this = this;
var depsMap = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
this.store.subscribe(function () {
var _this$store$getState = _this.store.getState(),
_this$store$getState2 = slicedToArray(_this$store$getState, 2),
data = _this$store$getState2[0],
changedKey = _this$store$getState2[1];
var callback = depsMap[changedKey];
if (callback) callback(data[changedKey]);
});
}
/**
* @method add
* @alias module:core.ModuleManager#set
* @memberof module:core.ModuleManager
*/
}, {
key: "add",
value: function add() {
console.warn('.add() method is deprecated. Use .set() instead');
return this.set.apply(this, arguments);
}
/**
* @method require
* @instance
* @description Require module
* @param {String} name Defined name
* @param {Function} moduleExecutor Function that returns applied module
* @memberof module:core.ModuleManager
*/
}, {
key: "require",
value: function require(name, moduleExecutor) {
if (this.use(name) === undefined) this.handler.applyModule(moduleExecutor());
}
}]);
return ModuleManager;
}();
/**
* @class Component
* @category core
* @param {Object} [params] - The parameters object.
* @param {Object} [instructions] - The instructions object.
* @extends ModuleSystem
* @memberof module:core
*/
var Component =
/*#__PURE__*/
function (_ModuleSystem) {
/**
* Default values for parameters
* @member {Object} module:core.Component#defaults
* @static
* @default {
* modules: [],
* manager: true
* }
*/
/**
* Static instructions
* @member {Object} module:core.Component#instructions
* @static
* @default {}
*/
/**
* Array of promises that should be resolved before Component is ready.
* @member {Array} module:core.Component#_wait
* @private
*/
// Collection of promises;
/**
* Collection of `modules`.
* @member {Array} module:core.Component#modules
* @public
*/
// Collection of modules;
/**
* Collection of `child` Components.
* @member {Array} module:core.Component#children
* @public
*/
// For keeping children components;
function Component() {
var _this;
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var defaults = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Component.defaults;
var instructions = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : Component.instructions;
classCallCheck(this, Component);
_this = possibleConstructorReturn(this, getPrototypeOf$2(Component).call(this)); // Apply polyfilled parameters to .params;
defineProperty$3(defineProperty$3(defineProperty$3(assertThisInitialized(assertThisInitialized(_this)), "_wait", []), "modules", []), "children", []);
_this.params = extend(transformData(params, instructions), defaults);
if (_this.params.manager) _this.manager = new ModuleManager(assertThisInitialized(assertThisInitialized(_this)));
_this.modules = _this.params.modules;
_this.integrateModules();
return _this;
}
/**
* @method wait
* @instance
* @description Wait for a promise.
* @param {Promise} [promise] - The promise that should be added to a queue.
* @return {Promise} Promise that is resolved when all promises completed.
* @memberof module:core.Component
*/
createClass(Component, [{
key: "wait",
value: function wait(promise) {
if (promise) this._wait.push(promise);
return Promise.all(this._wait);
}
/**
* @method defer
* @instance
* @description Execute `func` (Callback) when Component is ready.
* @param {Function} func - Callback.
* @memberof module:core.Component
*/
}, {
key: "defer",
value: function defer(func) {
var _this2 = this;
if (this.isDeffered) this.wait().then(function () {
return func(_this2);
});else func(this);
} // PARAMETERS
/**
* @method updateParams
* @instance
* @description Updates parameters of the Component.
* @return {Object} Params of this Component
* @memberof module:core.Component
*/
}, {
key: "updateParams",
value: function updateParams() {
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
this.params = extend(params, this.params);
return this.params;
} // COPYING & CLONING
/**
* @method clone
* @instance
* @description Clone this component
* @return {object} a cloned component with all its source component' params copied.
* @memberof module:core.Component
*/
}, {
key: "clone",
value: function clone() {
return new this.constructor(this.params).copy(this);
}
/**
* @method copy
* @instance
* @description Copy source native and integrate `modules` to it.
* @param {Component} source - Source component that is used for `copy()` action.
* @param {Function} [customize] - Callback executed before modules integration process.
* @return {this} Component
* @memberof module:core.Component
*/
}, {
key: "copy",
value: function copy(source, customize) {
this.params = objectSpread({}, source.params);
if (source.native) this.native = source.native.clone(source.params);
if (customize) customize();
this.integrateModules(source);
return this;
}
/**
* @method add
* @instance
* @description Add a child `Component`.
* @param {Component} object - Component that should be added as a `child`.
* @return {Promise} Resolved when action is done.
* @memberof module:core.Component
*/
}, {
key: "add",
value: function () {
var _add = asyncToGenerator(
/*#__PURE__*/
regenerator.mark(function _callee(object) {
return regenerator.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
if (!object.parent) {
_context.next = 3;
break;
}
_context.next = 3;
return object.parent.remove(object);
case 3:
_context.next = 5;
return this.wait();
case 5:
_context.next = 7;
return object.wait();
case 7:
if (object.native) {
_context.next = 9;
break;
}
throw new CompositionError$1('Component', 'there is no object.native', this);
case 9:
object.parent = this;
_context.next = 12;
return this.applyBridge({
onAdd: object
}).onAdd;
case 12:
this.native.add(object.native);
this.children.push(object);
return _context.abrupt("return", object);
case 15:
case "end":
return _context.stop();
}
}
}, _callee, this);
}));
return function add(_x) {
return _add.apply(this, arguments);
};
}()
/**
* @method remove
* @instance
* @description Remove a child `Component`.
* @param {Component} object - Component that should be a **child** of this Component.
* @return {Promise} Resolved when action is done.
* @memberof module:core.Component
*/
}, {
key: "remove",
value: function () {
var _remove = asyncToGenerator(
/*#__PURE__*/
regenerator.mark(function _callee2(object) {
return regenerator.wrap(function _callee2$(_context2) {
while (1) {
switch (_context2.prev = _context2.next) {
case 0:
if (!(object.parent !== this)) {
_context2.next = 2;
break;
}
return _context2.abrupt("return");
case 2:
_context2.next = 4;
return this.wait();
case 4:
_context2.next = 6;
return object.wait();
case 6:
object.parent = null;
this.native.remove(object.native);
this.children.splice(this.children.indexOf(object), 1);
case 9:
case "end":
return _context2.stop();
}
}
}, _callee2, this);
}));
return function remove(_x2) {
return _remove.apply(this, arguments);
};
}()
/**
* @method addTo
* @instance
* @description Adds `this` Component to specified `App`/`Component`.
* @param {Component} object - Component that will be a parent of `this`.
* @memberof module:core.Component
*/
}, {
key: "addTo",
value: function addTo(object) {
return object.add(this);
}
}, {
key: "get",
value: function get(key) {
return this.manager.get(key);
}
}, {
key: "use",
value: function use(key) {
return this.manager.use(key);
}
/**
* Returns whether the object is `async` (`wait` promises are more than `0`).
* @member {Boolean} module:core.Component#isDeffered
*/
}, {
key: "isDeffered",
get: function get() {
return this._wait.length > 0;
}
/**
* Returns the `ModuleManager` used for this component.
* @member {ModuleManager} module:core.Component#manager
* @throws {ManagerError}
*/
}, {
key: "manager",
get: function get() {
if (this._manager) return this._manager;
throw new ManagerError('Component', "ModuleManager is not used in this component. 'manager' parameter should be set as 'true'", this);
},
set: function set(manager) {
this._manager = manager;
}
/**
* Returns the `native` object used for this component.
* @member {Object} module:core.Component#native
*/
}, {
key: "native",
get: function get() {
return this._native;
},
set: function set(mesh) {
this._native = mesh;
this._native.component = this;
return this._native;
}
}]);
inherits(Component, _ModuleSystem);
return Component;
}(ModuleSystem);
defineProperty$3(defineProperty$3(Component, "defaults", {
modules: null,
manager: true
}), "instructions", {});
// 26.1.6 Reflect.get(target, propertyKey [, receiver])
function get(target, propertyKey /* , receiver */) {
var receiver = arguments.length < 3 ? target : arguments[2];
var desc, proto;
if (_anObject(target) === receiver) return target[propertyKey];
if (desc = _objectGopd.f(target, propertyKey)) return _has(desc, 'value')
? desc.value
: desc.get !== undefined
? desc.get.call(receiver)
: undefined;
if (_isObject(proto = _objectGpo(target))) return get(proto, propertyKey, receiver);
}
_export(_export.S, 'Reflect', { get: get });
var get$1 = _core.Reflect.get;
var get$2 = get$1;
function _superPropBase(object, property) {
while (!Object.prototype.hasOwnProperty.call(object, property)) {
object = getPrototypeOf$2(object);
if (object === null) break;
}
return object;
}
var superPropBase = _superPropBase;
var get$3 = createCommonjsModule(function (module) {
function _get(target, property, receiver) {
if (typeof Reflect !== "undefined" && get$2) {
module.exports = _get = get$2;
} else {
module.exports = _get = function _get(target, property, receiver) {
var base = superPropBase(target, property);
if (!base) return;
var desc = getOwnPropertyDescriptor$1(base, property);
if (desc.get) {
return desc.get.call(receiver);
}
return desc.value;
};
}
return _get(target, property, receiver || target);
}
module.exports = _get;
});
function attributes() {
for (var _len = arguments.length, mappers = new Array(_len), _key = 0; _key < _len; _key++) {
mappers[_key] = arguments[_key];
}
return function (target) {
for (var i = 0; i < mappers.length; i++) {
var mapper = mappers[i];
for (var k = 0; k < mapper.map.length; k++) {
var attribute = mapper.map[k];
Object.defineProperty(target.prototype, attribute, {
get: mapper.getter(attribute),
set: mapper.setter(attribute),
configurable: mapper.configurable,
enumerable: mapper.enumerable
});
}
}
};
}
function copy() {
for (var _len2 = arguments.length, map = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
map[_key2] = arguments[_key2];
}
return {
map: map,
getter: function getter(name) {
return function () {
return this.native[name];
};
},
setter: function setter(name) {
return function (value) {
this.native[name].copy(value);
};
},
configurable: true,
enumerable: true
};
}
function mirror() {
for (var _len3 = arguments.length, map = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
map[_key3] = arguments[_key3];
}
return {
map: map,
getter: function getter(name) {
return function () {
return this.native[name];
};
},
setter: function setter(name) {
return function (value) {
this.native[name] = value;
};
},
configurable: true,
enumerable: true
};
}
var _dec, _class;
var
/**
* @class MeshComponent
* @category core
* @param {Object} [params] - The parameters object.
* @param {Object} [instructions] - The instructions object.
* @extends module:core.Component
* @memberof module:core
*/
MeshComponent = (_dec = attributes(copy('position', 'rotation', 'quaternion', 'scale'), mirror('material', 'geometry')), _dec(_class =
/*#__PURE__*/
function (_Component) {
createClass(MeshComponent, null, [{
key: "custom",
/**
* Default values for parameters
* @member {Object} module:core.MeshComponent#defaults
* @static
* @default
* {
* build: true,
* geometry: {},
* material: false,
*
* shadow: {
* cast: true,
* receive: true
* },
*
* position: {x: 0, y: 0, z: 0},
* rotation: {x: 0, y: 0, z: 0},
* scale: {x: 1, y: 1, z: 1}
* }
*/
/**
* Static instructions
* @member {Object} module:core.MeshComponent#instructions
* @static
* @default
* {
* position: ['x', 'y', 'z'],
* rotation: ['x', 'y', 'z'],
* scale: ['x', 'y', 'z']
* }
*/
// CUSTOM GEOMETRY HANDLING
value: function custom(geom) {
var constructor = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Mesh;
return (
/*#__PURE__*/
function (_MeshComponent) {
function _class2() {
classCallCheck(this, _class2);
return possibleConstructorReturn(this, getPrototypeOf$2(_class2).apply(this, arguments));
}
createClass(_class2, [{
key: "build",
value: function build() {
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.params;
var _this$applyBridge = this.applyBridge({
geometry: geom,
material: params.material
}),
geometry = _this$applyBridge.geometry,
material = _this$applyBridge.material;
return this.applyBridge({
mesh: new constructor(geometry, material)
}).mesh;
}
}]);
inherits(_class2, _MeshComponent);
return _class2;
}(MeshComponent)
);
}
}, {
key: "create",
value: function create(geom, params, constructor) {
return new (MeshComponent.custom(geom, constructor))(params);
}
}, {
key: "from",
value: function from(mesh) {
var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
params.build = false;
var component = new MeshComponent(params);
component.native = mesh;
component.wrap();
return component;
}
}]);
function MeshComponent(params) {
var _this;
var defaults = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : MeshComponent.defaults;
var instructions = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : MeshComponent.instructions;
classCallCheck(this, MeshComponent);
_this = possibleConstructorReturn(this, getPrototypeOf$2(MeshComponent).call(this, params, defaults, instructions));
if (_this.params.build) {
var build = _this.build(_this.params);
if (!build) {
throw new CompositionError$1('MeshComponent', '.build() method should return a THREE.Object3D or a Promise resolved with THREE.Object3D.', assertThisInitialized(assertThisInitialized(_this)));
}
if (build instanceof Promise) {
_this.wait(build);
_this.wait(new Promise(function (resolve) {
build.then(function (native) {
_this.native = native;
_this.wrap().then(resolve);
});
}));
} else {
_this.native = build;
_this.wait(_this.wrap());
}
}
_this.applyCommand('postIntegrate');
return _this;
} // BUILDING & WRAPPING
/**
* @method build
* @description Build livecycle should return a native object.
* @throws {CompositionError}
* @memberof module:core.MeshComponent
*/
createClass(MeshComponent, [{
key: "build",
value: function build() {
throw new CompositionError$1('MeshComponent', 'Instance should have it\'s own .build().', this);
}
/**
* @method wrap
* @instance
* @description Wraps transforms (`position` & `rotation`)
* @return {Promise} Resolved when action is completed
* @memberof module:core.MeshComponent
*/
}, {
key: "wrap",
value: function wrap() {
var _this2 = this;
return new Promise(function (resolve) {
// TODO: Fix defer with physics
// this.defer(() => {
var _this2$params = _this2.params,
position = _this2$params.position,
rotation = _this2$params.rotation,
scale = _this2$params.scale,
shadow = _this2$params.shadow;
_this2.position.set(position.x, position.y, position.z);
_this2.rotation.set(rotation.x, rotation.y, rotation.z);
_this2.scale.set(scale.x, scale.y, scale.z);
_this2.native.castShadow = shadow.cast;
_this2.native.receiveShadow = shadow.receive;
_this2.applyBridge({
onWrap: 1
});
resolve(_this2); // });
});
} // COPYING & CLONING
/**
* @method copy
* @instance
* @description Copy source transforms & execute `Component.copy()`
* @return {this} MeshComponent
* @memberof module:core.MeshComponent
*/
}, {
key: "copy",
value: function copy$$1(source) {
var _this3 = this;
return get$3(getPrototypeOf$2(MeshComponent.prototype), "copy", this).call(this, source, function () {
_this3.position.copy(source.position);
_this3.rotation.copy(source.rotation);
_this3.quaternion.copy(source.quaternion);
});
}
/**
* @method clone
* @instance
* @description Make a clone of this MeshComponent using `.copy()`
* @return {MeshComponent} clone of this object
* @memberof module:core.MeshComponent
*/
}, {
key: "clone",
value: function clone(geometry, material) {
var dest = new this.constructor({
build: false
}).copy(this);
if (geometry) dest.geometry = dest.geometry.clone();
if (material) dest.material = dest.material.clone();
return dest;
}
}]);
inherits(MeshComponent, _Component);
return MeshComponent;
}(Component)) || _class);
defineProperty$3(defineProperty$3(MeshComponent, "defaults", objectSpread({}, Component.defaults, {
build: true,
geometry: {},
material: false,
shadow: {
cast: true,
receive: true
},
position: {
x: 0,
y: 0,
z: 0
},
rotation: {
x: 0,
y: 0,
z: 0
},
scale: {
x: 1,
y: 1,
z: 1
}
})), "instructions", {
position: ['x', 'y', 'z'],
rotation: ['x', 'y', 'z'],
scale: ['x', 'y', 'z']
});
var _dec$1, _class$1;
var
/**
* @class LightComponent
* @category core
* @param {Object} [params] - The parameters object.
* @param {Object} [instructions] - The instructions object.
* @extends module:core.Component
* @memberof module:core
*/
LightComponent = (_dec$1 = attributes(copy('position', 'rotation', 'quaternion', 'target')), _dec$1(_class$1 =
/*#__PURE__*/
function (_Component) {
createClass(LightComponent, null, [{
key: "from",
/**
* Default values for parameters
* @member {Object} module:core.LightComponent#defaults
* @static
* @default
* {
* build: true,
*
* shadow: {
* cast: true,
*
* bias: 0,
* radius: 1,
*
* mapSize: {
* width: 1024,
* height: 1024
* },
*
* camera: {
* near: true,
* far: 400,
* fov: 90,
*
* top: 200,
* bottom: -200,
* left: -200,
* right: 200
* }
* },
*
* position: {x: 0, y: 0, z: 0},
* rotation: {x: 0, y: 0, z: 0}
* }
*/
/**
* Static instructions
* @member {Object} module:core.LightComponent#instructions
* @static
* @default
* {
* position: ['x', 'y', 'z'],
* rotation: ['x', 'y', 'z']
* }
*/
value: function from(light) {
var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var wrapShadow = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
params.build = false;
var component = new LightComponent(params);
component.native = light;
component.wrap();
if (wrapShadow) component.wrapShadow();
return component;
}
}]);
function LightComponent(params) {
var _this;
var defaults = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : LightComponent.defaults;
var instructions = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : LightComponent.instructions;
classCallCheck(this, LightComponent);
_this = possibleConstructorReturn(this, getPrototypeOf$2(LightComponent).call(this, params, defaults, instructions));
if (_this.params.build) {
var build = _this.build(_this.params);
if (!build) {
throw new CompositionError$1('LightComponent', '.build() method should return a THREE.Object3D or a Promise resolved with THREE.Object3D.', assertThisInitialized(assertThisInitialized(_this)));
}
if (build instanceof Promise) {
build.then(function (native) {
_this.native = native;
});
} else _this.native = build;
_this.wait(_this.wrap());
}
_this.applyCommand('postIntegrate');
return _this;
} // BUILDING & WRAPPING
/**
* @method build
* @instance
* @description Build livecycle should return a native object.
* @throws {CompositionError}
* @memberof module:core.LightComponent
*/
createClass(LightComponent, [{
key: "build",
value: function build() {
throw new CompositionError$1('MeshComponent', 'Instance should have it\'s own .build().', this);
}
/**
* @method wrap
* @instance
* @description Wraps transforms (`position` & `rotation`)
* @return {Promise} Resolved when action is completed
* @memberof module:core.LightComponent
*/
}, {
key: "wrap",
value: function wrap() {
var _this2 = this;
return new Promise(function (resolve) {
_this2.defer(function () {
var _this2$params = _this2.params,
position = _this2$params.position,
rotation = _this2$params.rotation;
_this2.position.set(position.x, position.y, position.z);
_this2.rotation.set(rotation.x, rotation.y, rotation.z);
_this2.applyBridge({
onWrap: 1
});
resolve(_this2);
});
});
}
/**
* @method wrapShadow
* @instance
* @description Wraps shadow properties
* @memberof module:core.LightComponent
*/
}, {
key: "wrapShadow",
value: function wrapShadow() {
var native = this.native,
shadow = this.params.shadow;
native.castShadow = shadow.cast;
native.shadow.mapSize.width = shadow.mapSize.width;
native.shadow.mapSize.height = shadow.mapSize.height;
native.shadow.bias = shadow.bias;
native.shadow.radius = shadow.radius;
var shadowCamera = native.shadow.camera;
var camera = shadow.camera;
shadowCamera.near = camera.near;
shadowCamera.far = camera.far;
shadowCamera.fov = camera.fov;
shadowCamera.left = camera.left;
shadowCamera.right = camera.right;
shadowCamera.top = camera.top;
shadowCamera.bottom = camera.bottom;
} // COPYING & CLONING
/**
* @method copy
* @instance
* @description Copy source transforms & execute `Component.copy()`
* @return {this} LightComponent
* @memberof module:core.LightComponent
*/
}, {
key: "copy",
value: function copy$$1(source) {
var _this3 = this;
return get$3(getPrototypeOf$2(LightComponent.prototype), "copy", this).call(this, source, function () {
if (_this3.target) _this3.target.copy(source.target());
_this3.position.copy(source.position);
_this3.rotation.copy(source.rotation);
_this3.quaternion.copy(source.quaternion);
});
}
/**
* @method clone
* @instance
* @description Make a clone of this LightComponent using `.copy()`
* @return {LightComponent} clone of this object
* @memberof module:core.LightComponent
*/
}, {
key: "clone",
value: function clone() {
return new this.constructor({
build: false
}).copy(this);
}
}]);
inherits(LightComponent, _Component);
return LightComponent;
}(Component)) || _class$1);
defineProperty$3(defineProperty$3(LightComponent, "defaults", objectSpread({}, Component.defaults, {
build: true,
shadow: {
cast: true,
bias: 0,
radius: 1,
mapSize: {
width: 1024,
height: 1024
},
camera: {
near: true,
far: 400,
fov: 90,
top: 200,
bottom: -200,
left: -200,
right: 200
}
},
position: {
x: 0,
y: 0,
z: 0
},
rotation: {
x: 0,
y: 0,
z: 0
}
})), "instructions", {
position: ['x', 'y', 'z'],
rotation: ['x', 'y', 'z']
});
var _dec$2, _class$2;
var
/**
* @class CameraComponent
* @category core
* @param {Object} [params] - The parameters object.
* @param {Object} [instructions] - The instructions object.
* @extends module:core.Component
* @memberof module:core
*/
CameraComponent = (_dec$2 = attributes(copy('position', 'rotation', 'quaternion', 'target')), _dec$2(_class$2 =
/*#__PURE__*/
function (_Component) {
createClass(CameraComponent, null, [{
key: "from",
/**
* Default values for parameters
* @member {Object} module:core.CameraComponent#defaults
* @static
* @default
* {
* build: true,
*
* position: {x: 0, y: 0, z: 0},
* rotation: {x: 0, y: 0, z: 0}
* }
*/
/**
* Static instructions
* @member {Object} module:core.CameraComponent#instructions
* @static
* @default
* {
* position: ['x', 'y', 'z'],
* rotation: ['x', 'y', 'z'],
* scale: ['x', 'y', 'z']
* }
*/
value: function from(camera) {
var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
params.build = false;
var component = new CameraComponent(params);
component.native = camera;
component.wrap();
return component;
}
}]);
function CameraComponent(params) {
var _this;
var defaults = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : CameraComponent.defaults;
var instructions = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : CameraComponent.instructions;
classCallCheck(this, CameraComponent);
_this = possibleConstructorReturn(this, getPrototypeOf$2(CameraComponent).call(this, params, defaults, instructions));
if (_this.params.build) {
var build = _this.build(_this.params);
if (!build) {
throw new CompositionError$1('CameraComponent', '.build() method should return a THREE.Object3D or a Promise resolved with THREE.Object3D.', assertThisInitialized(assertThisInitialized(_this)));
}
if (build instanceof Promise) {
build.then(function (native) {
_this.native = native;
});
} else _this.native = build;
_this.wait(_this.wrap());
}
_this.applyCommand('postIntegrate');
return _this;
} // BUILDING & WRAPPING
/**
* @method build
* @instance
* @description Build livecycle should return a native object.
* @throws {CompositionError}
* @memberof module:core.CameraComponent
*/
createClass(CameraComponent, [{
key: "build",
value: function build() {
throw new CompositionError$1('CameraComponent', 'Instance should have it\'s own .build().', this);
}
/**
* @method wrap
* @instance
* @description Wraps transforms (`position` & `rotation`)
* @return {Promise} Resolved when action is completed
* @memberof module:core.CameraComponent
*/
}, {
key: "wrap",
value: function wrap() {
var _this2 = this;
return new Promise(function (resolve) {
_this2.defer(function () {
_this2.position.set(_this2.params.position.x, _this2.params.position.y, _this2.params.position.z);
_this2.rotation.set(_this2.params.rotation.x, _this2.params.rotation.y, _this2.params.rotation.z);
_this2.applyBridge({
onWrap: 1
});
resolve(_this2);
});
});
}
/**
* @method copy
* @instance
* @description Copy source transforms & execute `Component.copy()`
* @return {this} CameraComponent
* @memberof module:core.CameraComponent
*/
}, {
key: "copy",
value: function copy$$1(source) {
var _this3 = this;
return get$3(getPrototypeOf$2(CameraComponent.prototype), "copy", this).call(this, source, function () {
if (_this3.target) _this3.target.copy(source.target());
_this3.position.copy(source.position);
_this3.rotation.copy(source.rotation);
_this3.quaternion.copy(source.quaternion);
});
}
/**
* @method clone
* @instance
* @description Make a clone of this CameraComponent using `.copy()`
* @return {CameraComponent} clone of this object
* @memberof module:core.CameraComponent
*/
}, {
key: "clone",
value: function clone() {
return new this.constructor({
build: false
}).copy(this);
}
}]);
inherits(CameraComponent, _Component);
return CameraComponent;
}(Component)) || _class$2);
defineProperty$3(defineProperty$3(CameraComponent, "defaults", objectSpread({}, Component.defaults, {
build: true,
position: {
x: 0,
y: 0,
z: 0
},
rotation: {
x: 0,
y: 0,
z: 0
}
})), "instructions", {
position: ['x', 'y', 'z'],
rotation: ['x', 'y', 'z'],
scale: ['x', 'y', 'z']
});
const version = "2.2.0-beta.2";
var system = {
window: typeof window === 'undefined' ? global : window
};
/**
* @class App
* @category core
* @description This component is used to prepare a world scene, setup physics, camera, renderer and all other things that you usually do before making meshes.
* @param {Array} [modules=[]] - Array of Modules
* @extends ModuleSystem
* @memberof module:core
*/
var App =
/*#__PURE__*/
function (_ModuleSystem) {
/**
* @description Defines whether the scene should render or not
* @member {Boolean} module:core.App#enabled
* @public
*/
/**
* Loops in this app
* @description Array of loops that are executed by this app.
* @member {Array} module:core.App#loops
* @public
*/
function App() {
var _this;
var modules = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
classCallCheck(this, App);
console.log("WHS.App ".concat(version));
_this = possibleConstructorReturn(this, getPrototypeOf$2(App).call(this));
defineProperty$3(defineProperty$3(assertThisInitialized(assertThisInitialized(_this)), "enabled", true), "loops", []);
_this.manager = new ModuleManager(assertThisInitialized(assertThisInitialized(_this)));
_this.modules = modules;
_this.integrateModules();
return _this;
} // CONTROLS & UPDATING
/**
* @method start
* @description Start rendering loop and physics simulation (if you use version with physics).
* @memberof module:core.App
*/
createClass(App, [{
key: "start",
value: function start() {
var _this2 = this;
var requestAnimFrame = function () {
return system.window.requestAnimationFrame || system.window.webkitRequestAnimationFrame || system.window.mozRequestAnimationFrame || function (callback) {
system.window.setTimeout(callback, 1000 / 60);
};
}();
var process = function process() {
_this2.request = requestAnimFrame(function () {
return process();
});
if (!_this2.enabled) return;
for (var i = 0, ll = _this2.loops.length; i < ll; i++) {
var e = _this2.loops[i];
if (e.enabled) e.execute(e.clock);
}
};
this.enabled = true;
if (!this.request) process();
}
/**
* @method stop
* @description Stops rendering loops
* @memberof module:core.App
*/
}, {
key: "stop",
value: function stop() {
this.enabled = false;
}
/**
* @method addLoop
* @description Adds loop to this app.
* @param {Object} loop - the loop to add
* @return {Promise} Promise that is resolved when promises completed.
* @memberof module:core.App
* @example <caption>Adding a loop to an app</caption>
* const loop = new Loop(() => {
* // ...
* });
*
* const app = new App();
*
* app.addLoop(loop);
* loop.start();
*/
}, {
key: "addLoop",
value: function addLoop(loop) {
var _this3 = this;
return new Promise(function (resolve) {
_this3.loops.push(loop);
resolve(loop);
});
}
/**
* @method removeLoop
* @description Removes loop from this app.
* @param {Object} loop - the loop to remove
* @return {Promise} Promise that is resolved when promises completed.
* @memberof module:core.App
*/
}, {
key: "removeLoop",
value: function removeLoop(loop) {
var _this4 = this;
return new Promise(function (resolve) {
var index = _this4.loops.indexOf(loop);
if (index !== -1) _this4.loops.splice(index, 1);
resolve(loop);
});
}
}, {
key: "get",
value: function get(key) {
return this.manager.get(key);
}
}, {
key: "use",
value: function use(key) {
return this.manager.use(key);
}
}]);
inherits(App, _ModuleSystem);
return App;
}(ModuleSystem);
/**
* @class Loop
* @category core
* @param {Function} func function to execute on each animation frame
* @param {Boolean} [useClock=true] passes a Clock to the function when called, if true
* @memberof module:core
*/
var Loop =
/*#__PURE__*/
function () {
function Loop(func) {
var useClock = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
classCallCheck(this, Loop);
this.func = func;
this.clock = useClock ? new Clock() : null;
this.enabled = false;
} // CONTROLS
/**
* @method start
* @instance
* @description Starts this loop, clock if it has one. Won't do anything if loop enabled already.
* @param {Component} [world] app to add this loop to, if provided.
* @memberof module:core.Loop
*/
createClass(Loop, [{
key: "start",
value: function start(world) {
if (this.enabled) return;
if (world) world.addLoop(this);
if (this.clock) this.clock.start();
this.enabled = true;
}
/**
* @method stop
* @instance
* @description Stops this loop and its clock if it has one, won't do anything if this loop is not enabled)
* @param {Component} [world] app to remove this loop from, if provided.
* @memberof module:core.Loop
*/
}, {
key: "stop",
value: function stop(world) {
if (!this.enabled) return;
if (this.clock) this.clock.stop();
this.enabled = false;
if (world) world.removeLoop(this);
} // EXECUTION
/**
* @method execute
* @instance
* @description Executes the function of this loop
* @memberof module:core.Loop
* @returns {*} whatever the function of this loop returns
*/
}, {
key: "execute",
value: function execute() {
return this.func(this.clock);
}
}]);
return Loop;
}();
/** @module core */
/**
* @class AmbientLight
* @category components/lights
* @description AmbientLight is a simple class, it extends Light and inherits all its methods.
* AmbientLight creates basic light around all scene, so it doesn't need properties like pos or target.
* It supports only color and intensity as parameters, which defines the color of the surrounded light and intensity of light.
* @param {Object} [params={light: {color: 0xffffff, intensity: 1}}] - The params.
* @extends module:core.LightComponent
* @memberof module:components/lights
* @example <caption>Creating an AmbientLight </caption>
* new AmbientLight({
* color: 0xffffff,
* intensity: 0.2
* }).addTo(world);
*/
var AmbientLight$1 =
/*#__PURE__*/
function (_LightComponent) {
function AmbientLight$$1() {
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
classCallCheck(this, AmbientLight$$1);
return possibleConstructorReturn(this, getPrototypeOf$2(AmbientLight$$1).call(this, params, AmbientLight$$1.defaults));
}
createClass(AmbientLight$$1, [{
key: "build",
value: function build() {
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
return this.applyBridge({
light: new AmbientLight(params.color, params.intensity)
}).light;
}
}]);
inherits(AmbientLight$$1, _LightComponent);
return AmbientLight$$1;
}(LightComponent);
defineProperty$3(AmbientLight$1, "defaults", objectSpread({}, LightComponent.defaults, {
color: 0xffffff,
intensity: 1
}));
/**
* @class DirectionalLight
* @category components/lights
* @description DirectinalLight creates a light that shines from a specific direction not from a specific position.<br/><br/>
* This light will behave as though it is infinitely far away and the rays produced from it are all parallel. <br/><br/>
* The best analogy would be a light source that acts like the sun: the sun is so far away that all sunlight hitting objects comes from the same angle.<br/><br/>
* It has the same options as AmbientLight in light paramater, but it also supports pos and target paramaters.
* @param {Object} [params={light: {color: 0xffffff, intensity: 1}}] - The params.
* @extends module:core.LightComponent
* @memberof module:components/lights
* @example <caption>Creating a DirectionalLight to fall down from vec3(10, 20, 10) to vec3(0, 0, 0)</caption>
* new DirectionalLight({
* color: 0xffffff,
* intensity: 0.2,
*
* position: [10, 20, 10]
* }).addTo(app);
*/
var DirectionalLight$1 =
/*#__PURE__*/
function (_LightComponent) {
function DirectionalLight$$1() {
var _this;
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
classCallCheck(this, DirectionalLight$$1);
_this = possibleConstructorReturn(this, getPrototypeOf$2(DirectionalLight$$1).call(this, params, DirectionalLight$$1.defaults));
_this.wrapShadow();
return _this;
}
createClass(DirectionalLight$$1, [{
key: "build",
value: function build() {
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
return this.applyBridge({
light: new DirectionalLight(params.color, params.intensity)
}).light;
}
}]);
inherits(DirectionalLight$$1, _LightComponent);
return DirectionalLight$$1;
}(LightComponent);
defineProperty$3(DirectionalLight$1, "defaults", objectSpread({}, LightComponent.defaults, {
color: 0xffffff,
intensity: 1
}));
/**
* @class HemisphereLight
* @category components/lights
* @description HemisphereLight is a light source positioned directly above the scene.<br/>
* It also doesn't need position and target properties.
* @classDesc
* <iframe src="https://threejs.org/examples/webgl_lights_hemisphere.html"></iframe>
* @param {Object} [params={light: {skyColor: 0xffffff, groundColor: 0xffffff, intensity: 1}}] - The params.
* @extends module:core.LightComponent
* @memberof module:components/lights
* @example <caption>Creating a HemisphereLight</caption>
* new HemisphereLight({
* skyColor: 0xff0000,
* groundColor: 0x0000ff,
* intensity: 0.2
* }).addTo(app);
*/
var HemisphereLight$1 =
/*#__PURE__*/
function (_LightComponent) {
function HemisphereLight$$1() {
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
classCallCheck(this, HemisphereLight$$1);
return possibleConstructorReturn(this, getPrototypeOf$2(HemisphereLight$$1).call(this, params, HemisphereLight$$1.defaults));
}
createClass(HemisphereLight$$1, [{
key: "build",
value: function build() {
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
return this.applyBridge({
light: new HemisphereLight(params.skyColor, params.groundColor, params.intensity)
}).light;
}
}]);
inherits(HemisphereLight$$1, _LightComponent);
return HemisphereLight$$1;
}(LightComponent);
defineProperty$3(HemisphereLight$1, "defaults", objectSpread({}, LightComponent.defaults, {
skyColor: 0xffffff,
groundColor: 0xffffff,
intensity: 1
}));
/**
* @class PointLight
* @category components/lights
* @description PointLight creates a light at a specific position in the scene. The light shines in all directions (roughly similar to a light bulb.)<br/><br/>
* It has the same options as AmbientLight in light paramater, but it also supports position, distance and decay.<br/>
* @param {Object} [params={light: {color: 0xffffff, intensity: 1, distance: 100, decay: 1}}] - The params.
* @extends LightComponent
* @memberof module:components/lights
* @example <caption>Creating a PointLight</caption>
* new PointLight( {
* color: 0xff0000,
* intensity: 2,
* distance: 300
*
* position: [10, 20, 10]
* }).addTo(app);
*/
var PointLight$1 =
/*#__PURE__*/
function (_LightComponent) {
function PointLight$$1() {
var _this;
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
classCallCheck(this, PointLight$$1);
_this = possibleConstructorReturn(this, getPrototypeOf$2(PointLight$$1).call(this, params, PointLight$$1.defaults));
_this.wrapShadow();
return _this;
}
createClass(PointLight$$1, [{
key: "build",
value: function build() {
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
return this.applyBridge({
light: new PointLight(params.color, params.intensity, params.distance, params.decay)
}).light;
}
}]);
inherits(PointLight$$1, _LightComponent);
return PointLight$$1;
}(LightComponent);
defineProperty$3(PointLight$1, "defaults", objectSpread({}, LightComponent.defaults, {
color: 0xffffff,
intensity: 1,
distance: 100,
decay: 1
}));
/**
* @class SpotLight
* @category components/lights
* @description SpotLight creates spot light that can cast shadow in one direction. <br/><br/>
* It has the same parameters as AmbientLight in light, but it also supports pos and target. <br/><br/>
* SpotLight affects meshes with lambert and phong material.
* @classDesc
* <iframe src="https://threejs.org/examples/webgl_lights_spotlight.html"></iframe>
* @param {Object} [params={light: {color: 0xffffff, intensity: 1, distance: 100, angle: Math.PI / 3, exponent: 0, decay: 1}}] - The params.
* @extends module:core.LightComponent
* @memberof module:components/lights
* @example <caption>Creating a SpotLight that falls down from vec3(10, 20, 10) to vec3(0, 0, 0)</caption>
* new SpotLight({
* color: 0x00ff00,
* intensity: 3,
* distance: 1000
*
* position: [10, 20, 10]
* }).addTo(app);
*/
var SpotLight$1 =
/*#__PURE__*/
function (_LightComponent) {
function SpotLight$$1() {
var _this;
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
classCallCheck(this, SpotLight$$1);
_this = possibleConstructorReturn(this, getPrototypeOf$2(SpotLight$$1).call(this, params, SpotLight$$1.defaults));
_this.wrapShadow();
return _this;
}
createClass(SpotLight$$1, [{
key: "build",
value: function build() {
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
return this.applyBridge({
light: new SpotLight(params.color, params.intensity, params.distance, params.angle, params.exponent, params.decay)
}).light;
}
}]);
inherits(SpotLight$$1, _LightComponent);
return SpotLight$$1;
}(LightComponent);
defineProperty$3(SpotLight$1, "defaults", objectSpread({}, LightComponent.defaults, {
color: 0xffffff,
intensity: 1,
distance: 100,
angle: Math.PI / 3,
exponent: 0,
decay: 1
}));
var AreaLight =
/*#__PURE__*/
function (_LightComponent) {
function AreaLight() {
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
classCallCheck(this, AreaLight);
return possibleConstructorReturn(this, getPrototypeOf$2(AreaLight).call(this, params, AreaLight.defaults));
}
createClass(AreaLight, [{
key: "build",
value: function build() {
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
return this.applyBridge({
light: new RectAreaLight(params.color, params.intensity, params.width, params.height)
}).light;
}
}]);
inherits(AreaLight, _LightComponent);
return AreaLight;
}(LightComponent);
defineProperty$3(AreaLight, "defaults", objectSpread({}, LightComponent.defaults, {
color: 0xffffff,
intensity: 1,
width: 10,
height: 10
}));
/** @module components/lights */
/**
* @class CubeCamera
* @category components/cameras
* @description Creates 6 cameras that render to a WebGLRenderTargetCube
* @param {Object} [params] - The parameters object.
* @memberof module:components/cameras
* @extends module:core.CameraComponent
* @example <caption>Creates a CubeCamera and set it as app's camera</caption>
* const camera = new CubeCamera({
* camera: {
* cubeResolution: 256
* },
*
* position: {
* x: 0,
* y: 100,
* z: 0
* }
* });
*
* app.camera = camera;
*/
var CubeCamera$1 =
/*#__PURE__*/
function (_CameraComponent) {
/**
* Default values for parameters
* @member {Object} module:components/cameras.CubeCamera#defaults
* @static
* @default <pre>
* {
* camera: {
* near: 1,
* far: 1000,
* cubeResolution: 128
* }
* }</pre>
*/
function CubeCamera$$1() {
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
classCallCheck(this, CubeCamera$$1);
return possibleConstructorReturn(this, getPrototypeOf$2(CubeCamera$$1).call(this, params, CubeCamera$$1.defaults));
}
createClass(CubeCamera$$1, [{
key: "build",
value: function build() {
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
return this.applyBridge({
camera: new CubeCamera(params.near, params.far, params.cubeResolution)
}).camera;
}
}]);
inherits(CubeCamera$$1, _CameraComponent);
return CubeCamera$$1;
}(CameraComponent);
defineProperty$3(CubeCamera$1, "defaults", objectSpread({}, CameraComponent.defaults, {
near: 1,
far: 1000,
cubeResolution: 128
}));
/**
* @class OrthographicCamera
* @category components/cameras
* @description Camera with orthographic projection.
* @param {Object} [params] - The parameters object.
* @memberof module:components/cameras
* @extends module:core.CameraComponent
* @example <caption>Create an OrthographicCamera and set it as app's camera</caption>
* const camera = new OrthographicCamera({
* camera: {
* far: 10000
* },
*
* position: {
* y: 50
* }
* });
*
* app.camera = camera;
*/
var OrthographicCamera$1 =
/*#__PURE__*/
function (_CameraComponent) {
/**
* Default values for parameters
* @member {Object} module:components/cameras.OrthographicCamera#defaults
* @static
* @default <pre>
* {
* near: 1,
* far: 1000,
* left: system.window.innerWidth / -2,
* right: system.window.innerWidth / 2,
* top: system.window.innerHeight / 2,
* bottom: system.window.innerHeight / -2
* }</pre>
*/
function OrthographicCamera$$1() {
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
classCallCheck(this, OrthographicCamera$$1);
return possibleConstructorReturn(this, getPrototypeOf$2(OrthographicCamera$$1).call(this, params, OrthographicCamera$$1.defaults));
}
createClass(OrthographicCamera$$1, [{
key: "build",
value: function build() {
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
return this.applyBridge({
camera: new OrthographicCamera(params.left, params.right, params.top, params.bottom, params.near, params.far)
}).camera;
}
}]);
inherits(OrthographicCamera$$1, _CameraComponent);
return OrthographicCamera$$1;
}(CameraComponent);
defineProperty$3(OrthographicCamera$1, "defaults", objectSpread({}, CameraComponent.defaults, {
near: 1,
far: 1000,
left: system.window.innerWidth / -2,
right: system.window.innerWidth / 2,
top: system.window.innerHeight / 2,
bottom: system.window.innerHeight / -2
}));
/**
* @class PerspectiveCamera
* @description Camera with perspective projection.
* @category components/cameras
* @param {Object} [params] - The parameters object.
* @memberof module:components/cameras
* @extends module:core.CameraComponent
* @example <caption>Create an PerspectiveCamera and set it as app's camera</caption>
* const camera = new PerspectiveCamera({
* fov: 75,
* aspect: window.innerWidth / window.innerHeight,
*
* position: {
* x: 0,
* y: 100,
* z: 0
* }
* });
*
* app.camera = camera;
*/
var PerspectiveCamera$1 =
/*#__PURE__*/
function (_CameraComponent) {
/**
* Default values for parameters
* @member {Object} module:components/cameras.PerspectiveCamera#defaults
* @static
* @default <pre>
* {
* near: 1,
* far: 1000,
* fov: 75,
* aspect: system.window.innerWidth / system.window.innerHeight
* }</pre>
*/
function PerspectiveCamera$$1() {
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
classCallCheck(this, PerspectiveCamera$$1);
return possibleConstructorReturn(this, getPrototypeOf$2(PerspectiveCamera$$1).call(this, params, PerspectiveCamera$$1.defaults));
}
createClass(PerspectiveCamera$$1, [{
key: "build",
value: function build() {
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
return this.applyBridge({
camera: new PerspectiveCamera(params.fov, params.aspect, params.near, params.far)
}).camera;
}
}]);
inherits(PerspectiveCamera$$1, _CameraComponent);
return PerspectiveCamera$$1;
}(CameraComponent);
defineProperty$3(PerspectiveCamera$1, "defaults", objectSpread({}, CameraComponent.defaults, {
near: 1,
far: 1000,
fov: 75,
aspect: system.window.innerWidth / system.window.innerHeight
}));
/** @module components/cameras */
/**
* @class Box
* @category components/meshes
* @description As told on Component definition, while you can pass any of the inherited params for this component construction, you will need to
* pass specific parameters to build this mesh as a geometry object.
* @classDesc
* <iframe src="https://threejs.org/docs/scenes/geometry-browser.html#BoxGeometry"></iframe>
* @param {Object} [params] - The params.
* @extends module:core.MeshComponent
* @memberof module:components/meshes
* @example <caption>Creating a Box, and adding to app</caption>
* new Box({
* geometry: {
* width: 2,
* height: 2,
* depth: 2
* },
*
* material: new THREE.MeshBasicMaterial({
* color: 0xffffff
* }),
*
* position: [50, 60, 70]
* }).addTo(app);
*/
var Box =
/*#__PURE__*/
function (_MeshComponent) {
/**
* Default values for parameters
* @member {Object} module:components/meshes.Box#defaults
* @static
* @default <pre>
* {
* geometry: {
* width: 1,
* height: 1,
* depth: 1,
* widthSegments: 1,
* heightSegments: 1,
* depthSegments: 1
* }
* }</pre>
*/
/**
* Instructions
* @member {Object} module:components/meshes.Box#instructions
* @static
* @default geometry: ['width', 'height', 'depth', 'widthSegments', 'heightSegments', 'depthSegements']
*/
function Box() {
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
classCallCheck(this, Box);
return possibleConstructorReturn(this, getPrototypeOf$2(Box).call(this, params, Box.defaults, Box.instructions));
}
/**
* @method build
* @description Build lifecycle creates a mesh using input params.
* @param {Object} params Component parameters.
* @return {THREE.Mesh} Built mesh
* @memberof module:components/meshes.Box
*/
createClass(Box, [{
key: "build",
value: function build() {
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.params;
var _this$applyBridge = this.applyBridge({
geometry: this.buildGeometry(params),
material: params.material
}),
geometry = _this$applyBridge.geometry,
material = _this$applyBridge.material;
return this.applyBridge({
mesh: new Mesh(geometry, material)
}).mesh;
}
}, {
key: "buildGeometry",
value: function buildGeometry() {
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var geometry = new (params.buffer ? BoxBufferGeometry : BoxGeometry)(params.geometry.width, params.geometry.height, params.geometry.depth, params.geometry.widthSegments, params.geometry.heightSegments, params.geometry.depthSegments);
return geometry;
}
}]);
inherits(Box, _MeshComponent);
return Box;
}(MeshComponent);
defineProperty$3(defineProperty$3(Box, "defaults", objectSpread({}, MeshComponent.defaults, {
geometry: {
width: 1,
height: 1,
depth: 1,
widthSegments: 1,
heightSegments: 1,
depthSegments: 1
}
})), "instructions", objectSpread({}, MeshComponent.instructions, {
geometry: ['width', 'height', 'depth', 'widthSegments', 'heightSegments', 'depthSegements']
}));
/**
* @class Circle
* @category components/meshes
* @description As told on Component definition, while you can pass any of the inherited params for this component construction, you will need to
* pass specific parameters to build this mesh as a geometry object.
* @classDesc
* <iframe src="https://threejs.org/docs/scenes/geometry-browser.html#CircleGeometry"></iframe>
* @param {Object} [params] - The params.
* @extends module:core.MeshComponent
* @memberof module:components/meshes
* @example <caption>Creating a Circle, and adding to app</caption>
* new Circle({
* geometry: {
* radius: 4,
* segments: 16
* },
*
* material: new THREE.MeshBasicMaterial({
* color: 0xffffff
* }),
*
* position: [50, 60, 70]
* }).addTo(app);
*/
var Circle =
/*#__PURE__*/
function (_MeshComponent) {
/**
* Default values for parameters
* @member {Object} module:components/meshes.Circle#defaults
* @static
* @default <pre>
* {
* geometry: {
* radius: 50,
* segments: 8,
* thetaStart: 0,
* thetaLength: Math.PI * 2
* }
* }</pre>
*/
/**
* Instructions
* @member {Object} module:components/meshes.Circle#instructions
* @static
* @default geometry: ['radius', 'segments', 'thetaStart', 'thetaLength']
*/
function Circle() {
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
classCallCheck(this, Circle);
return possibleConstructorReturn(this, getPrototypeOf$2(Circle).call(this, params, Circle.defaults, Circle.instructions));
}
/**
* @method build
* @description Build lifecycle creates a mesh using input params.
* @param {Object} params Component parameters.
* @return {THREE.Mesh} Built mesh
* @memberof module:components/meshes.Circle
*/
createClass(Circle, [{
key: "build",
value: function build() {
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.params;
var _this$applyBridge = this.applyBridge({
geometry: this.buildGeometry(params),
material: params.material
}),
geometry = _this$applyBridge.geometry,
material = _this$applyBridge.material;
return this.applyBridge({
mesh: new Mesh(geometry, material)
}).mesh;
}
}, {
key: "buildGeometry",
value: function buildGeometry() {
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var geometry = new (params.buffer ? CircleBufferGeometry : CircleGeometry)(params.geometry.radius, params.geometry.segments, params.geometry.thetaStart, params.geometry.thetaLength);
return geometry;
}
}]);
inherits(Circle, _MeshComponent);
return Circle;
}(MeshComponent);
defineProperty$3(defineProperty$3(Circle, "defaults", objectSpread({}, MeshComponent.defaults, {
geometry: {
radius: 50,
segments: 8,
thetaStart: 0,
thetaLength: Math.PI * 2
}
})), "instructions", objectSpread({}, MeshComponent.instructions, {
geometry: ['radius', 'segments', 'thetaStart', 'thetaLength']
}));
/**
* @class Cone
* @category components/meshes
* @description A cylinder is one of the most basic curvilinear geometric shapes, the surface formed by the points at a fixed distance from a given straight line, the axis of the cylinder. <br/><br/>
* The solid enclosed by this surface and by two planes perpendicular to the axis is also called a cylinder.<br/>
* The surface area and the volume of a cylinder have been known since deep antiquity.
* @classDesc
* <iframe src="https://threejs.org/docs/scenes/geometry-browser.html#ConeGeometry"></iframe>
* @param {Object} [params] - The params.
* @extends module:core.MeshComponent
* @memberof module:components/meshes
* @example <caption>Creating a Cone, and adding to app</caption>
* new Cone({
* geometry: {
* radiusTop: 2,
* radiusBottom: 4,
* height: 5
* },
*
* material: new THREE.MeshBasicMaterial({
* color: 0xffffff
* }),
*
* pos: [0, 100, 0]
* }).addTo(app);
*/
var Cone =
/*#__PURE__*/
function (_MeshComponent) {
/**
* Default values for parameters
* @member {Object} module:components/meshes.Cone#defaults
* @static
* @default <pre>
* {
* geometry: {
* radius: 20,
* height: 100,
* radiusSegments: 32,
* heightSegments: 1,
* openEnded: false,
* thetaStart: 0,
* thetaLength: Math.PI * 2
* }
* }</pre>
*/
/**
* Instructions
* @member {Object} module:components/meshes.Cone#instructions
* @static
* @default <pre>
* geometry: [
* 'radius',
* 'height',
* 'radiusSegments',
* 'heightSegments',
* 'openEnded',
* 'thetaStart',
* 'thetaLength'
* ]
* </pre>
*/
function Cone() {
var _this;
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
classCallCheck(this, Cone);
_this = possibleConstructorReturn(this, getPrototypeOf$2(Cone).call(this, params, Cone.defaults, Cone.instructions));
if (params.build) {
_this.build(params);
get$3(getPrototypeOf$2(Cone.prototype), "wrap", assertThisInitialized(_this)).call(assertThisInitialized(_this));
}
return _this;
}
/**
* @method build
* @description Build lifecycle creates a mesh using input params.
* @param {Object} params Component parameters.
* @return {THREE.Mesh} Built mesh
* @memberof module:components/meshes.Cone
*/
createClass(Cone, [{
key: "build",
value: function build() {
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.params;
var _this$applyBridge = this.applyBridge({
geometry: this.buildGeometry(params),
material: params.material
}),
geometry = _this$applyBridge.geometry,
material = _this$applyBridge.material;
return this.applyBridge({
mesh: new Mesh(geometry, material)
}).mesh;
}
}, {
key: "buildGeometry",
value: function buildGeometry() {
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var geometry = new (params.buffer ? ConeBufferGeometry : ConeGeometry)(params.geometry.radius, params.geometry.height, params.geometry.radiusSegments, params.geometry.heightSegments, params.geometry.openEnded, params.geometry.thetaStart, params.geometry.thetaLength);
return geometry;
}
}]);
inherits(Cone, _MeshComponent);
return Cone;
}(MeshComponent);
defineProperty$3(defineProperty$3(Cone, "defaults", objectSpread({}, MeshComponent.defaults, {
geometry: {
radius: 20,
height: 100,
radiusSegments: 32,
heightSegments: 1,
openEnded: false,
thetaStart: 0,
thetaLength: Math.PI * 2
}
})), "instructions", objectSpread({}, MeshComponent.instructions, {
geometry: ['radius', 'height', 'radiusSegments', 'heightSegments', 'openEnded', 'thetaStart', 'thetaLength']
}));
/**
* @class Cylinder
* @category components/meshes
* @description A cylinder is one of the most basic curvilinear geometric shapes, the surface formed by the points at a fixed distance from a given straight line, the axis of the cylinder. <br/><br/>
* The solid enclosed by this surface and by two planes perpendicular to the axis is also called a cylinder.<br/>
* The surface area and the volume of a cylinder have been known since deep antiquity.
* @classDesc
* <iframe src="https://threejs.org/docs/scenes/geometry-browser.html#CylinderGeometry"></iframe>
* @param {Object} [params] - The params.
* @extends module:core.MeshComponent
* @memberof module:components/meshes
* @example <caption>Creating a Cylinder, and adding to app</caption>
* new Cylinder({
* geometry: {
* radiusTop: 2,
* radiusBottom: 4,
* height: 5
* },
*
* material: new THREE.MeshBasicMaterial({
* color: 0xffffff
* }),
*
* pos: [0, 100, 0]
* }).addTo(app);
*/
var Cylinder =
/*#__PURE__*/
function (_MeshComponent) {
/**
* Default values for parameters
* @member {Object} module:components/meshes.Cylinder#defaults
* @static
* @default <pre>
* {
* geometry: {
* radiusTop: 20,
* radiusBottom: 20,
* height: 100,
* radiusSegments: 32,
* heightSegments: 1,
* openEnded: false,
* thetaStart: 0,
* thetaLength: Math.PI * 2
* }
* }</pre>
*/
/**
* Instructions
* @member {Object} module:components/meshes.Cylinder#instructions
* @static
* @default <pre>
* geometry: [
* 'radiusTop',
* 'radiusBottom',
* 'height',
* 'radiusSegments',
* 'heightSegments',
* 'openEnded',
* 'thetaStart',
* 'thetaLength'
* ]
* </pre>
*/
function Cylinder() {
var _this;
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
classCallCheck(this, Cylinder);
_this = possibleConstructorReturn(this, getPrototypeOf$2(Cylinder).call(this, params, Cylinder.defaults, Cylinder.instructions));
if (params.build) {
_this.build(params);
get$3(getPrototypeOf$2(Cylinder.prototype), "wrap", assertThisInitialized(_this)).call(assertThisInitialized(_this));
}
return _this;
}
/**
* @method build
* @description Build lifecycle creates a mesh using input params.
* @param {Object} params Component parameters.
* @return {THREE.Mesh} Built mesh
* @memberof module:components/meshes.Cylinder
*/
createClass(Cylinder, [{
key: "build",
value: function build() {
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.params;
var _this$applyBridge = this.applyBridge({
geometry: this.buildGeometry(params),
material: params.material
}),
geometry = _this$applyBridge.geometry,
material = _this$applyBridge.material;
return this.applyBridge({
mesh: new Mesh(geometry, material)
}).mesh;
}
}, {
key: "buildGeometry",
value: function buildGeometry() {
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var geometry = new (params.buffer ? CylinderBufferGeometry : CylinderGeometry)(params.geometry.radiusTop, params.geometry.radiusBottom, params.geometry.height, params.geometry.radiusSegments, params.geometry.heightSegments, params.geometry.openEnded, params.geometry.thetaStart, params.geometry.thetaLength);
return geometry;
}
}]);
inherits(Cylinder, _MeshComponent);
return Cylinder;
}(MeshComponent);
defineProperty$3(defineProperty$3(Cylinder, "defaults", objectSpread({}, MeshComponent.defaults, {
geometry: {
radiusTop: 0,
radiusBottom: 1,
height: 1,
radiusSegments: 32,
heightSegments: 1,
openEnded: false,
thetaStart: 0,
thetaLength: Math.PI * 2
}
})), "instructions", objectSpread({}, MeshComponent.instructions, {
geometry: ['radiusTop', 'radiusBottom', 'height', 'radiusSegments', 'heightSegments', 'openEnded', 'thetaStart', 'thetaLength']
}));
/**
* @class Dodecahedron
* @category components/meshes
* @description In geometry, a dodecahedron is any polyhedron with twelve flat faces. <br/><br/>
* The most familiar dodecahedron is the regular dodecahedron, which is a Platonic solid. <br/>
* There are also three regular star dodecahedra, which are constructed as stellations of the convex form. <br/>
* All of these have icosahedral symmetry, order 120.
* Dodecahedron creates Dodecahedron object by it's radius and detail.
* @classDesc
* <iframe src="https://threejs.org/docs/scenes/geometry-browser.html#DodecahedronGeometry"></iframe>
* @param {Object} [params] - The params.
* @extends module:core.MeshComponent
* @memberof module:components/meshes
* @example <caption>Creating a Dodecahedron, and adding to app</caption>
* new Dodecahedron({
* geometry: {
* radius: 2
* },
*
* material: new THREE.MeshBasicMaterial({
* color: 0xffffff
* }),
*
* position: {
* y: 10
* }
* }).addTo(app);
*/
var Dodecahedron =
/*#__PURE__*/
function (_MeshComponent) {
/**
* Default values for parameters
* @member {Object} module:components/meshes.Dodecahedron#defaults
* @static
* @default <pre>
* geometry: {
* radius: 1,
* detail: 0
* }
* </pre>
*/
/**
* Instructions
* @member {Object} module:components/meshes.Dodecahedron#instructions
* @static
* @default <pre>
* geometry: ['radius', 'detail']
* </pre>
*/
function Dodecahedron() {
var _this;
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
classCallCheck(this, Dodecahedron);
_this = possibleConstructorReturn(this, getPrototypeOf$2(Dodecahedron).call(this, params, Dodecahedron.defaults, Dodecahedron.instructions));
if (params.build) {
_this.build(params);
get$3(getPrototypeOf$2(Dodecahedron.prototype), "wrap", assertThisInitialized(_this)).call(assertThisInitialized(_this));
}
return _this;
}
/**
* @method build
* @description Build lifecycle creates a mesh using input params.
* @param {Object} params Component parameters.
* @return {THREE.Mesh} Built mesh
* @memberof module:components/meshes.Dodecahedron
*/
createClass(Dodecahedron, [{
key: "build",
value: function build() {
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.params;
var _this$applyBridge = this.applyBridge({
geometry: this.buildGeometry(params),
material: params.material
}),
geometry = _this$applyBridge.geometry,
material = _this$applyBridge.material;
return this.applyBridge({
mesh: new Mesh(geometry, material)
}).mesh;
}
}, {
key: "buildGeometry",
value: function buildGeometry() {
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
return new (params.buffer ? DodecahedronBufferGeometry : DodecahedronGeometry)(params.geometry.radius, params.geometry.detail);
}
}]);
inherits(Dodecahedron, _MeshComponent);
return Dodecahedron;
}(MeshComponent);
defineProperty$3(defineProperty$3(Dodecahedron, "defaults", objectSpread({}, MeshComponent.defaults, {
geometry: {
radius: 1,
detail: 0
}
})), "instructions", objectSpread({}, MeshComponent.instructions, {
geometry: ['radius', 'detail']
}));
/**
* @class Extrude
* @category components/meshes
* @description Extrude geometry means that you can create a 3D mesh from any 2D shape using three.js geometry based on <a href='https://threejs.org/docs/#api/math/Vector2'>THREE.Vector2.</a> <br/>
* Such implementation will help you to make volumed shapes that have their own depth and can be seen from all angels.<br/><br/>
* You can also find some interesting examples made using <a href='threejs.org'>three.js</a> which is a core of whs.js, such as:
* - <a href='http://threejs.org/examples/webgl_geometry_extrude_shapes.html'>Webgl geometry extrude</a>
* - <a href='http://threejs.org/examples/webgl_geometry_extrude_shapes2.html'>Extrude shapes from geodata</a>
* - <a href='http://threejs.org/examples/webgl_geometry_extrude_splines.html'>Extrude splines</a>
*
* Such examples can be easily implemented using whitestorm.js or it's plugins. Use `Extrude` class with <a href='https://threejs.org/docs/#api/extras/core/Shape'>THREE.Shape</a> to get extrude effect of shape defined by 2D vectors.
* This class is similar to <a href='https://threejs.org/docs/#api/geometries/ExtrudeGeometry'>THREE.ExtrudeGeometry</a>,
* but it also contains all properties, applied by `Shape`, such as material, mass and vectors like position (pos) and rotation (rot).
* @classDesc
* <iframe src="https://threejs.org/docs/scenes/geometry-browser.html#ExtrudeGeometry"></iframe>
* @param {Object} [params] - The params.
* @extends module:core.MeshComponent
* @memberof module:components/meshes
* @example <caption>Creating a shape, then an Extrude from it</caption>
* const shape = new THREE.Shape([
* new THREE.Vector2(-4,-4),
* new THREE.Vector2(-2,0),
* new THREE.Vector2(-4,4),
* new THREE.Vector2(0,2),
* new THREE.Vector2(4,4),
* new THREE.Vector2(2,0),
* new THREE.Vector2(4,-4),
* new THREE.Vector2(0,-2)
* ]);
*
* const extrude = new Extrude({
* geometry: {
* shapes: shape,
* options: {
* bevelEnabled: false,
* bevelSize: 0,
* amount: 2
* }
* },
*
* material: new THREE.MeshBasicMaterial({
* color: 0xffffff
* }),
*
* position: [0, 100, 0]
* });
*
* extrude.addTo(app);
*/
var Extrude =
/*#__PURE__*/
function (_MeshComponent) {
/**
* Default values for parameters
* @member {Object} module:components/meshes.Extrude#defaults
* @static
* @default <pre>
* {
* geometry: {
* shapes: [],
* options: {}
* }
* }
* </pre>
*/
/**
* Instructions
* @member {Object} module:components/meshes.Extrude#instructions
* @static
* @default <pre>
* {
* geometry: ['shapes', 'options']
* }
* </pre>
*/
function Extrude() {
var _this;
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
classCallCheck(this, Extrude);
_this = possibleConstructorReturn(this, getPrototypeOf$2(Extrude).call(this, params, Extrude.defaults, Extrude.instructions));
if (params.build) {
_this.build(params);
get$3(getPrototypeOf$2(Extrude.prototype), "wrap", assertThisInitialized(_this)).call(assertThisInitialized(_this));
}
return _this;
}
/**
* @method build
* @description Build lifecycle creates a mesh using input params.
* @param {Object} params Component parameters.
* @return {THREE.Mesh} Built mesh
* @memberof module:components/meshes.Extrude
*/
createClass(Extrude, [{
key: "build",
value: function build() {
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.params;
var _this$applyBridge = this.applyBridge({
geometry: this.buildGeometry(params),
material: params.material
}),
geometry = _this$applyBridge.geometry,
material = _this$applyBridge.material;
return this.applyBridge({
mesh: new Mesh(geometry, material)
}).mesh;
}
}, {
key: "buildGeometry",
value: function buildGeometry() {
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var geometry = new ExtrudeGeometry(params.geometry.shapes, params.geometry.options);
return params.buffer ? new BufferGeometry().fromGeometry(geometry) : geometry;
}
}]);
inherits(Extrude, _MeshComponent);
return Extrude;
}(MeshComponent);
defineProperty$3(defineProperty$3(Extrude, "defaults", objectSpread({}, MeshComponent.defaults, {
geometry: {
shapes: [],
options: {}
}
})), "instructions", objectSpread({}, MeshComponent.instructions, {
geometry: ['shapes', 'options']
}));
/**
* @class Icosahedron
* @category components/meshes
* @description In geometry, an icosahedron is a polyhedron with 20 faces.<br/>
* There are many kinds of icosahedra, with some being more symmetrical than others. The most well known is the Platonic, convex regular icosahedron.<br/>
* `Icosahedron` creates an Icosahedron object by its radius and detail.
* @classDesc
* <iframe src="https://threejs.org/docs/scenes/geometry-browser.html#IcosahedronGeometry"></iframe>
* @param {Object} [params] - The params.
* @extends module:core.MeshComponent
* @memberof module:components/meshes
* @example <caption>Creating a Icosahedron, and adding to app</caption>
* new Icosahedron({
* geometry: {
* radius: 2,
* detail: 1
* },
*
* material: new THREE.MeshBasicMaterial({
* color: 0xffffff
* }),
*
* position: [0, 100, 0]
* }).addTo(app);
*/
var Icosahedron =
/*#__PURE__*/
function (_MeshComponent) {
/**
* Default values for parameters
* @member {Object} module:components/meshes.Icosahedron#defaults
* @static
* @default <pre>
* {
* geometry: {
* radius: 1,
* detail: 0
* }
* }</pre>
*/
/**
* Instructions
* @member {Object} module:components/meshes.Icosahedron#instructions
* @static
* @default {geometry: ['radius', 'detail']}
*/
function Icosahedron() {
var _this;
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
classCallCheck(this, Icosahedron);
_this = possibleConstructorReturn(this, getPrototypeOf$2(Icosahedron).call(this, params, Icosahedron.defaults, Icosahedron.instructions));
if (params.build) {
_this.build(params);
get$3(getPrototypeOf$2(Icosahedron.prototype), "wrap", assertThisInitialized(_this)).call(assertThisInitialized(_this));
}
return _this;
}
/**
* @method build
* @description Build lifecycle creates a mesh using input params.
* @param {Object} params Component parameters.
* @return {THREE.Mesh} Built mesh
* @memberof module:components/meshes.Icosahedron
*/
createClass(Icosahedron, [{
key: "build",
value: function build() {
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.params;
var _this$applyBridge = this.applyBridge({
geometry: this.buildGeometry(params),
material: params.material
}),
geometry = _this$applyBridge.geometry,
material = _this$applyBridge.material;
return this.applyBridge({
mesh: new Mesh(geometry, material)
}).mesh;
}
}, {
key: "buildGeometry",
value: function buildGeometry() {
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
return new (params.buffer ? IcosahedronBufferGeometry : IcosahedronGeometry)(params.geometry.radius, params.geometry.detail);
}
}]);
inherits(Icosahedron, _MeshComponent);
return Icosahedron;
}(MeshComponent);
defineProperty$3(defineProperty$3(Icosahedron, "defaults", objectSpread({}, MeshComponent.defaults, {
geometry: {
radius: 1,
detail: 0
}
})), "instructions", objectSpread({}, MeshComponent.instructions, {
geometry: ['radius', 'detail']
}));
/**
* @class Lathe
* @category components/meshes
* @description A `LatheGeometry` allows you to create shapes from a smooth curve.
* This curve is defined by a number of points (also called knots) and is most often called a spline. This spline is rotated around a fixed point and results in vase- and bell-like shapes.<br/><br/>
* In 3D computer graphics, a lathed object is a 3D model whose vertex geometry is produced by rotating the points of a spline or other point set around a fixed axis.
* The lathing may be partial; the amount of rotation is not necessarily a full 360 degrees.
* The point set providing the initial source data can be thought of as a cross section through the object along a plane containing its axis of radial symmetry. <br/><br/>
* The <a href='http://threejs.org/docs/scenes/geometry-browser.html#LatheGeometry'>following example</a> shows a geometry which can be generated using `Lathe` class.
* @classDesc
* <iframe src="https://threejs.org/docs/scenes/geometry-browser.html#LatheGeometry"></iframe>
* @param {Object} [params] - The params.
* @extends module:core.MeshComponent
* @memberof module:components/meshes
* @example <caption>Creating a Lath, and adding to app</caption>
* const points = [];
*
* for (let i = 0; i < 10; i++) {
* points.push(
* new THREE.Vector2(
* (Math.sin(i * 0.7) * 15 + 50) / 10,
* (i - 5) * 0.2
* )
* );
* }
*
* const lathe = new Lathe({
* geometry: {
* points: points
* },
*
* material: new THREE.MeshBasicMaterial({
* color: 0xffffff
* }),
*
* position: [0, 50, 10]
* }).addTo(app);
*/
var Lathe =
/*#__PURE__*/
function (_MeshComponent) {
/**
* Default values for parameters
* @member {Object} module:components/meshes.Lathe#defaults
* @static
* @default <pre>
* {
* geometry: {
* points: []
* }
* }
* </pre>
*/
/**
* Instructions
* @member {Object} module:components/meshes.Lathe#instructions
* @static
* @default <pre>{
* geometry: ['points']
* }
* </pre>
*/
function Lathe() {
var _this;
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
classCallCheck(this, Lathe);
_this = possibleConstructorReturn(this, getPrototypeOf$2(Lathe).call(this, params, Lathe.defaults, Lathe.instructions));
if (params.build) {
_this.build(params);
get$3(getPrototypeOf$2(Lathe.prototype), "wrap", assertThisInitialized(_this)).call(assertThisInitialized(_this));
}
return _this;
}
/**
* @method build
* @description Build lifecycle creates a mesh using input params.
* @param {Object} params Component parameters.
* @return {THREE.Mesh} Built mesh
* @memberof module:components/meshes.Lathe
*/
createClass(Lathe, [{
key: "build",
value: function build() {
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.params;
var _this$applyBridge = this.applyBridge({
geometry: this.buildGeometry(params),
material: params.material
}),
geometry = _this$applyBridge.geometry,
material = _this$applyBridge.material;
return this.applyBridge({
mesh: new Mesh(geometry, material)
}).mesh;
}
}, {
key: "buildGeometry",
value: function buildGeometry() {
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
return new (params.buffer ? LatheBufferGeometry : LatheGeometry)(params.geometry.points);
}
}]);
inherits(Lathe, _MeshComponent);
return Lathe;
}(MeshComponent);
defineProperty$3(defineProperty$3(Lathe, "defaults", objectSpread({}, MeshComponent.defaults, {
geometry: {
points: []
}
})), "instructions", objectSpread({}, MeshComponent.instructions, {
geometry: ['points']
}));
/**
* @class Line
* @category components/meshes
* @description Line component is generated from a curve/line and amount of vectors that should be used (points).
* @param {Object} [params] - The params.
* @extends module:core.MeshComponent
* @memberof module:components/meshes
* @example <caption>Creating a Line, and adding to app</caption>
* new Line({
* geometry: {
* curve: new THREE.LineCurve3(new THREE.Vector3(10, 10, 0), new THREE.Vector3(10, 30, 0))
* },
*
* material: new THREE.MeshBasicMaterial({
* color: 0xffffff
* })
* }).addTo(app);
*/
var Line$1 =
/*#__PURE__*/
function (_MeshComponent) {
/**
* Default values for parameters
* @member {Object} module:components/meshes.Line#defaults
* @static
* @default <pre>
* {
* curve: new LineCurve3(new Vector3(0, 0, 0), new Vector3(10, 0, 0)),
* points: 50
* }
* </pre>
*/
/**
* Instructions
* @member {Object} module:components/meshes.Line#instructions
* @static
* @default <pre>{
* geometry: ['curve', 'points']
* }
* </pre>
*/
function Line$$1(params) {
classCallCheck(this, Line$$1);
return possibleConstructorReturn(this, getPrototypeOf$2(Line$$1).call(this, params, Line$$1.defaults, Line$$1.instructions));
}
/**
* @method build
* @description Build lifecycle creates a mesh using input params.
* @param {Object} params Component parameters.
* @return {THREE.Mesh} Built mesh
* @memberof module:components/meshes.Line
*/
createClass(Line$$1, [{
key: "build",
value: function build() {
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.params;
var _this$applyBridge = this.applyBridge({
geometry: this.buildGeometry(params),
material: params.material
}),
geometry = _this$applyBridge.geometry,
material = _this$applyBridge.material;
return this.applyBridge({
mesh: new Line(geometry, material)
}).mesh;
}
}, {
key: "buildGeometry",
value: function buildGeometry() {
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var geometry = params.buffer ? new BufferGeometry() : new Geometry();
if (params.buffer) {
var pp = params.curve.getPoints(params.points);
var verts = new Float32Array(pp.length * 3);
for (var i = 0, max = pp.length; i < max; i++) {
var i3 = i * 3;
verts[i3] = pp[i].x;
verts[i3 + 1] = pp[i].y;
verts[i3 + 2] = pp[i].z;
}
geometry.addAttribute('position', new BufferAttribute(verts, 3));
} else geometry.vertices = params.curve.getPoints(params.points);
return geometry;
}
}]);
inherits(Line$$1, _MeshComponent);
return Line$$1;
}(MeshComponent);
defineProperty$3(defineProperty$3(Line$1, "defaults", objectSpread({}, MeshComponent.defaults, {
curve: null,
points: 50
})), "instructions", objectSpread({}, MeshComponent.instructions, {
geometry: ['curve', 'points']
}));
/**
* @class Importer
* @category components/meshes
* @description Importer is a loader for meshes and any other data to your scene
* @param {Object} [params] - The params.
* @extends module:core.MeshComponent
* @memberof module:components/meshes
* @example <caption>Creating a Importer, and adding to app</caption>
* new Importer({
* loader: new THREE.OBJLoader(),
*
* parser(geometry, material) { // data from loader
* return new THREE.Mesh(geometry, material); // should return your .native (mesh in this case)
* },
*
* position: [0, 100, 0]
* }).addTo(app);
*/
var Importer =
/*#__PURE__*/
function (_MeshComponent) {
createClass(Importer, null, [{
key: "filter",
/**
* Default values for parameters
* @member {Object} module:components/meshes.Importer#defaults
* @static
* @default <pre>
* {
* url: '',
* loader: new JSONLoader(),
*
* onLoad() {},
* onProgress() {},
* onError() {},
*
* texturePath: null,
* useCustomMaterial: false,
*
* parser(geometry, materials) {
* return new Mesh(geometry, materials);
* }
* }</pre>
*/
/**
* @method filter
* @description Default values for filter
* @static
* @param {THREE.Mesh} object Instance for iterating through it's children.
* @param {Function} filter Function with child as argument, should return a boolean whether include the child or not.
* @return {THREE.Mesh} object with children
* @memberof module:components/meshes.Importer
* @example <caption>Removing unnecessary lights from children</caption>
* new Importer({
* loader: new THREE.OBJLoader(),
*
* parse(group) { // data from loader
* return Importer.filter(group, child => !child.isLight); // remove lights
* },
*
* position: [0, 100, 0]
* }).addTo(app);
*/
value: function filter(object, _filter) {
var processFilter = function processFilter(object) {
object.children.forEach(function (el, index) {
if (el.children) processFilter(el);
if (!_filter(el)) object.children.splice(index, 1);
});
return object;
};
return processFilter(object);
}
}]);
function Importer() {
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
classCallCheck(this, Importer);
return possibleConstructorReturn(this, getPrototypeOf$2(Importer).call(this, params, Importer.defaults, Importer.instructions, false));
}
/**
* @method build
* @description Build lifecycle creates a mesh using input params.
* @param {Object} params Component parameters.
* @return {THREE.Mesh} Built mesh
* @memberof module:components/meshes.Importer
*/
createClass(Importer, [{
key: "build",
value: function build() {
var _this = this;
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
return new Promise(function (resolve) {
if (params.texturePath) params.loader.setTexturePath(params.texturePath);
params.loader.load(params.url, function () {
for (var _len = arguments.length, data = new Array(_len), _key = 0; _key < _len; _key++) {
data[_key] = arguments[_key];
}
// geometry, materials
params.onLoad.apply(params, data);
var object = params.parser.apply(_this, data);
if (params.material) object.material = _this.applyBridge({
material: params.material
}).material;
resolve(object);
}, params.onProgress, params.onError);
});
}
}]);
inherits(Importer, _MeshComponent);
return Importer;
}(MeshComponent);
defineProperty$3(defineProperty$3(Importer, "defaults", objectSpread({}, MeshComponent.defaults, {
url: '',
loader: new JSONLoader(),
onLoad: function onLoad() {},
onProgress: function onProgress() {},
// TODO add onComplete?
onError: function onError() {},
texturePath: null,
useCustomMaterial: false,
parser: function parser(geometry, material) {
var _this$applyBridge = this.applyBridge({
geometry: geometry,
material: material
}),
geom = _this$applyBridge.geometry,
mat = _this$applyBridge.material;
return this.applyBridge({
mesh: geom.bones ? new SkinnedMesh(geom, mat) : new Mesh(geom, mat)
}).mesh;
}
})), "instructions", objectSpread({}, MeshComponent.instructions));
/**
* @class Octahedron
* @category components/meshes
* @description In geometry, an octahedron is a polyhedron with eight faces.
* A regular octahedron is a Platonic solid composed of eight equilateral triangles, four of which meet at each vertex.
* <br/><br/>
* `Octahedron` creates an Octahedron object by its `radius` and `detail`.
* @classDesc
* <iframe src="https://threejs.org/docs/scenes/geometry-browser.html#OctahedronGeometry"></iframe>
* @param {Object} [params] - The params.
* @extends module:core.MeshComponent
* @memberof module:components/meshes
* @example <caption>Creating an Octahedron, and adding to app</caption>
* new Octahedron({
* geometry: {
* radius: 2,
* detail: 1
* },
*
* material: new THREE.MeshBasicMaterial({
* color: 0xffffff
* }),
*
* position: [0, 100, 0]
* }).addTo(app);
*/
var Octahedron =
/*#__PURE__*/
function (_MeshComponent) {
/**
* Default values for parameters
* @member {Object} module:components/meshes.Octahedron#defaults
* @static
* @default <pre>
* {
* geometry: {
* radius: 1,
* detail: 0
* }
* }
* </pre>
*/
function Octahedron() {
var _this;
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
classCallCheck(this, Octahedron);
_this = possibleConstructorReturn(this, getPrototypeOf$2(Octahedron).call(this, params, Octahedron.defaults, Octahedron.instructions));
if (params.build) {
_this.build(params);
get$3(getPrototypeOf$2(Octahedron.prototype), "wrap", assertThisInitialized(_this)).call(assertThisInitialized(_this));
}
return _this;
}
/**
* @method build
* @description Build lifecycle creates a mesh using input params.
* @param {Object} params Component parameters.
* @return {THREE.Mesh} Built mesh
* @memberof module:components/meshes.Octahedron
*/
createClass(Octahedron, [{
key: "build",
value: function build() {
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.params;
var _this$applyBridge = this.applyBridge({
geometry: this.buildGeometry(params),
material: params.material
}),
geometry = _this$applyBridge.geometry,
material = _this$applyBridge.material;
return this.applyBridge({
mesh: new Mesh(geometry, material)
}).mesh;
}
}, {
key: "buildGeometry",
value: function buildGeometry() {
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
return new (params.buffer ? OctahedronBufferGeometry : OctahedronGeometry)(params.geometry.radius, params.geometry.detail);
}
}]);
inherits(Octahedron, _MeshComponent);
return Octahedron;
}(MeshComponent);
defineProperty$3(Octahedron, "defaults", objectSpread({}, MeshComponent.defaults, {
geometry: {
radius: 1,
detail: 0
}
}));
/**
* @class Parametric
* @category components/meshes
* @description `Parametric` generates a geometry representing a <a href='https://en.wikipedia.org/wiki/Parametric_surface'>Parametric surface</a>
* <br/><br/>
* It is usually used to develop different kinds of highfields or visualize a <a href='https://stemkoski.github.io/Three.js/Graphulus-Function.html'>math function</a>.
* <br/>
* - <a href='http://math.hws.edu/graphicsbook/source/threejs/curves-and-surfaces.html'>Parametric surface</a>
* - <a href='https://stemkoski.github.io/Three.js/Graphulus-Surface.html'>"Graphulus"</a>
* <br/><br/>
* @classDesc
* <iframe src="https://threejs.org/docs/scenes/geometry-browser.html#ParametricGeometry"></iframe>
* @param {Object} [params] - The params.
* @extends module:core.MeshComponent
* @memberof module:components/meshes
* @example <caption>Example creating an heightfield-like geometry. `u` and `v` are like `x` and `y` in shape, but their values are always from `0` to `1`.
* We use them in `THREE.Vector3` like `x` and `z` and `Math.random() * 5` for `y`.</caption>
* const createParametric = (u, v) => {
* return new THREE.Vector3(u * 30, Math.random() * 5, v * 30);
* }
*
* new Parametric({
* geometry: {
* func: createParametric
* },
*
* material: new THREE.MeshLambertMaterial({
* color: 0xffffff,
* side: THREE.DoubleSide
* }),
*
* position: [0, 100, -100]
* }).addTo(app);
*/
var Parametric =
/*#__PURE__*/
function (_MeshComponent) {
/**
* Default values for parameters
* @member {Object} module:components/meshes.Parametric#defaults
* @static
* @default <pre>
* {
* geometry: {
* func: (u, v) => new Vector3(u, v, 0),
* slices: 10,
* tacks: 10
* }
* }
* </pre>
*/
function Parametric() {
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
classCallCheck(this, Parametric);
return possibleConstructorReturn(this, getPrototypeOf$2(Parametric).call(this, params, Parametric.defaults, Parametric.instructions));
}
/**
* @method build
* @description Build lifecycle creates a mesh using input params.
* @param {Object} params Component parameters.
* @return {THREE.Mesh} Built mesh
* @memberof module:components/meshes.Parametric
*/
createClass(Parametric, [{
key: "build",
value: function build() {
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.params;
var _this$applyBridge = this.applyBridge({
geometry: this.buildGeometry(params),
material: params.material
}),
geometry = _this$applyBridge.geometry,
material = _this$applyBridge.material;
return this.applyBridge({
mesh: new Mesh(geometry, material)
}).mesh;
}
}, {
key: "buildGeometry",
value: function buildGeometry() {
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
return new (params.buffer ? ParametricBufferGeometry : ParametricGeometry)(params.geometry.func, params.geometry.slices, params.geometry.stacks);
}
}]);
inherits(Parametric, _MeshComponent);
return Parametric;
}(MeshComponent);
defineProperty$3(Parametric, "defaults", objectSpread({}, MeshComponent.defaults, {
geometry: {
func: function func(u, v) {
return new Vector3(u, v, 0);
},
slices: 10,
stacks: 10
}
}));
/**
* @class Plane
* @category components/meshes
* @description `Plane` is used for creating planes given some `width` and `height`.
* @classDesc
* <iframe src="https://threejs.org/docs/scenes/geometry-browser.html#PlaneGeometry"></iframe>
* @param {Object} [params] - The params.
* @extends module:core.MeshComponent
* @memberof module:components/meshes
* @example <caption>Creating a Plane, and adding to app</caption>
* new Plane({
* geometry: {
* width: 20,
* height: 30
* },
*
* material: new THREE.MeshBasicMaterial({
* color: 0xffffff
* })
* }).addTo(app);
*/
var Plane$1 =
/*#__PURE__*/
function (_MeshComponent) {
/**
* Default values for parameters
* @member {Object} module:components/meshes.Plane#defaults
* @static
* @default <pre>
* {
* geometry: {
* width: 10,
* height: 10,
* wSegments: 1,
* hSegments: 1
* }
* }
* </pre>
*/
/**
* Instructions
* @member {Object} module:components/meshes.Plane#instructions
* @static
* @default <pre>
* {
* geometry: ['width', 'height', 'wSegments', 'hSegments']
* }
* </pre>
*/
function Plane$$1() {
var _this;
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
classCallCheck(this, Plane$$1);
_this = possibleConstructorReturn(this, getPrototypeOf$2(Plane$$1).call(this, params, Plane$$1.defaults, Plane$$1.instructions));
if (params.build) {
_this.build(params);
get$3(getPrototypeOf$2(Plane$$1.prototype), "wrap", assertThisInitialized(_this)).call(assertThisInitialized(_this));
}
return _this;
}
/**
* @method build
* @description Build lifecycle creates a mesh using input params.
* @param {Object} params Component parameters.
* @return {THREE.Mesh} Built mesh
* @memberof module:components/meshes.Plane
*/
createClass(Plane$$1, [{
key: "build",
value: function build() {
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.params;
var _this$applyBridge = this.applyBridge({
geometry: this.buildGeometry(params),
material: params.material
}),
geometry = _this$applyBridge.geometry,
material = _this$applyBridge.material;
return this.applyBridge({
mesh: new Mesh(geometry, material)
}).mesh;
}
}, {
key: "buildGeometry",
value: function buildGeometry() {
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var geometry = new (params.buffer ? PlaneBufferGeometry : PlaneGeometry)(params.geometry.width, params.geometry.height, params.geometry.wSegments, params.geometry.hSegments);
return geometry;
}
}]);
inherits(Plane$$1, _MeshComponent);
return Plane$$1;
}(MeshComponent);
defineProperty$3(defineProperty$3(Plane$1, "defaults", objectSpread({}, MeshComponent.defaults, {
geometry: {
width: 10,
height: 10,
wSegments: 1,
hSegments: 1
}
})), "instructions", objectSpread({}, MeshComponent.instructions, {
geometry: ['width', 'height', 'wSegments', 'hSegments']
}));
var verticesOfCube = [-1, -1, -1, 1, -1, -1, 1, 1, -1, -1, 1, -1, -1, -1, 1, 1, -1, 1, 1, 1, 1, -1, 1, 1],
indicesOfFaces = [2, 1, 0, 0, 3, 2, 0, 4, 7, 7, 3, 0, 0, 1, 5, 5, 4, 0, 1, 2, 6, 6, 5, 1, 2, 3, 7, 7, 6, 2, 4, 5, 6, 6, 7, 4];
/**
* @class Polyhedron
* @category components/meshes
* @description In elementary geometry, a polyhedron is a solid in three dimensions with flat polygonal faces, straight edges and sharp corners or vertices.
* <br/><br/>
* `Polyhedron` creates a Polyhedron by its `radius` and `detail`.
* <br/><br/>
* @param {Object} [params] - The params.
* @extends module:core.MeshComponent
* @memberof module:components/meshes
* @example <caption>Creating an Polyhedron, and adding to app</caption>
* new Polyhedron({
* geometry: {
* radius: 2,
* detail: 1
* },
*
* material: new THREE.MeshBasicMaterial({
* color: 0xffffff
* }),
*
* position: [0, 100, 0]
* }).addTo(app);
*/
var Polyhedron =
/*#__PURE__*/
function (_MeshComponent) {
/**
* Default values for parameters
* @member {Object} module:components/meshes.Polyhedron#defaults
* @static
* @default <pre>
* {
* geometry: {
* verticesOfCube: [
* -1, -1, -1, 1, -1, -1, 1, 1, -1, -1, 1, -1,
* -1, -1, 1, 1, -1, 1, 1, 1, 1, -1, 1, 1
* ],
*
* indicesOfFaces: [
* 2, 1, 0, 0, 3, 2,
* 0, 4, 7, 7, 3, 0,
* 0, 1, 5, 5, 4, 0,
* 1, 2, 6, 6, 5, 1,
* 2, 3, 7, 7, 6, 2,
* 4, 5, 6, 6, 7, 4
* ],
*
* radius: 6,
* detail: 2
* }
* }
* </pre>
*/
/**
* Instructions
* @member {Object} module:components/meshes.Polyhedron#instructions
* @static
* @default <pre>
* {
* geometry: ['verticesOfCube', 'indicesOfFaces', 'radius', 'detail']
* }
* </pre>
*/
function Polyhedron() {
var _this;
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
classCallCheck(this, Polyhedron);
_this = possibleConstructorReturn(this, getPrototypeOf$2(Polyhedron).call(this, params, Polyhedron.defaults, Polyhedron.instructions));
if (params.build) {
_this.build(params);
get$3(getPrototypeOf$2(Polyhedron.prototype), "wrap", assertThisInitialized(_this)).call(assertThisInitialized(_this));
}
return _this;
}
/**
* @method build
* @description Build lifecycle creates a mesh using input params.
* @param {Object} params Component parameters.
* @return {THREE.Mesh} Built mesh
* @memberof module:components/meshes.Polyhedron
*/
createClass(Polyhedron, [{
key: "build",
value: function build() {
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.params;
var _this$applyBridge = this.applyBridge({
geometry: this.buildGeometry(params),
material: params.material
}),
geometry = _this$applyBridge.geometry,
material = _this$applyBridge.material;
return this.applyBridge({
mesh: new Mesh(geometry, material)
}).mesh;
}
}, {
key: "buildGeometry",
value: function buildGeometry() {
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
return new (params.buffer ? PolyhedronBufferGeometry : PolyhedronGeometry)(params.geometry.verticesOfCube, params.geometry.indicesOfFaces, params.geometry.radius, params.geometry.detail);
}
}]);
inherits(Polyhedron, _MeshComponent);
return Polyhedron;
}(MeshComponent);
defineProperty$3(defineProperty$3(defineProperty$3(defineProperty$3(Polyhedron, "verticesOfCube", verticesOfCube), "indicesOfFaces", indicesOfFaces), "defaults", objectSpread({}, MeshComponent.defaults, {
geometry: {
verticesOfCube: verticesOfCube,
indicesOfFaces: indicesOfFaces,
radius: 6,
detail: 2
}
})), "instructions", objectSpread({}, MeshComponent.instructions, {
geometry: ['verticesOfCube', 'indicesOfFaces', 'radius', 'detail']
}));
/**
* @class Ring
* @category components/meshes
* @description Ring class creates a circle or just 2D Torus. Does not support physics.
* @classDesc
* <iframe src="https://threejs.org/docs/scenes/geometry-browser.html#RingGeometry"></iframe>
* @param {Object} [params] - The params.
* @extends module:core.MeshComponent
* @memberof module:components/meshes
* @example <caption>Creating a Ring, and adding to app</caption>
* new Ring({
* geometry: {
* innerRadius: 5,
* outerRadius: 2
* },
*
* material: new THREE.MeshLambertMaterial({
* color: 0xffffff,
* side THREE.DoubleSide
* }),
*
* position: [0, 8, 0],
*
* rotation: {
* x: Math.PI/4
* }
* }).addTo(app);
*/
var Ring =
/*#__PURE__*/
function (_MeshComponent) {
/**
* Default values for parameters
* @member {Object} module:components/meshes.Ring#defaults
* @static
* @default <pre>
* {
* geometry: {
* innerRadius: 0,
* outerRadius: 50,
* thetaSegments: 8,
* phiSegments: 8,
* thetaStart: 0,
* thetaLength: Math.PI * 2
* }
* }
* </pre>
*/
/**
* Instructions
* @member {Object} module:components/meshes.Ring#instructions
* @static
* @default <pre>
* {
* geometry: [
* 'innerRadius',
* 'outerRadius',
* 'thetaSegments',
* 'phiSegments',
* 'thetaStart',
* 'thetaLength'
* ]
* }
* </pre>
*/
function Ring() {
var _this;
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
classCallCheck(this, Ring);
_this = possibleConstructorReturn(this, getPrototypeOf$2(Ring).call(this, params, Ring.defaults, Ring.instructions));
if (params.build) {
_this.build(params);
get$3(getPrototypeOf$2(Ring.prototype), "wrap", assertThisInitialized(_this)).call(assertThisInitialized(_this));
}
return _this;
}
/**
* @method build
* @description Build lifecycle creates a mesh using input params.
* @param {Object} params Component parameters.
* @return {THREE.Mesh} Built mesh
* @memberof module:components/meshes.Ring
*/
createClass(Ring, [{
key: "build",
value: function build() {
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.params;
var _this$applyBridge = this.applyBridge({
geometry: this.buildGeometry(params),
material: params.material
}),
geometry = _this$applyBridge.geometry,
material = _this$applyBridge.material;
return this.applyBridge({
mesh: new Mesh(geometry, material)
}).mesh;
}
}, {
key: "buildGeometry",
value: function buildGeometry() {
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
return new (params.buffer ? RingBufferGeometry : RingGeometry)(params.geometry.innerRadius, params.geometry.outerRadius, params.geometry.thetaSegments, params.geometry.phiSegments, params.geometry.thetaStart, params.geometry.thetaLength);
}
}]);
inherits(Ring, _MeshComponent);
return Ring;
}(MeshComponent);
defineProperty$3(defineProperty$3(Ring, "defaults", objectSpread({}, MeshComponent.defaults, {
geometry: {
innerRadius: 0,
outerRadius: 50,
thetaSegments: 8,
phiSegments: 8,
thetaStart: 0,
thetaLength: Math.PI * 2
}
})), "instructions", objectSpread({}, MeshComponent.defaults, {
geometry: ['innerRadius', 'outerRadius', 'thetaSegments', 'phiSegments', 'thetaStart', 'thetaLength']
}));
/**
* @class Shape
* @category components/meshes
* @description Shape is a universal class. It allows you to create different 2D shapes in 3D scene.<br/>
* Unfortunately, not all of them support physics, an alternative is to make a similar 3D object and scale its width down to near zero.
* <br/><br/>
* `Shape` consists of shapes that are in its shapes parameter.
* @classDesc
* <iframe src="https://threejs.org/docs/scenes/geometry-browser.html#ShapeGeometry"></iframe>
* @param {Object} [params] - The params.
* @extends module:core.MeshComponent
* @memberof module:components/meshes
* @example <caption>Creating a plane looking Shape from a THREE.Shape, and adding it to app</caption>
* const rectWidth = 10,
* rectLength = 5;
*
* const rectShape = new THREE.Shape();
* rectShape.moveTo(0,0);
* rectShape.lineTo(0, rectWidth);
* rectShape.lineTo(rectLength, rectWidth);
* rectShape.lineTo(rectLength, 0);
* rectShape.lineTo(0, 0);
*
* const plane = new Shape({
* geometry: {
* shape: rectShape
* },
*
* material: new THREE.MeshBasicMaterial({
* color: 0xffffff
* })
* }).addTo(app);
*/
var Shape$1 =
/*#__PURE__*/
function (_MeshComponent) {
/**
* Default values for parameters
* @member {Object} module:components/meshes.Shape#defaults
* @static
* @default <pre>
* {
* geometry: {
* shapes: []
* }
* </pre>
*/
/**
* Instructions
* @member {Object} module:components/meshes.Shape#instructions
* @static
* @default <pre>
* {
* geometry: ['shapes']
* }
* </pre>
*/
function Shape$$1() {
var _this;
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
classCallCheck(this, Shape$$1);
_this = possibleConstructorReturn(this, getPrototypeOf$2(Shape$$1).call(this, params, Shape$$1.defaults, Shape$$1.instructions));
if (params.build) {
_this.build(params);
get$3(getPrototypeOf$2(Shape$$1.prototype), "wrap", assertThisInitialized(_this)).call(assertThisInitialized(_this));
}
return _this;
}
/**
* @method build
* @description Build lifecycle creates a mesh using input params.
* @param {Object} params Component parameters.
* @return {THREE.Mesh} Built mesh
* @memberof module:components/meshes.Shape
*/
createClass(Shape$$1, [{
key: "build",
value: function build() {
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.params;
var _this$applyBridge = this.applyBridge({
geometry: this.buildGeometry(params),
material: params.material
}),
geometry = _this$applyBridge.geometry,
material = _this$applyBridge.material;
return this.applyBridge({
mesh: new Mesh(geometry, material)
}).mesh;
}
}, {
key: "buildGeometry",
value: function buildGeometry() {
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
return new (params.buffer ? ShapeBufferGeometry : ShapeGeometry)(params.geometry.shapes);
}
}]);
inherits(Shape$$1, _MeshComponent);
return Shape$$1;
}(MeshComponent);
defineProperty$3(defineProperty$3(Shape$1, "defaults", objectSpread({}, MeshComponent.defaults, {
geometry: {
shapes: []
}
})), "instructions", objectSpread({}, MeshComponent.instructions, {
geometry: ['shapes']
}));
/**
* @class Sphere
* @category components/meshes
* @description Sphere class is used to create sphere objects by its radius property and other values that determines its detality.
* <br/><br/>
* It is similar to THREE.SphereGeometry, but it also contains all `Shape` properties, such as material, mass and vectors like position (pos) and rotation (rot).
* <br/><br/>
* Then it creates an `Three.js mesh` or a `Physijs mesh`, that is similar to `Three.js mesh`, but it also take into consideration collision calculations.
* This mesh is a combination of `Three.js geometry` and `Physijs material` (The same as in three.js, but with friction and restitution).
* @classDesc
* <iframe src="https://threejs.org/docs/scenes/geometry-browser.html#SphereGeometry"></iframe>
* @param {Object} [params] - The params.
* @extends module:core.MeshComponent
* @memberof module:components/meshes
* @example <caption>Creating a Sphere, and adding it to app</caption>
* new Sphere({
* geometry: {
* radius: 2
* },
*
* material: new THREE.MeshBasicMaterial({
* color: 0xffffff
* }),
*
* position: {
* y: 100
* }
* }).addTo(app);
*/
var Sphere$1 =
/*#__PURE__*/
function (_MeshComponent) {
/**
* Default values for parameters
* @member {Object} module:components/meshes.Sphere#defaults
* @static
* @default <pre>
* {
* geometry: {
* radius: 1,
* widthSegments: 8,
* heightSegments: 6
* }
* </pre>
*/
/**
* Instructions
* @member {Object} module:components/meshes.Sphere#instructions
* @static
* @default <pre>
* {
* geometry: ['radius', 'widthSegments', 'heightSegments']
* }
* </pre>
*/
function Sphere$$1() {
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
classCallCheck(this, Sphere$$1);
return possibleConstructorReturn(this, getPrototypeOf$2(Sphere$$1).call(this, params, Sphere$$1.defaults, Sphere$$1.instructions));
}
/**
* @method build
* @description Build lifecycle creates a mesh using input params.
* @param {Object} params Component parameters.
* @return {THREE.Mesh} Built mesh
* @memberof module:components/meshes.Sphere
*/
createClass(Sphere$$1, [{
key: "build",
value: function build() {
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.params;
var _this$applyBridge = this.applyBridge({
geometry: this.buildGeometry(params),
material: params.material
}),
geometry = _this$applyBridge.geometry,
material = _this$applyBridge.material;
return this.applyBridge({
mesh: new Mesh(geometry, material)
}).mesh;
}
}, {
key: "buildGeometry",
value: function buildGeometry() {
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var geometry = new (params.buffer ? SphereBufferGeometry : SphereGeometry)(params.geometry.radius, params.geometry.widthSegments, params.geometry.heightSegments);
return geometry;
}
}]);
inherits(Sphere$$1, _MeshComponent);
return Sphere$$1;
}(MeshComponent);
defineProperty$3(defineProperty$3(Sphere$1, "defaults", objectSpread({}, MeshComponent.defaults, {
geometry: {
radius: 1,
widthSegments: 8,
heightSegments: 6
}
})), "instructions", objectSpread({}, MeshComponent.instructions, {
geometry: ['radius', 'widthSegments', 'heightSegments']
}));
/**
* @class Tetrahedron
* @category components/meshes
* @description In geometry, a tetrahedron is a polyhedron composed of four triangular faces, six straight edges, and four vertex corners.
* The tetrahedron is the simplest of all the ordinary convex polyhedra and the only one that has fewer than 5 faces.
* <br/><br/>
* `Tetrahedron` creates a Tetrahedron object by its `radius` and `detail`
* @classDesc
* <iframe src="https://threejs.org/docs/scenes/geometry-browser.html#TetrahedronGeometry"></iframe>
* @param {Object} [params] - The params.
* @extends module:core.MeshComponent
* @memberof module:components/meshes
* @example <caption>Creating a Tetrahedron, and adding it to app</caption>
* new Tetrahedron({
* geometry: {
* radius: 2,
* detail: 1
* },
*
* material: new THREE.MeshBasicMaterial({
* color: 0xffffff
* }),
*
* position: {
* x: 0,
* y: 100,
* z: 0
* }
* }).addTo(app);
*/
var Tetrahedron =
/*#__PURE__*/
function (_MeshComponent) {
/**
* Default values for parameters
* @member {Object} module:components/meshes.Tetrahedron#defaults
* @static
* @default <pre>
* {
* geometry: {
* radius: 1,
* detail: 0
* }
* </pre>
*/
/**
* Instructions
* @member {Object} module:components/meshes.Tetrahedron#instructions
* @static
* @default <pre>
* {
* geometry: ['radius', 'detail']
* }
* </pre>
*/
function Tetrahedron() {
var _this;
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
classCallCheck(this, Tetrahedron);
_this = possibleConstructorReturn(this, getPrototypeOf$2(Tetrahedron).call(this, params, Tetrahedron.defaults, Tetrahedron.instructions));
if (params.build) {
_this.build(params);
get$3(getPrototypeOf$2(Tetrahedron.prototype), "wrap", assertThisInitialized(_this)).call(assertThisInitialized(_this));
}
return _this;
}
/**
* @method build
* @description Build lifecycle creates a mesh using input params.
* @param {Object} params Component parameters.
* @return {THREE.Mesh} Built mesh
* @memberof module:components/meshes.Tetrahedron
*/
createClass(Tetrahedron, [{
key: "build",
value: function build() {
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.params;
var _this$applyBridge = this.applyBridge({
geometry: this.buildGeometry(params),
material: params.material
}),
geometry = _this$applyBridge.geometry,
material = _this$applyBridge.material;
return this.applyBridge({
mesh: new Mesh(geometry, material)
}).mesh;
}
}, {
key: "buildGeometry",
value: function buildGeometry() {
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
return new (params.buffer ? TetrahedronBufferGeometry : TetrahedronGeometry)(params.geometry.radius, params.geometry.detail);
}
}]);
inherits(Tetrahedron, _MeshComponent);
return Tetrahedron;
}(MeshComponent);
defineProperty$3(defineProperty$3(Tetrahedron, "defaults", objectSpread({}, MeshComponent.defaults, {
geometry: {
radius: 1,
detail: 0
}
})), "instructions", objectSpread({}, MeshComponent.instructions, {
geometry: ['radius', 'detail']
}));
/**
* @class Text
* @category components/meshes
* @description Text class is made for creating 3D text objects.
* @classDesc
* <iframe src="https://threejs.org/docs/scenes/geometry-browser.html#TextGeometry"></iframe>
* <br/><br/>
* Physics text object can be convex or concave. By default it's convex but you can also switch to concave.
* @param {Object} [params] - The params.
* @extends module:core.MeshComponent
* @memberof module:components/meshes
* @example <caption>Creating a Text, and adding it to app</caption>
* new Text({
* text: 'Some text',
* parameters: {
* font: 'path/to/font.typeface.js',
* size: 20,
* height: 5,
* curveSegments: 6
* }
* },
*
* material: new THREE.MeshBasicMaterial({
* color: 0xffffff
* }),
*
* position: {
* x: -40,
* y: 20,
* z: 0
* }
* }).addTo(app);
*/
var Text =
/*#__PURE__*/
function (_MeshComponent) {
createClass(Text, null, [{
key: "load",
/**
* Default values for parameters
* @member {Object} module:components/meshes.Text#defaults
* @static
* @default <pre>
* {
* text: 'Hello World!',
* font: null,
*
* geometry: {
* size: 12,
* height: 50,
* curveSegments: 12,
* font: new Font(),
* bevelEnabled: false,
* bevelThickness: 10,
* bevelSize: 8
* }
* }
* </pre>
*/
/**
* Default FontLoader
* @member {Object} module:components/meshes.Text#loader
* @static
* @default new FontLoader()
*/
/**
* @method load
* @static
* @description load() preloads a Font object and returns a Promise with it.
* @param {String} path Path to the font
* @return {Promise} A promise resolved with a font
* @memberof module:components/meshes.Text
*/
value: function load(path) {
var loader = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Text.loader;
return new Promise(function (resolve) {
loader.load(path, resolve);
});
}
}]);
function Text() {
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
classCallCheck(this, Text);
return possibleConstructorReturn(this, getPrototypeOf$2(Text).call(this, params, Text.defaults, Text.instructions));
}
/**
* @method build
* @description Build is called as part of the lifecycle to create a mesh using input params.
* @param {Object} params Component parameters.
* @return {THREE.Mesh} Built mesh
* @memberof module:components/meshes.Text
*/
createClass(Text, [{
key: "build",
value: function build() {
var _this = this;
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.params;
var promise = new Promise(function (resolve) {
(params.font instanceof Promise ? params.font : Promise.resolve(params.font)).then(function (font) {
var _this$applyBridge = _this.applyBridge({
geometry: new TextGeometry(params.text, Object.assign(params.geometry, {
font: font
})),
material: params.material
}),
geometry = _this$applyBridge.geometry,
material = _this$applyBridge.material;
resolve(_this.applyBridge({
mesh: new Mesh(geometry, material)
}).mesh);
});
});
get$3(getPrototypeOf$2(Text.prototype), "wait", this).call(this, promise);
return promise;
}
}]);
inherits(Text, _MeshComponent);
return Text;
}(MeshComponent);
defineProperty$3(defineProperty$3(defineProperty$3(Text, "defaults", objectSpread({}, MeshComponent.defaults, {
text: 'Hello World!',
font: null,
geometry: {
size: 12,
height: 50,
curveSegments: 12,
font: new Font(),
bevelEnabled: false,
bevelThickness: 10,
bevelSize: 8
}
})), "instructions", objectSpread({}, MeshComponent.instructions)), "loader", new FontLoader());
/**
* @class Torus
* @category components/meshes
* @description Torus class makes a torus figure. A donut is a torus.
* @classDesc
* <iframe src="https://threejs.org/docs/index.html#api/geometries/TorusGeometry"></iframe>
* @param {Object} [params] - The params.
* @extends module:core.MeshComponent
* @memberof module:components/meshes
* @example <caption>Creating a Torus, and adding it to app</caption>
* new Torus({
* geometry: {
* radius: 5,
* tube: 2
* },
*
* material: new THREE.MeshBasicMaterial({
* color: 0xffffff
* }),
*
* position: {
* y: 35
* }
* }).addTo(app);
*/
var Torus =
/*#__PURE__*/
function (_MeshComponent) {
/**
* Default values for parameters
* @member {Object} module:components/meshes.Torus#defaults
* @static
* @default <pre>
* {
* geometry: {
* radius: 100,
* tube: 40,
* radialSegments: 8,
* tubularSegments: 6,
* arc: Math.PI * 2
* }
* }
* </pre>
*/
/**
* Instructions
* @member {Object} module:components/meshes.Torus#instructions
* @static
* @default <pre>
* {
* geometry: [
* 'radius',
* 'tube',
* 'radialSegments',
* 'tubularSegments',
* 'arc'
* ]
* }
* </pre>
*/
function Torus() {
var _this;
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
classCallCheck(this, Torus);
_this = possibleConstructorReturn(this, getPrototypeOf$2(Torus).call(this, params, Torus.defaults, Torus.instructions));
if (params.build) {
_this.build(params);
get$3(getPrototypeOf$2(Torus.prototype), "wrap", assertThisInitialized(_this)).call(assertThisInitialized(_this));
}
return _this;
}
/**
* @method build
* @description Build lifecycle creates a mesh using input params.
* @param {Object} params Component parameters.
* @return {THREE.Mesh} Built mesh
* @memberof module:components/meshes.Torus
*/
createClass(Torus, [{
key: "build",
value: function build() {
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.params;
var _this$applyBridge = this.applyBridge({
geometry: this.buildGeometry(params),
material: params.material
}),
geometry = _this$applyBridge.geometry,
material = _this$applyBridge.material;
return this.applyBridge({
mesh: new Mesh(geometry, material)
}).mesh;
}
}, {
key: "buildGeometry",
value: function buildGeometry() {
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
return new TorusGeometry(params.geometry.radius, params.geometry.tube, params.geometry.radialSegments, params.geometry.tubularSegments, params.geometry.arc);
}
}]);
inherits(Torus, _MeshComponent);
return Torus;
}(MeshComponent);
defineProperty$3(defineProperty$3(Torus, "defaults", objectSpread({}, MeshComponent.defaults, {
geometry: {
radius: 100,
tube: 40,
radialSegments: 8,
tubularSegments: 6,
arc: Math.PI * 2
}
})), "instructions", objectSpread({}, MeshComponent.instructions, {
geometry: ['radius', 'tube', 'radialSegments', 'tubularSegments', 'arc']
}));
/**
* @class Torusknot
* @category components/meshes
* @description Torusknot class makes a torusknot figure. It's like a crooked donut, very crooked.
* @classDesc
* <iframe src="https://threejs.org/docs/scenes/geometry-browser.html#TorusKnotGeometry"></iframe>
* @param {Object} [params] - The params.
* @extends module:core.MeshComponent
* @memberof module:components/meshes
* @example <caption>Creating a Torusknot, and adding it to app</caption>
* new Torusknot({
* geometry: {
* radius:5,
* tube: 2
* },
*
* material: new THREE.MeshBasicMaterial({
* color: 0xffffff
* }),
*
* pos: {
* y: 100
* }
* }).addTo(app);
*/
var Torusknot =
/*#__PURE__*/
function (_MeshComponent) {
/**
* Default values for parameters
* @member {Object} module:components/meshes.Torusknot#defaults
* @static
* @default <pre>
* {
* geometry: {
* radius: 100,
* tube: 40,
* radialSegments: 64,
* tubularSegments: 8,
* p: 2,
* q: 3
* }
* }
* </pre>
*/
/**
* Instructions
* @member {Object} module:components/meshes.Torusknot#instructions
* @static
* @default <pre>
* {
* geometry: [
* 'radius',
* 'tube',
* 'radialSegments',
* 'tubularSegments',
* 'p',
* 'q'
* ]
* }
* </pre>
*/
function Torusknot() {
var _this;
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
classCallCheck(this, Torusknot);
_this = possibleConstructorReturn(this, getPrototypeOf$2(Torusknot).call(this, params, Torusknot.defaults, Torusknot.instructions));
if (params.build) {
_this.build(params);
get$3(getPrototypeOf$2(Torusknot.prototype), "wrap", assertThisInitialized(_this)).call(assertThisInitialized(_this));
}
return _this;
}
/**
* @method build
* @description Build lifecycle creates a mesh using input params.
* @param {Object} params Component parameters.
* @return {THREE.Mesh} Built mesh
* @memberof module:components/meshes.Torusknot
*/
createClass(Torusknot, [{
key: "build",
value: function build() {
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.params;
var _this$applyBridge = this.applyBridge({
geometry: this.buildGeometry(params),
material: params.material
}),
geometry = _this$applyBridge.geometry,
material = _this$applyBridge.material;
return this.applyBridge({
mesh: new Mesh(geometry, material)
}).mesh;
}
}, {
key: "buildGeometry",
value: function buildGeometry() {
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var GConstruct = params.buffer ? TorusKnotBufferGeometry : TorusKnotGeometry;
return new GConstruct(params.geometry.radius, params.geometry.tube, params.geometry.radialSegments, params.geometry.tubularSegments, params.geometry.p, params.geometry.q);
}
}]);
inherits(Torusknot, _MeshComponent);
return Torusknot;
}(MeshComponent);
defineProperty$3(defineProperty$3(Torusknot, "defaults", objectSpread({}, MeshComponent.defaults, {
geometry: {
radius: 100,
tube: 40,
radialSegments: 64,
tubularSegments: 8,
p: 2,
q: 3
}
})), "instructions", objectSpread({}, MeshComponent.instructions, {
geometry: ['radius', 'tube', 'radialSegments', 'tubularSegments', 'p', 'q']
}));
/**
* @class Tube
* @category components/meshes
* @description Tube class makes a tube that extrudes along a 3d curve.
* @classDesc
* <iframe src="https://threejs.org/docs/index.html#api/geometries/TubeGeometry"></iframe>
* @param {Object} [params] - The params.
* @extends module:core.MeshComponent
* @memberof module:components/meshes
* @example <caption>Creating a Tube from a three.js Curve, and adding it to app</caption>
* const CustomSinCurve = THREE.Curve.create(
* function (scale) { // custom curve constructor
* this.scale = (scale === undefined) ? 1 : scale;
* },
*
* function (t) { // getPoint: t is between 0-1
* const tx = t * 3 - 1.5,
* ty = Math.sin( 2 * Math.PI * t ),
* tz = 0;
*
* return new THREE.Vector3(tx, ty, tz).multiplyScalar(this.scale);
* }
* );
*
* const path = new CustomSinCurve(10);
*
* new Tube({
* geometry: {
* path: path
* },
*
* material: new THREE.MeshBasicMaterial({
* color: 0xffffff
* })
* }).addTo(app);
*/
var Tube =
/*#__PURE__*/
function (_MeshComponent) {
/**
* Default values for parameters
* @member {Object} module:components/meshes.Tube#defaults
* @static
* @default <pre>
* {
* geometry: {
* path: new THREE.LineCurve3(new Vector3(0, 0, 0), new Vector3(0, 0, 1)),
* segments: 20,
* radius: 2,
* radiusSegments: 8,
* closed: false
* }
* }
* </pre>
*/
/**
* Instructions
* @member {Object} module:components/meshes.Tube#instructions
* @static
* @default <pre>
* {
* geometry: [
* 'path',
* 'segments',
* 'radius',
* 'radiusSegments',
* 'closed'
* ]
* }
* </pre>
*/
function Tube() {
var _this;
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
classCallCheck(this, Tube);
_this = possibleConstructorReturn(this, getPrototypeOf$2(Tube).call(this, params, Tube.defaults, Tube.instructions));
if (params.build) {
_this.build(params);
get$3(getPrototypeOf$2(Tube.prototype), "wrap", assertThisInitialized(_this)).call(assertThisInitialized(_this));
}
return _this;
}
/**
* @method build
* @description Build lifecycle creates a mesh using input params.
* @param {Object} params Component parameters.
* @return {THREE.Mesh} Built mesh
* @memberof module:components/meshes.Tube
*/
createClass(Tube, [{
key: "build",
value: function build() {
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.params;
var _this$applyBridge = this.applyBridge({
geometry: this.buildGeometry(params),
material: params.material
}),
geometry = _this$applyBridge.geometry,
material = _this$applyBridge.material;
return this.applyBridge({
mesh: new Mesh(geometry, material)
}).mesh;
}
}, {
key: "buildGeometry",
value: function buildGeometry() {
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var geometry = new (params.buffer ? TubeBufferGeometry : TubeGeometry)(params.geometry.path, params.geometry.segments, params.geometry.radius, params.geometry.radiusSegments, params.geometry.closed);
return geometry;
}
}]);
inherits(Tube, _MeshComponent);
return Tube;
}(MeshComponent);
defineProperty$3(defineProperty$3(Tube, "defaults", objectSpread({}, MeshComponent.defaults, {
geometry: {
path: new LineCurve3(new Vector3(0, 0, 0), new Vector3(0, 0, 1)),
segments: 20,
radius: 2,
radiusSegments: 8,
closed: false
}
})), "instructions", objectSpread({}, MeshComponent.instructions, {
geometry: ['path', 'segments', 'radius', 'radiusSegments', 'closed']
}));
/**
* @class Group
* @category components/meshes
* @description Sometimes you need to make groups of objects (it's not conveniently to apply transforms to each object when can make just one to a group).<br/>
* In Three.js you make it using `THREE.Object3D` and it's children. <br/><br/>
* In whs.js we have `Group`
* @extends module:core.MeshComponent
* @memberof module:components/meshes
* @example <caption>Approach 2 - Adding objects to an empty group</caption>
* const sphere = new Sphere();
* const box = new Box();
* const group = new Group();
*
* sphere.addTo(group);
* box.addTo(group);
* @example <caption>Approach 2 - Making a group from objects</caption>
* const sphere = new Sphere();
* const box = new Box();
* const group = new Group(box, sphere);
* // OR: const group = new Group([box, sphere]);
*/
var Group$1 =
/*#__PURE__*/
function (_MeshComponent) {
function Group$$1() {
var _this;
classCallCheck(this, Group$$1);
_this = possibleConstructorReturn(this, getPrototypeOf$2(Group$$1).call(this, {}));
for (var i = 0; i < arguments.length; i++) {
var obj = i < 0 || arguments.length <= i ? undefined : arguments[i];
if (obj instanceof Component) obj.addTo(assertThisInitialized(assertThisInitialized(_this)));else if (obj instanceof Object3D) _this.native.add(obj);
}
return _this;
}
createClass(Group$$1, [{
key: "build",
value: function build() {
return new Object3D();
}
}]);
inherits(Group$$1, _MeshComponent);
return Group$$1;
}(MeshComponent);
/** @module components/meshes */
/**
* @class ElementModule
* @category modules/app
* @param {Object} [container=document.body] container is the DOM object to which application's canvas will be added to.
* @memberof module:modules/app
* @example <caption>Creating an element module, passing it to the App</caption>
* new App([
* new ElementModule(document.getElementById('app'))
* ]);
*/
var ElementModule =
/*#__PURE__*/
function () {
function ElementModule() {
var container = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : document.body;
classCallCheck(this, ElementModule);
if (container.container) {
console.warn('ElementModule now accepts only argument which is a DOM object, not a params object.');
this.container = container.container;
} else this.container = container;
this.createElement();
}
/**
* @method createElement
* @instance
* @description Creates a canvas element.
* @memberof module:modules/app.ElementModule
*/
createClass(ElementModule, [{
key: "createElement",
value: function createElement() {
this.element = window.document.createElement('div');
this.element.className = 'whs-app';
this.element.style.width = 'inherit';
this.element.style.height = 'inherit';
this.element.style.position = 'relative';
}
}, {
key: "manager",
value: function manager(_manager) {
_manager.set('element', this.element);
_manager.set('container', this.container);
}
}, {
key: "integrate",
value: function integrate(self) {
self.container.appendChild(self.element);
}
}]);
return ElementModule;
}();
/**
* @class RenderingModule
* @category modules/app
* @param {Object} [params]
* @memberof module:modules/app
* @example <caption> Creating a rendering module and passing it to App's modules</caption>
* new App([
* new ElementModule(),
* new SceneModule(),
* new DefineModule('camera', new PerspectiveCamera({
* position: new THREE.Vector3(0, 6, 18),
* far: 10000
* })),
* new RenderingModule({
* bgColor: 0x162129,
*
* renderer: {
* antialias: true
* }
* }, {shadow: true})
* ]);
*/
var RenderingModule =
/*#__PURE__*/
function () {
/**
* additional
* @description collection of additional scripts
* @static
* @member {Object} module:core.App#additional
* @public
*/
/**
* enabled
* @static
* @member {Boolean} module:core.App#enabled
* @public
*/
function RenderingModule() {
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var additional = arguments.length > 1 ? arguments[1] : undefined;
classCallCheck(this, RenderingModule);
defineProperty$3(this, "enabled", true);
this.params = Object.assign({
width: window.innerWidth,
height: window.innerHeight,
resolution: new Vector2(1, 1),
pixelRatio: window.devicePixelRatio,
bgColor: 0x000000,
bgOpacity: 1,
renderer: {},
fix: function fix() {}
}, params);
var _this$params = this.params,
bgColor = _this$params.bgColor,
bgOpacity = _this$params.bgOpacity,
_renderer = _this$params.renderer,
pixelRatio = _this$params.pixelRatio,
width = _this$params.width,
height = _this$params.height,
resolution = _this$params.resolution,
fix = _this$params.fix;
this.renderer = new WebGLRenderer(_renderer);
this.effects = [];
this.renderer.setClearColor(bgColor, bgOpacity);
if (pixelRatio) this.renderer.setPixelRatio(pixelRatio);
this.setSize(Number(width * resolution.x).toFixed(), Number(height * resolution.y).toFixed());
for (var key in additional) {
if (additional[key]) this.applyAdditional(key);
}
fix(this.renderer);
}
/**
* @method applyAdditional
* @description Apply additional script from RenderingModule.additional
* @param {Stirng} name Script name
* @return {this}
* @memberof module:modules/app.RenderingModule
*/
createClass(RenderingModule, [{
key: "applyAdditional",
value: function applyAdditional(name) {
RenderingModule.additional[name].apply(this, [this.renderer]);
}
/**
* @method integrateRenderer
* @description Integrate renderer
* @param {NodeElement} element DOM object
* @param {THREE.Scene} scene used scene
* @param {THREE.Camera} camera used camera
* @return {Loop} renderLoop
* @memberof module:modules/app.RenderingModule
*/
}, {
key: "integrateRenderer",
value: function integrateRenderer(element, scene, camera) {
var _this = this;
this.scene = scene;
this.camera = camera;
this.attachToCanvas(element);
return new Loop(function () {
return _this.renderer.render(_this.scene, _this.camera);
});
}
/**
* @method effect
* @description Add three.js effect
* @param {Object} effect three.js effect
* @param {function} effectLoop update function for effect
* @return {this}
* @memberof module:modules/app.RenderingModule
*/
}, {
key: "effect",
value: function effect(_effect) {
var _this2 = this;
var effectLoop = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {
_effect.render(_this2.scene, _this2.camera);
};
this.renderLoop.stop();
var size = this.renderer.getSize();
_effect.setSize(size.width, size.height);
var loop = new Loop(effectLoop);
this.effects.push(loop);
if (this.enabled) loop.start(this.app);
return this;
}
/**
* @method setSize
* @description Update render target width and height.
* @param {Number} width
* @param {Number} height
* @memberof module:modules/app.RenderingModule
*/
}, {
key: "setSize",
value: function setSize(width, height) {
if (this.renderer) this.renderer.setSize(width, height);
}
/**
* @method attachToCanvas
* @description Attach renderer.domElement to element
* @param {NodeElement} element DOM object
* @memberof module:modules/app.RenderingModule
*/
}, {
key: "attachToCanvas",
value: function attachToCanvas(element) {
var canvas = this.renderer.domElement; // attach to new parent world dom
element.appendChild(canvas);
canvas.style.width = '100%';
canvas.style.height = '100%';
}
/**
* @method stop
* @description Stops renderLoop and effect loops
* @memberof module:modules/app.RenderingModule
*/
}, {
key: "stop",
value: function stop() {
this.enabled = false;
this.renderLoop.stop();
this.effects.forEach(function (loop) {
return loop.stop();
});
}
/**
* @method play
* @description Resumes renderLoop and effect loops
* @memberof module:modules/app.RenderingModule
*/
}, {
key: "play",
value: function play() {
this.enabled = true;
this.renderLoop.start();
this.effects.forEach(function (loop) {
return loop.start();
});
}
}, {
key: "manager",
value: function manager(_manager) {
var _this3 = this;
_manager.define('rendering');
_manager.set('renderer', this.renderer);
this.app = _manager.handler;
this.renderLoop = this.integrateRenderer(_manager.get('element'), _manager.get('scene'), _manager.get('camera').native);
_manager.update({
element: function element(_element) {
_this3.attachToCanvas(_element);
},
scene: function scene(_scene) {
_this3.scene = _scene;
},
camera: function camera(_camera) {
_this3.camera = _camera.native;
}
});
}
}, {
key: "integrate",
value: function integrate(self) {
var _this4 = this;
self.renderLoop.start(this);
self.effects.forEach(function (loop) {
return loop.start(_this4);
});
}
/**
* @method dispose
* @description Dispose rendering context
* @memberof module:modules/app.RenderingModule
*/
}, {
key: "dispose",
value: function dispose() {
this.stop();
this.renderer.forceContextLoss();
}
}]);
return RenderingModule;
}();
defineProperty$3(RenderingModule, "additional", {
shadow: function shadow(renderer) {
renderer.shadowMap.enabled = true;
}
});
var SYMBOL_CHILDREN_FOR_SCENE = Symbol('SYMBOL_CHILDREN_FOR_SCENE');
/**
* @class SceneModule
* @category modules/app
* @param {Boolean} [willSceneBeReplaced=false] willSceneBeReplaced should be true only if you are going to overwrite scene dependency even without the use of default one.
* @memberof module:modules/app
*/
var SceneModule =
/*#__PURE__*/
function () {
function SceneModule() {
var willSceneBeReplaced = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
classCallCheck(this, SceneModule);
this.scene = willSceneBeReplaced ? null : new Scene();
}
createClass(SceneModule, [{
key: "manager",
value: function manager(_manager) {
_manager.set('scene', this.scene);
}
}, {
key: "integrate",
value: function integrate(self) {
Object.assign(this, {
add: function () {
var _add = asyncToGenerator(
/*#__PURE__*/
regenerator.mark(function _callee(object) {
return regenerator.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
if (!object.parent) {
_context.next = 3;
break;
}
_context.next = 3;
return object.parent.remove(object);
case 3:
_context.next = 5;
return object.wait();
case 5:
if (object.native) {
_context.next = 7;
break;
}
throw new CompositionError('SceneModule', 'there is no object.native', this);
case 7:
object.parent = this;
_context.next = 10;
return this.applyBridge({
onAdd: object
}).onAdd;
case 10:
self.scene.add(object.native);
this.children.push(object);
return _context.abrupt("return", object);
case 13:
case "end":
return _context.stop();
}
}
}, _callee, this);
}));
return function add(_x) {
return _add.apply(this, arguments);
};
}(),
remove: function () {
var _remove = asyncToGenerator(
/*#__PURE__*/
regenerator.mark(function _callee2(object) {
return regenerator.wrap(function _callee2$(_context2) {
while (1) {
switch (_context2.prev = _context2.next) {
case 0:
if (!(object.parent !== this)) {
_context2.next = 2;
break;
}
return _context2.abrupt("return");
case 2:
_context2.next = 4;
return object.wait();
case 4:
this.applyBridge({
onRemove: object
});
object.parent = null;
self.scene.remove(object.native);
this.children.splice(this.children.indexOf(object), 1);
case 8:
case "end":
return _context2.stop();
}
}
}, _callee2, this);
}));
return function remove(_x2) {
return _remove.apply(this, arguments);
};
}(),
_setScene: function _setScene(scene) {
this.children = scene[SYMBOL_CHILDREN_FOR_SCENE] = scene[SYMBOL_CHILDREN_FOR_SCENE] || [];
self.scene = scene;
},
setScene: function setScene(scene) {
this._setScene(scene);
this.manager.set('scene', scene);
},
getScene: function getScene() {
return self.scene;
}
});
if (self.scene) this._setScene(self.scene);
}
}]);
return SceneModule;
}();
// import {addResizeListener} from 'detect-element-resize';
/**
* @class ResizeModule
* @category modules/app
* @param {Object} [params={auto: true}] - If auto is set to true - resize will be triggered when container resizes
* @memberof module:modules/app
*/
var ResizeModule =
/*#__PURE__*/
function () {
function ResizeModule() {
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
classCallCheck(this, ResizeModule);
this.params = Object.assign({
auto: true
}, params);
this.callbacks = [this.setSize.bind(this)];
}
/**
* @function setSize
* @instance
* @description This function sets the provided width & height to the renderer object.
* @param {Number} [width=1] - The promise that should be added to a queue.
* @param {Number} [height=1] - that is resolved when all promises completed.
* @memberof module:modules/app.ResizeModule
*/
createClass(ResizeModule, [{
key: "setSize",
value: function setSize() {
var width = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1;
var height = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
this.camera.native.aspect = width / height;
this.camera.native.updateProjectionMatrix();
if (this.rendering) this.rendering.setSize(width, height);
}
/**
* @method trigger
* @instance
* @description Triggers resize when called. width & height are determined automatically
* This invokes each callbacks with the new width and height as params
* @memberof module:modules/app.ResizeModule
*/
}, {
key: "trigger",
value: function trigger() {
var _this$container = this.container,
offsetWidth = _this$container.offsetWidth,
offsetHeight = _this$container.offsetHeight,
resolution = this.resolution;
var width = Number(offsetWidth * resolution.x).toFixed();
var height = Number(offsetHeight * resolution.y).toFixed();
this.callbacks.forEach(function (cb) {
cb(width, height);
});
}
/**
* @method addAutoresize
* @instance
* @description Sets module to autoresize, this adds an event listene on window resize to trigger the resize
* @memberof module:modules/app.ResizeModule
*/
}, {
key: "addAutoresize",
value: function addAutoresize() {
this.container = this.getContainer();
this.resolution = this.getResolution();
if (this.params.auto) window.addEventListener('resize', this.trigger.bind(this));
}
/**
* @method addCallback
* @instance
* @description Adds a call back function to the existing callbacks list.
* @param {Function} func - The callback function to add
* @memberof module:modules/app.ResizeModule
*/
}, {
key: "addCallback",
value: function addCallback(func) {
this.callbacks.push(func);
}
}, {
key: "manager",
value: function manager(_manager) {
var _this = this;
_manager.define('resize');
this.rendering = _manager.get('renderer');
this.camera = _manager.get('camera');
this.getResolution = function () {
return _manager.use('rendering').params.resolution;
};
this.getContainer = function () {
return _manager.get('container');
};
_manager.update({
container: function container(_container) {
_this.container = _container;
}
});
this.addAutoresize();
}
}]);
return ResizeModule;
}();
var fragment = "uniform sampler2D tPreviousLum;\r\nuniform sampler2D tCurrentLum;\r\nuniform float minLuminance;\r\nuniform float delta;\r\nuniform float tau;\r\n\r\nvarying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tfloat previousLum = texture2D(tPreviousLum, vUv, MIP_LEVEL_1X1).r;\r\n\tfloat currentLum = texture2D(tCurrentLum, vUv, MIP_LEVEL_1X1).r;\r\n\r\n\tpreviousLum = max(minLuminance, previousLum);\r\n\tcurrentLum = max(minLuminance, currentLum);\r\n\r\n\t// Adapt the luminance using Pattanaik's technique.\r\n\tfloat adaptedLum = previousLum + (currentLum - previousLum) * (1.0 - exp(-delta * tau));\r\n\r\n\tgl_FragColor.r = adaptedLum;\r\n\r\n}\r\n";
var vertex = "varying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n";
/**
* An adaptive luminosity shader material.
*/
var AdaptiveLuminosityMaterial =
/*#__PURE__*/
function (_ShaderMaterial) {
/**
* Constructs a new adaptive luminosity material.
*/
function AdaptiveLuminosityMaterial() {
classCallCheck(this, AdaptiveLuminosityMaterial);
return possibleConstructorReturn(this, getPrototypeOf$2(AdaptiveLuminosityMaterial).call(this, {
type: "AdaptiveLuminosityMaterial",
defines: {
MIP_LEVEL_1X1: "0.0"
},
uniforms: {
tPreviousLum: new Uniform(null),
tCurrentLum: new Uniform(null),
minLuminance: new Uniform(0.01),
delta: new Uniform(0.0),
tau: new Uniform(1.0)
},
fragmentShader: fragment,
vertexShader: vertex,
depthWrite: false,
depthTest: false
}));
}
inherits(AdaptiveLuminosityMaterial, _ShaderMaterial);
return AdaptiveLuminosityMaterial;
}(ShaderMaterial);
var fragment$1 = "uniform sampler2D tDiffuse;\r\nuniform sampler2D tDepth;\r\n\r\nuniform float focus;\r\nuniform float dof;\r\nuniform float aspect;\r\nuniform float aperture;\r\nuniform float maxBlur;\r\n\r\nvarying vec2 vUv;\r\n\r\n#ifndef USE_LOGDEPTHBUF\r\n\r\n\t#include <packing>\r\n\r\n\tuniform float cameraNear;\r\n\tuniform float cameraFar;\r\n\r\n\tfloat readDepth(sampler2D depthSampler, vec2 coord) {\r\n\r\n\t\tfloat fragCoordZ = texture2D(depthSampler, coord).x;\r\n\t\tfloat viewZ = perspectiveDepthToViewZ(fragCoordZ, cameraNear, cameraFar);\r\n\r\n\t\treturn viewZToOrthographicDepth(viewZ, cameraNear, cameraFar);\r\n\r\n\t}\r\n\r\n#endif\r\n\r\nvoid main() {\r\n\r\n\tvec2 aspectCorrection = vec2(1.0, aspect);\r\n\r\n\t#ifdef USE_LOGDEPTHBUF\r\n\r\n\t\tfloat depth = texture2D(tDepth, vUv).x;\r\n\r\n\t#else\r\n\r\n\t\tfloat depth = readDepth(tDepth, vUv);\r\n\r\n\t#endif\r\n\r\n\tfloat focusNear = clamp(focus - dof, 0.0, 1.0);\r\n\tfloat focusFar = clamp(focus + dof, 0.0, 1.0);\r\n\r\n\t// Calculate a DoF mask.\r\n\tfloat low = step(depth, focusNear);\r\n\tfloat high = step(focusFar, depth);\r\n\r\n\tfloat factor = (depth - focusNear) * low + (depth - focusFar) * high;\r\n\r\n\tvec2 dofBlur = vec2(clamp(factor * aperture, -maxBlur, maxBlur));\r\n\r\n\tvec2 dofblur9 = dofBlur * 0.9;\r\n\tvec2 dofblur7 = dofBlur * 0.7;\r\n\tvec2 dofblur4 = dofBlur * 0.4;\r\n\r\n\tvec4 color = vec4(0.0);\r\n\r\n\tcolor += texture2D(tDiffuse, vUv);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.0, 0.4 ) * aspectCorrection) * dofBlur);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.15, 0.37) * aspectCorrection) * dofBlur);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.29, 0.29) * aspectCorrection) * dofBlur);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.37, 0.15) * aspectCorrection) * dofBlur);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.40, 0.0 ) * aspectCorrection) * dofBlur);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.37, -0.15) * aspectCorrection) * dofBlur);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.29, -0.29) * aspectCorrection) * dofBlur);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.15, -0.37) * aspectCorrection) * dofBlur);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.0, -0.4 ) * aspectCorrection) * dofBlur);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.15, 0.37) * aspectCorrection) * dofBlur);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.29, 0.29) * aspectCorrection) * dofBlur);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.37, 0.15) * aspectCorrection) * dofBlur);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.4, 0.0 ) * aspectCorrection) * dofBlur);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.37, -0.15) * aspectCorrection) * dofBlur);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.29, -0.29) * aspectCorrection) * dofBlur);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.15, -0.37) * aspectCorrection) * dofBlur);\r\n\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.15, 0.37) * aspectCorrection) * dofblur9);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.37, 0.15) * aspectCorrection) * dofblur9);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.37, -0.15) * aspectCorrection) * dofblur9);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.15, -0.37) * aspectCorrection) * dofblur9);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.15, 0.37) * aspectCorrection) * dofblur9);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.37, 0.15) * aspectCorrection) * dofblur9);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.37, -0.15) * aspectCorrection) * dofblur9);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.15, -0.37) * aspectCorrection) * dofblur9);\r\n\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.29, 0.29) * aspectCorrection) * dofblur7);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.40, 0.0 ) * aspectCorrection) * dofblur7);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.29, -0.29) * aspectCorrection) * dofblur7);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.0, -0.4 ) * aspectCorrection) * dofblur7);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.29, 0.29) * aspectCorrection) * dofblur7);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.4, 0.0 ) * aspectCorrection) * dofblur7);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.29, -0.29) * aspectCorrection) * dofblur7);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.0, 0.4 ) * aspectCorrection) * dofblur7);\r\n\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.29, 0.29) * aspectCorrection) * dofblur4);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.4, 0.0 ) * aspectCorrection) * dofblur4);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.29, -0.29) * aspectCorrection) * dofblur4);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.0, -0.4 ) * aspectCorrection) * dofblur4);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.29, 0.29) * aspectCorrection) * dofblur4);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.4, 0.0 ) * aspectCorrection) * dofblur4);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.29, -0.29) * aspectCorrection) * dofblur4);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.0, 0.4 ) * aspectCorrection) * dofblur4);\r\n\r\n\tgl_FragColor = color / 41.0;\r\n\r\n}\r\n";
var vertex$1 = "varying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n";
/**
* Depth of Field shader (Bokeh).
*
* Original shader code by Martins Upitis:
* http://artmartinsh.blogspot.com/2010/02/glsl-lens-blur-filter-with-bokeh.html
*/
var BokehMaterial =
/*#__PURE__*/
function (_ShaderMaterial) {
/**
* Constructs a new bokeh material.
*
* @param {PerspectiveCamera} [camera] - A camera.
* @param {Object} [options] - The options.
* @param {Number} [options.focus=1.0] - The focus distance, corresponds directly with the scene depth.
* @param {Number} [options.dof=0.02] - Depth of field. An area in front of and behind the focus point that still appears sharp.
* @param {Number} [options.aperture=0.025] - Camera aperture scale. Bigger values for stronger blur and shallower depth of field.
* @param {Number} [options.maxBlur=1.0] - Maximum blur strength.
*/
function BokehMaterial(camera) {
var _this;
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
classCallCheck(this, BokehMaterial);
var settings = Object.assign({
focus: 1.0,
dof: 0.02,
aperture: 0.025,
maxBlur: 1.0
}, options);
_this = possibleConstructorReturn(this, getPrototypeOf$2(BokehMaterial).call(this, {
type: "BokehMaterial",
uniforms: {
cameraNear: new Uniform(0.1),
cameraFar: new Uniform(2000),
aspect: new Uniform(1.0),
tDiffuse: new Uniform(null),
tDepth: new Uniform(null),
focus: new Uniform(settings.focus),
dof: new Uniform(settings.dof),
aperture: new Uniform(settings.aperture),
maxBlur: new Uniform(settings.maxBlur)
},
fragmentShader: fragment$1,
vertexShader: vertex$1,
depthWrite: false,
depthTest: false
}));
_this.adoptCameraSettings(camera);
return _this;
}
/**
* Adopts the settings of the given camera.
*
* @param {PerspectiveCamera} [camera=null] - A camera.
*/
createClass(BokehMaterial, [{
key: "adoptCameraSettings",
value: function adoptCameraSettings() {
var camera = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
if (camera !== null) {
this.uniforms.cameraNear.value = camera.near;
this.uniforms.cameraFar.value = camera.far;
this.uniforms.aspect.value = camera.aspect;
}
}
}]);
inherits(BokehMaterial, _ShaderMaterial);
return BokehMaterial;
}(ShaderMaterial);
var fragment$2 = "uniform sampler2D tDiffuse;\r\n\r\nvarying vec2 vUv;\r\nvarying vec4 vOffset[3];\r\n\r\nvoid main() {\r\n\r\n\tconst vec2 threshold = vec2(EDGE_THRESHOLD);\r\n\r\n\t// Calculate color deltas.\r\n\tvec4 delta;\r\n\tvec3 c = texture2D(tDiffuse, vUv).rgb;\r\n\r\n\tvec3 cLeft = texture2D(tDiffuse, vOffset[0].xy).rgb;\r\n\tvec3 t = abs(c - cLeft);\r\n\tdelta.x = max(max(t.r, t.g), t.b);\r\n\r\n\tvec3 cTop = texture2D(tDiffuse, vOffset[0].zw).rgb;\r\n\tt = abs(c - cTop);\r\n\tdelta.y = max(max(t.r, t.g), t.b);\r\n\r\n\t// We do the usual threshold.\r\n\tvec2 edges = step(threshold, delta.xy);\r\n\r\n\t// Then discard if there is no edge.\r\n\tif(dot(edges, vec2(1.0)) == 0.0) {\r\n\r\n\t\tdiscard;\r\n\r\n\t}\r\n\r\n\t// Calculate right and bottom deltas.\r\n\tvec3 cRight = texture2D(tDiffuse, vOffset[1].xy).rgb;\r\n\tt = abs(c - cRight);\r\n\tdelta.z = max(max(t.r, t.g), t.b);\r\n\r\n\tvec3 cBottom = texture2D(tDiffuse, vOffset[1].zw).rgb;\r\n\tt = abs(c - cBottom);\r\n\tdelta.w = max(max(t.r, t.g), t.b);\r\n\r\n\t// Calculate the maximum delta in the direct neighborhood.\r\n\tfloat maxDelta = max(max(max(delta.x, delta.y), delta.z), delta.w);\r\n\r\n\t// Calculate left-left and top-top deltas.\r\n\tvec3 cLeftLeft = texture2D(tDiffuse, vOffset[2].xy).rgb;\r\n\tt = abs(c - cLeftLeft);\r\n\tdelta.z = max(max(t.r, t.g), t.b);\r\n\r\n\tvec3 cTopTop = texture2D(tDiffuse, vOffset[2].zw).rgb;\r\n\tt = abs(c - cTopTop);\r\n\tdelta.w = max(max(t.r, t.g), t.b);\r\n\r\n\t// Calculate the final maximum delta.\r\n\tmaxDelta = max(max(maxDelta, delta.z), delta.w);\r\n\r\n\t// Local contrast adaptation in action.\r\n\tedges.xy *= step(0.5 * maxDelta, delta.xy);\r\n\r\n\tgl_FragColor = vec4(edges, 0.0, 0.0);\r\n\r\n}\r\n";
var vertex$2 = "uniform vec2 texelSize;\r\n\r\nvarying vec2 vUv;\r\nvarying vec4 vOffset[3];\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\r\n\tvOffset[0] = uv.xyxy + texelSize.xyxy * vec4(-1.0, 0.0, 0.0, 1.0); // Changed sign in W component.\r\n\tvOffset[1] = uv.xyxy + texelSize.xyxy * vec4(1.0, 0.0, 0.0, -1.0); // Changed sign in W component.\r\n\tvOffset[2] = uv.xyxy + texelSize.xyxy * vec4(-2.0, 0.0, 0.0, 2.0); // Changed sign in W component.\r\n\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n";
/**
* A material that detects edges in a color texture.
*
* Mainly used for Subpixel Morphological Antialiasing.
*/
var ColorEdgesMaterial =
/*#__PURE__*/
function (_ShaderMaterial) {
/**
* Constructs a new color edges material.
*
* @param {Vector2} [texelSize] - The absolute screen texel size.
*/
function ColorEdgesMaterial() {
var texelSize = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : new Vector2();
classCallCheck(this, ColorEdgesMaterial);
return possibleConstructorReturn(this, getPrototypeOf$2(ColorEdgesMaterial).call(this, {
type: "ColorEdgesMaterial",
defines: {
EDGE_THRESHOLD: "0.1"
},
uniforms: {
tDiffuse: new Uniform(null),
texelSize: new Uniform(texelSize)
},
fragmentShader: fragment$2,
vertexShader: vertex$2,
depthWrite: false,
depthTest: false
}));
}
/**
* Sets the edge detection sensitivity.
*
* A lower value results in more edges being detected at the expense of
* performance.
*
* 0.1 is a reasonable value, and allows to catch most visible edges.
* 0.05 is a rather overkill value, that allows to catch 'em all.
*
* If temporal supersampling is used, 0.2 could be a reasonable value,
* as low contrast edges are properly filtered by just 2x.
*
* @param {Number} threshold - The edge detection sensitivity. Range: [0, 0.5].
*/
createClass(ColorEdgesMaterial, [{
key: "setEdgeDetectionThreshold",
value: function setEdgeDetectionThreshold(threshold) {
this.defines.EDGE_THRESHOLD = threshold.toFixed("2");
this.needsUpdate = true;
}
}]);
inherits(ColorEdgesMaterial, _ShaderMaterial);
return ColorEdgesMaterial;
}(ShaderMaterial);
var fragment$3 = "uniform sampler2D texture1;\r\nuniform sampler2D texture2;\r\n\r\nuniform float opacity1;\r\nuniform float opacity2;\r\n\r\nvarying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvec4 texel1 = opacity1 * texture2D(texture1, vUv);\r\n\tvec4 texel2 = opacity2 * texture2D(texture2, vUv);\r\n\r\n\t#ifdef SCREEN_MODE\r\n\r\n\t\tvec3 invTexel1 = vec3(1.0) - texel1.rgb;\r\n\t\tvec3 invTexel2 = vec3(1.0) - texel2.rgb;\r\n\r\n\t\tvec4 color = vec4(\r\n\t\t\tvec3(1.0) - invTexel1 * invTexel2,\r\n\t\t\ttexel1.a + texel2.a\r\n\t\t);\r\n\r\n\t#else\r\n\r\n\t\tvec4 color = texel1 + texel2;\r\n\r\n\t#endif\r\n\r\n\tgl_FragColor = color;\r\n\r\n}\r\n";
var vertex$3 = "varying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n";
/**
* A material for combining two textures.
*
* This material supports the two blend modes Add and Screen.
*
* In Screen mode, the two textures are effectively projected on a white screen
* simultaneously. In Add mode, the textures are simply added together which
* often produces undesired, washed out results.
*/
var CombineMaterial =
/*#__PURE__*/
function (_ShaderMaterial) {
/**
* Constructs a new combine material.
*
* @param {Boolean} [screenMode=false] - Whether the screen blend mode should be used.
*/
function CombineMaterial() {
var _this;
var screenMode = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
classCallCheck(this, CombineMaterial);
_this = possibleConstructorReturn(this, getPrototypeOf$2(CombineMaterial).call(this, {
type: "CombineMaterial",
uniforms: {
texture1: new Uniform(null),
texture2: new Uniform(null),
opacity1: new Uniform(1.0),
opacity2: new Uniform(1.0)
},
fragmentShader: fragment$3,
vertexShader: vertex$3,
depthWrite: false,
depthTest: false
}));
_this.setScreenModeEnabled(screenMode);
return _this;
}
/**
* Enables or disables the Screen blend mode.
*
* @param {Boolean} enabled - Whether the Screen blend mode should be enabled.
*/
createClass(CombineMaterial, [{
key: "setScreenModeEnabled",
value: function setScreenModeEnabled(enabled) {
if (enabled) {
this.defines.SCREEN_MODE = "1";
} else {
delete this.defines.SCREEN_MODE;
}
this.needsUpdate = true;
}
}]);
inherits(CombineMaterial, _ShaderMaterial);
return CombineMaterial;
}(ShaderMaterial);
var fragment$4 = "#include <common>\r\n#include <dithering_pars_fragment>\r\n\r\nuniform sampler2D tDiffuse;\r\n\r\nvarying vec2 vUv0;\r\nvarying vec2 vUv1;\r\nvarying vec2 vUv2;\r\nvarying vec2 vUv3;\r\n\r\nvoid main() {\r\n\r\n\t// Sample top left texel.\r\n\tvec4 sum = texture2D(tDiffuse, vUv0);\r\n\r\n\t// Sample top right texel.\r\n\tsum += texture2D(tDiffuse, vUv1);\r\n\r\n\t// Sample bottom right texel.\r\n\tsum += texture2D(tDiffuse, vUv2);\r\n\r\n\t// Sample bottom left texel.\r\n\tsum += texture2D(tDiffuse, vUv3);\r\n\r\n\t// Compute the average.\r\n\tgl_FragColor = sum * 0.25;\r\n\r\n\t#include <dithering_fragment>\r\n\r\n}\r\n";
var vertex$4 = "uniform vec2 texelSize;\r\nuniform vec2 halfTexelSize;\r\nuniform float kernel;\r\n\r\nvarying vec2 vUv0;\r\nvarying vec2 vUv1;\r\nvarying vec2 vUv2;\r\nvarying vec2 vUv3;\r\n\r\nvoid main() {\r\n\r\n\tvec2 dUv = (texelSize * vec2(kernel)) + halfTexelSize;\r\n\r\n\tvUv0 = vec2(uv.x - dUv.x, uv.y + dUv.y);\r\n\tvUv1 = vec2(uv.x + dUv.x, uv.y + dUv.y);\r\n\tvUv2 = vec2(uv.x + dUv.x, uv.y - dUv.y);\r\n\tvUv3 = vec2(uv.x - dUv.x, uv.y - dUv.y);\r\n\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n";
/**
* An optimised convolution shader material.
*
* This material supports dithering.
*
* Based on the GDC2003 Presentation by Masaki Kawase, Bunkasha Games:
* Frame Buffer Postprocessing Effects in DOUBLE-S.T.E.A.L (Wreckless)
* and an article by Filip Strugar, Intel:
* An investigation of fast real-time GPU-based image blur algorithms
*
* Further modified according to Apple's
* [Best Practices for Shaders](https://goo.gl/lmRoM5).
*/
var ConvolutionMaterial =
/*#__PURE__*/
function (_ShaderMaterial) {
/**
* Constructs a new convolution material.
*
* @param {Vector2} [texelSize] - The absolute screen texel size.
*/
function ConvolutionMaterial() {
var _this;
var texelSize = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : new Vector2();
classCallCheck(this, ConvolutionMaterial);
_this = possibleConstructorReturn(this, getPrototypeOf$2(ConvolutionMaterial).call(this, {
type: "ConvolutionMaterial",
uniforms: {
tDiffuse: new Uniform(null),
texelSize: new Uniform(new Vector2()),
halfTexelSize: new Uniform(new Vector2()),
kernel: new Uniform(0.0)
},
fragmentShader: fragment$4,
vertexShader: vertex$4,
depthWrite: false,
depthTest: false
}));
_this.setTexelSize(texelSize.x, texelSize.y);
/**
* The current kernel size.
*
* @type {KernelSize}
* @default KernelSize.LARGE
*/
_this.kernelSize = KernelSize.LARGE;
return _this;
}
/**
* Returns the kernel.
*
* @return {Float32Array} The kernel.
*/
createClass(ConvolutionMaterial, [{
key: "getKernel",
value: function getKernel() {
return kernelPresets[this.kernelSize];
}
/**
* Sets the texel size.
*
* @param {Number} x - The texel width.
* @param {Number} y - The texel height.
*/
}, {
key: "setTexelSize",
value: function setTexelSize(x, y) {
this.uniforms.texelSize.value.set(x, y);
this.uniforms.halfTexelSize.value.set(x, y).multiplyScalar(0.5);
}
}]);
inherits(ConvolutionMaterial, _ShaderMaterial);
return ConvolutionMaterial;
}(ShaderMaterial);
/**
* The Kawase blur kernel presets.
*
* @type {Float32Array[]}
* @private
*/
var kernelPresets = [new Float32Array([0.0, 0.0]), new Float32Array([0.0, 1.0, 1.0]), new Float32Array([0.0, 1.0, 1.0, 2.0]), new Float32Array([0.0, 1.0, 2.0, 2.0, 3.0]), new Float32Array([0.0, 1.0, 2.0, 3.0, 4.0, 4.0, 5.0]), new Float32Array([0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 7.0, 8.0, 9.0, 10.0])];
/**
* A kernel size enumeration.
*
* @type {Object}
* @property {Number} VERY_SMALL - A very small kernel that matches a 7x7 Gauss blur kernel.
* @property {Number} SMALL - A small kernel that matches a 15x15 Gauss blur kernel.
* @property {Number} MEDIUM - A medium sized kernel that matches a 23x23 Gauss blur kernel.
* @property {Number} LARGE - A large kernel that matches a 35x35 Gauss blur kernel.
* @property {Number} VERY_LARGE - A very large kernel that matches a 63x63 Gauss blur kernel.
* @property {Number} HUGE - A huge kernel that matches a 127x127 Gauss blur kernel.
*/
var KernelSize = {
VERY_SMALL: 0,
SMALL: 1,
MEDIUM: 2,
LARGE: 3,
VERY_LARGE: 4,
HUGE: 5
};
var fragment$5 = "uniform sampler2D tDiffuse;\r\nuniform float opacity;\r\n\r\nvarying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvec4 texel = texture2D(tDiffuse, vUv);\r\n\tgl_FragColor = opacity * texel;\r\n\r\n}\r\n";
var vertex$5 = "varying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n";
/**
* A simple copy shader material.
*/
var CopyMaterial =
/*#__PURE__*/
function (_ShaderMaterial) {
/**
* Constructs a new copy material.
*/
function CopyMaterial() {
classCallCheck(this, CopyMaterial);
return possibleConstructorReturn(this, getPrototypeOf$2(CopyMaterial).call(this, {
type: "CopyMaterial",
uniforms: {
tDiffuse: new Uniform(null),
opacity: new Uniform(1.0)
},
fragmentShader: fragment$5,
vertexShader: vertex$5,
depthWrite: false,
depthTest: false
}));
}
inherits(CopyMaterial, _ShaderMaterial);
return CopyMaterial;
}(ShaderMaterial);
var fragment$6 = "#include <packing>\r\n#include <clipping_planes_pars_fragment>\r\n\r\nuniform sampler2D tDepth;\r\nuniform float cameraNear;\r\nuniform float cameraFar;\r\n\r\nvarying float vViewZ;\r\nvarying vec4 vProjTexCoord;\r\n\r\nvoid main() {\r\n\r\n\t#include <clipping_planes_fragment>\r\n\r\n\t// Transform into Cartesian coordinate (not mirrored).\r\n\tvec2 projTexCoord = (vProjTexCoord.xy / vProjTexCoord.w) * 0.5 + 0.5;\r\n\tprojTexCoord = clamp(projTexCoord, 0.002, 0.998);\r\n\r\n\tfloat fragCoordZ = unpackRGBAToDepth(texture2D(tDepth, projTexCoord));\r\n\r\n\t#ifdef PERSPECTIVE_CAMERA\r\n\r\n\t\tfloat viewZ = perspectiveDepthToViewZ(fragCoordZ, cameraNear, cameraFar);\r\n\r\n\t#else\r\n\r\n\t\tfloat viewZ = orthographicDepthToViewZ(fragCoordZ, cameraNear, cameraFar);\r\n\r\n\t#endif\r\n\r\n\tfloat depthTest = (-vViewZ > -viewZ) ? 1.0 : 0.0;\r\n\r\n\tgl_FragColor.rgb = vec3(0.0, depthTest, 1.0);\r\n\r\n}\r\n";
var vertex$6 = "#include <common>\r\n#include <morphtarget_pars_vertex>\r\n#include <skinning_pars_vertex>\r\n#include <clipping_planes_pars_vertex>\r\n\r\nvarying float vViewZ;\r\nvarying vec4 vProjTexCoord;\r\n\r\nvoid main() {\r\n\r\n\t#include <skinbase_vertex>\r\n\r\n\t#include <begin_vertex>\r\n\t#include <morphtarget_vertex>\r\n\t#include <skinning_vertex>\r\n\t#include <project_vertex>\r\n\r\n\tvViewZ = mvPosition.z;\r\n\tvProjTexCoord = gl_Position;\r\n\r\n\t#include <clipping_planes_vertex>\r\n\r\n}\r\n";
/**
* A depth comparison shader material.
*/
var DepthComparisonMaterial =
/*#__PURE__*/
function (_ShaderMaterial) {
/**
* Constructs a new depth comparison material.
*
* @param {Texture} [depthTexture=null] - A depth texture.
* @param {PerspectiveCamera} [camera] - A camera.
*/
function DepthComparisonMaterial() {
var _this;
var depthTexture = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
var camera = arguments.length > 1 ? arguments[1] : undefined;
classCallCheck(this, DepthComparisonMaterial);
_this = possibleConstructorReturn(this, getPrototypeOf$2(DepthComparisonMaterial).call(this, {
type: "DepthComparisonMaterial",
uniforms: {
tDepth: new Uniform(depthTexture),
cameraNear: new Uniform(0.1),
cameraFar: new Uniform(2000)
},
fragmentShader: fragment$6,
vertexShader: vertex$6,
depthWrite: false,
depthTest: false,
morphTargets: true,
skinning: true
}));
_this.adoptCameraSettings(camera);
return _this;
}
/**
* Adopts the settings of the given camera.
*
* @param {Camera} [camera=null] - A camera.
*/
createClass(DepthComparisonMaterial, [{
key: "adoptCameraSettings",
value: function adoptCameraSettings() {
var camera = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
if (camera !== null) {
this.uniforms.cameraNear.value = camera.near;
this.uniforms.cameraFar.value = camera.far;
if (camera instanceof PerspectiveCamera) {
this.defines.PERSPECTIVE_CAMERA = "1";
} else {
delete this.defines.PERSPECTIVE_CAMERA;
}
}
}
}]);
inherits(DepthComparisonMaterial, _ShaderMaterial);
return DepthComparisonMaterial;
}(ShaderMaterial);
var fragment$7 = "uniform sampler2D tDiffuse;\r\n\r\nuniform float angle;\r\nuniform float scale;\r\nuniform float intensity;\r\n\r\nvarying vec2 vUv;\r\nvarying vec2 vUvPattern;\r\n\r\nfloat pattern() {\r\n\r\n\tfloat s = sin(angle);\r\n\tfloat c = cos(angle);\r\n\r\n\tvec2 point = vec2(c * vUvPattern.x - s * vUvPattern.y, s * vUvPattern.x + c * vUvPattern.y) * scale;\r\n\r\n\treturn (sin(point.x) * sin(point.y)) * 4.0;\r\n\r\n}\r\n\r\nvoid main() {\r\n\r\n\tvec4 texel = texture2D(tDiffuse, vUv);\r\n\tvec3 color = texel.rgb;\r\n\r\n\t#ifdef AVERAGE\r\n\r\n\t\tcolor = vec3((color.r + color.g + color.b) / 3.0);\r\n\r\n\t#endif\r\n\r\n\tcolor = vec3(color * 10.0 - 5.0 + pattern());\r\n\tcolor = texel.rgb + (color - texel.rgb) * intensity;\r\n\r\n\tgl_FragColor = vec4(color, texel.a);\r\n\r\n}\r\n";
var vertex$7 = "uniform vec4 offsetRepeat;\r\n\r\nvarying vec2 vUv;\r\nvarying vec2 vUvPattern;\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\tvUvPattern = uv * offsetRepeat.zw + offsetRepeat.xy;\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n";
/**
* A dot screen shader material.
*/
var DotScreenMaterial =
/*#__PURE__*/
function (_ShaderMaterial) {
/**
* Constructs a new dot screen material.
*
* @param {Boolean} [options] - The options.
* @param {Boolean} [options.average=false] - Whether the shader should output the colour average (black and white).
* @param {Boolean} [options.angle=1.57] - The angle of the dot pattern.
* @param {Boolean} [options.scale=1.0] - The scale of the dot pattern.
* @param {Boolean} [options.intensity=1.0] - The intensity of the effect.
*/
function DotScreenMaterial() {
var _this;
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
classCallCheck(this, DotScreenMaterial);
var settings = Object.assign({
average: false,
angle: 1.57,
scale: 1.0,
intensity: 1.0
}, options);
_this = possibleConstructorReturn(this, getPrototypeOf$2(DotScreenMaterial).call(this, {
type: "DotScreenMaterial",
uniforms: {
tDiffuse: new Uniform(null),
angle: new Uniform(settings.angle),
scale: new Uniform(settings.scale),
intensity: new Uniform(settings.intensity),
offsetRepeat: new Uniform(new Vector4(0.5, 0.5, 1.0, 1.0))
},
fragmentShader: fragment$7,
vertexShader: vertex$7,
depthWrite: false,
depthTest: false
}));
_this.setAverageEnabled(settings.average);
return _this;
}
/**
* Enables or disables the Screen blend mode.
*
* @param {Boolean} enabled - Whether the Screen blend mode should be enabled.
*/
createClass(DotScreenMaterial, [{
key: "setAverageEnabled",
value: function setAverageEnabled(enabled) {
if (enabled) {
this.defines.AVERAGE = "1";
} else {
delete this.defines.AVERAGE;
}
this.needsUpdate = true;
}
}]);
inherits(DotScreenMaterial, _ShaderMaterial);
return DotScreenMaterial;
}(ShaderMaterial);
var fragment$8 = "uniform sampler2D tDiffuse;\r\nuniform float time;\r\n\r\nvarying vec2 vUv;\r\n\r\n#ifdef NOISE\r\n\r\n\tuniform float noiseIntensity;\r\n\r\n#endif\r\n\r\n#ifdef SCANLINES\r\n\r\n\tuniform float scanlineIntensity;\r\n\tuniform float scanlineCount;\r\n\r\n#endif\r\n\r\n#ifdef GRID\r\n\r\n\tuniform float gridIntensity;\r\n\tuniform vec2 gridScale;\r\n\tuniform float gridLineWidth;\r\n\r\n#endif\r\n\r\n#ifdef GREYSCALE\r\n\r\n\t#include <common>\r\n\r\n\tuniform float greyscaleIntensity;\r\n\r\n#elif defined(SEPIA)\r\n\r\n\tuniform float sepiaIntensity;\r\n\r\n#endif\r\n\r\n#ifdef VIGNETTE\r\n\r\n\tuniform float vignetteOffset;\r\n\tuniform float vignetteDarkness;\r\n\r\n#endif\r\n\r\nvoid main() {\r\n\r\n\tvec4 texel = texture2D(tDiffuse, vUv);\r\n\tvec3 color = texel.rgb;\r\n\r\n\t#ifdef SCREEN_MODE\r\n\r\n\t\tvec3 invColor;\r\n\r\n\t#endif\r\n\r\n\t#ifdef NOISE\r\n\r\n\t\tfloat x = vUv.x * vUv.y * time * 1000.0;\r\n\t\tx = mod(x, 13.0) * mod(x, 123.0);\r\n\t\tx = mod(x, 0.01);\r\n\r\n\t\tvec3 noise = texel.rgb * clamp(0.1 + x * 100.0, 0.0, 1.0) * noiseIntensity;\r\n\r\n\t\t#ifdef SCREEN_MODE\r\n\r\n\t\t\tinvColor = vec3(1.0) - color;\r\n\t\t\tvec3 invNoise = vec3(1.0) - noise;\r\n\r\n\t\t\tcolor = vec3(1.0) - invColor * invNoise;\r\n\r\n\t\t#else\r\n\r\n\t\t\tcolor += noise;\r\n\r\n\t\t#endif\r\n\r\n\t#endif\r\n\r\n\t#ifdef SCANLINES\r\n\r\n\t\tvec2 sl = vec2(sin(vUv.y * scanlineCount), cos(vUv.y * scanlineCount));\r\n\t\tvec3 scanlines = texel.rgb * vec3(sl.x, sl.y, sl.x) * scanlineIntensity;\r\n\r\n\t\t#ifdef SCREEN_MODE\r\n\r\n\t\t\tinvColor = vec3(1.0) - color;\r\n\t\t\tvec3 invScanlines = vec3(1.0) - scanlines;\r\n\r\n\t\t\tcolor = vec3(1.0) - invColor * invScanlines;\r\n\r\n\t\t#else\r\n\r\n\t\t\tcolor += scanlines;\r\n\r\n\t\t#endif\r\n\r\n\t#endif\r\n\r\n\t#ifdef GRID\r\n\r\n\t\tfloat grid = 0.5 - max(abs(mod(vUv.x * gridScale.x, 1.0) - 0.5), abs(mod(vUv.y * gridScale.y, 1.0) - 0.5));\r\n\t\tcolor *= (1.0 - gridIntensity) + vec3(smoothstep(0.0, gridLineWidth, grid)) * gridIntensity;\r\n\r\n\t#endif\r\n\r\n\t#ifdef GREYSCALE\r\n\r\n\t\tcolor = mix(color, vec3(linearToRelativeLuminance(color)), greyscaleIntensity);\r\n\r\n\t#elif defined(SEPIA)\r\n\r\n\t\tvec3 c = color.rgb;\r\n\r\n\t\tcolor.r = dot(c, vec3(1.0 - 0.607 * sepiaIntensity, 0.769 * sepiaIntensity, 0.189 * sepiaIntensity));\r\n\t\tcolor.g = dot(c, vec3(0.349 * sepiaIntensity, 1.0 - 0.314 * sepiaIntensity, 0.168 * sepiaIntensity));\r\n\t\tcolor.b = dot(c, vec3(0.272 * sepiaIntensity, 0.534 * sepiaIntensity, 1.0 - 0.869 * sepiaIntensity));\r\n\r\n\t#endif\r\n\r\n\t#ifdef VIGNETTE\r\n\r\n\t\tconst vec2 center = vec2(0.5);\r\n\r\n\t\t#ifdef ESKIL\r\n\r\n\t\t\tvec2 uv = (vUv - center) * vec2(vignetteOffset);\r\n\t\t\tcolor = mix(color.rgb, vec3(1.0 - vignetteDarkness), dot(uv, uv));\r\n\r\n\t\t#else\r\n\r\n\t\t\tfloat dist = distance(vUv, center);\r\n\t\t\tcolor *= smoothstep(0.8, vignetteOffset * 0.799, dist * (vignetteDarkness + vignetteOffset));\r\n\r\n\t\t#endif\t\t\r\n\r\n\t#endif\r\n\r\n\tgl_FragColor = vec4(clamp(color, 0.0, 1.0), texel.a);\r\n\r\n}\r\n";
var vertex$8 = "varying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n";
/**
* A cinematic shader that provides the following effects:
* - Film Grain
* - Scanlines
* - Vignette
* - Greyscale
* - Sepia
*
* Original scanlines algorithm by Pat "Hawthorne" Shearon.
* http://www.truevision3d.com/forums/showcase/staticnoise_colorblackwhite_scanline_shaders-t18698.0.html
*
* Optimised scanlines and noise with intensity scaling by Georg "Leviathan"
* Steinrohder. This version was provided under a Creative Commons Attribution
* 3.0 License: http://creativecommons.org/licenses/by/3.0.
*
* The sepia effect is based on:
* https://github.com/evanw/glfx.js
*
* The vignette code is based on PaintEffect postprocess from ro.me:
* http://code.google.com/p/3-dreams-of-black/source/browse/deploy/js/effects/PaintEffect.js
*/
var FilmMaterial =
/*#__PURE__*/
function (_ShaderMaterial) {
/**
* Constructs a new film material.
*
* @param {Object} [options] - The options. Disabled effects will not be included in the final shader and have no negative impact on performance.
* @param {Boolean} [options.greyscale=false] - Enable greyscale effect. Greyscale and sepia are mutually exclusive.
* @param {Boolean} [options.sepia=false] - Enable sepia effect. Greyscale and sepia are mutually exclusive.
* @param {Boolean} [options.vignette=false] - Apply vignette effect.
* @param {Boolean} [options.eskil=false] - Use Eskil's vignette approach. The default looks dusty while Eskil looks burned out.
* @param {Boolean} [options.screenMode=true] - Whether the screen blend mode should be used for noise and scanlines. Both of these effects are computed independently.
* @param {Boolean} [options.noise=true] - Show noise-based film grain.
* @param {Boolean} [options.scanlines=true] - Show scanlines.
* @param {Boolean} [options.grid=true] - Show a grid.
* @param {Number} [options.noiseIntensity=0.5] - The noise intensity.
* @param {Number} [options.scanlineIntensity=0.05] - The scanline intensity.
* @param {Number} [options.gridIntensity=1.0] - The grid strength. 0.0 to 1.0.
* @param {Number} [options.greyscaleIntensity=1.0] - The intensity of the greyscale effect. 0.0 to 1.0.
* @param {Number} [options.sepiaIntensity=1.0] - The intensity of the sepia effect. 0.0 to 1.0.
* @param {Number} [options.vignetteOffset=1.0] - The offset of the vignette effect. 0.0 to 1.0.
* @param {Number} [options.vignetteDarkness=1.0] - The darkness of the vignette effect. 0.0 to 1.0.
*/
function FilmMaterial() {
var _this;
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
classCallCheck(this, FilmMaterial);
var settings = Object.assign({
screenMode: true,
noise: true,
scanlines: true,
grid: false,
greyscale: false,
sepia: false,
vignette: false,
eskil: false,
noiseIntensity: 0.5,
scanlineIntensity: 0.05,
gridIntensity: 1.0,
greyscaleIntensity: 1.0,
sepiaIntensity: 1.0,
vignetteOffset: 1.0,
vignetteDarkness: 1.0
}, options);
_this = possibleConstructorReturn(this, getPrototypeOf$2(FilmMaterial).call(this, {
type: "FilmMaterial",
uniforms: {
tDiffuse: new Uniform(null),
time: new Uniform(0.0),
noiseIntensity: new Uniform(settings.noiseIntensity),
scanlineIntensity: new Uniform(settings.scanlineIntensity),
gridIntensity: new Uniform(settings.gridIntensity),
scanlineCount: new Uniform(0.0),
gridScale: new Uniform(new Vector2()),
gridLineWidth: new Uniform(0.0),
greyscaleIntensity: new Uniform(settings.greyscaleIntensity),
sepiaIntensity: new Uniform(settings.sepiaIntensity),
vignetteOffset: new Uniform(settings.vignetteOffset),
vignetteDarkness: new Uniform(settings.vignetteDarkness)
},
fragmentShader: fragment$8,
vertexShader: vertex$8,
depthWrite: false,
depthTest: false
}));
_this.setScreenModeEnabled(settings.screenMode);
_this.setNoiseEnabled(settings.noise);
_this.setScanlinesEnabled(settings.scanlines);
_this.setGridEnabled(settings.grid);
_this.setGreyscaleEnabled(settings.greyscale);
_this.setSepiaEnabled(settings.sepia);
_this.setVignetteEnabled(settings.vignette);
_this.setEskilEnabled(settings.eskil);
return _this;
}
/**
* Enables or disables the Screen blend mode.
*
* @param {Boolean} enabled - Whether the Screen blend mode should be enabled.
*/
createClass(FilmMaterial, [{
key: "setScreenModeEnabled",
value: function setScreenModeEnabled(enabled) {
if (enabled) {
this.defines.SCREEN_MODE = "1";
} else {
delete this.defines.SCREEN_MODE;
}
this.needsUpdate = true;
}
/**
* Enables or disables the noise effect.
*
* @param {Boolean} enabled - Whether the noise effect should be enabled.
*/
}, {
key: "setNoiseEnabled",
value: function setNoiseEnabled(enabled) {
if (enabled) {
this.defines.NOISE = "1";
} else {
delete this.defines.NOISE;
}
this.needsUpdate = true;
}
/**
* Enables or disables the scanlines effect.
*
* @param {Boolean} enabled - Whether the scanlines effect should be enabled.
*/
}, {
key: "setScanlinesEnabled",
value: function setScanlinesEnabled(enabled) {
if (enabled) {
this.defines.SCANLINES = "1";
} else {
delete this.defines.SCANLINES;
}
this.needsUpdate = true;
}
/**
* Enables or disables the grid effect.
*
* @param {Boolean} enabled - Whether the grid effect should be enabled.
*/
}, {
key: "setGridEnabled",
value: function setGridEnabled(enabled) {
if (enabled) {
this.defines.GRID = "1";
} else {
delete this.defines.GRID;
}
this.needsUpdate = true;
}
/**
* Enables or disables the greyscale effect.
*
* @param {Boolean} enabled - Whether the greyscale effect should be enabled.
*/
}, {
key: "setGreyscaleEnabled",
value: function setGreyscaleEnabled(enabled) {
if (enabled) {
this.defines.GREYSCALE = "1";
} else {
delete this.defines.GREYSCALE;
}
this.needsUpdate = true;
}
/**
* Enables or disables the sepia effect.
*
* @param {Boolean} enabled - Whether the sepia effect should be enabled.
*/
}, {
key: "setSepiaEnabled",
value: function setSepiaEnabled(enabled) {
if (enabled) {
this.defines.SEPIA = "1";
} else {
delete this.defines.SEPIA;
}
this.needsUpdate = true;
}
/**
* Enables or disables the Vignette effect.
*
* @param {Boolean} enabled - Whether the Vignette effect should be enabled.
*/
}, {
key: "setVignetteEnabled",
value: function setVignetteEnabled(enabled) {
if (enabled) {
this.defines.VIGNETTE = "1";
} else {
delete this.defines.VIGNETTE;
}
this.needsUpdate = true;
}
/**
* Enables or disables the Eskil Vignette effect.
*
* Has no effect if Vignette is disabled.
*
* @param {Boolean} enabled - Whether the Eskil Vignette effect should be enabled.
*/
}, {
key: "setEskilEnabled",
value: function setEskilEnabled(enabled) {
if (enabled) {
this.defines.ESKIL = "1";
} else {
delete this.defines.ESKIL;
}
this.needsUpdate = true;
}
}]);
inherits(FilmMaterial, _ShaderMaterial);
return FilmMaterial;
}(ShaderMaterial);
var fragment$9 = "uniform sampler2D tDiffuse;\r\nuniform sampler2D tPerturb;\r\n\r\nuniform bool active;\r\n\r\nuniform float amount;\r\nuniform float angle;\r\nuniform float seed;\r\nuniform float seedX;\r\nuniform float seedY;\r\nuniform float distortionX;\r\nuniform float distortionY;\r\nuniform float colS;\r\n\r\nvarying vec2 vUv;\r\n\r\nfloat rand(vec2 tc) {\r\n\r\n\tconst float a = 12.9898;\r\n\tconst float b = 78.233;\r\n\tconst float c = 43758.5453;\r\n\r\n\tfloat dt = dot(tc, vec2(a, b));\r\n\tfloat sn = mod(dt, 3.14);\r\n\r\n\treturn fract(sin(sn) * c);\r\n\r\n}\r\n\r\nvoid main() {\r\n\r\n\tvec2 coord = vUv;\r\n\r\n\tfloat xs, ys;\r\n\tvec4 normal;\r\n\r\n\tvec2 offset;\r\n\tvec4 cr, cga, cb;\r\n\tvec4 snow, color;\r\n\r\n\tfloat sx, sy;\r\n\r\n\tif(active) {\r\n\r\n\t\txs = floor(gl_FragCoord.x / 0.5);\r\n\t\tys = floor(gl_FragCoord.y / 0.5);\r\n\r\n\t\tnormal = texture2D(tPerturb, coord * seed * seed);\r\n\r\n\t\tif(coord.y < distortionX + colS && coord.y > distortionX - colS * seed) {\r\n\r\n\t\t\tsx = clamp(ceil(seedX), 0.0, 1.0);\r\n\t\t\tcoord.y = sx * (1.0 - (coord.y + distortionY)) + (1.0 - sx) * distortionY;\r\n\r\n\t\t}\r\n\r\n\t\tif(coord.x < distortionY + colS && coord.x > distortionY - colS * seed) {\r\n\r\n\t\t\tsy = clamp(ceil(seedY), 0.0, 1.0);\r\n\t\t\tcoord.x = sy * distortionX + (1.0 - sy) * (1.0 - (coord.x + distortionX));\r\n\r\n\t\t}\r\n\r\n\t\tcoord.x += normal.x * seedX * (seed / 5.0);\r\n\t\tcoord.y += normal.y * seedY * (seed / 5.0);\r\n\r\n\t\toffset = amount * vec2(cos(angle), sin(angle));\r\n\r\n\t\tcr = texture2D(tDiffuse, coord + offset);\r\n\t\tcga = texture2D(tDiffuse, coord);\r\n\t\tcb = texture2D(tDiffuse, coord - offset);\r\n\r\n\t\tcolor = vec4(cr.r, cga.g, cb.b, cga.a);\r\n\t\tsnow = 200.0 * amount * vec4(rand(vec2(xs * seed, ys * seed * 50.0)) * 0.2);\r\n\t\tcolor += snow;\r\n\r\n\t} else {\r\n\r\n\t\tcolor = texture2D(tDiffuse, vUv);\r\n\r\n\t}\r\n\r\n\tgl_FragColor = color;\r\n\r\n}\r\n";
var vertex$9 = "varying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n";
/**
* A glitch shader material.
*
* Reference:
* https://github.com/staffantan/unityglitch
*/
var GlitchMaterial =
/*#__PURE__*/
function (_ShaderMaterial) {
/**
* Constructs a new glitch material.
*/
function GlitchMaterial() {
classCallCheck(this, GlitchMaterial);
return possibleConstructorReturn(this, getPrototypeOf$2(GlitchMaterial).call(this, {
type: "GlitchMaterial",
uniforms: {
tDiffuse: new Uniform(null),
tPerturb: new Uniform(null),
active: new Uniform(1),
amount: new Uniform(0.8),
angle: new Uniform(0.02),
seed: new Uniform(0.02),
seedX: new Uniform(0.02),
seedY: new Uniform(0.02),
distortionX: new Uniform(0.5),
distortionY: new Uniform(0.6),
colS: new Uniform(0.05)
},
fragmentShader: fragment$9,
vertexShader: vertex$9,
depthWrite: false,
depthTest: false
}));
}
inherits(GlitchMaterial, _ShaderMaterial);
return GlitchMaterial;
}(ShaderMaterial);
var fragment$10 = "#include <common>\r\n#include <dithering_pars_fragment>\r\n\r\nuniform sampler2D tDiffuse;\r\nuniform vec3 lightPosition;\r\n\r\nuniform float exposure;\r\nuniform float decay;\r\nuniform float density;\r\nuniform float weight;\r\nuniform float clampMax;\r\n\r\nvarying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvec2 texCoord = vUv;\r\n\r\n\t// Calculate vector from pixel to light source in screen space.\r\n\tvec2 deltaTexCoord = texCoord - lightPosition.st;\r\n\tdeltaTexCoord *= 1.0 / NUM_SAMPLES_FLOAT * density;\r\n\r\n\t// A decreasing illumination factor.\r\n\tfloat illuminationDecay = 1.0;\r\n\r\n\tvec4 sample;\r\n\tvec4 color = vec4(0.0);\r\n\r\n\t// Estimate the probability of occlusion at each pixel by summing samples along a ray to the light source.\r\n\tfor(int i = 0; i < NUM_SAMPLES_INT; ++i) {\r\n\r\n\t\ttexCoord -= deltaTexCoord;\r\n\t\tsample = texture2D(tDiffuse, texCoord);\r\n\r\n\t\t// Apply sample attenuation scale/decay factors.\r\n\t\tsample *= illuminationDecay * weight;\r\n\r\n\t\tcolor += sample;\r\n\r\n\t\t// Update exponential decay factor.\r\n\t\tilluminationDecay *= decay;\r\n\r\n\t}\r\n\r\n\tgl_FragColor = clamp(color * exposure, 0.0, clampMax);\r\n\r\n\t#include <dithering_fragment>\r\n\r\n}\r\n";
var vertex$10 = "varying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n";
/**
* A crepuscular rays shader material.
*
* This material supports dithering.
*
* References:
*
* Thibaut Despoulain, 2012:
* [(WebGL) Volumetric Light Approximation in Three.js](
* http://bkcore.com/blog/3d/webgl-three-js-volumetric-light-godrays.html)
*
* Nvidia, GPU Gems 3, 2008:
* [Chapter 13. Volumetric Light Scattering as a Post-Process](
* https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch13.html)
*/
var GodRaysMaterial =
/*#__PURE__*/
function (_ShaderMaterial) {
/**
* Constructs a new god rays material.
*
* @param {Object} [options] - The options.
* @param {Number} [options.density=0.96] - The density of the light rays.
* @param {Number} [options.decay=0.93] - An illumination decay factor.
* @param {Number} [options.weight=0.4] - A light ray weight factor.
* @param {Number} [options.exposure=0.6] - A constant attenuation coefficient.
* @param {Number} [options.clampMax=1.0] - An upper bound for the saturation of the overall effect.
*/
function GodRaysMaterial() {
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
classCallCheck(this, GodRaysMaterial);
var settings = Object.assign({
exposure: 0.6,
density: 0.93,
decay: 0.96,
weight: 0.4,
clampMax: 1.0
}, options);
return possibleConstructorReturn(this, getPrototypeOf$2(GodRaysMaterial).call(this, {
type: "GodRaysMaterial",
defines: {
NUM_SAMPLES_FLOAT: "60.0",
NUM_SAMPLES_INT: "60"
},
uniforms: {
tDiffuse: new Uniform(null),
lightPosition: new Uniform(null),
exposure: new Uniform(settings.exposure),
decay: new Uniform(settings.decay),
density: new Uniform(settings.density),
weight: new Uniform(settings.weight),
clampMax: new Uniform(settings.clampMax)
},
fragmentShader: fragment$10,
vertexShader: vertex$10,
depthWrite: false,
depthTest: false
}));
}
inherits(GodRaysMaterial, _ShaderMaterial);
return GodRaysMaterial;
}(ShaderMaterial);
var fragment$11 = "#include <common>\r\n\r\nuniform sampler2D tDiffuse;\r\nuniform float distinction;\r\nuniform vec2 range;\r\n\r\nvarying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvec4 texel = texture2D(tDiffuse, vUv);\r\n\tfloat l = linearToRelativeLuminance(texel.rgb);\r\n\r\n\t#ifdef RANGE\r\n\r\n\t\tfloat low = step(range.x, l);\r\n\t\tfloat high = step(l, range.y);\r\n\r\n\t\t// Apply the mask.\r\n\t\tl *= low * high;\r\n\r\n\t#endif\r\n\r\n\tl = pow(abs(l), distinction);\r\n\r\n\t#ifdef COLOR\r\n\r\n\t\tgl_FragColor = vec4(texel.rgb * l, texel.a);\r\n\r\n\t#else\r\n\r\n\t\tgl_FragColor = vec4(l, l, l, texel.a);\r\n\r\n\t#endif\r\n\r\n}\r\n";
var vertex$11 = "varying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n";
/**
* A luminosity shader material.
*
* This shader produces a greyscale luminance map that describes the absolute
* amount of light emitted by a scene. It can also be configured to output
* colours that are scaled with their respective luminance value. Additionally,
* a range may be provided to mask out undesired texels.
*
* The alpha channel will remain unaffected in all cases.
*
* On luminance coefficients:
* http://www.poynton.com/notes/colour_and_gamma/ColorFAQ.html#RTFToC9
*
* Coefficients for different colour spaces:
* https://hsto.org/getpro/habr/post_images/2ab/69d/084/2ab69d084f9a597e032624bcd74d57a7.png
*
* Luminance range reference:
* https://cycling74.com/2007/05/23/your-first-shader/#.Vty9FfkrL4Z
*/
var LuminosityMaterial =
/*#__PURE__*/
function (_ShaderMaterial) {
/**
* Constructs a new luminosity material.
*
* @param {Boolean} [colorOutput=false] - Defines whether the shader should output colours scaled with their luminance value.
* @param {Vector2} [luminanceRange] - If provided, the shader will mask out texels that aren't in the specified luminance range.
*/
function LuminosityMaterial() {
var _this;
var colorOutput = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
var luminanceRange = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
classCallCheck(this, LuminosityMaterial);
var maskLuminance = luminanceRange !== null;
_this = possibleConstructorReturn(this, getPrototypeOf$2(LuminosityMaterial).call(this, {
type: "LuminosityMaterial",
uniforms: {
tDiffuse: new Uniform(null),
distinction: new Uniform(1.0),
range: new Uniform(maskLuminance ? luminanceRange : new Vector2())
},
fragmentShader: fragment$11,
vertexShader: vertex$11
}));
_this.setColorOutputEnabled(colorOutput);
_this.setLuminanceRangeEnabled(maskLuminance);
return _this;
}
/**
* Enables or disables color output.
*
* @param {Boolean} enabled - Whether color output should be enabled.
*/
createClass(LuminosityMaterial, [{
key: "setColorOutputEnabled",
value: function setColorOutputEnabled(enabled) {
if (enabled) {
this.defines.COLOR = "1";
} else {
delete this.defines.COLOR;
}
this.needsUpdate = true;
}
/**
* Enables or disables the luminance mask.
*
* @param {Boolean} enabled - Whether the luminance mask should be enabled.
*/
}, {
key: "setLuminanceRangeEnabled",
value: function setLuminanceRangeEnabled(enabled) {
if (enabled) {
this.defines.RANGE = "1";
} else {
delete this.defines.RANGE;
}
this.needsUpdate = true;
}
}]);
inherits(LuminosityMaterial, _ShaderMaterial);
return LuminosityMaterial;
}(ShaderMaterial);
var fragment$12 = "uniform sampler2D tDiffuse;\r\nuniform sampler2D tMask;\r\nuniform sampler2D tEdges;\r\n\r\nuniform vec3 visibleEdgeColor;\r\nuniform vec3 hiddenEdgeColor;\r\nuniform float pulse;\r\nuniform float edgeStrength;\r\n\r\n#ifdef USE_PATTERN\r\n\r\n\tuniform sampler2D tPattern;\r\n\tvarying vec2 vPatternCoord;\r\n\r\n#endif\r\n\r\nvarying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvec4 color = texture2D(tDiffuse, vUv);\r\n\tvec2 edge = texture2D(tEdges, vUv).rg;\r\n\tvec2 mask = texture2D(tMask, vUv).rg;\r\n\r\n\t#ifndef X_RAY\r\n\r\n\t\tedge.y = 0.0;\r\n\r\n\t#endif\r\n\r\n\tedge *= (edgeStrength * mask.x * pulse);\r\n\tvec3 outlineColor = edge.x * visibleEdgeColor + edge.y * hiddenEdgeColor;\r\n\r\n\t#ifdef ALPHA_BLENDING\r\n\r\n\t\tcolor.rgb = mix(color.rgb, outlineColor, max(edge.x, edge.y));\r\n\r\n\t#else\r\n\r\n\t\tcolor.rgb += outlineColor;\r\n\r\n\t#endif\r\n\r\n\t#ifdef USE_PATTERN\r\n\r\n\t\tvec3 patternColor = texture2D(tPattern, vPatternCoord).rgb;\r\n\r\n\t\t#ifdef X_RAY\r\n\r\n\t\t\tfloat hiddenFactor = 0.5;\r\n\r\n\t\t#else\r\n\r\n\t\t\tfloat hiddenFactor = 0.0;\r\n\r\n\t\t#endif\r\n\r\n\t\tfloat visibilityFactor = (1.0 - mask.y > 0.0) ? 1.0 : hiddenFactor;\r\n\r\n\t\tcolor.rgb += visibilityFactor * (1.0 - mask.x) * (1.0 - patternColor);\r\n\r\n\t#endif\r\n\r\n\tgl_FragColor = color;\r\n\r\n}\r\n";
var vertex$12 = "#ifdef USE_PATTERN\r\n\r\n\tuniform float aspect;\r\n\tuniform float patternScale;\r\n\tvarying vec2 vPatternCoord;\r\n\r\n#endif\r\n\r\nvarying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\t#ifdef USE_PATTERN\r\n\r\n\t\tvec2 aspectCorrection = vec2(aspect, 1.0);\r\n\t\tvPatternCoord = uv * aspectCorrection * patternScale;\r\n\r\n\t#endif\r\n\r\n\tvUv = uv;\r\n\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n";
/**
* An outline blend shader material.
*/
var OutlineBlendMaterial =
/*#__PURE__*/
function (_ShaderMaterial) {
/**
* Constructs a new outline blend material.
*
* @param {Object} [options] - The options.
* @param {Number} [options.edgeStrength=1.0] - The edge strength.
* @param {Number} [options.patternScale=1.0] - The scale of the pattern texture.
* @param {Number} [options.visibleEdgeColor=0xffffff] - The color of visible edges.
* @param {Number} [options.hiddenEdgeColor=0x22090A] - The color of hidden edges.
* @param {Boolean} [alphaBlending=false] - Whether the outline should be blended using alpha.
* @param {Boolean} [xRay=true] - Whether hidden parts of selected objects should be visible.
*/
function OutlineBlendMaterial() {
var _this;
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
classCallCheck(this, OutlineBlendMaterial);
var settings = Object.assign({
edgeStrength: 1.0,
patternScale: 1.0,
visibleEdgeColor: 0xffffff,
hiddenEdgeColor: 0x22090A,
alphaBlending: false,
xRay: true
}, options);
_this = possibleConstructorReturn(this, getPrototypeOf$2(OutlineBlendMaterial).call(this, {
type: "OutlineBlendMaterial",
uniforms: {
pulse: new Uniform(1.0),
aspect: new Uniform(1.0),
tDiffuse: new Uniform(null),
tMask: new Uniform(null),
tEdges: new Uniform(null),
tPattern: new Uniform(null),
edgeStrength: new Uniform(settings.edgeStrength),
patternScale: new Uniform(settings.patternScale),
visibleEdgeColor: new Uniform(new Color(settings.visibleEdgeColor)),
hiddenEdgeColor: new Uniform(new Color(settings.hiddenEdgeColor))
},
fragmentShader: fragment$12,
vertexShader: vertex$12,
depthWrite: false,
depthTest: false
}));
_this.setAlphaBlendingEnabled(settings.alphaBlending);
_this.setXRayEnabled(settings.xRay);
return _this;
}
/**
* Enables or disables the alpha blending.
*
* @param {Boolean} enabled - Whether the alpha blending should be enabled.
*/
createClass(OutlineBlendMaterial, [{
key: "setAlphaBlendingEnabled",
value: function setAlphaBlendingEnabled(enabled) {
if (enabled) {
this.defines.ALPHA_BLENDING = "1";
} else {
delete this.defines.ALPHA_BLENDING;
}
this.needsUpdate = true;
}
/**
* Defines whether hidden parts of selected objects should be visible.
*
* @param {Boolean} enabled - Whether hidden parts of selected objects should be visible.
*/
}, {
key: "setXRayEnabled",
value: function setXRayEnabled(enabled) {
if (enabled) {
this.defines.X_RAY = "1";
} else {
delete this.defines.X_RAY;
}
this.needsUpdate = true;
}
/**
* Sets a pattern texture to use as overlay.
*
* @param {Texture} [texture=null] - A pattern texture. Set to null to disable the pattern.
*/
}, {
key: "setPatternTexture",
value: function setPatternTexture() {
var texture = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
if (texture !== null) {
this.defines.USE_PATTERN = "1";
} else {
delete this.defines.USE_PATTERN;
}
this.uniforms.tPattern.value = texture;
this.needsUpdate = true;
}
}]);
inherits(OutlineBlendMaterial, _ShaderMaterial);
return OutlineBlendMaterial;
}(ShaderMaterial);
var fragment$13 = "uniform sampler2D tMask;\r\n\r\nvarying vec2 vUv0;\r\nvarying vec2 vUv1;\r\nvarying vec2 vUv2;\r\nvarying vec2 vUv3;\r\n\r\nvoid main() {\r\n\r\n\tvec2 c0 = texture2D(tMask, vUv0).rg;\r\n\tvec2 c1 = texture2D(tMask, vUv1).rg;\r\n\tvec2 c2 = texture2D(tMask, vUv2).rg;\r\n\tvec2 c3 = texture2D(tMask, vUv3).rg;\r\n\r\n\tfloat d0 = (c0.x - c1.x) * 0.5;\r\n\tfloat d1 = (c2.x - c3.x) * 0.5;\r\n\tfloat d = length(vec2(d0, d1));\r\n\r\n\tfloat a0 = min(c0.y, c1.y);\r\n\tfloat a1 = min(c2.y, c3.y);\r\n\tfloat visibilityFactor = min(a0, a1);\r\n\r\n\tgl_FragColor.rg = (1.0 - visibilityFactor > 0.001) ? vec2(d, 0.0) : vec2(0.0, d);\r\n\r\n}\r\n";
var vertex$13 = "uniform vec2 texelSize;\r\n\r\nvarying vec2 vUv0;\r\nvarying vec2 vUv1;\r\nvarying vec2 vUv2;\r\nvarying vec2 vUv3;\r\n\r\nvoid main() {\r\n\r\n\tvUv0 = vec2(uv.x + texelSize.x, uv.y);\r\n\tvUv1 = vec2(uv.x - texelSize.x, uv.y);\r\n\tvUv2 = vec2(uv.x, uv.y + texelSize.y);\r\n\tvUv3 = vec2(uv.x, uv.y - texelSize.y);\r\n\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n";
/**
* An outline edge detection shader material.
*/
var OutlineEdgesMaterial =
/*#__PURE__*/
function (_ShaderMaterial) {
/**
* Constructs a new outline edge detection material.
*
* @param {Vector2} [texelSize] - The absolute screen texel size.
*/
function OutlineEdgesMaterial() {
var _this;
var texelSize = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : new Vector2();
classCallCheck(this, OutlineEdgesMaterial);
_this = possibleConstructorReturn(this, getPrototypeOf$2(OutlineEdgesMaterial).call(this, {
type: "OutlineEdgesMaterial",
uniforms: {
tMask: new Uniform(null),
texelSize: new Uniform(new Vector2())
},
fragmentShader: fragment$13,
vertexShader: vertex$13,
depthWrite: false,
depthTest: false
}));
_this.setTexelSize(texelSize.x, texelSize.y);
return _this;
}
/**
* Sets the texel size.
*
* @param {Number} x - The texel width.
* @param {Number} y - The texel height.
*/
createClass(OutlineEdgesMaterial, [{
key: "setTexelSize",
value: function setTexelSize(x, y) {
this.uniforms.texelSize.value.set(x, y);
}
}]);
inherits(OutlineEdgesMaterial, _ShaderMaterial);
return OutlineEdgesMaterial;
}(ShaderMaterial);
var fragment$14 = "uniform sampler2D tDiffuse;\r\nuniform float granularity;\r\nuniform float dx;\r\nuniform float dy;\r\n\r\nvarying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvec4 texel;\r\n\r\n\tif(granularity > 0.0) {\r\n\r\n\t\tvec2 coord = vec2(\r\n\t\t\tdx * (floor(vUv.x / dx) + 0.5),\r\n\t\t\tdy * (floor(vUv.y / dy) + 0.5)\r\n\t\t);\r\n\r\n\t\ttexel = texture2D(tDiffuse, coord);\r\n\r\n\t} else {\r\n\r\n\t\ttexel = texture2D(tDiffuse, vUv);\r\n\r\n\t}\r\n\r\n\tgl_FragColor = texel;\r\n\r\n}\r\n";
var vertex$14 = "varying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n";
/**
* A pixelation shader material.
*
* Original shader code by Robert Casanova:
* https://github.com/robertcasanova/pixelate-shader
*/
var PixelationMaterial =
/*#__PURE__*/
function (_ShaderMaterial) {
/**
* Constructs a new pixelation material.
*/
function PixelationMaterial() {
classCallCheck(this, PixelationMaterial);
return possibleConstructorReturn(this, getPrototypeOf$2(PixelationMaterial).call(this, {
type: "PixelationMaterial",
uniforms: {
tDiffuse: new Uniform(null),
granularity: new Uniform(1.0),
resolution: new Uniform(new Vector2(1.0, 1.0)),
dx: new Uniform(1.0),
dy: new Uniform(1.0)
},
fragmentShader: fragment$14,
vertexShader: vertex$14,
depthWrite: false,
depthTest: false
}));
}
/**
* The pixel granularity.
*
* @type {Number}
*/
createClass(PixelationMaterial, [{
key: "setResolution",
/**
* Sets the resolution.
*
* @param {Number} width - The width.
* @param {Number} height - The height.
*/
value: function setResolution(width, height) {
this.uniforms.resolution.value.set(width, height);
this.granularity = this.granularity;
}
}, {
key: "granularity",
get: function get() {
return this.uniforms.granularity.value;
}
/**
* A higher value yields coarser visuals.
*
* @type {Number}
*/
,
set: function set(x) {
var uniforms = this.uniforms;
var resolution = uniforms.resolution.value;
uniforms.granularity.value = x;
uniforms.dx.value = x / resolution.x;
uniforms.dy.value = x / resolution.y;
}
}]);
inherits(PixelationMaterial, _ShaderMaterial);
return PixelationMaterial;
}(ShaderMaterial);
var fragment$15 = "#include <common>\r\n\r\nuniform sampler2D tDiffuse;\r\nuniform sampler2D tDepth;\r\n\r\nuniform vec2 texelSize;\r\nuniform vec2 halfTexelSize;\r\n\r\nuniform float cameraNear;\r\nuniform float cameraFar;\r\n\r\nuniform float focalLength;\r\nuniform float focalStop;\r\n\r\nuniform float maxBlur;\r\nuniform float luminanceThreshold;\r\nuniform float luminanceGain;\r\nuniform float bias;\r\nuniform float fringe;\r\nuniform float ditherStrength;\r\n\r\n#ifdef SHADER_FOCUS\r\n\r\n\tuniform vec2 focusCoords;\r\n\r\n#else\r\n\r\n\tuniform float focalDepth;\r\n\r\n#endif\r\n\r\nvarying vec2 vUv;\r\n\r\n#ifndef USE_LOGDEPTHBUF\r\n\r\n\t#include <packing>\r\n\r\n\tfloat readDepth(sampler2D depthSampler, vec2 coord) {\r\n\r\n\t\tfloat fragCoordZ = texture2D(depthSampler, coord).x;\r\n\t\tfloat viewZ = perspectiveDepthToViewZ(fragCoordZ, cameraNear, cameraFar);\r\n\r\n\t\treturn viewZToOrthographicDepth(viewZ, cameraNear, cameraFar);\r\n\r\n\t}\r\n\r\n#endif\r\n\r\n#ifdef PENTAGON\r\n\r\n\tfloat penta(vec2 coords) {\r\n\r\n\t\tconst vec4 HS0 = vec4( 1.0, 0.0, 0.0, 1.0);\r\n\t\tconst vec4 HS1 = vec4( 0.309016994, 0.951056516, 0.0, 1.0);\r\n\t\tconst vec4 HS2 = vec4(-0.809016994, 0.587785252, 0.0, 1.0);\r\n\t\tconst vec4 HS3 = vec4(-0.809016994, -0.587785252, 0.0, 1.0);\r\n\t\tconst vec4 HS4 = vec4( 0.309016994, -0.951056516, 0.0, 1.0);\r\n\t\tconst vec4 HS5 = vec4( 0.0, 0.0, 1.0, 1.0);\r\n\r\n\t\tconst vec4 ONE = vec4(1.0);\r\n\r\n\t\tconst float P_FEATHER = 0.4;\r\n\t\tconst float N_FEATHER = -P_FEATHER;\r\n\r\n\t\tfloat inOrOut = -4.0;\r\n\r\n\t\tvec4 P = vec4(coords, vec2(RINGS_FLOAT - 1.3));\r\n\r\n\t\tvec4 dist = vec4(\r\n\t\t\tdot(P, HS0),\r\n\t\t\tdot(P, HS1),\r\n\t\t\tdot(P, HS2),\r\n\t\t\tdot(P, HS3)\r\n\t\t);\r\n\r\n\t\tdist = smoothstep(N_FEATHER, P_FEATHER, dist);\r\n\r\n\t\tinOrOut += dot(dist, ONE);\r\n\r\n\t\tdist.x = dot(P, HS4);\r\n\t\tdist.y = HS5.w - abs(P.z);\r\n\r\n\t\tdist = smoothstep(N_FEATHER, P_FEATHER, dist);\r\n\t\tinOrOut += dist.x;\r\n\r\n\t\treturn clamp(inOrOut, 0.0, 1.0);\r\n\r\n\t}\r\n\r\n#endif\r\n\r\n#ifdef SHOW_FOCUS\r\n\r\n\tvec3 debugFocus(vec3 c, float blur, float depth) {\r\n\r\n\t\tfloat edge = 0.002 * depth;\r\n\t\tfloat m = clamp(smoothstep(0.0, edge, blur), 0.0, 1.0);\r\n\t\tfloat e = clamp(smoothstep(1.0 - edge, 1.0, blur), 0.0, 1.0);\r\n\r\n\t\tc = mix(c, vec3(1.0, 0.5, 0.0), (1.0 - m) * 0.6);\r\n\t\tc = mix(c, vec3(0.0, 0.5, 1.0), ((1.0 - e) - (1.0 - m)) * 0.2);\r\n\r\n\t\treturn c;\r\n\r\n\t}\r\n\r\n#endif\r\n\r\n#ifdef VIGNETTE\r\n\r\n\tfloat vignette() {\r\n\r\n\t\tconst vec2 CENTER = vec2(0.5);\r\n\r\n\t\tconst float VIGNETTE_OUT = 1.3;\r\n\t\tconst float VIGNETTE_IN = 0.0;\r\n\t\tconst float VIGNETTE_FADE = 22.0; \r\n\r\n\t\tfloat d = distance(vUv, CENTER);\r\n\t\td = smoothstep(VIGNETTE_OUT + (focalStop / VIGNETTE_FADE), VIGNETTE_IN + (focalStop / VIGNETTE_FADE), d);\r\n\r\n\t\treturn clamp(d, 0.0, 1.0);\r\n\r\n\t}\r\n\r\n#endif\r\n\r\nvec2 rand2(vec2 coord) {\r\n\r\n\tvec2 noise;\r\n\r\n\t#ifdef NOISE\r\n\r\n\t\tconst float a = 12.9898;\r\n\t\tconst float b = 78.233;\r\n\t\tconst float c = 43758.5453;\r\n\r\n\t\tnoise.x = clamp(fract(sin(mod(dot(coord, vec2(a, b)), 3.14)) * c), 0.0, 1.0) * 2.0 - 1.0;\r\n\t\tnoise.y = clamp(fract(sin(mod(dot(coord, vec2(a, b) * 2.0), 3.14)) * c), 0.0, 1.0) * 2.0 - 1.0;\r\n\r\n\t#else\r\n\r\n\t\tnoise.x = ((fract(1.0 - coord.s * halfTexelSize.x) * 0.25) + (fract(coord.t * halfTexelSize.y) * 0.75)) * 2.0 - 1.0;\r\n\t\tnoise.y = ((fract(1.0 - coord.s * halfTexelSize.x) * 0.75) + (fract(coord.t * halfTexelSize.y) * 0.25)) * 2.0 - 1.0;\r\n\r\n\t#endif\r\n\r\n\treturn noise;\r\n\r\n}\r\n\r\nvec3 processTexel(vec2 coords, float blur) {\r\n\r\n\tvec3 c;\r\n\tc.r = texture2D(tDiffuse, coords + vec2(0.0, 1.0) * texelSize * fringe * blur).r;\r\n\tc.g = texture2D(tDiffuse, coords + vec2(-0.866, -0.5) * texelSize * fringe * blur).g;\r\n\tc.b = texture2D(tDiffuse, coords + vec2(0.866, -0.5) * texelSize * fringe * blur).b;\r\n\r\n\t// Calculate the luminance of the constructed colour.\r\n\tfloat luminance = linearToRelativeLuminance(c);\r\n\tfloat threshold = max((luminance - luminanceThreshold) * luminanceGain, 0.0);\r\n\r\n\treturn c + mix(vec3(0.0), c, threshold * blur);\r\n\r\n}\r\n\r\nfloat linearize(float depth) {\r\n\r\n\treturn -cameraFar * cameraNear / (depth * (cameraFar - cameraNear) - cameraFar);\r\n\r\n}\r\n\r\nfloat gather(float i, float j, float ringSamples, inout vec3 color, float w, float h, float blur) {\r\n\r\n\tconst float TWO_PI = 6.28318531;\r\n\r\n\tfloat step = TWO_PI / ringSamples;\r\n\tfloat pw = cos(j * step) * i;\r\n\tfloat ph = sin(j * step) * i;\r\n\r\n\t#ifdef PENTAGON\r\n\r\n\t\tfloat p = penta(vec2(pw, ph));\r\n\r\n\t#else\r\n\r\n\t\tfloat p = 1.0;\r\n\r\n\t#endif\r\n\r\n\tcolor += processTexel(vUv + vec2(pw * w, ph * h), blur) * mix(1.0, i / RINGS_FLOAT, bias) * p;\r\n\r\n\treturn mix(1.0, i / RINGS_FLOAT, bias) * p;\r\n\r\n}\r\n\r\nvoid main() {\r\n\r\n\t#ifdef USE_LOGDEPTHBUF\r\n\r\n\t\tfloat depth = linearize(texture2D(tDepth, vUv).x);\r\n\r\n\t#else\r\n\r\n\t\tfloat depth = linearize(readDepth(tDepth, vUv));\r\n\r\n\t#endif\r\n\r\n\t#ifdef SHADER_FOCUS\r\n\r\n\t\t#ifdef USE_LOGDEPTHBUF\r\n\r\n\t\t\tfloat fDepth = linearize(texture2D(tDepth, focusCoords).x);\r\n\r\n\t\t#else\r\n\r\n\t\t\tfloat fDepth = linearize(readDepth(tDepth, focusCoords));\r\n\r\n\t\t#endif\r\n\r\n\t#else\r\n\r\n\t\tfloat fDepth = focalDepth;\r\n\r\n\t#endif\r\n\r\n\t#ifdef MANUAL_DOF\r\n\r\n\t\tconst float nDoFStart = 1.0; \r\n\t\tconst float nDoFDist = 2.0;\r\n\t\tconst float fDoFStart = 1.0;\r\n\t\tconst float fDoFDist = 3.0;\r\n\r\n\t\tfloat focalPlane = depth - fDepth;\r\n\t\tfloat farDoF = (focalPlane - fDoFStart) / fDoFDist;\r\n\t\tfloat nearDoF = (-focalPlane - nDoFStart) / nDoFDist;\r\n\r\n\t\tfloat blur = (focalPlane > 0.0) ? farDoF : nearDoF;\r\n\r\n\t#else\r\n\r\n\t\tconst float CIRCLE_OF_CONFUSION = 0.03; // 35mm film = 0.03mm CoC.\r\n\r\n\t\tfloat focalPlaneMM = fDepth * 1000.0;\r\n\t\tfloat depthMM = depth * 1000.0;\r\n\r\n\t\tfloat focalPlane = (depthMM * focalLength) / (depthMM - focalLength);\r\n\t\tfloat farDoF = (focalPlaneMM * focalLength) / (focalPlaneMM - focalLength);\r\n\t\tfloat nearDoF = (focalPlaneMM - focalLength) / (focalPlaneMM * focalStop * CIRCLE_OF_CONFUSION);\r\n\r\n\t\tfloat blur = abs(focalPlane - farDoF) * nearDoF;\r\n\r\n\t#endif\r\n\r\n\tblur = clamp(blur, 0.0, 1.0);\r\n\r\n\t// Dithering.\r\n\tvec2 noise = rand2(vUv) * ditherStrength * blur;\r\n\r\n\tfloat blurFactorX = texelSize.x * blur * maxBlur + noise.x;\r\n\tfloat blurFactorY = texelSize.y * blur * maxBlur + noise.y;\r\n\r\n\tconst int MAX_RING_SAMPLES = RINGS_INT * SAMPLES_INT;\r\n\r\n\t// Calculation of final color.\r\n\tvec4 color;\r\n\r\n\tif(blur < 0.05) {\r\n\r\n\t\tcolor = texture2D(tDiffuse, vUv);\r\n\r\n\t} else {\r\n\r\n\t\tcolor = texture2D(tDiffuse, vUv);\r\n\r\n\t\tfloat s = 1.0;\r\n\t\tint ringSamples;\r\n\r\n\t\tfor(int i = 1; i <= RINGS_INT; ++i) {\r\n\r\n\t\t\tringSamples = i * SAMPLES_INT;\r\n\r\n\t\t\t// Constant loop.\r\n\t\t\tfor(int j = 0; j < MAX_RING_SAMPLES; ++j) {\r\n\r\n\t\t\t\t// Break earlier.\r\n\t\t\t\tif(j >= ringSamples) { break; }\r\n\r\n\t\t\t\ts += gather(float(i), float(j), float(ringSamples), color.rgb, blurFactorX, blurFactorY, blur);\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tcolor.rgb /= s; // Divide by sample count.\r\n\r\n\t}\r\n\r\n\t#ifdef SHOW_FOCUS\r\n\r\n\t\tcolor.rgb = debugFocus(color.rgb, blur, depth);\r\n\r\n\t#endif\r\n\r\n\t#ifdef VIGNETTE\r\n\r\n\t\tcolor.rgb *= vignette();\r\n\r\n\t#endif\r\n\r\n\tgl_FragColor = color;\r\n\r\n}\r\n";
var vertex$15 = "varying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n";
/**
* Depth of Field shader v2.4.
*
* Original shader code by Martins Upitis:
* http://blenderartists.org/forum/showthread.php?237488-GLSL-depth-of-field-with-bokeh-v2-4-(update)
*/
var RealisticBokehMaterial =
/*#__PURE__*/
function (_ShaderMaterial) {
/**
* Constructs a new bokeh2 material.
*
* @param {PerspectiveCamera} [camera] - The main camera.
* @param {Object} [options] - Additional options.
* @param {Vector2} [options.texelSize] - The absolute screen texel size.
* @param {Boolean} [options.rings=3] - The number of blurring iterations.
* @param {Boolean} [options.samples=2] - The amount of samples taken per ring.
* @param {Boolean} [options.showFocus=false] - Whether the focus point should be highlighted.
* @param {Boolean} [options.manualDoF=false] - Enables manual depth of field blur.
* @param {Boolean} [options.vignette=false] - Enables a vignette effect.
* @param {Boolean} [options.pentagon=false] - Enable to use a pentagonal shape to scale gathered texels.
* @param {Boolean} [options.shaderFocus=true] - Disable if you compute your own focalDepth (in metres!).
* @param {Boolean} [options.noise=true] - Disable if you don't want noise patterns for dithering.
* @param {Number} [options.maxBlur=1.0] - The maximum blur strength.
* @param {Number} [options.luminanceThreshold=0.5] - A luminance threshold.
* @param {Number} [options.luminanceGain=2.0] - A luminance gain factor.
* @param {Number} [options.bias=0.5] - A blur bias.
* @param {Number} [options.fringe=0.7] - A blur offset.
* @param {Number} [options.ditherStrength=0.0001] - The dither strength.
*/
function RealisticBokehMaterial() {
var _this;
var camera = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
classCallCheck(this, RealisticBokehMaterial);
var settings = Object.assign({
texelSize: null,
rings: 3,
samples: 2,
showFocus: false,
manualDoF: false,
vignette: false,
pentagon: false,
shaderFocus: true,
noise: true,
maxBlur: 1.0,
luminanceThreshold: 0.5,
luminanceGain: 2.0,
bias: 0.5,
fringe: 0.7,
ditherStrength: 0.0001
}, options);
_this = possibleConstructorReturn(this, getPrototypeOf$2(RealisticBokehMaterial).call(this, {
type: "RealisticBokehMaterial",
defines: {
RINGS_INT: settings.rings.toFixed(0),
RINGS_FLOAT: settings.rings.toFixed(1),
SAMPLES_INT: settings.samples.toFixed(0),
SAMPLES_FLOAT: settings.samples.toFixed(1)
},
uniforms: {
tDiffuse: new Uniform(null),
tDepth: new Uniform(null),
texelSize: new Uniform(new Vector2()),
halfTexelSize: new Uniform(new Vector2()),
cameraNear: new Uniform(0.1),
cameraFar: new Uniform(2000),
focalLength: new Uniform(24.0),
focalStop: new Uniform(0.9),
maxBlur: new Uniform(settings.maxBlur),
luminanceThreshold: new Uniform(settings.luminanceThreshold),
luminanceGain: new Uniform(settings.luminanceGain),
bias: new Uniform(settings.bias),
fringe: new Uniform(settings.fringe),
ditherStrength: new Uniform(settings.ditherStrength),
focusCoords: new Uniform(new Vector2(0.5, 0.5)),
focalDepth: new Uniform(1.0)
},
fragmentShader: fragment$15,
vertexShader: vertex$15,
depthWrite: false,
depthTest: false
}));
_this.setShowFocusEnabled(settings.showFocus);
_this.setManualDepthOfFieldEnabled(settings.manualDoF);
_this.setVignetteEnabled(settings.vignette);
_this.setPentagonEnabled(settings.pentagon);
_this.setShaderFocusEnabled(settings.shaderFocus);
_this.setNoiseEnabled(settings.noise);
if (settings.texelSize !== null) {
_this.setTexelSize(settings.texelSize.x, settings.texelSize.y);
}
_this.adoptCameraSettings(camera);
return _this;
}
/**
* Defines whether the focus should be shown.
*
* @param {Boolean} enabled - True if the focus should be shown, false otherwise.
*/
createClass(RealisticBokehMaterial, [{
key: "setShowFocusEnabled",
value: function setShowFocusEnabled(enabled) {
if (enabled) {
this.defines.SHOW_FOCUS = "1";
} else {
delete this.defines.SHOW_FOCUS;
}
this.needsUpdate = true;
}
/**
* Defines whether manual Depth of Field should be enabled.
*
* @param {Boolean} enabled - Whether manual DoF should be enabled.
*/
}, {
key: "setManualDepthOfFieldEnabled",
value: function setManualDepthOfFieldEnabled(enabled) {
if (enabled) {
this.defines.MANUAL_DOF = "1";
} else {
delete this.defines.MANUAL_DOF;
}
this.needsUpdate = true;
}
/**
* Defines whether the Vignette effect should be enabled.
*
* @param {Boolean} enabled - Whether the Vignette effect should be enabled.
*/
}, {
key: "setVignetteEnabled",
value: function setVignetteEnabled(enabled) {
if (enabled) {
this.defines.VIGNETTE = "1";
} else {
delete this.defines.VIGNETTE;
}
this.needsUpdate = true;
}
/**
* Defines whether the pentagonal blur effect should be enabled.
*
* @param {Boolean} enabled - Whether the pentagonal blur effect should be enabled.
*/
}, {
key: "setPentagonEnabled",
value: function setPentagonEnabled(enabled) {
if (enabled) {
this.defines.PENTAGON = "1";
} else {
delete this.defines.PENTAGON;
}
this.needsUpdate = true;
}
/**
* Enables or disables the automatic shader focus.
*
* @param {Boolean} enabled - Whether the shader focus should be enabled.
*/
}, {
key: "setShaderFocusEnabled",
value: function setShaderFocusEnabled(enabled) {
if (enabled) {
this.defines.SHADER_FOCUS = "1";
} else {
delete this.defines.SHADER_FOCUS;
}
this.needsUpdate = true;
}
/**
* Defines whether the dithering should compute noise.
*
* @param {Boolean} enabled - Whether noise-based dithering should be enabled.
*/
}, {
key: "setNoiseEnabled",
value: function setNoiseEnabled(enabled) {
if (enabled) {
this.defines.NOISE = "1";
} else {
delete this.defines.NOISE;
}
this.needsUpdate = true;
}
/**
* Sets the texel size.
*
* @param {Number} x - The texel width.
* @param {Number} y - The texel height.
*/
}, {
key: "setTexelSize",
value: function setTexelSize(x, y) {
this.uniforms.texelSize.value.set(x, y);
this.uniforms.halfTexelSize.value.set(x, y).multiplyScalar(0.5);
}
/**
* Adopts the near and far plane and the focal length of the given camera.
*
* @param {PerspectiveCamera} camera - The main camera.
*/
}, {
key: "adoptCameraSettings",
value: function adoptCameraSettings(camera) {
if (camera !== null) {
this.uniforms.cameraNear.value = camera.near;
this.uniforms.cameraFar.value = camera.far;
this.uniforms.focalLength.value = camera.getFocalLength(); // unit: mm.
}
}
}]);
inherits(RealisticBokehMaterial, _ShaderMaterial);
return RealisticBokehMaterial;
}(ShaderMaterial);
var fragment$16 = "#include <common>\r\n\r\nuniform sampler2D tDiffuse;\r\nuniform vec2 center;\r\nuniform float aspect;\r\nuniform float waveSize;\r\nuniform float radius;\r\nuniform float maxRadius;\r\nuniform float amplitude;\r\n\r\nvarying vec2 vUv;\r\nvarying float vSize;\r\n\r\nvoid main() {\r\n\r\n\tvec2 aspectCorrection = vec2(aspect, 1.0);\r\n\r\n\tvec2 difference = vUv * aspectCorrection - center * aspectCorrection;\r\n\tfloat distance = sqrt(dot(difference, difference)) * vSize;\r\n\r\n\tvec2 displacement = vec2(0.0);\r\n\r\n\tif(distance > radius) {\r\n\r\n\t\tif(distance < radius + waveSize) {\r\n\r\n\t\t\tfloat angle = (distance - radius) * PI2 / waveSize;\r\n\t\t\tfloat cosSin = (1.0 - cos(angle)) * 0.5;\r\n\r\n\t\t\tfloat extent = maxRadius + waveSize;\r\n\t\t\tfloat decay = max(extent - distance * distance, 0.0) / extent;\r\n\r\n\t\t\tdisplacement = ((cosSin * amplitude * difference) / distance) * decay;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tgl_FragColor = texture2D(tDiffuse, vUv - displacement);\r\n\r\n}\r\n";
var vertex$16 = "uniform float size;\r\nuniform float scale;\r\nuniform float cameraDistance;\r\n\r\nvarying vec2 vUv;\r\nvarying float vSize;\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\tvSize = (0.1 * cameraDistance) / size;\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n";
/**
* A shock wave shader material.
*
* Based on a Gist by Jean-Philippe Sarda:
* https://gist.github.com/jpsarda/33cea67a9f2ecb0a0eda
*/
var ShockWaveMaterial =
/*#__PURE__*/
function (_ShaderMaterial) {
/**
* Constructs a new shock wave material.
*
* @param {Object} [options] - The options.
* @param {Number} [options.waveSize=0.2] - The wave size.
* @param {Number} [options.amplitude=0.05] - The distortion amplitude.
*/
function ShockWaveMaterial() {
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
classCallCheck(this, ShockWaveMaterial);
var settings = Object.assign({
maxRadius: 1.0,
waveSize: 0.2,
amplitude: 0.05
}, options);
return possibleConstructorReturn(this, getPrototypeOf$2(ShockWaveMaterial).call(this, {
type: "ShockWaveMaterial",
uniforms: {
tDiffuse: new Uniform(null),
center: new Uniform(new Vector2(0.5, 0.5)),
aspect: new Uniform(1.0),
cameraDistance: new Uniform(1.0),
size: new Uniform(1.0),
radius: new Uniform(-settings.waveSize),
maxRadius: new Uniform(settings.maxRadius),
waveSize: new Uniform(settings.waveSize),
amplitude: new Uniform(settings.amplitude)
},
fragmentShader: fragment$16,
vertexShader: vertex$16,
depthWrite: false,
depthTest: false
}));
}
inherits(ShockWaveMaterial, _ShaderMaterial);
return ShockWaveMaterial;
}(ShaderMaterial);
var fragment$17 = "uniform sampler2D tDiffuse;\r\nuniform sampler2D tWeights;\r\n\r\nuniform vec2 texelSize;\r\n\r\nvarying vec2 vUv;\r\nvarying vec4 vOffset;\r\n\r\nvoid main() {\r\n\r\n\t// Fetch the blending weights for current pixel.\r\n\tvec4 a;\r\n\ta.xz = texture2D(tWeights, vUv).xz;\r\n\ta.y = texture2D(tWeights, vOffset.zw).g;\r\n\ta.w = texture2D(tWeights, vOffset.xy).a;\r\n\r\n\tvec4 color;\r\n\r\n\t// Check if there is any blending weight with a value greater than 0.0.\r\n\tif(dot(a, vec4(1.0)) < 1e-5) {\r\n\r\n\t\tcolor = texture2D(tDiffuse, vUv, 0.0);\r\n\r\n\t} else {\r\n\r\n\t\t/* Up to four lines can be crossing a pixel (one through each edge).\r\n\t\t * The line with the maximum weight for each direction is favoured.\r\n\t\t */\r\n\r\n\t\tvec2 offset;\r\n\t\toffset.x = a.a > a.b ? a.a : -a.b; // Left vs. right.\r\n\t\toffset.y = a.g > a.r ? -a.g : a.r; // Top vs. bottom (changed signs).\r\n\r\n\t\t// Go in the direction with the maximum weight (horizontal vs. vertical).\r\n\t\tif(abs(offset.x) > abs(offset.y)) {\r\n\r\n\t\t\toffset.y = 0.0;\r\n\r\n\t\t} else {\r\n\r\n\t\t\toffset.x = 0.0;\r\n\r\n\t\t}\r\n\r\n\t\t// Fetch the opposite color and lerp by hand.\r\n\t\tcolor = texture2D(tDiffuse, vUv, 0.0);\r\n\t\tvec2 coord = vUv + sign(offset) * texelSize;\r\n\t\tvec4 oppositeColor = texture2D(tDiffuse, coord, 0.0);\r\n\t\tfloat s = abs(offset.x) > abs(offset.y) ? abs(offset.x) : abs(offset.y);\r\n\r\n\t\t// Gamma correction.\r\n\t\tcolor.rgb = pow(abs(color.rgb), vec3(2.2));\r\n\t\toppositeColor.rgb = pow(abs(oppositeColor.rgb), vec3(2.2));\r\n\t\tcolor = mix(color, oppositeColor, s);\r\n\t\tcolor.rgb = pow(abs(color.rgb), vec3(1.0 / 2.2));\r\n\r\n\t}\r\n\r\n\tgl_FragColor = color;\r\n\r\n}\r\n";
var vertex$17 = "uniform vec2 texelSize;\r\n\r\nvarying vec2 vUv;\r\nvarying vec4 vOffset;\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\r\n\tvOffset = uv.xyxy + texelSize.xyxy * vec4(1.0, 0.0, 0.0, -1.0); // Changed sign in W component.\r\n\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n";
/**
* Subpixel Morphological Antialiasing.
*
* This material is used to render the final antialiasing.
*/
var SMAABlendMaterial =
/*#__PURE__*/
function (_ShaderMaterial) {
/**
* Constructs a new SMAA blend material.
*
* @param {Vector2} [texelSize] - The absolute screen texel size.
*/
function SMAABlendMaterial() {
var texelSize = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : new Vector2();
classCallCheck(this, SMAABlendMaterial);
return possibleConstructorReturn(this, getPrototypeOf$2(SMAABlendMaterial).call(this, {
type: "SMAABlendMaterial",
uniforms: {
tDiffuse: new Uniform(null),
tWeights: new Uniform(null),
texelSize: new Uniform(texelSize)
},
fragmentShader: fragment$17,
vertexShader: vertex$17,
depthWrite: false,
depthTest: false
}));
}
inherits(SMAABlendMaterial, _ShaderMaterial);
return SMAABlendMaterial;
}(ShaderMaterial);
var fragment$18 = "#define sampleLevelZeroOffset(t, coord, offset) texture2D(t, coord + float(offset) * texelSize, 0.0)\r\n\r\nuniform sampler2D tDiffuse;\r\nuniform sampler2D tArea;\r\nuniform sampler2D tSearch;\r\n\r\nuniform vec2 texelSize;\r\n\r\nvarying vec2 vUv;\r\nvarying vec4 vOffset[3];\r\nvarying vec2 vPixCoord;\r\n\r\nvec2 round(vec2 x) {\r\n\r\n\treturn sign(x) * floor(abs(x) + 0.5);\r\n\r\n}\r\n\r\nfloat searchLength(vec2 e, float bias, float scale) {\r\n\r\n\t// Not required if tSearch accesses are set to point.\r\n\t// const vec2 SEARCH_TEX_PIXEL_SIZE = 1.0 / vec2(66.0, 33.0);\r\n\t// e = vec2(bias, 0.0) + 0.5 * SEARCH_TEX_PIXEL_SIZE + e * vec2(scale, 1.0) * vec2(64.0, 32.0) * SEARCH_TEX_PIXEL_SIZE;\r\n\r\n\te.r = bias + e.r * scale;\r\n\r\n\treturn 255.0 * texture2D(tSearch, e, 0.0).r;\r\n\r\n}\r\n\r\nfloat searchXLeft(vec2 texCoord, float end) {\r\n\r\n\t/* @PSEUDO_GATHER4\r\n\t * This texCoord has been offset by (-0.25, -0.125) in the vertex shader to\r\n\t * sample between edge, thus fetching four edges in a row.\r\n\t * Sampling with different offsets in each direction allows to disambiguate\r\n\t * which edges are active from the four fetched ones.\r\n\t */\r\n\r\n\tvec2 e = vec2(0.0, 1.0);\r\n\r\n\tfor(int i = 0; i < MAX_SEARCH_STEPS_INT; ++i) {\r\n\r\n\t\te = texture2D(tDiffuse, texCoord, 0.0).rg;\r\n\t\ttexCoord -= vec2(2.0, 0.0) * texelSize;\r\n\r\n\t\tif(!(texCoord.x > end && e.g > 0.8281 && e.r == 0.0)) { break; }\r\n\r\n\t}\r\n\r\n\t// Correct the previously applied offset (-0.25, -0.125).\r\n\ttexCoord.x += 0.25 * texelSize.x;\r\n\r\n\t// The searches are biased by 1, so adjust the coords accordingly.\r\n\ttexCoord.x += texelSize.x;\r\n\r\n\t// Disambiguate the length added by the last step.\r\n\ttexCoord.x += 2.0 * texelSize.x; // Undo last step.\r\n\ttexCoord.x -= texelSize.x * searchLength(e, 0.0, 0.5);\r\n\r\n\treturn texCoord.x;\r\n\r\n}\r\n\r\nfloat searchXRight(vec2 texCoord, float end) {\r\n\r\n\tvec2 e = vec2(0.0, 1.0);\r\n\r\n\tfor(int i = 0; i < MAX_SEARCH_STEPS_INT; ++i) {\r\n\r\n\t\te = texture2D(tDiffuse, texCoord, 0.0).rg;\r\n\t\ttexCoord += vec2(2.0, 0.0) * texelSize;\r\n\r\n\t\tif(!(texCoord.x < end && e.g > 0.8281 && e.r == 0.0)) { break; }\r\n\r\n\t}\r\n\r\n\ttexCoord.x -= 0.25 * texelSize.x;\r\n\ttexCoord.x -= texelSize.x;\r\n\ttexCoord.x -= 2.0 * texelSize.x;\r\n\ttexCoord.x += texelSize.x * searchLength(e, 0.5, 0.5);\r\n\r\n\treturn texCoord.x;\r\n\r\n}\r\n\r\nfloat searchYUp(vec2 texCoord, float end) {\r\n\r\n\tvec2 e = vec2(1.0, 0.0);\r\n\r\n\tfor(int i = 0; i < MAX_SEARCH_STEPS_INT; ++i) {\r\n\r\n\t\te = texture2D(tDiffuse, texCoord, 0.0).rg;\r\n\t\ttexCoord += vec2(0.0, 2.0) * texelSize; // Changed sign.\r\n\r\n\t\tif(!(texCoord.y > end && e.r > 0.8281 && e.g == 0.0)) { break; }\r\n\r\n\t}\r\n\r\n\ttexCoord.y -= 0.25 * texelSize.y; // Changed sign.\r\n\ttexCoord.y -= texelSize.y; // Changed sign.\r\n\ttexCoord.y -= 2.0 * texelSize.y; // Changed sign.\r\n\ttexCoord.y += texelSize.y * searchLength(e.gr, 0.0, 0.5); // Changed sign.\r\n\r\n\treturn texCoord.y;\r\n\r\n}\r\n\r\nfloat searchYDown(vec2 texCoord, float end) {\r\n\r\n\tvec2 e = vec2(1.0, 0.0);\r\n\r\n\tfor(int i = 0; i < MAX_SEARCH_STEPS_INT; ++i ) {\r\n\r\n\t\te = texture2D(tDiffuse, texCoord, 0.0).rg;\r\n\t\ttexCoord -= vec2(0.0, 2.0) * texelSize; // Changed sign.\r\n\r\n\t\tif(!(texCoord.y < end && e.r > 0.8281 && e.g == 0.0)) { break; }\r\n\r\n\t}\r\n\r\n\ttexCoord.y += 0.25 * texelSize.y; // Changed sign.\r\n\ttexCoord.y += texelSize.y; // Changed sign.\r\n\ttexCoord.y += 2.0 * texelSize.y; // Changed sign.\r\n\ttexCoord.y -= texelSize.y * searchLength(e.gr, 0.5, 0.5); // Changed sign.\r\n\r\n\treturn texCoord.y;\r\n\r\n}\r\n\r\nvec2 area(vec2 dist, float e1, float e2, float offset) {\r\n\r\n\t// Rounding prevents precision errors of bilinear filtering.\r\n\tvec2 texCoord = AREATEX_MAX_DISTANCE * round(4.0 * vec2(e1, e2)) + dist;\r\n\r\n\t// Scale and bias for texel space translation.\r\n\ttexCoord = AREATEX_PIXEL_SIZE * texCoord + (0.5 * AREATEX_PIXEL_SIZE);\r\n\r\n\t// Move to proper place, according to the subpixel offset.\r\n\ttexCoord.y += AREATEX_SUBTEX_SIZE * offset;\r\n\r\n\treturn texture2D(tArea, texCoord, 0.0).rg;\r\n\r\n}\r\n\r\nvoid main() {\r\n\r\n\tvec4 weights = vec4(0.0);\r\n\tvec4 subsampleIndices = vec4(0.0);\r\n\tvec2 e = texture2D(tDiffuse, vUv).rg;\r\n\r\n\tif(e.g > 0.0) {\r\n\r\n\t\t// Edge at north.\r\n\t\tvec2 d;\r\n\r\n\t\t// Find the distance to the left.\r\n\t\tvec2 coords;\r\n\t\tcoords.x = searchXLeft(vOffset[0].xy, vOffset[2].x);\r\n\t\tcoords.y = vOffset[1].y; // vOffset[1].y = vUv.y - 0.25 * texelSize.y (@CROSSING_OFFSET)\r\n\t\td.x = coords.x;\r\n\r\n\t\t/* Now fetch the left crossing edges, two at a time using bilinear\r\n\t\tfiltering. Sampling at -0.25 (see @CROSSING_OFFSET) enables to discern what\r\n\t\tvalue each edge has. */\r\n\t\tfloat e1 = texture2D(tDiffuse, coords, 0.0).r;\r\n\r\n\t\t// Find the distance to the right.\r\n\t\tcoords.x = searchXRight(vOffset[0].zw, vOffset[2].y);\r\n\t\td.y = coords.x;\r\n\r\n\t\t/* Translate distances to pixel units for better interleave arithmetic and\r\n\t\tmemory accesses. */\r\n\t\td = d / texelSize.x - vPixCoord.x;\r\n\r\n\t\t// The area texture is compressed quadratically.\r\n\t\tvec2 sqrtD = sqrt(abs(d));\r\n\r\n\t\t// Fetch the right crossing edges.\r\n\t\tcoords.y -= texelSize.y; // WebGL port note: Added.\r\n\t\tfloat e2 = sampleLevelZeroOffset(tDiffuse, coords, ivec2(1, 0)).r;\r\n\r\n\t\t// Pattern recognised, now get the actual area.\r\n\t\tweights.rg = area(sqrtD, e1, e2, subsampleIndices.y);\r\n\r\n\t}\r\n\r\n\tif(e.r > 0.0) {\r\n\r\n\t\t// Edge at west.\r\n\t\tvec2 d;\r\n\r\n\t\t// Find the distance to the top.\r\n\t\tvec2 coords;\r\n\t\tcoords.y = searchYUp(vOffset[1].xy, vOffset[2].z);\r\n\t\tcoords.x = vOffset[0].x; // vOffset[1].x = vUv.x - 0.25 * texelSize.x;\r\n\t\td.x = coords.y;\r\n\r\n\t\t// Fetch the top crossing edges.\r\n\t\tfloat e1 = texture2D(tDiffuse, coords, 0.0).g;\r\n\r\n\t\t// Find the distance to the bottom.\r\n\t\tcoords.y = searchYDown(vOffset[1].zw, vOffset[2].w);\r\n\t\td.y = coords.y;\r\n\r\n\t\t// Distances in pixel units.\r\n\t\td = d / texelSize.y - vPixCoord.y;\r\n\r\n\t\t// The area texture is compressed quadratically.\r\n\t\tvec2 sqrtD = sqrt(abs(d));\r\n\r\n\t\t// Fetch the bottom crossing edges.\r\n\t\tcoords.y -= texelSize.y; // WebGL port note: Added.\r\n\t\tfloat e2 = sampleLevelZeroOffset(tDiffuse, coords, ivec2(0, 1)).g;\r\n\r\n\t\t// Get the area for this direction.\r\n\t\tweights.ba = area(sqrtD, e1, e2, subsampleIndices.x);\r\n\r\n\t}\r\n\r\n\tgl_FragColor = weights;\r\n\r\n}\r\n";
var vertex$18 = "uniform vec2 texelSize;\r\n\r\nvarying vec2 vUv;\r\nvarying vec4 vOffset[3];\r\nvarying vec2 vPixCoord;\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\r\n\tvPixCoord = uv / texelSize;\r\n\r\n\t// Offsets for the searches (see @PSEUDO_GATHER4).\r\n\tvOffset[0] = uv.xyxy + texelSize.xyxy * vec4(-0.25, 0.125, 1.25, 0.125); // Changed sign in Y and W components.\r\n\tvOffset[1] = uv.xyxy + texelSize.xyxy * vec4(-0.125, 0.25, -0.125, -1.25); //Changed sign in Y and W components.\r\n\r\n\t// This indicates the ends of the loops.\r\n\tvOffset[2] = vec4(vOffset[0].xz, vOffset[1].yw) + vec4(-2.0, 2.0, -2.0, 2.0) * texelSize.xxyy * MAX_SEARCH_STEPS_FLOAT;\r\n\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n";
/**
* Subpixel Morphological Antialiasing.
*
* This material computes weights for detected edges.
*/
var SMAAWeightsMaterial =
/*#__PURE__*/
function (_ShaderMaterial) {
/**
* Constructs a new SMAA weights material.
*
* @param {Vector2} [texelSize] - The absolute screen texel size.
*/
function SMAAWeightsMaterial() {
var texelSize = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : new Vector2();
classCallCheck(this, SMAAWeightsMaterial);
return possibleConstructorReturn(this, getPrototypeOf$2(SMAAWeightsMaterial).call(this, {
type: "SMAAWeightsMaterial",
defines: {
// Configurable settings:
MAX_SEARCH_STEPS_INT: "8",
MAX_SEARCH_STEPS_FLOAT: "8.0",
// Non-configurable settings:
AREATEX_MAX_DISTANCE: "16.0",
AREATEX_PIXEL_SIZE: "(1.0 / vec2(160.0, 560.0))",
AREATEX_SUBTEX_SIZE: "(1.0 / 7.0)",
SEARCHTEX_SIZE: "vec2(66.0, 33.0)",
SEARCHTEX_PACKED_SIZE: "vec2(64.0, 16.0)"
},
uniforms: {
tDiffuse: new Uniform(null),
tArea: new Uniform(null),
tSearch: new Uniform(null),
texelSize: new Uniform(texelSize)
},
fragmentShader: fragment$18,
vertexShader: vertex$18,
depthWrite: false,
depthTest: false
}));
}
/**
* Sets the maximum amount of steps performed in the horizontal/vertical
* pattern searches, at each side of the pixel.
*
* In number of pixels, it's actually the double. So the maximum line length
* perfectly handled by, for example 16, is 64 (perfectly means that longer
* lines won't look as good, but are still antialiased).
*
* @param {Number} steps - The search steps. Range: [0, 112].
*/
createClass(SMAAWeightsMaterial, [{
key: "setOrthogonalSearchSteps",
value: function setOrthogonalSearchSteps(steps) {
this.defines.MAX_SEARCH_STEPS_INT = steps.toFixed("0");
this.defines.MAX_SEARCH_STEPS_FLOAT = steps.toFixed("1");
this.needsUpdate = true;
}
}]);
inherits(SMAAWeightsMaterial, _ShaderMaterial);
return SMAAWeightsMaterial;
}(ShaderMaterial);
var fragment$19 = "#include <common>\r\n#include <dithering_pars_fragment>\r\n\r\nuniform sampler2D tDiffuse;\r\nuniform float middleGrey;\r\nuniform float maxLuminance;\r\n\r\n#ifdef ADAPTED_LUMINANCE\r\n\r\n\tuniform sampler2D luminanceMap;\r\n\r\n#else\r\n\r\n\tuniform float averageLuminance;\r\n\r\n#endif\r\n\r\nvarying vec2 vUv;\r\n\r\nvec3 toneMap(vec3 c) {\r\n\r\n\t#ifdef ADAPTED_LUMINANCE\r\n\r\n\t\t// Get the calculated average luminance by sampling the center.\r\n\t\tfloat lumAvg = texture2D(luminanceMap, vec2(0.5)).r;\r\n\r\n\t#else\r\n\r\n\t\tfloat lumAvg = averageLuminance;\r\n\r\n\t#endif\r\n\r\n\t// Calculate the luminance of the current pixel.\r\n\tfloat lumPixel = linearToRelativeLuminance(c);\r\n\r\n\t// Apply the modified operator (Reinhard Eq. 4).\r\n\tfloat lumScaled = (lumPixel * middleGrey) / lumAvg;\r\n\r\n\tfloat lumCompressed = (lumScaled * (1.0 + (lumScaled / (maxLuminance * maxLuminance)))) / (1.0 + lumScaled);\r\n\r\n\treturn lumCompressed * c;\r\n\r\n}\r\n\r\nvoid main() {\r\n\r\n\tvec4 texel = texture2D(tDiffuse, vUv);\r\n\tgl_FragColor = vec4(toneMap(texel.rgb), texel.a);\r\n\r\n\t#include <dithering_fragment>\r\n\r\n}\r\n";
var vertex$19 = "varying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n";
/**
* Full-screen tone-mapping shader material.
*
* This material supports dithering.
*
* Reference:
* http://www.cis.rit.edu/people/faculty/ferwerda/publications/sig02_paper.pdf
*/
var ToneMappingMaterial =
/*#__PURE__*/
function (_ShaderMaterial) {
/**
* Constructs a new tone mapping material.
*/
function ToneMappingMaterial() {
classCallCheck(this, ToneMappingMaterial);
return possibleConstructorReturn(this, getPrototypeOf$2(ToneMappingMaterial).call(this, {
type: "ToneMappingMaterial",
uniforms: {
tDiffuse: new Uniform(null),
luminanceMap: new Uniform(null),
averageLuminance: new Uniform(1.0),
maxLuminance: new Uniform(16.0),
middleGrey: new Uniform(0.6)
},
fragmentShader: fragment$19,
vertexShader: vertex$19,
depthWrite: false,
depthTest: false
}));
}
inherits(ToneMappingMaterial, _ShaderMaterial);
return ToneMappingMaterial;
}(ShaderMaterial);
/**
* A collection of shader materials that are used in the post processing passes.
*
* @module postprocessing/materials
*/
/**
* An abstract pass.
*
* Passes that do not rely on the depth buffer should explicitly disable the
* depth test and depth write in their respective shader materials.
*
* @implements {Resizable}
* @implements {Disposable}
*/
var Pass =
/*#__PURE__*/
function () {
/**
* Constructs a new pass.
*
* @param {String} [name] - The name of this pass.
* @param {Scene} [scene] - The scene to render.
* @param {Camera} [camera] - The camera.
* @param {Mesh} [quad] - A quad that fills the screen to render 2D filter effects. Set this to null, if you don't need it (see {@link RenderPass}).
*/
function Pass() {
var name = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : "Pass";
var scene = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : new Scene();
var camera = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : new OrthographicCamera(-1, 1, 1, -1, 0, 1);
var quad = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : new Mesh(new PlaneBufferGeometry(2, 2), null);
classCallCheck(this, Pass);
/**
* The name of this pass.
*
* @type {String}
*/
this.name = name;
/**
* The scene to render.
*
* @type {Scene}
* @protected
*/
this.scene = scene;
/**
* The camera.
*
* @type {Camera}
* @protected
*/
this.camera = camera;
/**
* A quad mesh that fills the screen.
*
* @type {Mesh}
* @private
*/
this.quad = quad;
if (this.quad !== null) {
this.quad.frustumCulled = false;
if (this.scene !== null) {
this.scene.add(this.quad);
}
}
/**
* Indicates whether this pass should render to screen.
*
* @type {Boolean}
*/
this.renderToScreen = false;
/**
* Indicates whether this pass should be executed.
*
* @type {Boolean}
*/
this.enabled = true;
/**
* Indicates whether the {@link EffectComposer} should swap the frame
* buffers after this pass has finished rendering.
*
* Set this to `false` if this pass doesn't render to the output buffer or
* the screen. Otherwise, the contents of the input buffer will be lost.
*
* @type {Boolean}
*/
this.needsSwap = true;
}
/**
* The fullscreen material.
*
* @type {Material}
*/
createClass(Pass, [{
key: "render",
/**
* Renders the effect.
*
* This is an abstract method that must be overridden.
*
* @abstract
* @throws {Error} An error is thrown if the method is not overridden.
* @param {WebGLRenderer} renderer - The renderer.
* @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.
* @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.
* @param {Number} [delta] - The time between the last frame and the current one in seconds.
* @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.
*/
value: function render(renderer, inputBuffer, outputBuffer, delta, stencilTest) {
throw new Error("Render method not implemented!");
}
/**
* Updates this pass with the renderer's size.
*
* You may override this method in case you want to be informed about the main
* render size.
*
* The {@link EffectComposer} calls this method before this pass is
* initialized and every time its own size is updated.
*
* @param {Number} width - The renderer's width.
* @param {Number} height - The renderer's height.
* @example this.myRenderTarget.setSize(width, height);
*/
}, {
key: "setSize",
value: function setSize(width, height) {}
/**
* Performs initialization tasks.
*
* By overriding this method you gain access to the renderer. You'll also be
* able to configure your custom render targets to use the appropriate format
* (RGB or RGBA).
*
* The provided renderer can be used to warm up special off-screen render
* targets by performing a preliminary render operation.
*
* The {@link EffectComposer} calls this method when this pass is added to its
* queue, but not before its size has been set.
*
* @param {WebGLRenderer} renderer - The renderer.
* @param {Boolean} alpha - Whether the renderer uses the alpha channel or not.
* @example if(!alpha) { this.myRenderTarget.texture.format = RGBFormat; }
*/
}, {
key: "initialize",
value: function initialize(renderer, alpha) {}
/**
* Performs a shallow search for properties that define a dispose method and
* deletes them. The pass will be inoperative after this method was called!
*
* Disposable objects:
* - render targets
* - materials
* - textures
*
* The {@link EffectComposer} calls this method when it is being destroyed.
* You may, however, use it independently to free memory when you are certain
* that you don't need this pass anymore.
*/
}, {
key: "dispose",
value: function dispose() {
var key;
var _arr = Object.keys(this);
for (var _i = 0; _i < _arr.length; _i++) {
key = _arr[_i];
if (this[key] !== null && typeof this[key].dispose === "function") {
this[key].dispose();
this[key] = null;
}
}
if (this.material !== null) {
this.material.dispose();
}
}
}, {
key: "material",
get: function get() {
return this.quad !== null ? this.quad.material : null;
}
/**
* Sets the fullscreen material.
*
* The material will be assigned to the quad mesh that fills the screen.
*
* @type {Material}
*/
,
set: function set(value) {
if (this.quad !== null) {
this.quad.material = value;
}
}
}]);
return Pass;
}();
/**
* An efficient, incremental blur pass.
*
* Note: This pass allows the input and output buffer to be the same.
*/
var BlurPass =
/*#__PURE__*/
function (_Pass) {
/**
* Constructs a new blur pass.
*
* @param {Object} [options] - The options.
* @param {Number} [options.resolutionScale=0.5] - The render texture resolution scale, relative to the screen render size.
* @param {Number} [options.kernelSize=KernelSize.LARGE] - The blur kernel size.
*/
function BlurPass() {
var _this;
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
classCallCheck(this, BlurPass);
_this = possibleConstructorReturn(this, getPrototypeOf$2(BlurPass).call(this, "BlurPass"));
/**
* A render target.
*
* @type {WebGLRenderTarget}
* @private
*/
_this.renderTargetX = new WebGLRenderTarget(1, 1, {
minFilter: LinearFilter,
magFilter: LinearFilter,
stencilBuffer: false,
depthBuffer: false
});
_this.renderTargetX.texture.name = "Blur.TargetX";
_this.renderTargetX.texture.generateMipmaps = false;
/**
* A second render target.
*
* @type {WebGLRenderTarget}
* @private
*/
_this.renderTargetY = _this.renderTargetX.clone();
_this.renderTargetY.texture.name = "Blur.TargetY";
/**
* The resolution scale.
*
* You need to call {@link EffectComposer#setSize} after changing this
* value.
*
* @type {Number}
*/
_this.resolutionScale = options.resolutionScale !== undefined ? options.resolutionScale : 0.5;
/**
* A convolution shader material.
*
* @type {ConvolutionMaterial}
* @private
*/
_this.convolutionMaterial = new ConvolutionMaterial();
/**
* A convolution shader material that uses dithering.
*
* @type {ConvolutionMaterial}
* @private
*/
_this.ditheredConvolutionMaterial = new ConvolutionMaterial();
_this.ditheredConvolutionMaterial.dithering = true;
/**
* Whether the blurred result should also be dithered using noise.
*
* @type {Boolean}
*/
_this.dithering = false;
_this.kernelSize = options.kernelSize;
return _this;
}
/**
* The absolute width of the internal render targets.
*
* @type {Number}
*/
createClass(BlurPass, [{
key: "render",
/**
* Blurs the input buffer and writes the result to the output buffer. The
* input buffer remains intact, unless its also the output buffer.
*
* @param {WebGLRenderer} renderer - The renderer.
* @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.
* @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.
* @param {Number} [delta] - The time between the last frame and the current one in seconds.
* @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.
*/
value: function render(renderer, inputBuffer, outputBuffer, delta, stencilTest) {
var scene = this.scene;
var camera = this.camera;
var renderTargetX = this.renderTargetX;
var renderTargetY = this.renderTargetY;
var material = this.convolutionMaterial;
var uniforms = material.uniforms;
var kernel = material.getKernel();
var lastRT = inputBuffer;
var destRT;
var i, l;
this.material = material; // Apply the multi-pass blur.
for (i = 0, l = kernel.length - 1; i < l; ++i) {
// Alternate between targets.
destRT = i % 2 === 0 ? renderTargetX : renderTargetY;
uniforms.kernel.value = kernel[i];
uniforms.tDiffuse.value = lastRT.texture;
renderer.render(scene, camera, destRT);
lastRT = destRT;
}
if (this.dithering) {
material = this.ditheredConvolutionMaterial;
uniforms = material.uniforms;
this.material = material;
}
uniforms.kernel.value = kernel[i];
uniforms.tDiffuse.value = lastRT.texture;
renderer.render(scene, camera, this.renderToScreen ? null : outputBuffer);
}
/**
* Updates the size of this pass.
*
* @param {Number} width - The width.
* @param {Number} height - The height.
*/
}, {
key: "setSize",
value: function setSize(width, height) {
width = Math.max(1, Math.floor(width * this.resolutionScale));
height = Math.max(1, Math.floor(height * this.resolutionScale));
this.renderTargetX.setSize(width, height);
this.renderTargetY.setSize(width, height);
this.convolutionMaterial.setTexelSize(1.0 / width, 1.0 / height);
this.ditheredConvolutionMaterial.setTexelSize(1.0 / width, 1.0 / height);
}
/**
* Performs initialization tasks.
*
* @param {WebGLRenderer} renderer - The renderer.
* @param {Boolean} alpha - Whether the renderer uses the alpha channel or not.
*/
}, {
key: "initialize",
value: function initialize(renderer, alpha) {
if (!alpha) {
this.renderTargetX.texture.format = RGBFormat;
this.renderTargetY.texture.format = RGBFormat;
}
}
}, {
key: "width",
get: function get() {
return this.renderTargetX.width;
}
/**
* The absolute height of the internal render targets.
*
* @type {Number}
*/
}, {
key: "height",
get: function get() {
return this.renderTargetX.height;
}
/**
* The kernel size.
*
* @type {KernelSize}
*/
}, {
key: "kernelSize",
get: function get() {
return this.convolutionMaterial.kernelSize;
}
/**
* @type {KernelSize}
*/
,
set: function set() {
var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : KernelSize.LARGE;
this.convolutionMaterial.kernelSize = value;
this.ditheredConvolutionMaterial.kernelSize = value;
}
}]);
inherits(BlurPass, _Pass);
return BlurPass;
}(Pass);
/**
* A bloom pass.
*
* This pass renders a scene with superimposed blur by utilizing the fast Kawase
* convolution approach.
*/
var BloomPass =
/*#__PURE__*/
function (_Pass) {
/**
* Constructs a new bloom pass.
*
* @param {Object} [options] - The options.
* @param {Number} [options.resolutionScale=0.5] - The render texture resolution scale, relative to the screen render size.
* @param {Number} [options.kernelSize=KernelSize.LARGE] - The blur kernel size.
* @param {Number} [options.intensity=1.0] - The strength of the bloom effect.
* @param {Number} [options.distinction=1.0] - The luminance distinction factor. Raise this value to bring out the brighter elements in the scene.
* @param {Number} [options.screenMode=true] - Whether the screen blend mode should be used for combining the bloom texture with the scene colors.
*/
function BloomPass() {
var _this;
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
classCallCheck(this, BloomPass);
_this = possibleConstructorReturn(this, getPrototypeOf$2(BloomPass).call(this, "BloomPass"));
/**
* A render target.
*
* @type {WebGLRenderTarget}
* @private
*/
_this.renderTarget = new WebGLRenderTarget(1, 1, {
minFilter: LinearFilter,
magFilter: LinearFilter,
stencilBuffer: false,
depthBuffer: false
});
_this.renderTarget.texture.name = "Bloom.Target";
_this.renderTarget.texture.generateMipmaps = false;
/**
* A blur pass.
*
* @type {BlurPass}
* @private
*/
_this.blurPass = new BlurPass(options);
/**
* A combine shader material.
*
* @type {CombineMaterial}
* @private
*/
_this.combineMaterial = new CombineMaterial(options.screenMode !== undefined ? options.screenMode : true);
_this.intensity = options.intensity;
/**
* A luminosity shader material.
*
* @type {LuminosityMaterial}
* @private
*/
_this.luminosityMaterial = new LuminosityMaterial(true);
_this.distinction = options.distinction;
return _this;
}
/**
* The resolution scale.
*
* @type {Number}
*/
createClass(BloomPass, [{
key: "render",
/**
* Renders the effect.
*
* @param {WebGLRenderer} renderer - The renderer.
* @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.
* @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.
* @param {Number} [delta] - The time between the last frame and the current one in seconds.
* @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.
*/
value: function render(renderer, inputBuffer, outputBuffer, delta, stencilTest) {
var scene = this.scene;
var camera = this.camera;
var blurPass = this.blurPass;
var luminosityMaterial = this.luminosityMaterial;
var combineMaterial = this.combineMaterial;
var renderTarget = this.renderTarget; // Luminance filter.
this.material = luminosityMaterial;
luminosityMaterial.uniforms.tDiffuse.value = inputBuffer.texture;
renderer.render(scene, camera, renderTarget); // Convolution phase.
blurPass.render(renderer, renderTarget, renderTarget);
if (this.blend) {
// Render the original scene with superimposed blur.
this.material = combineMaterial;
combineMaterial.uniforms.texture1.value = inputBuffer.texture;
combineMaterial.uniforms.texture2.value = renderTarget.texture;
renderer.render(scene, camera, this.renderToScreen ? null : outputBuffer);
}
}
/**
* Updates the size of this pass.
*
* @param {Number} width - The width.
* @param {Number} height - The height.
*/
}, {
key: "setSize",
value: function setSize(width, height) {
this.blurPass.setSize(width, height);
width = this.blurPass.width;
height = this.blurPass.height;
this.renderTarget.setSize(width, height);
}
/**
* Performs initialization tasks.
*
* @param {WebGLRenderer} renderer - The renderer.
* @param {Boolean} alpha - Whether the renderer uses the alpha channel or not.
*/
}, {
key: "initialize",
value: function initialize(renderer, alpha) {
this.blurPass.initialize(renderer, alpha);
if (!alpha) {
this.renderTarget.texture.format = RGBFormat;
}
}
}, {
key: "resolutionScale",
get: function get() {
return this.blurPass.resolutionScale;
}
/**
* You need to call {@link EffectComposer#setSize} after changing this value.
*
* @type {Number}
*/
,
set: function set() {
var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0.5;
this.blurPass.resolutionScale = value;
}
/**
* The blur kernel size.
*
* @type {KernelSize}
*/
}, {
key: "kernelSize",
get: function get() {
return this.blurPass.kernelSize;
}
/**
* @type {KernelSize}
*/
,
set: function set() {
var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : KernelSize.LARGE;
this.blurPass.kernelSize = value;
}
/**
* The overall intensity of the effect.
*
* @type {Number}
*/
}, {
key: "intensity",
get: function get() {
return this.combineMaterial.uniforms.opacity2.value;
}
/**
* @type {Number}
*/
,
set: function set() {
var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1.0;
this.combineMaterial.uniforms.opacity2.value = value;
}
/**
* The luminance distinction factor.
*
* @type {Number}
*/
}, {
key: "distinction",
get: function get() {
return this.luminosityMaterial.uniforms.distinction.value;
}
/**
* @type {Number}
*/
,
set: function set() {
var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1.0;
this.luminosityMaterial.uniforms.distinction.value = value;
}
/**
* Indicates whether dithering is enabled.
*
* @type {Boolean}
*/
}, {
key: "dithering",
get: function get() {
return this.blurPass.dithering;
}
/**
* If enabled, the result will be dithered to remove banding artifacts.
*
* @type {Boolean}
*/
,
set: function set(value) {
this.blurPass.dithering = value;
}
/**
* Indicates whether the effect should be applied to the input buffer.
*
* @type {Boolean}
*/
}, {
key: "blend",
get: function get() {
return this.needsSwap;
}
/**
* If disabled, the input buffer will remain unaffected.
*
* You may use the {@link BloomPass#overlay} texture to apply the effect to
* your scene.
*
* @type {Boolean}
*/
,
set: function set(value) {
this.needsSwap = value;
}
/**
* The effect overlay texture.
*
* @type {Texture}
*/
}, {
key: "overlay",
get: function get() {
return this.renderTarget.texture;
}
}]);
inherits(BloomPass, _Pass);
return BloomPass;
}(Pass);
/**
* A Depth of Field (DoF) pass using a bokeh shader.
*
* This pass requires a {@link EffectComposer#depthTexture}.
*/
var BokehPass =
/*#__PURE__*/
function (_Pass) {
/**
* Constructs a new bokeh pass.
*
* @param {PerspectiveCamera} camera - The main camera. Used to obtain the aspect ratio and the near and far plane settings.
* @param {Object} [options] - Additional parameters. See {@link BokehMaterial} for details.
*/
function BokehPass(camera) {
var _this;
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
classCallCheck(this, BokehPass);
_this = possibleConstructorReturn(this, getPrototypeOf$2(BokehPass).call(this, "BokehPass"));
_this.material = new BokehMaterial(camera, options);
return _this;
}
/**
* Renders the effect.
*
* @param {WebGLRenderer} renderer - The renderer.
* @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.
* @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.
* @param {Number} [delta] - The time between the last frame and the current one in seconds.
* @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.
*/
createClass(BokehPass, [{
key: "render",
value: function render(renderer, inputBuffer, outputBuffer, delta, stencilTest) {
this.material.uniforms.tDiffuse.value = inputBuffer.texture;
this.material.uniforms.tDepth.value = inputBuffer.depthTexture;
renderer.render(this.scene, this.camera, this.renderToScreen ? null : outputBuffer);
}
/**
* Updates the size of this pass.
*
* @param {Number} width - The width.
* @param {Number} height - The height.
*/
}, {
key: "setSize",
value: function setSize(width, height) {
this.material.uniforms.aspect.value = width / height;
}
}]);
inherits(BokehPass, _Pass);
return BokehPass;
}(Pass);
/**
* A pass that disables the stencil test.
*/
var ClearMaskPass =
/*#__PURE__*/
function (_Pass) {
/**
* Constructs a new clear mask pass.
*/
function ClearMaskPass() {
var _this;
classCallCheck(this, ClearMaskPass);
_this = possibleConstructorReturn(this, getPrototypeOf$2(ClearMaskPass).call(this, "ClearMaskPass", null, null, null));
_this.needsSwap = false;
return _this;
}
/**
* Disables the global stencil test.
*
* @param {WebGLRenderer} renderer - The renderer.
* @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.
* @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.
* @param {Number} [delta] - The time between the last frame and the current one in seconds.
* @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.
*/
createClass(ClearMaskPass, [{
key: "render",
value: function render(renderer, inputBuffer, outputBuffer, delta, stencilTest) {
renderer.state.buffers.stencil.setTest(false);
}
}]);
inherits(ClearMaskPass, _Pass);
return ClearMaskPass;
}(Pass);
/**
* Used for saving the original clear color of the renderer.
*
* @type {Color}
* @private
*/
var color = new Color();
/**
* A pass that clears the input buffer or the screen.
*
* You can prevent specific bits from being cleared by setting either the
* autoClearColor, autoClearStencil or autoClearDepth properties of the renderer
* to false.
*/
var ClearPass =
/*#__PURE__*/
function (_Pass) {
/**
* Constructs a new clear pass.
*
* @param {Object} [options] - Additional options.
* @param {Color} [options.clearColor=null] - An override clear color.
* @param {Number} [options.clearAlpha=0.0] - An override clear alpha.
*/
function ClearPass() {
var _this;
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
classCallCheck(this, ClearPass);
_this = possibleConstructorReturn(this, getPrototypeOf$2(ClearPass).call(this, "ClearPass", null, null, null));
_this.needsSwap = false;
/**
* The clear color.
*
* @type {Color}
*/
_this.clearColor = options.clearColor !== undefined ? options.clearColor : null;
/**
* The clear alpha.
*
* @type {Number}
*/
_this.clearAlpha = options.clearAlpha !== undefined ? options.clearAlpha : 0.0;
return _this;
}
/**
* Clears the input buffer or the screen.
*
* @param {WebGLRenderer} renderer - The renderer.
* @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.
* @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.
* @param {Number} [delta] - The time between the last frame and the current one in seconds.
* @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.
*/
createClass(ClearPass, [{
key: "render",
value: function render(renderer, inputBuffer, outputBuffer, delta, stencilTest) {
var clearColor = this.clearColor;
var clearAlpha;
if (clearColor !== null) {
color.copy(renderer.getClearColor());
clearAlpha = renderer.getClearAlpha();
renderer.setClearColor(clearColor, this.clearAlpha);
}
renderer.setRenderTarget(this.renderToScreen ? null : inputBuffer);
renderer.clear();
if (clearColor !== null) {
renderer.setClearColor(color, clearAlpha);
}
}
}]);
inherits(ClearPass, _Pass);
return ClearPass;
}(Pass);
/**
* A dot screen pass.
*/
var DotScreenPass =
/*#__PURE__*/
function (_Pass) {
/**
* Constructs a new dot screen pass.
*
* @param {Object} [options] - The options.
* @param {Boolean} [options.average=false] - Whether the shader should output a colour average (black and white).
* @param {Number} [options.angle=1.57] - The angle of the pattern.
* @param {Number} [options.scale=1.0] - The scale of the overall effect.
* @param {Number} [options.intensity=1.0] - The intensity of the effect.
*/
function DotScreenPass() {
var _this;
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
classCallCheck(this, DotScreenPass);
_this = possibleConstructorReturn(this, getPrototypeOf$2(DotScreenPass).call(this, "DotScreenPass"));
_this.material = new DotScreenMaterial(options);
return _this;
}
/**
* Renders the effect.
*
* @param {WebGLRenderer} renderer - The renderer.
* @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.
* @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.
* @param {Number} [delta] - The time between the last frame and the current one in seconds.
* @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.
*/
createClass(DotScreenPass, [{
key: "render",
value: function render(renderer, inputBuffer, outputBuffer, delta, stencilTest) {
this.material.uniforms.tDiffuse.value = inputBuffer.texture;
renderer.render(this.scene, this.camera, this.renderToScreen ? null : outputBuffer);
}
/**
* Updates the size of this pass.
*
* @param {Number} width - The width.
* @param {Number} height - The height.
*/
}, {
key: "setSize",
value: function setSize(width, height) {
width = Math.max(1, width);
height = Math.max(1, height);
this.material.uniforms.offsetRepeat.value.z = width;
this.material.uniforms.offsetRepeat.value.w = height;
}
}]);
inherits(DotScreenPass, _Pass);
return DotScreenPass;
}(Pass);
/**
* A film pass.
*
* Provides various cinematic effects.
*/
var FilmPass =
/*#__PURE__*/
function (_Pass) {
/**
* Constructs a new film pass.
*
* @param {Object} [options] - The options. See {@link FilmMaterial} for more options.
* @param {Number} [options.scanlineDensity=1.25] - The scanline density, relative to the screen height.
* @param {Number} [options.gridScale=1.0] - The grid scale, relative to the screen height.
* @param {Number} [options.gridLineWidth=0.0] - The grid line width. This value will be added to the base line width.
*/
function FilmPass() {
var _this;
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
classCallCheck(this, FilmPass);
_this = possibleConstructorReturn(this, getPrototypeOf$2(FilmPass).call(this, "FilmPass"));
_this.material = new FilmMaterial(options);
/**
* The amount of scanlines, relative to the screen height.
*
* You need to call {@link EffectComposer#setSize} after changing this
* value.
*
* @type {Number}
*/
_this.scanlineDensity = options.scanlineDensity === undefined ? 1.25 : options.scanlineDensity;
/**
* The grid scale, relative to the screen height.
*
* You need to call {@link EffectComposer#setSize} after changing this
* value.
*
* @type {Number}
*/
_this.gridScale = options.gridScale === undefined ? 1.0 : Math.max(options.gridScale, 1e-6);
/**
* The grid line width.
*
* You need to call {@link EffectComposer#setSize} after changing this
* value.
*
* @type {Number}
*/
_this.gridLineWidth = options.gridLineWidth === undefined ? 0.0 : Math.max(options.gridLineWidth, 0.0);
return _this;
}
/**
* Renders the effect.
*
* @param {WebGLRenderer} renderer - The renderer.
* @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.
* @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.
* @param {Number} [delta] - The time between the last frame and the current one in seconds.
* @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.
*/
createClass(FilmPass, [{
key: "render",
value: function render(renderer, inputBuffer, outputBuffer, delta, stencilTest) {
this.material.uniforms.tDiffuse.value = inputBuffer.texture;
this.material.uniforms.time.value += delta;
renderer.render(this.scene, this.camera, this.renderToScreen ? null : outputBuffer);
}
/**
* Updates the size of this pass.
*
* @param {Number} width - The width.
* @param {Number} height - The height.
*/
}, {
key: "setSize",
value: function setSize(width, height) {
var aspect = width / height;
var gridScale = this.gridScale * (height * 0.125);
this.material.uniforms.scanlineCount.value = Math.round(height * this.scanlineDensity);
this.material.uniforms.gridScale.value.set(aspect * gridScale, gridScale);
this.material.uniforms.gridLineWidth.value = gridScale / height + this.gridLineWidth;
}
}]);
inherits(FilmPass, _Pass);
return FilmPass;
}(Pass);
/**
* Returns a random integer in the specified range.
*
* @private
* @param {Number} low - The lowest possible value.
* @param {Number} high - The highest possible value.
* @return {Number} The random value.
*/
function randomInt(low, high) {
return low + Math.floor(Math.random() * (high - low + 1));
}
/**
* Returns a random float in the specified range.
*
* @private
* @param {Number} low - The lowest possible value.
* @param {Number} high - The highest possible value.
* @return {Number} The random value.
*/
function randomFloat(low, high) {
return low + Math.random() * (high - low);
}
/**
* A glitch pass.
*/
var GlitchPass =
/*#__PURE__*/
function (_Pass) {
/**
* Constructs a new glitch pass.
*
* @param {Object} [options] - The options.
* @param {Texture} [options.perturbMap] - A perturbation map. If none is provided, a noise texture will be created.
* @param {Number} [options.dtSize=64] - The size of the generated noise map. Will be ignored if a perturbation map is provided.
*/
function GlitchPass() {
var _this;
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
classCallCheck(this, GlitchPass);
_this = possibleConstructorReturn(this, getPrototypeOf$2(GlitchPass).call(this, "GlitchPass"));
_this.material = new GlitchMaterial();
/**
* A perturbation map.
*
* @type {Texture}
* @private
*/
_this.texture = null;
_this.perturbMap = options.perturbMap !== undefined ? options.perturbMap : _this.generatePerturbMap(options.dtSize);
_this.perturbMap.name = "Glitch.Perturbation";
_this.perturbMap.generateMipmaps = false;
/**
* The effect mode.
*
* @type {GlitchMode}
*/
_this.mode = GlitchMode.SPORADIC;
/**
* A counter for the glitch activation and deactivation.
*
* @type {Number}
* @private
*/
_this.counter = 0;
/**
* A random break point for the sporadic glitch activation.
*
* @type {Number}
* @private
*/
_this.breakPoint = randomInt(120, 240);
return _this;
}
/**
* The current perturbation map.
*
* @type {Texture}
*/
createClass(GlitchPass, [{
key: "generatePerturbMap",
/**
* Destroys the current perturbation map and replaces it with a new one.
*
* @param {Number} [size=64] - The texture size.
* @return {DataTexture} The perturbation texture.
*/
value: function generatePerturbMap() {
var size = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 64;
var pixels = size * size;
var data = new Float32Array(pixels * 3);
var dt = this.perturbMap;
var i, x;
for (i = 0; i < pixels; ++i) {
x = Math.random();
data[i * 3] = x;
data[i * 3 + 1] = x;
data[i * 3 + 2] = x;
}
if (dt !== null) {
dt.dispose();
}
dt = new DataTexture(data, size, size, RGBFormat, FloatType);
dt.needsUpdate = true;
this.perturbMap = dt;
return dt;
}
/**
* Renders the effect.
*
* @param {WebGLRenderer} renderer - The renderer.
* @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.
* @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.
* @param {Number} [delta] - The time between the last frame and the current one in seconds.
* @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.
*/
}, {
key: "render",
value: function render(renderer, inputBuffer, outputBuffer, delta, stencilTest) {
var mode = this.mode;
var counter = this.counter;
var breakPoint = this.breakPoint;
var uniforms = this.material.uniforms;
uniforms.tDiffuse.value = inputBuffer.texture;
uniforms.seed.value = Math.random();
uniforms.active.value = true;
if (counter % breakPoint === 0 || mode === GlitchMode.CONSTANT_WILD) {
uniforms.amount.value = Math.random() / 30.0;
uniforms.angle.value = randomFloat(-Math.PI, Math.PI);
uniforms.seedX.value = randomFloat(-1.0, 1.0);
uniforms.seedY.value = randomFloat(-1.0, 1.0);
uniforms.distortionX.value = randomFloat(0.0, 1.0);
uniforms.distortionY.value = randomFloat(0.0, 1.0);
this.breakPoint = randomInt(120, 240);
this.counter = 0;
} else {
if (counter % breakPoint < breakPoint / 5 || mode === GlitchMode.CONSTANT_MILD) {
uniforms.amount.value = Math.random() / 90.0;
uniforms.angle.value = randomFloat(-Math.PI, Math.PI);
uniforms.distortionX.value = randomFloat(0.0, 1.0);
uniforms.distortionY.value = randomFloat(0.0, 1.0);
uniforms.seedX.value = randomFloat(-0.3, 0.3);
uniforms.seedY.value = randomFloat(-0.3, 0.3);
} else {
// Sporadic.
uniforms.active.value = false;
}
}
++this.counter;
renderer.render(this.scene, this.camera, this.renderToScreen ? null : outputBuffer);
}
}, {
key: "perturbMap",
get: function get() {
return this.texture;
}
/**
* Assigning a new perturbation map does not destroy the current one!
*
* @type {Texture}
*/
,
set: function set(value) {
this.texture = value;
this.material.uniforms.tPerturb.value = value;
}
}]);
inherits(GlitchPass, _Pass);
return GlitchPass;
}(Pass);
/**
* A glitch mode enumeration.
*
* @type {Object}
* @property {Number} SPORADIC - Sporadic glitches.
* @property {Number} CONSTANT_MILD - Constant mild glitches.
* @property {Number} CONSTANT_WILD - Constant wild glitches.
*/
var GlitchMode = {
SPORADIC: 0,
CONSTANT_MILD: 1,
CONSTANT_WILD: 2
};
/**
* A pass that renders a given scene directly on screen or into the read buffer
* for further processing.
*/
var RenderPass =
/*#__PURE__*/
function (_Pass) {
/**
* Constructs a new render pass.
*
* @param {Scene} scene - The scene to render.
* @param {Camera} camera - The camera to use to render the scene.
* @param {Object} [options] - Additional options.
* @param {Material} [options.overrideMaterial=null] - An override material for the scene.
* @param {Color} [options.clearColor=null] - An override clear color.
* @param {Number} [options.clearAlpha=1.0] - An override clear alpha.
* @param {Boolean} [options.clearDepth=false] - Whether depth should be cleared explicitly.
* @param {Boolean} [options.clear=true] - Whether all buffers should be cleared.
*/
function RenderPass(scene, camera) {
var _this;
var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
classCallCheck(this, RenderPass);
_this = possibleConstructorReturn(this, getPrototypeOf$2(RenderPass).call(this, "RenderPass", scene, camera, null));
_this.needsSwap = false;
/**
* A clear pass.
*
* @type {ClearPass}
*/
_this.clearPass = new ClearPass(options);
/**
* An override material.
*
* @type {Material}
*/
_this.overrideMaterial = options.overrideMaterial !== undefined ? options.overrideMaterial : null;
/**
* Indicates whether the depth buffer should be cleared explicitly.
*
* @type {Boolean}
*/
_this.clearDepth = options.clearDepth !== undefined ? options.clearDepth : false;
/**
* Indicates whether the color, depth and stencil buffers should be cleared.
*
* Even with clear set to true you can prevent specific buffers from being
* cleared by setting either the autoClearColor, autoClearStencil or
* autoClearDepth properties of the renderer to false.
*
* @type {Boolean}
*/
_this.clear = options.clear !== undefined ? options.clear : true;
return _this;
}
/**
* Renders the scene.
*
* @param {WebGLRenderer} renderer - The renderer.
* @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.
* @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.
* @param {Number} [delta] - The time between the last frame and the current one in seconds.
* @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.
*/
createClass(RenderPass, [{
key: "render",
value: function render(renderer, inputBuffer, outputBuffer, delta, stencilTest) {
var scene = this.scene;
var renderTarget = this.renderToScreen ? null : inputBuffer;
var overrideMaterial = scene.overrideMaterial;
if (this.clear) {
this.clearPass.renderToScreen = this.renderToScreen;
this.clearPass.render(renderer, inputBuffer);
} else if (this.clearDepth) {
renderer.setRenderTarget(renderTarget);
renderer.clearDepth();
}
scene.overrideMaterial = this.overrideMaterial;
renderer.render(scene, this.camera, renderTarget);
scene.overrideMaterial = overrideMaterial;
}
}]);
inherits(RenderPass, _Pass);
return RenderPass;
}(Pass);
/**
* Clamps a given value.
*
* @private
* @param {Number} value - The value to clamp.
* @param {Number} min - The lowest possible value.
* @param {Number} max - The highest possible value.
* @return {Number} The clamped value.
*/
function clamp(value, min, max) {
return Math.max(min, Math.min(max, value));
}
/**
* A crepuscular rays pass.
*/
var GodRaysPass =
/*#__PURE__*/
function (_Pass) {
/**
* Constructs a new god rays pass.
*
* @param {Scene} scene - The main scene.
* @param {Camera} camera - The main camera.
* @param {Object3D} lightSource - The main light source.
* @param {Object} [options] - The options.
* @param {Number} [options.density=0.96] - The density of the light rays.
* @param {Number} [options.decay=0.93] - An illumination decay factor.
* @param {Number} [options.weight=0.4] - A light ray weight factor.
* @param {Number} [options.exposure=0.6] - A constant attenuation coefficient.
* @param {Number} [options.clampMax=1.0] - An upper bound for the saturation of the overall effect.
* @param {Number} [options.intensity=1.0] - A constant factor for additive blending.
* @param {Number} [options.resolutionScale=0.5] - The render texture resolution scale, relative to the screen render size.
* @param {Number} [options.kernelSize=KernelSize.LARGE] - The blur kernel size.
* @param {Number} [options.samples=60] - The number of samples per pixel.
* @param {Number} [options.screenMode=true] - Whether the screen blend mode should be used for combining the god rays texture with the scene colors.
*/
function GodRaysPass(scene, camera, lightSource) {
var _this;
var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
classCallCheck(this, GodRaysPass);
_this = possibleConstructorReturn(this, getPrototypeOf$2(GodRaysPass).call(this, "GodRaysPass"));
/**
* A scene that only contains the light source.
*
* @type {Scene}
* @private
*/
_this.lightScene = new Scene();
/**
* The main scene.
*
* @type {Scene}
* @private
*/
_this.mainScene = scene;
/**
* The main camera.
*
* @type {Camera}
* @private
*/
_this.mainCamera = camera;
/**
* A render target.
*
* @type {WebGLRenderTarget}
* @private
*/
_this.renderTargetX = new WebGLRenderTarget(1, 1, {
minFilter: LinearFilter,
magFilter: LinearFilter,
stencilBuffer: false,
depthBuffer: false
});
_this.renderTargetX.texture.name = "GodRays.TargetX";
_this.renderTargetX.texture.generateMipmaps = false;
/**
* A second render target.
*
* @type {WebGLRenderTarget}
* @private
*/
_this.renderTargetY = _this.renderTargetX.clone();
_this.renderTargetY.texture.name = "GodRays.TargetY";
/**
* A render target for the masked light scene.
*
* @type {WebGLRenderTarget}
* @private
*/
_this.renderTargetMask = new WebGLRenderTarget(1, 1, {
minFilter: LinearFilter,
magFilter: LinearFilter
});
_this.renderTargetMask.texture.name = "GodRays.Mask";
_this.renderTargetMask.texture.generateMipmaps = false;
/**
* A pass that only renders the light source.
*
* @type {RenderPass}
* @private
*/
_this.renderPassLight = new RenderPass(_this.lightScene, _this.mainCamera, {
clearColor: new Color(0x000000)
});
/**
* A pass that renders the masked scene over the light.
*
* @type {RenderPass}
* @private
*/
_this.renderPassMask = new RenderPass(_this.mainScene, _this.mainCamera, {
overrideMaterial: new MeshBasicMaterial({
color: 0x000000
})
});
_this.renderPassMask.clear = false;
/**
* A blur pass.
*
* @type {BlurPass}
* @private
*/
_this.blurPass = new BlurPass(options);
/**
* The light source.
*
* @type {Object3D}
*/
_this.lightSource = lightSource;
/**
* The light position in screen space.
*
* @type {Vector3}
* @private
*/
_this.screenPosition = new Vector3();
/**
* A god rays shader material.
*
* @type {GodRaysMaterial}
* @private
*/
_this.godRaysMaterial = new GodRaysMaterial(options);
_this.godRaysMaterial.uniforms.lightPosition.value = _this.screenPosition;
_this.samples = options.samples;
/**
* A combine shader material.
*
* @type {CombineMaterial}
* @private
*/
_this.combineMaterial = new CombineMaterial(options.screenMode !== undefined ? options.screenMode : true);
_this.intensity = options.intensity;
return _this;
}
/**
* The resolution scale.
*
* @type {Number}
*/
createClass(GodRaysPass, [{
key: "render",
/**
* Renders the effect.
*
* @param {WebGLRenderer} renderer - The renderer.
* @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.
* @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.
* @param {Number} [delta] - The time between the last frame and the current one in seconds.
* @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.
*/
value: function render(renderer, inputBuffer, outputBuffer, delta, stencilTest) {
var scene = this.scene;
var camera = this.camera;
var mainScene = this.mainScene;
var lightSource = this.lightSource;
var screenPosition = this.screenPosition;
var godRaysMaterial = this.godRaysMaterial;
var combineMaterial = this.combineMaterial;
var renderTargetMask = this.renderTargetMask;
var renderTargetX = this.renderTargetX;
var renderTargetY = this.renderTargetY;
var background, parent; // Compute the screen light position and translate it to [0.0, 1.0].
screenPosition.copy(lightSource.position).project(this.mainCamera);
screenPosition.x = clamp((screenPosition.x + 1.0) * 0.5, 0.0, 1.0);
screenPosition.y = clamp((screenPosition.y + 1.0) * 0.5, 0.0, 1.0);
parent = lightSource.parent;
background = mainScene.background;
mainScene.background = null;
this.lightScene.add(lightSource);
/* First, render the light source. Then render the scene into the same
buffer using a mask override material with depth test enabled. */
this.renderPassLight.render(renderer, renderTargetMask);
this.renderPassMask.render(renderer, renderTargetMask);
if (parent !== null) {
parent.add(lightSource);
}
mainScene.background = background; // Blur the masked scene to reduce artifacts.
this.blurPass.render(renderer, this.renderTargetMask, renderTargetX); // Blur the masked scene along radial lines towards the light source.
this.material = godRaysMaterial;
godRaysMaterial.uniforms.tDiffuse.value = renderTargetX.texture;
renderer.render(scene, camera, renderTargetY);
if (this.blend) {
// Combine the god rays with the scene colors.
this.material = combineMaterial;
combineMaterial.uniforms.texture1.value = inputBuffer.texture;
combineMaterial.uniforms.texture2.value = renderTargetY.texture;
renderer.render(scene, camera, this.renderToScreen ? null : outputBuffer);
}
}
/**
* Updates the size of this pass.
*
* @param {Number} width - The width.
* @param {Number} height - The height.
*/
}, {
key: "setSize",
value: function setSize(width, height) {
this.renderPassLight.setSize(width, height);
this.renderPassMask.setSize(width, height);
this.blurPass.setSize(width, height);
width = this.blurPass.width;
height = this.blurPass.height;
this.renderTargetMask.setSize(width, height);
this.renderTargetX.setSize(width, height);
this.renderTargetY.setSize(width, height);
}
/**
* Performs initialization tasks.
*
* @param {WebGLRenderer} renderer - The renderer.
* @param {Boolean} alpha - Whether the renderer uses the alpha channel or not.
*/
}, {
key: "initialize",
value: function initialize(renderer, alpha) {
this.renderPassLight.initialize(renderer, alpha);
this.renderPassMask.initialize(renderer, alpha);
this.blurPass.initialize(renderer, alpha);
if (!alpha) {
this.renderTargetMask.texture.format = RGBFormat;
this.renderTargetX.texture.format = RGBFormat;
this.renderTargetY.texture.format = RGBFormat;
}
}
}, {
key: "resolutionScale",
get: function get() {
return this.blurPass.resolutionScale;
}
/**
* You need to call {@link EffectComposer#setSize} after changing this value.
*
* @type {Number}
*/
,
set: function set() {
var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0.5;
this.blurPass.resolutionScale = value;
}
/**
* The blur kernel size.
*
* @type {KernelSize}
*/
}, {
key: "kernelSize",
get: function get() {
return this.blurPass.kernelSize;
}
/**
* @type {KernelSize}
*/
,
set: function set() {
var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : KernelSize.LARGE;
this.blurPass.kernelSize = value;
}
/**
* The overall intensity of the effect.
*
* @type {Number}
*/
}, {
key: "intensity",
get: function get() {
return this.combineMaterial.uniforms.opacity2.value;
}
/**
* @type {Number}
*/
,
set: function set() {
var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1.0;
this.combineMaterial.uniforms.opacity2.value = value;
}
/**
* The number of samples per pixel.
*
* @type {Number}
*/
}, {
key: "samples",
get: function get() {
return Number.parseInt(this.godRaysMaterial.defines.NUM_SAMPLES_INT);
}
/**
* This value must be carefully chosen. A higher value directly increases the
* GPU load.
*
* @type {Number}
*/
,
set: function set() {
var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 60;
value = Math.floor(value);
this.godRaysMaterial.defines.NUM_SAMPLES_FLOAT = value.toFixed(1);
this.godRaysMaterial.defines.NUM_SAMPLES_INT = value.toFixed(0);
this.godRaysMaterial.needsUpdate = true;
}
/**
* Indicates whether dithering is enabled.
*
* @type {Boolean}
*/
}, {
key: "dithering",
get: function get() {
return this.godRaysMaterial.dithering;
}
/**
* If enabled, the result will be dithered to remove banding artifacts.
*
* @type {Boolean}
*/
,
set: function set(value) {
if (this.dithering !== value) {
this.godRaysMaterial.dithering = value;
this.godRaysMaterial.needsUpdate = true;
}
}
/**
* Indicates whether the effect should be applied to the input buffer.
*
* @type {Boolean}
*/
}, {
key: "blend",
get: function get() {
return this.needsSwap;
}
/**
* If disabled, the input buffer will remain unaffected.
*
* You may use the {@link BloomPass#overlay} texture to apply the effect to
* your scene.
*
* @type {Boolean}
*/
,
set: function set(value) {
this.needsSwap = value;
}
/**
* The effect overlay texture.
*
* @type {Texture}
*/
}, {
key: "overlay",
get: function get() {
return this.renderTargetY.texture;
}
}]);
inherits(GodRaysPass, _Pass);
return GodRaysPass;
}(Pass);
/**
* A mask pass.
*/
var MaskPass =
/*#__PURE__*/
function (_Pass) {
/**
* Constructs a new mask pass.
*
* @param {Scene} scene - The scene to render.
* @param {Camera} camera - The camera to use.
*/
function MaskPass(scene, camera) {
var _this;
classCallCheck(this, MaskPass);
_this = possibleConstructorReturn(this, getPrototypeOf$2(MaskPass).call(this, "MaskPass", scene, camera, null));
_this.needsSwap = false;
/**
* Inverse flag.
*
* @type {Boolean}
*/
_this.inverse = false;
/**
* Stencil buffer clear flag.
*
* @type {Boolean}
*/
_this.clearStencil = true;
return _this;
}
/**
* Renders the effect.
*
* @param {WebGLRenderer} renderer - The renderer.
* @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.
* @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.
* @param {Number} [delta] - The time between the last frame and the current one in seconds.
* @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.
*/
createClass(MaskPass, [{
key: "render",
value: function render(renderer, inputBuffer, outputBuffer, delta, stencilTest) {
var context = renderer.context;
var state = renderer.state;
var scene = this.scene;
var camera = this.camera;
var writeValue = this.inverse ? 0 : 1;
var clearValue = 1 - writeValue; // Don't update color or depth.
state.buffers.color.setMask(false);
state.buffers.depth.setMask(false); // Lock the buffers.
state.buffers.color.setLocked(true);
state.buffers.depth.setLocked(true); // Configure the stencil.
state.buffers.stencil.setTest(true);
state.buffers.stencil.setOp(context.REPLACE, context.REPLACE, context.REPLACE);
state.buffers.stencil.setFunc(context.ALWAYS, writeValue, 0xffffffff);
state.buffers.stencil.setClear(clearValue); // Clear the stencil.
if (this.clearStencil) {
if (this.renderToScreen) {
renderer.setRenderTarget(null);
renderer.clearStencil();
} else {
renderer.setRenderTarget(inputBuffer);
renderer.clearStencil();
renderer.setRenderTarget(outputBuffer);
renderer.clearStencil();
}
} // Draw the mask.
if (this.renderToScreen) {
renderer.render(scene, camera, null);
} else {
renderer.render(scene, camera, inputBuffer);
renderer.render(scene, camera, outputBuffer);
} // Unlock the buffers.
state.buffers.color.setLocked(false);
state.buffers.depth.setLocked(false); // Only render where the stencil is set to 1.
state.buffers.stencil.setFunc(context.EQUAL, 1, 0xffffffff);
state.buffers.stencil.setOp(context.KEEP, context.KEEP, context.KEEP);
}
}]);
inherits(MaskPass, _Pass);
return MaskPass;
}(Pass);
/**
* A shader pass.
*
* Used to render any shader material as a 2D filter.
*/
var ShaderPass =
/*#__PURE__*/
function (_Pass) {
/**
* Constructs a new shader pass.
*
* @param {ShaderMaterial} material - The shader material to use.
* @param {String} [textureID="tDiffuse"] - The texture uniform identifier.
*/
function ShaderPass(material) {
var _this;
var textureID = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "tDiffuse";
classCallCheck(this, ShaderPass);
_this = possibleConstructorReturn(this, getPrototypeOf$2(ShaderPass).call(this, "ShaderPass"));
_this.material = material;
/**
* The name of the color sampler uniform of the given material.
*
* @type {String}
*/
_this.textureID = textureID;
return _this;
}
/**
* Renders the effect.
*
* @param {WebGLRenderer} renderer - The renderer.
* @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.
* @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.
* @param {Number} [delta] - The time between the last frame and the current one in seconds.
* @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.
*/
createClass(ShaderPass, [{
key: "render",
value: function render(renderer, inputBuffer, outputBuffer, delta, stencilTest) {
if (this.material.uniforms[this.textureID] !== undefined) {
this.material.uniforms[this.textureID].value = inputBuffer.texture;
}
renderer.render(this.scene, this.camera, this.renderToScreen ? null : outputBuffer);
}
}]);
inherits(ShaderPass, _Pass);
return ShaderPass;
}(Pass);
/**
* An outline pass.
*/
var OutlinePass =
/*#__PURE__*/
function (_Pass) {
/**
* Constructs a new outline pass.
*
* @param {Scene} scene - The main scene.
* @param {Camera} camera - The main camera.
* @param {Object} [options] - Additional parameters. See {@link BlurPass}, {@link OutlineBlendMaterial} and {@link OutlineEdgesMaterial} for details.
* @param {Number} [options.pulseSpeed=0.0] - The pulse speed. A value of zero disables the pulse effect.
* @param {Boolean} [options.blur=true] - Whether the outline should be blurred.
*/
function OutlinePass(scene, camera) {
var _this;
var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
classCallCheck(this, OutlinePass);
_this = possibleConstructorReturn(this, getPrototypeOf$2(OutlinePass).call(this, "OutlinePass"));
/**
* The main scene.
*
* @type {Scene}
* @private
*/
_this.mainScene = scene;
/**
* The main camera.
*
* @type {Camera}
* @private
*/
_this.mainCamera = camera;
/**
* A render target for depth information.
*
* @type {WebGLRenderTarget}
* @private
*/
_this.renderTargetDepth = new WebGLRenderTarget(1, 1, {
minFilter: LinearFilter,
magFilter: LinearFilter
});
_this.renderTargetDepth.texture.name = "Outline.Depth";
_this.renderTargetDepth.texture.generateMipmaps = false;
/**
* A render target for the outline mask.
*
* @type {WebGLRenderTarget}
* @private
*/
_this.renderTargetMask = _this.renderTargetDepth.clone();
_this.renderTargetMask.texture.format = RGBFormat;
_this.renderTargetMask.texture.name = "Outline.Mask";
/**
* A render target for the edge detection.
*
* @type {WebGLRenderTarget}
* @private
*/
_this.renderTargetEdges = new WebGLRenderTarget(1, 1, {
minFilter: LinearFilter,
magFilter: LinearFilter,
stencilBuffer: false,
depthBuffer: false,
format: RGBFormat
});
_this.renderTargetEdges.texture.name = "Outline.Edges";
_this.renderTargetEdges.texture.generateMipmaps = false;
/**
* A render target for the blurred outline overlay.
*
* @type {WebGLRenderTarget}
* @private
*/
_this.renderTargetBlurredEdges = _this.renderTargetEdges.clone();
_this.renderTargetBlurredEdges.texture.name = "Outline.BlurredEdges";
/**
* A depth pass.
*
* @type {RenderPass}
* @private
*/
_this.renderPassDepth = new RenderPass(_this.mainScene, _this.mainCamera, {
overrideMaterial: new MeshDepthMaterial({
depthPacking: RGBADepthPacking,
morphTargets: true,
skinning: true
}),
clearColor: new Color(0xffffff),
clearAlpha: 1.0
});
/**
* A depth comparison mask pass.
*
* @type {RenderPass}
* @private
*/
_this.renderPassMask = new RenderPass(_this.mainScene, _this.mainCamera, {
overrideMaterial: new DepthComparisonMaterial(_this.renderTargetDepth.texture, _this.mainCamera),
clearColor: new Color(0xffffff),
clearAlpha: 1.0
});
/**
* A blur pass.
*
* @type {BlurPass}
* @private
*/
_this.blurPass = new BlurPass(options);
_this.kernelSize = options.kernelSize;
/**
* A copy pass that renders the read buffer to screen if needed.
*
* @type {ShaderPass}
* @private
*/
_this.copyPass = new ShaderPass(new CopyMaterial());
_this.copyPass.renderToScreen = true;
/**
* An outline edge detection material.
*
* @type {OutlineEdgesMaterial}
* @private
*/
_this.outlineEdgesMaterial = new OutlineEdgesMaterial(options);
_this.outlineEdgesMaterial.uniforms.tMask.value = _this.renderTargetMask.texture;
/**
* An outline blend material.
*
* @type {OutlineBlendMaterial}
* @private
*/
_this.outlineBlendMaterial = new OutlineBlendMaterial(options);
_this.outlineBlendMaterial.uniforms.tMask.value = _this.renderTargetMask.texture;
_this.blur = options.blur !== undefined ? options.blur : true;
/**
* A list of objects to outline.
*
* @type {Object3D[]}
* @private
*/
_this.selection = [];
/**
* The current animation time.
*
* @type {Number}
* @private
*/
_this.time = 0.0;
/**
* The pulse speed. A value of zero disables the pulse effect.
*
* @type {Number}
*/
_this.pulseSpeed = options.pulseSpeed !== undefined ? options.pulseSpeed : 0.0;
/**
* A dedicated render layer for selected objects.
*
* This layer is set to 10 by default. If this collides with your own custom
* layers, please change it to a free layer before rendering!
*
* @type {Number}
*/
_this.selectionLayer = 10;
return _this;
}
/**
* The resolution scale.
*
* @type {Number}
*/
createClass(OutlinePass, [{
key: "setPatternTexture",
/**
* Sets a pattern texture to use as an overlay for selected objects.
*
* @param {Texture} [texture=null] - A pattern texture. Set to null to disable the pattern.
*/
value: function setPatternTexture() {
var texture = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
this.outlineBlendMaterial.setPatternTexture(texture);
}
/**
* Clears the current selection and selects a list of objects.
*
* @param {Object3D[]} objects - The objects that should be outlined. This array will be copied.
* @return {OutlinePass} This pass.
*/
}, {
key: "setSelection",
value: function setSelection(objects) {
var selection = objects.slice(0);
var selectionLayer = this.selectionLayer;
var i, l;
this.clearSelection();
for (i = 0, l = selection.length; i < l; ++i) {
selection[i].layers.enable(selectionLayer);
}
this.selection = selection;
return this;
}
/**
* Clears the list of selected objects.
*
* @return {OutlinePass} This pass.
*/
}, {
key: "clearSelection",
value: function clearSelection() {
var selection = this.selection;
var selectionLayer = this.selectionLayer;
var i, l;
for (i = 0, l = selection.length; i < l; ++i) {
selection[i].layers.disable(selectionLayer);
}
this.selection = [];
this.time = 0.0;
return this;
}
/**
* Selects an object.
*
* @param {Object3D} object - The object that should be outlined.
* @return {OutlinePass} This pass.
*/
}, {
key: "selectObject",
value: function selectObject(object) {
object.layers.enable(this.selectionLayer);
this.selection.push(object);
return this;
}
/**
* Deselects an object.
*
* @param {Object3D} object - The object that should no longer be outlined.
* @return {OutlinePass} This pass.
*/
}, {
key: "deselectObject",
value: function deselectObject(object) {
var selection = this.selection;
var index = selection.indexOf(object);
if (index >= 0) {
selection[index].layers.disable(this.selectionLayer);
selection.splice(index, 1);
if (selection.length === 0) {
this.time = 0.0;
}
}
return this;
}
/**
* Sets the visibility of all selected objects.
*
* @private
* @param {Boolean} visible - Whether the selected objects should be visible.
*/
}, {
key: "setSelectionVisible",
value: function setSelectionVisible(visible) {
var selection = this.selection;
var i, l;
for (i = 0, l = selection.length; i < l; ++i) {
if (visible) {
selection[i].layers.enable(0);
} else {
selection[i].layers.disable(0);
}
}
}
/**
* Renders the effect.
*
* @param {WebGLRenderer} renderer - The renderer.
* @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.
* @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.
* @param {Number} [delta] - The time between the last frame and the current one in seconds.
* @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.
*/
}, {
key: "render",
value: function render(renderer, inputBuffer, outputBuffer, delta, stencilTest) {
var mainScene = this.mainScene;
var mainCamera = this.mainCamera;
var pulse = this.outlineBlendMaterial.uniforms.pulse;
var background, mask;
if (this.selection.length > 0) {
background = mainScene.background;
mask = mainCamera.layers.mask;
mainScene.background = null;
pulse.value = 1.0;
if (this.pulseSpeed > 0.0) {
pulse.value = 0.625 + Math.cos(this.time * this.pulseSpeed * 10.0) * 0.375;
this.time += delta;
} // Render a custom depth texture and ignore selected objects.
this.setSelectionVisible(false);
this.renderPassDepth.render(renderer, this.renderTargetDepth);
this.setSelectionVisible(true); // Create a mask for the selected objects using the depth information.
mainCamera.layers.mask = 1 << this.selectionLayer;
this.renderPassMask.render(renderer, this.renderTargetMask); // Restore the camera layer mask and the scene background.
mainCamera.layers.mask = mask;
mainScene.background = background; // Detect the outline.
this.material = this.outlineEdgesMaterial;
renderer.render(this.scene, this.camera, this.renderTargetEdges);
if (this.blurPass.enabled) {
// Blur the edges.
this.blurPass.render(renderer, this.renderTargetEdges, this.renderTargetBlurredEdges);
}
if (this.blend) {
// Draw the final overlay onto the scene colours.
this.material = this.outlineBlendMaterial;
this.outlineBlendMaterial.uniforms.tDiffuse.value = inputBuffer.texture;
renderer.render(this.scene, this.camera, this.renderToScreen ? null : this.outputBuffer);
}
} else if (this.renderToScreen) {
// Draw the read buffer to screen.
this.copyPass.render(renderer, inputBuffer);
}
}
/**
* Updates the size of this pass.
*
* @param {Number} width - The width.
* @param {Number} height - The height.
*/
}, {
key: "setSize",
value: function setSize(width, height) {
this.renderTargetDepth.setSize(width, height);
this.renderTargetMask.setSize(width, height);
this.renderPassDepth.setSize(width, height);
this.renderPassMask.setSize(width, height);
this.blurPass.setSize(width, height);
width = this.blurPass.width;
height = this.blurPass.height;
this.renderTargetEdges.setSize(width, height);
this.renderTargetBlurredEdges.setSize(width, height);
this.outlineBlendMaterial.uniforms.aspect.value = width / height;
this.outlineEdgesMaterial.setTexelSize(1.0 / width, 1.0 / height);
}
/**
* Performs initialization tasks.
*
* @param {WebGLRenderer} renderer - The renderer.
* @param {Boolean} alpha - Whether the renderer uses the alpha channel or not.
*/
}, {
key: "initialize",
value: function initialize(renderer, alpha) {
this.renderPassDepth.initialize(renderer, alpha);
this.renderPassMask.initialize(renderer, alpha);
this.blurPass.initialize(renderer, alpha);
}
}, {
key: "resolutionScale",
get: function get() {
return this.blurPass.resolutionScale;
}
/**
* You need to call {@link EffectComposer#setSize} after changing this value.
*
* @type {Number}
*/
,
set: function set() {
var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0.5;
this.blurPass.resolutionScale = value;
}
/**
* The blur kernel size.
*
* @type {KernelSize}
*/
}, {
key: "kernelSize",
get: function get() {
return this.blurPass.kernelSize;
}
/**
* @type {KernelSize}
*/
,
set: function set() {
var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : KernelSize.VERY_SMALL;
this.blurPass.kernelSize = value;
}
/**
* Indicates whether the outline overlay should be blurred.
*
* @type {Boolean}
*/
}, {
key: "blur",
get: function get() {
return this.blurPass.enabled;
}
/**
* @type {Boolean}
*/
,
set: function set(value) {
this.blurPass.enabled = value;
this.outlineBlendMaterial.uniforms.tEdges.value = value ? this.renderTargetBlurredEdges.texture : this.renderTargetEdges.texture;
}
/**
* Indicates whether dithering is enabled.
*
* @type {Boolean}
*/
}, {
key: "dithering",
get: function get() {
return this.blurPass.dithering;
}
/**
* If enabled, the result will be dithered to remove banding artifacts.
*
* @type {Boolean}
*/
,
set: function set(value) {
this.blurPass.dithering = value;
}
/**
* Indicates whether the effect should be applied to the input buffer.
*
* @type {Boolean}
*/
}, {
key: "blend",
get: function get() {
return this.needsSwap;
}
/**
* If disabled, the input buffer will remain unaffected.
*
* You may use the {@link BloomPass#overlay} texture to apply the effect to
* your scene.
*
* @type {Boolean}
*/
,
set: function set(value) {
this.needsSwap = value;
}
/**
* The effect overlay texture.
*
* @type {Texture}
*/
}, {
key: "overlay",
get: function get() {
return this.outlineBlendMaterial.uniforms.tEdges.value;
}
}]);
inherits(OutlinePass, _Pass);
return OutlinePass;
}(Pass);
/**
* A pixelation pass.
*/
var PixelationPass =
/*#__PURE__*/
function (_Pass) {
/**
* Constructs a new pixelation pass.
*
* @param {Number} [granularity=30.0] - The intensity of the effect.
*/
function PixelationPass() {
var _this;
var granularity = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 30.0;
classCallCheck(this, PixelationPass);
_this = possibleConstructorReturn(this, getPrototypeOf$2(PixelationPass).call(this, "PixelationPass"));
_this.material = new PixelationMaterial();
_this.granularity = granularity;
return _this;
}
/**
* The pixel granularity.
*
* @type {Number}
*/
createClass(PixelationPass, [{
key: "render",
/**
* Renders the effect.
*
* @param {WebGLRenderer} renderer - The renderer.
* @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.
* @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.
* @param {Number} [delta] - The time between the last frame and the current one in seconds.
* @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.
*/
value: function render(renderer, inputBuffer, outputBuffer, delta, stencilTest) {
this.material.uniforms.tDiffuse.value = inputBuffer.texture;
renderer.render(this.scene, this.camera, this.renderToScreen ? null : outputBuffer);
}
/**
* Updates the size of this pass.
*
* @param {Number} width - The width.
* @param {Number} height - The height.
*/
}, {
key: "setSize",
value: function setSize(width, height) {
this.material.setResolution(width, height);
}
}, {
key: "granularity",
get: function get() {
return this.material.granularity;
}
/**
* A higher value yields coarser visuals.
*
* @type {Number}
*/
,
set: function set() {
var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 30;
value = Math.floor(value);
if (value % 2 > 0) {
value += 1;
}
this.material.granularity = value;
}
}]);
inherits(PixelationPass, _Pass);
return PixelationPass;
}(Pass);
/**
* An advanced Depth of Field (DoF) pass.
*
* Yields more realistic results but is also more demanding.
*
* This pass requires a {@link EffectComposer#depthTexture}.
*/
var RealisticBokehPass =
/*#__PURE__*/
function (_Pass) {
/**
* Constructs a new bokeh pass.
*
* @param {PerspectiveCamera} camera - The main camera. Used to obtain the focal length and the near and far plane settings.
* @param {Object} [options] - Additional parameters. See {@link RealisticBokehMaterial} for details.
*/
function RealisticBokehPass(camera) {
var _this;
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
classCallCheck(this, RealisticBokehPass);
_this = possibleConstructorReturn(this, getPrototypeOf$2(RealisticBokehPass).call(this, "RealisticBokehPass"));
_this.material = new RealisticBokehMaterial(camera, options);
return _this;
}
/**
* Renders the effect.
*
* @param {WebGLRenderer} renderer - The renderer.
* @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.
* @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.
* @param {Number} [delta] - The time between the last frame and the current one in seconds.
* @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.
*/
createClass(RealisticBokehPass, [{
key: "render",
value: function render(renderer, inputBuffer, outputBuffer, delta, stencilTest) {
this.material.uniforms.tDiffuse.value = inputBuffer.texture;
this.material.uniforms.tDepth.value = inputBuffer.depthTexture;
renderer.render(this.scene, this.camera, this.renderToScreen ? null : outputBuffer);
}
/**
* Updates the size of this pass.
*
* @param {Number} width - The width.
* @param {Number} height - The height.
*/
}, {
key: "setSize",
value: function setSize(width, height) {
this.material.setTexelSize(1.0 / width, 1.0 / height);
}
}]);
inherits(RealisticBokehPass, _Pass);
return RealisticBokehPass;
}(Pass);
/**
* A pass that renders the result from a previous pass to another render target.
*/
var SavePass =
/*#__PURE__*/
function (_Pass) {
/**
* Constructs a new save pass.
*
* @param {WebGLRenderTarget} [renderTarget] - The render target to use for saving the input buffer.
* @param {Boolean} [resize=true] - Whether the render target should adjust to the size of the input buffer.
*/
function SavePass(renderTarget) {
var _this;
var resize = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
classCallCheck(this, SavePass);
_this = possibleConstructorReturn(this, getPrototypeOf$2(SavePass).call(this, "SavePass"));
_this.material = new CopyMaterial();
_this.needsSwap = false;
/**
* The render target.
*
* @type {WebGLRenderTarget}
*/
_this.renderTarget = renderTarget !== undefined ? renderTarget : new WebGLRenderTarget(1, 1, {
minFilter: LinearFilter,
magFilter: LinearFilter,
stencilBuffer: false,
depthBuffer: false
});
_this.renderTarget.texture.name = "Save.Target";
_this.renderTarget.texture.generateMipmaps = false;
/**
* Indicates whether the render target should be resized when the size of
* the composer's frame buffer changes.
*
* @type {Boolean}
*/
_this.resize = resize;
return _this;
}
/**
* Renders the effect.
*
* @param {WebGLRenderer} renderer - The renderer.
* @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.
* @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.
* @param {Number} [delta] - The time between the last frame and the current one in seconds.
* @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.
*/
createClass(SavePass, [{
key: "render",
value: function render(renderer, inputBuffer, outputBuffer, delta, stencilTest) {
this.material.uniforms.tDiffuse.value = inputBuffer.texture;
renderer.render(this.scene, this.camera, this.renderTarget);
}
/**
* Updates the size of this pass.
*
* @param {Number} width - The width.
* @param {Number} height - The height.
*/
}, {
key: "setSize",
value: function setSize(width, height) {
if (this.resize) {
width = Math.max(1, width);
height = Math.max(1, height);
this.renderTarget.setSize(width, height);
}
}
/**
* Performs initialization tasks.
*
* @param {WebGLRenderer} renderer - The renderer.
* @param {Boolean} alpha - Whether the renderer uses the alpha channel or not.
*/
}, {
key: "initialize",
value: function initialize(renderer, alpha) {
if (!alpha) {
this.renderTarget.texture.format = RGBFormat;
}
}
}]);
inherits(SavePass, _Pass);
return SavePass;
}(Pass);
/**
* Half PI.
*
* @type {Number}
* @private
*/
var HALF_PI = Math.PI * 0.5;
/**
* A vector.
*
* @type {Vector3}
* @private
*/
var v = new Vector3();
/**
* A vector.
*
* @type {Vector3}
* @private
*/
var ab = new Vector3();
/**
* A shock wave pass.
*/
var ShockWavePass =
/*#__PURE__*/
function (_Pass) {
/**
* Constructs a new shock wave pass.
*
* @param {Camera} camera - The main camera.
* @param {Vector3} [epicenter] - The world position of the shock wave epicenter.
* @param {Object} [options] - The options.
* @param {Number} [options.speed=1.0] - The animation speed.
* @param {Number} [options.maxRadius=1.0] - The extent of the shock wave.
* @param {Number} [options.waveSize=0.2] - The wave size.
* @param {Number} [options.amplitude=0.05] - The distortion amplitude.
*/
function ShockWavePass(camera) {
var _this;
var epicenter = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : new Vector3();
var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
classCallCheck(this, ShockWavePass);
_this = possibleConstructorReturn(this, getPrototypeOf$2(ShockWavePass).call(this, "ShockWavePass"));
/**
* The main camera.
*
* @type {Object3D}
*/
_this.mainCamera = camera;
/**
* The epicenter.
*
* @type {Vector3}
* @example shockWavePass.epicenter = myMesh.position;
*/
_this.epicenter = epicenter;
/**
* The object position in screen space.
*
* @type {Vector3}
* @private
*/
_this.screenPosition = new Vector3();
/**
* The speed of the shock wave animation.
*
* @type {Number}
*/
_this.speed = options.speed !== undefined ? options.speed : 2.0;
/**
* A time accumulator.
*
* @type {Number}
* @private
*/
_this.time = 0.0;
/**
* Indicates whether the shock wave animation is active.
*
* @type {Boolean}
* @private
*/
_this.active = false;
/**
* A shock wave shader material.
*
* @type {ShockWaveMaterial}
* @private
*/
_this.shockWaveMaterial = new ShockWaveMaterial(options);
_this.shockWaveMaterial.uniforms.center.value = _this.screenPosition;
/**
* A copy shader material.
*
* @type {CopyMaterial}
* @private
*/
_this.copyMaterial = new CopyMaterial();
return _this;
}
/**
* Emits the shock wave.
*/
createClass(ShockWavePass, [{
key: "explode",
value: function explode() {
this.time = 0.0;
this.active = true;
}
/**
* Renders the effect.
*
* @param {WebGLRenderer} renderer - The renderer.
* @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.
* @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.
* @param {Number} [delta] - The time between the last frame and the current one in seconds.
* @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.
*/
}, {
key: "render",
value: function render(renderer, inputBuffer, outputBuffer, delta, stencilTest) {
var epicenter = this.epicenter;
var mainCamera = this.mainCamera;
var screenPosition = this.screenPosition;
var shockWaveMaterial = this.shockWaveMaterial;
var uniforms = shockWaveMaterial.uniforms;
var center = uniforms.center;
var radius = uniforms.radius;
var maxRadius = uniforms.maxRadius;
var waveSize = uniforms.waveSize;
this.copyMaterial.uniforms.tDiffuse.value = inputBuffer.texture;
this.material = this.copyMaterial;
if (this.active) {
// Calculate direction vectors.
mainCamera.getWorldDirection(v);
ab.copy(mainCamera.position).sub(epicenter); // Don't render the effect if the object is behind the camera.
if (v.angleTo(ab) > HALF_PI) {
// Scale the effect based on distance to the object.
uniforms.cameraDistance.value = mainCamera.position.distanceTo(epicenter); // Calculate the screen position of the epicenter.
screenPosition.copy(epicenter).project(mainCamera);
center.value.x = (screenPosition.x + 1.0) * 0.5;
center.value.y = (screenPosition.y + 1.0) * 0.5;
uniforms.tDiffuse.value = inputBuffer.texture;
this.material = shockWaveMaterial;
} // Update the shock wave radius based on time.
this.time += delta * this.speed;
radius.value = this.time - waveSize.value;
if (radius.value >= (maxRadius.value + waveSize.value) * 2) {
this.active = false;
}
}
renderer.render(this.scene, this.camera, this.renderToScreen ? null : outputBuffer);
}
/**
* Updates the size of this pass.
*
* @param {Number} width - The width.
* @param {Number} height - The height.
*/
}, {
key: "setSize",
value: function setSize(width, height) {
this.shockWaveMaterial.uniforms.aspect.value = width / height;
}
}]);
inherits(ShockWavePass, _Pass);
return ShockWavePass;
}(Pass);
// Generated with SMAASearchImageData.generate().toCanvas().toDataURL(), not cropped, low dynamic range.
var searchImageDataURL = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEIAAAAhCAAAAABIXyLAAAAAOElEQVRIx2NgGAWjYBSMglEwEICREYRgFBZBqDCSLA2MGPUIVQETE9iNUAqLR5gIeoQKRgwXjwAAGn4AtaFeYLEAAAAASUVORK5CYII";
// Generated with SMAAAreaImageData.generate().toCanvas().toDataURL().
var areaImageDataURL = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKAAAAIwCAYAAAABNmBHAAAgAElEQVR4Xuy9CbhlV1ktOvbpq09DkiIkUBI6kxASIH0DlAQiIK1wRfSJTx+i4JX7vKIigs8HXpXvqVcvrcC9agQ7IDTSSWgqCQQliDRBJKkkhDSkqVPNqVOnP+8b//rH3P+eZ+199tlznVTlvVrft7+1T7OaueZY42/m37QALKNk2wHg1pITlB17mC+Pp11W3X/LHyT32vhg48/5SOv+PnwpsHA70JoGlueB1iKApeqzvOzn44GatTB76Xzhd7suBR7+WWADgDEAwwCG/L54b/poDLrHuvvm70Z2Avhsc+PVcxscBU8F8C8ADg5+ipIjD/PlGwfgju8B924E5seARUfLsiNmqQW0IjL8+7L2NYD/7COBzfcCm+aB8SVgdAkYIRCXKyDax4EdAanL5PuNPllNvXDlAHwFgP8AcC2AhRIoDXbsYb48dl5WkVFTE3LGDcC9m4CZCWBuFFgeAZaGAYJQQCRqDHT+McJrVb8zwATUXH02MHYfMHEIGFsAxgjApQqACYQORjtd/B7Axt/z79sC0+cMPgjjlwPwVwHcA+DfAHzTxcVgWBroqMN8+cYBeM71wH0TwKExYHYUWCIAHYRLTlkCYgcIBcAgU/n3qy8GRu4HRgnAOWBkERhddPAJhGJDBxkvw7cqimr+zFM/ZLnZF64cgL8BYD+AWwB8x/dlWuWagHiYL984AJ/0RWBy1AE4AizyM1yxYAcTigW55xMbAkxEiwEdkJ/ZCQxPAiOHgBECcKEC4TBZcKkSv+mTieNcNPNC26mLNsj45QD8LQDTAO4GcJt/7iw2bfoG4WG+vAGwm9ExiEg69zpg/wgwPQLMjgALzn4E4aIzoJjQ9g4024uygkj+pyuAoX0VAIfngOH5NgCHMhAm8Sv2y3XDZeBhNIp8OzJE8OsBzAKYBHAXgDt8/4O+MVT0j4f58o0D8Pxrgf3DwMwIMEPQEYRkNwfgsuuDZLskip0No0gWMD/9HGDoADAkAC4Aw/wsAgZAgs2Z0ABI0GU6IVmKv+f28KDnHxkA/G0A8y6G73N9kOCjXnh/Ebb6OvgwX75xAF5wLTA1VIHPADgMLDj4yIA5AAm6aCUnv4oz46eeDwxNAUMzwJAz4BABSNDFTwSfg7DDKHE23MG5PqIY8A1u/dINs9dBdy8AgnGPM2NfUBrsnw7z5RsH4IXXAAcJviFgluAbygBINnSLWOAjGxJ4pgOKDV0v/OSLKp8iGXBovhLBBOCQM2ACoTOhnYrAdItYbCij5JFzRyIAqRccAnDAQUjg6UNQ7hsMXP0cRQAexss3DsCLCECCLwCQzMcPwUi2MwAScAKbfnY/YRLFQ8DHX+IAJAMSfDkAF13kLvleIjhjQQHxUVS3jjgGpKeeNzYVQEjgUS8k+PghONdhIwAP4+XXBYCHKIJbwJyDTgaIAdCBJx3Q2M8tYAHP9m4df/ylQOsQ0JqtRLCx30K1wtLBggScQOgsKBGcWHAJeOwRC0BSM1mQIKRbhh+Bj98JQP6t4U0APEyXXxcAEnxkQAFwoVUxID9kvQg+c1C7vidRbIDkc24B//hTQGumDcCWA5DgMxASdNIFBUI5pCML8v8API5zfEQx4BudgqiczviSnJhQwCP4BMCGl+wO8+U7AJi/W4O4YS6+pmK/2ciADsAOBhTIIiAJnPB7AvNjP+0AnANaYkAHX2JBAc+tYaJXOqBZv24Vc386XW5dtkHGW+4HFAJonpOe+YYQZAShgKjv3PNvPQaxVoI8zJdfFwASfPzMUwS3Kt1v0UFIlos6oDFdAGFcliMAP/ryAEAGNwQRnDOgLbdlIEwrIs6AZ/QgkMMHQF6ZAKQcJAsSYPwIeAIk9wJgoPK1gi7+PwF4GC/fOAAvIQPSs0URTPBJ/Pp3GSEGRHfBCIQ0xowBtUbcAj7ys5X4Jfu1HIAGQrIgQRXEsAFQIORDFhiDY/rMHmrU4QUgR08AkgUjCAW6CD6CkwBsAIQC4GG6fPMA3OXiNzCg2I9gNCMksmAAoemDzoimFwL48M85AKkiuQVMAAp8CYRRDAt8GQiJ67N6GJODAXAHlsGguscA2AJg1IPGYmxOpBxFWkRN9LsATgIwXnNs/v/5z/9XCf8BO3YAtxbc/46/KDt+5+ea1Yku2VUxHz/z0v24FwMGK1gWsK2OUUxHHdCBeRUB6OxHABr4ZICIBd0QWSF+XRdMTAjgCdTrG9cBNwE4F8CpDkICyYLGsuhFt6zs+gISwUen8zEAjgMw4cfx2H6O/90yAFo84Cbg4ID3/9TfLTt+5+ebnRABkODjx0SwPi5ec/FrYpmqSAxM8Dn60CsqAFI6GfhqAMiDE/gokmvEr0C4PgDkBQm40wE8zMFEUDKEVoxIMLl/KS73mE7H9d+vcKHQQcjwW0Yu9nP8m8sAmOIBuWY6wP2/4s0ezjjg8TuvaR6ABJ70vxUApGrm7EbGE+i472BAB+WHfqHS/eoAaEwY2E9+wLSXTqhI7CXgnB6LCoOJ4BiST+hTnG0HcCwAglCx3ARoZEVFXnBPp/O/A/hXACc7CPs9/i1lAOyIB+RDX+P9/+pbQjjjAMfv/PL6AFDs1wFAgs/9fgKfgdE/ZEpuiQlbwAde6QAMBgiRmsSwA9BY0JfjovGRDBMH4TlcXGhcBOc6HkF0gjPhZgchxTLZMAci/04W/B6Ab3t09EPXcPyflgFwRTwgJ2MN9/8bf5qFM67x+B/aW4XQz42FeL0YrRyikztUFw0704mf9kXgxhOAqc3AAsPyRxxQCs/PdXOFY0W1KHy3QIUGtx+6vdnx1vsB+dsTncm2AogglFgVEAlUWrOMB2RyEmMCGQ/Y7/HvKns6tfGAnJQ+r/9b76oJZ1zD8WdyQjYBh8aBhVEHjELouQ8ukQ7VRSCJAALwkr+sALhnGzDD3JAJYJHg9uhoi4bx8ytkWUtvHT/7+Zc4dw1uZ3612fH2dkQf7yxIEEockwkJQn4IQoq8unhAhmPRKKFx0uv4K8ueTs94wD7u//VX9ghn7OP4c+4G7h8HpseB+dF2AKlFLwuAIZ8jD6NPrOhAffmfA9/ZBuzZCkyRWSeqBCWyoYGQ5yQrBpDbum/ME1HoPo0XEkSD2zlfbna8q6+EUJcTCxKEtHL5EQjP6BEPyIgYAZBvYt3xHyx7OqvGA65y/7/9wVXCGVc5/sl7qxD66dEqiYgRzAqhN1A4CBNAAlDyAFI+iZ9/N3DLJuC+jcDUBmCWyUnOrmTYCMIOkNclLg0B8/RsNLg9+UvNjnd1APLmmQpFHyEBROuWACQT8nN+H/GAvY7/VNnT6SsesMf13/CpahGnZzhjj+PPmwX2MYdDIfQexWyBAwEUOQDrRDN/98p3A7dvAO6fAA5sqHJDBEAyoUVGkwEd6HR12XU4kwzfl6fCXTZzjy57vvnR513X7Hj7AyDvggAUi9EyFgiZqNxPQF6345nOWbD1HQ/Y5fpvuLa/2+82/vNHgAPDFQDnhoF5j2C2qBWCI8bw1eRw5CL5l94L3DEOTI4DB8Y9OWmsEu/zBJ3rgsaybqBob/7A4C7jtWcooRrczr+u2fH2D0AOQgAUCxKEP7aGgLy64+m6KdjWFA9Yc/03/Osa4glrjr+AupqHz1sEs0cxG0BC9HIePLoit9eNkVf9L+DuUWByDJgaq4ybGYLPAWgiXmLedUE7dwC7saL7CqfPKXi4NYdaykCD410bAHlDEsNiwZ9wAPYbkJcfz6T2gm3N8YDZ9d/wHxUA+739fPwXPrSKYGb+BuP3jAFDElFH9HIWwbzCIGkBr/or4J4RYO8oMOW6ZVcAuvi1Cgoha04BCwT5gfMKHm7NoRde2+x41w5A3hQZkADk5+cGiAeMx3+/7AENFA8Yrv/G71cAXFM4Yzj+otOAaQLQA0gZxaIIZtMDFTigKJV8H9Iq6aZ59ZXAvSPAvpEKgBTtBODcSCWCZeRYtpzrmLyeGNCAyFl1v+Hei8qeb370Rdc2O97BAMi7EgB/2QG41nhAHU9LuWAbOB7Qr//GPRUA13r7Gv9FZwIMoVcEswEwfDoimEP0shKKtIphaZQAXv1+YM+wA3DEdcvRKkGJADQQEsQuhi1Tjt95vBsh5nx2IO59SsHDrTmUOStNjndwAAqEry0IyCMICkOyiuIBNwBvPFQQT7gBuPjc9oRYAIHyOEL4vIFEYVNaOou5vCGE/tV/A0wOVcnpzI47NOri3QFIBpSeaSDUdYLOSWvYImSGgftpJDa4MWJbAGxivGUA5MAOc0Be6eVLj7/4Mk+hzCOYPYpZDBiNkLh+G/M3yFyv/ltgL3W3YQfgcFUhgRY2PwY+Z7/EhAR1SFyXCOb57r28QfQBsJQBMn5D4y0HYLPje9Cd7RIC0PM3EiMofF4gVCBp1P840ix/gyz56r+vAMjk9Gl375iB4+CzveuZdLkkEPJ8ZEfX/6R73vOjzT5Si9hucLxHAVg4PwJgRwh9CKOXK8YA4ZEqKZXSQWh5P+5AftXfA/uGKvYjCKn72cctbFrZNECka5L5CPwIPtMH3TVz17MLB5gdLgA2Nd6jACycHwLQxFEUSR5ASvARDB0h9AQb9bXIgCGk6lUfAPYTgEPAITKgg1BObk58srTJgG58WMkWMaAbQQT1nc8rHGANAJsc71EAFs4PAagQestgC1lsBJ4BMCSOK6dDUcwqqaFiQr/0QeAAAdjy+jBiQQeeMSBZT3nCPUDIa9z+/MIB1gCwyfEeBWDh/BCAeQSzgkjFfGLBBD5nxQ4DxN0wv3hVxX5TBGDwL5obxvVA5YqYL5BeMLd66YYxJpRB0gK+96LCAdYAsMnxHgVg4fwIgMrhUPKQ2C+Bz0PmBTqBMQehAbDlIjj4F80KJguSVZ0FuXpjoCOgXawLjALhbT9eOMAuAGxqvEcBWDg/l1IE05Ed0ygZnyHdz0VwCqEPIfNyx0QQvvLDFQCp+8nfZk5und8tXwIgWcHSNX0N2CJmnAl3v6RwgNnhl17T7HiPArBwfghAS7mV/hey2JS9FvM3BLpUUi1YwDRMXvkRYJoAlAh2l0dcZ04s6JUTDIjyBcrl4yDc/dLCAdYAsMnxHgVg4fxwKVwJgGEJNmWtxpQMpX9on2eRhVA+O56AjMfnP+e3Xvf3NwG4xIPTleiY55bpGh6UbafNU0l0z0p+5Jh5HqYJ6b51nP6XP8cx12XNHQVgIQB/bFPVg2OC7Q+WgVFWng/FvtWLI06uWh5oguKEcXVS/9sEAF//VGD7t4ETDgJbF4CNi8CGZWBs2fPL/H6Vwp2KEtVk4fJ+v/EIYPN9wKa5qu+IncfPwXHVZe/aOL3EbwS7xv8A1rQvnO0j8PArTgTGZ4BxFv9mIxhOCGsv+0OPYDRghcLfkWkEuq0+G00x4OtfDGz+d2DbHmDLjL8si8AYP/7CGIAiEEMTG92zXqSbH+d9R2aA0XnvO+JjthiIrOVDHHPOkBrzUQAWAPsZp3oPDpa/Xag6EVkLBK+5rAnJC3/nYk/APD704WiEAV8OTHwX2LQH2DgFbJgFNrBhjd8r79deGoEwsllgNBOzy8CdjweG9wBj08AIAci2D6HafmyAk4/Z7SJ72hGYRwFYAMDLTwOGp4FRFgD3HhzqRGQiyeurqOdG6r0Rm8IEZjzRlkiqCWoEgK8Axm4BJu4HJhyAbFhDxmbDGnZO4j0SgLGDkpibgEq66TJw/1nA0F5gdLpq+zDqFfd5LMeWqu5HNST0uJOIllg+qgMWgI+HPv0xwLA3gWHpW2sC441gCECbmKziaGrnUdMO4aHeh6MxAP4SMHI7ML4HGD8AjHvHJGNAgpDgY/ck3stipRemvVhc+uASMPUEYGh/9dIRgGx8Y+MNbR/00uVtH0wEx94j/v0oAxaA8Ed+GBieAYZZg5kADC0QWGOFzGJlcGPzl1BxNLXD8sk4xftwNAbA/wwM3wGMUmxOOQBnHXzetIYvibonmSiuYTNjriVg7glAiwBk0fNZH6+PmX9P6kfNmCXGpftJ7TgKwBIAnln14BAAYxMYm5C6RjCyCoOyr0qkD/c+HI0B8DXA8N3AyCQwesD1VQKH7EcASm1Q+y4CkN9pUKiVF5nLvy+fBbTUd8QBaH1HvNBROiZvfsNnrF4kcvPwpdsBLBeU18Nf7AB23Dp4ecHC8oBgUlJJecLS+7+WOpE3gbE+HKw+yoevCYkMGKqPJrdEKARutaFYRs1fiEZ0wP8CDN8LDO8FRqYq3W10pgKgfYLaYCzootgA6KXaTA90y374TKB1sBozy77xHFZ536utRgAmEaw6g5kUSFZwSXnA330qsOlfgHMPDlZesLA8IOjoLypPWHj/11EnCiVwkz7kAExtsGraYUWdSDX5TmsagL8KDBGA7Bd30JsW0oWivnEOQNP7yGTSBR101AlZSUtGyfgZDkCWY1HnJdcBVe6325hTvelg2CQjZNDygG/2An0j1wKnL6y9vGBheUC8prQ8YeH9X39OVQSc7Mc6fCaKvAeHdCIVf4yMYCynTpX+nb97NJmlSQb8r8DQHm9YOFUZTKOzoXGhs6AxF0HIexcLBvWBuiHN8s2ne98R3qc6L4Vyb2oBVjfm9MIFHbjDCh6kPOBbQoG+oW8CO5bWVl6wsDwgfr20PGHh/X/1iaEIuDcCTIW/1Q4rFv8OnYiW3c+W2iKwUjKbyjQNwL1uuR6sAEgDgq1brXOmV81PxhNB6DUDBSYzQJwFtz623XcktX1Q1VWKaTF/zZhVazBVYA1tX5MazsGvobwe/jQr0Ne6BTh5uf/ygoXlAfG60vKEhff/rSe1i4DnTWDUACY1guFTDqLYdCBvf6DJYSMYATBfOx1kLfj1v1axH10nQ3Sd0GUkBnTfpemtBJgseIKQAHLQcVxa2TnuMW0Aqui5es8xBIegVdVVE8VhzHnLh65WMB9An+X18K6aAn2tO4ETl6vqbKuVFywsDwhevqg8YeH93/Rk70JE90nowxZbIJjvS3WYNSGUwGHJTpPxwwcbBuBrgRYBeKACn7VtpdUu/c0NJxO9BIxcKu4TTODzbkonPLoaL0vyUQRb2y8HsL1ckfWzMeuFi40Qezqi+yiPhyt7FOjr6/gCFwgP7Xb5vssTFt7/nQRg6MGRWmDRoeyTlpgw68GRTwgZgo1gGmXAX6/8dtaylSKY/koyID9BhzML3q1gAos2AcOrZYSoq/pJp1VtODRm9Z3LS/7WjVkvXOzEtOpKyGrlAT+4SoG+VY8vBGCvy/dVnrDw/vee65NBJiAjBIVcAJQjOm+DkCZEeiGAMw6sAwDZsJrAdhFM9rPGhd4904Co5oVuCZPV6kD40Ec6+9W8dBTBsfdc3nkpvnB82fp2RPcs79dHgb51LA9ofsDV6vut5/3PnxcAmLVBiDqgevDaJLkYrpuQxzcNwN8AWgIgRbB8loEBzXDwl4cGiDGft58SCOWGedgjvOJ+bPvgRkiuA+ZjzhnQQOiFNVbloa7l/fos0LdO5QENgEXlCfs8Qbf7HyMA3QVjYihYhLENgjX9y/qwxQmRU/asfd0ZcLU2CHVGyusJQLKfVi98CS12T5f7iECkHpsMkAhCF8+nshWH2I/jXsOYO144GV/9ApAIrS3vt4YCfetQHtAA2G+/4PW4/2PPbzMgmUMi2NoeSCRxIt2/FvuxWURIWCXg357gfTjEDNIHnTRXRCpH5ugKwGl3HpMBXQc0v6WLYVm/5limj04rG762K2uYY9jBkr9+rI03NL5ZbczS/dJ+LQyoga4o77fGAn0NlwdMAOy3vl/T938KAcj121z8Bn+Y9eWQJRz8Y6kNagDh2ey5EvxjxQD8TWdAuneCCO4An1vw5vdzQMmdktwq7pLZQR+dM34+ZumAxvY1Y04uqOAJ6FsExzeto7zfAAX6GiwPaLWR1lrfr8n7f/Rl3QGzmsis+/uO71V9OFgP2gpPhgr7TGRqRUT6dyvr4aIs/pm/2zVUNbBSv6G8e5pEv0Cvec7Po7+bTtjlBRlkvAMBkDeQyvsNWKCvofKACYBrre/X1P0/oWEAnnFD1YdjhtXxR73mX10FfCHHE9pVWcGAI/S0gKsfA2y+twrFZw6Hxf/F0Pk8Ri/kpGSnMuDx5T0iACgQHioo0NdAecBUHW6QdsV2/cL7v/Cyqr5gnc42CCOcfX1VIZ/V8We9IDmTzVXwPDJiXuKXPxtDBma8+lzP4WAgKkPxCUAPE4v5GzEuMX0PYJPLhB6FJsc7MAMmkVxaYC/K9gG+F1++8AQ7Gwbgk78I7GFpXgIwFiRXOwaJZPUbiR0yCUDRk+cHf+YpwMj9HgfI8ClGPyvsSiH0WSKRuYlitLb/zHM/JOSs5C/YIC9cMQDZr/dwxgOW9gtGYUBi0wA8l304vDQvAchilFbpIBQhZ7Ejq6ZQ0/Yhil8y4j89Axie9DAsD6FX9HOK3QtROTFkviN83kG4felIY8DCeLrSeMDSfsEovAECUFsTjHD+tcB+tkFgcXKvBRir7qtFl9owmO4Xy/1G3bAFfPrZHorFNWBFwHjQAFctIghj2kBarw06If/+MM9ZqTN6DgsDojCerjQesLRfMApvoGkAWh8Ob/tgAPSKWCp8ngNQtadjmTdltvNvn3peFYhgQQgh+iUmEaUAUoXM1yRLmWuFLaE9Z+XIAWBhPF1pPGBpv2AU3kDTALzwmqo6qtVh9kJErAudABia38TC5wJgS2xIhAwBn3yhByL4EhzXfRXxYsDTJ4IvrNN2JFMxZcBzVo4cABbG05XGA5b2C0bhDTQNQLZBYH1AVsQSAAU+imI1obHyblnjG/kJk3U8BHz8xVUQAhnQIl5CyNgKAGp5LKSSCoAySh5Jj79vTagcxUaIBeRNe79g9gq+DXig4wGzy+PONfT7RWFA4noAkGXZVAhcBckJQgNgrLiaNb3paIDo1vHHX+oA9LQBi4DxJcOUPJUnTgU2NJUyROs8irGARxQAC+PpCtsFd40H/AEf0gMQkLgeACT41PiGoLOKqyrJq3K/Ya9mNyr5FusN/uPLPIeDa8Bc+w3rtyl4VFHaMZc3i9RWBM9jjzgAFsbTFbYLRmm/YBTeQNMAtD4cBKDXBTQGdAB2MGBo8SCLmEuS1AFVAJ3A/NhPt0PoCcA8bSDG76XI7aySg6JYuGfKwJHFgH0E5B3ueMCe/Y4L+xVHAOZ+9EHcEgQgwbeiEYx6jwTdz4qfu7EhEJqxGqruf/RnHIAEnxgwBM0aC8aUAYWNBRCmoIll4HTqO122QcZbrgMWxtMVtgvuOx6wa7/jwhtoGoDWh4MBJ16WN4lfr8AqI0TVV1O1fa9BbQzovkAy4Ed+NgCQUSxZCFWvCOaOFREXyUwZOPIA2GdA3uGOB6wPaOz+QPv5S+MA3OXiN9aclghW+d3IgupBF2pPqxcxGenDPxfSRh2ASiKKiVP2PaZScvAKoA0VDc6cOlIB2GdA3uGOB1zR77iwX/F6AFB9ONSOQW0frA50sILVcckWJyIDSgwPAVcJgFbYuZ3FJvAlEHbJ3IsgJLGedeBIA+AAAXmHOx6wo99xYb/i9QKg2iAIfDJEJHqj4SExbEty0gkdhB/6P9oZbBZIGiKYVb9GKaN50lRHBLOvhDxh/5EKwDUG5B3ueMB2QGM/grb7/6wHAPNGMAY+GSGUjC52VX2f2CD4+HO0gqkZfegXKgBaHkcWtS0AWii9xG1ImrLlN5XR8L8fmQD05BVrmEENmpYSP9QX+KHiqj2/82+HqqDWwnbBRfGATdzAegGwru2DpRq7Mzq2fpAf0Nq0Rl2wBXzglZ4yUAPAmDSVWDBPHQjLcgTqOZ6zUvdKHh4ruDCerox/Dnu7YqwXAC1NI/QcEQuK6WK/kdgCTGC0PYAP/KIDMBgglq+hIkrOfsaCviLSofcJgJ5AdM7kkSaCj/HqQKVIGvD4swF8bcBjmzjsaQ2H5D/6acBd9wALB4DFWWB5AVherMp4GKIYEOp7+26UF0aSfT/xYuDG7wDjrIpAERytXf2vajj7ueryQXSFl10K/ON3gIWDwCLvjfGB8Z54O+Ee4ve6513uB2R1yzsqC+twbC8HcNVhfAeaBuDP/TvwtS3A/ePAIfYFVlPq2HHTuyulZCTlhbjhETF5yxTQGgPGhoHhIWC4VSXGD3n0tLkMHXHxu+YyB+MlPwDuZs5K6FlsbCzdVO9DuKfkHM8AEkP7B8fOkwDcD+B7np42+JkGOvKdAL4E4K8P0zvQdET0b14D3DgB3D0B7B8HZka9WzrD88N6sFm+YcUjrn7E1ZDvMtF9DBgeAYaHgSGB0PNHCD4BLwLRsByAyX/ij0/dDUxuqlIG5hix7eFhvLcOVUAtyPSydAFmOQNe6EYGV/9ZESiKgIEgtbaD/gHALQC4ovY5r5KwtjOU/XfTAHzzLuCmIeDuMWDvKHBwpMoN0WQzNtAaYSs0K4ZlOSAjGG9kPjCBRwZ0ABKEBJexYAZEAU3A7Oi1BeDym4EDnjQ1TwCGWMW8MXcKks0YOyZNlQOQjcgYIUHllEzYQ0ktm+r6oz8G4F4AXwXwRd8/kO9A0wB8y65KmPxgGJgcqYJTKYpTv2CCzyddQJRDOjKivn+Deh8BF8BnwBtaCUA+YYEyAU8h+c6Az9gNHHRmrgOgmDA3jHQ+iWupCeUAvNSrA9HNwqx+muk9nJVNg/CTfrmbAPwbgK8D+PcHkIibjob5o13A3XypWsAkG1cPA9PDFQDZM1id0i1KxsWfOrKnAFXlifCFFMMRcASigOcs2MGAIfE9iWXplS6On7UbmPaUUTXQrgsVMzcRj5Folg2V5ayUA5BWYKwOxKUafnosWjcJwk+7W5F2EKvlE3xcXaNYfiCYsGkA/smuqug6hcleAnAImPbO6YwRpMgjCAVAm/yQmKTv5hNsAf/i7SyNBSl2a8Qv/4/M1yF+BZSYlNQCnnVrpbC+mToAACAASURBVJcaI7sOSEY2NpaDXLqpR+vE/OVksDgImgGgghHoYJbTWc7oJtFWc65/cg2AYvh2ALsB3AzgVv95nS/f4QdsIkT9T3cBrGtITWZfC5hqtQHInsEGQn3UDDvEDEY/ICf7SxMOrAg8T+c00JGkvHGd2DABUYZIAONzCUDppCFhSukCBsLQrFtZe/IixYQpSyEoJoqnuPWrVRAubQh83HNlZB23z7j1ywmj6CIIqUPxw2Xeu9bx2jx10wz4Z7sqTYZaDD8EIDuoE3hMVEphWg66JIp90k0sBxBcy+iPIIaT1RtEsHS/yIAqw+VSNPWQfe5tlVEk8auXgVa5BUsEJuT5uoliAbE5AGotmIAjCPnR9xDG3TQernYAUupTdBGEFMf83OkApHG+XlvTAPwfuyrgSZOhas3u6cwTsUBVn2gTwyFMi8wjHZAA1M9fYGHDULJD1m8Cpa8fRxDad+l+Ykf/3XNvd11U+qiL39SxXevSsshdDFvgbI1O2AwAtRZMZzTBRuDFjxe1Xg8QEIB8yyj5yYIUxfQIkfkIRnmHCM712JoG4FsdgHHp3ACoMH2G6jM4lWzoQarSvwQ6MSB/vporVaFkh+mCLlpVR8Z+dqDZLoDOpHSiQeAFDkBjPrlgCHgCUaFifg67H/9uYjn4Ai1vpTERTAASBaoQJBAKeNqHlL6mwPDZYAOROag/EYRkPX34MwHIvzW9rQcA+TLpI22G7EcQKlJGsYIJhC6ClUMiXfBTbFUQAej6nPS/OuAl9pOOqIc2BLzg++3VmWgIEUz82cRuCAtLIHQQm0gO52uOAb22sC3JEWgRfPpZf2sQBQIgLydPEIFGwPEj8MlF2bSbsulghLftqsCXq9HGgHysznrGgi5qzTUTFH8FLhAUn3hIJwCN0HLncw37qaF2zoYvuKNivmQIuUNc7GvWt6sHNs26twA6vhyq8NEMAHlyntFrDCcQehyaPTl+FwAbXDcmAKMRThakEk8Q8kPg8SPL0qzLBl+A9QCgR6uZGs3vfHz8TtBZvkgGQrEPBVAUg2Sij50QAOjiVKI3saADJRm7dSLYWfSFDkCem/dhZeMy9pPY5QvSDYQyUJoDIK8qMezh3wY6fSL49PcGgCAA8pScJLIgAUYQEmz8RPA17StvGoBv39W24eREiBoNQSgWNI1HBkdgxJSw1AI+dFIbgOYmkjimQ1r6XXC3rAbCHycAgytohf8vsB/r2KRaRq7zpZ+D37HMX0s3DDcCUGLYaw53MJ4YUODzusqlGCQAOQCejuxA8UULUkxIwAmMAp8Wa3qkN/R9W+sBwOhIEPjk5SLr8HeKFbTQfb77csPIMHGl/4MPbReslPhNe4+MiTpi9AFGV4nI7MfvagNQLh/pfrYnDAS8aJQ42A2w4em2cAyWQUuJVQTGWLs1uL7DG9J1RjhA+jvYk4t3KXeMqijpzrud4At9z3XtP16yGfjKZmCGooYh1tZzvv8xXPFl4PoJYC97k9FlwZWD+Azi/deMZWeP13eQCGEyoERudChIjbb3mJYwH7V0QIKuCwj/gfMj0asn2I0FXRSHXfL/iRkNgLyeVj8ccMY//J1fyxzTAXT2+xoQViKYD/1hDqLxPiYxTgSvQrphphG97tz4Slqafnj7uk1kIQDZrvWTw8B3jwEW+RLxPgSiCERdPwPR7+wCPg/gulFgfruDkOMQkFc5x84e708JAMmCuRNBXi4TIg5CGRzGiBGE/D4E/C2r2vcAYJoify62i0aJSMhB+2IHoNwu0fkcjQ85pu3ack5nIBREqneYFyWLkAXIJHESe00Cyx5QyeL6F/tyEcDcrOW2n7fX8df0mME+/vQ/PQjhoy3gzo3AISYf80MQaQx1peH9wb7v2mrtmCBkIMMejp3jIJD1MsaxaMZ8v5N/67INAsB3BAYU4JL4DSo1J15AFPAEwuQHZJzkKfUAtOHLJSOQRWndBYQvCQA01cfnNopfsaCJaD2baBn79QjSTiOEP1EcawIpkq2kegBTNgHWEpOKF8Uwq2NRFPM4AqCf46/rA2U9/uVDvurB01zvAJpiiwOl3fEeciCGF+Ij11f+QkbSfMPfIzqw57mEFZ9Dl3Ps5HXWAYByHJAJKV7N+s0cCQQhwSlfm4lGZ0KB8C/rABgZUS6ZHITBSEhCowUYAAksF7cStWREyxRwtuPpOlgw+5s9sq6OaIJIIlUgEhA1edoTgHxa9HVw5jibZNF+j/9yGQA/7pbujZ4bwv2+cWB6tFo0NzYnkxFA+cvEAo43VBoEo2e+48EMXEOmD9F6xhCE8RwZEJ80VblKvDlmzwicfqy93/o+8K8TwB2jVSgW138FrJQTXBNlnJgmrjZwanow9CBP/rL9wF0jwAGWDtFyoN9PHutnIHT05mPXz93dMGQAPniJsjiBXiTbxDZFMF9NLUPQxKR5qezz1Y6/YZDH0D6GkdAkYJIvRalAdHAMmPZoYhb6NhDWvEyf/ma737CXN7R1ZC7hUbPgcFgqt/ZZjADnM1xqEVhYBpb4CUk5UsL7jQvj///5buDrLeCOEeD+YQchYwG9VIfyg1NaZszFiCH6DkRGLze5/dgk8IMWcMCjdCiCzR8od1B8OTwvJM8JEShFut1fzMhi+eRJr6LI7hYP2M/xVLwKNoZjUTwRMAQQmYyhWGQxsSADOflZ4kukj7PhZ75bETjBpkAGahMkcrGgwhsXeCyBHBj1wmOBQwvAwqKzoFeRV8ZaerjKYAuirmPY/o9X7q5Cyr7fAvYMAftCPGAEoYlBiVtFwLjtp2U4irj7yOANbi+crHyrfCbTquJV44O0F1FrwQGIMZFqdQDyP/gGSZ8TC0ZRRsOlVzzgasd/u+zpMByLehAfCgMQCDyGZJHFCCgLZ2f8mgI5qauEcVx9e5vACTgCTwEMWr5TdIpWKJb5MvrnoocDswvAPAG4VLGg6UKeqmi4iuDz4er30oX0FP7u5moMvIf7W8B+jwlUNAzFnlZCIhvGFRCeWzrgXSSIBreXTFZSgVLHAp4UHOFuociEEsn2PJwl/XEk0dzfSojeerFg1IOo5BKAveIBex1P67lgUzgWQaJwLAKRH04i14ItgDKEtGsRnWx49b2Vkk9wUefTGrKCF7R0JxZMqxN8cmPAxWcAcxGABKEAKPA5u9lEaAbCmKMI+sDN1X3z+ro24wEZFc0VEE64ABgT180PF9ZdBcDb6JpqcPtPk+1ACbmKjJnllwyuILunEAWjZHkBsrsRUnfD0qEiC5IJfyisgMhzWhcP2O14Ro4WbASgAMQJ48SJwchmBCDFa8qpyBbSP7OvU4PQ0p2W7+LSnSJUFOrI4V7w5IoBTQQTfJ6oTSYk2mQcpGRyH2syGjIF6EM3V/fM++C1CfwUExhCsmzCaQT43lZC3e1hBpEHh36XEqrB7Scmq5dV0XZxmV8WuDFzAF9iwhow9seAGoBcGtKjqAc+1l9rLb/1igesO55ysmCrC8ei6IxRMAKTWNBi6Xw98xNTFUi0jEcmpYgRAPhddpVi9OIEPP5cYD4CcLkCooHPwaW9kV+iwWrQHT8uA1fd3F7DFvgUHUP2k8jTiogAqLoxFpDgbMj9jXSuN7i9dLIdaxzBp5XVBMIMgFEnFAPKT9qPd6A9BIGI7MfPmf4U+40HzI8nWgq2PBxL4FEkjKJixGRRFyQQPzzd1iAUzCAQas1YOmAEoFjwkecDC/PAwhKw6CxIkCXwOdVJLxTobMjBdyIgfvimNvNJ7Evf4jWtdnRYD1YNGVuG93VWuWs4Jf+mlZCCZxwP/cnJ6mXVKk2+tK8lQQVHRTGc64SDAZB3Ey3JcxyACkToJx4wHl+YwqloGDICmYmTFgMQFBET8yyYzyAG/AfWX8mCGQg0BTRoHwt9KVaPE/HQ890AIfgWK+CRAaMRYnVdxHbhdY8Wslw1V93UDsmPIj9GxgiAioRRMIJNvoti+SW/Ikd0gwAU8+XxJcbGITJPDvI6XdCFREFSknTB83xka40H1PGF9dnycCxFwygkK0bASJQSVAbAYeD98xUAe5U3jKIwBosSgNsuABYogl3/IwgFPrOIg1Xc4ZrpAsSrvruykl2ucykapkMMh4CExD5DwJfWAYAxwk4MKPAJgOIjGSEGwuCakRhemw6Yv0UUwRf7L00L9pnsNx6Qx4feY4O8pDEcixOjsoTKKpMYjSFYYjOC8Eq3Wnnr0YYS+0Tmi2HysrPGLqwASNYzBnT2Mz2QD91laxLB0gs12GAh81cf/o/OcHyJ+qj0S/zxnhUZbSyYWaL8+Rq2S29wowiWkJPan4MvgrDDGAlRe7KIywDIgR3meEDWg9HbJgApNTkXo8o0i7oVgxnEgFr8F7jEdnU5GvqfJQKQKyEOPlsNIQvyvupAGHS/Okv4qv9oh+PHxMLk8ggBCRxvAmEN+AiEzz2iQfQBeNmkh4K52hJBKOaNe/FSLobLRXCz43rQnu2yi9oMSMDxs2jo8303ERz1wsCGZECF4kd3DwEYYwJjhoNlQrgIjlYodbBPrwMAZfEmyzcIv27gs6XDzC/IR1DOgA9a6DRz4wZAsZ+LYXvQYsHoD4ziOFklna6YD3+nnU6dZ7bGDAcBUImIAmEUw/zbJ1i/scGNDJiLXmle3RhQ+l/aq57gUQCWzwwBKPeLsZ/LFrGg/ShRXAe64Ajkv30kALAjF8R11Dy3K7KRwJcsUTaqWScARou3w/INVnCH+A36n8RvM3nB5XP4oD6DATBYwGb5ajlOLOh6X8JaBKRG77+7ygGYp1bn+V25/01AzBnwQ1ypanD7KWfA1QDYC3zJIj7KgOUzc9nFbetX/r+O5biwNhyX5uSEDr5o0xsJwLp8/m4A7GaJUv/j3/5+HQFYJ3oFPPkho/hNeqBcMkcB2BAA6XrxmMBkfFAci/m0JpwzXw0TXvXtzrz+PKc/Ml/ugzM9MDqCAbz/keVjjGcQA/YLvjoguo1mRslRI6RwfsiA5nqhL5D6nscF8gfTdfxpS+/hLzvWfzMQCoB1Fq/8b3VWaPIDZqsRV64DALsZHVHs1gEvsqFAeBSApQC8pHK90Oql4UEAyvCwNeGcBXNLOPMLftgZsI75ouUr9ousp2TEyIJ/sU4AzC1e+WIFshyAHPZREVwItrrD3wGAhibTYBhxVpe/xePyrNBuWaoNp3DgFwC81O+RAepK/a5Lfe51jxr7JwA83nPXYgq1asl0yX5N48+f4VEGLATlK1vAo5YB1gBSRmsM+NFE57lcfPD5pPFWCJImtyvGgGfOAacBYO59zFglgHgPefZsXV6/gPXBYeC0RVgyJNOGYuJjPka9eHWgjL9bWzhWk0/n/wPn+k8bgFNmgYcsVflZnBRmIShtJM/m7JGibGBoOIIez9wKPP4AcNpylfbNlGfdI+9NjBjz8JVzppckZuJ+dBw4aQ44drk6j1LIY9JkPD7P4s2lwVEGLHwJnncscNIh4Nh5YMsSsHm5ndOu1BGFThJ8/K6JrZtoslST2+XHA6ftB05ZAE5crgAups5TfaL6EF+UyIif3gAcOwtsXep82eIYY9JkXpMgMp/AeZQBC2b8OduBYw8C2+aALQvARgJwGZhY7swEzbNa88IRvAVO1qkF91J36DNOBE7eD2yfB45fqphLnevzdGeBKBfL8UX5/CZgyyyweRHYsFwxYHzRNK6oetSBMDLjUQAWTPqPngpsnQK2zgKbCMAlYMMSME4ALrcnR6JYQIwsoUnjpDRstOLy7cBJB4CHUGwuAtuW2nUDVH1EFUhycSwWjGD64mZg0xywcaECoI0z5P3X5P6nWlHdgHgUgAUAfOYOYMtBYNMssHEe2LgITBCADkIzSJZXpCOnIg25uPrhgnupO/TyhwLHHwSOmwW2LVSik2pCrDsQskzNIBGIpBdGI+VfNgMb5oENCxX4yPRjPj4xaJ0+WGeEHRXBDUz2Mx4FbDoIbJypADixUAFwzAFI8KUJChMV2SUaAGc1cE/xFJef3FYRti64nkqWDrqqEhbrsm5zvZCdPCd8nHzJOLZuABRz9hTHZwPL7LnLnoNMIY2VyaKcjtZLHOAbNgNPngKe4BacfGF1pnydD+hphQ/8XV5UiEueLGnDN1tWXj/3/4cTwAUzwGPcRcFJiDpPt3FLmf5vjwE2HAQ2zPrEzDv7OQg5OSM+ScYQy5Xbo8465u/ZfLTJ7fKHAdumKxVh8wKwealSE6inEoSy2MWCdbUHIghv3AqMzwHji9VLZuDzD8cXxxWZs5c7apmW0fMBnIHKn5X7d6I5npvRz94O7LgXuGIReJSb+Xl1tzqflybwRwqf9i97BQRWomWJQ7oZVFtJoqDX/b/oGODsvcBTATB9gsfGqmzdjtVz+G+PAyamgYmZCoDjFE2anCVg1CeJwOMnTRB/DmUINVkkgia3y08BtkwDW+YqAFJFMD1VAAw6XG61R31O9/fdrcDYPDDmY0zjc1UjivBuAMx1QdMB+WAYXU8dhEU16dOSkppbcHFSrng8MHwnsGMPcN5ypURHp2xMIa7zDz2z8Gn/kVe0YomO0wEwBYKujL7v/zHA6C3AxfOVh58g5AsZxx4fZM7sf3h6BcDxWWeGBZ+cMEFiwGEHHRnDzun7ONHs/djkRgBunql0VDOSHIDU3cxSD4aEajhFXS4H4S1bgVGN0V8we7E0Fh9jVDG6Obr1LJMRwn+kOCaTEYT0dsfqZHXl/p7PrLi9wIY7gO0H2yAgCAWCWCowKrYE8nMLn/a7PQn9X7zIJPPkCcK+758y7x7guNsB6l98gZjLLYet3Ay5n0sv4R+fCYxPA2MOwLEAQLIDPyP8uBg2cRYmzFweAYilKkn+OC8/Fdh0CNhEA4nGA40kd6FES13WLO8v1qHKAfh9B+DoYjU2Ak/js/8NAIwg7OUb7LCC+WAfB4CpBJoIiTRNRmS1l13kqWh3Adv2A8cdqqp1MB+aIOSxWv6pq5D2kkIAvt8rF7BLJksN/jMqfa7v+7/Ak4B3A6ceqpasKMq5akAmlLWY37t8ZW97PDB2qALg2BxgAFwANEGcnI5JcrDZRPlkaXL4u1KJUAfAjbTQ59x6dSvdLPXAgGYshZWR6JIRaXB/NwFI8C1WwLMXzMeSwLfcXuKrA2G+wrLCDcN/IIg4ERRn0qvyySAQX6mG1XuA4fuAbTOVwktRRr2MLCoQyvEZ/UY/WwjAj3jtFJZkU79g1ghkgEBf98+0Umb/3A2M3lkBl/fOcdMok2EjkZyv8773LAfgHDDKjwNwxEUw9yailpwdxBAEYhBbAuGzG3aKkQEJwAkCkOCjlb7Y6SYyf2UwlAS+vKYnAXjfNmDEX7DEfA5CjUcsnzvbu1nDtUMmCDkRZEEyGdlAk6G6lQTSa6m0MP6HuY73AxNTlcJLZ6WOJYC5/CNxLpHMgdKIKNl69Qvu6/75AjHOiTU87gKOOViJb748BKCWrnK/maTA+58AjM0Ao7PA6Lx/xBAupoYDC9okBRAmPdBZ47lNA/DhwMRsxX7mPgl+SrmK5EaRNRslXFQ9CKB9DkADn79cZtkHFkysJ103eBbqlh97DpmTQTYgk9VNxu+xYbXKU3lhFoJPOgdFGY+lPkgQxokkgF9Xgj4AvfoFs84eX4Ke9x9fIC+tRfDxvvniif358sSir2LCj5wNjBKAc8CIi2AxxLCzIAGY9L7AhGIKgpATw4l8wToB0JjPrfTkp+SLQbHrOqm5jNyajS6VCMIpApDAWwQ4LrGgXqzIfnq5cv0vN0ZXHTInME5GBNLb1DGdOYQsI7AfGKFjlgqve8wJwG4T+fuFAFytXzCLb+VgWnH/fIGYfc46Hs7iHC8ZkPcdXx4VfVXJw8+cA4wIgM6AHSLKWZCTESfLfg7WsIyRF3ckiRQ+HACXkwHptyP4KHrpJvKVGnOhRF9eBF9wE0mUEogz2wC+WGI/vVxiQQIxAs9+rmHA6E1YFYB8DJwQMZl0OrLZ++i7sfT8zroYHLS9df4RACWKxSZvLXzG/fQLZqk2gqn2/vUCUQ9UZaM9wDaPeSPrC4A5C1KV+NITKwCS/SiCR/jRBDlLmP7nHynsxno1IPwJSyRpbiMADXzuPDYfZfBTEoAmcuVQdiaW0zwXwQsCYDYmMaDA1wG8TBSvaoR0G77EcGSET6hjOvVApfRPAUN0zjr45JzVcSqiTxD+VeGzXku/4Nr7JwDJOkxFIwt6j6+RqUrlkO4bXzp1gCAAv04AzgLDDsBhKugLFUvQUhTwCEKbnKCw14HwJ9cDgGQ9WegRgDI8XEcVEDvAl7lVlglAgi+I4CR+Zf1mLGgMmDFhBGFfDCicRJFERviSABjLS7FC0MFKMU+07wOPE0kGvaoQgGvtF9z1/iODkwn3VWoEXxres5ib9xx1wZufBAwLgAQexbAD0JiQwJOuJBA68/H3Zhk6+3CifqqwWNMKN8wjKgbk6gWJgC+FMaBb5vJVmsUbV2vCqo3cRWZcCIACoax53+ulkqNd7iqOcU1WcC9cxEm5kQBUdZ+sTnSL/jEtTWngi21jhJNJBivZBukXvOL+yYBkcOqxKjJ4AGgxzMrBVwdAMmHrZOAYF2l6y/mwV6xD17zmWo6MbRyeWtOHwxJ91IIhr6rqZS70DPPLXDVUrfBwzHKr1EUp6/h0T/6L/GcCqslt4IhoTcwdAqDSs7I60WQH6R329pHuFyuXDJmEjuOSbdB+wSvuP5bGUjmsA5XoUvcvBXKKAQnApUdXwah0b8jXR2YzJTsC0ZHB33FL+2yiX3h/1YeD1fFZGT81g/H6yqkVa9YEpqMhTADle8erHA6t7Mh6j4ZBXdBGjFyO4CSIm9wGBiBvgqxwIAJQlXIyEJLyI/i0SkAG/FbhaEr6BXfcv+5dLKhCg4z1C1HEBJ8+BODQGZXfk/quAZC6ketAZEQCTWAU8PIJt0fgwHzZvVWNaKqi7JLOmtDWFy42g1FxH/XfqGkII0C+a0tnDkfsGxQjn3VPsk7tXmuy+Xp0JhtoJosAaFcUAJUYKiYJxcqHqKAH9rPlG2cMrmCUbMX9guMLpGTcCMKDlZGhMK8IPnPIn1X5PA2AwegwEEYmDGBMjOI5whGQP3NPBT7VJlRNaKvF4t2IWHbDErtDlSk1p4lJ7/zd246tglGZryIfrFhQ7pU8WCAX0ZENG+57U14Z4YrCeLrSxXdev6TfLwrbxT7znMrfKQXfHLQCnyvmRIv0Q3430ezMmL98P393G3wqz6am1NYzzoGn+svqRmTAU2citctqAX/2EI8F9ACEmLHXLZGoFxtSl2xyK2bAYwrj6Xr12+1noL/jUTCD9vvFrn6u0v1/nvGkaoVBAQi0eummMAuXQHMWJAA7gCixG8U0gFfcXdlBKk4Z6zELgAJfZEKrxpC1xOIl/+Sk7jkcdYlSco90y9+gK6vJrRiADD0piad7RuFo3udNCgft94vCdrGXn+tujgV3QAcHLcFnroelivHkchEL8ue0uQ74S3eubAITS3IQhKkMRjBMokgWG3L//2z3VSnP4VDgQWxUEEUxAZFHL0eR3HDfm3IRbDHkBfF0zy4EIKNhSvr9goGEBdvTz/MIYQLQdVsTwRTFDj5jQmdArRDYJQNDSs961R3tPhx5NXoVgoxleHnarjohgLec3D2HI492yQNvIwvqO9fJm9zKGbAwnu6FhaP5pFuMg/b7tTbpBdvTz68cz/zI8azVj8iAHTqgmFHXDUB89R2dtaC7tUGw4kDOgFb0R2wYRDGZ8g9O8aU4XwPOczhiwGlMjqqLWiFYGu570wADFsbTvaxg8nkow7E8nM/atfKzln6/1mS4YHv6BQ4+Z0BbqHcd0NwwYbVD3+1yWhXJxPBrbq8AqE/XApSqAxiBV2MZ/54DMOZwKE00rnDUWcR5KiV/brjtSAMALIyn+/mCyeehjIYp6fdrvVELth8RAClyHXxmhPi6r1m8FM0ucgk8+y4RHC1kAK/5XgW+2hZYofafWcPq1B5AqDqEYsQ3nepR2gqhV2yiol1COkD0C+aOaoGx4aL7DQCwMJ7uVwomn4fm7VrX2u/XAlELth+5sHPtN+l/Ap6sX2dCsZ/phZkIJgv9l++1wbcq+2WFv2NXIjNKAPzuw7MUAV8DTuynFIEsQy83RgTAhiv+NgBABaQOGE/3mwWTLwAqHnaQfr9GnwUbARgDNBUlkpzQboyYCyYDYdILdf0l4NduW9kGoa4geNdazLElKoA3Prx7DofiETtC6XvE7hGEzJlpcis3Qgrj6d5UOJoYDcMglrX2+y0NPtl5UZUjkfx/Hqbecoe0OZzdF1gHQrln9Bhee4s3f3Zxm4MvAk9VSFdUIw0i+Q2PaBtISiBSSFgCYMjMW00MP7pwvvLDmwFgQTzdHxcOSGvBg/b7ZRZByWYAlOERluKM3Ra9CKWc0q73dTBhMFT4ZwIw9l5Lrpes+HjeBiGCUOKXeuBvPcKTiEIOR0f+RhDBMYi0Lhea4GTaa5NbOQAVDzhgPB1La5RssV3rIP1+7yy5OAADoAchEHBkFbKfGRpiweAPtMs5IFNokyOGk/7rAYC9OhBFwNXVY1at5tftCBHaWVS2AJdEcEinrDNC+Lumiyc1B8AB4+muLARAXTDCWvr93lR4/Z0Xt6ODFQkj8WtumEwHTKDLQejAfN3uds/dfjoQdatGLxb8jQBAYz6/boxiFgAVudzNIc2/s3xLk1szAORoB4yn+2DhaATAGJCtbpkCYq9+v4V+aBgAQ4i66XtaC85YkDog/zdZvzUgfN1N7a633Xqv6fe9msDIHfNaB6Ay2JRE1AHAEDIfI5nzZCLeN4Nbm9yaA+CA8XSsul6yqV0rJ2WQfr+splCyCYBR/HJyKX4phs0PKBZ0lqOYTpvniAiUAmAd+HKjo1cvDjHgr+3wPJQsVCymUZrPMuRsRBDG4AQCsunyJtFGHwAAIABJREFUcc0BUJlxQoH62q8ST8cggpKNAFRGwCD9fkuvbwAkyGgJE3C+Nz1P1q9/T3F1EZBxvZh50s6AEYC5yyUHXt5/Q8zI5/KrAmAIkkipkyGPYwXz1aRT8v5ZO6jJrRyAvKOvNXlLazsXs9bo/ztc29Pohgotp5J49Rcj/pzfIwGS//3OM4CNd1dpntQpFUmjEH4LYIgnyn/OLjL8FeDGhwJbNgFjI8DIEDA8BAy1PFK7FSKf43cNKrvHx+8C/vmxwMgmYHgEaA35J0StpvvzL/nP8RbLAfhyT207TChgDRiu/ZL9DsfWNABvYzbhCDBKoBAk/pEobGWTqp819hzQ1/0k0PoaMDEJbJjxVZFgDad0SaUO5LksWVj+XScDmw5UEUDJ6U4d0nVbC91S3ovfVHp5al64cgC+k7mZAP768KCA0WD3A/ieLz090CDceVmlAuhBljLgrfcAw6PAyDAwPFwBkCAbItM4a/FiNtERjBl76W9ffD2AbwJDdwFj+6syImRXrd5Y2FjIYcnzWPLEqnsfC0zsr6qBMQmfIDR/pyJ6xMhKyMrSDiKD2xja6TADTt0/AGAs1KcAUCFrOLF6tbtiRVFavT/wuMCa7MfVTlH098YBeBcwNAIMEYAUlS4uBULOmK3LCnwOPANlEIOSoF9+C4DvVoWXhvdWZVOYqWgi3vOXDUQhgieB0EElViMYJ08HxqeqnG8D4IIDkAzo51DKQQJvBKUmKACzbM4+5hUivwrgiwC4LzvjmgCh6nBcgiMTcv9Abo0D8E6g5eCjfpUA6AxoQIzgi8ALmWwC4z//DxcPPwBak8DQFDB8yJPpPZHeGCyC0KN5DFCByfh9/+OAsekKgEzCTwD047X0SCPM1IYQjCv2E/MJoGVwUUQoPboq0MdqkWVn7RtDDMahB4g+P6qhXFpjVtkDtRGA2nKjos7IyOyHFUbIrXe0FXsTuzIYfNb4O2M3ATGIYQOmPn6hG6gi3eUkQQAeAIYOAUOzALMVh2pAlESqGFBAXAYOMQVjxll03iO/yYKRAT0FQXkwZkjp1pz51LO2XAT3KtD3AIAwj4Wg05kfiuUHYlsXAJLVnP0INLM0OYFx78AzcRySeTsw2AJueI+Dj2Fne4EWKz5MA0MzDkCCkAByUWqsJzarEanzj2zXwjEGFHuGY+pYsMojzZL1G9EBexXou339IRBrC3lJGmNDuSHX+w7WC4Cm6wWxm8DngLTImgC8pBcGBuTXf/1fXnyTugnFwxTQOgi0CECyIFlsvvJfEnh0mhsYI/s5uxFYi1xZof7oOqSAawwYjRGBzYGXbtWXaCIrlvHUagX6SP/ruMVYCEbEqECXAMjfree2HgA0ESur1/0vtnNwGSsG0RsZME20/+/XWH6Mugk/yngPAGy5GDYALjiIHIgRUIrsZjM7Ax+BSx1S4pfffQVIep8dL7dMDsTGjJB+CvQxTHmdtrw4l0CovFruC2NOe975egDQsCXRK/eK634JhBK90q2C7I1i+Gt0jxF40k1cPJAB7UP2m3MGJAAFQrGei9iUTH9yBUDTHfU3B5+BOIKQ43BWtNtPcWIOzEZE8FoK9K0DCGNxLi3FqaKA9gTgeoFwPQAoI0OulWT11oEwiFz7cwbErzNxWtEYBB+VY76Vh4DWrH8IOoGQ7Ocg1CqMRLPltmxvs1/SHaP4dcAJePYyyUCRIzrTB8tE8FoL9DUMwl61kQQ87Rmy2PS2rgB0a1ci18RudEJH57OsY02y/+83/sZdBKr4FXQTApBvprGgQCg9UEAM+h9F6ugJDkC3gJPBEvRGrYoYCBX9IxEcS5K4i6cZAHIw8oXQ4mLBb35YH5d7OekadtTV1UZSjaEIPH4nQzYNwgjAHNwDuWGYpZc7lzPfX1cQur5oBorfzDf+zi0yVTuSkuxBI2Q+PhQDIUEnMLo1TBCZLufGw/ixbQa0KB8CTODjPohdY78IQmfDjmW7Yo/doAX6GqIiAtDHaYswSmeMubV81kp11L6hy2PdAcgblfslOKC1IiKRmyRxZgV/8++DS8BFrxXi5Hd/U6MeSKdqEsEKhpBRsgRMbAtuG4KU/+9ry5brzP/lPVMv1EPOQegharrVcgZUhVHFxNPcp9VFtlOWkL437C0WABWypFRGsV0sb5Hn2zYBwvUGoKl10v1knDgo0y7XA8Pfv0UACnjaK33Co9gJQAOe64FkNvtZAHQdjz9v2Nz2GSa3jYej2W3KGuZ9ixGdIVSoKT13B2s5AHkGheST6qn0erHv5AIgAAU+LVfw/wq3CEAV7clBKDDGZG9/5oVXx/oyYARczcqH5GyH8eFplTawFvAtrtXLGpNrQDGbejupB3omlIHQGc/ErzOcGSRs8zrhAbbuL1Tco/JfbLlNwHOmi2kIcs3owbdwNpYtynDQhsFcgvuG9/YapGFvYX22zZcAU0/GwA2LJ/4AmGF9mwEbBu98Y3cMF+uAGQCj2HVp3BbPuo3IlqxAy5wHAq4OfARmEBXGfNIBa0BIsG0ecwC67merHgRpZLwocrWaovuTxew/V0txJQ2DWeae3WAGbdhb2DB4+wRw7w5g8Qpv88liyGtoWHzMi4C9fAEHbBi8kwUKu2xNAdBxaGBLbJdZux1LwAGECYAEm6wyfpelJrEgFnRDxESwgyUxIUsVMwjVy5AYO0bG89Auu1/5BF38KqjBHlUAYXsteNCGwTeWNuwtk4JMkrlzGNizA1hm69g1Nix+zDOBW0aBeRZZGqBh8M4emfWNADDT+zqMjQyESdQFHfDbZECCLRgdHeCTe8CBaKJY1rDnBRCIAuGW4TYAZeFG8ZuMkGiQ1IEwGCJtHZBmy1obBsvVMnDD3jIAerti3LEBOMjGcOpa3WfD4ic9t6oveDtLfw7QMHjnH6wPAybW6yaG4+8D4HIQfvtDIVtLejpBFsVvUI7NIBHw3DUjRzL3rDVtsYPOkAScuX3coNDynT2VYJCkn+PjqvUD8hVbS8NgjphGxcANe8sAGNoVY/824BCBtIaGxRe8pLKZdpMkTvXiJ2toGHzSNHDPScAyq3er4qPyGaNc7JCRXWLT2TjwGmCOeQashq6+qSpZmp8vojQpheF58ncdZVjLnjWPHr4VWKTKxrHGUqq97qXu3jp0wPy+eEC/DYNZsZAO6IEb9pY9lNCuGPcNV830ZmkM9dmw+OKfbdcXvJMPdY0Ng0/7GnDXKcDMccBS7MwdKz8KCAKQIgY0MWGCtr4TOHAasMwOkTqf6unyuLykfd254nkb7qsw/iVg7jhgmSX31Vpd9yRHeLx+zRhjEGRbB6wDYT8NdymyubzDzCCGfpMJWfSRYfr9HP/aMgBm7YoxNQHMbQHm+ID6aFh8yS93tAvGQb7da2gYfPoXgbtPAqaPA+a3AEubgGU1RM6B060fgkRoCzj+TcD+04CFE4BldZdRc4/YxlxgjJMewSiwN1zWfsOngdljq3EmY08vm5i/7j5yIMqpvupKyGoNg9lngYosl9wY/0dZdrMzYl8Ne8sAWNOu2MA3zw/F2CoNiy99XbvftrcLriz6PhsGn3U9cM9xMODObQYWCMANwPJ49UliuW6SaqqBn/gGYP8pwPyJwNIxwDK76ahDeN6uXYCuYyABkEza4LbpY5WEWdSLxjF26/dQB0SJ6r4ByAN6NQxmkWcqrnQ00x1DEDJFjR8CcNWGvWVPp6ZdMQ6OVOCb3wAscPJ6NCy+7PerkP5Q3tBY1PrT9tEw+JwbgPu2AlNbgVkCcCOwtAFYcgAuiwWlM/XqDjMEbP9t4MB2YO54YJFMo/5gHIcALV1TRZ17FXOhPtvgtvkqf9H4kvHDlyKK4l6VzvVSBF22uwjOb7pbw+CfcwBSkyeFEHAUx/yw9JTyEbo27C17Ol3aFWNuAlgIn9QxO2tYfNlbK6MvaxeMRYquvL9rTcPgJ30TuH8LcHAzMOugX3QALo21WXBZLEHwRF1OgHS2eOgbgIPHA7PHAezNu7QFWFZ7JnXJ5rnqxHEulvlzwyVNN3+wern5Yovl7SXLGwvn4riLWO4fgMRJXcPd/+pmOymELEhRzBxJAo9gVL4kwVnbsLccgHEpWi3epocCAMeBRU5eTcPiy/6qtl0wpvhA+2gYfO7NwOQm4OBGYGaDs+5ExYDGgqP+ccAkINaVpB8GTv4d4OBxwNw2YGFrxYCmV0YxLNYheCXau7EhV3ga3Lb8g4+R45uoGLADgHWqhsBXA8K1AZADyRvuvtkBSArh+i9DsQhCOtf0UUgW/7aiYW/Z0+nRrhizoxXwFhyAi5y4rGHxU66qAFhT3rDSIVdpGHzencDejcDBDcDsBDBP1uX1CMJRwFiQIBzxieL3KIY1YW5MPOxNwLRb8gs0aghAss1GZ1O+SFHsdRPt0i/PLHu++dFb/x4mXfhcbWxhfCtYMFr/uWvKxfDaAcg7ipPCvFOVpuo3HrCjYW/ZA+rRrti6TS6MVQ+L4NPH2nx698GnXF0BsKa8Iab4dFZpGHz+JLBvApieqAA4J8CPOQuOBBAOV0CUYbIskRkAecrvAdNbXc/aDCxSpyT4CEIyTgRgneiLIp3nP6fs+a4A4N8B8/48CUC+ZGJA29fpuLmxJW+5h5kNFg2jiWHSi0r0Uv4pCoZsxw8DUfnhd4Vk0XGdGvaWPaBV2hVjdjgA0BlpkQ/K9bmn/HOVqtClvKEBqlfD4AtmgP3jDsBxB6DA7tdbcvYzJvQJkii2n4NOeMpbgJktbYPGACiF3wFoEx1ZMNe/4jnPLXu+KwD4t/5SO/iMBcXuesHylyACMBPDgzGg7opM8mEHIGdwrfGA1rC37AH10a64Yr4APvvOSdwEPOVbKxu+K2pdKRTmdI3dqkPPVgbSTBGAY8AsATjWniBdx0QxJylOFCcr6HBiw1P/CDgU3EgEIMW52M8YkLolQRddIN1AyKWiBretf9MJQN6HsaCPxe4rvgDdHOcOxDIAcmDFDXvLnk4f7Yqt63gEIB/Yoj+4p9xaAbBHeUPM8qF2aRh84QQwNQYcGgdmx4C50WqCFngNsgSvQ+Dxu4MuiawhwIAXVk1O+e/A7CZgThY1dcno1nHL2oDIyZULpBsAFTBZ9pjT0QQgn2V6ufRicS8QRgbs5ZYpEsENDejBfpoLrwAOjgIzZMBRZ0AHoUC+SOA56xJwNlEyTFw5FxBPeWvlzpnbANCdQ1eSGTRybMuydgMggVBsKmtYoC6Mt8znZxsZMLzAxoAOvsh+ydDqtXx4FIDl8L/omQ7A0QqA82S/ERdTI22mNfaTuBIIxR4BhKe+y61punQC+MytI/Zz/c9EuvyBeetLAfGZ5WOMZ9j2/gqABB1fMLsHAVBqhfTcyH5d9MByEdzs+B50Z7voGZX+NzNSsd8cwUcG5ASRKYbdHRNYwhhDIHRgGmO0gFP+HJh15jOXjnyKblVT5Cbfoq+yJOszF8P8+VnNPlICkMAzds/YLxlYznrJwIpO6egTPMqA5ZNDAB6iCCYAyYBcBqTRQ0e4630SxZyQJQIvMJ8mSeLrYe+p/GzGfnTpEIBy6US/out+K1wg+brs88rHmDOgAVCMnrEfxxMte1Mt6j7u9zzKgIXzczEBOJIB0BnCJoqgIfDEhM58SWzJEPGJe9hfVH42un/Mfxl9bgSiBySIBWnAJBDGEDAB8QWFA8wO3/a+wH4+rg4RLPYLul8tCI8CsJmJMQAOuwFC9qMI9g9Z0CxhZz65K0wfFBPqu7PEyVdWAOTHVlTcpxhXHZLz1w0ZA6EDLhkCskRf0sw4dRYC0PQ/vVSRAYPo7QCdj7GqVOSMeBSAzUzMxZcDMwLgcKX/zbv45SQlHXDIgagJc+bjZBqAWhUoH/Y+B2D0J7rFa6LYDRmzomsAaOeKqxEvbWacHQB08JkRIteSXiSBLYJOLB+X4xrzAzY7vgfd2S4RAKkDDgPzNEAIxMASSWF38WsgkuXLyXTRSRCe/DduSZMBMwe6ObTd8JBj24Aot07uDObPP9XsIzUGFPs5+JJ/M6oT4buxHv9X7BeY8KgOWDg/Z58GTC9Xq5FxTXOw9c3Cm6k5fPcjgbHbgAlvVG2tH1T3Oavoq6BlniZ+12n5u/2sDbOvasqoFg8x2Lnbcd1GdhSAhXN+7qMrAC4sA8sORJ6yHwD28z+Ft4fdv8UyqUDrDmCEBcpZ39kLS6aq9l4D2rLb/KYsFTPWdfbvh86vQu2s1K/K+zIjTsXIVQ9a59Egs4Y6sZfIA/EcSp/jEXv8BWcAhxaA+SVgSQAkGAMICcwVlNLlqTc9Gbv/HAA7MrL4+f1VlXwrUq7SvCoyGcrrWpGhuur2fNGYwM8YT67hT3s1LaZvqn5MLM0bzmHMmIFSgdFNj/mIBct63NhFZwEzDsBFgpDPeanNgATfCtGsX9TIKwNrg9tuVkhlng7TI/YArX1VkXKrEe1l2SynN1RCsFJsqnQv3UIMxhwIRjU5AGN9QUteVz3BUAvahuNgjC3HxLAND7nBp/cgONXF5wCz8xUDGgCjKPbvevlzcKUHH2ag6cnYzepYBB9Zi2FxDJdjoXJv1WDFiLJ6MKqKZUzoQFTfj2HmwTKcTpVWvcxHKm6kKgoORAEvVclPD6NdzLXpMT8IYNPcLV7yJGB2AVhYrAC4SNA5AxKM9ryDPE5fs6eeVKWGZ2M3S3MQfEyJUKV8L1ZpJXpVJ9pLilmlAxWkVJHKwIhjjD9TtVXVm1HdOy/pJiaMFRWM+bo0rWl4yM1N7oPhTJecC8wRgAttBjQWdBBGESwgSiV0Pb9DRgu0TY19N+M1mRKh8niqFx3rRDsLqjgl9yaGXT80vcL1wnE252PAZCzAHQCoiqoW3yYWFIt664fUpKaREr1NPakH6XkuOQ+YDwy4FMSwgU8GSRSz0UJx3Vx/5vFNbrs/EiLRY+v4ACITww6iJEodQKwBIyBRv9vwhKzUW6z66TUGEwhDS3ezqusAyNxnJn8xa1KRPSFts9YfFB/QDZcAm78CnDBT5U8rCqjfc3yh8Gn/hGd/MsKf1+QzYJ4891Jye13iy1cAE9cDJ+6FpYrEkidxDN3OtXR+FwBGMezoMmxJLOumAuD4J4rxJrfdH/XCoLGFVKiUbw+LAPQqWWaMMLrd6/+JycSIm85w9lOpt1j1MwAwFTiqAWEUxeYH5ENn/jInUVHeMXQ/f/jRePvCa4DhTwLHfBc4frGqqaNJzLPw6iZxV+HTplFGvZrXZT45N39+HW3TujlZv8D6fp8HRq8Dts9XIOR5YtakgBgdrrrt5Qsq8Ssd0BhQ4HMwmVitAWHAY/LbLDQNQDaTVJ8Q6W4qVB51OOqDZDPVB3TLOBepW5jmqaLbec3jGgBGMSxvvemDYkQ9GoKF1ShUCSKCqBeQrvmfVZPC1keBjXcCmw911tTJ8q5XgOLaQgA+x/OdWA2EGZ98gbjleTHdQHQN+2iwls3nK3/Zhj3VeQhovYzdxmArSwQgDRA3QiSCJUrTnjfl4KozRCSCCeYmt90EoJJbVCk/1+FiCwFZxLk4dRfLFia6x8LbYkD9v9cXtLG6+O4AYQRfrgPygVIcqyhTXcWFOJH8fh3rz7EKwnUArq8mcGwK2MCC1i7WY7Zenh56feHT/jE3yliE4TZncd636gPFCKWavGhcRx2J+cvs9MlSw0Ty3cCm+c7n0G0MExdW4BMIbTXE9UCynvyCCX+Ovm4gbByA/xisVgJPpXrzLj4EoRJjJIZrWHArS9iprK+KcefgiyB0XVKGjOmCmW9xhRVMUSyRFnNeFGEdI2q+/HFXclkp9WsAbgTG9wGj08CI64WxRk/OTDcUAvBHXSLQxcVCDMQSWbzv+1e7WVbz+k5w2tJtsbcCYV6WJY7hmAsDA7r1Sz3OgOgoM+KTOJbcjSI5yGIaNE1uuwlAAU/MF+tF5/0sIghVLdVdM2S0bSzHx2Mi+FTxXf8X925NC4BycK8QwfmgVX1LlcFiykEMcL2BndJJ7aQfijKfxLGDwAhByM7aC5U4qwPzNwufNnNuOH4VZaCPlPo2AahqFqoPVFc14ga2m+WEEL0cAz9kdPrOmMu8r1o/rTsXz7f9oswFs+jO6LAqkvC3Ggg5Fg6mwW03CUI6X12h8lyfcz3QHqr3DIl64DbqaQKc9mI87QXACD6vpJqY0EVxz2CEyCI5eMSGX2e7VtI5J4yTRyZhscrvt1nQuivOAaNLlYESwcySgiVbr37Bfd0/u31yEgg2FVaiPCeVOguqAfGov0iR0R9JABJ0bnwk9nMxw+fOh55EbgRhzozrBUA1polN9CLwok5HEEUQBjFMQB7D+j656PW+IrJ8O/bBCo4sGFdGejqiyYCx3mKe9/JtTiBvmI5OFiTisg9LtJFF7gZGDrUbHKs79+hyu5hSaUvh1foFr3r/6vZJCiXgCDwVVFJ7MVmRLsrGltuFCc68yFdACMDAflwR4QM3HPoKgIExt4gz42SuaQb8hBOE2oZmlu+KFlKR3QSssMJxDPWbbjpfLoJrxG8CYT8MKGZSVTCxYFTIb84nkCxCIPLDiby30gXFghaF4c2ReR466Uu2fvoFr3r/fKAEFxvpqMcd9yonIrkuK5LLV7MVCM+/uDJCyIC2J8a0z1iwqyESgMl15Sa33QKgmtPEBnp11mwuXgO70Ud4DHWzfgDYC3zBEOk7HlA6XKyHQzb8HgGoCSQLqsxorIy1Bxie7Wx0rFaf+wr9Xv32C+56/7HbJ5VHtRYT+GJrsehHcya57PyKAQk6+vBkBZPpjPEExlwU59awg3C24W6KBsC6tqHR+MidyVG3i3rdAnAsH2T093XT+zLr197MTA80h3SfsZP2UqpCrPQ46oF317VrpeiKXTJ9MhMLkgGdCacKG/mupV9w1/vnwyGgCDCKWzJe3lqsyzLWZWe6/kc/oKzgKH4jC7oolhdC4jiuzM0WPo+cPQ2AsX1obFCTO5Jzn566PwbReiwnfTWjI4KvDoh1juh+aT+WKSYD3i8Aql2rJk+VsVQly5kkddv2FvHT61icqO7Fr71/IkLNXOi0FQjV0046oBy6wZ922Q95ICqDEaL4XWw3COcf9Mw73DFB9AqE6wZAAS8XuzGQIDKf+oVkqxt00ttAc+YT0PJ9qRFSB8xoye5Xu1ZVeCSgCLbYLVNswoncHxoeLwCzBGjBNki/4BX3z9lXgUCyIIGmhova83cRgO5Te9yLgP3MfmsBS8xs8/U67ePQOqy9umBUruDchqo8sHSd3PMfT5ifo+ack8eFHI6QEcnT5GvdOnVdXof+ptJ+BVPWceiaRHA8Us/nkACo8mzqlqmWrbFDppT5A5UIZm7CPA2Vgm3QfsEd909kKIqB1qJAKCBG8ZstZz3xHOAAiwmpDIdng1maZQAkZzsHZ537YfQrwNyxoQ+HakrnS0h1mUA1C96TdJTmORyhC3oeqdwROi+GDhkFI6bYNrcNDEDeAkXwQizPRpmnIs3OdqZPSaRFUcbchHlgie6agq2kX7Dd/+d8lUJVXuUzk8ERmS+2vfd4uvN2VOV5rSwb0y3JhgIh9wJeN3YMQCIgR78Q+nDEVYBYZUrUpbXFnM7COSdf7N4IPvtDnT2BY/h8Chh10MXQeYGS+7GGjaQiABpuNIFiECnzdWJMIUHcazLptC7YivsF8/7FgLFMqpiQL5TuNbKfA/DC46rqqAbAwIKWK+timRUBEiNGsOQsyQm+Gpjd4n046hbT84KPuYjOmHHyp92gcgDS2OoIuVIeh/xyUkaVwyEWdLrewHE3uBUDcKIwnq40HpDXL+n3CzbaKdguel5VnFJl2awaghLQBTzteZ0cjLq2A2n0M6EPh2pC57Wg41poLzZsAZNso0Hw6eVR/J8bF9YjWGmVCpGKwQLBRCcrbiSxNLgVAxCF8XSl8YDHHFPW7xeFBRwv/rGqOKUBkODzqgdWPYAM53vTASMQu4Bx9J+69OHIF+N71F1O1gUB+AsBfFqKC+4Wi4BWX+CYgOTAU36wdMVNVKka3MoBWBhPxyiuko3xkSX9fvGMkqsDlzzHC1N6SQ4DoINOe7KelWWTheziObeKCdARApD1AdVnRH048gKUAmAEYi6Oh4DJV4VoGDWqjq4XLbO5o1jBoimEPhPJmwu9FvnTLgdgYTwd2wyXbMyRKen3i2eXXB245FlVYUpVxUpGiLtmGBlrTEhVUwV8dEkVKAq3MHJ1uzRbRx+OOgDWFX6MsXJU/36lJoEoA2AKvw8+uwTEDIBbStdOs8ddDsDCeDom7ZdszBIs6fcL9ror2C75US9IxJJsEsHdGFBil4yYuUwknofJgF4XcEUfjrz+X7fKo4EJJ//PkMORO6FrVjQMeL5kJhZMMXzLwNZCt1nzDFgYT8cQwpLt4hDON0i/X7ys5OrAJVe0S/ISgFY7j9ZvnQ7I3+lyqpYaL98CWp/N+nDkZdhi6bW8An1kP3fRTLKVWlwF6RZCH2L4zDDR0k1IqeTNb2OQSYNbOQMWxtMxeqtkY6I+ny9VEz6btfb7xc+XXB249AoXv85+tIBVgJJ6n4lf6oV+mfjdDJNMH0wAVFX90GMk1f5TxlS3Fggh92DyN0IORy5665KIfCktsl+K3VsGtpVOWOMiuDCerlSnjQ2rB+n3C+pIBdulz8wqonrNPLKgwKaC5B3s53qhXVq6oDNg6sOhqvqhEr3V2VNLBjmnSSNdrOLJ1zkAu6VPRjFcFz4fXDJ8i45hG94Gt3IGjOFYA8TTlQZ/qGH1oP1+8ZtlT1MAtHK8mQg25zOZUSCLIliWcbw8wfW5Ln04ssqnHX04euiCk6/3de66MPpuAQVZAEFkw2MKFw6a1wEL4+lSBvmAOMhD8vkOkFX77feLNw14YT/ssmc4A6oOdHBEkwXlgjH2k4Nal6wB4fIuX9LzZjAmorNeHMo5Tc0OewHwDTUh9HXxfGJsYkAbAAAgAElEQVS/uvCpoAcew6zBBrdyBlQwwoDxdLZWXLDFkHyF8xGE/fb7xR8XXByAAVC1oB18HQYIT+8uGfP75SCUs1o64he8v4j6cIQ+IqkPhxrBCHjdjBH6AblQkAeY1ondukSiELmsUPpjbyp7XuvDgAXxdNZVvWCLIfmKg6Bbhrjup98v3lVwcQLw8gqA5v9zC9jErutltg8gMxDWWMBaMVkmANWFyEV6R0uH2I1IzW7ypbkQOTP5f2ch9KsFkwp0kQlDAOmxzHpscGuGAQvi6VD4RgmAg/b7xZVlT5MATNXwqQc6KGwf2U2uGV2uzg3D4ua7fDnPwZcKgIdq9GaIBPZb0YdD7hgyIFWMXiH0eQ5vXS5HcMkc++9lz2t9GLAgns7KxxZsCkgdtN8vWD+vYDMAUpcja7lOR9eLVcIP4tcuob/3AOHCdW02VTX62ApB4Mv1v24gnPy9HiH03fJ366KYHYTHsgBBg1s5AxbG0+HLZaOp65i+ln6/YM5EwdYBwGj1cmUkE7+8THLNdAHhwrUOXtcrO/pwhF4cct2oN68BMDCfmsJM/n6PEPoYPp8bH3kCkbtjji2tJJA962YAWBBPZ0WBCrbYsFoOf9pDAiENk179fkuvf9nTXewKcBSjsn7ldonWbgQpx+26otaLIwAlfi2QQSJY3Yjy5i9dmsFM/oEDMM/Z7Uf0RiYUA7J+ToNbOQC3e0WBBm9qLad6HICG1ZK1XB5PoxnuOOIcxSXe/Of8xHV/P+FpwN47gKUpYHmuSve0pKZgCKSq5wqniWE1WZz/xouBm74KTMwBI17lVBXwtWSs+8/vL45Ff3vhpcAnvwos8d48DZX3M2hx9XIAnu0IIO0chu35AOgLL0yuG/jOmwbg028G/mNz1YWdETbm4I5BrFlov+EtD2wIo7l+Atg8D2xY7iw3V5diEqO54mnj6XdMAYcU+6gon7A3NSO2qFjlyZYDkAX6uD5Iam44YaUfVNDNxaJcLIPXcGGpfi6PnZdVD1wPspQBX/wl4OaNwN6Jqg+xwrxslcVFuYJblehkcYYZGPS3L20BxueBcS8nwg5H5kZkx6TQSbXFZcCQKadx5Cz5mPurAFxrRaa17pAR2PFC+ElSHKQ/0QjQcgCyGyM9v3SnsDBRJgL6msWCf6IfWeUJac8UFlpY8500DcCfvgb43hiwZwyYVhd2D/VSrKGAmIDnBkiafEcN9cprHgKMzgNjS1V7rRjRlceyrqif6KAkMgXIM+6tAnDl+zSL36O9+U8p9jGHQo285/2XA/AnXeNnKAorDXH/AILwbSvLEz6Ql2+cAf/3XcCdw8DkKHBwpOpFbE2wadzIdyh3jjNQirYWEwYq+/zJwMh8pf+xKNSwM6DZMmzNRRbM2K+2Ii6TlFrAWfd5V3i/F7IgT2LBF5LbIdkqxLPWvtzlAGQ3RpU3Y7AiixMxLOUB2t7pKQ8M0qCTnp8HkojJgNqaMEJesQv4AR3Iw8DB4QqAs+6SWRiqgJgY0HVDAdBA4Ba4xN7ndlSFAAjAYX4IPO5dBDMAdS2i+Jx7XTf1eEdTDfgAQnR34p/wQkRmjNAoByDT/ugFphXAmjAEn8qaPQAgZCs0lSckCNmVigEbFMsPBBE3DcBX7gLuawH7hoAD7EM8DMw48AhATrjtQwiXoqkTEwWd7LOneXNCbz6Tiq/TInb2M8ZzIFrTQbGiy92oGz7pXl/7jvdAJnb2470IbB3T77Sai+hyAP5voTqW6sKwFAc/TAdc5+3dvcsTrvPVYSK4SQb8xV3+6IaAqSHg0FDVh3iOIFTIFxtit9orL5Z/LD1Q4s+B8OnHVuXwhhdd5DoLGsgCCJ04q66X/Ju/vSaeAxDPvbdtmdtKDV90gVEPIl/xySkviOhmAEjrlzSkwj40SlQZYZ39I+8JBMx8mZryhOsKwqYB+KpdVSDFvhYwPVR9BD7uyX4SwRS59nNI+bRck/DzJ05v12M0nY8fAk8iWL5BB5qASPGRCi8EVjzv3mqpkC9ACrrwhKukB67GhpqRRowQMqCiYbj8oOoHeUWpdYIBAUj8c8WjrjyhNIJ1unzjDPjqXdUjJAAP8TMEzLYq9uOHICQALe/EwWe+QgddAqCzzD8+vgIgg0qp+5nYjaDzCgjmnCYone0klqP4JSgvvK+6LoFPoFMlkPGh+0rPWta4RHTNJJQz4M8EAGoNTPVU8opS64CC9zoAWTFChcq7lCdch6s3L4J/2QFIEBKA1P9mHIBmhPh3Ai354RyAAmWsR/PRs6vOR8Z8FMPS97yxtIlYgVB/I7jC0rIKSfLXF1EEB+BFFjQ3jCLA49OWsRTTEPzvzQEwry7VrZ5KwzAQAPssT9jw1dcHgCrORQCS/bgn+1HsCYQSveaHkzvGv1scgU/6R55Y1YIxhvOm1EZekQWl8wVDxJgwc88QiJc6AKX/meHDawX9z16M/Em7bO8Q08GBP/jEkAEVjMBoAFWXUjRA3KtNwOBXW3EkAZhrALktpC6lKtTV4OU7RHB+3kHWgv/zrnYZl2kCkF4uF8MGQGc+MqEYUCA0n1tkwxbw4ScHAHr71Q7W4++c8czwcBAmHVB/c7Bcek9b3FuwbdD/kjGWgzJjQ3thGmVA3jhfOyU+RxB6FamOFp8NrhsTgLy8Cpzm5QlVptAU+6CiNgXCaIQ0BcDYV8b0P4pi30vfIxD5+w72C9aliegW8MHzqrmh/meuFhYi0pKbs6D9fsh/n1XFMrYMbPgUByCZz6J+uEknDA9AornWFRb01WZEsACoHhOqyC7wdetT0QAK2KqOb5MCUvPyhLE0oQxzqaYNXL5xBvyVXe12vByLADjXAvgxBvSPGFGMIjCmJbEW8HfntxtQmxT0cmxp9UPAdKAZ1upA6EB7qgDo6oCUxXRtPVSpAwJpnUhuxAqWCCYK1MBExZljY5S8SYr+pxAFAuBayhNG26jw8usCQLX0SAAkwwcAEngyQizaXoziIli+Oe7/9kJvNk1LmBMe9ECO3XRB7aPeF0EYHNVPdT8gj016YBcWtBfBVYJuz7mF7VgGY/pO8f5WdQ1/7U67nIKNS7j0wIbDPFZsyNHHY7od/xdlEHj8CcC3TgCWHgGAPSxiSdt4312u/8SPAl8/Dlh4pDeZW2PD4J1c9+uyDaIDkgEJQKnTfG/N8nUAmu5HUnMW5ARbPfEuIHy/ACjRK7FL5pOR4RaxgTHofKl8r/S1ZWBnAGDKefbn3AFIPRPXB7sFiVQimKVgGdl5ooNwLQ1/1U+DQGSXQ9r5Evy1q9rZbP1lGQDZsPpzI8APHgXgod7qUx11YtBbFzC+/C+BL7SAWwhgdoLkONSLqy5oLogYft3ZI1F7EAC+phsAnekokhP4HIzml/PvthQWmPB9LJ7jxkcSr14jWj4/0wFlgJD5eoDw6fe4DzAYPHokWhHJZ3TFSkn4h7YOSOBwEtiMTv1aY0uktFYTmI2/43EMQmCuAJmUE0gmVD8EFdPpdnxhVhqzDr8F4NMtYM9Jfg98EVTeNu9Q2OFZBX7vr9vtgm/lcezczZ61ZNN8DCvilYCdPXqNDQpAlfGTKm0M6AA0PTAyoMSx64cRfPQHXsniOTI+fEWDFGp+Qb9BeySRBV2kpl0QxxGAlHDmkI56X6z+EP7UDYSdRgh/IouwIZ36lHabBE0GJ0r10Rgb/xA/tt/j/6aMAf+7R4CxzuBXWRGULwBfIrY6UNfpvLae7n0I+LO/reoLMqiVMbW38oUhkNkQIzZO7tIweGePcmWlAFTjAYHPVGwXxWoLYblEDkLuTT8MDPhXLJ4jALpaJB+ggU6xfgJknT7IKXIQXh4Y0FZCog+wxiUTwSkXUbSMV1rB/A31OXWuFpPUda/mRHKi1e6U+hA7Zq7l+A+UAfDtHg/LrptkQpZ727cRWOL9542Pa3rOvuOqagUltgtmJM08j4/PILbIDKz6w5PAHsbraTnMGdZWIwIzxIfeK0rn578J3LAVuH8CODRahV/FFQ/1IumIvXP1QudNfyNT8oVqcHviPcBd48A0g2RDuoDqHdb2SalZAdG9dnfDkAE0gXnH5ijWCDbKCq5/MRiV0QD8HgHQ63jG0hdsLGxA3x9Bw1Asli7hO3BwApgng/Gjvq01IHrXJ7q3Cz7E++YziF2rs1ZLZ+8H9jJsSoECWXj6igmR87aLgfbGq4GvbgLu2gjsHwdmCEIPSI1h+SkCRjpfUC3iNWcpoRrcnrYbuGsUOMBo7QBCxSTG/igxVcBIVGPWM1h1JYQPnyKNExGZMDIJ9b66eEBGxPDY1Y5nv+GCjfGAxD+DDpiawphABWZPjwNzNLAEIH4XCH0M7/5c93bBfI8Yk2cgVAdvdT10ifDkBWC/r9lGH51NhIsnsWHOfPmEUKT94WeAG8eAO8aAfWPAwVEHISNQlKQUglJjJExqC+H6Nq93kOpUg9szbwLuHa66QzFWkaFieXxi6hgVHOMCYGRuJ+5V4jYJIDKI9KlsAvFDq8QDrnb8NWVPh9EwdFkQ79TlSMIsN0Mi5s9MoOGno4U6f3YAvefL7Y7rvdoFLxOANSA8f7xSgWmd0kCQbmZ6mTLEnJ0UqWLhUkxlrBn6n3wWuGkYuGukCsufGq2iojnRFpafsU7MDxErJuZhYCsJosHtWTcBe1oeq+hxigJgXBrMmTBPnJKLrr+VED54ibHYvZos8sO+DNcrHrDX8YVVyglAKud0LtMjFPtNMz6QLDY7VomLJd671AEH4Xu+3g7nWq28ISvX58/hguOBg8vtFQvV/hEzxfqOevuTfpjri8vAWz8L3NYCfjBc6ZYHmBcitnFd06pxyb8W4gPlgonBqffTtdTg9pybqiVNBssyUsdUD7eGO9amnf3sXtxQipl7Wg/sD4A8AwHIyZMYky50Tp/xgN2OL8y051qw2hXzwRCEdT2nmck1RxHG+w5jeO9NFQBpR6ldMIMXlFWgVndqF2dVFsJzuOgRwMElB6DcI6rznemD0RnbwQiSRS3g7Z+tVIl7PC9kahiYZm6IizuLigliT/VoUog+p8P9l3wJ7qGEanB77k3VczroUToWLCsABud4ypaLCUoxf9i/9w9ADiICULrQRWuIB6w7nuZrwaZwLBGwClSqSyz3AhHbaRGEFGOmC44D72UVgjW2C2Z4lIF4ArjodODQcqUGqAxfcpG4mJVuVqcL5tbs2z/veV0tYK/nhTAqesYNHdO5PCJZos+WuzxHJIViuXFyJxupNLg976ZK2lizUKodilGUgzyGhokF8yw5Mf+qRkjdjfuDtwkkm7DTkNaBaQ2ox1q3eMD8+B6O3H6em8Kx1Ccx9ptWl9iYIUAAWrI3I3nHgPdOtsO5eOuxXXBdj0V1vOL/so3Cxef60tlSpYwveKf0pAu6ohfdJ8k4CUqgvr5jV6VGTBKALeCAh+VbZLTnh5gu6D44A6H8cVlkNK95O1WkBrfn31R5HSy+JCwPplAxRegE/2T+AloGncNmbQyogUQx/KwB4gHj8YWNTwRAOW0FIIIndoqNkTAxz/bd09XDGLBdMM6/pLKi5whAX60gCK2ujxzEAqGL2pQ1Jis5AJEAFHvTujYAKjRf+SEugm1d2COQLU/DAwQ44caEw8AtZzSIPgAvuKkdrWMM6M7xCMBoiBn4YpCE2NCfxWAA5MEuwvCCEICwlnhAHV+YORfDsWJGgPpMKwg1b9QpFnzHbD2BK2JGul9s8KkYW17vLALQRTCBpzXZpS4gtCXXMAkduuAy8E7PijPWprXJ5CR38ygw1fJDohh2BlRAgq2OeN7uTWc1D0AFNtmL54ESBsCaJcLkDajxj5ZXRiCIGA0waDwgjy8sk5+HY+X9ppUbJSCp6TnFCMXwny1WAFQ8rUAc2wUrRL6mXTAefWnFfnz3FpbagQKLAqAzoZjAKkkpXkNO5GCEvOMLFXOnnC4xIKOjnQGNdWSM+GqHQGd7JSsxUf+JzQLwhTdV4je1nQvr1MkPGtlf9yP2Dy+gAqZ6rQytfvdHSDxgLwBF8AmAYjHWluEDiKGMiqOVvtejXTBOuRSYJwDJAARgZAGWL9Nk+IM3SzgTydE4eec1nZHbtDaNAf1Dpd/SMx2END6kD0oXtFhBXmcY+OY6AFChnKnzl7NfdMR3qCAae2B+VVMYXASvDs3/X/zHJZcB84vuiqABEo0QPnhnwqQLyRURmZBPytnwHde0M1vN2lR6picoKULaxHDIEdHkW2iWg4/7b5zb7DSQAVd0/griV2JYojfpwRGEYsGBrOBmx/OgP5sAKANkcbFzNWTRnX/GSGImMYH/LYlk+gGvdT+bW+SWH+Ig1GqL5QeTtR2EYj5LVHfjw/ZDwL8yJ6TB7UU3VVoTjTYxYDK+Ivv7dzNAZIxpZSiU8jjKgIWTcykZkBawDBBnQdMr5QeTKI5iWCB09AmEb7+ucnOQ/aTPWn6wuzyS4u+R0Ob6CUGqJpIDA97AdqINbgRgBJ69CG4Jp6q/ckjXqB/RKla4WpkO2ODgHoynigA0JiLwaNiEt95YQKJ4FRC+7brKzRH9jZbN6iJYuSHm9I5iOAOhHNJfZkh+gxsBKPbLu3+JgaWDdojhMO5kkDWSlNTg4B6MpyIAjf3IggJgMD4MCARjFMU9QCgAykhSKnUCYHB9JB0wy5aTRUxmup4h+Q1uAmDs+hpXgFLnB6ULONOn5xACNJqxghsc3IPxVBGAiQG9aLeilWUJW1FvVXEN0TKp1C6At19TMSCBpz1dHtT/JH7N9yaxp6QkF73KBxYIr10nAMproB44qQGTj6sjUrtOFPtLeFQHLES9AdDFrq1E6M13MaxVCTNAXNFThIylLcor40zxtgDAPKuVwDMrOKw+SBTbtR2MND7sZwC7Qvm4wqHa4T/uIrhb+7n0EgbQdTijoyg+agWXT8llDsAFWr/B8qP1K7bT0pvtVwHhW6+t2C/m8svvZlawi2CKe37nhFtapkDnILRqBQA+v04AjMyn79EIkXO/DnzyCBwVweX4wxs9B4rRZgyPVFqykgDd+5JSpBU5r0vHyHz+jsc3ub0KABsZMCyQgeExKyFPVIz3lmcM6OfPAGCADYPE67Jfs6h7G0o+xvi7oyK4cLZfOgpsXwC2Lq9MwuuVERonKn4nSJrcXnQKcM7dwMMXgYcsVxkSebJgzOWPqdB1ad2f3gpsnwK2LXWeR9m3danUIV1lBSCPArBwtp+7DThuBti6UDWDmWA/DvXk8LRptfPtNUlihYZTOPCi04GH3wFsnwGOW6iAs5n3GeJJ+KLoE+9VDClQ8R6vOQHYegDYwuY3S6H/iJ8jb11ck0q9Qhoc9QMWgPBZJwFbpoFN88DGRWBiqQIgWyJY3lPozaGJ1KTEPh36zpTkJrcXPRE44S7g+Cng2DlgyyKwaclfFoIwvCwx9Zn3Q1DmIPx/2/sSaMuusszvjfXq1ZRUElJkKsBEGQyYhJCBSkUqAW1tsBdpuxEVaBzowXZqe1g90G2LotjQdmMjKqtBxQERdAWUAkUlZNBGkQRNyIAEMAkxpFKpqjfUG3t9//m/c/+737njPq9uVeqcte66b7jnnn32/s6///3v//++Tz0dmD0KzC4DM6vAFpd/0L3Gh6yTDgnvLwKzAWDGiH/ThcC2OWDrErB1pRgQisIQhAa+AED+HEEY6uNLyrRnZLSl6tSbrgLOeBQ44yiw8ziwfaV4UGbdegmA5QMTLFlqsfn7XecDW+eAmePAltXiXnkuZSBkRcm4UGXtU2uo3xsAZgz6y54JzMwDWzkgBOAqMMVBCSAUObh8QuN/CiTgcWAuyWhL1amvvBbY+VgxbW477paa7gIBqCnUrbUBiQuhAKDUot13IbBlDtiyBEyvtO5VDxvvVfxW/JkWNFrCeK8NAGsY7BsvKQC4hQCkJNaKy2LRIsg6SJ3IQSe1onKKC2CsOYMeN+0Dtj0ObDsGbFsEZmWp5S74g2Ir2uA22BScAJGA+dJFwPQ8ML0ETAUAkgDTPq9zdK/+sMWpPF19NxYwA4g3PtsHxAE4SQC6FdSgmGWRRIJLZJll8EGKjHiX1jwaN10HzD4BbD0GzC4WrsKMW2pNobZoCu6CLCDfCTqzgg6sr+wFphaAKQfgZHKvpRSYg7HN5XCL2AbAZwPrZGaj6ippXhgn0kqmU1woxnHedg5AATuWHig2FE1uVRwoxoX+Wcbg89S3AqCKPONcCi8oPtVP+9++G3j+oSK2xRBFDElUxbTS+3nvc4FpDsjxllXQoJg8FgdCQoGJJTTicLcQ6vPL6wbg9cDM4cJv27oAzFA5ky9/UOSvmg8oP86n0dICBn25JwjARWDSAUgBHN6vfdbv10AbARh8X91vDM2ss+NvAECKPVLCsHoyUgRqrlbnRwB933OBc+4DXrIC0IEmiLnE75di8HsyAcjzWUVGUi6uICMpVwwJVMXdeOk3XAxc+Hng+vV2esAYw+sWoP31r3eLcLwQBeQUrEHh4Jo2h4vDmJPuAyMLGAeEn7uqbgB+I7DlSWBGCwe31Gb9aL20kGDb/EGRxY6WTz8f2wtM8l4pgL1SgM8esHCvsuylME4nn9cfQLtldg6TZ0kUKorAfij23vAPCmqp3fcCl60XFINid1PlZrf41/dnApB6wSQjutUfIDJR8CGIQOwWEH7DywpKrWc8CFzqRLHkVYrB2jS2FQH5vkuBycXCAlIUUAAkCM2iRBA6+ARCe7DjYmQduLYTleiQ/XTTS4DpI+6nLhZW2nzVCEBaMLd+soIGqjD1ampdugiYWCpeBKA9bBJC9ActAk8LES26SqsftInLZ44dQif4Igdhym5WLrPDyuYH/7HTCNwDnPko8LXrBccjQaioe6BiKad3+QY/MGTH6rS3OBvCnQDuAIyqhiDkQ9RX+29yE3on8IwjxQPI8zkTiApGU3oVkD/4fGDieAuAdMw5MFQjEgg1DYsUku+a3uI0TGBfV7PotwHwaOEmbHEATvuDIutni6UAQoFRIFRYhfe/dhEw7tbe9Of0Si1g8HkrwRcevDajz07gIJ7n05rYyWIpb4ya/7vv8PRdFpj/LXDmkQLAnA4jCCOlTBRN/rFMAJKgkkVHpGUjySSBSFeg7/azqk8EgbSEq8UDRACLKDXSyaQ7Br//DcA4LSCtwnKhTEkQcmAIQhtM+Uaajl0uS9NatITXWzpzfcdNB4DpY+6nBgDaCtanYLN6fCj4u1ay0QIqtML/EYC61wSA9tAJeP6eWsAoDysFpg1eB0HIQRCIIkVeCqQf/05P3WCB+UPA+CPAzvmCaFWDKEuYcl1yMN+Y2dckqGTeHPEvvWDSNhOAfbefX0A6rS8CUw8X9066bFIfdqMHJID++DJgLACQumyc3gyAEYRRKFCLD1eu5ODLF6QvXedx0w3A1BwwxdAJLTXjd8seQnGrZ9bPFxLyA7WIKON63tYtCQBN/sv9QPm6BkLp0vl9t/m6ietR6fbyBA4gnXtORwRRpNnTtPpW6gWLH83lKqcOFTEnDiKtoHwy8RNFhrefyeztbnrBfbWfgttsP+kIyO32ELD1cHHvInrlvWs6TsnB7qAUlg/suFtAWkE55zYQ0QpqcALoNCXTEt7A3KoaDwGQfqoAOEUBa7fUbKctltwCajVbxvSiyvoasM0BaBKwwdKb9fN7NfcqBWGiSWykWXER0umeacUEonQgCKRfIgDFjya5yq8Wfsfs8dYgiuMxgpAg/vnMzu6mF0z6Zj5APdvPQec0TEosnvQosGOhaLuIYvnwEYSithE52F1XFAA0p5yigD4otCqygFKnpHUpLYP0OcKURYv6Mj4MNR433QhM0gL6QongawOg+6rl9CswKoSkEIxPyTsuAPigCYBmAXVfYcVf+n0SRYw6dP1YwNgHsgSajiJP429RrpWOM6cxDiJB6NINM4w7LbUGMQUwB/M9mZ3dSy+YVG0EoBiDBST5ddZ+PkCsAiIlQZDa3LVatJ0WXG2PbL98AB+4omB3oP/HgTUhmGgBfRqWf2TTrUSjExDSP/qWzQDgfAFAWyzR8rkFtDAKX75jo6nUguZxZ8NByHbvvqBQ36T1swcsBaBAGGRg40Ir+rt9WUDhQ5ZAU7Es2e9LLzglqHRxNkbeuW+oQRRls5jaMjnK0a9ecNf2R4LAwO829kQB3LTtEYQPUwzQAWgW0AGo8AQH0ljp/V17pm0KRcEifGuNOnocO1rACQbKPXhs8TtNwVr5uh+n6Zf3wDgu29g2FdMtOc8B6PdpFj08ZFrplw+ZA5FTvAQQ0/BT36FPDkRqBT9Jag7xYlQItY0f88j78sZzCcKPZlrAQfSCK9uvB4h577SCotUiEJ8opq8IQFl/PUBPEoBLxbRE62LSqG4dFB8r5bHcOtiOQSqT5T7RKzYDgJx+BUCCTxZQCwhaQc9oKcEnEBKknj5FsJ1LAPo9xoWWPWDy+6IIoqbeaO0VA+zHB0zxIQDKkn1GgtXiRxMIAx0Vn0Db+lkuFjLRCt5WEwD71Qvu2H5OfekD5FaciQay/GIbFgBXriwAyGmJADR1ck3DwTE3TQ4B0LetzBJErTYAr2BBSI3HTS8tLKBZPo/fWQDZp197Z3scjGb5BDp/L3+njMweB6B83Gj9wj3atOsPWin9WgXCFlVO/3ctf4iD8XkBkH5USlAZlNPZAQqARr5vxu1yjmH0givbX0UQKI63o0Wun/xHuR8E4VnPK5JQLd4VNttTBvK2uoiKOUf/f+GjwMNBh0NMV6J0c0NpcRv7mrYv3kh8/uHxYp+bVpwLp3R7sts2YzouSq3KGa+q7+x7Co4nazAerRKsVlV1QitF59dyyFZaYY0HMu9mWL3gtvZXMbymBIFMZ1ov2h0B+LTLisxgW+Eq5uU92iZ72ud9vvR+4JFp4NjkRh2ONi0OB1/UBCkvEYRhfuNs4OmhhiPKnFQlx6aAjMnSXJUAACAASURBVPjmz1w41nnwO4cCIBvBwZgTAOUHRq3gyDExD4zRGVYEnpm5LqmQc0M5esFt7acFl0SlHiBxuTkYxxdaihUC4QVXFu5FCUD5QtJl85sjGA0ziQxqeu/fem+hw0F2fLLQGxFlYMRvo7v1WmIVtpt1DFkXvOR7LwJ2HSkyoZmEypoVVe8p7b6qEMnidGG/Vl/L2aPOIwuA1pAIQE3DAmFa4j9f7CPaFpCHKujr5xzZesGdHqAqKz5X+FLRAl58le+jui+kTBALMcgZ73CDBkpN2/7+bfcWOhwUyCEAjQTcAVhKdjkPc2RajewKyu/n1//qJcA2uhBMRGXQOcn9U6JIOjXHQqSYOsVoQp1HNgAvz8yny80H5PVz9H6RqVd849WtXQ/zA0Ow2ayGLJ474L0G79vvbulwkJi8BGCg4S01SKqofoNvSIC+5zkhFUupV8rUTpJN06KpaBkFQm5M1HlkA3AyM5/u9Zl38zrk6f0iU6/4hmscgK5ISUtCTowyDqb7UxwsqFJW3fo/vbuIBJEZ1YRgyHwQKNi0KEl1OKTCZJdxtPDn//v8ooaDaVgqFyiTD2IKfcjZS4Fo+7g+HXOPv84jG4DIzKfLzQf8KVfI/FNKrQ6h94tfz+vOA9cGAAbrpylY2SDlVTTt+uCnV3/V3a7DQQAysJAwobZJgUXi78Qayhd812WeiOAZzEyUiAkHMeu5BF5FwZQAWLPwknkLQy9CrPMy8+lIHZFzvN3T+YbV+8X7c64OHHix74V6zIxB+RJ0wQ+UU992tYoFy3fcXcTDxQkoPsCUhFIczKVCegSg5B8A/PILN9ZwxBSxtiKiUAOi7JW0dLTustF8AGbm0/1o3vjjnSGdj+lYlGwdRO8XN+c1wABIoHk6k61yuSCJITq3jDY9Vx0BqK++uwAfX6JkI/hME0SC1EGguiQ+isqcQRLrF6/0jO2w+6FMnZhyZYsQ1W50qOHgPX1NXndtODsfgMwHzMin+0+ZN0S9YOllMzWfLwKQSS396P3iY3kNOLDPM1y065H4gOW3p4uTDkB8zWdb7FgbdDhEgJkCUDRvogTmd/vPv3BVAUBuvylNzAAYi4hisVQnEHoIqWblrxqm4Mx8ujfljT+YjsWBYgIOc0oJPsq1slCpH71fKybJOEoAuuVTRSCnYlmU6P/Z4iSJEcbLv+Yu9/1EAh7JKEXDKxq4ChUiKymRbwjgHdcUWTARgLYXHSr2LOU+BV7MVwzxwOfkOWybYAGZD5iRT0edjpxD6VhcOQ6j94tP51wdOHBdMeXa9OqWRcmWXA1XLUIUH6zyCwlAs3z+YBkfs1u+VIejJEF3ckrjI9T0y/aMA2+/tgAg08VURKT8vbKMUgAMIGzzAcOi5HknHQAz8+l+MW/829KxhtH7tTz+jIMAJPCYMULAWd6fvi+EY9ouoZBM/Kx/4LUBgFLgNC5o16FrE8JJVJgkiFhaQQBv3+dVbMrWVsC8UxFRkjjaVsW2DtRdOJ/vAyohVYK7A+bTvTdj8HlqTMcaRu/XxHkzjgNkIOWuDr8jnYYDKDutgpUhra0uAlAyCCUAK8BXcjBXgLCk/h0D/hcByDxFAdAzoFUqUBYRJTUcMWdPP7ONL6i5bLQeALJRQ+bT/W7G4AuAOXq/lsGdcRgAY+glLkYclJVTsa6ptCX3uQjAKINQstFrAZKIwWxQIhIJuovB/Nx+r2LzFCwlj8Y0evl/MYk0kieVtcvrwGUnHQCVjjVkPl3mItQsIPuElx9G79dOzDgMgGkAWlNyBJn8xKprBRC+zgEo4LWRgcdVcOCjjlNvmx84DrzNAahaFZWLygKWxUNibIhTcPD9BMLLa65bzreAMSGVoXvJ/Cgh1WUfO+XTZS5CDYDs9GH1fnOrIDcAkABTTDCCLYK0Cwi/586WcKJUiEpC8CCBYDsiiSplqUIUmOjf+o2tIiKVUJbgU5uSWl4DWwX4+PcXnrQATBNS+8yny1yEopdcay+930y5YhgAg+9n2OoUeI5TdQer+32fdhmGoOBZanBo+g1yEKU4dYgFSvqB//vZBIBt9RshkTbW8ZZZ2hUgvDL3iU3uux4LSBM0ZD7dPRnTH08VAIfV+2XAOucQAMuVcKfFSD/+IAABsEoGwYAoHZIKEEYxRIHwLS8pUuhjFVs6/ZZhIVWyxVKBBIRXnbQATBNS+8ynI4tBzkEACv+chlUVIKE/5cRGsWmlKfIzudc3APLQSlg3E2OCyVRc1kpU3DgBmKoQsWtlBcswjPu+nfTYtBL+GQdgOf16GCZW6pXlBCqWSgqJypoOAFfXXDifbwFJLvi5HAjlnUsiIe6AjOp4iQNQHRlT2PlgJCUbbc2s+v/hFwFb/q7gm6HlYpBbmTV2sscQyy/qFBj2v0/cAdz/HGD7NDA1AUyOOU+1CwWOewNjKj6/O03F1/WuugW4/XJgfBoYmwDGdH7IxB5kLPIB+I8AfNwZgga5ck2fJbEm8V9zNWPfrasbgMuPAcuseJ8Exsb9FdBhA+7gaQNKB6TfcgCYug+YJT+g89aoBDMmIMScP12uTKj13uDv8zsKig/uJ1uQOsnojm3qB5P5ACRBH3OhPuzzRN9DV88HqQLEWPJnvTy5nm/t/1s4BcuSpRZtGAu4fi+wtBVYEyccrYwn6hF8/FkJp9bKxAKVFsn/d8urgbHPA9NPOEOWl4+2cfoFHhfVrJTZPKHSj5daOtup6JyCpPx8rHWRVQ7WOlrYCMx8AHIzlxkALPD9c0VB+x/A3E/+E2fUYHXdF7KTGwdvTd0AHP9r4PgWYG0KWBdfsBdsMPfPrKKsoL9XAVLAvO2fFylCE4cKliyrDVZNcGS1CqEYhWFiAZV+XntaURdTLmpCEbpchTYLqi6NrkMCzLzt5Xc4HwyJmmkJ+Z73jQOh4NWeDUZiK1K08f0EXt7CMHVawIk7gaVpYJUA9LI1Ao8bzKX1cytoFtFfpdCIWz7rgzHgth8u0oPGDwETc8CEMySUzFaikgtlpW1Ta8JqNba7lVljSRgW+Q6ZP/57WQvj6fydBjXfAjKbgEvMLwWCvhNoipgNpnQshlS4IGFWzIk6ylWwAz93ETLxGWB5ClidLABoIOS7pmGfG+33YAG5mND0G8F4678vkiPJczNOAC4UyQm2N8w94kirFlfIAl7i402d6dbPWWAtrsjOFiuCvAJZOQE0pHTFsckHYDeCvhNgipQNxoAz8/8IPr5nbvH2jd+6AThJAE4AqwTdZKEBLDoDgU4+YVkPHIBoPwareOt/BkDexsMFAFnbzNJYm0IDnVwbt4uyur1kwL7Tp+iZM/08WT9Rc7DHUmuYTr/x+6o4ovvu9fjBbgR9JyA+omwwxvZI5ULg6ZW7y9FPf9QNwKm/CgCcKABovh8ByVy/UCtJq2f+X1yYJPGU27lIZLbuEWDsWBHesZeDz4iURLUWa1TE47LqK12fZmd3OXidFctqm92KatVs1jAEsNv6sdymaa2g8+xUL4I+Pn2beCgbLGWHI/h8G3oTr45iK86POlbBU9yKI/AcfLR+ouQwH9BfmmbLlTHboOnZ/T9+5vaf8FUaAThXsFOQ45mUcgZCWTAxe0UQ+urYMO1/37GtxQmoLCBtRSp30LrDp2SFdzYMgk/R+VNwvwR9mwQDsaspGSfJgYDYNTbp8psCQFJxEIBkQjDrxt8dXCUIY+COH5MVFPi8SOn2n/QYLZ9Gp0cxANIP5IvAkzVzxivRydnKNzBa8fddM84b6AFyAriMF2pajk9kYIeoClXmA3AQgr5NQEHMBqMVFMNaIOayNRL/vhlH3RZwmhbQQUcAasrVVGz4EtjCu/3dfb/ID3PbT7uKAZ/MhcIC0vqRTo4W0IBIEAmEtFwCYqjW03bcmdwBYeoWgetUbrR8snrloiR2drpACf+rD4D9EvTVjIJu7HBV+781X752Czj9lwUZkTEgcPoNPp5Nv4oBRhCG6dd+1DkMz1JIhR1BAHJ7zwqO3fIRRM5tmDK5CoQKsSgOeBYBKFZULTqcB9r6Ni5KYmd3WKDUA0BlhNLM8EbT1QBXBU72aI5ZjUcVOxz7WLkQ8d37vsart/uA6RcPsxNSAtAXHDYNC1AEpf9s01kKwuBwGU7HgVt/1jtD1e60fgQigSe/j5bQp+KYpGB+H62jT7P8/ZypBIC8Dhcx8eY9wF015abhmnoAyJ5WSrKeNgKO9SHxnT/LSasJBim5lRjWBEIVeROInKL1qunybRawLgASdEy74qjaNNzJCgqEEYzBGvK0297mAFSHEIB6ebKDgc8J1ksmV8t29f1en6L5v6cxIK5iK6Xne/5jCTiFcTqVn/r/tWDPWwXnEPTVgIKUHU7ljASawKefIwDpMdRxRB+wFgD+RREDJABpwSzz2c0LfxczVjkVKwaYgtBBezu3SvX08d39P5uO3QKahXMQciourZRAGKZWar/YZ1xXRPe8wQr2AUK7TvbOVTZBXx4MBECRnConUBSFEXT6mf/TK+/qmzAF/0UBOPqBZYF52HrTFCw2LH5G8UCzJEko5nZqmRnPh/uCXmpnVpDTsIPPwKApOaSA2QLDLSHf97iPx0tpISLfz7bl4iFfsUsnj+HZWEeOYDCDnDmCvZkEgedcCjxGseIhBYt3vx049HwMLRh8gA9gh2MoH9ABqKJzxf0McO7XlSAU4HzhYYFq+5D7hwBu/98OQLlIBCKnW39SlXNY+nqeiq2dkQg+gnGPb9/ZpT0lq6MV5D96gLCwgDmCwbdnCvZmCgY/dxy47xxg5SWuUjigYPHFbwA+fyGwfr2rXrMvPB+vp3L3GHCgi9JOHQCkRVPppeUBigXLFymyejYTB4YsgfA20ofRAlYB0FfAlvQqP0/TsX5PLOB5DNu471cmIwiBaRww/F01J+mz2pqChxUMZvpJlmBv3iTocsW4dzewfhkGFix+2febXDAeJO/YEILBB7pU1g8LQFo98QASVGYNQ6DZfEG3fnEqrgLhbf/HV15anbkFNCvohWSl9XPQ2XTM/2s3I4DwPIZwBEDfgitH0Ek6N6x+u/iD7T4g/YdBBYPpWHEaHlqwNw+AQa4Yj54JrJO+aQDB4pt+oCAyYvOPEIQDCgYfeF/9U3AbAMX7ItAlVtAspKZdz5SOlvA2pstxjES3wJ+92NgAGK2gwi78QoVfEhBeQACqNNP1RdoA18kKdgDhxkUI/zKIYDCnqyzB3jwAJnLFOEIW7QEEi1/1Y21ywVglCAcQDD5/Efj7M4CVrZ5AKlkhxeQUaxBI4nvFzxf8IfCVC4HV7cC6ZEX5nen3VX1vAGLZq8ysrvHY+QBwbGfI2E6JpLvdX+ksthpUvQrmX/sVDGZVUJZgb17vJHLFeGQcmCdVb5+Cxd/5xjZ6QzzMLOQBBIOfTV2Ps4HFHQ7CLQUQmUrV0rgKJMsCjsxGAqTn/hzw0EXA4tnAyg5gbTYBorKkUyLnkB9YVhTxu+kT13iccwtwdBewPAus+b2ar9xJAafqfgMQO4dh+J9+BHe5gqZZZzYok1JJUcpaR6bp93P+W/N6p0KuGIemgEWKgPQhWPxdP7NBLhiHKYHUp2DwpZ8rLOD8tmJQVplOLxAqmbRKC6EDYC7/CeCRPcCx3cDSrsISrs04CPm9ArZk55UvKAspYLqPaPdR4/H0g8DRHcDyVr/X6VabLHk2PhjpPVZY7d5xwF6CwS9y/4LbbVyQsEKIufGiKe0p2JvXOx3kinF0GjhOQY+oNRtljji9TQPf/fOV9IZY4Gq4D8Hgy/4W+Oo2YG5bUUy04vUcLCqSJVRWszJbNgxSmMau+q/Ao2cBR88EjtOqbgNWWaTkIFz3YiWrF4nAjtN0nBZrJnU+/8PA3CxwfMYB6LUra3oglL0tps6wlVha5rLiqd9AdDfB4Je6U0s/0BXTDYh80Sr2FOzNA2AXuWIszABL1JaKWq1R+nwGeM17OsoFY5XTVw/B4Cv+Djg0C8xvLYqJCECzgsxmZlq9T8e0XGUyaUizavPtxoFr/zvw2BnA0Z3A8e2FVV3x6c4sqwObckeyhiXAowUSADhD1XhceDMwx37lvU4XxVN2n3rJIocygkr/Vbs7fe+EdBLcfaXXQ3IPWIrpBB6XlnwpR76jYG9e7/SQKzarxM7qJFj8mg8UarMV9IZ4gvNDD8HgKx8HDs8A8zMFAFnPYQPDl0Co2g4fpDZLqKCxT0/7fhJ4fCdwbFvhRiwRgJruCOwUgCpeCvUjZmEFxhfk9W969kW/B8xvKQqnVgg+B6CB0MsI7P70AHgmd2n1NQ0rv7FvALIlVYK73MnQCDLThSGZoDpuP7uCeuX5n8zroB5yxThGnQ0CgyBMxY63Aq/5aBHG6EBviDlOLV0Eg1+0AByZLgbl+HRxnZXJoqqttA4ODovlJZVuSjTQFtq+NwNPbHMAzramdVpVs6wEoPtdNg37wJfvsYiJP9NFqvHY+7vAwjSwxAeNxVO8T6aNVRRRlT6hHrJ0Ovaw0WDJCKng7g86APvNB9wg2JvXO33IFWOBgn8EIf2nRLD4tbe1+AU7yAWbZeskGHwVdd2mgAUCcNKnJgLQrZ/V9/Jnn5JUYmnAE3hCmv3+t8AWQfSzyPK/POOgJgDdsgqA5nfJAvLdLV+bz0kK4RqPZ3wQWJxyAPqDVhZQyQr7gyaXI9axWCFVAGLvRUhV46PgLnUWBs0HbBPszeudPuWKsTRZAJDTo8l8ui/42juL5veQC7ZpsEow+OrZQlqVVuH4FLA8WVyDAOTAmHUQCAWQkOlsQAwDt/9/AE8SgPQpNa07+AhAA6HLXbb5Xr4IaAMfv/eGvP5NzyYA7UGjBWTWjh40v9fSyscHLtaxhJWxFVsNNAXH1khw983+DYPmA5aCvXkdNIBccemfceooAfhAAcA+6A2xLuAGucxrzgKOMexDfV9OwbS2BB/BEoqLSrBoYGgJ3E8qLcIEsP/ngCPuUy7S13L3wb6PU56/m/Xj4Ps0TKCXQA6AXuNeZY3HMz5QANAeND1kwcKXlj6wOZQ+b7R+Pi0PD0DeFAfk590CKg8qncfoFzIRVWVqfFfBhgn25vXOAHLFWCDbvPstBsJZ4LUPt+jdesgFg+qVptWq11bg2gtgfuLiRAAgQeg+oEmsOujsXb5SsAoCIN/3vx04OlNM6Yv0tdx1MKvK7/TFjVmeCD4HQQQhf159eV7/pmc/kwCcKABoeYvR0oept7SEoZQ0Tr1lPuPQFlAtO0nyAcWhpzw/FSjFzGjLx+RGvxzoSeC1hwsA9klvaFN5FAy+9mJgnhaQ0qqagglADo4c9AhCDpJPl5ZommQ8738HcGw6AJBW1VecZv0cePwOY0/wl1lAD/WUCx0mMlDLr8bjmb+Dwp3x4nkDYbD0thIO5aNtfmDi/xGEeRawxhs7Vb/q2huABQJwAlhyy2cC0xoggjAAUCWWAkksOiIY978TmOOqeqqwqAx3WGhHK06n7TDwOcAV/iipPAKjwgrZm2o8nkUA0gKmAHTrp+o9MTrEYvq44o9pZIOtgmu8mafCV72YAKT/RwAy5OPOuVlAAk9Oule6xQRTWUKlWtkU/IvAHAHti5oIwDK841ZPFtCmdr0U8PaC9hVultd4CIC8P2Ztt/m5/qC11TJXlJDGGpfGAmYODgFoCxACkLpuWh3KCgqE8gNVZK4KtxgjJAB/2X1Krao1rfN7CWZf3LSBT4uAEIyWBVpipL7GgwA0AW25GbGENBTRx3rm1M2w39mmrFVwjTd1Kn+VAZALEE5LtIDyMWUBvbLNLGHgd5H/V07BDp7r3uU+Jadgn3ptxekA5MBri0/Wp4wzBjDbCnkMWMqVpE8GJwLQqvfc0pqbkVj5aNk7gbCxgJno30cAjntowtXNaZ1suvSKNhsYTcVKmw9F5xGE+94dfEoP+JYhD/8OC8eIPUsUHokVVKB78XszbzAF4Pvd//PCKVGIpOAr78mn4DZOm8YC1jco+w6EFTDDPJqeCEBZBa5GffVbhmQ8DtZW5TYOvPhXip0GTuu22lTMLSw+aAVl9QhEWjurI/aQiLJkTMLsX9R3r/ymZ73fp1+37OU9hunXSkdl7T3QrhKCtlCM59k2i5CMMSIAGdqxEIwrmptzTsCEut5yilKoJLAcxCq3fe8tLCDBFwO+tKjyuxSCMdYEXoeDrHcHvu0tTwLzmwHA4N/Gh6zNCqqeOSxC2lb8tQSiMwbuqXIqAcjFh2JjBKGJyShQG6ygVbfJegULWBYcMR3rvb6oCRaQwFPgl1M5rR7/JtBZOIZWx/0+s4QeY5z/1/X2tFnAxPpFELaVkdLN8MWGVr4pCBsfMHN8bmTKfCjZ0Ncp456/x58zLzfw6Qf3ABd8pUgEYmqk5bGyek06IQl1bkXScnlN/u8L24Gdx1qVq91KQvrpgwaAAw9p+wnXPw1YjyWMGtDo2ASOFGMU7SIEUzdYD34vMPmXwLbHgdkFYAtlGiim6DpxJtvq9LtlVr/aWKEB8pUXAOOPAFPzwBTZ9r04vdQ9Ts4pAZ3cd+yHxgfMAOH+vcA69/9Uxijmz/AerYpdar1lNSMYzV+vWY/34I8DY58Gph8Bpo8A04vAFEFIknIHohGVR62QhFRSYjQE6qFri2z3iaPAhHNNlxKwArI0Q1IAxwfReacbC5gBPp66/5ICgLKCtqnsrKKlrFZUFPKOr7osMTtdsxzqQRZ93Q1MPARMPllohUxRqkEK6gShOP0S+dY2hlRv99y+ovRi7IiTnTvLqmg6xDPYpqAUgRgsoR7MxgJmgHD/c4E1FXu7FRRbvEgd7evXWlbPpp9EgUjiJpwe6zwOMlvpAWCMVusJYPIYMOlSDZRpoGiNxKzbdIQlXONMWJbGtw4svdgz3El47nzTRvPrrKptAJT6ZrzfintvAJgx4vsvdQvIXK5VYF3sUZxmJUvgA1FOvwF8spKyBtM1y6EepI4LqVMedbEaTp0EIKdPKh5FqYYqSxgo2jgFr13j6XXHnOiSZOeBVSvyC8qC2r05FVvVw9cAMAOA178AWPMp2LJaaekiCPXExwHw660n1oB/niGQazwOkkSepbJ/72I1x4CJ+cJ6lYI1riccrVicUuVSmIW82pkwnHHVOKbFsOozQGkFkwewnBES37ABYMaAX39ZAUCCb82nIlo+40p2gNnvsoKunxH1xGwA/LOzdQOQJPIuHzV2GBg7Cow7AI0l33XfjOsv6oVodes6ISbBsAZMX+kJxU56KY7pkmFVhOciuvTzSt05v0+ryuT/9gDrZNe4wPMsI7VJP3GcP7gUOOdvgL1rRYJ0ZI5IV3hV4/wrGYPPU3/AiRhYusy2K7mU999P+z90ObD7LuBZK0Xdkeq9NSX2+o4HLwfWlopFCC0fgciBMtAFC8CGrYXVoVjnU2G7rTXrzh4kfRzLY1kyGwBoeiGcPiXb5eAzdXWnazPCSScb4j3xfmav8Cx2p50lAMW0VXINitCogl2r9H2dcctWwQxQsn6ZTBbMNtcgdKIbiZj51VcBk38CXPxoQcfCUg8pjcYgZScw/momACnXyr4leBhs5QaBTHpf7X8dMPYJYO8XgAv9e8QJlAZZq8D4xSuANYKPJQn0AR2AHKy1MACKe9nfFI6IEqduEWoHIJ9wlsVKLekoMCa9EAegSTYQeM4TXco2SEMkAHEbBZoj4bbYtdyCVrFqGXgTSxgXYTZeHLi9AMjEQRCVUXP/n4KUaaT8vVTi+Rtg7GPAuYcAWlMCgUVkQfJ2Q12yBvPXMwHImhDWwf81imsTiLSEvHZkr+jY/p9CQRD4p8DOBwteItai05qn31FFdfLlFxYWgCDUIkRkj/TxbCEi/89jfPZ3X2VqYSJQbmUNQY3HQT7hbv2sLoerVwKQHNEEoCsm8R4MhPRjXUGzVEIKIoY7yaEYuY4dgGb5RXruoSgtSCLLarkICQ9f6QNykGjFdjsIBaI4kGlt8W+Rg5g0HJ8qAp47nihAzFpuWtPIMBZJlASILvR6fQ0DCVbJCkJOJCqnk4pGpb99tZ8MopyiKDX7WWDiwYKXiEQOehCrgKh+eJQ+EQHo1Lby/zRlyf8TIbf9XS5ftIb8I92YugH4ay2pLusorl7dAoonWtMwQSTdOFuQSLTGHyIC8kxSIQuA4hwU2WUAoO4/grBcDbsfWElSzg+JCoYDoEGM1ixSkHzgF/wG7y8sIa3J7JPAGWuFJSQIaU01iJHUiYP4e33BrPOHmG/JMaOfTZVYRhwGav87vWKPJ9/rSH4IOGO5sITqg/ggxXs4TOaBAECbeoOsgfl+DrQShFqcEIhyyt0MbMusEkx76iAZXKM8BvXiZAGlF+KaIbaadYpem4aDgpJZQz6YJABV5VcHAJZ0v4FxX6KG5UpYs0KnqjhRuagEVgPglYAl9ciHf8mdUrJh0Qx9vkDBzBywfbkYQIGwahA/kglATsHsDzKA0BATiPyZ4NEDwIeoa/uFYKKXL2f24nQoIgd9R3yQCMTFqwIAfdBWI7+yB5ZLECYLETd85YJl+2YAUNosLIel/xYlu4Jsl6bhNhD6it4WJCvA2Zc4Gxo73RcgJeOqFmGR6rcChLYACyGojmEYdj59KnZ+tIQRhH9IvWA2hiREjDeRI9Cly7fMF3EtWRFawhQIf5IJwE56wdTIYdt7tp9ys1K8JnoJvod9Wn682PNkP4hUy1ndWgstAtBDMLYN5/6PAc5DGNoF4SrZfN+4+IhT8jqwg2Cp8ThIJ5vfSWBXAVCrWN9SMxDK+skaOvhoAc8me654pmUB3f0wyt+E8FyRAGmPlOEoiSD2qgvmAKoOm52fAuiTDHSyIRxx+lI0QxxADubfF5vffMmSajrWlP7nmZ3dSy+4r/ZzAUEHnQ8R70HsXlK+PgJsW68G4XYGZj0EY2EYATCAT6tAhmE0DXcC4faapcwMgAIfLb0kuzT9Qmw5uwAAIABJREFUSi+EfeALkSrpBovbrQDnkm8wAo8/E3i+CCsZ98NCpAp8cUekZyBavI4ET/TnaAk/RQCyAXy6uNSPA0i+wMeB6ePA5HFgZq2wpNGK3FUDAHmv3fSCe7afX8CB4UNEEOolVi/3obastNwJ9cO5BOBKEQMsAcifHWzRAigWWAlCn5K2bQYAOe1KMjTIR2kRUhKVS7IrLia0v+3xwHMZMCbYNP0KfG79zAqK5DxOvyEuWu6VD5KSHy2YAEQAfpaRdl5UkuUctIpBnCIIl4psD03FtIIP1ADAlBuJM47EqqUX3LX9kSBQcuuyftK78xUkHyQ+RLqHZ3Fv1KcgLj5kAQ1s0Qo6IA1nHhNLQzA8ZxvBXuNx8DcS5UYpNnoYxsCnUIqvZo0F3wPTMa7Hv53HOJVbS/l+5bumX7d+5WLE44hxIRJB2NMCqj9ixwuE90svWCaIA6bAp959EKeWChAyA0PTOV2unGMQveCO7bfqHbcS4rJR7Ewqnw5AWhLuImg2uFQAXAVs8RGmntW4+g2hB3P79L/EJ9zGvqrxOPibiVihAOgrWQOf/EBfBcsPNBBqW9Hv6zzGqFzmoXz3B9AePgXiq6bgiv4YOB9QHS8AfpkAFMMjrWAcQA0iO9XJiQyAnos2vV7ESHOOQfWCO7Zf7F40mZFQScRKAYBaSU6vAVcTgN7xXHiUFpDTMK2dFh56912BTiDcvpkATIXzCL4g3WXTZ4jpGfjoF/oihL+fx+0yWUABLwIwtYKKIabgCzHQvi2ggBKn0McEQDaKT5cGkIOo6SuyYzEfjQB0EM5nZgAPoxe8of3sgSqCQM3jkdFLvpRvR13+7UVRuhUFSavNO6otwp88ZZ3+t4M6HLtch6OT9AG/q9cmtf//gV1JDYcnQ2zY6/YakfSrU+Pg1M45NqPt3IEtoM7WFHokyrWKkooglCMWLYjiUXMtK3g8Uzd1WL3gDe3vRRCoUEYCwGtYFxxqgA2E/jI20F5hhmQod98BHNnlxOTig1aGiDanO21yV4DygWuB8YeB6fnC9WEtiKVVKeE0ZGiXWczeJoWMIig5a9V5DA1ANoKDeDylZ9NSXxyAsiKawrQqmCv2HVf5e8aRoxfc1n7xs+khItAUvojvyWryxVcWJZksVSyZoQRA3dcAoHzax4Gj2wtu6FVKM7gMgti02jbV476oUJJs1j/AbA1mQ3Pm8eTRsoZDtR+xZKCiEKmMXTIeXHPGdhYArX8FwG4DGMEnAHIK4yvT58nWC2b73cexaZgWWaEKgU1gjNbPP7PvOYGsUSBkv3hBtmRWNzxjTk9RWktvxp6POj0vARjY9sWkFel8RWxegjIF4RjwAOnZWMPBTGjqvHmszxJOBUD3xyznL2bqROvoP3N3q84jG4C7M/PpcvMBef0cvV9k6hXv+2Yno5QfGArRbaCC0mWv2YtF3ecerNDhkNZIIsXQRv5dlTtGADJSz2gEE1EJQM//026HdIEZLC8B6A0tk0g1Ja8DuzJdphS82QBEZj5dbj7gxZN5er/IZI+67pscgE7QaDOUMyC0Wb8+gXjuR4F5J6YsaXnFhBoAGEVvUhb60jISgCQnoh/OLBgvIrL8v7DdFkEYM5dtNg97tvz5zJqzdfIBmJlPl5sP+DJP5xtW7xffnzeh7H+Z+3+RpkyWT1YxuURJYVtx6T0fCTocouQV85VkHRIGegEuEv/YKpkA/JceVmL8kv6t5/9pu62tfiPWcFQVEa0DZ9WcLJEPwMx8uvfnjT9IgZyj94t/ldeA/S9tMaGa9SNdmsIxbvVscVJ1GScoMt4UPwhAsmMZ0aXzQBsvdGRBjQz0FUpEJRAJQOq4KAnBdz+sfiPJ3bOYn8fsykyVWMfiN3BOzckS+QDMzKe7OW/88aqQzsfE5kH1fvGjeQ0wADodmVGwOeiMsUqHrGOnS4UFy9P/wAEojkEnI+IqOIJQNLgpCXhcmLAtD/D+kgQE235L93tj+YBqgTX9BiCeW/NedT4AmQ+YkU/3sbzxBymQuZhm8g1T+QbV+wWFdjKO/Te2mEFNlCb6gPF708VJ1TXHgKd91GnZpDfi1k/gM2vqU3DUnCuBmNQe3P9vw6pe229KOvB0K1k+ZS+rnrfM2AlA3JMZtah/EZKZT3drxuDz1O/yxAwu9JgJxr3lQfR+8aa8Buy/wdWQZAVl+ZzCrG3q9c/YrkmHy3IRYryAAqAkEBIlopJxNNUbER+fA/H+/+AAdP9PmS9dazicJybm7mlB8nR2dI1HvgVkOlZGPt2nM29GCamcGZjAwlQ+vvrV+8X/zGsAAUiLVPp/wd+zaTMFWw+/kAA0GQQnpCw5mDsAMIrcRB5mC/+MAffTwgfwKY2KfmCZ6ZIkUShrxXxBX4yYaV8Hzmcn13jUA8CMfDqWYeQcSkhVOl8U6uxH7xekrsg49h8oiCENgC5TUG5vKxxT8f2aRtOtcAKQ1s8soPuOVUIwpchNlEEIOyNSIrrvv3hwnckWIZPZsnbcDyzTpvg3lU8mpZQqozyfK74aj3wAKh1LgrsD5tMxiz/nkGD1sHq/YNFOxkEAcuW7oqmXlisuQOT7VV2jwi/kTgj1RkoZhBje8Z83SCAEEJZW0C3gff8tADCt4VASaWIBK0HI9q8BF5yUAMzIp8tNx5Jg9bB6v/jdDPSRns0BWIZeUitIo9IhHmhXTvzCPQddccnZ76U1V/IvC4SBCFyg26DFNg7c++Mhhb6qiCikT7WVUmr6lYn2nRKyrdZ51GMBlZIc07GUBdMjny6XCiUmpA6j94vMZbgBMFo552pu27PXAqXTyAUQcitOQjAm9xX0N9pIwIPmSCmH5QuPqER0L4kDYgp9zOUL6fYxkbZcFceyAreAF3GlV+NRDwAz8uksnT3jiILVSmpWNlhMze+k94vMZfgGAPJeHDjpCrgM01Tdry9OzvmYAzAqLVWIwEShwzbRwwSEn+MqP6bQK5tZlWyhjCCCsC19Xv7gOnBRbgp7cu/5AOyVjqVMmA75dJZ9nHF0yohWNlhMxKnS+0XmMtwAmFq4imnYbrEqNJPc+9kfd62RKh0On8qV9hXZ9askEPgAfI56ziocUgVbzGT28lEtRMoKtg7lBHtznfZNA+CQ+XQWM8k4uglWK/NLYKzS+8U9GReXD0g/Tyvh4Ne17Yb4Zbr6g6y7/aNWcoPpjKRTsJIags5IJwkEAv6en05S6GUBfRWsUExZyVZVQCQwrgN7Wfdd41GPBczIp8ODeXfTSbBa6YYxlY8/p3q/udc3C+jTbtvqt2oadnB2m4oNgMn0W0p+hYWHWbwg9yU/0Kb9EIy+5y2hiCit4UgKyTeAkN8Valk4Le/ldlONRz4AWWBRM6fdIPfHstw/G+SE5rMnVQ/kA5AkLHS0ak7V7reXfhgACaBqDtD3e/nmc5k9kA/A80JReq+U38zGVp3ObJo/BvAOD3dtwiWar9zEHsgHIGlFubqSx7+Jja36anLLcDvvgwA+NDpDfILv+qlzuXwAXuSjrkKemlO2e3U1uWUYnL8dwB/5e2apca9LNv+vsQfyAUheX4VguB+mzIsaG9ntqxhF4Xbe3QD+n7/uHLAW9wQ1tblMRQ/UA0CaHC7plXEh+q4T0OWcfhleYTSHBK0EH/mi+fcRuKQn4I6fWpeoB4AevCz3HOOm9yb3F5mBlZBNclYCj1aRfyfrbgPCTR6AzK+vD4CyglX7jpmN7HY66d1E0ctdIrEEE4wEIMlam+Pk7YF6AMj7EwAVbU82vTerCwhAXopJN9zVI+AYrOeULLZgErY2x8nZA/kAJGWr0naUWdFpy2cT+oCWjpdjLFxE5UzYIBBpEUX5nLnlvAktb76SPVAfAOUHpiAMm96bsVtCAMaKALICMyxDq6cXfycA+b/mOLl6oF4AiqBRIEzBp7/X2Af0+fi1XIioMIlAI+AIPIGPmeROWV3j1Zuvyu2B+gHoFfZiDS2lC0LiY52WUADkQoTTMH1BFSYRdHoRfKSu5v9qrizMHYPT+vx6ARhSuDcAzzmDo5ZGHT1PAKYMwQxME2jiSo/gEwBrrq+u41ZOy++oD4BaCcsXTPiSI3ey8s4KGoG8QwCMFM+0ggQhLR0BF19SXuD/ayakz7uR0/TsMcxg3SjfqWNA0hsrga/ojaq/8WPcC+YIk4Ke4CMSuB2XVht1Oj8zIfXlU8BtU8DhmYRXWdfrdF1fgr3+S8At48CD04DVjXQSDO70PTUnaJ5uOCwsIIFHSSFy1pKPWCDsZxCpw8UVgKSPxLXM937OzxxAljzcPAbcswU4Qh4V3UN8mKoeKm/bu78IfKJQa8VD48CylHQiL3O3/qg5Rf30BKACMtJXjXKQcfBSK8Dfqc3KVCwuN2VFGRnm/yKZtq4Re5ifyQQgM2A+BeB3GHaZBo5MAIue0l7Kt3cC4xhw+5eL7TuCkJk1jBtyerbUfYG5ExjZ/pqrxE5fAOrOq5SmowVIrRp1IyT2R6+fg0bgVYG4CsyZe2UsaiOGKXr4Sfp9k8CxCYAFSKyvXeY1o1BxQux91yMtfsHPutgnnyUuUvhc0ZsgUXib+nVkq6+ZKaABIHsgVZnuwD9sVo66rrR4ImdhLGSQ8zPL/JgBQxeU1ouWkO9PTgDzbgmXxrzMkatl3keivfG5x4r4IRcz5BfkO5vEZ0kgpIfBZ8yKjlL17syy0tMNcOn9dl4Fy6dLFabj1Mpvow9Ify+I4Nlo9Xt+ZqU9VdJpqZh4QDDyxUyYOYJwHDg+DhgI/WUVZl7aSEt93+GO9Ia2iuZKOfA7lhp9JpvAVy61w2mOwO5hmCgMHC1H9O24gu6UD9jP+ZmbtLRaSsei9SL4XDPbAEh/kGQ/pSUcc0lbApFWb67lQUhpVnLBsoKqqZclFMmUtrxPcwxl3X7vOCAtYLSCcugFQmqhdssH7HU+RznjiOlYXA8wqkOfkItTAom+oKygca4ES8jY+N3z7fSG4hfUtp3ihUHruVSsFy1iRvNP+1N7A5BdJACmVpAgZPhGOyCigEjlPLudn7kvFtOxuB4g6OjD8UWLRkCZFRwrLCEXJQQhp2K+37lQeBCRX1A7KPQto1prFEmSYn2mB9EAsO+kYfk8KQhZF8yjVz5gp/MztyOUjiW9bCUhEBhKRCCgSis45uQ/PhX/xfFWMgOnWu2gxB0TF/o0kEZ/kCDM1Ts+3RHYnwVUL6XhDFrAswfIB6w6P1MrTulY0sum1VICglKwCEACqvQFCUK3gHcsFQCM/ILayqP1k9JshVqrncMalOYYvgcGAyCvIwuod8YBJQmZpmGJeyRwkGw4n8jJOJQNw3idLFhMRNB0SgASTJyKoy/4ieXCeFfJBUeV2SoAclFyR0bbm1OHTUiN0/DTAwD7zQeM52dqj8VsGEkVE2jKetG7AEhQ0frJAv6RC0trC1skl+IWlNinGLbSaZg7Mc0xfA8MbgF1LQV1z08A2G8+oM7PVF9Ms2GUE0gQyp+Lwu2yagLgR9ZaYpkSypQ6a6Q2DCqzpkvietXIFdoZfuieGmcOD0DeP0HEbBhNwYPmA/L8zJQsATAKnguEqS+XTqkE4YfWWwCUFZTksYAYwZfIBeN9Tw0cjOwu8gDIZqsoSSvhEeQDiiGYFoyWiSDRypWgi69UP5sc5fIcquSCNeXqe2X9ZAHfM7Khe2pcOB+AT41+aO5iRD3QAHBEHd9ctuiBBoANEkbaAw0AR9r9zcUbADYYGGkPNAAcafc3F28A2GBgpD3QAHCk3d9cvAFgg4GR9kADwJF2f3PxBoANBkbaAw0AR9r9zcUbADYYGGkPNAAcafc3F28A2GBgpD3QAHCk3d9cfOxqYJ2au9RdPtdp/khoEOlglDYT39V1PzQFXLsMXAlgt9PCxJKPbufyf8/KHIPfBPAZABf79Xc5XQ0ZQ1Q7360NbxoHrlsDvs5ZRsgo0une06by6X1mZvtP99PNAp4F4LsBXA5gjw8EGTeqaGF4QhzQF80CX7cAvGIdeDYAfhdZ2sTKUcVrpE7nd31N5gj8e2dIo2osk7NZpMdK0Z19tv+bJ4F9K8D1ACj8yfNSikHeg+5Z969m57Y/8/ZP+dPLKZhP/rcA+AYAF7g1oRUhEMUzFMt6eSJfX78b2DkPfM0i8GIAX+uWlAMppreUUErn8p2gzTl+2flg/sDbTkvIOik+CP20//mzwAXzwDcCuNTPJeFXpEpM6QEjIHm/zTF8D7T5gATYNQCe69aAloRTGulfBESBSYNyxR5g/Bhw7hKwZwl4vk9LnM5JmsBzUyDGAX3B8G23Mz/g9BuUa/0IiutfMkj7zwKmngAuXSvOpUvAWYBtF4BTnspIj/O8zPaf7qdvWITw6eZA0JLQEhKEGgxZhUj/dz3NzSKwbR44exnYvVKcy+mM5Km0JhxInUtrGkmzCPicg3W5LMGkQiZZTm9xS9Z3+4m2o8C5c4X15pTKW2Lb+fCx7WLtjYxzqiql29Icw/dA5SqYf6RTTilg+lYCIXmICKQ4IK9wxfSJY8AZK8CuFWDnanEua9ZTAMsaCog3Dt92O/MvnRGBtGwkqKRmMEkqCaa+2k+0LQDTh4rP88UHj74kF1WaATo9QHQ7mmP4HugYhtEKj4PB6ZQ+FS0hQahpldPya1kXTOqNY8DscgG+HavAttUCvBxInitrkgL4lcO33c7spBdM3kAuSnq2nx9gQfAh4JyVwvrxwel2z3p4aMlzH6DM2z/lT+8aB+Q/OT4EEqckWQSBkGD6EQKQnDCLwBSnYgcf32fXioGUFawC4esyu7CXXnDP9tOCsyD4KLB1rmgvX7zfbu2WG/Jtme0/3U/vKxBNAMoi0KcjkATCN3HOEr3UAjDrwOP71rXixYEkeKMFlSX8ocwR6KUXTJ7AaNE2tF8WfA4Ye7Kw1mwvX/yZn+eKnvcrfzC6IK/ObP/pfnpfAGQnySoISBqUXyAASS1AK0JfagWYcRDOrAF66TxZQU7jBOEbM0egH71gcgXSFZAV54NQtj9YcNIpbONCyh8Ygi8CVospApDuB63g92W2/3Q/vW8AsqM4gLIKBBIH8bcJwMCNMX68BTqBb8s6sGWtsIA6jwDk662ZI9CvXjA5A6NVa2t/IAicnC/aGV+8T74IQPm/AmGuBc+8/VP+9IEAyLslAKMV/LgAyIUInfnjwPQqMOOgI/DstQ5Mr7UAqMF8V2YXDqoXXNl+EQQ6N9v29aKdesUpWJZbAPyPme0/3U8fGIDssDid/pUASCvCaXgJmFguAEfgEXT27gDkuwaUg/nbmSMwjF7whvbLhSDL5TwwvdRqo9oqHzACkCB8U2b7T/fThwIgO01T1IMCoAZxGRhbKoAXQUcQTjkI+a4B5e5FzjGsXvCG9gdqrLGFYrpVG/UuHzBOw2/LaXxzbh43DKeoJwlAHqLndSs4udoCoIBHQE45EPk3DuitmYOQoxdctp8+rFwIWsGFYiFFoLGNchcEQC6e+OJC5J2Z7T/dTx/aApYdJ37AyJK/DIwvFxYvWr0IwEn/H1Opco5sveDUhSAAF4HJpQJkWixp6k2n4IYfMGf0amDHev2I8+l4/UbvNw8Eozw72wJePOJ8und7EkKj9ztKGA1/7WwATo44n45pWI3e7/AAGPWZ2QBkYHCU+XTMfGGQmYIxjd7vqOE0+PXzATjifDrKtTZ6v4MP/MlyRj4AR5xPF+VaqZLJF1UzKdPV6P2eLDDr3I58AI44n07ZMARbo/d78gMubWE+AEecT8e9YOn2Uheu0fs9tUCYD8AR59MpG6bR+z21gKfW1gNAz4geRT5dTEZo9H5PPRDmAzBmRM8BJzqfLiYjSKKr0fs9dYBYDwBHmE9XtRfMsIz04aQZ1+j9npygrA+Akqs8wfl0BCCTWRq935MTYL1aVQ8Ao1zlAnAi8+kEQGZTNXq/vYb75Pt/fQAcUT5dBGCj93vyAaxXi+oDoFLyT3A+3Rcavd9eY3xS/z8fgCQX/LPR3SOzkon55jg1eyAfgD8M4NcAPD6aDmBtB1e4NMDNcer1QD4AbwbwxwDe4UvRE9wHZG1gNSXDLlwLNcep1QP5APxzzwj9IIAPnXhT5ORc5EYCA9HNcWr1QD4AmRH6FQBMTSZZH98ZmD5Bh5g1FopiNns1x6nTA/kAvAfAEwDudnI+EvQxPfkEzYfaCXRSBluQMB7YHKdGD+QDsBNBH/9+AkAobqTADGK7Inw1x8nfA/kA7EXQt8kgrGAGMfBxZ5Cv5ji5eyAfgL0I+r68uR0QmUFoBQU8vfNvzXHy9kA9AORoMw7CdGQCjoUZDwL4kv/+8OZ1gJhBIjGDgMh3vTavBc035/RAPgD7JegjODfhiMwgoqeJwNPPTaB6Ezq/hq+sB4AcXeXEP+ZhGVo9vRimIQD5v5oPAZCupgDI9wg8/qz/1Xz55usyeyAfgMMQ9GU2Op4eAchpOIJQQEz/VuPlm6/K7IH6AMjgGzdl6QtyX5jWjpQFevF3lq3xf6yhrOlIAUgQCojR8gmE+l9Nl2++JrMH6gEgR5UA5KYsc+AZmCbQCDi+IvgEQMob1XBEAHIajgBMLV+0kCdws6aGu3zqfkV9AGTwjftg3JRVVRAtHQEXX/wbAcoXP5d5CID8GoJKvqDAloKOoIz/y7x8c3pmD4zhaqwjRzCYyQg5gr2ZgsFTLweWr8XQgsXjbwLWrnNtMlKgNoLBmZAa7PTCAuYIBlMvlWQswwr2UlUw45jdDSx8HbD+Ctd+HVCwePKbgJV9aASDM8Yg59TWFDysYPBtmYK91IbNOHaPA/M7gUXKXA4hWDz79cA8+W0aweCMURj+1HYfcBjBYO54MMY3tGDv8I3nmWSHOzYOLJ0LLPGXAQWLz3oB8MQUsEa16kYwOG8whjh74yJkUMFgbsNlCfYO0epwissVY34bsHw2sEIRkAEEi/dcU0SP5qhF1ggG5w3GEGdXr4L5134Fg4kAjuDQgr1DtDqcUmZETwArZwAru4BVqsv0KVh8/o3F4v0QXZBGMDhvMIY4u3MYhv95Zh+Cu1xBcxuOU/HfeDIq5cv7FuwdotXhlCBXjOXZAnyrO4BV6in0IVh8wStLuWCsUAyvEQzOG5ABz+4eB+R/ewnu/kOP/3G/l4kJTERlljQtIot2e53/IwO2OPl4FLtcnCqAp9cahT56CBZf+LpSLhhz1N5qBIPzBmTAs/sLRHcTDKbiNHdBGGymOC/3hglEvgjAnoK9A7Y4+XgiV4zVWYDAs/etxaubYPFFP1QkLtCIP8neaASD8wZkwLP7AyC/tJNg8L/xLNBu+YBdBXsHbHEFAINcMVamgdWZAoRrfPdXm8KitLdmgYveWAq+2y7iMqfuRjA4b1AGOLt/APJLqwSD3+y5T1yI0AoSbAxMMzGV1o8/My2ro2DvAK2t+GgiV4zj4+3AIwDXtwBrVJeuECze+9aW4Dut4PxkIhYsdetGMDhvoDqcPRgA+SWp4O4veQ5Uv/mAGwR78+6rQq4Yq9PAOi2fA4/vBkKudKVU7VZw77uKvWFuZbtcMNb5v0YwOG9g+jx7cADyi6Pg7gccgIxlcA5TKhaD01yYKBmVFpBZMfx/m2Bvny3t8LGqoqTliZbVI+gMgHwnMAnCIFi897cLAAZ6QyzFzzSCwXkD1OPs4QDIL5XgLmk5JHk/SD5gKdibd38VcsVYGmuBTaAzEHLHgyCcaokB7/1IkUET5IKxwF5pBIPzBqbPs4cHIC/AaeqvPL9pmHxAE+zts6VdLCD/lcgVY3UyWD0Bj1ZwqgCggXA7sPfWAoAJvaEtZBrB4Lyx6efsPADyCtmCvf00s/NnOsgVY3m8BTRZPZuGBUACdArY+5lWDqGmYbIrLHEx0ggG5w1OH2fnA7CPizQfaXqgUw80AGywMdIeaAA40u5vLt4AsMHASHugAeBIu7+5eAPABgMj7YEGgCPt/ubiDQAbDIy0BxoAjrT7m4s3AGwwMNIeaAA40u5vLt4AsMHASHugAeBIu7+5eAPABgMj7YEGgCPt/ubiDQAbDIy0B8ZYNMbkX+ZekpuIiOQrPar+xs889HJg6jZg5jAwvVZ8B+ll9PlO5/Fc/o+ECjnHfi8zYfkvM5ulmp4qJXVqx5deD4zfAkw/CGxdAZgoHfuh131QkaI5hu8Bs4Ds8B0AWLnIRGCBsFfn87JffDMwdjOw5R5g8giwZa34jnQQUwDo99wBfJ4TM7COiNdlaj2rA/jeV/vfDeATAP4UGH8I2Lrc6gc+SHqY4oMZ74VSKM0xfA+UUzB/oBUUCKMl6zSQ/PsXqZD5KQC/A0w/DEwcAcYXgYnVwppwADuBkefnCim90FmBWXwnK87Uen53BI8sbuwqaz9p5UgnQhBS+ZN1zE8Ak0utviCwq8DI8/nx5hi+Bzb4gJzKZE1SEFZZgS9/2pWR/gTAJ4HJQ8DEMWB8ARhfBsaWCwDquwQKvvNgHXvOcYVbPFJPkw+dDxC/W1Y4tWDpw/Rlgo4lo1T4/KxTihDNpJwj3/UiMLXemprjffC7eWpzDN8DlYsQDiKtVxzEqoHkyX9HRizW+nIgaQnvAiaeBCbmC0s4tgSMu2rMePAR9X252jXklaTFU108K0MHav/nvJ6ZxVVk9OI7GR2IZoGQNc/HgbHgIwqILIVujuF7oOMqWFawCoRxkfEIB5CWgkREBCNf9wMTc8A4QciBWyoGz16rwNgaML5eWKpctYZL3N+TWLX0gvtuP0HHk2n16JDyxXmVhfU0qywbJbr5GSuXKxA/sV5Y9UYWdnjwyS3qKKgarWA69Wg6fjQOIK0HadnIjPVFB+AiME4AuiUkCFnESyCSkmAuU7Cjm15wX+2X2ifBRn9A8mKcW2UFjULVQcgVDl80u40SYh763FfvquhLCxitoBYUsoJfjXKttByMq9CKcHn4sPuCbgXNJwyWkECcz5Q376UX3LNncZyQAAADEklEQVT9fFgIJs6lBBwtn3Tt6FpIz4RWnuQxPh2XIGzm4CwQ9hWIFgBTK0gQHiIAJddKq0ELQh+KL1qUR4MvSEsoENIKrgALHNiMox+94K7tl9qnnMio8MSf6SNwGpYVjCDk/Ju7isq496fCqX0BkDeqlWwKwic1gAQSpzGREnFgREz01eALLvvq2Kfi45m6cf3qBXdsfxRbJMho8dimqOhEK8cXQRr9QVpvPoDNMXQP9A3ACELFxPh+jACkP0fLIKFCCRRqKuPUdqjlC9o07JZwKVNHeBC94DQcZO0XAAkmgotAk9QYrR9f/BvByYfMSATDVMzwTXMM3QMDAVAgVHCZ7/MaQK4QZUHiNCbBQlqUw74YCb7gcmYkelC9YFlwvVv7RRAorTuBkECU9asCID9/x9B935zYzyKkqpfiNHxcA0gLQgvBAaPVkCqm3h2AtC5m/RyEqzw/4xhGL3hD++MmslgqCbgUfLKAcRrmTlBzDN0DA1tAXUlWcDm1IOIIJAjlT/Fd05lbFQFwjdtgGcewesFt7Rc/Gx8iWjUCjGCT1YvWT1MwgUqrf3NG45tTbcu0aximWx9xENcEQHGbcYAEwtSXSqY0gnCdgeuMI0cvuGx/FUGgFhwEYrR80QckWN+X0fjm1DwAWv8RgJFilJZBznz0pQg+AZAAlVWh1GvGka0XzB0cCQi30aSGVa9AF62fLOB7MhrfnJoPwPER59Px+o3e76mL5Kwp2G57xPl0kxc3er+nLvyKtLmhfUC78RHn081ONnq/pzcAR5xPR9mRRu/31IVgvgUccT4dNaobvd/TGYAjzqejumqj93s6A3DE+XRUg2VSCjdaGr3fUw+I+VPwiPPpqJjO8J1Nw43e7ymHwHoAKMFd7QErAeEE5NNJMb3R+z3lsGcNzgfgiPPpomJ6o/d76oGwPgCOKJ8uKqY3er+nKwBHmE+noqRG7/fUA199U/AI8+kEwEbv93QHoEhZTnA+nYqSGr3fBoAtaiqBUImdm5hPJwA2er+nKwBHnE+X1gUzSbnR+z11wPj/AeCpPDD3t7rvAAAAAElFTkSuQmCC";
/**
* Subpixel Morphological Antialiasing (SMAA) v2.8.
*
* Preset: SMAA 1x Medium (with color edge detection).
* https://github.com/iryoku/smaa/releases/tag/v2.8
*/
var SMAAPass =
/*#__PURE__*/
function (_Pass) {
/**
* Constructs a new SMAA pass.
*
* @param {Image} searchImage - The SMAA search image. Preload this image using the {@link searchImageDataURL}.
* @param {Image} areaImage - The SMAA area image. Preload this image using the {@link areaImageDataURL}.
*/
function SMAAPass(searchImage, areaImage) {
var _this;
classCallCheck(this, SMAAPass);
_this = possibleConstructorReturn(this, getPrototypeOf$2(SMAAPass).call(this, "SMAAPass"));
/**
* A clear pass for the color edges buffer.
*
* @type {ClearPass}
* @private
*/
_this.clearPass = new ClearPass({
clearColor: new Color(0x000000),
clearAlpha: 1.0
});
/**
* A render target for the color edge detection.
*
* @type {WebGLRenderTarget}
* @private
*/
_this.renderTargetColorEdges = new WebGLRenderTarget(1, 1, {
minFilter: LinearFilter,
format: RGBFormat,
stencilBuffer: false,
depthBuffer: false
});
_this.renderTargetColorEdges.texture.name = "SMAA.ColorEdges";
_this.renderTargetColorEdges.texture.generateMipmaps = false;
/**
* A render target for the SMAA weights.
*
* @type {WebGLRenderTarget}
* @private
*/
_this.renderTargetWeights = _this.renderTargetColorEdges.clone();
_this.renderTargetWeights.texture.name = "SMAA.Weights";
_this.renderTargetWeights.texture.format = RGBAFormat;
/**
* Color edge detection shader material.
*
* @type {ColorEdgesMaterial}
* @private
*/
_this.colorEdgesMaterial = new ColorEdgesMaterial();
/**
* SMAA weights shader material.
*
* @type {SMAAWeightsMaterial}
* @private
*/
_this.weightsMaterial = new SMAAWeightsMaterial();
_this.weightsMaterial.uniforms.tDiffuse.value = _this.renderTargetColorEdges.texture;
/**
* The SMAA search texture.
*
* @type {Texture}
* @private
*/
_this.searchTexture = new Texture(searchImage);
_this.searchTexture.name = "SMAA.Search";
_this.searchTexture.magFilter = NearestFilter;
_this.searchTexture.minFilter = NearestFilter;
_this.searchTexture.format = RGBAFormat;
_this.searchTexture.generateMipmaps = false;
_this.searchTexture.needsUpdate = true;
_this.searchTexture.flipY = false;
_this.weightsMaterial.uniforms.tSearch.value = _this.searchTexture;
/**
* The SMAA area texture.
*
* @type {Texture}
* @private
*/
_this.areaTexture = new Texture(areaImage);
_this.areaTexture.name = "SMAA.Area";
_this.areaTexture.minFilter = LinearFilter;
_this.areaTexture.format = RGBAFormat;
_this.areaTexture.generateMipmaps = false;
_this.areaTexture.needsUpdate = true;
_this.areaTexture.flipY = false;
_this.weightsMaterial.uniforms.tArea.value = _this.areaTexture;
/**
* SMAA blend shader material.
*
* @type {SMAABlendMaterial}
* @private
*/
_this.blendMaterial = new SMAABlendMaterial();
_this.blendMaterial.uniforms.tWeights.value = _this.renderTargetWeights.texture;
return _this;
}
/**
* Renders the effect.
*
* @param {WebGLRenderer} renderer - The renderer.
* @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.
* @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.
* @param {Number} [delta] - The time between the last frame and the current one in seconds.
* @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.
*/
createClass(SMAAPass, [{
key: "render",
value: function render(renderer, inputBuffer, outputBuffer, delta, stencilTest) {
// Detect color edges.
this.material = this.colorEdgesMaterial;
this.colorEdgesMaterial.uniforms.tDiffuse.value = inputBuffer.texture;
this.clearPass.render(renderer, this.renderTargetColorEdges);
renderer.render(this.scene, this.camera, this.renderTargetColorEdges); // Compute edge weights.
this.material = this.weightsMaterial;
renderer.render(this.scene, this.camera, this.renderTargetWeights); // Apply the antialiasing filter to the colors.
this.material = this.blendMaterial;
this.blendMaterial.uniforms.tDiffuse.value = inputBuffer.texture;
renderer.render(this.scene, this.camera, this.renderToScreen ? null : outputBuffer);
}
/**
* Updates the size of this pass.
*
* @param {Number} width - The width.
* @param {Number} height - The height.
*/
}, {
key: "setSize",
value: function setSize(width, height) {
this.renderTargetColorEdges.setSize(width, height);
this.renderTargetWeights.setSize(width, height);
this.colorEdgesMaterial.uniforms.texelSize.value.copy(this.weightsMaterial.uniforms.texelSize.value.copy(this.blendMaterial.uniforms.texelSize.value.set(1.0 / width, 1.0 / height)));
}
/**
* The SMAA search image, encoded as a base64 data URL.
*
* Use this image data to create an Image instance and use it together with
* the area image to create an SMAAPass.
*
* @type {String}
* @example
* const searchImage = new Image();
* searchImage.addEventListener("load", progress);
* searchImage.src = SMAAPass.searchImageDataURL;
*/
}], [{
key: "searchImageDataURL",
get: function get() {
return searchImageDataURL;
}
/**
* The SMAA area image, encoded as a base64 data URL.
*
* Use this image data to create an Image instance and use it together with
* the search image to create an SMAAPass.
*
* @type {String}
* @example
* const areaImage = new Image();
* areaImage.addEventListener("load", progress);
* areaImage.src = SMAAPass.areaImageDataURL;
*/
}, {
key: "areaImageDataURL",
get: function get() {
return areaImageDataURL;
}
}]);
inherits(SMAAPass, _Pass);
return SMAAPass;
}(Pass);
/**
* A pass that renders a given texture.
*/
var TexturePass =
/*#__PURE__*/
function (_Pass) {
/**
* Constructs a new texture pass.
*
* @param {Texture} texture - The texture.
* @param {Number} [opacity=1.0] - The texture opacity.
* @param {Boolean} [screenMode=true] - Whether the screen blend mode should be used for combining the texture with the scene colors.
*/
function TexturePass(texture) {
var _this;
var opacity = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1.0;
var screenMode = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
classCallCheck(this, TexturePass);
_this = possibleConstructorReturn(this, getPrototypeOf$2(TexturePass).call(this, "TexturePass"));
_this.material = new CombineMaterial(screenMode);
_this.texture = texture;
_this.opacitySource = opacity;
return _this;
}
/**
* The texture.
*
* @type {Texture}
*/
createClass(TexturePass, [{
key: "render",
/**
* Renders the effect.
*
* @param {WebGLRenderer} renderer - The renderer.
* @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.
* @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.
* @param {Number} [delta] - The time between the last frame and the current one in seconds.
* @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.
*/
value: function render(renderer, inputBuffer, outputBuffer, delta, stencilTest) {
this.material.uniforms.texture1.value = inputBuffer.texture;
renderer.render(this.scene, this.camera, this.renderToScreen ? null : outputBuffer);
}
}, {
key: "texture",
get: function get() {
return this.material.uniforms.texture2.value;
}
/**
* @type {Texture}
*/
,
set: function set(value) {
this.material.uniforms.texture2.value = value;
}
/**
* The opacity of the input buffer.
*
* The destination color is the color from the image in the input buffer.
*
* @type {Number}
*/
}, {
key: "opacityDestination",
get: function get() {
return this.material.uniforms.opacity1.value;
}
/**
* @type {Number}
*/
,
set: function set() {
var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1.0;
this.material.uniforms.opacity1.value = value;
}
/**
* The opacity of the texture.
*
* The source color is the color from the texture.
*
* @type {Number}
*/
}, {
key: "opacitySource",
get: function get() {
return this.material.uniforms.opacity2.value;
}
/**
* @type {Number}
*/
,
set: function set() {
var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1.0;
this.material.uniforms.opacity2.value = value;
}
}]);
inherits(TexturePass, _Pass);
return TexturePass;
}(Pass);
/**
* A tone mapping pass that supports adaptive luminosity.
*
* If adaptivity is enabled, this pass generates a texture that represents the
* luminosity of the current scene and adjusts it over time to simulate the
* optic nerve responding to the amount of light it is receiving.
*
* Reference:
* GDC2007 - Wolfgang Engel, Post-Processing Pipeline
* http://perso.univ-lyon1.fr/jean-claude.iehl/Public/educ/GAMA/2007/gdc07/Post-Processing_Pipeline.pdf
*/
var ToneMappingPass =
/*#__PURE__*/
function (_Pass) {
/**
* Constructs a new tone mapping pass.
*
* @param {Object} [options] - The options.
* @param {Boolean} [options.adaptive=true] - Whether the tone mapping should use an adaptive luminance map.
* @param {Number} [options.resolution=256] - The render texture resolution.
* @param {Number} [options.distinction=1.0] - A luminance distinction factor.
*/
function ToneMappingPass() {
var _this;
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
classCallCheck(this, ToneMappingPass);
_this = possibleConstructorReturn(this, getPrototypeOf$2(ToneMappingPass).call(this, "ToneMappingPass"));
/**
* The render target for the current luminosity.
*
* @type {WebGLRenderTarget}
* @private
* @todo Use RED format in WebGL 2.0.
*/
_this.renderTargetLuminosity = new WebGLRenderTarget(1, 1, {
minFilter: LinearMipMapLinearFilter,
magFilter: LinearFilter,
format: RGBFormat,
stencilBuffer: false,
depthBuffer: false
});
_this.renderTargetLuminosity.texture.name = "ToneMapping.Luminosity";
/**
* The render target for adapted luminosity.
*
* @type {WebGLRenderTarget}
* @private
*/
_this.renderTargetAdapted = _this.renderTargetLuminosity.clone();
_this.renderTargetAdapted.texture.name = "ToneMapping.AdaptedLuminosity";
_this.renderTargetAdapted.texture.generateMipmaps = false;
_this.renderTargetAdapted.texture.minFilter = LinearFilter;
/**
* A render target that holds a copy of the adapted limonosity.
*
* @type {WebGLRenderTarget}
* @private
*/
_this.renderTargetPrevious = _this.renderTargetAdapted.clone();
_this.renderTargetPrevious.texture.name = "ToneMapping.PreviousLuminosity";
/**
* Copy shader material used for saving the luminance map.
*
* @type {CopyMaterial}
* @private
*/
_this.copyMaterial = new CopyMaterial();
/**
* A luminosity shader material.
*
* @type {LuminosityMaterial}
* @private
*/
_this.luminosityMaterial = new LuminosityMaterial();
_this.luminosityMaterial.uniforms.distinction.value = options.distinction !== undefined ? options.distinction : 1.0;
/**
* An adaptive luminance shader material.
*
* @type {AdaptiveLuminosityMaterial}
* @private
*/
_this.adaptiveLuminosityMaterial = new AdaptiveLuminosityMaterial();
_this.resolution = options.resolution;
/**
* A tone mapping shader material.
*
* @type {ToneMappingMaterial}
* @private
*/
_this.toneMappingMaterial = new ToneMappingMaterial();
_this.adaptive = options.adaptive;
return _this;
}
/**
* The resolution of the render targets.
*
* @type {Number}
*/
createClass(ToneMappingPass, [{
key: "render",
/**
* Renders the effect.
*
* @param {WebGLRenderer} renderer - The renderer.
* @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.
* @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.
* @param {Number} [delta] - The time between the last frame and the current one in seconds.
* @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.
*/
value: function render(renderer, inputBuffer, outputBuffer, delta, stencilTest) {
var scene = this.scene;
var camera = this.camera;
var adaptiveLuminosityMaterial = this.adaptiveLuminosityMaterial;
var luminosityMaterial = this.luminosityMaterial;
var toneMappingMaterial = this.toneMappingMaterial;
var copyMaterial = this.copyMaterial;
var renderTargetPrevious = this.renderTargetPrevious;
var renderTargetLuminosity = this.renderTargetLuminosity;
var renderTargetAdapted = this.renderTargetAdapted;
if (this.adaptive) {
// Render the luminance of the current scene into a render target with mipmapping enabled.
this.material = luminosityMaterial;
luminosityMaterial.uniforms.tDiffuse.value = inputBuffer.texture;
renderer.render(scene, camera, renderTargetLuminosity); // Use the new luminance values, the previous luminance and the frame delta to adapt the luminance over time.
this.material = adaptiveLuminosityMaterial;
adaptiveLuminosityMaterial.uniforms.delta.value = delta;
adaptiveLuminosityMaterial.uniforms.tPreviousLum.value = renderTargetPrevious.texture;
adaptiveLuminosityMaterial.uniforms.tCurrentLum.value = renderTargetLuminosity.texture;
renderer.render(scene, camera, renderTargetAdapted); // Copy the new adapted luminance value so that it can be used by the next frame.
this.material = copyMaterial;
copyMaterial.uniforms.tDiffuse.value = renderTargetAdapted.texture;
renderer.render(scene, camera, renderTargetPrevious);
} // Apply the tone mapping to the colours.
this.material = toneMappingMaterial;
toneMappingMaterial.uniforms.tDiffuse.value = inputBuffer.texture;
renderer.render(this.scene, this.camera, this.renderToScreen ? null : outputBuffer);
}
/**
* Performs initialization tasks.
*
* @param {WebGLRenderer} renderer - The renderer.
* @param {Boolean} alpha - Whether the renderer uses the alpha channel or not.
*/
}, {
key: "initialize",
value: function initialize(renderer, alpha) {
this.material = new MeshBasicMaterial({
color: 0x7fffff
});
renderer.render(this.scene, this.camera, this.renderTargetPrevious);
this.material.dispose();
}
}, {
key: "resolution",
get: function get() {
return this.renderTargetLuminosity.width;
}
/**
* The resolution of the render targets. Must be a power of two for mipmaps.
*
* @type {Number}
*/
,
set: function set() {
var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 256;
// Round the given value to the next power of two.
var exponent = Math.max(0, Math.ceil(Math.log2(value)));
value = Math.pow(2, exponent);
this.renderTargetLuminosity.setSize(value, value);
this.renderTargetPrevious.setSize(value, value);
this.renderTargetAdapted.setSize(value, value);
this.adaptiveLuminosityMaterial.defines.MIP_LEVEL_1X1 = exponent.toFixed(1);
this.adaptiveLuminosityMaterial.needsUpdate = true;
}
/**
* Whether this pass uses adaptive luminosity.
*
* @type {Boolean}
* @default true
*/
}, {
key: "adaptive",
get: function get() {
return this.toneMappingMaterial.defines.ADAPTED_LUMINANCE !== undefined;
}
/**
* Whether this pass should use adaptive luminosity.
*
* @type {Boolean}
*/
,
set: function set() {
var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
if (value) {
this.toneMappingMaterial.defines.ADAPTED_LUMINANCE = "1";
this.toneMappingMaterial.uniforms.luminanceMap.value = this.renderTargetAdapted.texture;
} else {
delete this.toneMappingMaterial.defines.ADAPTED_LUMINANCE;
this.toneMappingMaterial.uniforms.luminanceMap.value = null;
}
this.toneMappingMaterial.needsUpdate = true;
}
/**
* Indicates whether dithering is enabled.
*
* @type {Boolean}
*/
}, {
key: "dithering",
get: function get() {
return this.toneMappingMaterial.dithering;
}
/**
* If enabled, the result will be dithered to remove banding artifacts.
*
* @type {Boolean}
*/
,
set: function set(value) {
if (this.dithering !== value) {
this.toneMappingMaterial.dithering = value;
this.toneMappingMaterial.needsUpdate = true;
}
}
}]);
inherits(ToneMappingPass, _Pass);
return ToneMappingPass;
}(Pass);
/**
* A compilation of the post processing passes.
*
* @module postprocessing/passes
*/
/**
* The EffectComposer may be used in place of a normal WebGLRenderer.
*
* The auto clear behaviour of the provided renderer will be disabled to prevent
* unnecessary clear operations.
*
* It is common practice to use a {@link RenderPass} as the first pass to
* automatically clear the screen and render the scene to a texture for further
* processing.
*
* @implements {Resizable}
* @implements {Disposable}
*/
var EffectComposer =
/*#__PURE__*/
function () {
/**
* Constructs a new effect composer.
*
* @param {WebGLRenderer} [renderer] - The renderer that should be used.
* @param {Object} [options] - The options.
* @param {Boolean} [options.depthBuffer=true] - Whether the main render targets should have a depth buffer.
* @param {Boolean} [options.stencilBuffer=false] - Whether the main render targets should have a stencil buffer.
* @param {Boolean} [options.depthTexture=false] - Set to true if one of your passes relies on a depth texture.
*/
function EffectComposer() {
var renderer = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
classCallCheck(this, EffectComposer);
/**
* The renderer.
*
* You may replace the renderer at any time by using
* {@link EffectComposer#replaceRenderer}.
*
* @type {WebGLRenderer}
*/
this.renderer = renderer;
/**
* The input buffer.
*
* Reading from and writing to the same render target should be avoided.
* Therefore, two seperate yet identical buffers are used.
*
* @type {WebGLRenderTarget}
* @private
*/
this.inputBuffer = null;
/**
* The output buffer.
*
* @type {WebGLRenderTarget}
* @private
*/
this.outputBuffer = null;
if (this.renderer !== null) {
this.renderer.autoClear = false;
this.inputBuffer = this.createBuffer(options.depthBuffer !== undefined ? options.depthBuffer : true, options.stencilBuffer !== undefined ? options.stencilBuffer : false, options.depthTexture !== undefined ? options.depthTexture : false);
this.outputBuffer = this.inputBuffer.clone();
}
/**
* A copy pass used for copying masked scenes.
*
* @type {ShaderPass}
* @private
*/
this.copyPass = new ShaderPass(new CopyMaterial());
/**
* The passes.
*
* @type {Pass[]}
* @private
*/
this.passes = [];
}
/**
* The depth texture of the input and output buffers.
*
* @type {DepthTexture}
*/
createClass(EffectComposer, [{
key: "replaceRenderer",
/**
* Replaces the current renderer with the given one. The DOM element of the
* current renderer will automatically be removed from its parent node and the
* DOM element of the new renderer will take its place.
*
* The auto clear mechanism of the provided renderer will be disabled.
*
* Switching between renderers allows you to dynamically enable or disable
* antialiasing.
*
* @param {WebGLRenderer} renderer - The new renderer.
* @return {WebGLRenderer} The old renderer.
*/
value: function replaceRenderer(renderer) {
var oldRenderer = this.renderer;
var parent, oldSize, newSize;
if (oldRenderer !== null && oldRenderer !== renderer) {
this.renderer = renderer;
this.renderer.autoClear = false;
parent = oldRenderer.domElement.parentNode;
oldSize = oldRenderer.getSize();
newSize = renderer.getSize();
if (parent !== null) {
parent.removeChild(oldRenderer.domElement);
parent.appendChild(renderer.domElement);
}
if (oldSize.width !== newSize.width || oldSize.height !== newSize.height) {
this.setSize();
}
}
return oldRenderer;
}
/**
* Creates a new render target by replicating the renderer's canvas.
*
* The created render target uses a linear filter for texel minification and
* magnification. Its render texture format depends on whether the renderer
* uses the alpha channel. Mipmaps are disabled.
*
* @param {Boolean} depthBuffer - Whether the render target should have a depth buffer.
* @param {Boolean} stencilBuffer - Whether the render target should have a stencil buffer.
* @param {Boolean} depthTexture - Whether the render target should have a depth texture.
* @return {WebGLRenderTarget} A new render target that equals the renderer's canvas.
*/
}, {
key: "createBuffer",
value: function createBuffer(depthBuffer, stencilBuffer, depthTexture) {
var drawingBufferSize = this.renderer.getDrawingBufferSize();
var alpha = this.renderer.context.getContextAttributes().alpha;
var renderTarget = new WebGLRenderTarget(drawingBufferSize.width, drawingBufferSize.height, {
minFilter: LinearFilter,
magFilter: LinearFilter,
format: alpha ? RGBAFormat : RGBFormat,
depthBuffer: depthBuffer,
stencilBuffer: stencilBuffer,
depthTexture: depthTexture ? new DepthTexture() : null
});
if (depthTexture && stencilBuffer) {
renderTarget.depthTexture.format = DepthStencilFormat;
renderTarget.depthTexture.type = UnsignedInt248Type;
}
renderTarget.texture.name = "EffectComposer.Buffer";
renderTarget.texture.generateMipmaps = false;
return renderTarget;
}
/**
* Adds a pass, optionally at a specific index.
*
* @param {Pass} pass - A new pass.
* @param {Number} [index] - An index at which the pass should be inserted.
*/
}, {
key: "addPass",
value: function addPass(pass, index) {
var renderer = this.renderer;
var drawingBufferSize = renderer.getDrawingBufferSize();
pass.setSize(drawingBufferSize.width, drawingBufferSize.height);
pass.initialize(renderer, renderer.context.getContextAttributes().alpha);
if (index !== undefined) {
this.passes.splice(index, 0, pass);
} else {
this.passes.push(pass);
}
}
/**
* Removes a pass.
*
* @param {Pass} pass - The pass.
*/
}, {
key: "removePass",
value: function removePass(pass) {
this.passes.splice(this.passes.indexOf(pass), 1);
}
/**
* Renders all enabled passes in the order in which they were added.
*
* @param {Number} delta - The time between the last frame and the current one in seconds.
*/
}, {
key: "render",
value: function render(delta) {
var passes = this.passes;
var copyPass = this.copyPass;
var renderer = this.renderer;
var inputBuffer = this.inputBuffer;
var outputBuffer = this.outputBuffer;
var stencilTest = false;
var pass, context, state, buffer;
var i, l;
for (i = 0, l = passes.length; i < l; ++i) {
pass = passes[i];
if (pass.enabled) {
pass.render(renderer, inputBuffer, outputBuffer, delta, stencilTest);
if (pass.needsSwap) {
if (stencilTest) {
copyPass.renderToScreen = pass.renderToScreen;
context = renderer.context;
state = renderer.state; // Preserve the unaffected pixels.
state.buffers.stencil.setFunc(context.NOTEQUAL, 1, 0xffffffff);
copyPass.render(renderer, inputBuffer, outputBuffer, delta, stencilTest);
state.buffers.stencil.setFunc(context.EQUAL, 1, 0xffffffff);
}
buffer = inputBuffer;
inputBuffer = outputBuffer;
outputBuffer = buffer;
}
if (pass instanceof MaskPass) {
stencilTest = true;
} else if (pass instanceof ClearMaskPass) {
stencilTest = false;
}
}
}
}
/**
* Sets the size of the buffers and the renderer's output canvas.
*
* Every pass will be informed of the new size. It's up to each pass how that
* information is used.
*
* If no width or height is specified, the render targets and passes will be
* updated with the current size of the renderer.
*
* @param {Number} [width] - The width.
* @param {Number} [height] - The height.
*/
}, {
key: "setSize",
value: function setSize(width, height) {
var passes = this.passes;
var renderer = this.renderer;
var size, drawingBufferSize;
var i, l;
if (width === undefined || height === undefined) {
size = renderer.getSize();
width = size.width;
height = size.height;
} // Update the logical render size.
renderer.setSize(width, height); // The drawing buffer size takes the device pixel ratio into account.
drawingBufferSize = renderer.getDrawingBufferSize();
this.inputBuffer.setSize(drawingBufferSize.width, drawingBufferSize.height);
this.outputBuffer.setSize(drawingBufferSize.width, drawingBufferSize.height);
for (i = 0, l = passes.length; i < l; ++i) {
passes[i].setSize(drawingBufferSize.width, drawingBufferSize.height);
}
}
/**
* Resets this composer by deleting all passes and creating new buffers.
*/
}, {
key: "reset",
value: function reset() {
var renderTarget = this.createBuffer(this.inputBuffer.depthBuffer, this.inputBuffer.stencilBuffer, this.inputBuffer.depthTexture !== null);
this.dispose(); // Reanimate.
this.inputBuffer = renderTarget;
this.outputBuffer = renderTarget.clone();
this.copyPass = new ShaderPass(new CopyMaterial());
}
/**
* Destroys this composer and all passes.
*
* This method deallocates all disposable objects created by the passes. It
* also deletes the main frame buffers of this composer.
*/
}, {
key: "dispose",
value: function dispose() {
var passes = this.passes;
var i, l;
for (i = 0, l = passes.length; i < l; ++i) {
passes[i].dispose();
}
this.passes = [];
if (this.inputBuffer !== null) {
this.inputBuffer.dispose();
this.inputBuffer = null;
}
if (this.outputBuffer !== null) {
this.outputBuffer.dispose();
this.outputBuffer = null;
}
this.copyPass.dispose();
}
}, {
key: "depthTexture",
get: function get() {
return this.inputBuffer.depthTexture;
}
/**
* The input and output buffers share a single depth texture. Depth will be
* written to this texture when something is rendered into one of the buffers
* and the involved materials have depth write enabled.
*
* You may enable this mechanism during the instantiation of the composer or
* by assigning a DepthTexture instance later on. You may also disable it by
* assigning null.
*
* @type {DepthTexture}
*/
,
set: function set(x) {
this.inputBuffer.depthTexture = x;
this.outputBuffer.depthTexture = x;
}
}]);
return EffectComposer;
}();
var polyfill = function polyfill(object, method) {
var showWarn = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
if (object[method]) return;
if (showWarn) console.warn("@PostProcessorModule: pass.".concat(method, "() was not found."), object);
object[method] = function () {};
};
/**
* @class PostProcessorModule
* @category modules/app
* @param {Object} [params]
* @memberof module:modules/app
* @example <caption> Creating a rendering module and passing it to App's modules</caption>
* new App([
* new ElementModule(),
* new SceneModule(),
* new DefineModule('camera', new WHS.PerspectiveCamera({
* position: new THREE.Vector3(0, 6, 18),
* far: 10000
* })),
* new RenderingModule(),
* new PostProcessorModule()
* ]);
*
* const processor = app.use('postprocessor');
*
* processor
* .render()
* .pass(new GlitchPass())
* .renderToScreen()
*/
var PostProcessorModule =
/*#__PURE__*/
function () {
function PostProcessorModule() {
var _this = this;
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : PostProcessorModule.defaults;
classCallCheck(this, PostProcessorModule);
defineProperty$3(defineProperty$3(this, "currentPass", null), "defer", new Promise(function (resolve) {
_this.resolve = resolve;
}));
this.debug = params.debug;
this.params = params;
}
createClass(PostProcessorModule, [{
key: "manager",
value: function manager(_manager) {
var _this2 = this;
_manager.define('postprocessor');
this.effects = _manager.use('rendering').effects;
this.renderer = _manager.get('renderer');
this.scene = _manager.get('scene');
this.camera = _manager.get('camera');
this.composer = new EffectComposer(this.renderer, this.params);
_manager.use('rendering').stop();
var composer = this.composer;
this.renderLoop = new Loop(function (clock) {
return composer.render(clock.getDelta());
}).start(_manager.handler);
_manager.update({
renderer: function renderer(_renderer) {
_this2.composer.replaceRenderer(_renderer);
},
scene: function scene(_scene) {
_this2.scene = _scene;
},
camera: function camera(_camera) {
_this2.camera = _camera;
}
});
this.resolve();
}
/**
* @method render
* @description Adds RenderPass
* @return {this}
* @memberof module:modules/app.PostProcessorModule
*/
}, {
key: "render",
value: function render() {
var _this3 = this;
this.defer.then(function () {
var pass = new RenderPass(_this3.scene, _this3.camera.native); // TODO: Support for effects.
_this3.composer.addPass(pass);
_this3.currentPass = pass;
});
return this;
}
/**
* @method pass
* @description Adds your custom pass
* @param {Pass} pass A custom pass
* @return {this}
* @memberof module:modules/app.PostProcessorModule
*/
}, {
key: "pass",
value: function pass(_pass) {
var _this4 = this;
this.defer.then(function () {
polyfill(_pass, 'setSize', _this4.debug);
polyfill(_pass, 'initialise', _this4.debug);
_this4.composer.addPass(_pass);
_this4.currentPass = _pass;
});
return this;
}
/**
* @method shader
* @description Adds a pass made from shader material
* @param {Material} material A ShaderMaterial
* @param {String} textureID Name of the readBuffer uniform
* @return {this}
* @memberof module:modules/app.PostProcessorModule
*/
}, {
key: "shader",
value: function shader(material) {
var _this5 = this;
var textureID = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'readBuffer';
this.defer.then(function () {
if (!material.uniforms[textureID]) material.uniforms[textureID] = {
value: null
};
var pass = new ShaderPass(material, textureID);
_this5.composer.addPass(pass);
_this5.currentPass = pass;
});
return this;
}
/**
* @method get
* @description Returns a pass by the given name
* @param {String} name The name of the pass
* @return {this}
* @memberof module:modules/app.PostProcessorModule
*/
}, {
key: "get",
value: function get(name) {
return name ? this.composer.passes.filter(function (pass) {
return pass.name === name;
})[0] : this.currentPass;
}
/**
* @method renderToScreen
* @description Sets the renderToScreen property of currentPass
* @param {String} [name=true] The name of the pass
* @return {this}
* @memberof module:modules/app.PostProcessorModule
*/
}, {
key: "renderToScreen",
value: function renderToScreen() {
var _this6 = this;
var bool = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
this.defer.then(function () {
_this6.currentPass.renderToScreen = bool;
});
return this;
}
}]);
return PostProcessorModule;
}();
defineProperty$3(PostProcessorModule, "defaults", {
debug: true
});
/**
* @class EventsPatchModule
* @description This one is used in the core to handle events used by modules. If you want to make custom events - please make a similar one.
* @category modules/app
* @memberof module:modules/app
*/
var EventsPatchModule =
/*#__PURE__*/
function () {
function EventsPatchModule() {
classCallCheck(this, EventsPatchModule);
}
createClass(EventsPatchModule, [{
key: "manager",
value: function manager(_manager) {
_manager.define('events');
this.element = _manager.get('renderer').domElement;
}
/**
* @function patchEvents
* @description This methods patches the list of events on specific object.
* @param {Number} originObject - The object that gives events.
* @param {Number} [destObject=this] - The object that takes events.
* @param {Array[Strings]} [events=[]] - The list of events by names.
* @memberof module:modules/app.EventsPatchModule
*/
}, {
key: "patchEvents",
value: function patchEvents(originObject) {
var destObject = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this;
var events = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
events.forEach(function (event) {
return originObject.addEventListener(event, function (e) {
return destObject.emit(event, e);
});
});
}
}, {
key: "integrate",
value: function integrate(self) {
var element = self.element,
patchEvents = self.patchEvents;
patchEvents(element, this, ['mousemove', 'mouseup', 'contextmenu', 'mousedown', 'click', 'wheel', 'touchstart', 'touchend', 'touchmove', 'keydown', 'keyup', 'keypress']);
}
}]);
return EventsPatchModule;
}();
/**
* @class VirtualMouseModule
* @category modules/app
* @param {Boolean} [globalMovement=false]
* @memberof module:modules/app
* @extends Events
*/
var VirtualMouseModule =
/*#__PURE__*/
function (_Events) {
function VirtualMouseModule() {
var _this;
var globalMovement = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
classCallCheck(this, VirtualMouseModule);
_this = possibleConstructorReturn(this, getPrototypeOf$2(VirtualMouseModule).call(this));
defineProperty$3(defineProperty$3(defineProperty$3(defineProperty$3(defineProperty$3(assertThisInitialized(assertThisInitialized(_this)), "mouse", new Vector2()), "raycaster", new Raycaster()), "world", null), "canvas", null), "projectionPlane", new Plane(new Vector3(0, 0, 1), 0));
_this.globalMovement = globalMovement;
return _this;
}
createClass(VirtualMouseModule, [{
key: "update",
value: function update(e, customX, customY) {
var rect = this.canvas.getBoundingClientRect();
var x = customX || e.clientX;
var y = customY || e.clientY;
this.mouse.x = (x - rect.left) / (rect.right - rect.left) * 2 - 1;
this.mouse.y = -((y - rect.top) / (rect.bottom - rect.top)) * 2 + 1;
this.projectionPlane.normal.copy(this.camera.getWorldDirection());
this.raycaster.setFromCamera(this.mouse, this.camera);
this.emit('move');
}
}, {
key: "manager",
value: function manager(_manager) {
_manager.define('mouse');
_manager.require('events', function () {
return new EventsPatchModule();
});
this.canvas = _manager.get('renderer').domElement;
this.camera = _manager.get('camera').native;
}
}, {
key: "integrate",
value: function integrate(self) {
var _this2 = this;
['click', 'mousedown', 'mouseup', 'mousemove'].forEach(function (ev) {
return _this2.on(ev, function (e) {
return self.emit(ev, e);
});
});
self.globalX = 0;
self.globalY = 0;
this.on('mousemove', function (e) {
if (document.pointerLockElement !== null) {
self.globalX += e.movementX;
self.globalY += e.movementY;
self.update(e, self.globalX, self.globalY);
} else self.update(e);
});
}
/**
* @method track
* @description Starts tracking events on a component
* @param {Component} component A component, that should be tracked by the mouse
* @param {Boolean} nested Whether component's children should be tracked or not
* @memberof module:modules/app.VirtualMouseModule
*/
}, {
key: "track",
value: function track(component) {
var _this3 = this;
var nested = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
var isHovered = false;
this.on('move', function () {
if (_this3.hovers(component, nested)) {
if (isHovered) component.emit('mousemove');else {
component.emit('mouseover');
isHovered = true;
}
} else if (isHovered) {
component.emit('mouseout');
isHovered = false;
}
});
this.on('click', function () {
if (isHovered) component.emit('click');else component.emit('offClick');
});
this.on('mousedown', function () {
if (isHovered) component.emit('mousedown');
});
this.on('mouseup', function () {
if (isHovered) component.emit('mouseup');
});
}
/**
* @method intersection
* @description Returns an intersection data
* @param {Component} component A component that intersects with mouse ray (or doesn't)
* @param {Boolean} nested Whether component's children should be tracked or not
* @return {Array} intersection data.
* @memberof module:modules/app.VirtualMouseModule
*/
}, {
key: "intersection",
value: function intersection(_ref) {
var native = _ref.native;
var nested = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
if (native.children.length > 0 && nested) {
var objects = [];
native.traverse(function (child) {
return objects.push(child);
});
return this.raycaster.intersectObjects(objects);
}
return this.raycaster.intersectObject(native);
}
/**
* @method project
* @description Returns a vector based on mouse ray intersection with plane
* @param {THREE.Plane} [plane=this.projectionPlane] Math plane that is used
* @param {Vector3} [target] Optional target
* @return {Vector3} An intersection point.
* @memberof module:modules/app.VirtualMouseModule
*/
}, {
key: "project",
value: function project() {
var plane = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.projectionPlane;
var target = arguments.length > 1 ? arguments[1] : undefined;
return this.raycaster.ray.intersectPlane(plane, target);
}
/**
* @method hovers
* @description Returns a boolean based on intersection data (Whether mouse hovers the component)
* @param {Component} component A component that intersects with mouse ray (or doesn't)
* @param {Boolean} nested Whether component's children should be tracked or not
* @return {Boolean} Whether the component is hovered.
* @memberof module:modules/app.VirtualMouseModule
*/
}, {
key: "hovers",
value: function hovers(component) {
var nested = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
return this.intersection(component, nested).length > 0;
}
/**
* Mouse ray
* @member {THREE.Ray} module:modules/app.VirtualMouseModule#ray
* @public
*/
}, {
key: "ray",
get: function get() {
return this.raycaster.ray;
}
/**
* Mouse x [-1; 1]
* @member {Number} module:modules/app.VirtualMouseModule#x
* @public
*/
}, {
key: "x",
get: function get() {
return this.mouse.x;
}
/**
* Mouse y [-1; 1]
* @member {Number} module:modules/app.VirtualMouseModule#y
* @public
*/
}, {
key: "y",
get: function get() {
return this.mouse.y;
}
}]);
inherits(VirtualMouseModule, _Events);
return VirtualMouseModule;
}(minivents_commonjs);
/**
* @class ControlsModule
* @category modules/app
* @param {Object} [params]
* @memberof module:modules/app
* @example <caption> Creating a rendering module and passing it to App's modules</caption>
* new App([
* new ElementModule(),
* new SceneModule(),
* new DefineModule('camera', new WHS.PerspectiveCamera({
* position: new THREE.Vector3(0, 6, 18),
* far: 10000
* })),
* new RenderingModule(),
* new ControlsModule.from(new THREE.TrackballControls())
* ]);
*/
var ControlsModule =
/*#__PURE__*/
function () {
createClass(ControlsModule, null, [{
key: "from",
value: function from(controls) {
return new ControlsModule({
controls: controls
});
}
}]);
function ControlsModule() {
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
classCallCheck(this, ControlsModule);
this.params = Object.assign({
controls: false,
fix: function fix(controls) {
return controls;
},
update: function update(c) {
this.controls.update(c.getDelta());
}
}, params);
this.controls = this.params.controls;
this.update = this.params.update;
}
createClass(ControlsModule, [{
key: "manager",
value: function manager(_manager) {
_manager.define('controls');
_manager.require('events', function () {
return new EventsPatchModule();
});
}
/**
* @method setControls
* @description Set working controls
* @param {Object} controls Working three.js controls object.
* @return {this}
* @memberof module:modules/app.ControlsModule
*/
}, {
key: "setControls",
value: function setControls(controls) {
this.controls = controls;
return this;
}
/**
* @method setUpdate
* @description Set controls update function
* @param {Function} update Update function
* @return {this}
* @memberof module:modules/app.ControlsModule
*/
}, {
key: "setUpdate",
value: function setUpdate(update) {
this.update = update;
return this;
}
}, {
key: "integrate",
value: function integrate(self) {
self.updateLoop = new Loop(self.update.bind(self));
self.updateLoop.start(this);
}
}]);
return ControlsModule;
}();
/**
* @class FogModule
* @category modules/app
* @param {Object} [params={color: 0xefd1b5, density: 0.020, near: 10, far: 1000}] - The parameters object.
* @param {String} [type=exp2] - The type of fog - exp2 or linear
* @memberof module:modules/app
* @example <caption>How to create and apply a FogModule</caption>
* const fogModule = new FogModule({
* color: 0xffffff,
* density: 0.03,
* near: 20,
* far: 200
* }, 'exp2');
*
* new App([
* ...,
* fogModule
* ]);
*/
var FogModule =
/*#__PURE__*/
function () {
function FogModule() {
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var type = arguments.length > 1 ? arguments[1] : undefined;
classCallCheck(this, FogModule);
this.params = Object.assign({
color: 0xefd1b5,
density: 0.020,
near: 10,
far: 1000
}, params);
if (!type || type === 'exp2') this.fog = new FogExp2(this.params.color, this.params.density);else if (type === 'linear') this.fog = new Fog(this.params.color, this.params.near, this.params.far);
}
createClass(FogModule, [{
key: "manager",
value: function manager(_manager) {
_manager.set('fog', this.fog);
_manager.get('scene').fog = this.fog;
}
}]);
return FogModule;
}();
var isEqualDefault = function isEqualDefault(a, b) {
if (a === b) return true;else if (a && a.equals && a.equals(b)) return true;
return false;
};
/**
* @class StateModule
* @description `StateModule` is useful for apps, where you need state manipulation.
* This can be: _transitions between screens, games, development moments_.
* You can check [basic/state](https://whs-dev.surge.sh/examples/?basic/state) example.
* @category modules/app
* @param {Object} [params]
* @memberof module:modules/app
* @example <caption> Creating a state module</caption>
* new App([
* // ...
* new StateModule().default({
* sphereColor: 0xff0000
* })
* ]);
*/
var StateModule =
/*#__PURE__*/
function () {
createClass(StateModule, null, [{
key: "actionGenerate",
value: function actionGenerate(isEqual) {
return function () {
var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [{}, ''];
var _ref = arguments.length > 1 ? arguments[1] : undefined,
key = _ref.key,
data = _ref.data;
if (isEqual(state[0][key], data)) return state;
state[0][key] = data;
state[1] = key;
return state;
};
}
}]);
function StateModule() {
var equalCheck = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : isEqualDefault;
classCallCheck(this, StateModule);
this.store = createStore(StateModule.actionGenerate(equalCheck));
this.configuration = {};
this.currentConfig = 'default';
this.prevConfig = 'default';
}
/**
* @method default
* @description Add default configuration.
* @param {Object} data Configuration setup
* @memberof module:modules/app.StateModule
* @example
* new WHS.StateModule().default({
* sphereColor: UTILS.$colors.mesh,
* planeColor: 0x447F8B
* })
*/
createClass(StateModule, [{
key: "default",
value: function _default(data) {
this.config({
default: data
});
return this;
}
/**
* @method setEqualCheck
* @description Sets an equalCheck function
* @param {Function} func function to generate equal check
* @memberof module:modules/app.StateModule
*/
}, {
key: "setEqualCheck",
value: function setEqualCheck(func) {
this.store.replaceReducer(StateModule.actionGenerate(func));
}
}, {
key: "manager",
value: function manager(_manager) {
_manager.define('state');
}
/**
* @method config
* @description Load configurations from object.
* @param {Object} configs Configuration data
* @memberof module:modules/app.StateModule
* @example <caption> Adding `green` configuration</caption>
* state.config({
* green: {
* sphereColor: 0x00ff00,
* planeColor: 0x00ff00
* }
* });
*/
}, {
key: "config",
value: function config(configs) {
for (var key in configs) {
if (key) {
this.configuration[key] = key === 'default' ? configs[key] : Object.assign({}, this.configuration.default, configs[key]);
}
}
}
/**
* @method update
* @description Load updates from object.
* @param {Object} updates Updates data
* @memberof module:modules/app.StateModule
* @example <caption> Update callback for `sphereColor`</caption>
* state.update({
* sphereColor: color => sphere.material.color.setHex(color)
* });
*/
}, {
key: "update",
value: function update() {
var _this = this;
var updates = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
this.store.subscribe(function () {
var _this$store$getState = _this.store.getState(),
_this$store$getState2 = slicedToArray(_this$store$getState, 2),
data = _this$store$getState2[0],
changedKey = _this$store$getState2[1];
var callback = updates[changedKey];
if (callback) callback(data[changedKey]);
});
}
/**
* @method to
* @description Switch to configuration.
* @param {String} configName Configuration name.
* @memberof module:modules/app.StateModule
* @example <caption> Changes configuration to `green`</caption>
* state.to('green');
*/
}, {
key: "to",
value: function to(configName) {
this.prevConfig = this.currentConfig;
this.currentConfig = configName;
var config = this.configuration[configName] ? this.configuration[configName] : this.configuration.default;
this.set(config);
}
/**
* @method set
* @description Set current parameters.
* @param {Object} data Configuration parameters.
* @memberof module:modules/app.StateModule
* @example
* state.set({
* sphereColor: 0x00ff00
* });
*/
}, {
key: "set",
value: function set(data) {
for (var key in data) {
if (key) this.store.dispatch({
type: 'ADD',
key: key,
data: data[key]
});
}
}
/**
* @method get
* @description Return data of parameter.
* @param {String} key Parameter name.
* @memberof module:modules/app.StateModule
* @example
* state.get('sphereColor'); // 0x00ff00
*/
}, {
key: "get",
value: function get(key) {
return this.store.getState()[0][key];
}
/**
* @method prev
* @description Return `trueVal` if `config` match previous configuration, in other case - return `falseVal`.
* @param {String} config Configuration name.
* @param {Any} trueVal Value returned if condition is truthy.
* @param {Any} falseVal Value returned if condition is falsy.
* @memberof module:modules/app.StateModule
*/
}, {
key: "prev",
value: function prev(config, trueVal, falseVal) {
return this.prevConfig === config ? trueVal : falseVal;
}
/**
* @method current
* @description Return `trueVal` if `config` match current configuration, in other case - return `falseVal`.
* @param {String} config Configuration name.
* @param {Any} trueVal Value returned if condition is truthy.
* @param {Any} falseVal Value returned if condition is falsy.
* @memberof module:modules/app.StateModule
*/
}, {
key: "current",
value: function current(config, trueVal, falseVal) {
return this.currentConfig === config ? trueVal : falseVal;
}
}]);
return StateModule;
}();
// Unlike TrackballControls, it maintains the "up" direction object.up (+Y by default).
//
// Orbit - left mouse / touch: one finger move
// Zoom - middle mouse, or mousewheel / touch: two finger spread or squish
// Pan - right mouse, or arrow keys / touch: three finter swipe
var ThreeOrbitControls =
/*#__PURE__*/
function (_EventDispatcher) {
function ThreeOrbitControls(object, domElement, eventHandler) {
var _this;
classCallCheck(this, ThreeOrbitControls);
_this = possibleConstructorReturn(this, getPrototypeOf$2(ThreeOrbitControls).call(this));
_this.object = object;
_this.domElement = domElement === undefined ? document : domElement;
_this.eventHandler = eventHandler; // Set to false to disable this control
_this.enabled = true; // "target" sets the location of focus, where the object orbits around
_this.target = new Vector3(); // How far you can dolly in and out ( PerspectiveCamera only )
_this.minDistance = 0;
_this.maxDistance = Infinity; // How far you can zoom in and out ( OrthographicCamera only )
_this.minZoom = 0;
_this.maxZoom = Infinity; // How far you can orbit vertically, upper and lower limits.
// Range is 0 to Math.PI radians.
_this.minPolarAngle = 0; // radians
_this.maxPolarAngle = Math.PI; // radians
// How far you can orbit horizontally, upper and lower limits.
// If set, must be a sub-interval of the interval [ - Math.PI, Math.PI ].
_this.minAzimuthAngle = -Infinity; // radians
_this.maxAzimuthAngle = Infinity; // radians
// Set to true to enable damping (inertia)
// If damping is enabled, you must call controls.update() in your animation loop
_this.enableDamping = false;
_this.dampingFactor = 0.25; // This option actually enables dollying in and out; left as "zoom" for backwards compatibility.
// Set to false to disable zooming
_this.enableZoom = true;
_this.zoomSpeed = 1.0; // Set to false to disable rotating
_this.enableRotate = true;
_this.rotateSpeed = 1.0; // Set to false to disable panning
_this.enablePan = true;
_this.keyPanSpeed = 7.0; // pixels moved per arrow key push
// Set to true to automatically rotate around the target
// If auto-rotate is enabled, you must call controls.update() in your animation loop
_this.autoRotate = false;
_this.autoRotateSpeed = 2.0; // 30 seconds per round when fps is 60
// Set to false to disable use of the keys
_this.enableKeys = true; // The four arrow keys
_this.keys = {
LEFT: 37,
UP: 38,
RIGHT: 39,
BOTTOM: 40
}; // Mouse buttons
_this.mouseButtons = {
ORBIT: MOUSE.LEFT,
ZOOM: MOUSE.MIDDLE,
PAN: MOUSE.RIGHT
}; // for reset
_this.target0 = _this.target.clone();
_this.position0 = _this.object.position.clone();
_this.zoom0 = _this.object.zoom; //
// public methods
//
_this.getPolarAngle = function () {
return spherical.phi;
};
_this.getAzimuthalAngle = function () {
return spherical.theta;
};
_this.reset = function () {
_this.target.copy(_this.target0);
_this.object.position.copy(_this.position0);
_this.object.zoom = _this.zoom0;
_this.object.updateProjectionMatrix();
_this.dispatchEvent(changeEvent);
_this.update();
state = STATE.NONE;
}; // this method is exposed, but perhaps it would be better if we can make it private...
_this.update = function () {
var offset = new Vector3(); // so camera.up is the orbit axis
var quat = new Quaternion().setFromUnitVectors(object.up, new Vector3(0, 1, 0));
var quatInverse = quat.clone().inverse();
var lastPosition = new Vector3();
var lastQuaternion = new Quaternion();
return function () {
var position = _this.object.position;
offset.copy(position).sub(_this.target); // rotate offset to "y-axis-is-up" space
offset.applyQuaternion(quat); // angle from z-axis around y-axis
spherical.setFromVector3(offset);
if (_this.autoRotate && state === STATE.NONE) rotateLeft(getAutoRotationAngle());
spherical.theta += sphericalDelta.theta;
spherical.phi += sphericalDelta.phi; // restrict theta to be between desired limits
spherical.theta = Math.max(_this.minAzimuthAngle, Math.min(_this.maxAzimuthAngle, spherical.theta)); // restrict phi to be between desired limits
spherical.phi = Math.max(_this.minPolarAngle, Math.min(_this.maxPolarAngle, spherical.phi));
spherical.makeSafe();
spherical.radius *= scale; // restrict radius to be between desired limits
spherical.radius = Math.max(_this.minDistance, Math.min(_this.maxDistance, spherical.radius)); // move target to panned location
_this.target.add(panOffset);
offset.setFromSpherical(spherical); // rotate offset back to "camera-up-vector-is-up" space
offset.applyQuaternion(quatInverse);
position.copy(_this.target).add(offset);
_this.object.lookAt(_this.target);
if (_this.enableDamping === true) {
sphericalDelta.theta *= 1 - _this.dampingFactor;
sphericalDelta.phi *= 1 - _this.dampingFactor;
} else sphericalDelta.set(0, 0, 0);
scale = 1;
panOffset.set(0, 0, 0); // update condition is:
// min(camera displacement, camera rotation in radians)^2 > EPS
// using small-angle approximation cos(x/2) = 1 - x^2 / 8
if (zoomChanged || lastPosition.distanceToSquared(_this.object.position) > EPS || 8 * (1 - lastQuaternion.dot(_this.object.quaternion)) > EPS) {
_this.dispatchEvent(changeEvent);
lastPosition.copy(_this.object.position);
lastQuaternion.copy(_this.object.quaternion);
zoomChanged = false;
return true;
}
return false;
}();
};
_this.dispose = function () {
_this.domElement.removeEventListener('contextmenu', onContextMenu, false);
_this.domElement.removeEventListener('mousedown', onMouseDown, false);
_this.domElement.removeEventListener('wheel', onMouseWheel, false);
_this.domElement.removeEventListener('touchstart', onTouchStart, false);
_this.domElement.removeEventListener('touchend', onTouchEnd, false);
_this.domElement.removeEventListener('touchmove', onTouchMove, false);
document.removeEventListener('mousemove', onMouseMove, false);
document.removeEventListener('mouseup', onMouseUp, false);
window.removeEventListener('keydown', onKeyDown, false); // this.dispatchEvent( { type: 'dispose' } ); // should this be added here?
}; //
// internals
//
var changeEvent = {
type: 'change'
};
var startEvent = {
type: 'start'
};
var endEvent = {
type: 'end'
};
var STATE = {
NONE: -1,
ROTATE: 0,
DOLLY: 1,
PAN: 2,
TOUCH_ROTATE: 3,
TOUCH_DOLLY: 4,
TOUCH_PAN: 5
};
var state = STATE.NONE;
var EPS = 0.000001; // current position in spherical coordinates
var spherical = new Spherical();
var sphericalDelta = new Spherical();
var scale = 1;
var panOffset = new Vector3();
var zoomChanged = false;
var rotateStart = new Vector2();
var rotateEnd = new Vector2();
var rotateDelta = new Vector2();
var panStart = new Vector2();
var panEnd = new Vector2();
var panDelta = new Vector2();
var dollyStart = new Vector2();
var dollyEnd = new Vector2();
var dollyDelta = new Vector2();
var getAutoRotationAngle = function getAutoRotationAngle() {
return 2 * Math.PI / 60 / 60 * _this.autoRotateSpeed;
};
var getZoomScale = function getZoomScale() {
return Math.pow(0.95, _this.zoomSpeed);
};
var rotateLeft = function rotateLeft(angle) {
sphericalDelta.theta -= angle;
};
var rotateUp = function rotateUp(angle) {
sphericalDelta.phi -= angle;
};
var panLeft = function () {
var v = new Vector3();
return function (distance, objectMatrix) {
v.setFromMatrixColumn(objectMatrix, 0); // get X column of objectMatrix
v.multiplyScalar(-distance);
panOffset.add(v);
};
}();
var panUp = function () {
var v = new Vector3();
return function (distance, objectMatrix) {
v.setFromMatrixColumn(objectMatrix, 1); // get Y column of objectMatrix
v.multiplyScalar(distance);
panOffset.add(v);
};
}(); // deltaX and deltaY are in pixels; right and down are positive
var pan = function () {
var offset = new Vector3();
return function (deltaX, deltaY) {
var element = _this.domElement === document ? _this.domElement.body : _this.domElement;
if (_this.object instanceof PerspectiveCamera) {
// perspective
var position = _this.object.position;
offset.copy(position).sub(_this.target);
var targetDistance = offset.length(); // half of the fov is center to top of screen
targetDistance *= Math.tan(_this.object.fov / 2 * Math.PI / 180.0); // we actually don't use screenWidth, since perspective camera is fixed to screen height
panLeft(2 * deltaX * targetDistance / element.clientHeight, _this.object.matrix);
panUp(2 * deltaY * targetDistance / element.clientHeight, _this.object.matrix);
} else if (_this.object instanceof OrthographicCamera) {
// orthographic
panLeft(deltaX * (_this.object.right - _this.object.left) / _this.object.zoom / element.clientWidth, _this.object.matrix);
panUp(deltaY * (_this.object.top - _this.object.bottom) / _this.object.zoom / element.clientHeight, _this.object.matrix);
} else {
// camera neither orthographic nor perspective
console.warn('WARNING: OrbitControlsModule.js encountered an unknown camera type - pan disabled.');
_this.enablePan = false;
}
};
}();
var dollyIn = function dollyIn(dollyScale) {
if (_this.object instanceof PerspectiveCamera) scale /= dollyScale;else if (_this.object instanceof OrthographicCamera) {
_this.object.zoom = Math.max(_this.minZoom, Math.min(_this.maxZoom, _this.object.zoom * dollyScale));
_this.object.updateProjectionMatrix();
zoomChanged = true;
} else {
console.warn('WARNING: OrbitControlsModule.js encountered an unknown camera type - dolly/zoom disabled.');
_this.enableZoom = false;
}
};
var dollyOut = function dollyOut(dollyScale) {
if (_this.object instanceof PerspectiveCamera) scale *= dollyScale;else if (_this.object instanceof OrthographicCamera) {
_this.object.zoom = Math.max(_this.minZoom, Math.min(_this.maxZoom, _this.object.zoom / dollyScale));
_this.object.updateProjectionMatrix();
zoomChanged = true;
} else {
console.warn('WARNING: OrbitControlsModule.js encountered an unknown camera type - dolly/zoom disabled.');
_this.enableZoom = false;
}
}; //
// event callbacks - update the object state
//
var handleMouseDownRotate = function handleMouseDownRotate(event) {
// console.log( 'handleMouseDownRotate' );
rotateStart.set(event.clientX, event.clientY);
};
var handleMouseDownDolly = function handleMouseDownDolly(event) {
// console.log( 'handleMouseDownDolly' );
dollyStart.set(event.clientX, event.clientY);
};
var handleMouseDownPan = function handleMouseDownPan(event) {
// console.log( 'handleMouseDownPan' );
panStart.set(event.clientX, event.clientY);
};
var handleMouseMoveRotate = function handleMouseMoveRotate(event) {
// console.log( 'handleMouseMoveRotate' );
rotateEnd.set(event.clientX, event.clientY);
rotateDelta.subVectors(rotateEnd, rotateStart);
var element = _this.domElement === document ? _this.domElement.body : _this.domElement; // rotating across whole screen goes 360 degrees around
rotateLeft(2 * Math.PI * rotateDelta.x / element.clientWidth * _this.rotateSpeed); // rotating up and down along whole screen attempts to go 360, but limited to 180
rotateUp(2 * Math.PI * rotateDelta.y / element.clientHeight * _this.rotateSpeed);
rotateStart.copy(rotateEnd);
_this.update();
};
var handleMouseMoveDolly = function handleMouseMoveDolly(event) {
// console.log( 'handleMouseMoveDolly' );
dollyEnd.set(event.clientX, event.clientY);
dollyDelta.subVectors(dollyEnd, dollyStart);
if (dollyDelta.y > 0) dollyIn(getZoomScale());else if (dollyDelta.y < 0) dollyOut(getZoomScale());
dollyStart.copy(dollyEnd);
_this.update();
};
var handleMouseMovePan = function handleMouseMovePan(event) {
// console.log( 'handleMouseMovePan' );
panEnd.set(event.clientX, event.clientY);
panDelta.subVectors(panEnd, panStart);
pan(panDelta.x, panDelta.y);
panStart.copy(panEnd);
_this.update();
};
var handleMouseWheel = function handleMouseWheel(event) {
// console.log( 'handleMouseWheel' );
if (event.deltaY < 0) dollyOut(getZoomScale());else if (event.deltaY > 0) dollyIn(getZoomScale());
_this.update();
};
var handleKeyDown = function handleKeyDown(event) {
// console.log( 'handleKeyDown' );
switch (event.keyCode) {
case _this.keys.UP:
pan(0, _this.keyPanSpeed);
_this.update();
break;
case _this.keys.BOTTOM:
pan(0, -_this.keyPanSpeed);
_this.update();
break;
case _this.keys.LEFT:
pan(_this.keyPanSpeed, 0);
_this.update();
break;
case _this.keys.RIGHT:
pan(-_this.keyPanSpeed, 0);
_this.update();
break;
}
};
var handleTouchStartRotate = function handleTouchStartRotate(event) {
// console.log( 'handleTouchStartRotate' );
rotateStart.set(event.touches[0].pageX, event.touches[0].pageY);
};
var handleTouchStartDolly = function handleTouchStartDolly(event) {
// console.log( 'handleTouchStartDolly' );
var dx = event.touches[0].pageX - event.touches[1].pageX;
var dy = event.touches[0].pageY - event.touches[1].pageY;
var distance = Math.sqrt(dx * dx + dy * dy);
dollyStart.set(0, distance);
};
var handleTouchStartPan = function handleTouchStartPan(event) {
// console.log( 'handleTouchStartPan' );
panStart.set(event.touches[0].pageX, event.touches[0].pageY);
};
var handleTouchMoveRotate = function handleTouchMoveRotate(event) {
// console.log( 'handleTouchMoveRotate' );
rotateEnd.set(event.touches[0].pageX, event.touches[0].pageY);
rotateDelta.subVectors(rotateEnd, rotateStart);
var element = _this.domElement === document ? _this.domElement.body : _this.domElement; // rotating across whole screen goes 360 degrees around
rotateLeft(2 * Math.PI * rotateDelta.x / element.clientWidth * _this.rotateSpeed); // rotating up and down along whole screen attempts to go 360, but limited to 180
rotateUp(2 * Math.PI * rotateDelta.y / element.clientHeight * _this.rotateSpeed);
rotateStart.copy(rotateEnd);
_this.update();
};
var handleTouchMoveDolly = function handleTouchMoveDolly(event) {
// console.log( 'handleTouchMoveDolly' );
var dx = event.touches[0].pageX - event.touches[1].pageX;
var dy = event.touches[0].pageY - event.touches[1].pageY;
var distance = Math.sqrt(dx * dx + dy * dy);
dollyEnd.set(0, distance);
dollyDelta.subVectors(dollyEnd, dollyStart);
if (dollyDelta.y > 0) dollyOut(getZoomScale());else if (dollyDelta.y < 0) dollyIn(getZoomScale());
dollyStart.copy(dollyEnd);
_this.update();
};
var handleTouchMovePan = function handleTouchMovePan(event) {
// console.log( 'handleTouchMovePan' );
panEnd.set(event.touches[0].pageX, event.touches[0].pageY);
panDelta.subVectors(panEnd, panStart);
pan(panDelta.x, panDelta.y);
panStart.copy(panEnd);
_this.update();
};
// event handlers - FSM: listen for events and reset state
//
var onMouseDown = function onMouseDown(event) {
if (_this.enabled === false) return;
event.preventDefault();
if (event.button === _this.mouseButtons.ORBIT) {
if (_this.enableRotate === false) return;
handleMouseDownRotate(event);
state = STATE.ROTATE;
} else if (event.button === _this.mouseButtons.ZOOM) {
if (_this.enableZoom === false) return;
handleMouseDownDolly(event);
state = STATE.DOLLY;
} else if (event.button === _this.mouseButtons.PAN) {
if (_this.enablePan === false) return;
handleMouseDownPan(event);
state = STATE.PAN;
}
if (state !== STATE.NONE) {
_this.eventHandler.on('mousemove', onMouseMove, false);
_this.eventHandler.on('mouseup', onMouseUp, false);
_this.dispatchEvent(startEvent);
}
};
var onMouseMove = function onMouseMove(event) {
if (_this.enabled === false) return;
event.preventDefault();
if (state === STATE.ROTATE) {
if (_this.enableRotate === false) return;
handleMouseMoveRotate(event);
} else if (state === STATE.DOLLY) {
if (_this.enableZoom === false) return;
handleMouseMoveDolly(event);
} else if (state === STATE.PAN) {
if (_this.enablePan === false) return;
handleMouseMovePan(event);
}
};
var onMouseUp = function onMouseUp(event) {
if (_this.enabled === false) return;
document.removeEventListener('mousemove', onMouseMove, false);
document.removeEventListener('mouseup', onMouseUp, false);
_this.dispatchEvent(endEvent);
state = STATE.NONE;
};
var onMouseWheel = function onMouseWheel(event) {
if (_this.enabled === false || _this.enableZoom === false || state !== STATE.NONE && state !== STATE.ROTATE) return;
event.preventDefault();
event.stopPropagation();
handleMouseWheel(event);
_this.dispatchEvent(startEvent); // not sure why these are here...
_this.dispatchEvent(endEvent);
};
var onKeyDown = function onKeyDown(event) {
if (_this.enabled === false || _this.enableKeys === false || _this.enablePan === false) return;
handleKeyDown(event);
};
var onTouchStart = function onTouchStart(event) {
if (_this.enabled === false) return;
switch (event.touches.length) {
case 1:
// one-fingered touch: rotate
if (_this.enableRotate === false) return;
handleTouchStartRotate(event);
state = STATE.TOUCH_ROTATE;
break;
case 2:
// two-fingered touch: dolly
if (_this.enableZoom === false) return;
handleTouchStartDolly(event);
state = STATE.TOUCH_DOLLY;
break;
case 3:
// three-fingered touch: pan
if (_this.enablePan === false) return;
handleTouchStartPan(event);
state = STATE.TOUCH_PAN;
break;
default:
state = STATE.NONE;
}
if (state !== STATE.NONE) _this.dispatchEvent(startEvent);
};
var onTouchMove = function onTouchMove(event) {
if (_this.enabled === false) return;
event.preventDefault();
event.stopPropagation();
switch (event.touches.length) {
case 1:
// one-fingered touch: rotate
if (_this.enableRotate === false) return;
if (state !== STATE.TOUCH_ROTATE) return; // is this needed?...
handleTouchMoveRotate(event);
break;
case 2:
// two-fingered touch: dolly
if (_this.enableZoom === false) return;
if (state !== STATE.TOUCH_DOLLY) return; // is this needed?...
handleTouchMoveDolly(event);
break;
case 3:
// three-fingered touch: pan
if (_this.enablePan === false) return;
if (state !== STATE.TOUCH_PAN) return; // is this needed?...
handleTouchMovePan(event);
break;
default:
state = STATE.NONE;
}
};
var onTouchEnd = function onTouchEnd(event) {
if (_this.enabled === false) return;
_this.dispatchEvent(endEvent);
state = STATE.NONE;
};
var onContextMenu = function onContextMenu(event) {
event.preventDefault();
}; //
_this.eventHandler.on('contextmenu', onContextMenu, false);
_this.eventHandler.on('mousedown', onMouseDown, false);
_this.eventHandler.on('wheel', onMouseWheel, false);
_this.eventHandler.on('touchstart', onTouchStart, false);
_this.eventHandler.on('touchend', onTouchEnd, false);
_this.eventHandler.on('touchmove', onTouchMove, false);
_this.eventHandler.on('keydown', onKeyDown, false); // force an update at start
_this.update();
return _this;
}
createClass(ThreeOrbitControls, [{
key: "center",
get: function get() {
console.warn('OrbitControls: .center has been renamed to .target');
return this.target;
}
}, {
key: "noZoom",
get: function get() {
console.warn('OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.');
return !this.enableZoom;
},
set: function set(value) {
console.warn('OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.');
this.enableZoom = !value;
}
}, {
key: "noRotate",
get: function get() {
console.warn('OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.');
return !this.enableRotate;
},
set: function set(value) {
console.warn('OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.');
this.enableRotate = !value;
}
}, {
key: "noPan",
get: function get() {
console.warn('OrbitControls: .noPan has been deprecated. Use .enablePan instead.');
return !this.enablePan;
},
set: function set(value) {
console.warn('OrbitControls: .noPan has been deprecated. Use .enablePan instead.');
this.enablePan = !value;
}
}, {
key: "noKeys",
get: function get() {
console.warn('OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.');
return !this.enableKeys;
},
set: function set(value) {
console.warn('OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.');
this.enableKeys = !value;
}
}, {
key: "staticMoving",
get: function get() {
console.warn('OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.');
return !this.enableDamping;
},
set: function set(value) {
console.warn('OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.');
this.enableDamping = !value;
}
}, {
key: "dynamicDampingFactor",
get: function get() {
console.warn('OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.');
return this.dampingFactor;
},
set: function set(value) {
console.warn('OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.');
this.dampingFactor = value;
}
}]);
inherits(ThreeOrbitControls, _EventDispatcher);
return ThreeOrbitControls;
}(EventDispatcher);
/**
* @class OrbitControlsModule
* @category modules/app
* @param {Object} [params]
* @param {Object} [params.object=camera] Object to which controls are applied.
* @param {THREE.Vector3} [params.target=new Vector3()] Controls center vector.
* @param {Boolean} [params.follow=false] Follow the target
* @memberof module:modules/app
* @example <caption> Creating a rendering module and passing it to App's modules</caption>
* new App([
* new ElementModule(),
* new SceneModule(),
* new DefineModule('camera', new WHS.PerspectiveCamera({
* position: new THREE.Vector3(0, 6, 18),
* far: 10000
* })),
* new RenderingModule(),
* new OrbitControlsModule()
* ]);
*/
var OrbitControlsModule =
/*#__PURE__*/
function (_ControlsModule) {
function OrbitControlsModule() {
var _this;
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
classCallCheck(this, OrbitControlsModule);
_this = possibleConstructorReturn(this, getPrototypeOf$2(OrbitControlsModule).call(this, params));
_this.params = Object.assign({
follow: false,
object: null,
target: new Vector3()
}, params);
return _this;
}
createClass(OrbitControlsModule, [{
key: "manager",
value: function manager(_manager) {
get$3(getPrototypeOf$2(OrbitControlsModule.prototype), "manager", this).call(this, _manager);
var _this$params = this.params,
obj = _this$params.object,
follow = _this$params.follow,
target = _this$params.target;
var object = obj ? obj.native : _manager.get('camera').native;
var controls = new ThreeOrbitControls(object, _manager.get('element'), _manager.handler);
var updateProcessor = follow ? function (c) {
controls.update(c.getDelta());
controls.target.copy(target);
} : function (c) {
controls.update(c.getDelta());
};
this.setControls(controls);
this.setUpdate(updateProcessor);
_manager.update({
camera: function camera(_camera) {
if (obj) return;
controls.object = _camera.native;
},
element: function element(_element) {
controls.domElement = _element;
}
});
controls.target.copy(target);
}
}]);
inherits(OrbitControlsModule, _ControlsModule);
return OrbitControlsModule;
}(ControlsModule);
/** @module modules/app/controls */
/** @module modules/app */
/**
* @class DynamicGeometryModule
* @category modules/mesh
* @param {Object} [params={attributes: false}] - params
* @param {Boolean} [patchEvents=true]
* @memberof module:modules/mesh
*/
var DynamicGeometryModule =
/*#__PURE__*/
function () {
function DynamicGeometryModule() {
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
classCallCheck(this, DynamicGeometryModule);
this.params = Object.assign({
attributes: false
}, params);
}
createClass(DynamicGeometryModule, [{
key: "integrate",
value: function integrate(self) {
var _this = this;
var params = self.params;
this.g_ = function () {
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
if (this.buildGeometry) {
this.native.geometry = this.buildGeometry(this.updateParams({
geometry: params
}));
}
};
if (params.attributes) {
var _loop = function _loop(key) {
if (key) {
Object.defineProperty(_this, "g_".concat(key), {
get: function get() {
return this.native.geometry.parameters[key];
},
set: function set(value) {
this.native.geometry = this.buildGeometry(this.updateParams({
geometry: defineProperty$3({}, key, value)
}));
},
configurable: true,
enumerable: true
});
}
};
for (var key in this.params.geometry) {
_loop(key);
}
}
}
}]);
return DynamicGeometryModule;
}();
var loader = new TextureLoader();
/**
* @class TextureModule
* @category modules/mesh
* @description A TextureModule can be applied to any Mesh or Model.
* @param {Array} [textures] - array of texture objects
* @memberof module:modules/mesh
* @example <caption>Creating an instance. url takes a path, or a data object.</caption>
* var woodTexture = new TextureModule({
* url: `${process.assetsPath}/textures/wood.jpg`
* });
* @example <caption>More comprehensive example, wood texture applied to a Box.</caption>
* new Box({
* geometry: {
* width: 2,
* height: 2,
* depth: 2
* },
* modules: [
* new TextureModule({
* url: `path/to/texture.jpg`,
* repeat: new THREE.Vector2(1, 1) // optional
* })
* ],
* material: new THREE.MeshBasicMaterial({
* color: 0xffffff
* }),
* position: [50, 60, 70]
* }).addTo(app);
*/
var TextureModule =
/*#__PURE__*/
function () {
createClass(TextureModule, null, [{
key: "load",
value: function load(url) {
return new TextureModule({
url: url
}).textures[0][1];
}
}]);
function TextureModule() {
var _this = this;
classCallCheck(this, TextureModule);
defineProperty$3(defineProperty$3(this, "textures", []), "bridge", {
material: function material(_material, self) {
self.textures.forEach(function (texture) {
_material[texture[0]] = texture[1];
});
_material.needsUpdate = true;
return _material;
}
});
for (var _len = arguments.length, textures = new Array(_len), _key = 0; _key < _len; _key++) {
textures[_key] = arguments[_key];
}
textures.forEach(function (_ref) {
var url = _ref.url,
_ref$type = _ref.type,
type = _ref$type === void 0 ? 'map' : _ref$type,
_ref$offset = _ref.offset,
offset = _ref$offset === void 0 ? new Vector2(0, 0) : _ref$offset,
_ref$repeat = _ref.repeat,
repeat = _ref$repeat === void 0 ? new Vector2(1, 1) : _ref$repeat,
_ref$wrap = _ref.wrap,
wrap = _ref$wrap === void 0 ? RepeatWrapping : _ref$wrap,
_ref$mapping = _ref.mapping,
mapping = _ref$mapping === void 0 ? UVMapping : _ref$mapping,
_ref$fix = _ref.fix,
fix = _ref$fix === void 0 ? function (tex) {
return tex;
} : _ref$fix;
var texture = loader.load(url);
if (wrap.length > 0) {
texture.wrapS = wrap[0];
texture.wrapT = wrap[1];
} else texture.wrapS = texture.wrapT = wrap;
texture.mapping = mapping;
texture.offset.copy(offset);
texture.repeat.copy(repeat);
texture.magFilter = NearestFilter;
texture.minFilter = LinearMipMapLinearFilter;
_this.textures.push([type, fix(texture)]);
});
}
return TextureModule;
}();
/**
* @class AnimationModule
* @category modules/mesh
* @description Convenience module that wraps the <a href='https://threejs.org/docs/#manual/introduction/Animation-system'>three.js animation system</a>
* @param {App} app - the app
* @param {Boolean} [isDeferred=false] - set to true if animation should not start automatically
* @param {Object} [params={speed: 1}] - the params
* @memberof module:modules/mesh
* @example <caption>Create animation module and play a given clip of an imported model</caption>
* const animationModule = new AnimationModule(app, false, {
* speed: 1.2 // speed up animation by 20%
* });
*
* new Importer({
* parser(geometry, materials) {
* // Override parse to generate a skinnedMesh, needed for skinned models
* return new THREE.SkinnedMesh(geometry, materials);
* },
*
* url: `path/to/model.json`,
* useCustomMaterial: true,
*
* material: new THREE.MeshStandardMaterial({
* skinning: true
* }),
*
* modules: [animationModule]
* }).addTo(app).then(() => {
* // adding model to app returns a promise, so pipe the function to kick off the animation clip
* animationModule.play('clipName');
* });
*/
var AnimationModule =
/*#__PURE__*/
function () {
function AnimationModule(app, isDeferred) {
var params = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
classCallCheck(this, AnimationModule);
defineProperty$3(this, "bridge", {
mesh: function mesh(_mesh, self) {
_mesh.geometry.skeleton = _mesh.skeleton;
self.mixer = new AnimationMixer(_mesh.geometry);
self.clips = _mesh.geometry.animations;
return _mesh;
}
});
this.params = Object.assign({
speed: 1
}, params);
this.app = app;
this.isDeferred = isDeferred;
}
/**
* @method play
* @instance
* @description Plays the given clip name
* @param {String} clipName - the clip to play
* @return {THREE.AnimationAction} Playing action
* @memberof module:modules/mesh.AnimationModule
*/
createClass(AnimationModule, [{
key: "play",
value: function play(clipName) {
var clip = AnimationClip.findByName(this.clips, clipName);
return this.mixer.clipAction(clip).play();
}
/**
* @method update
* @instance
* @description Update the mixer (being called on frame animation loop)
* @memberof module:modules/mesh.AnimationModule
*/
}, {
key: "update",
value: function update(clock) {
if (this.mixer) this.mixer.update(clock.getDelta() * this.params.speed);
}
}, {
key: "integrate",
value: function integrate(self) {
self.loop = new Loop(function (clock) {
return self.update(clock);
});
if (!self.isDeferred) self.loop.start(self.app);
}
}, {
key: "manager",
value: function manager(_manager) {
_manager.define('animation');
}
}]);
return AnimationModule;
}();
/** @module modules/mesh */
/**
* @class DefineModule
* @category modules
* @param {String} name
* @param {Object} data
* @memberof module:modules
* @example <caption> Creating a DefineModule with PerspectiveCamera as camera module and passing it to App's modules</caption>
* new App([
* // ...
* new DefineModule('camera', new PerspectiveCamera())
* ]);
*/
var DefineModule =
/*#__PURE__*/
function () {
function DefineModule(name, data) {
classCallCheck(this, DefineModule);
this.name = name;
this.data = data;
}
createClass(DefineModule, [{
key: "manager",
value: function manager(_manager) {
_manager.set(this.name, this.data);
}
}]);
return DefineModule;
}();
/** @module modules */
var Model =
/*#__PURE__*/
function (_Importer) {
function Model(params) {
var _getPrototypeOf2;
classCallCheck(this, Model);
console.warn('Model is deprecated. Use Importer instead.');
if (params.geometry) {
params.url = params.geometry.path;
params.loader = params.geometry.loader;
}
for (var _len = arguments.length, additional = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
additional[_key - 1] = arguments[_key];
}
return possibleConstructorReturn(this, (_getPrototypeOf2 = getPrototypeOf$2(Model)).call.apply(_getPrototypeOf2, [this, params].concat(additional)));
}
inherits(Model, _Importer);
return Model;
}(Importer);
var CameraModule =
/*#__PURE__*/
function () {
function CameraModule() {
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
classCallCheck(this, CameraModule);
console.warn('CameraModule is deprecated. Use DefineModule instead.');
this.camera = new PerspectiveCamera$1(params);
}
createClass(CameraModule, [{
key: "integrate",
value: function integrate(self) {
this.add(self.camera);
}
}, {
key: "manager",
value: function manager(_manager) {
_manager.set('camera', this.camera);
}
}]);
return CameraModule;
}();
/**
* Namespace containing all classes from all modules. Used as global in UMD pattern.
* @namespace WHS
* @example <caption>The use of WHS namespace.</caption>
* new WHS.App() // core
* new WHS.PerspectiveCamera() // components
* new WHS.ResizeModule() // modules
* WHS.extend() // utils
*/
exports.Component = Component;
exports.MeshComponent = MeshComponent;
exports.LightComponent = LightComponent;
exports.CameraComponent = CameraComponent;
exports.App = App;
exports.Loop = Loop;
exports.ModuleManager = ModuleManager;
exports.AmbientLight = AmbientLight$1;
exports.DirectionalLight = DirectionalLight$1;
exports.HemisphereLight = HemisphereLight$1;
exports.PointLight = PointLight$1;
exports.SpotLight = SpotLight$1;
exports.AreaLight = AreaLight;
exports.CubeCamera = CubeCamera$1;
exports.OrthographicCamera = OrthographicCamera$1;
exports.PerspectiveCamera = PerspectiveCamera$1;
exports.Box = Box;
exports.Circle = Circle;
exports.Cone = Cone;
exports.Cylinder = Cylinder;
exports.Dodecahedron = Dodecahedron;
exports.Extrude = Extrude;
exports.Icosahedron = Icosahedron;
exports.Lathe = Lathe;
exports.Line = Line$1;
exports.Importer = Importer;
exports.Octahedron = Octahedron;
exports.Parametric = Parametric;
exports.Plane = Plane$1;
exports.Polyhedron = Polyhedron;
exports.Ring = Ring;
exports.Shape = Shape$1;
exports.Sphere = Sphere$1;
exports.Tetrahedron = Tetrahedron;
exports.Text = Text;
exports.Torus = Torus;
exports.Torusknot = Torusknot;
exports.Tube = Tube;
exports.Group = Group$1;
exports.extend = extend;
exports.instruct = instruct;
exports.transformData = transformData;
exports.toArray = toArray;
exports.ElementModule = ElementModule;
exports.RenderingModule = RenderingModule;
exports.SceneModule = SceneModule;
exports.ResizeModule = ResizeModule;
exports.PostProcessorModule = PostProcessorModule;
exports.VirtualMouseModule = VirtualMouseModule;
exports.EventsPatchModule = EventsPatchModule;
exports.ControlsModule = ControlsModule;
exports.FogModule = FogModule;
exports.StateModule = StateModule;
exports.OrbitControlsModule = OrbitControlsModule;
exports.DynamicGeometryModule = DynamicGeometryModule;
exports.TextureModule = TextureModule;
exports.AnimationModule = AnimationModule;
exports.DefineModule = DefineModule;
exports.Model = Model;
exports.CameraModule = CameraModule;
Object.defineProperty(exports, '__esModule', { value: true });
})));
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2hzLmpzIiwic291cmNlcyI6WyIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL3JlZ2VuZXJhdG9yLXJ1bnRpbWUvcnVudGltZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9ub2RlX21vZHVsZXMvcmVnZW5lcmF0b3ItcnVudGltZS9ydW50aW1lLW1vZHVsZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9yZWdlbmVyYXRvci9pbmRleC5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3RvLWludGVnZXIuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19kZWZpbmVkLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fc3RyaW5nLWF0LmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fbGlicmFyeS5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2dsb2JhbC5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2NvcmUuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19hLWZ1bmN0aW9uLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fY3R4LmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faXMtb2JqZWN0LmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fYW4tb2JqZWN0LmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fZmFpbHMuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19kZXNjcmlwdG9ycy5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2RvbS1jcmVhdGUuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19pZTgtZG9tLWRlZmluZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3RvLXByaW1pdGl2ZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX29iamVjdC1kcC5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3Byb3BlcnR5LWRlc2MuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19oaWRlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faGFzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fZXhwb3J0LmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fcmVkZWZpbmUuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19pdGVyYXRvcnMuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19jb2YuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19pb2JqZWN0LmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fdG8taW9iamVjdC5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3RvLWxlbmd0aC5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3RvLWFic29sdXRlLWluZGV4LmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fYXJyYXktaW5jbHVkZXMuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19zaGFyZWQuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL191aWQuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19zaGFyZWQta2V5LmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWtleXMtaW50ZXJuYWwuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19lbnVtLWJ1Zy1rZXlzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWtleXMuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3QtZHBzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faHRtbC5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX29iamVjdC1jcmVhdGUuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL193a3MuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19zZXQtdG8tc3RyaW5nLXRhZy5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2l0ZXItY3JlYXRlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fdG8tb2JqZWN0LmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWdwby5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2l0ZXItZGVmaW5lLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczYuc3RyaW5nLml0ZXJhdG9yLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faXRlci1zdGVwLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczYuYXJyYXkuaXRlcmF0b3IuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL3dlYi5kb20uaXRlcmFibGUuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19jbGFzc29mLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fYW4taW5zdGFuY2UuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19pdGVyLWNhbGwuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19pcy1hcnJheS1pdGVyLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9jb3JlLmdldC1pdGVyYXRvci1tZXRob2QuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19mb3Itb2YuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19zcGVjaWVzLWNvbnN0cnVjdG9yLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faW52b2tlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fdGFzay5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX21pY3JvdGFzay5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX25ldy1wcm9taXNlLWNhcGFiaWxpdHkuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19wZXJmb3JtLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fdXNlci1hZ2VudC5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3Byb21pc2UtcmVzb2x2ZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3JlZGVmaW5lLWFsbC5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3NldC1zcGVjaWVzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faXRlci1kZXRlY3QuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNi5wcm9taXNlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczcucHJvbWlzZS5maW5hbGx5LmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczcucHJvbWlzZS50cnkuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9wcm9taXNlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2NvcmUtanMvcHJvbWlzZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2FzeW5jVG9HZW5lcmF0b3IuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3QtcGllLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWdvcGQuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3Qtc2FwLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczYub2JqZWN0LmdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvci5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L2ZuL29iamVjdC9nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3IuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvY29yZS1qcy9vYmplY3QvZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fbWV0YS5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3drcy1leHQuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL193a3MtZGVmaW5lLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWdvcHMuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19lbnVtLWtleXMuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19pcy1hcnJheS5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX29iamVjdC1nb3BuLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWdvcG4tZXh0LmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczYuc3ltYm9sLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvZm4vb2JqZWN0L2dldC1vd24tcHJvcGVydHktc3ltYm9scy5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9jb3JlLWpzL29iamVjdC9nZXQtb3duLXByb3BlcnR5LXN5bWJvbHMuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNi5vYmplY3Qua2V5cy5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L2ZuL29iamVjdC9rZXlzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2NvcmUtanMvb2JqZWN0L2tleXMuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNi5vYmplY3QuZGVmaW5lLXByb3BlcnR5LmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvZm4vb2JqZWN0L2RlZmluZS1wcm9wZXJ0eS5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9jb3JlLWpzL29iamVjdC9kZWZpbmUtcHJvcGVydHkuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eS5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL29iamVjdFNwcmVhZC5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fc2V0LXByb3RvLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczYub2JqZWN0LnNldC1wcm90b3R5cGUtb2YuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9vYmplY3Qvc2V0LXByb3RvdHlwZS1vZi5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9jb3JlLWpzL29iamVjdC9zZXQtcHJvdG90eXBlLW9mLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvc2V0UHJvdG90eXBlT2YuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbmhlcml0cy5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvZm4vc3ltYm9sL2l0ZXJhdG9yLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2NvcmUtanMvc3ltYm9sL2l0ZXJhdG9yLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczcuc3ltYm9sLmFzeW5jLWl0ZXJhdG9yLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczcuc3ltYm9sLm9ic2VydmFibGUuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9zeW1ib2wvaW5kZXguanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvY29yZS1qcy9zeW1ib2wuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy90eXBlb2YuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczYub2JqZWN0LmdldC1wcm90b3R5cGUtb2YuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9vYmplY3QvZ2V0LXByb3RvdHlwZS1vZi5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9jb3JlLWpzL29iamVjdC9nZXQtcHJvdG90eXBlLW9mLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZ2V0UHJvdG90eXBlT2YuanMiLCIuLi9zcmMvdXRpbHMvZXh0ZW5kLmpzIiwiLi4vc3JjL3V0aWxzL3RyYW5zZm9ybURhdGEuanMiLCIuLi9ub2RlX21vZHVsZXMvdGhyZWUvYnVpbGQvdGhyZWUubW9kdWxlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL21pbml2ZW50cy9kaXN0L21pbml2ZW50cy5jb21tb25qcy5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM2Lm9iamVjdC5jcmVhdGUuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9vYmplY3QvY3JlYXRlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2NvcmUtanMvb2JqZWN0L2NyZWF0ZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3ZhbGlkYXRlLWNvbGxlY3Rpb24uanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19jb2xsZWN0aW9uLXN0cm9uZy5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2FycmF5LXNwZWNpZXMtY29uc3RydWN0b3IuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19hcnJheS1zcGVjaWVzLWNyZWF0ZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2FycmF5LW1ldGhvZHMuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19jb2xsZWN0aW9uLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczYubWFwLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fYXJyYXktZnJvbS1pdGVyYWJsZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2NvbGxlY3Rpb24tdG8tanNvbi5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM3Lm1hcC50by1qc29uLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fc2V0LWNvbGxlY3Rpb24tb2YuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNy5tYXAub2YuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19zZXQtY29sbGVjdGlvbi1mcm9tLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczcubWFwLmZyb20uanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9tYXAuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvY29yZS1qcy9tYXAuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19iaW5kLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczYucmVmbGVjdC5jb25zdHJ1Y3QuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9yZWZsZWN0L2NvbnN0cnVjdC5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9jb3JlLWpzL3JlZmxlY3QvY29uc3RydWN0LmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvY29uc3RydWN0LmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvd3JhcE5hdGl2ZVN1cGVyLmpzIiwiLi4vc3JjL2NvcmUvZXJyb3JzLmpzIiwiLi4vc3JjL2NvcmUvTW9kdWxlU3lzdGVtLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXJyYXlXaXRoSG9sZXMuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2NvcmUuZ2V0LWl0ZXJhdG9yLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvZm4vZ2V0LWl0ZXJhdG9yLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2NvcmUtanMvZ2V0LWl0ZXJhdG9yLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvaXRlcmFibGVUb0FycmF5TGltaXQuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9ub25JdGVyYWJsZVJlc3QuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9zbGljZWRUb0FycmF5LmpzIiwiLi4vbm9kZV9tb2R1bGVzL3N5bWJvbC1vYnNlcnZhYmxlL2VzL3BvbnlmaWxsLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3N5bWJvbC1vYnNlcnZhYmxlL2VzL2luZGV4LmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JlZHV4L2VzL3JlZHV4LmpzIiwiLi4vc3JjL2NvcmUvTW9kdWxlTWFuYWdlci5qcyIsIi4uL3NyYy9jb3JlL0NvbXBvbmVudC5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM2LnJlZmxlY3QuZ2V0LmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvZm4vcmVmbGVjdC9nZXQuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvY29yZS1qcy9yZWZsZWN0L2dldC5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3N1cGVyUHJvcEJhc2UuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9nZXQuanMiLCIuLi9zcmMvY29yZS9wcm90b3R5cGUvYXR0cmlidXRlcy5qcyIsIi4uL3NyYy9jb3JlL01lc2hDb21wb25lbnQuanMiLCIuLi9zcmMvY29yZS9MaWdodENvbXBvbmVudC5qcyIsIi4uL3NyYy9jb3JlL0NhbWVyYUNvbXBvbmVudC5qcyIsIi4uL3NyYy9wb2x5ZmlsbC5qcyIsIi4uL3NyYy9jb3JlL0FwcC5qcyIsIi4uL3NyYy9jb3JlL0xvb3AuanMiLCIuLi9zcmMvY29yZS9pbmRleC5qcyIsIi4uL3NyYy9jb21wb25lbnRzL2xpZ2h0cy9BbWJpZW50TGlnaHQuanMiLCIuLi9zcmMvY29tcG9uZW50cy9saWdodHMvRGlyZWN0aW9uYWxMaWdodC5qcyIsIi4uL3NyYy9jb21wb25lbnRzL2xpZ2h0cy9IZW1pc3BoZXJlTGlnaHQuanMiLCIuLi9zcmMvY29tcG9uZW50cy9saWdodHMvUG9pbnRMaWdodC5qcyIsIi4uL3NyYy9jb21wb25lbnRzL2xpZ2h0cy9TcG90TGlnaHQuanMiLCIuLi9zcmMvY29tcG9uZW50cy9saWdodHMvQXJlYUxpZ2h0LmpzIiwiLi4vc3JjL2NvbXBvbmVudHMvbGlnaHRzL2luZGV4LmpzIiwiLi4vc3JjL2NvbXBvbmVudHMvY2FtZXJhcy9DdWJlQ2FtZXJhLmpzIiwiLi4vc3JjL2NvbXBvbmVudHMvY2FtZXJhcy9PcnRob2dyYXBoaWNDYW1lcmEuanMiLCIuLi9zcmMvY29tcG9uZW50cy9jYW1lcmFzL1BlcnNwZWN0aXZlQ2FtZXJhLmpzIiwiLi4vc3JjL2NvbXBvbmVudHMvY2FtZXJhcy9pbmRleC5qcyIsIi4uL3NyYy9jb21wb25lbnRzL21lc2hlcy9Cb3guanMiLCIuLi9zcmMvY29tcG9uZW50cy9tZXNoZXMvQ2lyY2xlLmpzIiwiLi4vc3JjL2NvbXBvbmVudHMvbWVzaGVzL0NvbmUuanMiLCIuLi9zcmMvY29tcG9uZW50cy9tZXNoZXMvQ3lsaW5kZXIuanMiLCIuLi9zcmMvY29tcG9uZW50cy9tZXNoZXMvRG9kZWNhaGVkcm9uLmpzIiwiLi4vc3JjL2NvbXBvbmVudHMvbWVzaGVzL0V4dHJ1ZGUuanMiLCIuLi9zcmMvY29tcG9uZW50cy9tZXNoZXMvSWNvc2FoZWRyb24uanMiLCIuLi9zcmMvY29tcG9uZW50cy9tZXNoZXMvTGF0aGUuanMiLCIuLi9zcmMvY29tcG9uZW50cy9tZXNoZXMvTGluZS5qcyIsIi4uL3NyYy9jb21wb25lbnRzL21lc2hlcy9JbXBvcnRlci5qcyIsIi4uL3NyYy9jb21wb25lbnRzL21lc2hlcy9PY3RhaGVkcm9uLmpzIiwiLi4vc3JjL2NvbXBvbmVudHMvbWVzaGVzL1BhcmFtZXRyaWMuanMiLCIuLi9zcmMvY29tcG9uZW50cy9tZXNoZXMvUGxhbmUuanMiLCIuLi9zcmMvY29tcG9uZW50cy9tZXNoZXMvUG9seWhlZHJvbi5qcyIsIi4uL3NyYy9jb21wb25lbnRzL21lc2hlcy9SaW5nLmpzIiwiLi4vc3JjL2NvbXBvbmVudHMvbWVzaGVzL1NoYXBlLmpzIiwiLi4vc3JjL2NvbXBvbmVudHMvbWVzaGVzL1NwaGVyZS5qcyIsIi4uL3NyYy9jb21wb25lbnRzL21lc2hlcy9UZXRyYWhlZHJvbi5qcyIsIi4uL3NyYy9jb21wb25lbnRzL21lc2hlcy9UZXh0LmpzIiwiLi4vc3JjL2NvbXBvbmVudHMvbWVzaGVzL1RvcnVzLmpzIiwiLi4vc3JjL2NvbXBvbmVudHMvbWVzaGVzL1RvcnVza25vdC5qcyIsIi4uL3NyYy9jb21wb25lbnRzL21lc2hlcy9UdWJlLmpzIiwiLi4vc3JjL2NvbXBvbmVudHMvbWVzaGVzL0dyb3VwLmpzIiwiLi4vc3JjL2NvbXBvbmVudHMvbWVzaGVzL2luZGV4LmpzIiwiLi4vc3JjL21vZHVsZXMvYXBwL0VsZW1lbnRNb2R1bGUuanMiLCIuLi9zcmMvbW9kdWxlcy9hcHAvUmVuZGVyaW5nTW9kdWxlLmpzIiwiLi4vc3JjL21vZHVsZXMvYXBwL1NjZW5lTW9kdWxlLmpzIiwiLi4vc3JjL21vZHVsZXMvYXBwL1Jlc2l6ZU1vZHVsZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9wb3N0cHJvY2Vzc2luZy9zcmMvbWF0ZXJpYWxzL0FkYXB0aXZlTHVtaW5vc2l0eU1hdGVyaWFsLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3Bvc3Rwcm9jZXNzaW5nL3NyYy9tYXRlcmlhbHMvQm9rZWhNYXRlcmlhbC5qcyIsIi4uL25vZGVfbW9kdWxlcy9wb3N0cHJvY2Vzc2luZy9zcmMvbWF0ZXJpYWxzL0NvbG9yRWRnZXNNYXRlcmlhbC5qcyIsIi4uL25vZGVfbW9kdWxlcy9wb3N0cHJvY2Vzc2luZy9zcmMvbWF0ZXJpYWxzL0NvbWJpbmVNYXRlcmlhbC5qcyIsIi4uL25vZGVfbW9kdWxlcy9wb3N0cHJvY2Vzc2luZy9zcmMvbWF0ZXJpYWxzL0NvbnZvbHV0aW9uTWF0ZXJpYWwuanMiLCIuLi9ub2RlX21vZHVsZXMvcG9zdHByb2Nlc3Npbmcvc3JjL21hdGVyaWFscy9Db3B5TWF0ZXJpYWwuanMiLCIuLi9ub2RlX21vZHVsZXMvcG9zdHByb2Nlc3Npbmcvc3JjL21hdGVyaWFscy9EZXB0aENvbXBhcmlzb25NYXRlcmlhbC5qcyIsIi4uL25vZGVfbW9kdWxlcy9wb3N0cHJvY2Vzc2luZy9zcmMvbWF0ZXJpYWxzL0RvdFNjcmVlbk1hdGVyaWFsLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3Bvc3Rwcm9jZXNzaW5nL3NyYy9tYXRlcmlhbHMvRmlsbU1hdGVyaWFsLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3Bvc3Rwcm9jZXNzaW5nL3NyYy9tYXRlcmlhbHMvR2xpdGNoTWF0ZXJpYWwuanMiLCIuLi9ub2RlX21vZHVsZXMvcG9zdHByb2Nlc3Npbmcvc3JjL21hdGVyaWFscy9Hb2RSYXlzTWF0ZXJpYWwuanMiLCIuLi9ub2RlX21vZHVsZXMvcG9zdHByb2Nlc3Npbmcvc3JjL21hdGVyaWFscy9MdW1pbm9zaXR5TWF0ZXJpYWwuanMiLCIuLi9ub2RlX21vZHVsZXMvcG9zdHByb2Nlc3Npbmcvc3JjL21hdGVyaWFscy9PdXRsaW5lQmxlbmRNYXRlcmlhbC5qcyIsIi4uL25vZGVfbW9kdWxlcy9wb3N0cHJvY2Vzc2luZy9zcmMvbWF0ZXJpYWxzL091dGxpbmVFZGdlc01hdGVyaWFsLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3Bvc3Rwcm9jZXNzaW5nL3NyYy9tYXRlcmlhbHMvUGl4ZWxhdGlvbk1hdGVyaWFsLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3Bvc3Rwcm9jZXNzaW5nL3NyYy9tYXRlcmlhbHMvUmVhbGlzdGljQm9rZWhNYXRlcmlhbC5qcyIsIi4uL25vZGVfbW9kdWxlcy9wb3N0cHJvY2Vzc2luZy9zcmMvbWF0ZXJpYWxzL1Nob2NrV2F2ZU1hdGVyaWFsLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3Bvc3Rwcm9jZXNzaW5nL3NyYy9tYXRlcmlhbHMvU01BQUJsZW5kTWF0ZXJpYWwuanMiLCIuLi9ub2RlX21vZHVsZXMvcG9zdHByb2Nlc3Npbmcvc3JjL21hdGVyaWFscy9TTUFBV2VpZ2h0c01hdGVyaWFsLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3Bvc3Rwcm9jZXNzaW5nL3NyYy9tYXRlcmlhbHMvVG9uZU1hcHBpbmdNYXRlcmlhbC5qcyIsIi4uL25vZGVfbW9kdWxlcy9wb3N0cHJvY2Vzc2luZy9zcmMvbWF0ZXJpYWxzL2luZGV4LmpzIiwiLi4vbm9kZV9tb2R1bGVzL3Bvc3Rwcm9jZXNzaW5nL3NyYy9wYXNzZXMvUGFzcy5qcyIsIi4uL25vZGVfbW9kdWxlcy9wb3N0cHJvY2Vzc2luZy9zcmMvcGFzc2VzL0JsdXJQYXNzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3Bvc3Rwcm9jZXNzaW5nL3NyYy9wYXNzZXMvQmxvb21QYXNzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3Bvc3Rwcm9jZXNzaW5nL3NyYy9wYXNzZXMvQm9rZWhQYXNzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3Bvc3Rwcm9jZXNzaW5nL3NyYy9wYXNzZXMvQ2xlYXJNYXNrUGFzcy5qcyIsIi4uL25vZGVfbW9kdWxlcy9wb3N0cHJvY2Vzc2luZy9zcmMvcGFzc2VzL0NsZWFyUGFzcy5qcyIsIi4uL25vZGVfbW9kdWxlcy9wb3N0cHJvY2Vzc2luZy9zcmMvcGFzc2VzL0RvdFNjcmVlblBhc3MuanMiLCIuLi9ub2RlX21vZHVsZXMvcG9zdHByb2Nlc3Npbmcvc3JjL3Bhc3Nlcy9GaWxtUGFzcy5qcyIsIi4uL25vZGVfbW9kdWxlcy9wb3N0cHJvY2Vzc2luZy9zcmMvcGFzc2VzL0dsaXRjaFBhc3MuanMiLCIuLi9ub2RlX21vZHVsZXMvcG9zdHByb2Nlc3Npbmcvc3JjL3Bhc3Nlcy9SZW5kZXJQYXNzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3Bvc3Rwcm9jZXNzaW5nL3NyYy9wYXNzZXMvR29kUmF5c1Bhc3MuanMiLCIuLi9ub2RlX21vZHVsZXMvcG9zdHByb2Nlc3Npbmcvc3JjL3Bhc3Nlcy9NYXNrUGFzcy5qcyIsIi4uL25vZGVfbW9kdWxlcy9wb3N0cHJvY2Vzc2luZy9zcmMvcGFzc2VzL1NoYWRlclBhc3MuanMiLCIuLi9ub2RlX21vZHVsZXMvcG9zdHByb2Nlc3Npbmcvc3JjL3Bhc3Nlcy9PdXRsaW5lUGFzcy5qcyIsIi4uL25vZGVfbW9kdWxlcy9wb3N0cHJvY2Vzc2luZy9zcmMvcGFzc2VzL1BpeGVsYXRpb25QYXNzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3Bvc3Rwcm9jZXNzaW5nL3NyYy9wYXNzZXMvUmVhbGlzdGljQm9rZWhQYXNzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3Bvc3Rwcm9jZXNzaW5nL3NyYy9wYXNzZXMvU2F2ZVBhc3MuanMiLCIuLi9ub2RlX21vZHVsZXMvcG9zdHByb2Nlc3Npbmcvc3JjL3Bhc3Nlcy9TaG9ja1dhdmVQYXNzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3Bvc3Rwcm9jZXNzaW5nL3NyYy9tYXRlcmlhbHMvaW1hZ2VzL3NtYWEvc2VhcmNoSW1hZ2VEYXRhVVJMLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3Bvc3Rwcm9jZXNzaW5nL3NyYy9tYXRlcmlhbHMvaW1hZ2VzL3NtYWEvYXJlYUltYWdlRGF0YVVSTC5qcyIsIi4uL25vZGVfbW9kdWxlcy9wb3N0cHJvY2Vzc2luZy9zcmMvcGFzc2VzL1NNQUFQYXNzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3Bvc3Rwcm9jZXNzaW5nL3NyYy9wYXNzZXMvVGV4dHVyZVBhc3MuanMiLCIuLi9ub2RlX21vZHVsZXMvcG9zdHByb2Nlc3Npbmcvc3JjL3Bhc3Nlcy9Ub25lTWFwcGluZ1Bhc3MuanMiLCIuLi9ub2RlX21vZHVsZXMvcG9zdHByb2Nlc3Npbmcvc3JjL3Bhc3Nlcy9pbmRleC5qcyIsIi4uL25vZGVfbW9kdWxlcy9wb3N0cHJvY2Vzc2luZy9zcmMvY29yZS9FZmZlY3RDb21wb3Nlci5qcyIsIi4uL3NyYy9tb2R1bGVzL2FwcC9Qb3N0UHJvY2Vzc29yTW9kdWxlLmpzIiwiLi4vc3JjL21vZHVsZXMvYXBwL0V2ZW50c1BhdGNoTW9kdWxlLmpzIiwiLi4vc3JjL21vZHVsZXMvYXBwL1ZpcnR1YWxNb3VzZU1vZHVsZS5qcyIsIi4uL3NyYy9tb2R1bGVzL2FwcC9Db250cm9sc01vZHVsZS5qcyIsIi4uL3NyYy9tb2R1bGVzL2FwcC9Gb2dNb2R1bGUuanMiLCIuLi9zcmMvbW9kdWxlcy9hcHAvU3RhdGVNb2R1bGUuanMiLCIuLi9zcmMvbW9kdWxlcy9hcHAvY29udHJvbHMvbGliL1RocmVlT3JiaXRDb250cm9scy5qcyIsIi4uL3NyYy9tb2R1bGVzL2FwcC9jb250cm9scy9PcmJpdENvbnRyb2xzTW9kdWxlLmpzIiwiLi4vc3JjL21vZHVsZXMvYXBwL2NvbnRyb2xzL2luZGV4LmpzIiwiLi4vc3JjL21vZHVsZXMvYXBwL2luZGV4LmpzIiwiLi4vc3JjL21vZHVsZXMvbWVzaC9EeW5hbWljR2VvbWV0cnlNb2R1bGUuanMiLCIuLi9zcmMvbW9kdWxlcy9tZXNoL1RleHR1cmVNb2R1bGUuanMiLCIuLi9zcmMvbW9kdWxlcy9tZXNoL0FuaW1hdGlvbk1vZHVsZS5qcyIsIi4uL3NyYy9tb2R1bGVzL21lc2gvaW5kZXguanMiLCIuLi9zcmMvbW9kdWxlcy9EZWZpbmVNb2R1bGUuanMiLCIuLi9zcmMvbW9kdWxlcy9pbmRleC5qcyIsIi4uL3NyYy9kZXByZWNhdGlvbi5qcyIsIi4uL3NyYy9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNC1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbiEoZnVuY3Rpb24oZ2xvYmFsKSB7XG4gIFwidXNlIHN0cmljdFwiO1xuXG4gIHZhciBPcCA9IE9iamVjdC5wcm90b3R5cGU7XG4gIHZhciBoYXNPd24gPSBPcC5oYXNPd25Qcm9wZXJ0eTtcbiAgdmFyIHVuZGVmaW5lZDsgLy8gTW9yZSBjb21wcmVzc2libGUgdGhhbiB2b2lkIDAuXG4gIHZhciAkU3ltYm9sID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiID8gU3ltYm9sIDoge307XG4gIHZhciBpdGVyYXRvclN5bWJvbCA9ICRTeW1ib2wuaXRlcmF0b3IgfHwgXCJAQGl0ZXJhdG9yXCI7XG4gIHZhciBhc3luY0l0ZXJhdG9yU3ltYm9sID0gJFN5bWJvbC5hc3luY0l0ZXJhdG9yIHx8IFwiQEBhc3luY0l0ZXJhdG9yXCI7XG4gIHZhciB0b1N0cmluZ1RhZ1N5bWJvbCA9ICRTeW1ib2wudG9TdHJpbmdUYWcgfHwgXCJAQHRvU3RyaW5nVGFnXCI7XG5cbiAgdmFyIGluTW9kdWxlID0gdHlwZW9mIG1vZHVsZSA9PT0gXCJvYmplY3RcIjtcbiAgdmFyIHJ1bnRpbWUgPSBnbG9iYWwucmVnZW5lcmF0b3JSdW50aW1lO1xuICBpZiAocnVudGltZSkge1xuICAgIGlmIChpbk1vZHVsZSkge1xuICAgICAgLy8gSWYgcmVnZW5lcmF0b3JSdW50aW1lIGlzIGRlZmluZWQgZ2xvYmFsbHkgYW5kIHdlJ3JlIGluIGEgbW9kdWxlLFxuICAgICAgLy8gbWFrZSB0aGUgZXhwb3J0cyBvYmplY3QgaWRlbnRpY2FsIHRvIHJlZ2VuZXJhdG9yUnVudGltZS5cbiAgICAgIG1vZHVsZS5leHBvcnRzID0gcnVudGltZTtcbiAgICB9XG4gICAgLy8gRG9uJ3QgYm90aGVyIGV2YWx1YXRpbmcgdGhlIHJlc3Qgb2YgdGhpcyBmaWxlIGlmIHRoZSBydW50aW1lIHdhc1xuICAgIC8vIGFscmVhZHkgZGVmaW5lZCBnbG9iYWxseS5cbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBEZWZpbmUgdGhlIHJ1bnRpbWUgZ2xvYmFsbHkgKGFzIGV4cGVjdGVkIGJ5IGdlbmVyYXRlZCBjb2RlKSBhcyBlaXRoZXJcbiAgLy8gbW9kdWxlLmV4cG9ydHMgKGlmIHdlJ3JlIGluIGEgbW9kdWxlKSBvciBhIG5ldywgZW1wdHkgb2JqZWN0LlxuICBydW50aW1lID0gZ2xvYmFsLnJlZ2VuZXJhdG9yUnVudGltZSA9IGluTW9kdWxlID8gbW9kdWxlLmV4cG9ydHMgOiB7fTtcblxuICBmdW5jdGlvbiB3cmFwKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0KSB7XG4gICAgLy8gSWYgb3V0ZXJGbiBwcm92aWRlZCBhbmQgb3V0ZXJGbi5wcm90b3R5cGUgaXMgYSBHZW5lcmF0b3IsIHRoZW4gb3V0ZXJGbi5wcm90b3R5cGUgaW5zdGFuY2VvZiBHZW5lcmF0b3IuXG4gICAgdmFyIHByb3RvR2VuZXJhdG9yID0gb3V0ZXJGbiAmJiBvdXRlckZuLnByb3RvdHlwZSBpbnN0YW5jZW9mIEdlbmVyYXRvciA/IG91dGVyRm4gOiBHZW5lcmF0b3I7XG4gICAgdmFyIGdlbmVyYXRvciA9IE9iamVjdC5jcmVhdGUocHJvdG9HZW5lcmF0b3IucHJvdG90eXBlKTtcbiAgICB2YXIgY29udGV4dCA9IG5ldyBDb250ZXh0KHRyeUxvY3NMaXN0IHx8IFtdKTtcblxuICAgIC8vIFRoZSAuX2ludm9rZSBtZXRob2QgdW5pZmllcyB0aGUgaW1wbGVtZW50YXRpb25zIG9mIHRoZSAubmV4dCxcbiAgICAvLyAudGhyb3csIGFuZCAucmV0dXJuIG1ldGhvZHMuXG4gICAgZ2VuZXJhdG9yLl9pbnZva2UgPSBtYWtlSW52b2tlTWV0aG9kKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpO1xuXG4gICAgcmV0dXJuIGdlbmVyYXRvcjtcbiAgfVxuICBydW50aW1lLndyYXAgPSB3cmFwO1xuXG4gIC8vIFRyeS9jYXRjaCBoZWxwZXIgdG8gbWluaW1pemUgZGVvcHRpbWl6YXRpb25zLiBSZXR1cm5zIGEgY29tcGxldGlvblxuICAvLyByZWNvcmQgbGlrZSBjb250ZXh0LnRyeUVudHJpZXNbaV0uY29tcGxldGlvbi4gVGhpcyBpbnRlcmZhY2UgY291bGRcbiAgLy8gaGF2ZSBiZWVuIChhbmQgd2FzIHByZXZpb3VzbHkpIGRlc2lnbmVkIHRvIHRha2UgYSBjbG9zdXJlIHRvIGJlXG4gIC8vIGludm9rZWQgd2l0aG91dCBhcmd1bWVudHMsIGJ1dCBpbiBhbGwgdGhlIGNhc2VzIHdlIGNhcmUgYWJvdXQgd2VcbiAgLy8gYWxyZWFkeSBoYXZlIGFuIGV4aXN0aW5nIG1ldGhvZCB3ZSB3YW50IHRvIGNhbGwsIHNvIHRoZXJlJ3Mgbm8gbmVlZFxuICAvLyB0byBjcmVhdGUgYSBuZXcgZnVuY3Rpb24gb2JqZWN0LiBXZSBjYW4gZXZlbiBnZXQgYXdheSB3aXRoIGFzc3VtaW5nXG4gIC8vIHRoZSBtZXRob2QgdGFrZXMgZXhhY3RseSBvbmUgYXJndW1lbnQsIHNpbmNlIHRoYXQgaGFwcGVucyB0byBiZSB0cnVlXG4gIC8vIGluIGV2ZXJ5IGNhc2UsIHNvIHdlIGRvbid0IGhhdmUgdG8gdG91Y2ggdGhlIGFyZ3VtZW50cyBvYmplY3QuIFRoZVxuICAvLyBvbmx5IGFkZGl0aW9uYWwgYWxsb2NhdGlvbiByZXF1aXJlZCBpcyB0aGUgY29tcGxldGlvbiByZWNvcmQsIHdoaWNoXG4gIC8vIGhhcyBhIHN0YWJsZSBzaGFwZSBhbmQgc28gaG9wZWZ1bGx5IHNob3VsZCBiZSBjaGVhcCB0byBhbGxvY2F0ZS5cbiAgZnVuY3Rpb24gdHJ5Q2F0Y2goZm4sIG9iaiwgYXJnKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB7IHR5cGU6IFwibm9ybWFsXCIsIGFyZzogZm4uY2FsbChvYmosIGFyZykgfTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHJldHVybiB7IHR5cGU6IFwidGhyb3dcIiwgYXJnOiBlcnIgfTtcbiAgICB9XG4gIH1cblxuICB2YXIgR2VuU3RhdGVTdXNwZW5kZWRTdGFydCA9IFwic3VzcGVuZGVkU3RhcnRcIjtcbiAgdmFyIEdlblN0YXRlU3VzcGVuZGVkWWllbGQgPSBcInN1c3BlbmRlZFlpZWxkXCI7XG4gIHZhciBHZW5TdGF0ZUV4ZWN1dGluZyA9IFwiZXhlY3V0aW5nXCI7XG4gIHZhciBHZW5TdGF0ZUNvbXBsZXRlZCA9IFwiY29tcGxldGVkXCI7XG5cbiAgLy8gUmV0dXJuaW5nIHRoaXMgb2JqZWN0IGZyb20gdGhlIGlubmVyRm4gaGFzIHRoZSBzYW1lIGVmZmVjdCBhc1xuICAvLyBicmVha2luZyBvdXQgb2YgdGhlIGRpc3BhdGNoIHN3aXRjaCBzdGF0ZW1lbnQuXG4gIHZhciBDb250aW51ZVNlbnRpbmVsID0ge307XG5cbiAgLy8gRHVtbXkgY29uc3RydWN0b3IgZnVuY3Rpb25zIHRoYXQgd2UgdXNlIGFzIHRoZSAuY29uc3RydWN0b3IgYW5kXG4gIC8vIC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUgcHJvcGVydGllcyBmb3IgZnVuY3Rpb25zIHRoYXQgcmV0dXJuIEdlbmVyYXRvclxuICAvLyBvYmplY3RzLiBGb3IgZnVsbCBzcGVjIGNvbXBsaWFuY2UsIHlvdSBtYXkgd2lzaCB0byBjb25maWd1cmUgeW91clxuICAvLyBtaW5pZmllciBub3QgdG8gbWFuZ2xlIHRoZSBuYW1lcyBvZiB0aGVzZSB0d28gZnVuY3Rpb25zLlxuICBmdW5jdGlvbiBHZW5lcmF0b3IoKSB7fVxuICBmdW5jdGlvbiBHZW5lcmF0b3JGdW5jdGlvbigpIHt9XG4gIGZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlKCkge31cblxuICAvLyBUaGlzIGlzIGEgcG9seWZpbGwgZm9yICVJdGVyYXRvclByb3RvdHlwZSUgZm9yIGVudmlyb25tZW50cyB0aGF0XG4gIC8vIGRvbid0IG5hdGl2ZWx5IHN1cHBvcnQgaXQuXG4gIHZhciBJdGVyYXRvclByb3RvdHlwZSA9IHt9O1xuICBJdGVyYXRvclByb3RvdHlwZVtpdGVyYXRvclN5bWJvbF0gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgdmFyIGdldFByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mO1xuICB2YXIgTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUgPSBnZXRQcm90byAmJiBnZXRQcm90byhnZXRQcm90byh2YWx1ZXMoW10pKSk7XG4gIGlmIChOYXRpdmVJdGVyYXRvclByb3RvdHlwZSAmJlxuICAgICAgTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUgIT09IE9wICYmXG4gICAgICBoYXNPd24uY2FsbChOYXRpdmVJdGVyYXRvclByb3RvdHlwZSwgaXRlcmF0b3JTeW1ib2wpKSB7XG4gICAgLy8gVGhpcyBlbnZpcm9ubWVudCBoYXMgYSBuYXRpdmUgJUl0ZXJhdG9yUHJvdG90eXBlJTsgdXNlIGl0IGluc3RlYWRcbiAgICAvLyBvZiB0aGUgcG9seWZpbGwuXG4gICAgSXRlcmF0b3JQcm90b3R5cGUgPSBOYXRpdmVJdGVyYXRvclByb3RvdHlwZTtcbiAgfVxuXG4gIHZhciBHcCA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLnByb3RvdHlwZSA9XG4gICAgR2VuZXJhdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoSXRlcmF0b3JQcm90b3R5cGUpO1xuICBHZW5lcmF0b3JGdW5jdGlvbi5wcm90b3R5cGUgPSBHcC5jb25zdHJ1Y3RvciA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlO1xuICBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEdlbmVyYXRvckZ1bmN0aW9uO1xuICBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZVt0b1N0cmluZ1RhZ1N5bWJvbF0gPVxuICAgIEdlbmVyYXRvckZ1bmN0aW9uLmRpc3BsYXlOYW1lID0gXCJHZW5lcmF0b3JGdW5jdGlvblwiO1xuXG4gIC8vIEhlbHBlciBmb3IgZGVmaW5pbmcgdGhlIC5uZXh0LCAudGhyb3csIGFuZCAucmV0dXJuIG1ldGhvZHMgb2YgdGhlXG4gIC8vIEl0ZXJhdG9yIGludGVyZmFjZSBpbiB0ZXJtcyBvZiBhIHNpbmdsZSAuX2ludm9rZSBtZXRob2QuXG4gIGZ1bmN0aW9uIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhwcm90b3R5cGUpIHtcbiAgICBbXCJuZXh0XCIsIFwidGhyb3dcIiwgXCJyZXR1cm5cIl0uZm9yRWFjaChmdW5jdGlvbihtZXRob2QpIHtcbiAgICAgIHByb3RvdHlwZVttZXRob2RdID0gZnVuY3Rpb24oYXJnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnZva2UobWV0aG9kLCBhcmcpO1xuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHJ1bnRpbWUuaXNHZW5lcmF0b3JGdW5jdGlvbiA9IGZ1bmN0aW9uKGdlbkZ1bikge1xuICAgIHZhciBjdG9yID0gdHlwZW9mIGdlbkZ1biA9PT0gXCJmdW5jdGlvblwiICYmIGdlbkZ1bi5jb25zdHJ1Y3RvcjtcbiAgICByZXR1cm4gY3RvclxuICAgICAgPyBjdG9yID09PSBHZW5lcmF0b3JGdW5jdGlvbiB8fFxuICAgICAgICAvLyBGb3IgdGhlIG5hdGl2ZSBHZW5lcmF0b3JGdW5jdGlvbiBjb25zdHJ1Y3RvciwgdGhlIGJlc3Qgd2UgY2FuXG4gICAgICAgIC8vIGRvIGlzIHRvIGNoZWNrIGl0cyAubmFtZSBwcm9wZXJ0eS5cbiAgICAgICAgKGN0b3IuZGlzcGxheU5hbWUgfHwgY3Rvci5uYW1lKSA9PT0gXCJHZW5lcmF0b3JGdW5jdGlvblwiXG4gICAgICA6IGZhbHNlO1xuICB9O1xuXG4gIHJ1bnRpbWUubWFyayA9IGZ1bmN0aW9uKGdlbkZ1bikge1xuICAgIGlmIChPYmplY3Quc2V0UHJvdG90eXBlT2YpIHtcbiAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihnZW5GdW4sIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZ2VuRnVuLl9fcHJvdG9fXyA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlO1xuICAgICAgaWYgKCEodG9TdHJpbmdUYWdTeW1ib2wgaW4gZ2VuRnVuKSkge1xuICAgICAgICBnZW5GdW5bdG9TdHJpbmdUYWdTeW1ib2xdID0gXCJHZW5lcmF0b3JGdW5jdGlvblwiO1xuICAgICAgfVxuICAgIH1cbiAgICBnZW5GdW4ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShHcCk7XG4gICAgcmV0dXJuIGdlbkZ1bjtcbiAgfTtcblxuICAvLyBXaXRoaW4gdGhlIGJvZHkgb2YgYW55IGFzeW5jIGZ1bmN0aW9uLCBgYXdhaXQgeGAgaXMgdHJhbnNmb3JtZWQgdG9cbiAgLy8gYHlpZWxkIHJlZ2VuZXJhdG9yUnVudGltZS5hd3JhcCh4KWAsIHNvIHRoYXQgdGhlIHJ1bnRpbWUgY2FuIHRlc3RcbiAgLy8gYGhhc093bi5jYWxsKHZhbHVlLCBcIl9fYXdhaXRcIilgIHRvIGRldGVybWluZSBpZiB0aGUgeWllbGRlZCB2YWx1ZSBpc1xuICAvLyBtZWFudCB0byBiZSBhd2FpdGVkLlxuICBydW50aW1lLmF3cmFwID0gZnVuY3Rpb24oYXJnKSB7XG4gICAgcmV0dXJuIHsgX19hd2FpdDogYXJnIH07XG4gIH07XG5cbiAgZnVuY3Rpb24gQXN5bmNJdGVyYXRvcihnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBpbnZva2UobWV0aG9kLCBhcmcsIHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKGdlbmVyYXRvclttZXRob2RdLCBnZW5lcmF0b3IsIGFyZyk7XG4gICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICByZWplY3QocmVjb3JkLmFyZyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgcmVzdWx0ID0gcmVjb3JkLmFyZztcbiAgICAgICAgdmFyIHZhbHVlID0gcmVzdWx0LnZhbHVlO1xuICAgICAgICBpZiAodmFsdWUgJiZcbiAgICAgICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICAgICAgaGFzT3duLmNhbGwodmFsdWUsIFwiX19hd2FpdFwiKSkge1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodmFsdWUuX19hd2FpdCkudGhlbihmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgICAgaW52b2tlKFwibmV4dFwiLCB2YWx1ZSwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICB9LCBmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgICAgIGludm9rZShcInRocm93XCIsIGVyciwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodmFsdWUpLnRoZW4oZnVuY3Rpb24odW53cmFwcGVkKSB7XG4gICAgICAgICAgLy8gV2hlbiBhIHlpZWxkZWQgUHJvbWlzZSBpcyByZXNvbHZlZCwgaXRzIGZpbmFsIHZhbHVlIGJlY29tZXNcbiAgICAgICAgICAvLyB0aGUgLnZhbHVlIG9mIHRoZSBQcm9taXNlPHt2YWx1ZSxkb25lfT4gcmVzdWx0IGZvciB0aGVcbiAgICAgICAgICAvLyBjdXJyZW50IGl0ZXJhdGlvbi4gSWYgdGhlIFByb21pc2UgaXMgcmVqZWN0ZWQsIGhvd2V2ZXIsIHRoZVxuICAgICAgICAgIC8vIHJlc3VsdCBmb3IgdGhpcyBpdGVyYXRpb24gd2lsbCBiZSByZWplY3RlZCB3aXRoIHRoZSBzYW1lXG4gICAgICAgICAgLy8gcmVhc29uLiBOb3RlIHRoYXQgcmVqZWN0aW9ucyBvZiB5aWVsZGVkIFByb21pc2VzIGFyZSBub3RcbiAgICAgICAgICAvLyB0aHJvd24gYmFjayBpbnRvIHRoZSBnZW5lcmF0b3IgZnVuY3Rpb24sIGFzIGlzIHRoZSBjYXNlXG4gICAgICAgICAgLy8gd2hlbiBhbiBhd2FpdGVkIFByb21pc2UgaXMgcmVqZWN0ZWQuIFRoaXMgZGlmZmVyZW5jZSBpblxuICAgICAgICAgIC8vIGJlaGF2aW9yIGJldHdlZW4geWllbGQgYW5kIGF3YWl0IGlzIGltcG9ydGFudCwgYmVjYXVzZSBpdFxuICAgICAgICAgIC8vIGFsbG93cyB0aGUgY29uc3VtZXIgdG8gZGVjaWRlIHdoYXQgdG8gZG8gd2l0aCB0aGUgeWllbGRlZFxuICAgICAgICAgIC8vIHJlamVjdGlvbiAoc3dhbGxvdyBpdCBhbmQgY29udGludWUsIG1hbnVhbGx5IC50aHJvdyBpdCBiYWNrXG4gICAgICAgICAgLy8gaW50byB0aGUgZ2VuZXJhdG9yLCBhYmFuZG9uIGl0ZXJhdGlvbiwgd2hhdGV2ZXIpLiBXaXRoXG4gICAgICAgICAgLy8gYXdhaXQsIGJ5IGNvbnRyYXN0LCB0aGVyZSBpcyBubyBvcHBvcnR1bml0eSB0byBleGFtaW5lIHRoZVxuICAgICAgICAgIC8vIHJlamVjdGlvbiByZWFzb24gb3V0c2lkZSB0aGUgZ2VuZXJhdG9yIGZ1bmN0aW9uLCBzbyB0aGVcbiAgICAgICAgICAvLyBvbmx5IG9wdGlvbiBpcyB0byB0aHJvdyBpdCBmcm9tIHRoZSBhd2FpdCBleHByZXNzaW9uLCBhbmRcbiAgICAgICAgICAvLyBsZXQgdGhlIGdlbmVyYXRvciBmdW5jdGlvbiBoYW5kbGUgdGhlIGV4Y2VwdGlvbi5cbiAgICAgICAgICByZXN1bHQudmFsdWUgPSB1bndyYXBwZWQ7XG4gICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICB9LCByZWplY3QpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBwcmV2aW91c1Byb21pc2U7XG5cbiAgICBmdW5jdGlvbiBlbnF1ZXVlKG1ldGhvZCwgYXJnKSB7XG4gICAgICBmdW5jdGlvbiBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgIGludm9rZShtZXRob2QsIGFyZywgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwcmV2aW91c1Byb21pc2UgPVxuICAgICAgICAvLyBJZiBlbnF1ZXVlIGhhcyBiZWVuIGNhbGxlZCBiZWZvcmUsIHRoZW4gd2Ugd2FudCB0byB3YWl0IHVudGlsXG4gICAgICAgIC8vIGFsbCBwcmV2aW91cyBQcm9taXNlcyBoYXZlIGJlZW4gcmVzb2x2ZWQgYmVmb3JlIGNhbGxpbmcgaW52b2tlLFxuICAgICAgICAvLyBzbyB0aGF0IHJlc3VsdHMgYXJlIGFsd2F5cyBkZWxpdmVyZWQgaW4gdGhlIGNvcnJlY3Qgb3JkZXIuIElmXG4gICAgICAgIC8vIGVucXVldWUgaGFzIG5vdCBiZWVuIGNhbGxlZCBiZWZvcmUsIHRoZW4gaXQgaXMgaW1wb3J0YW50IHRvXG4gICAgICAgIC8vIGNhbGwgaW52b2tlIGltbWVkaWF0ZWx5LCB3aXRob3V0IHdhaXRpbmcgb24gYSBjYWxsYmFjayB0byBmaXJlLFxuICAgICAgICAvLyBzbyB0aGF0IHRoZSBhc3luYyBnZW5lcmF0b3IgZnVuY3Rpb24gaGFzIHRoZSBvcHBvcnR1bml0eSB0byBkb1xuICAgICAgICAvLyBhbnkgbmVjZXNzYXJ5IHNldHVwIGluIGEgcHJlZGljdGFibGUgd2F5LiBUaGlzIHByZWRpY3RhYmlsaXR5XG4gICAgICAgIC8vIGlzIHdoeSB0aGUgUHJvbWlzZSBjb25zdHJ1Y3RvciBzeW5jaHJvbm91c2x5IGludm9rZXMgaXRzXG4gICAgICAgIC8vIGV4ZWN1dG9yIGNhbGxiYWNrLCBhbmQgd2h5IGFzeW5jIGZ1bmN0aW9ucyBzeW5jaHJvbm91c2x5XG4gICAgICAgIC8vIGV4ZWN1dGUgY29kZSBiZWZvcmUgdGhlIGZpcnN0IGF3YWl0LiBTaW5jZSB3ZSBpbXBsZW1lbnQgc2ltcGxlXG4gICAgICAgIC8vIGFzeW5jIGZ1bmN0aW9ucyBpbiB0ZXJtcyBvZiBhc3luYyBnZW5lcmF0b3JzLCBpdCBpcyBlc3BlY2lhbGx5XG4gICAgICAgIC8vIGltcG9ydGFudCB0byBnZXQgdGhpcyByaWdodCwgZXZlbiB0aG91Z2ggaXQgcmVxdWlyZXMgY2FyZS5cbiAgICAgICAgcHJldmlvdXNQcm9taXNlID8gcHJldmlvdXNQcm9taXNlLnRoZW4oXG4gICAgICAgICAgY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcsXG4gICAgICAgICAgLy8gQXZvaWQgcHJvcGFnYXRpbmcgZmFpbHVyZXMgdG8gUHJvbWlzZXMgcmV0dXJuZWQgYnkgbGF0ZXJcbiAgICAgICAgICAvLyBpbnZvY2F0aW9ucyBvZiB0aGUgaXRlcmF0b3IuXG4gICAgICAgICAgY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmdcbiAgICAgICAgKSA6IGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnKCk7XG4gICAgfVxuXG4gICAgLy8gRGVmaW5lIHRoZSB1bmlmaWVkIGhlbHBlciBtZXRob2QgdGhhdCBpcyB1c2VkIHRvIGltcGxlbWVudCAubmV4dCxcbiAgICAvLyAudGhyb3csIGFuZCAucmV0dXJuIChzZWUgZGVmaW5lSXRlcmF0b3JNZXRob2RzKS5cbiAgICB0aGlzLl9pbnZva2UgPSBlbnF1ZXVlO1xuICB9XG5cbiAgZGVmaW5lSXRlcmF0b3JNZXRob2RzKEFzeW5jSXRlcmF0b3IucHJvdG90eXBlKTtcbiAgQXN5bmNJdGVyYXRvci5wcm90b3R5cGVbYXN5bmNJdGVyYXRvclN5bWJvbF0gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG4gIHJ1bnRpbWUuQXN5bmNJdGVyYXRvciA9IEFzeW5jSXRlcmF0b3I7XG5cbiAgLy8gTm90ZSB0aGF0IHNpbXBsZSBhc3luYyBmdW5jdGlvbnMgYXJlIGltcGxlbWVudGVkIG9uIHRvcCBvZlxuICAvLyBBc3luY0l0ZXJhdG9yIG9iamVjdHM7IHRoZXkganVzdCByZXR1cm4gYSBQcm9taXNlIGZvciB0aGUgdmFsdWUgb2ZcbiAgLy8gdGhlIGZpbmFsIHJlc3VsdCBwcm9kdWNlZCBieSB0aGUgaXRlcmF0b3IuXG4gIHJ1bnRpbWUuYXN5bmMgPSBmdW5jdGlvbihpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdCkge1xuICAgIHZhciBpdGVyID0gbmV3IEFzeW5jSXRlcmF0b3IoXG4gICAgICB3cmFwKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0KVxuICAgICk7XG5cbiAgICByZXR1cm4gcnVudGltZS5pc0dlbmVyYXRvckZ1bmN0aW9uKG91dGVyRm4pXG4gICAgICA/IGl0ZXIgLy8gSWYgb3V0ZXJGbiBpcyBhIGdlbmVyYXRvciwgcmV0dXJuIHRoZSBmdWxsIGl0ZXJhdG9yLlxuICAgICAgOiBpdGVyLm5leHQoKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkge1xuICAgICAgICAgIHJldHVybiByZXN1bHQuZG9uZSA/IHJlc3VsdC52YWx1ZSA6IGl0ZXIubmV4dCgpO1xuICAgICAgICB9KTtcbiAgfTtcblxuICBmdW5jdGlvbiBtYWtlSW52b2tlTWV0aG9kKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpIHtcbiAgICB2YXIgc3RhdGUgPSBHZW5TdGF0ZVN1c3BlbmRlZFN0YXJ0O1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIGludm9rZShtZXRob2QsIGFyZykge1xuICAgICAgaWYgKHN0YXRlID09PSBHZW5TdGF0ZUV4ZWN1dGluZykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBydW5uaW5nXCIpO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3RhdGUgPT09IEdlblN0YXRlQ29tcGxldGVkKSB7XG4gICAgICAgIGlmIChtZXRob2QgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgIHRocm93IGFyZztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEJlIGZvcmdpdmluZywgcGVyIDI1LjMuMy4zLjMgb2YgdGhlIHNwZWM6XG4gICAgICAgIC8vIGh0dHBzOi8vcGVvcGxlLm1vemlsbGEub3JnL35qb3JlbmRvcmZmL2VzNi1kcmFmdC5odG1sI3NlYy1nZW5lcmF0b3JyZXN1bWVcbiAgICAgICAgcmV0dXJuIGRvbmVSZXN1bHQoKTtcbiAgICAgIH1cblxuICAgICAgY29udGV4dC5tZXRob2QgPSBtZXRob2Q7XG4gICAgICBjb250ZXh0LmFyZyA9IGFyZztcblxuICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgdmFyIGRlbGVnYXRlID0gY29udGV4dC5kZWxlZ2F0ZTtcbiAgICAgICAgaWYgKGRlbGVnYXRlKSB7XG4gICAgICAgICAgdmFyIGRlbGVnYXRlUmVzdWx0ID0gbWF5YmVJbnZva2VEZWxlZ2F0ZShkZWxlZ2F0ZSwgY29udGV4dCk7XG4gICAgICAgICAgaWYgKGRlbGVnYXRlUmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAoZGVsZWdhdGVSZXN1bHQgPT09IENvbnRpbnVlU2VudGluZWwpIGNvbnRpbnVlO1xuICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlUmVzdWx0O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJuZXh0XCIpIHtcbiAgICAgICAgICAvLyBTZXR0aW5nIGNvbnRleHQuX3NlbnQgZm9yIGxlZ2FjeSBzdXBwb3J0IG9mIEJhYmVsJ3NcbiAgICAgICAgICAvLyBmdW5jdGlvbi5zZW50IGltcGxlbWVudGF0aW9uLlxuICAgICAgICAgIGNvbnRleHQuc2VudCA9IGNvbnRleHQuX3NlbnQgPSBjb250ZXh0LmFyZztcblxuICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHQubWV0aG9kID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICBpZiAoc3RhdGUgPT09IEdlblN0YXRlU3VzcGVuZGVkU3RhcnQpIHtcbiAgICAgICAgICAgIHN0YXRlID0gR2VuU3RhdGVDb21wbGV0ZWQ7XG4gICAgICAgICAgICB0aHJvdyBjb250ZXh0LmFyZztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb250ZXh0LmRpc3BhdGNoRXhjZXB0aW9uKGNvbnRleHQuYXJnKTtcblxuICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHQubWV0aG9kID09PSBcInJldHVyblwiKSB7XG4gICAgICAgICAgY29udGV4dC5hYnJ1cHQoXCJyZXR1cm5cIiwgY29udGV4dC5hcmcpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3RhdGUgPSBHZW5TdGF0ZUV4ZWN1dGluZztcblxuICAgICAgICB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2goaW5uZXJGbiwgc2VsZiwgY29udGV4dCk7XG4gICAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJub3JtYWxcIikge1xuICAgICAgICAgIC8vIElmIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gZnJvbSBpbm5lckZuLCB3ZSBsZWF2ZSBzdGF0ZSA9PT1cbiAgICAgICAgICAvLyBHZW5TdGF0ZUV4ZWN1dGluZyBhbmQgbG9vcCBiYWNrIGZvciBhbm90aGVyIGludm9jYXRpb24uXG4gICAgICAgICAgc3RhdGUgPSBjb250ZXh0LmRvbmVcbiAgICAgICAgICAgID8gR2VuU3RhdGVDb21wbGV0ZWRcbiAgICAgICAgICAgIDogR2VuU3RhdGVTdXNwZW5kZWRZaWVsZDtcblxuICAgICAgICAgIGlmIChyZWNvcmQuYXJnID09PSBDb250aW51ZVNlbnRpbmVsKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdmFsdWU6IHJlY29yZC5hcmcsXG4gICAgICAgICAgICBkb25lOiBjb250ZXh0LmRvbmVcbiAgICAgICAgICB9O1xuXG4gICAgICAgIH0gZWxzZSBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgIHN0YXRlID0gR2VuU3RhdGVDb21wbGV0ZWQ7XG4gICAgICAgICAgLy8gRGlzcGF0Y2ggdGhlIGV4Y2VwdGlvbiBieSBsb29waW5nIGJhY2sgYXJvdW5kIHRvIHRoZVxuICAgICAgICAgIC8vIGNvbnRleHQuZGlzcGF0Y2hFeGNlcHRpb24oY29udGV4dC5hcmcpIGNhbGwgYWJvdmUuXG4gICAgICAgICAgY29udGV4dC5tZXRob2QgPSBcInRocm93XCI7XG4gICAgICAgICAgY29udGV4dC5hcmcgPSByZWNvcmQuYXJnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8vIENhbGwgZGVsZWdhdGUuaXRlcmF0b3JbY29udGV4dC5tZXRob2RdKGNvbnRleHQuYXJnKSBhbmQgaGFuZGxlIHRoZVxuICAvLyByZXN1bHQsIGVpdGhlciBieSByZXR1cm5pbmcgYSB7IHZhbHVlLCBkb25lIH0gcmVzdWx0IGZyb20gdGhlXG4gIC8vIGRlbGVnYXRlIGl0ZXJhdG9yLCBvciBieSBtb2RpZnlpbmcgY29udGV4dC5tZXRob2QgYW5kIGNvbnRleHQuYXJnLFxuICAvLyBzZXR0aW5nIGNvbnRleHQuZGVsZWdhdGUgdG8gbnVsbCwgYW5kIHJldHVybmluZyB0aGUgQ29udGludWVTZW50aW5lbC5cbiAgZnVuY3Rpb24gbWF5YmVJbnZva2VEZWxlZ2F0ZShkZWxlZ2F0ZSwgY29udGV4dCkge1xuICAgIHZhciBtZXRob2QgPSBkZWxlZ2F0ZS5pdGVyYXRvcltjb250ZXh0Lm1ldGhvZF07XG4gICAgaWYgKG1ldGhvZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBBIC50aHJvdyBvciAucmV0dXJuIHdoZW4gdGhlIGRlbGVnYXRlIGl0ZXJhdG9yIGhhcyBubyAudGhyb3dcbiAgICAgIC8vIG1ldGhvZCBhbHdheXMgdGVybWluYXRlcyB0aGUgeWllbGQqIGxvb3AuXG4gICAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDtcblxuICAgICAgaWYgKGNvbnRleHQubWV0aG9kID09PSBcInRocm93XCIpIHtcbiAgICAgICAgaWYgKGRlbGVnYXRlLml0ZXJhdG9yLnJldHVybikge1xuICAgICAgICAgIC8vIElmIHRoZSBkZWxlZ2F0ZSBpdGVyYXRvciBoYXMgYSByZXR1cm4gbWV0aG9kLCBnaXZlIGl0IGFcbiAgICAgICAgICAvLyBjaGFuY2UgdG8gY2xlYW4gdXAuXG4gICAgICAgICAgY29udGV4dC5tZXRob2QgPSBcInJldHVyblwiO1xuICAgICAgICAgIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkO1xuICAgICAgICAgIG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpO1xuXG4gICAgICAgICAgaWYgKGNvbnRleHQubWV0aG9kID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICAgIC8vIElmIG1heWJlSW52b2tlRGVsZWdhdGUoY29udGV4dCkgY2hhbmdlZCBjb250ZXh0Lm1ldGhvZCBmcm9tXG4gICAgICAgICAgICAvLyBcInJldHVyblwiIHRvIFwidGhyb3dcIiwgbGV0IHRoYXQgb3ZlcnJpZGUgdGhlIFR5cGVFcnJvciBiZWxvdy5cbiAgICAgICAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgICBjb250ZXh0LmFyZyA9IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgXCJUaGUgaXRlcmF0b3IgZG9lcyBub3QgcHJvdmlkZSBhICd0aHJvdycgbWV0aG9kXCIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9XG5cbiAgICB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2gobWV0aG9kLCBkZWxlZ2F0ZS5pdGVyYXRvciwgY29udGV4dC5hcmcpO1xuXG4gICAgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgY29udGV4dC5hcmcgPSByZWNvcmQuYXJnO1xuICAgICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9XG5cbiAgICB2YXIgaW5mbyA9IHJlY29yZC5hcmc7XG5cbiAgICBpZiAoISBpbmZvKSB7XG4gICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgIGNvbnRleHQuYXJnID0gbmV3IFR5cGVFcnJvcihcIml0ZXJhdG9yIHJlc3VsdCBpcyBub3QgYW4gb2JqZWN0XCIpO1xuICAgICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9XG5cbiAgICBpZiAoaW5mby5kb25lKSB7XG4gICAgICAvLyBBc3NpZ24gdGhlIHJlc3VsdCBvZiB0aGUgZmluaXNoZWQgZGVsZWdhdGUgdG8gdGhlIHRlbXBvcmFyeVxuICAgICAgLy8gdmFyaWFibGUgc3BlY2lmaWVkIGJ5IGRlbGVnYXRlLnJlc3VsdE5hbWUgKHNlZSBkZWxlZ2F0ZVlpZWxkKS5cbiAgICAgIGNvbnRleHRbZGVsZWdhdGUucmVzdWx0TmFtZV0gPSBpbmZvLnZhbHVlO1xuXG4gICAgICAvLyBSZXN1bWUgZXhlY3V0aW9uIGF0IHRoZSBkZXNpcmVkIGxvY2F0aW9uIChzZWUgZGVsZWdhdGVZaWVsZCkuXG4gICAgICBjb250ZXh0Lm5leHQgPSBkZWxlZ2F0ZS5uZXh0TG9jO1xuXG4gICAgICAvLyBJZiBjb250ZXh0Lm1ldGhvZCB3YXMgXCJ0aHJvd1wiIGJ1dCB0aGUgZGVsZWdhdGUgaGFuZGxlZCB0aGVcbiAgICAgIC8vIGV4Y2VwdGlvbiwgbGV0IHRoZSBvdXRlciBnZW5lcmF0b3IgcHJvY2VlZCBub3JtYWxseS4gSWZcbiAgICAgIC8vIGNvbnRleHQubWV0aG9kIHdhcyBcIm5leHRcIiwgZm9yZ2V0IGNvbnRleHQuYXJnIHNpbmNlIGl0IGhhcyBiZWVuXG4gICAgICAvLyBcImNvbnN1bWVkXCIgYnkgdGhlIGRlbGVnYXRlIGl0ZXJhdG9yLiBJZiBjb250ZXh0Lm1ldGhvZCB3YXNcbiAgICAgIC8vIFwicmV0dXJuXCIsIGFsbG93IHRoZSBvcmlnaW5hbCAucmV0dXJuIGNhbGwgdG8gY29udGludWUgaW4gdGhlXG4gICAgICAvLyBvdXRlciBnZW5lcmF0b3IuXG4gICAgICBpZiAoY29udGV4dC5tZXRob2QgIT09IFwicmV0dXJuXCIpIHtcbiAgICAgICAgY29udGV4dC5tZXRob2QgPSBcIm5leHRcIjtcbiAgICAgICAgY29udGV4dC5hcmcgPSB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUmUteWllbGQgdGhlIHJlc3VsdCByZXR1cm5lZCBieSB0aGUgZGVsZWdhdGUgbWV0aG9kLlxuICAgICAgcmV0dXJuIGluZm87XG4gICAgfVxuXG4gICAgLy8gVGhlIGRlbGVnYXRlIGl0ZXJhdG9yIGlzIGZpbmlzaGVkLCBzbyBmb3JnZXQgaXQgYW5kIGNvbnRpbnVlIHdpdGhcbiAgICAvLyB0aGUgb3V0ZXIgZ2VuZXJhdG9yLlxuICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICB9XG5cbiAgLy8gRGVmaW5lIEdlbmVyYXRvci5wcm90b3R5cGUue25leHQsdGhyb3cscmV0dXJufSBpbiB0ZXJtcyBvZiB0aGVcbiAgLy8gdW5pZmllZCAuX2ludm9rZSBoZWxwZXIgbWV0aG9kLlxuICBkZWZpbmVJdGVyYXRvck1ldGhvZHMoR3ApO1xuXG4gIEdwW3RvU3RyaW5nVGFnU3ltYm9sXSA9IFwiR2VuZXJhdG9yXCI7XG5cbiAgLy8gQSBHZW5lcmF0b3Igc2hvdWxkIGFsd2F5cyByZXR1cm4gaXRzZWxmIGFzIHRoZSBpdGVyYXRvciBvYmplY3Qgd2hlbiB0aGVcbiAgLy8gQEBpdGVyYXRvciBmdW5jdGlvbiBpcyBjYWxsZWQgb24gaXQuIFNvbWUgYnJvd3NlcnMnIGltcGxlbWVudGF0aW9ucyBvZiB0aGVcbiAgLy8gaXRlcmF0b3IgcHJvdG90eXBlIGNoYWluIGluY29ycmVjdGx5IGltcGxlbWVudCB0aGlzLCBjYXVzaW5nIHRoZSBHZW5lcmF0b3JcbiAgLy8gb2JqZWN0IHRvIG5vdCBiZSByZXR1cm5lZCBmcm9tIHRoaXMgY2FsbC4gVGhpcyBlbnN1cmVzIHRoYXQgZG9lc24ndCBoYXBwZW4uXG4gIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVnZW5lcmF0b3IvaXNzdWVzLzI3NCBmb3IgbW9yZSBkZXRhaWxzLlxuICBHcFtpdGVyYXRvclN5bWJvbF0gPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBHcC50b1N0cmluZyA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBcIltvYmplY3QgR2VuZXJhdG9yXVwiO1xuICB9O1xuXG4gIGZ1bmN0aW9uIHB1c2hUcnlFbnRyeShsb2NzKSB7XG4gICAgdmFyIGVudHJ5ID0geyB0cnlMb2M6IGxvY3NbMF0gfTtcblxuICAgIGlmICgxIGluIGxvY3MpIHtcbiAgICAgIGVudHJ5LmNhdGNoTG9jID0gbG9jc1sxXTtcbiAgICB9XG5cbiAgICBpZiAoMiBpbiBsb2NzKSB7XG4gICAgICBlbnRyeS5maW5hbGx5TG9jID0gbG9jc1syXTtcbiAgICAgIGVudHJ5LmFmdGVyTG9jID0gbG9jc1szXTtcbiAgICB9XG5cbiAgICB0aGlzLnRyeUVudHJpZXMucHVzaChlbnRyeSk7XG4gIH1cblxuICBmdW5jdGlvbiByZXNldFRyeUVudHJ5KGVudHJ5KSB7XG4gICAgdmFyIHJlY29yZCA9IGVudHJ5LmNvbXBsZXRpb24gfHwge307XG4gICAgcmVjb3JkLnR5cGUgPSBcIm5vcm1hbFwiO1xuICAgIGRlbGV0ZSByZWNvcmQuYXJnO1xuICAgIGVudHJ5LmNvbXBsZXRpb24gPSByZWNvcmQ7XG4gIH1cblxuICBmdW5jdGlvbiBDb250ZXh0KHRyeUxvY3NMaXN0KSB7XG4gICAgLy8gVGhlIHJvb3QgZW50cnkgb2JqZWN0IChlZmZlY3RpdmVseSBhIHRyeSBzdGF0ZW1lbnQgd2l0aG91dCBhIGNhdGNoXG4gICAgLy8gb3IgYSBmaW5hbGx5IGJsb2NrKSBnaXZlcyB1cyBhIHBsYWNlIHRvIHN0b3JlIHZhbHVlcyB0aHJvd24gZnJvbVxuICAgIC8vIGxvY2F0aW9ucyB3aGVyZSB0aGVyZSBpcyBubyBlbmNsb3NpbmcgdHJ5IHN0YXRlbWVudC5cbiAgICB0aGlzLnRyeUVudHJpZXMgPSBbeyB0cnlMb2M6IFwicm9vdFwiIH1dO1xuICAgIHRyeUxvY3NMaXN0LmZvckVhY2gocHVzaFRyeUVudHJ5LCB0aGlzKTtcbiAgICB0aGlzLnJlc2V0KHRydWUpO1xuICB9XG5cbiAgcnVudGltZS5rZXlzID0gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgdmFyIGtleXMgPSBbXTtcbiAgICBmb3IgKHZhciBrZXkgaW4gb2JqZWN0KSB7XG4gICAgICBrZXlzLnB1c2goa2V5KTtcbiAgICB9XG4gICAga2V5cy5yZXZlcnNlKCk7XG5cbiAgICAvLyBSYXRoZXIgdGhhbiByZXR1cm5pbmcgYW4gb2JqZWN0IHdpdGggYSBuZXh0IG1ldGhvZCwgd2Uga2VlcFxuICAgIC8vIHRoaW5ncyBzaW1wbGUgYW5kIHJldHVybiB0aGUgbmV4dCBmdW5jdGlvbiBpdHNlbGYuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICB3aGlsZSAoa2V5cy5sZW5ndGgpIHtcbiAgICAgICAgdmFyIGtleSA9IGtleXMucG9wKCk7XG4gICAgICAgIGlmIChrZXkgaW4gb2JqZWN0KSB7XG4gICAgICAgICAgbmV4dC52YWx1ZSA9IGtleTtcbiAgICAgICAgICBuZXh0LmRvbmUgPSBmYWxzZTtcbiAgICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBUbyBhdm9pZCBjcmVhdGluZyBhbiBhZGRpdGlvbmFsIG9iamVjdCwgd2UganVzdCBoYW5nIHRoZSAudmFsdWVcbiAgICAgIC8vIGFuZCAuZG9uZSBwcm9wZXJ0aWVzIG9mZiB0aGUgbmV4dCBmdW5jdGlvbiBvYmplY3QgaXRzZWxmLiBUaGlzXG4gICAgICAvLyBhbHNvIGVuc3VyZXMgdGhhdCB0aGUgbWluaWZpZXIgd2lsbCBub3QgYW5vbnltaXplIHRoZSBmdW5jdGlvbi5cbiAgICAgIG5leHQuZG9uZSA9IHRydWU7XG4gICAgICByZXR1cm4gbmV4dDtcbiAgICB9O1xuICB9O1xuXG4gIGZ1bmN0aW9uIHZhbHVlcyhpdGVyYWJsZSkge1xuICAgIGlmIChpdGVyYWJsZSkge1xuICAgICAgdmFyIGl0ZXJhdG9yTWV0aG9kID0gaXRlcmFibGVbaXRlcmF0b3JTeW1ib2xdO1xuICAgICAgaWYgKGl0ZXJhdG9yTWV0aG9kKSB7XG4gICAgICAgIHJldHVybiBpdGVyYXRvck1ldGhvZC5jYWxsKGl0ZXJhYmxlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBpdGVyYWJsZS5uZXh0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgcmV0dXJuIGl0ZXJhYmxlO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWlzTmFOKGl0ZXJhYmxlLmxlbmd0aCkpIHtcbiAgICAgICAgdmFyIGkgPSAtMSwgbmV4dCA9IGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICAgICAgd2hpbGUgKCsraSA8IGl0ZXJhYmxlLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKGhhc093bi5jYWxsKGl0ZXJhYmxlLCBpKSkge1xuICAgICAgICAgICAgICBuZXh0LnZhbHVlID0gaXRlcmFibGVbaV07XG4gICAgICAgICAgICAgIG5leHQuZG9uZSA9IGZhbHNlO1xuICAgICAgICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBuZXh0LnZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICAgIG5leHQuZG9uZSA9IHRydWU7XG5cbiAgICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gbmV4dC5uZXh0ID0gbmV4dDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gYW4gaXRlcmF0b3Igd2l0aCBubyB2YWx1ZXMuXG4gICAgcmV0dXJuIHsgbmV4dDogZG9uZVJlc3VsdCB9O1xuICB9XG4gIHJ1bnRpbWUudmFsdWVzID0gdmFsdWVzO1xuXG4gIGZ1bmN0aW9uIGRvbmVSZXN1bHQoKSB7XG4gICAgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9O1xuICB9XG5cbiAgQ29udGV4dC5wcm90b3R5cGUgPSB7XG4gICAgY29uc3RydWN0b3I6IENvbnRleHQsXG5cbiAgICByZXNldDogZnVuY3Rpb24oc2tpcFRlbXBSZXNldCkge1xuICAgICAgdGhpcy5wcmV2ID0gMDtcbiAgICAgIHRoaXMubmV4dCA9IDA7XG4gICAgICAvLyBSZXNldHRpbmcgY29udGV4dC5fc2VudCBmb3IgbGVnYWN5IHN1cHBvcnQgb2YgQmFiZWwnc1xuICAgICAgLy8gZnVuY3Rpb24uc2VudCBpbXBsZW1lbnRhdGlvbi5cbiAgICAgIHRoaXMuc2VudCA9IHRoaXMuX3NlbnQgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLmRvbmUgPSBmYWxzZTtcbiAgICAgIHRoaXMuZGVsZWdhdGUgPSBudWxsO1xuXG4gICAgICB0aGlzLm1ldGhvZCA9IFwibmV4dFwiO1xuICAgICAgdGhpcy5hcmcgPSB1bmRlZmluZWQ7XG5cbiAgICAgIHRoaXMudHJ5RW50cmllcy5mb3JFYWNoKHJlc2V0VHJ5RW50cnkpO1xuXG4gICAgICBpZiAoIXNraXBUZW1wUmVzZXQpIHtcbiAgICAgICAgZm9yICh2YXIgbmFtZSBpbiB0aGlzKSB7XG4gICAgICAgICAgLy8gTm90IHN1cmUgYWJvdXQgdGhlIG9wdGltYWwgb3JkZXIgb2YgdGhlc2UgY29uZGl0aW9uczpcbiAgICAgICAgICBpZiAobmFtZS5jaGFyQXQoMCkgPT09IFwidFwiICYmXG4gICAgICAgICAgICAgIGhhc093bi5jYWxsKHRoaXMsIG5hbWUpICYmXG4gICAgICAgICAgICAgICFpc05hTigrbmFtZS5zbGljZSgxKSkpIHtcbiAgICAgICAgICAgIHRoaXNbbmFtZV0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIHN0b3A6IGZ1bmN0aW9uKCkge1xuICAgICAgdGhpcy5kb25lID0gdHJ1ZTtcblxuICAgICAgdmFyIHJvb3RFbnRyeSA9IHRoaXMudHJ5RW50cmllc1swXTtcbiAgICAgIHZhciByb290UmVjb3JkID0gcm9vdEVudHJ5LmNvbXBsZXRpb247XG4gICAgICBpZiAocm9vdFJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgdGhyb3cgcm9vdFJlY29yZC5hcmc7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLnJ2YWw7XG4gICAgfSxcblxuICAgIGRpc3BhdGNoRXhjZXB0aW9uOiBmdW5jdGlvbihleGNlcHRpb24pIHtcbiAgICAgIGlmICh0aGlzLmRvbmUpIHtcbiAgICAgICAgdGhyb3cgZXhjZXB0aW9uO1xuICAgICAgfVxuXG4gICAgICB2YXIgY29udGV4dCA9IHRoaXM7XG4gICAgICBmdW5jdGlvbiBoYW5kbGUobG9jLCBjYXVnaHQpIHtcbiAgICAgICAgcmVjb3JkLnR5cGUgPSBcInRocm93XCI7XG4gICAgICAgIHJlY29yZC5hcmcgPSBleGNlcHRpb247XG4gICAgICAgIGNvbnRleHQubmV4dCA9IGxvYztcblxuICAgICAgICBpZiAoY2F1Z2h0KSB7XG4gICAgICAgICAgLy8gSWYgdGhlIGRpc3BhdGNoZWQgZXhjZXB0aW9uIHdhcyBjYXVnaHQgYnkgYSBjYXRjaCBibG9jayxcbiAgICAgICAgICAvLyB0aGVuIGxldCB0aGF0IGNhdGNoIGJsb2NrIGhhbmRsZSB0aGUgZXhjZXB0aW9uIG5vcm1hbGx5LlxuICAgICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJuZXh0XCI7XG4gICAgICAgICAgY29udGV4dC5hcmcgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gISEgY2F1Z2h0O1xuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcbiAgICAgICAgdmFyIHJlY29yZCA9IGVudHJ5LmNvbXBsZXRpb247XG5cbiAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA9PT0gXCJyb290XCIpIHtcbiAgICAgICAgICAvLyBFeGNlcHRpb24gdGhyb3duIG91dHNpZGUgb2YgYW55IHRyeSBibG9jayB0aGF0IGNvdWxkIGhhbmRsZVxuICAgICAgICAgIC8vIGl0LCBzbyBzZXQgdGhlIGNvbXBsZXRpb24gdmFsdWUgb2YgdGhlIGVudGlyZSBmdW5jdGlvbiB0b1xuICAgICAgICAgIC8vIHRocm93IHRoZSBleGNlcHRpb24uXG4gICAgICAgICAgcmV0dXJuIGhhbmRsZShcImVuZFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPD0gdGhpcy5wcmV2KSB7XG4gICAgICAgICAgdmFyIGhhc0NhdGNoID0gaGFzT3duLmNhbGwoZW50cnksIFwiY2F0Y2hMb2NcIik7XG4gICAgICAgICAgdmFyIGhhc0ZpbmFsbHkgPSBoYXNPd24uY2FsbChlbnRyeSwgXCJmaW5hbGx5TG9jXCIpO1xuXG4gICAgICAgICAgaWYgKGhhc0NhdGNoICYmIGhhc0ZpbmFsbHkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5jYXRjaExvYykge1xuICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmNhdGNoTG9jLCB0cnVlKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5wcmV2IDwgZW50cnkuZmluYWxseUxvYykge1xuICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmZpbmFsbHlMb2MpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgfSBlbHNlIGlmIChoYXNDYXRjaCkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmNhdGNoTG9jKSB7XG4gICAgICAgICAgICAgIHJldHVybiBoYW5kbGUoZW50cnkuY2F0Y2hMb2MsIHRydWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgfSBlbHNlIGlmIChoYXNGaW5hbGx5KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuZmluYWxseUxvYykge1xuICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmZpbmFsbHlMb2MpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInRyeSBzdGF0ZW1lbnQgd2l0aG91dCBjYXRjaCBvciBmaW5hbGx5XCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBhYnJ1cHQ6IGZ1bmN0aW9uKHR5cGUsIGFyZykge1xuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPD0gdGhpcy5wcmV2ICYmXG4gICAgICAgICAgICBoYXNPd24uY2FsbChlbnRyeSwgXCJmaW5hbGx5TG9jXCIpICYmXG4gICAgICAgICAgICB0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSB7XG4gICAgICAgICAgdmFyIGZpbmFsbHlFbnRyeSA9IGVudHJ5O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChmaW5hbGx5RW50cnkgJiZcbiAgICAgICAgICAodHlwZSA9PT0gXCJicmVha1wiIHx8XG4gICAgICAgICAgIHR5cGUgPT09IFwiY29udGludWVcIikgJiZcbiAgICAgICAgICBmaW5hbGx5RW50cnkudHJ5TG9jIDw9IGFyZyAmJlxuICAgICAgICAgIGFyZyA8PSBmaW5hbGx5RW50cnkuZmluYWxseUxvYykge1xuICAgICAgICAvLyBJZ25vcmUgdGhlIGZpbmFsbHkgZW50cnkgaWYgY29udHJvbCBpcyBub3QganVtcGluZyB0byBhXG4gICAgICAgIC8vIGxvY2F0aW9uIG91dHNpZGUgdGhlIHRyeS9jYXRjaCBibG9jay5cbiAgICAgICAgZmluYWxseUVudHJ5ID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgdmFyIHJlY29yZCA9IGZpbmFsbHlFbnRyeSA/IGZpbmFsbHlFbnRyeS5jb21wbGV0aW9uIDoge307XG4gICAgICByZWNvcmQudHlwZSA9IHR5cGU7XG4gICAgICByZWNvcmQuYXJnID0gYXJnO1xuXG4gICAgICBpZiAoZmluYWxseUVudHJ5KSB7XG4gICAgICAgIHRoaXMubWV0aG9kID0gXCJuZXh0XCI7XG4gICAgICAgIHRoaXMubmV4dCA9IGZpbmFsbHlFbnRyeS5maW5hbGx5TG9jO1xuICAgICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuY29tcGxldGUocmVjb3JkKTtcbiAgICB9LFxuXG4gICAgY29tcGxldGU6IGZ1bmN0aW9uKHJlY29yZCwgYWZ0ZXJMb2MpIHtcbiAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIHRocm93IHJlY29yZC5hcmc7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJicmVha1wiIHx8XG4gICAgICAgICAgcmVjb3JkLnR5cGUgPT09IFwiY29udGludWVcIikge1xuICAgICAgICB0aGlzLm5leHQgPSByZWNvcmQuYXJnO1xuICAgICAgfSBlbHNlIGlmIChyZWNvcmQudHlwZSA9PT0gXCJyZXR1cm5cIikge1xuICAgICAgICB0aGlzLnJ2YWwgPSB0aGlzLmFyZyA9IHJlY29yZC5hcmc7XG4gICAgICAgIHRoaXMubWV0aG9kID0gXCJyZXR1cm5cIjtcbiAgICAgICAgdGhpcy5uZXh0ID0gXCJlbmRcIjtcbiAgICAgIH0gZWxzZSBpZiAocmVjb3JkLnR5cGUgPT09IFwibm9ybWFsXCIgJiYgYWZ0ZXJMb2MpIHtcbiAgICAgICAgdGhpcy5uZXh0ID0gYWZ0ZXJMb2M7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgIH0sXG5cbiAgICBmaW5pc2g6IGZ1bmN0aW9uKGZpbmFsbHlMb2MpIHtcbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICBpZiAoZW50cnkuZmluYWxseUxvYyA9PT0gZmluYWxseUxvYykge1xuICAgICAgICAgIHRoaXMuY29tcGxldGUoZW50cnkuY29tcGxldGlvbiwgZW50cnkuYWZ0ZXJMb2MpO1xuICAgICAgICAgIHJlc2V0VHJ5RW50cnkoZW50cnkpO1xuICAgICAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIFwiY2F0Y2hcIjogZnVuY3Rpb24odHJ5TG9jKSB7XG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcbiAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA9PT0gdHJ5TG9jKSB7XG4gICAgICAgICAgdmFyIHJlY29yZCA9IGVudHJ5LmNvbXBsZXRpb247XG4gICAgICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICAgIHZhciB0aHJvd24gPSByZWNvcmQuYXJnO1xuICAgICAgICAgICAgcmVzZXRUcnlFbnRyeShlbnRyeSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0aHJvd247XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVGhlIGNvbnRleHQuY2F0Y2ggbWV0aG9kIG11c3Qgb25seSBiZSBjYWxsZWQgd2l0aCBhIGxvY2F0aW9uXG4gICAgICAvLyBhcmd1bWVudCB0aGF0IGNvcnJlc3BvbmRzIHRvIGEga25vd24gY2F0Y2ggYmxvY2suXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbGxlZ2FsIGNhdGNoIGF0dGVtcHRcIik7XG4gICAgfSxcblxuICAgIGRlbGVnYXRlWWllbGQ6IGZ1bmN0aW9uKGl0ZXJhYmxlLCByZXN1bHROYW1lLCBuZXh0TG9jKSB7XG4gICAgICB0aGlzLmRlbGVnYXRlID0ge1xuICAgICAgICBpdGVyYXRvcjogdmFsdWVzKGl0ZXJhYmxlKSxcbiAgICAgICAgcmVzdWx0TmFtZTogcmVzdWx0TmFtZSxcbiAgICAgICAgbmV4dExvYzogbmV4dExvY1xuICAgICAgfTtcblxuICAgICAgaWYgKHRoaXMubWV0aG9kID09PSBcIm5leHRcIikge1xuICAgICAgICAvLyBEZWxpYmVyYXRlbHkgZm9yZ2V0IHRoZSBsYXN0IHNlbnQgdmFsdWUgc28gdGhhdCB3ZSBkb24ndFxuICAgICAgICAvLyBhY2NpZGVudGFsbHkgcGFzcyBpdCBvbiB0byB0aGUgZGVsZWdhdGUuXG4gICAgICAgIHRoaXMuYXJnID0gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9XG4gIH07XG59KShcbiAgLy8gSW4gc2xvcHB5IG1vZGUsIHVuYm91bmQgYHRoaXNgIHJlZmVycyB0byB0aGUgZ2xvYmFsIG9iamVjdCwgZmFsbGJhY2sgdG9cbiAgLy8gRnVuY3Rpb24gY29uc3RydWN0b3IgaWYgd2UncmUgaW4gZ2xvYmFsIHN0cmljdCBtb2RlLiBUaGF0IGlzIHNhZGx5IGEgZm9ybVxuICAvLyBvZiBpbmRpcmVjdCBldmFsIHdoaWNoIHZpb2xhdGVzIENvbnRlbnQgU2VjdXJpdHkgUG9saWN5LlxuICAoZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzIH0pKCkgfHwgRnVuY3Rpb24oXCJyZXR1cm4gdGhpc1wiKSgpXG4pO1xuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4vLyBUaGlzIG1ldGhvZCBvZiBvYnRhaW5pbmcgYSByZWZlcmVuY2UgdG8gdGhlIGdsb2JhbCBvYmplY3QgbmVlZHMgdG8gYmVcbi8vIGtlcHQgaWRlbnRpY2FsIHRvIHRoZSB3YXkgaXQgaXMgb2J0YWluZWQgaW4gcnVudGltZS5qc1xudmFyIGcgPSAoZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzIH0pKCkgfHwgRnVuY3Rpb24oXCJyZXR1cm4gdGhpc1wiKSgpO1xuXG4vLyBVc2UgYGdldE93blByb3BlcnR5TmFtZXNgIGJlY2F1c2Ugbm90IGFsbCBicm93c2VycyBzdXBwb3J0IGNhbGxpbmdcbi8vIGBoYXNPd25Qcm9wZXJ0eWAgb24gdGhlIGdsb2JhbCBgc2VsZmAgb2JqZWN0IGluIGEgd29ya2VyLiBTZWUgIzE4My5cbnZhciBoYWRSdW50aW1lID0gZy5yZWdlbmVyYXRvclJ1bnRpbWUgJiZcbiAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZykuaW5kZXhPZihcInJlZ2VuZXJhdG9yUnVudGltZVwiKSA+PSAwO1xuXG4vLyBTYXZlIHRoZSBvbGQgcmVnZW5lcmF0b3JSdW50aW1lIGluIGNhc2UgaXQgbmVlZHMgdG8gYmUgcmVzdG9yZWQgbGF0ZXIuXG52YXIgb2xkUnVudGltZSA9IGhhZFJ1bnRpbWUgJiYgZy5yZWdlbmVyYXRvclJ1bnRpbWU7XG5cbi8vIEZvcmNlIHJlZXZhbHV0YXRpb24gb2YgcnVudGltZS5qcy5cbmcucmVnZW5lcmF0b3JSdW50aW1lID0gdW5kZWZpbmVkO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCIuL3J1bnRpbWVcIik7XG5cbmlmIChoYWRSdW50aW1lKSB7XG4gIC8vIFJlc3RvcmUgdGhlIG9yaWdpbmFsIHJ1bnRpbWUuXG4gIGcucmVnZW5lcmF0b3JSdW50aW1lID0gb2xkUnVudGltZTtcbn0gZWxzZSB7XG4gIC8vIFJlbW92ZSB0aGUgZ2xvYmFsIHByb3BlcnR5IGFkZGVkIGJ5IHJ1bnRpbWUuanMuXG4gIHRyeSB7XG4gICAgZGVsZXRlIGcucmVnZW5lcmF0b3JSdW50aW1lO1xuICB9IGNhdGNoKGUpIHtcbiAgICBnLnJlZ2VuZXJhdG9yUnVudGltZSA9IHVuZGVmaW5lZDtcbiAgfVxufVxuIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicmVnZW5lcmF0b3ItcnVudGltZVwiKTtcbiIsIi8vIDcuMS40IFRvSW50ZWdlclxudmFyIGNlaWwgPSBNYXRoLmNlaWw7XG52YXIgZmxvb3IgPSBNYXRoLmZsb29yO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGlzTmFOKGl0ID0gK2l0KSA/IDAgOiAoaXQgPiAwID8gZmxvb3IgOiBjZWlsKShpdCk7XG59O1xuIiwiLy8gNy4yLjEgUmVxdWlyZU9iamVjdENvZXJjaWJsZShhcmd1bWVudClcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmIChpdCA9PSB1bmRlZmluZWQpIHRocm93IFR5cGVFcnJvcihcIkNhbid0IGNhbGwgbWV0aG9kIG9uICBcIiArIGl0KTtcbiAgcmV0dXJuIGl0O1xufTtcbiIsInZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuL190by1pbnRlZ2VyJyk7XG52YXIgZGVmaW5lZCA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKTtcbi8vIHRydWUgIC0+IFN0cmluZyNhdFxuLy8gZmFsc2UgLT4gU3RyaW5nI2NvZGVQb2ludEF0XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChUT19TVFJJTkcpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh0aGF0LCBwb3MpIHtcbiAgICB2YXIgcyA9IFN0cmluZyhkZWZpbmVkKHRoYXQpKTtcbiAgICB2YXIgaSA9IHRvSW50ZWdlcihwb3MpO1xuICAgIHZhciBsID0gcy5sZW5ndGg7XG4gICAgdmFyIGEsIGI7XG4gICAgaWYgKGkgPCAwIHx8IGkgPj0gbCkgcmV0dXJuIFRPX1NUUklORyA/ICcnIDogdW5kZWZpbmVkO1xuICAgIGEgPSBzLmNoYXJDb2RlQXQoaSk7XG4gICAgcmV0dXJuIGEgPCAweGQ4MDAgfHwgYSA+IDB4ZGJmZiB8fCBpICsgMSA9PT0gbCB8fCAoYiA9IHMuY2hhckNvZGVBdChpICsgMSkpIDwgMHhkYzAwIHx8IGIgPiAweGRmZmZcbiAgICAgID8gVE9fU1RSSU5HID8gcy5jaGFyQXQoaSkgOiBhXG4gICAgICA6IFRPX1NUUklORyA/IHMuc2xpY2UoaSwgaSArIDIpIDogKGEgLSAweGQ4MDAgPDwgMTApICsgKGIgLSAweGRjMDApICsgMHgxMDAwMDtcbiAgfTtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHRydWU7XG4iLCIvLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvODYjaXNzdWVjb21tZW50LTExNTc1OTAyOFxudmFyIGdsb2JhbCA9IG1vZHVsZS5leHBvcnRzID0gdHlwZW9mIHdpbmRvdyAhPSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuTWF0aCA9PSBNYXRoXG4gID8gd2luZG93IDogdHlwZW9mIHNlbGYgIT0gJ3VuZGVmaW5lZCcgJiYgc2VsZi5NYXRoID09IE1hdGggPyBzZWxmXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXctZnVuY1xuICA6IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5pZiAodHlwZW9mIF9fZyA9PSAnbnVtYmVyJykgX19nID0gZ2xvYmFsOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG4iLCJ2YXIgY29yZSA9IG1vZHVsZS5leHBvcnRzID0geyB2ZXJzaW9uOiAnMi41LjYnIH07XG5pZiAodHlwZW9mIF9fZSA9PSAnbnVtYmVyJykgX19lID0gY29yZTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKHR5cGVvZiBpdCAhPSAnZnVuY3Rpb24nKSB0aHJvdyBUeXBlRXJyb3IoaXQgKyAnIGlzIG5vdCBhIGZ1bmN0aW9uIScpO1xuICByZXR1cm4gaXQ7XG59O1xuIiwiLy8gb3B0aW9uYWwgLyBzaW1wbGUgY29udGV4dCBiaW5kaW5nXG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZm4sIHRoYXQsIGxlbmd0aCkge1xuICBhRnVuY3Rpb24oZm4pO1xuICBpZiAodGhhdCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gZm47XG4gIHN3aXRjaCAobGVuZ3RoKSB7XG4gICAgY2FzZSAxOiByZXR1cm4gZnVuY3Rpb24gKGEpIHtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEpO1xuICAgIH07XG4gICAgY2FzZSAyOiByZXR1cm4gZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEsIGIpO1xuICAgIH07XG4gICAgY2FzZSAzOiByZXR1cm4gZnVuY3Rpb24gKGEsIGIsIGMpIHtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEsIGIsIGMpO1xuICAgIH07XG4gIH1cbiAgcmV0dXJuIGZ1bmN0aW9uICgvKiAuLi5hcmdzICovKSB7XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoYXQsIGFyZ3VtZW50cyk7XG4gIH07XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIHR5cGVvZiBpdCA9PT0gJ29iamVjdCcgPyBpdCAhPT0gbnVsbCA6IHR5cGVvZiBpdCA9PT0gJ2Z1bmN0aW9uJztcbn07XG4iLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmICghaXNPYmplY3QoaXQpKSB0aHJvdyBUeXBlRXJyb3IoaXQgKyAnIGlzIG5vdCBhbiBvYmplY3QhJyk7XG4gIHJldHVybiBpdDtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChleGVjKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuICEhZXhlYygpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn07XG4iLCIvLyBUaGFuaydzIElFOCBmb3IgaGlzIGZ1bm55IGRlZmluZVByb3BlcnR5XG5tb2R1bGUuZXhwb3J0cyA9ICFyZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgJ2EnLCB7IGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gNzsgfSB9KS5hICE9IDc7XG59KTtcbiIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIGRvY3VtZW50ID0gcmVxdWlyZSgnLi9fZ2xvYmFsJykuZG9jdW1lbnQ7XG4vLyB0eXBlb2YgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCBpcyAnb2JqZWN0JyBpbiBvbGQgSUVcbnZhciBpcyA9IGlzT2JqZWN0KGRvY3VtZW50KSAmJiBpc09iamVjdChkb2N1bWVudC5jcmVhdGVFbGVtZW50KTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBpcyA/IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoaXQpIDoge307XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSAhcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSAmJiAhcmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkocmVxdWlyZSgnLi9fZG9tLWNyZWF0ZScpKCdkaXYnKSwgJ2EnLCB7IGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gNzsgfSB9KS5hICE9IDc7XG59KTtcbiIsIi8vIDcuMS4xIFRvUHJpbWl0aXZlKGlucHV0IFssIFByZWZlcnJlZFR5cGVdKVxudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG4vLyBpbnN0ZWFkIG9mIHRoZSBFUzYgc3BlYyB2ZXJzaW9uLCB3ZSBkaWRuJ3QgaW1wbGVtZW50IEBAdG9QcmltaXRpdmUgY2FzZVxuLy8gYW5kIHRoZSBzZWNvbmQgYXJndW1lbnQgLSBmbGFnIC0gcHJlZmVycmVkIHR5cGUgaXMgYSBzdHJpbmdcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0LCBTKSB7XG4gIGlmICghaXNPYmplY3QoaXQpKSByZXR1cm4gaXQ7XG4gIHZhciBmbiwgdmFsO1xuICBpZiAoUyAmJiB0eXBlb2YgKGZuID0gaXQudG9TdHJpbmcpID09ICdmdW5jdGlvbicgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaXQpKSkgcmV0dXJuIHZhbDtcbiAgaWYgKHR5cGVvZiAoZm4gPSBpdC52YWx1ZU9mKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGl0KSkpIHJldHVybiB2YWw7XG4gIGlmICghUyAmJiB0eXBlb2YgKGZuID0gaXQudG9TdHJpbmcpID09ICdmdW5jdGlvbicgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaXQpKSkgcmV0dXJuIHZhbDtcbiAgdGhyb3cgVHlwZUVycm9yKFwiQ2FuJ3QgY29udmVydCBvYmplY3QgdG8gcHJpbWl0aXZlIHZhbHVlXCIpO1xufTtcbiIsInZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIElFOF9ET01fREVGSU5FID0gcmVxdWlyZSgnLi9faWU4LWRvbS1kZWZpbmUnKTtcbnZhciB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4vX3RvLXByaW1pdGl2ZScpO1xudmFyIGRQID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xuXG5leHBvcnRzLmYgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpID8gT2JqZWN0LmRlZmluZVByb3BlcnR5IDogZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcykge1xuICBhbk9iamVjdChPKTtcbiAgUCA9IHRvUHJpbWl0aXZlKFAsIHRydWUpO1xuICBhbk9iamVjdChBdHRyaWJ1dGVzKTtcbiAgaWYgKElFOF9ET01fREVGSU5FKSB0cnkge1xuICAgIHJldHVybiBkUChPLCBQLCBBdHRyaWJ1dGVzKTtcbiAgfSBjYXRjaCAoZSkgeyAvKiBlbXB0eSAqLyB9XG4gIGlmICgnZ2V0JyBpbiBBdHRyaWJ1dGVzIHx8ICdzZXQnIGluIEF0dHJpYnV0ZXMpIHRocm93IFR5cGVFcnJvcignQWNjZXNzb3JzIG5vdCBzdXBwb3J0ZWQhJyk7XG4gIGlmICgndmFsdWUnIGluIEF0dHJpYnV0ZXMpIE9bUF0gPSBBdHRyaWJ1dGVzLnZhbHVlO1xuICByZXR1cm4gTztcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChiaXRtYXAsIHZhbHVlKSB7XG4gIHJldHVybiB7XG4gICAgZW51bWVyYWJsZTogIShiaXRtYXAgJiAxKSxcbiAgICBjb25maWd1cmFibGU6ICEoYml0bWFwICYgMiksXG4gICAgd3JpdGFibGU6ICEoYml0bWFwICYgNCksXG4gICAgdmFsdWU6IHZhbHVlXG4gIH07XG59O1xuIiwidmFyIGRQID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJyk7XG52YXIgY3JlYXRlRGVzYyA9IHJlcXVpcmUoJy4vX3Byb3BlcnR5LWRlc2MnKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSA/IGZ1bmN0aW9uIChvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgcmV0dXJuIGRQLmYob2JqZWN0LCBrZXksIGNyZWF0ZURlc2MoMSwgdmFsdWUpKTtcbn0gOiBmdW5jdGlvbiAob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIG9iamVjdFtrZXldID0gdmFsdWU7XG4gIHJldHVybiBvYmplY3Q7XG59O1xuIiwidmFyIGhhc093blByb3BlcnR5ID0ge30uaGFzT3duUHJvcGVydHk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwga2V5KSB7XG4gIHJldHVybiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGl0LCBrZXkpO1xufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBjb3JlID0gcmVxdWlyZSgnLi9fY29yZScpO1xudmFyIGN0eCA9IHJlcXVpcmUoJy4vX2N0eCcpO1xudmFyIGhpZGUgPSByZXF1aXJlKCcuL19oaWRlJyk7XG52YXIgaGFzID0gcmVxdWlyZSgnLi9faGFzJyk7XG52YXIgUFJPVE9UWVBFID0gJ3Byb3RvdHlwZSc7XG5cbnZhciAkZXhwb3J0ID0gZnVuY3Rpb24gKHR5cGUsIG5hbWUsIHNvdXJjZSkge1xuICB2YXIgSVNfRk9SQ0VEID0gdHlwZSAmICRleHBvcnQuRjtcbiAgdmFyIElTX0dMT0JBTCA9IHR5cGUgJiAkZXhwb3J0Lkc7XG4gIHZhciBJU19TVEFUSUMgPSB0eXBlICYgJGV4cG9ydC5TO1xuICB2YXIgSVNfUFJPVE8gPSB0eXBlICYgJGV4cG9ydC5QO1xuICB2YXIgSVNfQklORCA9IHR5cGUgJiAkZXhwb3J0LkI7XG4gIHZhciBJU19XUkFQID0gdHlwZSAmICRleHBvcnQuVztcbiAgdmFyIGV4cG9ydHMgPSBJU19HTE9CQUwgPyBjb3JlIDogY29yZVtuYW1lXSB8fCAoY29yZVtuYW1lXSA9IHt9KTtcbiAgdmFyIGV4cFByb3RvID0gZXhwb3J0c1tQUk9UT1RZUEVdO1xuICB2YXIgdGFyZ2V0ID0gSVNfR0xPQkFMID8gZ2xvYmFsIDogSVNfU1RBVElDID8gZ2xvYmFsW25hbWVdIDogKGdsb2JhbFtuYW1lXSB8fCB7fSlbUFJPVE9UWVBFXTtcbiAgdmFyIGtleSwgb3duLCBvdXQ7XG4gIGlmIChJU19HTE9CQUwpIHNvdXJjZSA9IG5hbWU7XG4gIGZvciAoa2V5IGluIHNvdXJjZSkge1xuICAgIC8vIGNvbnRhaW5zIGluIG5hdGl2ZVxuICAgIG93biA9ICFJU19GT1JDRUQgJiYgdGFyZ2V0ICYmIHRhcmdldFtrZXldICE9PSB1bmRlZmluZWQ7XG4gICAgaWYgKG93biAmJiBoYXMoZXhwb3J0cywga2V5KSkgY29udGludWU7XG4gICAgLy8gZXhwb3J0IG5hdGl2ZSBvciBwYXNzZWRcbiAgICBvdXQgPSBvd24gPyB0YXJnZXRba2V5XSA6IHNvdXJjZVtrZXldO1xuICAgIC8vIHByZXZlbnQgZ2xvYmFsIHBvbGx1dGlvbiBmb3IgbmFtZXNwYWNlc1xuICAgIGV4cG9ydHNba2V5XSA9IElTX0dMT0JBTCAmJiB0eXBlb2YgdGFyZ2V0W2tleV0gIT0gJ2Z1bmN0aW9uJyA/IHNvdXJjZVtrZXldXG4gICAgLy8gYmluZCB0aW1lcnMgdG8gZ2xvYmFsIGZvciBjYWxsIGZyb20gZXhwb3J0IGNvbnRleHRcbiAgICA6IElTX0JJTkQgJiYgb3duID8gY3R4KG91dCwgZ2xvYmFsKVxuICAgIC8vIHdyYXAgZ2xvYmFsIGNvbnN0cnVjdG9ycyBmb3IgcHJldmVudCBjaGFuZ2UgdGhlbSBpbiBsaWJyYXJ5XG4gICAgOiBJU19XUkFQICYmIHRhcmdldFtrZXldID09IG91dCA/IChmdW5jdGlvbiAoQykge1xuICAgICAgdmFyIEYgPSBmdW5jdGlvbiAoYSwgYiwgYykge1xuICAgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIEMpIHtcbiAgICAgICAgICBzd2l0Y2ggKGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIG5ldyBDKCk7XG4gICAgICAgICAgICBjYXNlIDE6IHJldHVybiBuZXcgQyhhKTtcbiAgICAgICAgICAgIGNhc2UgMjogcmV0dXJuIG5ldyBDKGEsIGIpO1xuICAgICAgICAgIH0gcmV0dXJuIG5ldyBDKGEsIGIsIGMpO1xuICAgICAgICB9IHJldHVybiBDLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9O1xuICAgICAgRltQUk9UT1RZUEVdID0gQ1tQUk9UT1RZUEVdO1xuICAgICAgcmV0dXJuIEY7XG4gICAgLy8gbWFrZSBzdGF0aWMgdmVyc2lvbnMgZm9yIHByb3RvdHlwZSBtZXRob2RzXG4gICAgfSkob3V0KSA6IElTX1BST1RPICYmIHR5cGVvZiBvdXQgPT0gJ2Z1bmN0aW9uJyA/IGN0eChGdW5jdGlvbi5jYWxsLCBvdXQpIDogb3V0O1xuICAgIC8vIGV4cG9ydCBwcm90byBtZXRob2RzIHRvIGNvcmUuJUNPTlNUUlVDVE9SJS5tZXRob2RzLiVOQU1FJVxuICAgIGlmIChJU19QUk9UTykge1xuICAgICAgKGV4cG9ydHMudmlydHVhbCB8fCAoZXhwb3J0cy52aXJ0dWFsID0ge30pKVtrZXldID0gb3V0O1xuICAgICAgLy8gZXhwb3J0IHByb3RvIG1ldGhvZHMgdG8gY29yZS4lQ09OU1RSVUNUT1IlLnByb3RvdHlwZS4lTkFNRSVcbiAgICAgIGlmICh0eXBlICYgJGV4cG9ydC5SICYmIGV4cFByb3RvICYmICFleHBQcm90b1trZXldKSBoaWRlKGV4cFByb3RvLCBrZXksIG91dCk7XG4gICAgfVxuICB9XG59O1xuLy8gdHlwZSBiaXRtYXBcbiRleHBvcnQuRiA9IDE7ICAgLy8gZm9yY2VkXG4kZXhwb3J0LkcgPSAyOyAgIC8vIGdsb2JhbFxuJGV4cG9ydC5TID0gNDsgICAvLyBzdGF0aWNcbiRleHBvcnQuUCA9IDg7ICAgLy8gcHJvdG9cbiRleHBvcnQuQiA9IDE2OyAgLy8gYmluZFxuJGV4cG9ydC5XID0gMzI7ICAvLyB3cmFwXG4kZXhwb3J0LlUgPSA2NDsgIC8vIHNhZmVcbiRleHBvcnQuUiA9IDEyODsgLy8gcmVhbCBwcm90byBtZXRob2QgZm9yIGBsaWJyYXJ5YFxubW9kdWxlLmV4cG9ydHMgPSAkZXhwb3J0O1xuIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19oaWRlJyk7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHt9O1xuIiwidmFyIHRvU3RyaW5nID0ge30udG9TdHJpbmc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKGl0KS5zbGljZSg4LCAtMSk7XG59O1xuIiwiLy8gZmFsbGJhY2sgZm9yIG5vbi1hcnJheS1saWtlIEVTMyBhbmQgbm9uLWVudW1lcmFibGUgb2xkIFY4IHN0cmluZ3NcbnZhciBjb2YgPSByZXF1aXJlKCcuL19jb2YnKTtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0KCd6JykucHJvcGVydHlJc0VudW1lcmFibGUoMCkgPyBPYmplY3QgOiBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGNvZihpdCkgPT0gJ1N0cmluZycgPyBpdC5zcGxpdCgnJykgOiBPYmplY3QoaXQpO1xufTtcbiIsIi8vIHRvIGluZGV4ZWQgb2JqZWN0LCB0b09iamVjdCB3aXRoIGZhbGxiYWNrIGZvciBub24tYXJyYXktbGlrZSBFUzMgc3RyaW5nc1xudmFyIElPYmplY3QgPSByZXF1aXJlKCcuL19pb2JqZWN0Jyk7XG52YXIgZGVmaW5lZCA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBJT2JqZWN0KGRlZmluZWQoaXQpKTtcbn07XG4iLCIvLyA3LjEuMTUgVG9MZW5ndGhcbnZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuL190by1pbnRlZ2VyJyk7XG52YXIgbWluID0gTWF0aC5taW47XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXQgPiAwID8gbWluKHRvSW50ZWdlcihpdCksIDB4MWZmZmZmZmZmZmZmZmYpIDogMDsgLy8gcG93KDIsIDUzKSAtIDEgPT0gOTAwNzE5OTI1NDc0MDk5MVxufTtcbiIsInZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuL190by1pbnRlZ2VyJyk7XG52YXIgbWF4ID0gTWF0aC5tYXg7XG52YXIgbWluID0gTWF0aC5taW47XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpbmRleCwgbGVuZ3RoKSB7XG4gIGluZGV4ID0gdG9JbnRlZ2VyKGluZGV4KTtcbiAgcmV0dXJuIGluZGV4IDwgMCA/IG1heChpbmRleCArIGxlbmd0aCwgMCkgOiBtaW4oaW5kZXgsIGxlbmd0aCk7XG59O1xuIiwiLy8gZmFsc2UgLT4gQXJyYXkjaW5kZXhPZlxuLy8gdHJ1ZSAgLT4gQXJyYXkjaW5jbHVkZXNcbnZhciB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0Jyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuL190by1sZW5ndGgnKTtcbnZhciB0b0Fic29sdXRlSW5kZXggPSByZXF1aXJlKCcuL190by1hYnNvbHV0ZS1pbmRleCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoSVNfSU5DTFVERVMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgkdGhpcywgZWwsIGZyb21JbmRleCkge1xuICAgIHZhciBPID0gdG9JT2JqZWN0KCR0aGlzKTtcbiAgICB2YXIgbGVuZ3RoID0gdG9MZW5ndGgoTy5sZW5ndGgpO1xuICAgIHZhciBpbmRleCA9IHRvQWJzb2x1dGVJbmRleChmcm9tSW5kZXgsIGxlbmd0aCk7XG4gICAgdmFyIHZhbHVlO1xuICAgIC8vIEFycmF5I2luY2x1ZGVzIHVzZXMgU2FtZVZhbHVlWmVybyBlcXVhbGl0eSBhbGdvcml0aG1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gICAgaWYgKElTX0lOQ0xVREVTICYmIGVsICE9IGVsKSB3aGlsZSAobGVuZ3RoID4gaW5kZXgpIHtcbiAgICAgIHZhbHVlID0gT1tpbmRleCsrXTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgICAgIGlmICh2YWx1ZSAhPSB2YWx1ZSkgcmV0dXJuIHRydWU7XG4gICAgLy8gQXJyYXkjaW5kZXhPZiBpZ25vcmVzIGhvbGVzLCBBcnJheSNpbmNsdWRlcyAtIG5vdFxuICAgIH0gZWxzZSBmb3IgKDtsZW5ndGggPiBpbmRleDsgaW5kZXgrKykgaWYgKElTX0lOQ0xVREVTIHx8IGluZGV4IGluIE8pIHtcbiAgICAgIGlmIChPW2luZGV4XSA9PT0gZWwpIHJldHVybiBJU19JTkNMVURFUyB8fCBpbmRleCB8fCAwO1xuICAgIH0gcmV0dXJuICFJU19JTkNMVURFUyAmJiAtMTtcbiAgfTtcbn07XG4iLCJ2YXIgY29yZSA9IHJlcXVpcmUoJy4vX2NvcmUnKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBTSEFSRUQgPSAnX19jb3JlLWpzX3NoYXJlZF9fJztcbnZhciBzdG9yZSA9IGdsb2JhbFtTSEFSRURdIHx8IChnbG9iYWxbU0hBUkVEXSA9IHt9KTtcblxuKG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgcmV0dXJuIHN0b3JlW2tleV0gfHwgKHN0b3JlW2tleV0gPSB2YWx1ZSAhPT0gdW5kZWZpbmVkID8gdmFsdWUgOiB7fSk7XG59KSgndmVyc2lvbnMnLCBbXSkucHVzaCh7XG4gIHZlcnNpb246IGNvcmUudmVyc2lvbixcbiAgbW9kZTogcmVxdWlyZSgnLi9fbGlicmFyeScpID8gJ3B1cmUnIDogJ2dsb2JhbCcsXG4gIGNvcHlyaWdodDogJ8KpIDIwMTggRGVuaXMgUHVzaGthcmV2ICh6bG9pcm9jay5ydSknXG59KTtcbiIsInZhciBpZCA9IDA7XG52YXIgcHggPSBNYXRoLnJhbmRvbSgpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIHJldHVybiAnU3ltYm9sKCcuY29uY2F0KGtleSA9PT0gdW5kZWZpbmVkID8gJycgOiBrZXksICcpXycsICgrK2lkICsgcHgpLnRvU3RyaW5nKDM2KSk7XG59O1xuIiwidmFyIHNoYXJlZCA9IHJlcXVpcmUoJy4vX3NoYXJlZCcpKCdrZXlzJyk7XG52YXIgdWlkID0gcmVxdWlyZSgnLi9fdWlkJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgcmV0dXJuIHNoYXJlZFtrZXldIHx8IChzaGFyZWRba2V5XSA9IHVpZChrZXkpKTtcbn07XG4iLCJ2YXIgaGFzID0gcmVxdWlyZSgnLi9faGFzJyk7XG52YXIgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpO1xudmFyIGFycmF5SW5kZXhPZiA9IHJlcXVpcmUoJy4vX2FycmF5LWluY2x1ZGVzJykoZmFsc2UpO1xudmFyIElFX1BST1RPID0gcmVxdWlyZSgnLi9fc2hhcmVkLWtleScpKCdJRV9QUk9UTycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvYmplY3QsIG5hbWVzKSB7XG4gIHZhciBPID0gdG9JT2JqZWN0KG9iamVjdCk7XG4gIHZhciBpID0gMDtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICB2YXIga2V5O1xuICBmb3IgKGtleSBpbiBPKSBpZiAoa2V5ICE9IElFX1BST1RPKSBoYXMoTywga2V5KSAmJiByZXN1bHQucHVzaChrZXkpO1xuICAvLyBEb24ndCBlbnVtIGJ1ZyAmIGhpZGRlbiBrZXlzXG4gIHdoaWxlIChuYW1lcy5sZW5ndGggPiBpKSBpZiAoaGFzKE8sIGtleSA9IG5hbWVzW2krK10pKSB7XG4gICAgfmFycmF5SW5kZXhPZihyZXN1bHQsIGtleSkgfHwgcmVzdWx0LnB1c2goa2V5KTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcbiIsIi8vIElFIDgtIGRvbid0IGVudW0gYnVnIGtleXNcbm1vZHVsZS5leHBvcnRzID0gKFxuICAnY29uc3RydWN0b3IsaGFzT3duUHJvcGVydHksaXNQcm90b3R5cGVPZixwcm9wZXJ0eUlzRW51bWVyYWJsZSx0b0xvY2FsZVN0cmluZyx0b1N0cmluZyx2YWx1ZU9mJ1xuKS5zcGxpdCgnLCcpO1xuIiwiLy8gMTkuMS4yLjE0IC8gMTUuMi4zLjE0IE9iamVjdC5rZXlzKE8pXG52YXIgJGtleXMgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cy1pbnRlcm5hbCcpO1xudmFyIGVudW1CdWdLZXlzID0gcmVxdWlyZSgnLi9fZW51bS1idWcta2V5cycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5rZXlzIHx8IGZ1bmN0aW9uIGtleXMoTykge1xuICByZXR1cm4gJGtleXMoTywgZW51bUJ1Z0tleXMpO1xufTtcbiIsInZhciBkUCA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgZ2V0S2V5cyA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzIDogZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyhPLCBQcm9wZXJ0aWVzKSB7XG4gIGFuT2JqZWN0KE8pO1xuICB2YXIga2V5cyA9IGdldEtleXMoUHJvcGVydGllcyk7XG4gIHZhciBsZW5ndGggPSBrZXlzLmxlbmd0aDtcbiAgdmFyIGkgPSAwO1xuICB2YXIgUDtcbiAgd2hpbGUgKGxlbmd0aCA+IGkpIGRQLmYoTywgUCA9IGtleXNbaSsrXSwgUHJvcGVydGllc1tQXSk7XG4gIHJldHVybiBPO1xufTtcbiIsInZhciBkb2N1bWVudCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpLmRvY3VtZW50O1xubW9kdWxlLmV4cG9ydHMgPSBkb2N1bWVudCAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4iLCIvLyAxOS4xLjIuMiAvIDE1LjIuMy41IE9iamVjdC5jcmVhdGUoTyBbLCBQcm9wZXJ0aWVzXSlcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIGRQcyA9IHJlcXVpcmUoJy4vX29iamVjdC1kcHMnKTtcbnZhciBlbnVtQnVnS2V5cyA9IHJlcXVpcmUoJy4vX2VudW0tYnVnLWtleXMnKTtcbnZhciBJRV9QUk9UTyA9IHJlcXVpcmUoJy4vX3NoYXJlZC1rZXknKSgnSUVfUFJPVE8nKTtcbnZhciBFbXB0eSA9IGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfTtcbnZhciBQUk9UT1RZUEUgPSAncHJvdG90eXBlJztcblxuLy8gQ3JlYXRlIG9iamVjdCB3aXRoIGZha2UgYG51bGxgIHByb3RvdHlwZTogdXNlIGlmcmFtZSBPYmplY3Qgd2l0aCBjbGVhcmVkIHByb3RvdHlwZVxudmFyIGNyZWF0ZURpY3QgPSBmdW5jdGlvbiAoKSB7XG4gIC8vIFRocmFzaCwgd2FzdGUgYW5kIHNvZG9teTogSUUgR0MgYnVnXG4gIHZhciBpZnJhbWUgPSByZXF1aXJlKCcuL19kb20tY3JlYXRlJykoJ2lmcmFtZScpO1xuICB2YXIgaSA9IGVudW1CdWdLZXlzLmxlbmd0aDtcbiAgdmFyIGx0ID0gJzwnO1xuICB2YXIgZ3QgPSAnPic7XG4gIHZhciBpZnJhbWVEb2N1bWVudDtcbiAgaWZyYW1lLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIHJlcXVpcmUoJy4vX2h0bWwnKS5hcHBlbmRDaGlsZChpZnJhbWUpO1xuICBpZnJhbWUuc3JjID0gJ2phdmFzY3JpcHQ6JzsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1zY3JpcHQtdXJsXG4gIC8vIGNyZWF0ZURpY3QgPSBpZnJhbWUuY29udGVudFdpbmRvdy5PYmplY3Q7XG4gIC8vIGh0bWwucmVtb3ZlQ2hpbGQoaWZyYW1lKTtcbiAgaWZyYW1lRG9jdW1lbnQgPSBpZnJhbWUuY29udGVudFdpbmRvdy5kb2N1bWVudDtcbiAgaWZyYW1lRG9jdW1lbnQub3BlbigpO1xuICBpZnJhbWVEb2N1bWVudC53cml0ZShsdCArICdzY3JpcHQnICsgZ3QgKyAnZG9jdW1lbnQuRj1PYmplY3QnICsgbHQgKyAnL3NjcmlwdCcgKyBndCk7XG4gIGlmcmFtZURvY3VtZW50LmNsb3NlKCk7XG4gIGNyZWF0ZURpY3QgPSBpZnJhbWVEb2N1bWVudC5GO1xuICB3aGlsZSAoaS0tKSBkZWxldGUgY3JlYXRlRGljdFtQUk9UT1RZUEVdW2VudW1CdWdLZXlzW2ldXTtcbiAgcmV0dXJuIGNyZWF0ZURpY3QoKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmNyZWF0ZSB8fCBmdW5jdGlvbiBjcmVhdGUoTywgUHJvcGVydGllcykge1xuICB2YXIgcmVzdWx0O1xuICBpZiAoTyAhPT0gbnVsbCkge1xuICAgIEVtcHR5W1BST1RPVFlQRV0gPSBhbk9iamVjdChPKTtcbiAgICByZXN1bHQgPSBuZXcgRW1wdHkoKTtcbiAgICBFbXB0eVtQUk9UT1RZUEVdID0gbnVsbDtcbiAgICAvLyBhZGQgXCJfX3Byb3RvX19cIiBmb3IgT2JqZWN0LmdldFByb3RvdHlwZU9mIHBvbHlmaWxsXG4gICAgcmVzdWx0W0lFX1BST1RPXSA9IE87XG4gIH0gZWxzZSByZXN1bHQgPSBjcmVhdGVEaWN0KCk7XG4gIHJldHVybiBQcm9wZXJ0aWVzID09PSB1bmRlZmluZWQgPyByZXN1bHQgOiBkUHMocmVzdWx0LCBQcm9wZXJ0aWVzKTtcbn07XG4iLCJ2YXIgc3RvcmUgPSByZXF1aXJlKCcuL19zaGFyZWQnKSgnd2tzJyk7XG52YXIgdWlkID0gcmVxdWlyZSgnLi9fdWlkJyk7XG52YXIgU3ltYm9sID0gcmVxdWlyZSgnLi9fZ2xvYmFsJykuU3ltYm9sO1xudmFyIFVTRV9TWU1CT0wgPSB0eXBlb2YgU3ltYm9sID09ICdmdW5jdGlvbic7XG5cbnZhciAkZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgcmV0dXJuIHN0b3JlW25hbWVdIHx8IChzdG9yZVtuYW1lXSA9XG4gICAgVVNFX1NZTUJPTCAmJiBTeW1ib2xbbmFtZV0gfHwgKFVTRV9TWU1CT0wgPyBTeW1ib2wgOiB1aWQpKCdTeW1ib2wuJyArIG5hbWUpKTtcbn07XG5cbiRleHBvcnRzLnN0b3JlID0gc3RvcmU7XG4iLCJ2YXIgZGVmID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJykuZjtcbnZhciBoYXMgPSByZXF1aXJlKCcuL19oYXMnKTtcbnZhciBUQUcgPSByZXF1aXJlKCcuL193a3MnKSgndG9TdHJpbmdUYWcnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQsIHRhZywgc3RhdCkge1xuICBpZiAoaXQgJiYgIWhhcyhpdCA9IHN0YXQgPyBpdCA6IGl0LnByb3RvdHlwZSwgVEFHKSkgZGVmKGl0LCBUQUcsIHsgY29uZmlndXJhYmxlOiB0cnVlLCB2YWx1ZTogdGFnIH0pO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBjcmVhdGUgPSByZXF1aXJlKCcuL19vYmplY3QtY3JlYXRlJyk7XG52YXIgZGVzY3JpcHRvciA9IHJlcXVpcmUoJy4vX3Byb3BlcnR5LWRlc2MnKTtcbnZhciBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4vX3NldC10by1zdHJpbmctdGFnJyk7XG52YXIgSXRlcmF0b3JQcm90b3R5cGUgPSB7fTtcblxuLy8gMjUuMS4yLjEuMSAlSXRlcmF0b3JQcm90b3R5cGUlW0BAaXRlcmF0b3JdKClcbnJlcXVpcmUoJy4vX2hpZGUnKShJdGVyYXRvclByb3RvdHlwZSwgcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJyksIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgTkFNRSwgbmV4dCkge1xuICBDb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBjcmVhdGUoSXRlcmF0b3JQcm90b3R5cGUsIHsgbmV4dDogZGVzY3JpcHRvcigxLCBuZXh0KSB9KTtcbiAgc2V0VG9TdHJpbmdUYWcoQ29uc3RydWN0b3IsIE5BTUUgKyAnIEl0ZXJhdG9yJyk7XG59O1xuIiwiLy8gNy4xLjEzIFRvT2JqZWN0KGFyZ3VtZW50KVxudmFyIGRlZmluZWQgPSByZXF1aXJlKCcuL19kZWZpbmVkJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gT2JqZWN0KGRlZmluZWQoaXQpKTtcbn07XG4iLCIvLyAxOS4xLjIuOSAvIDE1LjIuMy4yIE9iamVjdC5nZXRQcm90b3R5cGVPZihPKVxudmFyIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0Jyk7XG52YXIgSUVfUFJPVE8gPSByZXF1aXJlKCcuL19zaGFyZWQta2V5JykoJ0lFX1BST1RPJyk7XG52YXIgT2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5nZXRQcm90b3R5cGVPZiB8fCBmdW5jdGlvbiAoTykge1xuICBPID0gdG9PYmplY3QoTyk7XG4gIGlmIChoYXMoTywgSUVfUFJPVE8pKSByZXR1cm4gT1tJRV9QUk9UT107XG4gIGlmICh0eXBlb2YgTy5jb25zdHJ1Y3RvciA9PSAnZnVuY3Rpb24nICYmIE8gaW5zdGFuY2VvZiBPLmNvbnN0cnVjdG9yKSB7XG4gICAgcmV0dXJuIE8uY29uc3RydWN0b3IucHJvdG90eXBlO1xuICB9IHJldHVybiBPIGluc3RhbmNlb2YgT2JqZWN0ID8gT2JqZWN0UHJvdG8gOiBudWxsO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBMSUJSQVJZID0gcmVxdWlyZSgnLi9fbGlicmFyeScpO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lJyk7XG52YXIgaGlkZSA9IHJlcXVpcmUoJy4vX2hpZGUnKTtcbnZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuL19pdGVyYXRvcnMnKTtcbnZhciAkaXRlckNyZWF0ZSA9IHJlcXVpcmUoJy4vX2l0ZXItY3JlYXRlJyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuL19zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdwbycpO1xudmFyIElURVJBVE9SID0gcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJyk7XG52YXIgQlVHR1kgPSAhKFtdLmtleXMgJiYgJ25leHQnIGluIFtdLmtleXMoKSk7IC8vIFNhZmFyaSBoYXMgYnVnZ3kgaXRlcmF0b3JzIHcvbyBgbmV4dGBcbnZhciBGRl9JVEVSQVRPUiA9ICdAQGl0ZXJhdG9yJztcbnZhciBLRVlTID0gJ2tleXMnO1xudmFyIFZBTFVFUyA9ICd2YWx1ZXMnO1xuXG52YXIgcmV0dXJuVGhpcyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKEJhc2UsIE5BTUUsIENvbnN0cnVjdG9yLCBuZXh0LCBERUZBVUxULCBJU19TRVQsIEZPUkNFRCkge1xuICAkaXRlckNyZWF0ZShDb25zdHJ1Y3RvciwgTkFNRSwgbmV4dCk7XG4gIHZhciBnZXRNZXRob2QgPSBmdW5jdGlvbiAoa2luZCkge1xuICAgIGlmICghQlVHR1kgJiYga2luZCBpbiBwcm90bykgcmV0dXJuIHByb3RvW2tpbmRdO1xuICAgIHN3aXRjaCAoa2luZCkge1xuICAgICAgY2FzZSBLRVlTOiByZXR1cm4gZnVuY3Rpb24ga2V5cygpIHsgcmV0dXJuIG5ldyBDb25zdHJ1Y3Rvcih0aGlzLCBraW5kKTsgfTtcbiAgICAgIGNhc2UgVkFMVUVTOiByZXR1cm4gZnVuY3Rpb24gdmFsdWVzKCkgeyByZXR1cm4gbmV3IENvbnN0cnVjdG9yKHRoaXMsIGtpbmQpOyB9O1xuICAgIH0gcmV0dXJuIGZ1bmN0aW9uIGVudHJpZXMoKSB7IHJldHVybiBuZXcgQ29uc3RydWN0b3IodGhpcywga2luZCk7IH07XG4gIH07XG4gIHZhciBUQUcgPSBOQU1FICsgJyBJdGVyYXRvcic7XG4gIHZhciBERUZfVkFMVUVTID0gREVGQVVMVCA9PSBWQUxVRVM7XG4gIHZhciBWQUxVRVNfQlVHID0gZmFsc2U7XG4gIHZhciBwcm90byA9IEJhc2UucHJvdG90eXBlO1xuICB2YXIgJG5hdGl2ZSA9IHByb3RvW0lURVJBVE9SXSB8fCBwcm90b1tGRl9JVEVSQVRPUl0gfHwgREVGQVVMVCAmJiBwcm90b1tERUZBVUxUXTtcbiAgdmFyICRkZWZhdWx0ID0gJG5hdGl2ZSB8fCBnZXRNZXRob2QoREVGQVVMVCk7XG4gIHZhciAkZW50cmllcyA9IERFRkFVTFQgPyAhREVGX1ZBTFVFUyA/ICRkZWZhdWx0IDogZ2V0TWV0aG9kKCdlbnRyaWVzJykgOiB1bmRlZmluZWQ7XG4gIHZhciAkYW55TmF0aXZlID0gTkFNRSA9PSAnQXJyYXknID8gcHJvdG8uZW50cmllcyB8fCAkbmF0aXZlIDogJG5hdGl2ZTtcbiAgdmFyIG1ldGhvZHMsIGtleSwgSXRlcmF0b3JQcm90b3R5cGU7XG4gIC8vIEZpeCBuYXRpdmVcbiAgaWYgKCRhbnlOYXRpdmUpIHtcbiAgICBJdGVyYXRvclByb3RvdHlwZSA9IGdldFByb3RvdHlwZU9mKCRhbnlOYXRpdmUuY2FsbChuZXcgQmFzZSgpKSk7XG4gICAgaWYgKEl0ZXJhdG9yUHJvdG90eXBlICE9PSBPYmplY3QucHJvdG90eXBlICYmIEl0ZXJhdG9yUHJvdG90eXBlLm5leHQpIHtcbiAgICAgIC8vIFNldCBAQHRvU3RyaW5nVGFnIHRvIG5hdGl2ZSBpdGVyYXRvcnNcbiAgICAgIHNldFRvU3RyaW5nVGFnKEl0ZXJhdG9yUHJvdG90eXBlLCBUQUcsIHRydWUpO1xuICAgICAgLy8gZml4IGZvciBzb21lIG9sZCBlbmdpbmVzXG4gICAgICBpZiAoIUxJQlJBUlkgJiYgdHlwZW9mIEl0ZXJhdG9yUHJvdG90eXBlW0lURVJBVE9SXSAhPSAnZnVuY3Rpb24nKSBoaWRlKEl0ZXJhdG9yUHJvdG90eXBlLCBJVEVSQVRPUiwgcmV0dXJuVGhpcyk7XG4gICAgfVxuICB9XG4gIC8vIGZpeCBBcnJheSN7dmFsdWVzLCBAQGl0ZXJhdG9yfS5uYW1lIGluIFY4IC8gRkZcbiAgaWYgKERFRl9WQUxVRVMgJiYgJG5hdGl2ZSAmJiAkbmF0aXZlLm5hbWUgIT09IFZBTFVFUykge1xuICAgIFZBTFVFU19CVUcgPSB0cnVlO1xuICAgICRkZWZhdWx0ID0gZnVuY3Rpb24gdmFsdWVzKCkgeyByZXR1cm4gJG5hdGl2ZS5jYWxsKHRoaXMpOyB9O1xuICB9XG4gIC8vIERlZmluZSBpdGVyYXRvclxuICBpZiAoKCFMSUJSQVJZIHx8IEZPUkNFRCkgJiYgKEJVR0dZIHx8IFZBTFVFU19CVUcgfHwgIXByb3RvW0lURVJBVE9SXSkpIHtcbiAgICBoaWRlKHByb3RvLCBJVEVSQVRPUiwgJGRlZmF1bHQpO1xuICB9XG4gIC8vIFBsdWcgZm9yIGxpYnJhcnlcbiAgSXRlcmF0b3JzW05BTUVdID0gJGRlZmF1bHQ7XG4gIEl0ZXJhdG9yc1tUQUddID0gcmV0dXJuVGhpcztcbiAgaWYgKERFRkFVTFQpIHtcbiAgICBtZXRob2RzID0ge1xuICAgICAgdmFsdWVzOiBERUZfVkFMVUVTID8gJGRlZmF1bHQgOiBnZXRNZXRob2QoVkFMVUVTKSxcbiAgICAgIGtleXM6IElTX1NFVCA/ICRkZWZhdWx0IDogZ2V0TWV0aG9kKEtFWVMpLFxuICAgICAgZW50cmllczogJGVudHJpZXNcbiAgICB9O1xuICAgIGlmIChGT1JDRUQpIGZvciAoa2V5IGluIG1ldGhvZHMpIHtcbiAgICAgIGlmICghKGtleSBpbiBwcm90bykpIHJlZGVmaW5lKHByb3RvLCBrZXksIG1ldGhvZHNba2V5XSk7XG4gICAgfSBlbHNlICRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogKEJVR0dZIHx8IFZBTFVFU19CVUcpLCBOQU1FLCBtZXRob2RzKTtcbiAgfVxuICByZXR1cm4gbWV0aG9kcztcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJGF0ID0gcmVxdWlyZSgnLi9fc3RyaW5nLWF0JykodHJ1ZSk7XG5cbi8vIDIxLjEuMy4yNyBTdHJpbmcucHJvdG90eXBlW0BAaXRlcmF0b3JdKClcbnJlcXVpcmUoJy4vX2l0ZXItZGVmaW5lJykoU3RyaW5nLCAnU3RyaW5nJywgZnVuY3Rpb24gKGl0ZXJhdGVkKSB7XG4gIHRoaXMuX3QgPSBTdHJpbmcoaXRlcmF0ZWQpOyAvLyB0YXJnZXRcbiAgdGhpcy5faSA9IDA7ICAgICAgICAgICAgICAgIC8vIG5leHQgaW5kZXhcbi8vIDIxLjEuNS4yLjEgJVN0cmluZ0l0ZXJhdG9yUHJvdG90eXBlJS5uZXh0KClcbn0sIGZ1bmN0aW9uICgpIHtcbiAgdmFyIE8gPSB0aGlzLl90O1xuICB2YXIgaW5kZXggPSB0aGlzLl9pO1xuICB2YXIgcG9pbnQ7XG4gIGlmIChpbmRleCA+PSBPLmxlbmd0aCkgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9O1xuICBwb2ludCA9ICRhdChPLCBpbmRleCk7XG4gIHRoaXMuX2kgKz0gcG9pbnQubGVuZ3RoO1xuICByZXR1cm4geyB2YWx1ZTogcG9pbnQsIGRvbmU6IGZhbHNlIH07XG59KTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGRvbmUsIHZhbHVlKSB7XG4gIHJldHVybiB7IHZhbHVlOiB2YWx1ZSwgZG9uZTogISFkb25lIH07XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGFkZFRvVW5zY29wYWJsZXMgPSByZXF1aXJlKCcuL19hZGQtdG8tdW5zY29wYWJsZXMnKTtcbnZhciBzdGVwID0gcmVxdWlyZSgnLi9faXRlci1zdGVwJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi9faXRlcmF0b3JzJyk7XG52YXIgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpO1xuXG4vLyAyMi4xLjMuNCBBcnJheS5wcm90b3R5cGUuZW50cmllcygpXG4vLyAyMi4xLjMuMTMgQXJyYXkucHJvdG90eXBlLmtleXMoKVxuLy8gMjIuMS4zLjI5IEFycmF5LnByb3RvdHlwZS52YWx1ZXMoKVxuLy8gMjIuMS4zLjMwIEFycmF5LnByb3RvdHlwZVtAQGl0ZXJhdG9yXSgpXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2l0ZXItZGVmaW5lJykoQXJyYXksICdBcnJheScsIGZ1bmN0aW9uIChpdGVyYXRlZCwga2luZCkge1xuICB0aGlzLl90ID0gdG9JT2JqZWN0KGl0ZXJhdGVkKTsgLy8gdGFyZ2V0XG4gIHRoaXMuX2kgPSAwOyAgICAgICAgICAgICAgICAgICAvLyBuZXh0IGluZGV4XG4gIHRoaXMuX2sgPSBraW5kOyAgICAgICAgICAgICAgICAvLyBraW5kXG4vLyAyMi4xLjUuMi4xICVBcnJheUl0ZXJhdG9yUHJvdG90eXBlJS5uZXh0KClcbn0sIGZ1bmN0aW9uICgpIHtcbiAgdmFyIE8gPSB0aGlzLl90O1xuICB2YXIga2luZCA9IHRoaXMuX2s7XG4gIHZhciBpbmRleCA9IHRoaXMuX2krKztcbiAgaWYgKCFPIHx8IGluZGV4ID49IE8ubGVuZ3RoKSB7XG4gICAgdGhpcy5fdCA9IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gc3RlcCgxKTtcbiAgfVxuICBpZiAoa2luZCA9PSAna2V5cycpIHJldHVybiBzdGVwKDAsIGluZGV4KTtcbiAgaWYgKGtpbmQgPT0gJ3ZhbHVlcycpIHJldHVybiBzdGVwKDAsIE9baW5kZXhdKTtcbiAgcmV0dXJuIHN0ZXAoMCwgW2luZGV4LCBPW2luZGV4XV0pO1xufSwgJ3ZhbHVlcycpO1xuXG4vLyBhcmd1bWVudHNMaXN0W0BAaXRlcmF0b3JdIGlzICVBcnJheVByb3RvX3ZhbHVlcyUgKDkuNC40LjYsIDkuNC40LjcpXG5JdGVyYXRvcnMuQXJndW1lbnRzID0gSXRlcmF0b3JzLkFycmF5O1xuXG5hZGRUb1Vuc2NvcGFibGVzKCdrZXlzJyk7XG5hZGRUb1Vuc2NvcGFibGVzKCd2YWx1ZXMnKTtcbmFkZFRvVW5zY29wYWJsZXMoJ2VudHJpZXMnKTtcbiIsInJlcXVpcmUoJy4vZXM2LmFycmF5Lml0ZXJhdG9yJyk7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgaGlkZSA9IHJlcXVpcmUoJy4vX2hpZGUnKTtcbnZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuL19pdGVyYXRvcnMnKTtcbnZhciBUT19TVFJJTkdfVEFHID0gcmVxdWlyZSgnLi9fd2tzJykoJ3RvU3RyaW5nVGFnJyk7XG5cbnZhciBET01JdGVyYWJsZXMgPSAoJ0NTU1J1bGVMaXN0LENTU1N0eWxlRGVjbGFyYXRpb24sQ1NTVmFsdWVMaXN0LENsaWVudFJlY3RMaXN0LERPTVJlY3RMaXN0LERPTVN0cmluZ0xpc3QsJyArXG4gICdET01Ub2tlbkxpc3QsRGF0YVRyYW5zZmVySXRlbUxpc3QsRmlsZUxpc3QsSFRNTEFsbENvbGxlY3Rpb24sSFRNTENvbGxlY3Rpb24sSFRNTEZvcm1FbGVtZW50LEhUTUxTZWxlY3RFbGVtZW50LCcgK1xuICAnTWVkaWFMaXN0LE1pbWVUeXBlQXJyYXksTmFtZWROb2RlTWFwLE5vZGVMaXN0LFBhaW50UmVxdWVzdExpc3QsUGx1Z2luLFBsdWdpbkFycmF5LFNWR0xlbmd0aExpc3QsU1ZHTnVtYmVyTGlzdCwnICtcbiAgJ1NWR1BhdGhTZWdMaXN0LFNWR1BvaW50TGlzdCxTVkdTdHJpbmdMaXN0LFNWR1RyYW5zZm9ybUxpc3QsU291cmNlQnVmZmVyTGlzdCxTdHlsZVNoZWV0TGlzdCxUZXh0VHJhY2tDdWVMaXN0LCcgK1xuICAnVGV4dFRyYWNrTGlzdCxUb3VjaExpc3QnKS5zcGxpdCgnLCcpO1xuXG5mb3IgKHZhciBpID0gMDsgaSA8IERPTUl0ZXJhYmxlcy5sZW5ndGg7IGkrKykge1xuICB2YXIgTkFNRSA9IERPTUl0ZXJhYmxlc1tpXTtcbiAgdmFyIENvbGxlY3Rpb24gPSBnbG9iYWxbTkFNRV07XG4gIHZhciBwcm90byA9IENvbGxlY3Rpb24gJiYgQ29sbGVjdGlvbi5wcm90b3R5cGU7XG4gIGlmIChwcm90byAmJiAhcHJvdG9bVE9fU1RSSU5HX1RBR10pIGhpZGUocHJvdG8sIFRPX1NUUklOR19UQUcsIE5BTUUpO1xuICBJdGVyYXRvcnNbTkFNRV0gPSBJdGVyYXRvcnMuQXJyYXk7XG59XG4iLCIvLyBnZXR0aW5nIHRhZyBmcm9tIDE5LjEuMy42IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcoKVxudmFyIGNvZiA9IHJlcXVpcmUoJy4vX2NvZicpO1xudmFyIFRBRyA9IHJlcXVpcmUoJy4vX3drcycpKCd0b1N0cmluZ1RhZycpO1xuLy8gRVMzIHdyb25nIGhlcmVcbnZhciBBUkcgPSBjb2YoZnVuY3Rpb24gKCkgeyByZXR1cm4gYXJndW1lbnRzOyB9KCkpID09ICdBcmd1bWVudHMnO1xuXG4vLyBmYWxsYmFjayBmb3IgSUUxMSBTY3JpcHQgQWNjZXNzIERlbmllZCBlcnJvclxudmFyIHRyeUdldCA9IGZ1bmN0aW9uIChpdCwga2V5KSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGl0W2tleV07XG4gIH0gY2F0Y2ggKGUpIHsgLyogZW1wdHkgKi8gfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIE8sIFQsIEI7XG4gIHJldHVybiBpdCA9PT0gdW5kZWZpbmVkID8gJ1VuZGVmaW5lZCcgOiBpdCA9PT0gbnVsbCA/ICdOdWxsJ1xuICAgIC8vIEBAdG9TdHJpbmdUYWcgY2FzZVxuICAgIDogdHlwZW9mIChUID0gdHJ5R2V0KE8gPSBPYmplY3QoaXQpLCBUQUcpKSA9PSAnc3RyaW5nJyA/IFRcbiAgICAvLyBidWlsdGluVGFnIGNhc2VcbiAgICA6IEFSRyA/IGNvZihPKVxuICAgIC8vIEVTMyBhcmd1bWVudHMgZmFsbGJhY2tcbiAgICA6IChCID0gY29mKE8pKSA9PSAnT2JqZWN0JyAmJiB0eXBlb2YgTy5jYWxsZWUgPT0gJ2Z1bmN0aW9uJyA/ICdBcmd1bWVudHMnIDogQjtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwgQ29uc3RydWN0b3IsIG5hbWUsIGZvcmJpZGRlbkZpZWxkKSB7XG4gIGlmICghKGl0IGluc3RhbmNlb2YgQ29uc3RydWN0b3IpIHx8IChmb3JiaWRkZW5GaWVsZCAhPT0gdW5kZWZpbmVkICYmIGZvcmJpZGRlbkZpZWxkIGluIGl0KSkge1xuICAgIHRocm93IFR5cGVFcnJvcihuYW1lICsgJzogaW5jb3JyZWN0IGludm9jYXRpb24hJyk7XG4gIH0gcmV0dXJuIGl0O1xufTtcbiIsIi8vIGNhbGwgc29tZXRoaW5nIG9uIGl0ZXJhdG9yIHN0ZXAgd2l0aCBzYWZlIGNsb3Npbmcgb24gZXJyb3JcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXRlcmF0b3IsIGZuLCB2YWx1ZSwgZW50cmllcykge1xuICB0cnkge1xuICAgIHJldHVybiBlbnRyaWVzID8gZm4oYW5PYmplY3QodmFsdWUpWzBdLCB2YWx1ZVsxXSkgOiBmbih2YWx1ZSk7XG4gIC8vIDcuNC42IEl0ZXJhdG9yQ2xvc2UoaXRlcmF0b3IsIGNvbXBsZXRpb24pXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB2YXIgcmV0ID0gaXRlcmF0b3JbJ3JldHVybiddO1xuICAgIGlmIChyZXQgIT09IHVuZGVmaW5lZCkgYW5PYmplY3QocmV0LmNhbGwoaXRlcmF0b3IpKTtcbiAgICB0aHJvdyBlO1xuICB9XG59O1xuIiwiLy8gY2hlY2sgb24gZGVmYXVsdCBBcnJheSBpdGVyYXRvclxudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpO1xudmFyIElURVJBVE9SID0gcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJyk7XG52YXIgQXJyYXlQcm90byA9IEFycmF5LnByb3RvdHlwZTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGl0ICE9PSB1bmRlZmluZWQgJiYgKEl0ZXJhdG9ycy5BcnJheSA9PT0gaXQgfHwgQXJyYXlQcm90b1tJVEVSQVRPUl0gPT09IGl0KTtcbn07XG4iLCJ2YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4vX2NsYXNzb2YnKTtcbnZhciBJVEVSQVRPUiA9IHJlcXVpcmUoJy4vX3drcycpKCdpdGVyYXRvcicpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19jb3JlJykuZ2V0SXRlcmF0b3JNZXRob2QgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKGl0ICE9IHVuZGVmaW5lZCkgcmV0dXJuIGl0W0lURVJBVE9SXVxuICAgIHx8IGl0WydAQGl0ZXJhdG9yJ11cbiAgICB8fCBJdGVyYXRvcnNbY2xhc3NvZihpdCldO1xufTtcbiIsInZhciBjdHggPSByZXF1aXJlKCcuL19jdHgnKTtcbnZhciBjYWxsID0gcmVxdWlyZSgnLi9faXRlci1jYWxsJyk7XG52YXIgaXNBcnJheUl0ZXIgPSByZXF1aXJlKCcuL19pcy1hcnJheS1pdGVyJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpO1xudmFyIGdldEl0ZXJGbiA9IHJlcXVpcmUoJy4vY29yZS5nZXQtaXRlcmF0b3ItbWV0aG9kJyk7XG52YXIgQlJFQUsgPSB7fTtcbnZhciBSRVRVUk4gPSB7fTtcbnZhciBleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXRlcmFibGUsIGVudHJpZXMsIGZuLCB0aGF0LCBJVEVSQVRPUikge1xuICB2YXIgaXRlckZuID0gSVRFUkFUT1IgPyBmdW5jdGlvbiAoKSB7IHJldHVybiBpdGVyYWJsZTsgfSA6IGdldEl0ZXJGbihpdGVyYWJsZSk7XG4gIHZhciBmID0gY3R4KGZuLCB0aGF0LCBlbnRyaWVzID8gMiA6IDEpO1xuICB2YXIgaW5kZXggPSAwO1xuICB2YXIgbGVuZ3RoLCBzdGVwLCBpdGVyYXRvciwgcmVzdWx0O1xuICBpZiAodHlwZW9mIGl0ZXJGbiAhPSAnZnVuY3Rpb24nKSB0aHJvdyBUeXBlRXJyb3IoaXRlcmFibGUgKyAnIGlzIG5vdCBpdGVyYWJsZSEnKTtcbiAgLy8gZmFzdCBjYXNlIGZvciBhcnJheXMgd2l0aCBkZWZhdWx0IGl0ZXJhdG9yXG4gIGlmIChpc0FycmF5SXRlcihpdGVyRm4pKSBmb3IgKGxlbmd0aCA9IHRvTGVuZ3RoKGl0ZXJhYmxlLmxlbmd0aCk7IGxlbmd0aCA+IGluZGV4OyBpbmRleCsrKSB7XG4gICAgcmVzdWx0ID0gZW50cmllcyA/IGYoYW5PYmplY3Qoc3RlcCA9IGl0ZXJhYmxlW2luZGV4XSlbMF0sIHN0ZXBbMV0pIDogZihpdGVyYWJsZVtpbmRleF0pO1xuICAgIGlmIChyZXN1bHQgPT09IEJSRUFLIHx8IHJlc3VsdCA9PT0gUkVUVVJOKSByZXR1cm4gcmVzdWx0O1xuICB9IGVsc2UgZm9yIChpdGVyYXRvciA9IGl0ZXJGbi5jYWxsKGl0ZXJhYmxlKTsgIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lOykge1xuICAgIHJlc3VsdCA9IGNhbGwoaXRlcmF0b3IsIGYsIHN0ZXAudmFsdWUsIGVudHJpZXMpO1xuICAgIGlmIChyZXN1bHQgPT09IEJSRUFLIHx8IHJlc3VsdCA9PT0gUkVUVVJOKSByZXR1cm4gcmVzdWx0O1xuICB9XG59O1xuZXhwb3J0cy5CUkVBSyA9IEJSRUFLO1xuZXhwb3J0cy5SRVRVUk4gPSBSRVRVUk47XG4iLCIvLyA3LjMuMjAgU3BlY2llc0NvbnN0cnVjdG9yKE8sIGRlZmF1bHRDb25zdHJ1Y3RvcilcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4vX2EtZnVuY3Rpb24nKTtcbnZhciBTUEVDSUVTID0gcmVxdWlyZSgnLi9fd2tzJykoJ3NwZWNpZXMnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE8sIEQpIHtcbiAgdmFyIEMgPSBhbk9iamVjdChPKS5jb25zdHJ1Y3RvcjtcbiAgdmFyIFM7XG4gIHJldHVybiBDID09PSB1bmRlZmluZWQgfHwgKFMgPSBhbk9iamVjdChDKVtTUEVDSUVTXSkgPT0gdW5kZWZpbmVkID8gRCA6IGFGdW5jdGlvbihTKTtcbn07XG4iLCIvLyBmYXN0IGFwcGx5LCBodHRwOi8vanNwZXJmLmxua2l0LmNvbS9mYXN0LWFwcGx5LzVcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGZuLCBhcmdzLCB0aGF0KSB7XG4gIHZhciB1biA9IHRoYXQgPT09IHVuZGVmaW5lZDtcbiAgc3dpdGNoIChhcmdzLmxlbmd0aCkge1xuICAgIGNhc2UgMDogcmV0dXJuIHVuID8gZm4oKVxuICAgICAgICAgICAgICAgICAgICAgIDogZm4uY2FsbCh0aGF0KTtcbiAgICBjYXNlIDE6IHJldHVybiB1biA/IGZuKGFyZ3NbMF0pXG4gICAgICAgICAgICAgICAgICAgICAgOiBmbi5jYWxsKHRoYXQsIGFyZ3NbMF0pO1xuICAgIGNhc2UgMjogcmV0dXJuIHVuID8gZm4oYXJnc1swXSwgYXJnc1sxXSlcbiAgICAgICAgICAgICAgICAgICAgICA6IGZuLmNhbGwodGhhdCwgYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgY2FzZSAzOiByZXR1cm4gdW4gPyBmbihhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKVxuICAgICAgICAgICAgICAgICAgICAgIDogZm4uY2FsbCh0aGF0LCBhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTtcbiAgICBjYXNlIDQ6IHJldHVybiB1biA/IGZuKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10pXG4gICAgICAgICAgICAgICAgICAgICAgOiBmbi5jYWxsKHRoYXQsIGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10pO1xuICB9IHJldHVybiBmbi5hcHBseSh0aGF0LCBhcmdzKTtcbn07XG4iLCJ2YXIgY3R4ID0gcmVxdWlyZSgnLi9fY3R4Jyk7XG52YXIgaW52b2tlID0gcmVxdWlyZSgnLi9faW52b2tlJyk7XG52YXIgaHRtbCA9IHJlcXVpcmUoJy4vX2h0bWwnKTtcbnZhciBjZWwgPSByZXF1aXJlKCcuL19kb20tY3JlYXRlJyk7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgcHJvY2VzcyA9IGdsb2JhbC5wcm9jZXNzO1xudmFyIHNldFRhc2sgPSBnbG9iYWwuc2V0SW1tZWRpYXRlO1xudmFyIGNsZWFyVGFzayA9IGdsb2JhbC5jbGVhckltbWVkaWF0ZTtcbnZhciBNZXNzYWdlQ2hhbm5lbCA9IGdsb2JhbC5NZXNzYWdlQ2hhbm5lbDtcbnZhciBEaXNwYXRjaCA9IGdsb2JhbC5EaXNwYXRjaDtcbnZhciBjb3VudGVyID0gMDtcbnZhciBxdWV1ZSA9IHt9O1xudmFyIE9OUkVBRFlTVEFURUNIQU5HRSA9ICdvbnJlYWR5c3RhdGVjaGFuZ2UnO1xudmFyIGRlZmVyLCBjaGFubmVsLCBwb3J0O1xudmFyIHJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGlkID0gK3RoaXM7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgaWYgKHF1ZXVlLmhhc093blByb3BlcnR5KGlkKSkge1xuICAgIHZhciBmbiA9IHF1ZXVlW2lkXTtcbiAgICBkZWxldGUgcXVldWVbaWRdO1xuICAgIGZuKCk7XG4gIH1cbn07XG52YXIgbGlzdGVuZXIgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgcnVuLmNhbGwoZXZlbnQuZGF0YSk7XG59O1xuLy8gTm9kZS5qcyAwLjkrICYgSUUxMCsgaGFzIHNldEltbWVkaWF0ZSwgb3RoZXJ3aXNlOlxuaWYgKCFzZXRUYXNrIHx8ICFjbGVhclRhc2spIHtcbiAgc2V0VGFzayA9IGZ1bmN0aW9uIHNldEltbWVkaWF0ZShmbikge1xuICAgIHZhciBhcmdzID0gW107XG4gICAgdmFyIGkgPSAxO1xuICAgIHdoaWxlIChhcmd1bWVudHMubGVuZ3RoID4gaSkgYXJncy5wdXNoKGFyZ3VtZW50c1tpKytdKTtcbiAgICBxdWV1ZVsrK2NvdW50ZXJdID0gZnVuY3Rpb24gKCkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ldy1mdW5jXG4gICAgICBpbnZva2UodHlwZW9mIGZuID09ICdmdW5jdGlvbicgPyBmbiA6IEZ1bmN0aW9uKGZuKSwgYXJncyk7XG4gICAgfTtcbiAgICBkZWZlcihjb3VudGVyKTtcbiAgICByZXR1cm4gY291bnRlcjtcbiAgfTtcbiAgY2xlYXJUYXNrID0gZnVuY3Rpb24gY2xlYXJJbW1lZGlhdGUoaWQpIHtcbiAgICBkZWxldGUgcXVldWVbaWRdO1xuICB9O1xuICAvLyBOb2RlLmpzIDAuOC1cbiAgaWYgKHJlcXVpcmUoJy4vX2NvZicpKHByb2Nlc3MpID09ICdwcm9jZXNzJykge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGN0eChydW4sIGlkLCAxKSk7XG4gICAgfTtcbiAgLy8gU3BoZXJlIChKUyBnYW1lIGVuZ2luZSkgRGlzcGF0Y2ggQVBJXG4gIH0gZWxzZSBpZiAoRGlzcGF0Y2ggJiYgRGlzcGF0Y2gubm93KSB7XG4gICAgZGVmZXIgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgIERpc3BhdGNoLm5vdyhjdHgocnVuLCBpZCwgMSkpO1xuICAgIH07XG4gIC8vIEJyb3dzZXJzIHdpdGggTWVzc2FnZUNoYW5uZWwsIGluY2x1ZGVzIFdlYldvcmtlcnNcbiAgfSBlbHNlIGlmIChNZXNzYWdlQ2hhbm5lbCkge1xuICAgIGNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKTtcbiAgICBwb3J0ID0gY2hhbm5lbC5wb3J0MjtcbiAgICBjaGFubmVsLnBvcnQxLm9ubWVzc2FnZSA9IGxpc3RlbmVyO1xuICAgIGRlZmVyID0gY3R4KHBvcnQucG9zdE1lc3NhZ2UsIHBvcnQsIDEpO1xuICAvLyBCcm93c2VycyB3aXRoIHBvc3RNZXNzYWdlLCBza2lwIFdlYldvcmtlcnNcbiAgLy8gSUU4IGhhcyBwb3N0TWVzc2FnZSwgYnV0IGl0J3Mgc3luYyAmIHR5cGVvZiBpdHMgcG9zdE1lc3NhZ2UgaXMgJ29iamVjdCdcbiAgfSBlbHNlIGlmIChnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lciAmJiB0eXBlb2YgcG9zdE1lc3NhZ2UgPT0gJ2Z1bmN0aW9uJyAmJiAhZ2xvYmFsLmltcG9ydFNjcmlwdHMpIHtcbiAgICBkZWZlciA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgZ2xvYmFsLnBvc3RNZXNzYWdlKGlkICsgJycsICcqJyk7XG4gICAgfTtcbiAgICBnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGxpc3RlbmVyLCBmYWxzZSk7XG4gIC8vIElFOC1cbiAgfSBlbHNlIGlmIChPTlJFQURZU1RBVEVDSEFOR0UgaW4gY2VsKCdzY3JpcHQnKSkge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBodG1sLmFwcGVuZENoaWxkKGNlbCgnc2NyaXB0JykpW09OUkVBRFlTVEFURUNIQU5HRV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGh0bWwucmVtb3ZlQ2hpbGQodGhpcyk7XG4gICAgICAgIHJ1bi5jYWxsKGlkKTtcbiAgICAgIH07XG4gICAgfTtcbiAgLy8gUmVzdCBvbGQgYnJvd3NlcnNcbiAgfSBlbHNlIHtcbiAgICBkZWZlciA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgc2V0VGltZW91dChjdHgocnVuLCBpZCwgMSksIDApO1xuICAgIH07XG4gIH1cbn1cbm1vZHVsZS5leHBvcnRzID0ge1xuICBzZXQ6IHNldFRhc2ssXG4gIGNsZWFyOiBjbGVhclRhc2tcbn07XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgbWFjcm90YXNrID0gcmVxdWlyZSgnLi9fdGFzaycpLnNldDtcbnZhciBPYnNlcnZlciA9IGdsb2JhbC5NdXRhdGlvbk9ic2VydmVyIHx8IGdsb2JhbC5XZWJLaXRNdXRhdGlvbk9ic2VydmVyO1xudmFyIHByb2Nlc3MgPSBnbG9iYWwucHJvY2VzcztcbnZhciBQcm9taXNlID0gZ2xvYmFsLlByb21pc2U7XG52YXIgaXNOb2RlID0gcmVxdWlyZSgnLi9fY29mJykocHJvY2VzcykgPT0gJ3Byb2Nlc3MnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGhlYWQsIGxhc3QsIG5vdGlmeTtcblxuICB2YXIgZmx1c2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHBhcmVudCwgZm47XG4gICAgaWYgKGlzTm9kZSAmJiAocGFyZW50ID0gcHJvY2Vzcy5kb21haW4pKSBwYXJlbnQuZXhpdCgpO1xuICAgIHdoaWxlIChoZWFkKSB7XG4gICAgICBmbiA9IGhlYWQuZm47XG4gICAgICBoZWFkID0gaGVhZC5uZXh0O1xuICAgICAgdHJ5IHtcbiAgICAgICAgZm4oKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKGhlYWQpIG5vdGlmeSgpO1xuICAgICAgICBlbHNlIGxhc3QgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgfSBsYXN0ID0gdW5kZWZpbmVkO1xuICAgIGlmIChwYXJlbnQpIHBhcmVudC5lbnRlcigpO1xuICB9O1xuXG4gIC8vIE5vZGUuanNcbiAgaWYgKGlzTm9kZSkge1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHByb2Nlc3MubmV4dFRpY2soZmx1c2gpO1xuICAgIH07XG4gIC8vIGJyb3dzZXJzIHdpdGggTXV0YXRpb25PYnNlcnZlciwgZXhjZXB0IGlPUyBTYWZhcmkgLSBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvMzM5XG4gIH0gZWxzZSBpZiAoT2JzZXJ2ZXIgJiYgIShnbG9iYWwubmF2aWdhdG9yICYmIGdsb2JhbC5uYXZpZ2F0b3Iuc3RhbmRhbG9uZSkpIHtcbiAgICB2YXIgdG9nZ2xlID0gdHJ1ZTtcbiAgICB2YXIgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcnKTtcbiAgICBuZXcgT2JzZXJ2ZXIoZmx1c2gpLm9ic2VydmUobm9kZSwgeyBjaGFyYWN0ZXJEYXRhOiB0cnVlIH0pOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ld1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIG5vZGUuZGF0YSA9IHRvZ2dsZSA9ICF0b2dnbGU7XG4gICAgfTtcbiAgLy8gZW52aXJvbm1lbnRzIHdpdGggbWF5YmUgbm9uLWNvbXBsZXRlbHkgY29ycmVjdCwgYnV0IGV4aXN0ZW50IFByb21pc2VcbiAgfSBlbHNlIGlmIChQcm9taXNlICYmIFByb21pc2UucmVzb2x2ZSkge1xuICAgIC8vIFByb21pc2UucmVzb2x2ZSB3aXRob3V0IGFuIGFyZ3VtZW50IHRocm93cyBhbiBlcnJvciBpbiBMRyBXZWJPUyAyXG4gICAgdmFyIHByb21pc2UgPSBQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKTtcbiAgICBub3RpZnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBwcm9taXNlLnRoZW4oZmx1c2gpO1xuICAgIH07XG4gIC8vIGZvciBvdGhlciBlbnZpcm9ubWVudHMgLSBtYWNyb3Rhc2sgYmFzZWQgb246XG4gIC8vIC0gc2V0SW1tZWRpYXRlXG4gIC8vIC0gTWVzc2FnZUNoYW5uZWxcbiAgLy8gLSB3aW5kb3cucG9zdE1lc3NhZ1xuICAvLyAtIG9ucmVhZHlzdGF0ZWNoYW5nZVxuICAvLyAtIHNldFRpbWVvdXRcbiAgfSBlbHNlIHtcbiAgICBub3RpZnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBzdHJhbmdlIElFICsgd2VicGFjayBkZXYgc2VydmVyIGJ1ZyAtIHVzZSAuY2FsbChnbG9iYWwpXG4gICAgICBtYWNyb3Rhc2suY2FsbChnbG9iYWwsIGZsdXNoKTtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChmbikge1xuICAgIHZhciB0YXNrID0geyBmbjogZm4sIG5leHQ6IHVuZGVmaW5lZCB9O1xuICAgIGlmIChsYXN0KSBsYXN0Lm5leHQgPSB0YXNrO1xuICAgIGlmICghaGVhZCkge1xuICAgICAgaGVhZCA9IHRhc2s7XG4gICAgICBub3RpZnkoKTtcbiAgICB9IGxhc3QgPSB0YXNrO1xuICB9O1xufTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIDI1LjQuMS41IE5ld1Byb21pc2VDYXBhYmlsaXR5KEMpXG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpO1xuXG5mdW5jdGlvbiBQcm9taXNlQ2FwYWJpbGl0eShDKSB7XG4gIHZhciByZXNvbHZlLCByZWplY3Q7XG4gIHRoaXMucHJvbWlzZSA9IG5ldyBDKGZ1bmN0aW9uICgkJHJlc29sdmUsICQkcmVqZWN0KSB7XG4gICAgaWYgKHJlc29sdmUgIT09IHVuZGVmaW5lZCB8fCByZWplY3QgIT09IHVuZGVmaW5lZCkgdGhyb3cgVHlwZUVycm9yKCdCYWQgUHJvbWlzZSBjb25zdHJ1Y3RvcicpO1xuICAgIHJlc29sdmUgPSAkJHJlc29sdmU7XG4gICAgcmVqZWN0ID0gJCRyZWplY3Q7XG4gIH0pO1xuICB0aGlzLnJlc29sdmUgPSBhRnVuY3Rpb24ocmVzb2x2ZSk7XG4gIHRoaXMucmVqZWN0ID0gYUZ1bmN0aW9uKHJlamVjdCk7XG59XG5cbm1vZHVsZS5leHBvcnRzLmYgPSBmdW5jdGlvbiAoQykge1xuICByZXR1cm4gbmV3IFByb21pc2VDYXBhYmlsaXR5KEMpO1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGV4ZWMpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4geyBlOiBmYWxzZSwgdjogZXhlYygpIH07XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4geyBlOiB0cnVlLCB2OiBlIH07XG4gIH1cbn07XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgbmF2aWdhdG9yID0gZ2xvYmFsLm5hdmlnYXRvcjtcblxubW9kdWxlLmV4cG9ydHMgPSBuYXZpZ2F0b3IgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCB8fCAnJztcbiIsInZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHkgPSByZXF1aXJlKCcuL19uZXctcHJvbWlzZS1jYXBhYmlsaXR5Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKEMsIHgpIHtcbiAgYW5PYmplY3QoQyk7XG4gIGlmIChpc09iamVjdCh4KSAmJiB4LmNvbnN0cnVjdG9yID09PSBDKSByZXR1cm4geDtcbiAgdmFyIHByb21pc2VDYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkuZihDKTtcbiAgdmFyIHJlc29sdmUgPSBwcm9taXNlQ2FwYWJpbGl0eS5yZXNvbHZlO1xuICByZXNvbHZlKHgpO1xuICByZXR1cm4gcHJvbWlzZUNhcGFiaWxpdHkucHJvbWlzZTtcbn07XG4iLCJ2YXIgaGlkZSA9IHJlcXVpcmUoJy4vX2hpZGUnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHRhcmdldCwgc3JjLCBzYWZlKSB7XG4gIGZvciAodmFyIGtleSBpbiBzcmMpIHtcbiAgICBpZiAoc2FmZSAmJiB0YXJnZXRba2V5XSkgdGFyZ2V0W2tleV0gPSBzcmNba2V5XTtcbiAgICBlbHNlIGhpZGUodGFyZ2V0LCBrZXksIHNyY1trZXldKTtcbiAgfSByZXR1cm4gdGFyZ2V0O1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBjb3JlID0gcmVxdWlyZSgnLi9fY29yZScpO1xudmFyIGRQID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJyk7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpO1xudmFyIFNQRUNJRVMgPSByZXF1aXJlKCcuL193a3MnKSgnc3BlY2llcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChLRVkpIHtcbiAgdmFyIEMgPSB0eXBlb2YgY29yZVtLRVldID09ICdmdW5jdGlvbicgPyBjb3JlW0tFWV0gOiBnbG9iYWxbS0VZXTtcbiAgaWYgKERFU0NSSVBUT1JTICYmIEMgJiYgIUNbU1BFQ0lFU10pIGRQLmYoQywgU1BFQ0lFUywge1xuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH1cbiAgfSk7XG59O1xuIiwidmFyIElURVJBVE9SID0gcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJyk7XG52YXIgU0FGRV9DTE9TSU5HID0gZmFsc2U7XG5cbnRyeSB7XG4gIHZhciByaXRlciA9IFs3XVtJVEVSQVRPUl0oKTtcbiAgcml0ZXJbJ3JldHVybiddID0gZnVuY3Rpb24gKCkgeyBTQUZFX0NMT1NJTkcgPSB0cnVlOyB9O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdGhyb3ctbGl0ZXJhbFxuICBBcnJheS5mcm9tKHJpdGVyLCBmdW5jdGlvbiAoKSB7IHRocm93IDI7IH0pO1xufSBjYXRjaCAoZSkgeyAvKiBlbXB0eSAqLyB9XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGV4ZWMsIHNraXBDbG9zaW5nKSB7XG4gIGlmICghc2tpcENsb3NpbmcgJiYgIVNBRkVfQ0xPU0lORykgcmV0dXJuIGZhbHNlO1xuICB2YXIgc2FmZSA9IGZhbHNlO1xuICB0cnkge1xuICAgIHZhciBhcnIgPSBbN107XG4gICAgdmFyIGl0ZXIgPSBhcnJbSVRFUkFUT1JdKCk7XG4gICAgaXRlci5uZXh0ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4geyBkb25lOiBzYWZlID0gdHJ1ZSB9OyB9O1xuICAgIGFycltJVEVSQVRPUl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiBpdGVyOyB9O1xuICAgIGV4ZWMoYXJyKTtcbiAgfSBjYXRjaCAoZSkgeyAvKiBlbXB0eSAqLyB9XG4gIHJldHVybiBzYWZlO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBMSUJSQVJZID0gcmVxdWlyZSgnLi9fbGlicmFyeScpO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIGN0eCA9IHJlcXVpcmUoJy4vX2N0eCcpO1xudmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuL19jbGFzc29mJyk7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpO1xudmFyIGFuSW5zdGFuY2UgPSByZXF1aXJlKCcuL19hbi1pbnN0YW5jZScpO1xudmFyIGZvck9mID0gcmVxdWlyZSgnLi9fZm9yLW9mJyk7XG52YXIgc3BlY2llc0NvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi9fc3BlY2llcy1jb25zdHJ1Y3RvcicpO1xudmFyIHRhc2sgPSByZXF1aXJlKCcuL190YXNrJykuc2V0O1xudmFyIG1pY3JvdGFzayA9IHJlcXVpcmUoJy4vX21pY3JvdGFzaycpKCk7XG52YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUgPSByZXF1aXJlKCcuL19uZXctcHJvbWlzZS1jYXBhYmlsaXR5Jyk7XG52YXIgcGVyZm9ybSA9IHJlcXVpcmUoJy4vX3BlcmZvcm0nKTtcbnZhciB1c2VyQWdlbnQgPSByZXF1aXJlKCcuL191c2VyLWFnZW50Jyk7XG52YXIgcHJvbWlzZVJlc29sdmUgPSByZXF1aXJlKCcuL19wcm9taXNlLXJlc29sdmUnKTtcbnZhciBQUk9NSVNFID0gJ1Byb21pc2UnO1xudmFyIFR5cGVFcnJvciA9IGdsb2JhbC5UeXBlRXJyb3I7XG52YXIgcHJvY2VzcyA9IGdsb2JhbC5wcm9jZXNzO1xudmFyIHZlcnNpb25zID0gcHJvY2VzcyAmJiBwcm9jZXNzLnZlcnNpb25zO1xudmFyIHY4ID0gdmVyc2lvbnMgJiYgdmVyc2lvbnMudjggfHwgJyc7XG52YXIgJFByb21pc2UgPSBnbG9iYWxbUFJPTUlTRV07XG52YXIgaXNOb2RlID0gY2xhc3NvZihwcm9jZXNzKSA9PSAncHJvY2Vzcyc7XG52YXIgZW1wdHkgPSBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH07XG52YXIgSW50ZXJuYWwsIG5ld0dlbmVyaWNQcm9taXNlQ2FwYWJpbGl0eSwgT3duUHJvbWlzZUNhcGFiaWxpdHksIFdyYXBwZXI7XG52YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHkgPSBuZXdHZW5lcmljUHJvbWlzZUNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZS5mO1xuXG52YXIgVVNFX05BVElWRSA9ICEhZnVuY3Rpb24gKCkge1xuICB0cnkge1xuICAgIC8vIGNvcnJlY3Qgc3ViY2xhc3Npbmcgd2l0aCBAQHNwZWNpZXMgc3VwcG9ydFxuICAgIHZhciBwcm9taXNlID0gJFByb21pc2UucmVzb2x2ZSgxKTtcbiAgICB2YXIgRmFrZVByb21pc2UgPSAocHJvbWlzZS5jb25zdHJ1Y3RvciA9IHt9KVtyZXF1aXJlKCcuL193a3MnKSgnc3BlY2llcycpXSA9IGZ1bmN0aW9uIChleGVjKSB7XG4gICAgICBleGVjKGVtcHR5LCBlbXB0eSk7XG4gICAgfTtcbiAgICAvLyB1bmhhbmRsZWQgcmVqZWN0aW9ucyB0cmFja2luZyBzdXBwb3J0LCBOb2RlSlMgUHJvbWlzZSB3aXRob3V0IGl0IGZhaWxzIEBAc3BlY2llcyB0ZXN0XG4gICAgcmV0dXJuIChpc05vZGUgfHwgdHlwZW9mIFByb21pc2VSZWplY3Rpb25FdmVudCA9PSAnZnVuY3Rpb24nKVxuICAgICAgJiYgcHJvbWlzZS50aGVuKGVtcHR5KSBpbnN0YW5jZW9mIEZha2VQcm9taXNlXG4gICAgICAvLyB2OCA2LjYgKE5vZGUgMTAgYW5kIENocm9tZSA2NikgaGF2ZSBhIGJ1ZyB3aXRoIHJlc29sdmluZyBjdXN0b20gdGhlbmFibGVzXG4gICAgICAvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD04MzA1NjVcbiAgICAgIC8vIHdlIGNhbid0IGRldGVjdCBpdCBzeW5jaHJvbm91c2x5LCBzbyBqdXN0IGNoZWNrIHZlcnNpb25zXG4gICAgICAmJiB2OC5pbmRleE9mKCc2LjYnKSAhPT0gMFxuICAgICAgJiYgdXNlckFnZW50LmluZGV4T2YoJ0Nocm9tZS82NicpID09PSAtMTtcbiAgfSBjYXRjaCAoZSkgeyAvKiBlbXB0eSAqLyB9XG59KCk7XG5cbi8vIGhlbHBlcnNcbnZhciBpc1RoZW5hYmxlID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciB0aGVuO1xuICByZXR1cm4gaXNPYmplY3QoaXQpICYmIHR5cGVvZiAodGhlbiA9IGl0LnRoZW4pID09ICdmdW5jdGlvbicgPyB0aGVuIDogZmFsc2U7XG59O1xudmFyIG5vdGlmeSA9IGZ1bmN0aW9uIChwcm9taXNlLCBpc1JlamVjdCkge1xuICBpZiAocHJvbWlzZS5fbikgcmV0dXJuO1xuICBwcm9taXNlLl9uID0gdHJ1ZTtcbiAgdmFyIGNoYWluID0gcHJvbWlzZS5fYztcbiAgbWljcm90YXNrKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdmFsdWUgPSBwcm9taXNlLl92O1xuICAgIHZhciBvayA9IHByb21pc2UuX3MgPT0gMTtcbiAgICB2YXIgaSA9IDA7XG4gICAgdmFyIHJ1biA9IGZ1bmN0aW9uIChyZWFjdGlvbikge1xuICAgICAgdmFyIGhhbmRsZXIgPSBvayA/IHJlYWN0aW9uLm9rIDogcmVhY3Rpb24uZmFpbDtcbiAgICAgIHZhciByZXNvbHZlID0gcmVhY3Rpb24ucmVzb2x2ZTtcbiAgICAgIHZhciByZWplY3QgPSByZWFjdGlvbi5yZWplY3Q7XG4gICAgICB2YXIgZG9tYWluID0gcmVhY3Rpb24uZG9tYWluO1xuICAgICAgdmFyIHJlc3VsdCwgdGhlbiwgZXhpdGVkO1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKGhhbmRsZXIpIHtcbiAgICAgICAgICBpZiAoIW9rKSB7XG4gICAgICAgICAgICBpZiAocHJvbWlzZS5faCA9PSAyKSBvbkhhbmRsZVVuaGFuZGxlZChwcm9taXNlKTtcbiAgICAgICAgICAgIHByb21pc2UuX2ggPSAxO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaGFuZGxlciA9PT0gdHJ1ZSkgcmVzdWx0ID0gdmFsdWU7XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoZG9tYWluKSBkb21haW4uZW50ZXIoKTtcbiAgICAgICAgICAgIHJlc3VsdCA9IGhhbmRsZXIodmFsdWUpOyAvLyBtYXkgdGhyb3dcbiAgICAgICAgICAgIGlmIChkb21haW4pIHtcbiAgICAgICAgICAgICAgZG9tYWluLmV4aXQoKTtcbiAgICAgICAgICAgICAgZXhpdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHJlc3VsdCA9PT0gcmVhY3Rpb24ucHJvbWlzZSkge1xuICAgICAgICAgICAgcmVqZWN0KFR5cGVFcnJvcignUHJvbWlzZS1jaGFpbiBjeWNsZScpKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHRoZW4gPSBpc1RoZW5hYmxlKHJlc3VsdCkpIHtcbiAgICAgICAgICAgIHRoZW4uY2FsbChyZXN1bHQsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgfSBlbHNlIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgfSBlbHNlIHJlamVjdCh2YWx1ZSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChkb21haW4gJiYgIWV4aXRlZCkgZG9tYWluLmV4aXQoKTtcbiAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgfVxuICAgIH07XG4gICAgd2hpbGUgKGNoYWluLmxlbmd0aCA+IGkpIHJ1bihjaGFpbltpKytdKTsgLy8gdmFyaWFibGUgbGVuZ3RoIC0gY2FuJ3QgdXNlIGZvckVhY2hcbiAgICBwcm9taXNlLl9jID0gW107XG4gICAgcHJvbWlzZS5fbiA9IGZhbHNlO1xuICAgIGlmIChpc1JlamVjdCAmJiAhcHJvbWlzZS5faCkgb25VbmhhbmRsZWQocHJvbWlzZSk7XG4gIH0pO1xufTtcbnZhciBvblVuaGFuZGxlZCA9IGZ1bmN0aW9uIChwcm9taXNlKSB7XG4gIHRhc2suY2FsbChnbG9iYWwsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdmFsdWUgPSBwcm9taXNlLl92O1xuICAgIHZhciB1bmhhbmRsZWQgPSBpc1VuaGFuZGxlZChwcm9taXNlKTtcbiAgICB2YXIgcmVzdWx0LCBoYW5kbGVyLCBjb25zb2xlO1xuICAgIGlmICh1bmhhbmRsZWQpIHtcbiAgICAgIHJlc3VsdCA9IHBlcmZvcm0oZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoaXNOb2RlKSB7XG4gICAgICAgICAgcHJvY2Vzcy5lbWl0KCd1bmhhbmRsZWRSZWplY3Rpb24nLCB2YWx1ZSwgcHJvbWlzZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaGFuZGxlciA9IGdsb2JhbC5vbnVuaGFuZGxlZHJlamVjdGlvbikge1xuICAgICAgICAgIGhhbmRsZXIoeyBwcm9taXNlOiBwcm9taXNlLCByZWFzb246IHZhbHVlIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKChjb25zb2xlID0gZ2xvYmFsLmNvbnNvbGUpICYmIGNvbnNvbGUuZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdVbmhhbmRsZWQgcHJvbWlzZSByZWplY3Rpb24nLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgLy8gQnJvd3NlcnMgc2hvdWxkIG5vdCB0cmlnZ2VyIGByZWplY3Rpb25IYW5kbGVkYCBldmVudCBpZiBpdCB3YXMgaGFuZGxlZCBoZXJlLCBOb2RlSlMgLSBzaG91bGRcbiAgICAgIHByb21pc2UuX2ggPSBpc05vZGUgfHwgaXNVbmhhbmRsZWQocHJvbWlzZSkgPyAyIDogMTtcbiAgICB9IHByb21pc2UuX2EgPSB1bmRlZmluZWQ7XG4gICAgaWYgKHVuaGFuZGxlZCAmJiByZXN1bHQuZSkgdGhyb3cgcmVzdWx0LnY7XG4gIH0pO1xufTtcbnZhciBpc1VuaGFuZGxlZCA9IGZ1bmN0aW9uIChwcm9taXNlKSB7XG4gIHJldHVybiBwcm9taXNlLl9oICE9PSAxICYmIChwcm9taXNlLl9hIHx8IHByb21pc2UuX2MpLmxlbmd0aCA9PT0gMDtcbn07XG52YXIgb25IYW5kbGVVbmhhbmRsZWQgPSBmdW5jdGlvbiAocHJvbWlzZSkge1xuICB0YXNrLmNhbGwoZ2xvYmFsLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGhhbmRsZXI7XG4gICAgaWYgKGlzTm9kZSkge1xuICAgICAgcHJvY2Vzcy5lbWl0KCdyZWplY3Rpb25IYW5kbGVkJywgcHJvbWlzZSk7XG4gICAgfSBlbHNlIGlmIChoYW5kbGVyID0gZ2xvYmFsLm9ucmVqZWN0aW9uaGFuZGxlZCkge1xuICAgICAgaGFuZGxlcih7IHByb21pc2U6IHByb21pc2UsIHJlYXNvbjogcHJvbWlzZS5fdiB9KTtcbiAgICB9XG4gIH0pO1xufTtcbnZhciAkcmVqZWN0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gIHZhciBwcm9taXNlID0gdGhpcztcbiAgaWYgKHByb21pc2UuX2QpIHJldHVybjtcbiAgcHJvbWlzZS5fZCA9IHRydWU7XG4gIHByb21pc2UgPSBwcm9taXNlLl93IHx8IHByb21pc2U7IC8vIHVud3JhcFxuICBwcm9taXNlLl92ID0gdmFsdWU7XG4gIHByb21pc2UuX3MgPSAyO1xuICBpZiAoIXByb21pc2UuX2EpIHByb21pc2UuX2EgPSBwcm9taXNlLl9jLnNsaWNlKCk7XG4gIG5vdGlmeShwcm9taXNlLCB0cnVlKTtcbn07XG52YXIgJHJlc29sdmUgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgdmFyIHByb21pc2UgPSB0aGlzO1xuICB2YXIgdGhlbjtcbiAgaWYgKHByb21pc2UuX2QpIHJldHVybjtcbiAgcHJvbWlzZS5fZCA9IHRydWU7XG4gIHByb21pc2UgPSBwcm9taXNlLl93IHx8IHByb21pc2U7IC8vIHVud3JhcFxuICB0cnkge1xuICAgIGlmIChwcm9taXNlID09PSB2YWx1ZSkgdGhyb3cgVHlwZUVycm9yKFwiUHJvbWlzZSBjYW4ndCBiZSByZXNvbHZlZCBpdHNlbGZcIik7XG4gICAgaWYgKHRoZW4gPSBpc1RoZW5hYmxlKHZhbHVlKSkge1xuICAgICAgbWljcm90YXNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHdyYXBwZXIgPSB7IF93OiBwcm9taXNlLCBfZDogZmFsc2UgfTsgLy8gd3JhcFxuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoZW4uY2FsbCh2YWx1ZSwgY3R4KCRyZXNvbHZlLCB3cmFwcGVyLCAxKSwgY3R4KCRyZWplY3QsIHdyYXBwZXIsIDEpKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICRyZWplY3QuY2FsbCh3cmFwcGVyLCBlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb21pc2UuX3YgPSB2YWx1ZTtcbiAgICAgIHByb21pc2UuX3MgPSAxO1xuICAgICAgbm90aWZ5KHByb21pc2UsIGZhbHNlKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAkcmVqZWN0LmNhbGwoeyBfdzogcHJvbWlzZSwgX2Q6IGZhbHNlIH0sIGUpOyAvLyB3cmFwXG4gIH1cbn07XG5cbi8vIGNvbnN0cnVjdG9yIHBvbHlmaWxsXG5pZiAoIVVTRV9OQVRJVkUpIHtcbiAgLy8gMjUuNC4zLjEgUHJvbWlzZShleGVjdXRvcilcbiAgJFByb21pc2UgPSBmdW5jdGlvbiBQcm9taXNlKGV4ZWN1dG9yKSB7XG4gICAgYW5JbnN0YW5jZSh0aGlzLCAkUHJvbWlzZSwgUFJPTUlTRSwgJ19oJyk7XG4gICAgYUZ1bmN0aW9uKGV4ZWN1dG9yKTtcbiAgICBJbnRlcm5hbC5jYWxsKHRoaXMpO1xuICAgIHRyeSB7XG4gICAgICBleGVjdXRvcihjdHgoJHJlc29sdmUsIHRoaXMsIDEpLCBjdHgoJHJlamVjdCwgdGhpcywgMSkpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgJHJlamVjdC5jYWxsKHRoaXMsIGVycik7XG4gICAgfVxuICB9O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgSW50ZXJuYWwgPSBmdW5jdGlvbiBQcm9taXNlKGV4ZWN1dG9yKSB7XG4gICAgdGhpcy5fYyA9IFtdOyAgICAgICAgICAgICAvLyA8LSBhd2FpdGluZyByZWFjdGlvbnNcbiAgICB0aGlzLl9hID0gdW5kZWZpbmVkOyAgICAgIC8vIDwtIGNoZWNrZWQgaW4gaXNVbmhhbmRsZWQgcmVhY3Rpb25zXG4gICAgdGhpcy5fcyA9IDA7ICAgICAgICAgICAgICAvLyA8LSBzdGF0ZVxuICAgIHRoaXMuX2QgPSBmYWxzZTsgICAgICAgICAgLy8gPC0gZG9uZVxuICAgIHRoaXMuX3YgPSB1bmRlZmluZWQ7ICAgICAgLy8gPC0gdmFsdWVcbiAgICB0aGlzLl9oID0gMDsgICAgICAgICAgICAgIC8vIDwtIHJlamVjdGlvbiBzdGF0ZSwgMCAtIGRlZmF1bHQsIDEgLSBoYW5kbGVkLCAyIC0gdW5oYW5kbGVkXG4gICAgdGhpcy5fbiA9IGZhbHNlOyAgICAgICAgICAvLyA8LSBub3RpZnlcbiAgfTtcbiAgSW50ZXJuYWwucHJvdG90eXBlID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUtYWxsJykoJFByb21pc2UucHJvdG90eXBlLCB7XG4gICAgLy8gMjUuNC41LjMgUHJvbWlzZS5wcm90b3R5cGUudGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZClcbiAgICB0aGVuOiBmdW5jdGlvbiB0aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKSB7XG4gICAgICB2YXIgcmVhY3Rpb24gPSBuZXdQcm9taXNlQ2FwYWJpbGl0eShzcGVjaWVzQ29uc3RydWN0b3IodGhpcywgJFByb21pc2UpKTtcbiAgICAgIHJlYWN0aW9uLm9rID0gdHlwZW9mIG9uRnVsZmlsbGVkID09ICdmdW5jdGlvbicgPyBvbkZ1bGZpbGxlZCA6IHRydWU7XG4gICAgICByZWFjdGlvbi5mYWlsID0gdHlwZW9mIG9uUmVqZWN0ZWQgPT0gJ2Z1bmN0aW9uJyAmJiBvblJlamVjdGVkO1xuICAgICAgcmVhY3Rpb24uZG9tYWluID0gaXNOb2RlID8gcHJvY2Vzcy5kb21haW4gOiB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9jLnB1c2gocmVhY3Rpb24pO1xuICAgICAgaWYgKHRoaXMuX2EpIHRoaXMuX2EucHVzaChyZWFjdGlvbik7XG4gICAgICBpZiAodGhpcy5fcykgbm90aWZ5KHRoaXMsIGZhbHNlKTtcbiAgICAgIHJldHVybiByZWFjdGlvbi5wcm9taXNlO1xuICAgIH0sXG4gICAgLy8gMjUuNC41LjEgUHJvbWlzZS5wcm90b3R5cGUuY2F0Y2gob25SZWplY3RlZClcbiAgICAnY2F0Y2gnOiBmdW5jdGlvbiAob25SZWplY3RlZCkge1xuICAgICAgcmV0dXJuIHRoaXMudGhlbih1bmRlZmluZWQsIG9uUmVqZWN0ZWQpO1xuICAgIH1cbiAgfSk7XG4gIE93blByb21pc2VDYXBhYmlsaXR5ID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBwcm9taXNlID0gbmV3IEludGVybmFsKCk7XG4gICAgdGhpcy5wcm9taXNlID0gcHJvbWlzZTtcbiAgICB0aGlzLnJlc29sdmUgPSBjdHgoJHJlc29sdmUsIHByb21pc2UsIDEpO1xuICAgIHRoaXMucmVqZWN0ID0gY3R4KCRyZWplY3QsIHByb21pc2UsIDEpO1xuICB9O1xuICBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZS5mID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkgPSBmdW5jdGlvbiAoQykge1xuICAgIHJldHVybiBDID09PSAkUHJvbWlzZSB8fCBDID09PSBXcmFwcGVyXG4gICAgICA/IG5ldyBPd25Qcm9taXNlQ2FwYWJpbGl0eShDKVxuICAgICAgOiBuZXdHZW5lcmljUHJvbWlzZUNhcGFiaWxpdHkoQyk7XG4gIH07XG59XG5cbiRleHBvcnQoJGV4cG9ydC5HICsgJGV4cG9ydC5XICsgJGV4cG9ydC5GICogIVVTRV9OQVRJVkUsIHsgUHJvbWlzZTogJFByb21pc2UgfSk7XG5yZXF1aXJlKCcuL19zZXQtdG8tc3RyaW5nLXRhZycpKCRQcm9taXNlLCBQUk9NSVNFKTtcbnJlcXVpcmUoJy4vX3NldC1zcGVjaWVzJykoUFJPTUlTRSk7XG5XcmFwcGVyID0gcmVxdWlyZSgnLi9fY29yZScpW1BST01JU0VdO1xuXG4vLyBzdGF0aWNzXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICFVU0VfTkFUSVZFLCBQUk9NSVNFLCB7XG4gIC8vIDI1LjQuNC41IFByb21pc2UucmVqZWN0KHIpXG4gIHJlamVjdDogZnVuY3Rpb24gcmVqZWN0KHIpIHtcbiAgICB2YXIgY2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KHRoaXMpO1xuICAgIHZhciAkJHJlamVjdCA9IGNhcGFiaWxpdHkucmVqZWN0O1xuICAgICQkcmVqZWN0KHIpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbn0pO1xuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAoTElCUkFSWSB8fCAhVVNFX05BVElWRSksIFBST01JU0UsIHtcbiAgLy8gMjUuNC40LjYgUHJvbWlzZS5yZXNvbHZlKHgpXG4gIHJlc29sdmU6IGZ1bmN0aW9uIHJlc29sdmUoeCkge1xuICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZShMSUJSQVJZICYmIHRoaXMgPT09IFdyYXBwZXIgPyAkUHJvbWlzZSA6IHRoaXMsIHgpO1xuICB9XG59KTtcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIShVU0VfTkFUSVZFICYmIHJlcXVpcmUoJy4vX2l0ZXItZGV0ZWN0JykoZnVuY3Rpb24gKGl0ZXIpIHtcbiAgJFByb21pc2UuYWxsKGl0ZXIpWydjYXRjaCddKGVtcHR5KTtcbn0pKSwgUFJPTUlTRSwge1xuICAvLyAyNS40LjQuMSBQcm9taXNlLmFsbChpdGVyYWJsZSlcbiAgYWxsOiBmdW5jdGlvbiBhbGwoaXRlcmFibGUpIHtcbiAgICB2YXIgQyA9IHRoaXM7XG4gICAgdmFyIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eShDKTtcbiAgICB2YXIgcmVzb2x2ZSA9IGNhcGFiaWxpdHkucmVzb2x2ZTtcbiAgICB2YXIgcmVqZWN0ID0gY2FwYWJpbGl0eS5yZWplY3Q7XG4gICAgdmFyIHJlc3VsdCA9IHBlcmZvcm0oZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHZhbHVlcyA9IFtdO1xuICAgICAgdmFyIGluZGV4ID0gMDtcbiAgICAgIHZhciByZW1haW5pbmcgPSAxO1xuICAgICAgZm9yT2YoaXRlcmFibGUsIGZhbHNlLCBmdW5jdGlvbiAocHJvbWlzZSkge1xuICAgICAgICB2YXIgJGluZGV4ID0gaW5kZXgrKztcbiAgICAgICAgdmFyIGFscmVhZHlDYWxsZWQgPSBmYWxzZTtcbiAgICAgICAgdmFsdWVzLnB1c2godW5kZWZpbmVkKTtcbiAgICAgICAgcmVtYWluaW5nKys7XG4gICAgICAgIEMucmVzb2x2ZShwcm9taXNlKS50aGVuKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgIGlmIChhbHJlYWR5Q2FsbGVkKSByZXR1cm47XG4gICAgICAgICAgYWxyZWFkeUNhbGxlZCA9IHRydWU7XG4gICAgICAgICAgdmFsdWVzWyRpbmRleF0gPSB2YWx1ZTtcbiAgICAgICAgICAtLXJlbWFpbmluZyB8fCByZXNvbHZlKHZhbHVlcyk7XG4gICAgICAgIH0sIHJlamVjdCk7XG4gICAgICB9KTtcbiAgICAgIC0tcmVtYWluaW5nIHx8IHJlc29sdmUodmFsdWVzKTtcbiAgICB9KTtcbiAgICBpZiAocmVzdWx0LmUpIHJlamVjdChyZXN1bHQudik7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfSxcbiAgLy8gMjUuNC40LjQgUHJvbWlzZS5yYWNlKGl0ZXJhYmxlKVxuICByYWNlOiBmdW5jdGlvbiByYWNlKGl0ZXJhYmxlKSB7XG4gICAgdmFyIEMgPSB0aGlzO1xuICAgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkoQyk7XG4gICAgdmFyIHJlamVjdCA9IGNhcGFiaWxpdHkucmVqZWN0O1xuICAgIHZhciByZXN1bHQgPSBwZXJmb3JtKGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvck9mKGl0ZXJhYmxlLCBmYWxzZSwgZnVuY3Rpb24gKHByb21pc2UpIHtcbiAgICAgICAgQy5yZXNvbHZlKHByb21pc2UpLnRoZW4oY2FwYWJpbGl0eS5yZXNvbHZlLCByZWplY3QpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgaWYgKHJlc3VsdC5lKSByZWplY3QocmVzdWx0LnYpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbn0pO1xuIiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtcHJvbWlzZS1maW5hbGx5XG4ndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGNvcmUgPSByZXF1aXJlKCcuL19jb3JlJyk7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgc3BlY2llc0NvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi9fc3BlY2llcy1jb25zdHJ1Y3RvcicpO1xudmFyIHByb21pc2VSZXNvbHZlID0gcmVxdWlyZSgnLi9fcHJvbWlzZS1yZXNvbHZlJyk7XG5cbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5SLCAnUHJvbWlzZScsIHsgJ2ZpbmFsbHknOiBmdW5jdGlvbiAob25GaW5hbGx5KSB7XG4gIHZhciBDID0gc3BlY2llc0NvbnN0cnVjdG9yKHRoaXMsIGNvcmUuUHJvbWlzZSB8fCBnbG9iYWwuUHJvbWlzZSk7XG4gIHZhciBpc0Z1bmN0aW9uID0gdHlwZW9mIG9uRmluYWxseSA9PSAnZnVuY3Rpb24nO1xuICByZXR1cm4gdGhpcy50aGVuKFxuICAgIGlzRnVuY3Rpb24gPyBmdW5jdGlvbiAoeCkge1xuICAgICAgcmV0dXJuIHByb21pc2VSZXNvbHZlKEMsIG9uRmluYWxseSgpKS50aGVuKGZ1bmN0aW9uICgpIHsgcmV0dXJuIHg7IH0pO1xuICAgIH0gOiBvbkZpbmFsbHksXG4gICAgaXNGdW5jdGlvbiA/IGZ1bmN0aW9uIChlKSB7XG4gICAgICByZXR1cm4gcHJvbWlzZVJlc29sdmUoQywgb25GaW5hbGx5KCkpLnRoZW4oZnVuY3Rpb24gKCkgeyB0aHJvdyBlOyB9KTtcbiAgICB9IDogb25GaW5hbGx5XG4gICk7XG59IH0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtcHJvbWlzZS10cnlcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHkgPSByZXF1aXJlKCcuL19uZXctcHJvbWlzZS1jYXBhYmlsaXR5Jyk7XG52YXIgcGVyZm9ybSA9IHJlcXVpcmUoJy4vX3BlcmZvcm0nKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdQcm9taXNlJywgeyAndHJ5JzogZnVuY3Rpb24gKGNhbGxiYWNrZm4pIHtcbiAgdmFyIHByb21pc2VDYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkuZih0aGlzKTtcbiAgdmFyIHJlc3VsdCA9IHBlcmZvcm0oY2FsbGJhY2tmbik7XG4gIChyZXN1bHQuZSA/IHByb21pc2VDYXBhYmlsaXR5LnJlamVjdCA6IHByb21pc2VDYXBhYmlsaXR5LnJlc29sdmUpKHJlc3VsdC52KTtcbiAgcmV0dXJuIHByb21pc2VDYXBhYmlsaXR5LnByb21pc2U7XG59IH0pO1xuIiwicmVxdWlyZSgnLi4vbW9kdWxlcy9lczYub2JqZWN0LnRvLXN0cmluZycpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYuc3RyaW5nLml0ZXJhdG9yJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL3dlYi5kb20uaXRlcmFibGUnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2LnByb21pc2UnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM3LnByb21pc2UuZmluYWxseScpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczcucHJvbWlzZS50cnknKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vbW9kdWxlcy9fY29yZScpLlByb21pc2U7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjb3JlLWpzL2xpYnJhcnkvZm4vcHJvbWlzZVwiKTsiLCJ2YXIgX1Byb21pc2UgPSByZXF1aXJlKFwiLi4vY29yZS1qcy9wcm9taXNlXCIpO1xuXG5mdW5jdGlvbiBfYXN5bmNUb0dlbmVyYXRvcihmbikge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHZhciBzZWxmID0gdGhpcyxcbiAgICAgICAgYXJncyA9IGFyZ3VtZW50cztcbiAgICByZXR1cm4gbmV3IF9Qcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIHZhciBnZW4gPSBmbi5hcHBseShzZWxmLCBhcmdzKTtcblxuICAgICAgZnVuY3Rpb24gc3RlcChrZXksIGFyZykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHZhciBpbmZvID0gZ2VuW2tleV0oYXJnKTtcbiAgICAgICAgICB2YXIgdmFsdWUgPSBpbmZvLnZhbHVlO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGluZm8uZG9uZSkge1xuICAgICAgICAgIHJlc29sdmUodmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIF9Qcm9taXNlLnJlc29sdmUodmFsdWUpLnRoZW4oX25leHQsIF90aHJvdyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gX25leHQodmFsdWUpIHtcbiAgICAgICAgc3RlcChcIm5leHRcIiwgdmFsdWUpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBfdGhyb3coZXJyKSB7XG4gICAgICAgIHN0ZXAoXCJ0aHJvd1wiLCBlcnIpO1xuICAgICAgfVxuXG4gICAgICBfbmV4dCgpO1xuICAgIH0pO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9hc3luY1RvR2VuZXJhdG9yOyIsImV4cG9ydHMuZiA9IHt9LnByb3BlcnR5SXNFbnVtZXJhYmxlO1xuIiwidmFyIHBJRSA9IHJlcXVpcmUoJy4vX29iamVjdC1waWUnKTtcbnZhciBjcmVhdGVEZXNjID0gcmVxdWlyZSgnLi9fcHJvcGVydHktZGVzYycpO1xudmFyIHRvSU9iamVjdCA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKTtcbnZhciB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4vX3RvLXByaW1pdGl2ZScpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpO1xudmFyIElFOF9ET01fREVGSU5FID0gcmVxdWlyZSgnLi9faWU4LWRvbS1kZWZpbmUnKTtcbnZhciBnT1BEID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcblxuZXhwb3J0cy5mID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSA/IGdPUEQgOiBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUCkge1xuICBPID0gdG9JT2JqZWN0KE8pO1xuICBQID0gdG9QcmltaXRpdmUoUCwgdHJ1ZSk7XG4gIGlmIChJRThfRE9NX0RFRklORSkgdHJ5IHtcbiAgICByZXR1cm4gZ09QRChPLCBQKTtcbiAgfSBjYXRjaCAoZSkgeyAvKiBlbXB0eSAqLyB9XG4gIGlmIChoYXMoTywgUCkpIHJldHVybiBjcmVhdGVEZXNjKCFwSUUuZi5jYWxsKE8sIFApLCBPW1BdKTtcbn07XG4iLCIvLyBtb3N0IE9iamVjdCBtZXRob2RzIGJ5IEVTNiBzaG91bGQgYWNjZXB0IHByaW1pdGl2ZXNcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgY29yZSA9IHJlcXVpcmUoJy4vX2NvcmUnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4vX2ZhaWxzJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChLRVksIGV4ZWMpIHtcbiAgdmFyIGZuID0gKGNvcmUuT2JqZWN0IHx8IHt9KVtLRVldIHx8IE9iamVjdFtLRVldO1xuICB2YXIgZXhwID0ge307XG4gIGV4cFtLRVldID0gZXhlYyhmbik7XG4gICRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogZmFpbHMoZnVuY3Rpb24gKCkgeyBmbigxKTsgfSksICdPYmplY3QnLCBleHApO1xufTtcbiIsIi8vIDE5LjEuMi42IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUClcbnZhciB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0Jyk7XG52YXIgJGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BkJykuZjtcblxucmVxdWlyZSgnLi9fb2JqZWN0LXNhcCcpKCdnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3InLCBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoaXQsIGtleSkge1xuICAgIHJldHVybiAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRvSU9iamVjdChpdCksIGtleSk7XG4gIH07XG59KTtcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXM2Lm9iamVjdC5nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcbnZhciAkT2JqZWN0ID0gcmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9fY29yZScpLk9iamVjdDtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGl0LCBrZXkpIHtcbiAgcmV0dXJuICRPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGl0LCBrZXkpO1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMvbGlicmFyeS9mbi9vYmplY3QvZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yXCIpOyIsInZhciBNRVRBID0gcmVxdWlyZSgnLi9fdWlkJykoJ21ldGEnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpO1xudmFyIHNldERlc2MgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKS5mO1xudmFyIGlkID0gMDtcbnZhciBpc0V4dGVuc2libGUgPSBPYmplY3QuaXNFeHRlbnNpYmxlIHx8IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRydWU7XG59O1xudmFyIEZSRUVaRSA9ICFyZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGlzRXh0ZW5zaWJsZShPYmplY3QucHJldmVudEV4dGVuc2lvbnMoe30pKTtcbn0pO1xudmFyIHNldE1ldGEgPSBmdW5jdGlvbiAoaXQpIHtcbiAgc2V0RGVzYyhpdCwgTUVUQSwgeyB2YWx1ZToge1xuICAgIGk6ICdPJyArICsraWQsIC8vIG9iamVjdCBJRFxuICAgIHc6IHt9ICAgICAgICAgIC8vIHdlYWsgY29sbGVjdGlvbnMgSURzXG4gIH0gfSk7XG59O1xudmFyIGZhc3RLZXkgPSBmdW5jdGlvbiAoaXQsIGNyZWF0ZSkge1xuICAvLyByZXR1cm4gcHJpbWl0aXZlIHdpdGggcHJlZml4XG4gIGlmICghaXNPYmplY3QoaXQpKSByZXR1cm4gdHlwZW9mIGl0ID09ICdzeW1ib2wnID8gaXQgOiAodHlwZW9mIGl0ID09ICdzdHJpbmcnID8gJ1MnIDogJ1AnKSArIGl0O1xuICBpZiAoIWhhcyhpdCwgTUVUQSkpIHtcbiAgICAvLyBjYW4ndCBzZXQgbWV0YWRhdGEgdG8gdW5jYXVnaHQgZnJvemVuIG9iamVjdFxuICAgIGlmICghaXNFeHRlbnNpYmxlKGl0KSkgcmV0dXJuICdGJztcbiAgICAvLyBub3QgbmVjZXNzYXJ5IHRvIGFkZCBtZXRhZGF0YVxuICAgIGlmICghY3JlYXRlKSByZXR1cm4gJ0UnO1xuICAgIC8vIGFkZCBtaXNzaW5nIG1ldGFkYXRhXG4gICAgc2V0TWV0YShpdCk7XG4gIC8vIHJldHVybiBvYmplY3QgSURcbiAgfSByZXR1cm4gaXRbTUVUQV0uaTtcbn07XG52YXIgZ2V0V2VhayA9IGZ1bmN0aW9uIChpdCwgY3JlYXRlKSB7XG4gIGlmICghaGFzKGl0LCBNRVRBKSkge1xuICAgIC8vIGNhbid0IHNldCBtZXRhZGF0YSB0byB1bmNhdWdodCBmcm96ZW4gb2JqZWN0XG4gICAgaWYgKCFpc0V4dGVuc2libGUoaXQpKSByZXR1cm4gdHJ1ZTtcbiAgICAvLyBub3QgbmVjZXNzYXJ5IHRvIGFkZCBtZXRhZGF0YVxuICAgIGlmICghY3JlYXRlKSByZXR1cm4gZmFsc2U7XG4gICAgLy8gYWRkIG1pc3NpbmcgbWV0YWRhdGFcbiAgICBzZXRNZXRhKGl0KTtcbiAgLy8gcmV0dXJuIGhhc2ggd2VhayBjb2xsZWN0aW9ucyBJRHNcbiAgfSByZXR1cm4gaXRbTUVUQV0udztcbn07XG4vLyBhZGQgbWV0YWRhdGEgb24gZnJlZXplLWZhbWlseSBtZXRob2RzIGNhbGxpbmdcbnZhciBvbkZyZWV6ZSA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoRlJFRVpFICYmIG1ldGEuTkVFRCAmJiBpc0V4dGVuc2libGUoaXQpICYmICFoYXMoaXQsIE1FVEEpKSBzZXRNZXRhKGl0KTtcbiAgcmV0dXJuIGl0O1xufTtcbnZhciBtZXRhID0gbW9kdWxlLmV4cG9ydHMgPSB7XG4gIEtFWTogTUVUQSxcbiAgTkVFRDogZmFsc2UsXG4gIGZhc3RLZXk6IGZhc3RLZXksXG4gIGdldFdlYWs6IGdldFdlYWssXG4gIG9uRnJlZXplOiBvbkZyZWV6ZVxufTtcbiIsImV4cG9ydHMuZiA9IHJlcXVpcmUoJy4vX3drcycpO1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIGNvcmUgPSByZXF1aXJlKCcuL19jb3JlJyk7XG52YXIgTElCUkFSWSA9IHJlcXVpcmUoJy4vX2xpYnJhcnknKTtcbnZhciB3a3NFeHQgPSByZXF1aXJlKCcuL193a3MtZXh0Jyk7XG52YXIgZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKS5mO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAobmFtZSkge1xuICB2YXIgJFN5bWJvbCA9IGNvcmUuU3ltYm9sIHx8IChjb3JlLlN5bWJvbCA9IExJQlJBUlkgPyB7fSA6IGdsb2JhbC5TeW1ib2wgfHwge30pO1xuICBpZiAobmFtZS5jaGFyQXQoMCkgIT0gJ18nICYmICEobmFtZSBpbiAkU3ltYm9sKSkgZGVmaW5lUHJvcGVydHkoJFN5bWJvbCwgbmFtZSwgeyB2YWx1ZTogd2tzRXh0LmYobmFtZSkgfSk7XG59O1xuIiwiZXhwb3J0cy5mID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scztcbiIsIi8vIGFsbCBlbnVtZXJhYmxlIG9iamVjdCBrZXlzLCBpbmNsdWRlcyBzeW1ib2xzXG52YXIgZ2V0S2V5cyA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzJyk7XG52YXIgZ09QUyA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BzJyk7XG52YXIgcElFID0gcmVxdWlyZSgnLi9fb2JqZWN0LXBpZScpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIHJlc3VsdCA9IGdldEtleXMoaXQpO1xuICB2YXIgZ2V0U3ltYm9scyA9IGdPUFMuZjtcbiAgaWYgKGdldFN5bWJvbHMpIHtcbiAgICB2YXIgc3ltYm9scyA9IGdldFN5bWJvbHMoaXQpO1xuICAgIHZhciBpc0VudW0gPSBwSUUuZjtcbiAgICB2YXIgaSA9IDA7XG4gICAgdmFyIGtleTtcbiAgICB3aGlsZSAoc3ltYm9scy5sZW5ndGggPiBpKSBpZiAoaXNFbnVtLmNhbGwoaXQsIGtleSA9IHN5bWJvbHNbaSsrXSkpIHJlc3VsdC5wdXNoKGtleSk7XG4gIH0gcmV0dXJuIHJlc3VsdDtcbn07XG4iLCIvLyA3LjIuMiBJc0FycmF5KGFyZ3VtZW50KVxudmFyIGNvZiA9IHJlcXVpcmUoJy4vX2NvZicpO1xubW9kdWxlLmV4cG9ydHMgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uIGlzQXJyYXkoYXJnKSB7XG4gIHJldHVybiBjb2YoYXJnKSA9PSAnQXJyYXknO1xufTtcbiIsIi8vIDE5LjEuMi43IC8gMTUuMi4zLjQgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoTylcbnZhciAka2V5cyA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzLWludGVybmFsJyk7XG52YXIgaGlkZGVuS2V5cyA9IHJlcXVpcmUoJy4vX2VudW0tYnVnLWtleXMnKS5jb25jYXQoJ2xlbmd0aCcsICdwcm90b3R5cGUnKTtcblxuZXhwb3J0cy5mID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgfHwgZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyhPKSB7XG4gIHJldHVybiAka2V5cyhPLCBoaWRkZW5LZXlzKTtcbn07XG4iLCIvLyBmYWxsYmFjayBmb3IgSUUxMSBidWdneSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyB3aXRoIGlmcmFtZSBhbmQgd2luZG93XG52YXIgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpO1xudmFyIGdPUE4gPSByZXF1aXJlKCcuL19vYmplY3QtZ29wbicpLmY7XG52YXIgdG9TdHJpbmcgPSB7fS50b1N0cmluZztcblxudmFyIHdpbmRvd05hbWVzID0gdHlwZW9mIHdpbmRvdyA9PSAnb2JqZWN0JyAmJiB3aW5kb3cgJiYgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXNcbiAgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh3aW5kb3cpIDogW107XG5cbnZhciBnZXRXaW5kb3dOYW1lcyA9IGZ1bmN0aW9uIChpdCkge1xuICB0cnkge1xuICAgIHJldHVybiBnT1BOKGl0KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiB3aW5kb3dOYW1lcy5zbGljZSgpO1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cy5mID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyhpdCkge1xuICByZXR1cm4gd2luZG93TmFtZXMgJiYgdG9TdHJpbmcuY2FsbChpdCkgPT0gJ1tvYmplY3QgV2luZG93XScgPyBnZXRXaW5kb3dOYW1lcyhpdCkgOiBnT1BOKHRvSU9iamVjdChpdCkpO1xufTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIEVDTUFTY3JpcHQgNiBzeW1ib2xzIHNoaW1cbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBoYXMgPSByZXF1aXJlKCcuL19oYXMnKTtcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJyk7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUnKTtcbnZhciBNRVRBID0gcmVxdWlyZSgnLi9fbWV0YScpLktFWTtcbnZhciAkZmFpbHMgPSByZXF1aXJlKCcuL19mYWlscycpO1xudmFyIHNoYXJlZCA9IHJlcXVpcmUoJy4vX3NoYXJlZCcpO1xudmFyIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi9fc2V0LXRvLXN0cmluZy10YWcnKTtcbnZhciB1aWQgPSByZXF1aXJlKCcuL191aWQnKTtcbnZhciB3a3MgPSByZXF1aXJlKCcuL193a3MnKTtcbnZhciB3a3NFeHQgPSByZXF1aXJlKCcuL193a3MtZXh0Jyk7XG52YXIgd2tzRGVmaW5lID0gcmVxdWlyZSgnLi9fd2tzLWRlZmluZScpO1xudmFyIGVudW1LZXlzID0gcmVxdWlyZSgnLi9fZW51bS1rZXlzJyk7XG52YXIgaXNBcnJheSA9IHJlcXVpcmUoJy4vX2lzLWFycmF5Jyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIHRvSU9iamVjdCA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKTtcbnZhciB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4vX3RvLXByaW1pdGl2ZScpO1xudmFyIGNyZWF0ZURlc2MgPSByZXF1aXJlKCcuL19wcm9wZXJ0eS1kZXNjJyk7XG52YXIgX2NyZWF0ZSA9IHJlcXVpcmUoJy4vX29iamVjdC1jcmVhdGUnKTtcbnZhciBnT1BORXh0ID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcG4tZXh0Jyk7XG52YXIgJEdPUEQgPSByZXF1aXJlKCcuL19vYmplY3QtZ29wZCcpO1xudmFyICREUCA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpO1xudmFyICRrZXlzID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMnKTtcbnZhciBnT1BEID0gJEdPUEQuZjtcbnZhciBkUCA9ICREUC5mO1xudmFyIGdPUE4gPSBnT1BORXh0LmY7XG52YXIgJFN5bWJvbCA9IGdsb2JhbC5TeW1ib2w7XG52YXIgJEpTT04gPSBnbG9iYWwuSlNPTjtcbnZhciBfc3RyaW5naWZ5ID0gJEpTT04gJiYgJEpTT04uc3RyaW5naWZ5O1xudmFyIFBST1RPVFlQRSA9ICdwcm90b3R5cGUnO1xudmFyIEhJRERFTiA9IHdrcygnX2hpZGRlbicpO1xudmFyIFRPX1BSSU1JVElWRSA9IHdrcygndG9QcmltaXRpdmUnKTtcbnZhciBpc0VudW0gPSB7fS5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcbnZhciBTeW1ib2xSZWdpc3RyeSA9IHNoYXJlZCgnc3ltYm9sLXJlZ2lzdHJ5Jyk7XG52YXIgQWxsU3ltYm9scyA9IHNoYXJlZCgnc3ltYm9scycpO1xudmFyIE9QU3ltYm9scyA9IHNoYXJlZCgnb3Atc3ltYm9scycpO1xudmFyIE9iamVjdFByb3RvID0gT2JqZWN0W1BST1RPVFlQRV07XG52YXIgVVNFX05BVElWRSA9IHR5cGVvZiAkU3ltYm9sID09ICdmdW5jdGlvbic7XG52YXIgUU9iamVjdCA9IGdsb2JhbC5RT2JqZWN0O1xuLy8gRG9uJ3QgdXNlIHNldHRlcnMgaW4gUXQgU2NyaXB0LCBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvMTczXG52YXIgc2V0dGVyID0gIVFPYmplY3QgfHwgIVFPYmplY3RbUFJPVE9UWVBFXSB8fCAhUU9iamVjdFtQUk9UT1RZUEVdLmZpbmRDaGlsZDtcblxuLy8gZmFsbGJhY2sgZm9yIG9sZCBBbmRyb2lkLCBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9Njg3XG52YXIgc2V0U3ltYm9sRGVzYyA9IERFU0NSSVBUT1JTICYmICRmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBfY3JlYXRlKGRQKHt9LCAnYScsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGRQKHRoaXMsICdhJywgeyB2YWx1ZTogNyB9KS5hOyB9XG4gIH0pKS5hICE9IDc7XG59KSA/IGZ1bmN0aW9uIChpdCwga2V5LCBEKSB7XG4gIHZhciBwcm90b0Rlc2MgPSBnT1BEKE9iamVjdFByb3RvLCBrZXkpO1xuICBpZiAocHJvdG9EZXNjKSBkZWxldGUgT2JqZWN0UHJvdG9ba2V5XTtcbiAgZFAoaXQsIGtleSwgRCk7XG4gIGlmIChwcm90b0Rlc2MgJiYgaXQgIT09IE9iamVjdFByb3RvKSBkUChPYmplY3RQcm90bywga2V5LCBwcm90b0Rlc2MpO1xufSA6IGRQO1xuXG52YXIgd3JhcCA9IGZ1bmN0aW9uICh0YWcpIHtcbiAgdmFyIHN5bSA9IEFsbFN5bWJvbHNbdGFnXSA9IF9jcmVhdGUoJFN5bWJvbFtQUk9UT1RZUEVdKTtcbiAgc3ltLl9rID0gdGFnO1xuICByZXR1cm4gc3ltO1xufTtcblxudmFyIGlzU3ltYm9sID0gVVNFX05BVElWRSAmJiB0eXBlb2YgJFN5bWJvbC5pdGVyYXRvciA9PSAnc3ltYm9sJyA/IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gdHlwZW9mIGl0ID09ICdzeW1ib2wnO1xufSA6IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXQgaW5zdGFuY2VvZiAkU3ltYm9sO1xufTtcblxudmFyICRkZWZpbmVQcm9wZXJ0eSA9IGZ1bmN0aW9uIGRlZmluZVByb3BlcnR5KGl0LCBrZXksIEQpIHtcbiAgaWYgKGl0ID09PSBPYmplY3RQcm90bykgJGRlZmluZVByb3BlcnR5KE9QU3ltYm9scywga2V5LCBEKTtcbiAgYW5PYmplY3QoaXQpO1xuICBrZXkgPSB0b1ByaW1pdGl2ZShrZXksIHRydWUpO1xuICBhbk9iamVjdChEKTtcbiAgaWYgKGhhcyhBbGxTeW1ib2xzLCBrZXkpKSB7XG4gICAgaWYgKCFELmVudW1lcmFibGUpIHtcbiAgICAgIGlmICghaGFzKGl0LCBISURERU4pKSBkUChpdCwgSElEREVOLCBjcmVhdGVEZXNjKDEsIHt9KSk7XG4gICAgICBpdFtISURERU5dW2tleV0gPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoaGFzKGl0LCBISURERU4pICYmIGl0W0hJRERFTl1ba2V5XSkgaXRbSElEREVOXVtrZXldID0gZmFsc2U7XG4gICAgICBEID0gX2NyZWF0ZShELCB7IGVudW1lcmFibGU6IGNyZWF0ZURlc2MoMCwgZmFsc2UpIH0pO1xuICAgIH0gcmV0dXJuIHNldFN5bWJvbERlc2MoaXQsIGtleSwgRCk7XG4gIH0gcmV0dXJuIGRQKGl0LCBrZXksIEQpO1xufTtcbnZhciAkZGVmaW5lUHJvcGVydGllcyA9IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXMoaXQsIFApIHtcbiAgYW5PYmplY3QoaXQpO1xuICB2YXIga2V5cyA9IGVudW1LZXlzKFAgPSB0b0lPYmplY3QoUCkpO1xuICB2YXIgaSA9IDA7XG4gIHZhciBsID0ga2V5cy5sZW5ndGg7XG4gIHZhciBrZXk7XG4gIHdoaWxlIChsID4gaSkgJGRlZmluZVByb3BlcnR5KGl0LCBrZXkgPSBrZXlzW2krK10sIFBba2V5XSk7XG4gIHJldHVybiBpdDtcbn07XG52YXIgJGNyZWF0ZSA9IGZ1bmN0aW9uIGNyZWF0ZShpdCwgUCkge1xuICByZXR1cm4gUCA9PT0gdW5kZWZpbmVkID8gX2NyZWF0ZShpdCkgOiAkZGVmaW5lUHJvcGVydGllcyhfY3JlYXRlKGl0KSwgUCk7XG59O1xudmFyICRwcm9wZXJ0eUlzRW51bWVyYWJsZSA9IGZ1bmN0aW9uIHByb3BlcnR5SXNFbnVtZXJhYmxlKGtleSkge1xuICB2YXIgRSA9IGlzRW51bS5jYWxsKHRoaXMsIGtleSA9IHRvUHJpbWl0aXZlKGtleSwgdHJ1ZSkpO1xuICBpZiAodGhpcyA9PT0gT2JqZWN0UHJvdG8gJiYgaGFzKEFsbFN5bWJvbHMsIGtleSkgJiYgIWhhcyhPUFN5bWJvbHMsIGtleSkpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIEUgfHwgIWhhcyh0aGlzLCBrZXkpIHx8ICFoYXMoQWxsU3ltYm9scywga2V5KSB8fCBoYXModGhpcywgSElEREVOKSAmJiB0aGlzW0hJRERFTl1ba2V5XSA/IEUgOiB0cnVlO1xufTtcbnZhciAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGl0LCBrZXkpIHtcbiAgaXQgPSB0b0lPYmplY3QoaXQpO1xuICBrZXkgPSB0b1ByaW1pdGl2ZShrZXksIHRydWUpO1xuICBpZiAoaXQgPT09IE9iamVjdFByb3RvICYmIGhhcyhBbGxTeW1ib2xzLCBrZXkpICYmICFoYXMoT1BTeW1ib2xzLCBrZXkpKSByZXR1cm47XG4gIHZhciBEID0gZ09QRChpdCwga2V5KTtcbiAgaWYgKEQgJiYgaGFzKEFsbFN5bWJvbHMsIGtleSkgJiYgIShoYXMoaXQsIEhJRERFTikgJiYgaXRbSElEREVOXVtrZXldKSkgRC5lbnVtZXJhYmxlID0gdHJ1ZTtcbiAgcmV0dXJuIEQ7XG59O1xudmFyICRnZXRPd25Qcm9wZXJ0eU5hbWVzID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyhpdCkge1xuICB2YXIgbmFtZXMgPSBnT1BOKHRvSU9iamVjdChpdCkpO1xuICB2YXIgcmVzdWx0ID0gW107XG4gIHZhciBpID0gMDtcbiAgdmFyIGtleTtcbiAgd2hpbGUgKG5hbWVzLmxlbmd0aCA+IGkpIHtcbiAgICBpZiAoIWhhcyhBbGxTeW1ib2xzLCBrZXkgPSBuYW1lc1tpKytdKSAmJiBrZXkgIT0gSElEREVOICYmIGtleSAhPSBNRVRBKSByZXN1bHQucHVzaChrZXkpO1xuICB9IHJldHVybiByZXN1bHQ7XG59O1xudmFyICRnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMoaXQpIHtcbiAgdmFyIElTX09QID0gaXQgPT09IE9iamVjdFByb3RvO1xuICB2YXIgbmFtZXMgPSBnT1BOKElTX09QID8gT1BTeW1ib2xzIDogdG9JT2JqZWN0KGl0KSk7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgdmFyIGkgPSAwO1xuICB2YXIga2V5O1xuICB3aGlsZSAobmFtZXMubGVuZ3RoID4gaSkge1xuICAgIGlmIChoYXMoQWxsU3ltYm9scywga2V5ID0gbmFtZXNbaSsrXSkgJiYgKElTX09QID8gaGFzKE9iamVjdFByb3RvLCBrZXkpIDogdHJ1ZSkpIHJlc3VsdC5wdXNoKEFsbFN5bWJvbHNba2V5XSk7XG4gIH0gcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8vIDE5LjQuMS4xIFN5bWJvbChbZGVzY3JpcHRpb25dKVxuaWYgKCFVU0VfTkFUSVZFKSB7XG4gICRTeW1ib2wgPSBmdW5jdGlvbiBTeW1ib2woKSB7XG4gICAgaWYgKHRoaXMgaW5zdGFuY2VvZiAkU3ltYm9sKSB0aHJvdyBUeXBlRXJyb3IoJ1N5bWJvbCBpcyBub3QgYSBjb25zdHJ1Y3RvciEnKTtcbiAgICB2YXIgdGFnID0gdWlkKGFyZ3VtZW50cy5sZW5ndGggPiAwID8gYXJndW1lbnRzWzBdIDogdW5kZWZpbmVkKTtcbiAgICB2YXIgJHNldCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgaWYgKHRoaXMgPT09IE9iamVjdFByb3RvKSAkc2V0LmNhbGwoT1BTeW1ib2xzLCB2YWx1ZSk7XG4gICAgICBpZiAoaGFzKHRoaXMsIEhJRERFTikgJiYgaGFzKHRoaXNbSElEREVOXSwgdGFnKSkgdGhpc1tISURERU5dW3RhZ10gPSBmYWxzZTtcbiAgICAgIHNldFN5bWJvbERlc2ModGhpcywgdGFnLCBjcmVhdGVEZXNjKDEsIHZhbHVlKSk7XG4gICAgfTtcbiAgICBpZiAoREVTQ1JJUFRPUlMgJiYgc2V0dGVyKSBzZXRTeW1ib2xEZXNjKE9iamVjdFByb3RvLCB0YWcsIHsgY29uZmlndXJhYmxlOiB0cnVlLCBzZXQ6ICRzZXQgfSk7XG4gICAgcmV0dXJuIHdyYXAodGFnKTtcbiAgfTtcbiAgcmVkZWZpbmUoJFN5bWJvbFtQUk9UT1RZUEVdLCAndG9TdHJpbmcnLCBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gdGhpcy5faztcbiAgfSk7XG5cbiAgJEdPUEQuZiA9ICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG4gICREUC5mID0gJGRlZmluZVByb3BlcnR5O1xuICByZXF1aXJlKCcuL19vYmplY3QtZ29wbicpLmYgPSBnT1BORXh0LmYgPSAkZ2V0T3duUHJvcGVydHlOYW1lcztcbiAgcmVxdWlyZSgnLi9fb2JqZWN0LXBpZScpLmYgPSAkcHJvcGVydHlJc0VudW1lcmFibGU7XG4gIHJlcXVpcmUoJy4vX29iamVjdC1nb3BzJykuZiA9ICRnZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG5cbiAgaWYgKERFU0NSSVBUT1JTICYmICFyZXF1aXJlKCcuL19saWJyYXJ5JykpIHtcbiAgICByZWRlZmluZShPYmplY3RQcm90bywgJ3Byb3BlcnR5SXNFbnVtZXJhYmxlJywgJHByb3BlcnR5SXNFbnVtZXJhYmxlLCB0cnVlKTtcbiAgfVxuXG4gIHdrc0V4dC5mID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICByZXR1cm4gd3JhcCh3a3MobmFtZSkpO1xuICB9O1xufVxuXG4kZXhwb3J0KCRleHBvcnQuRyArICRleHBvcnQuVyArICRleHBvcnQuRiAqICFVU0VfTkFUSVZFLCB7IFN5bWJvbDogJFN5bWJvbCB9KTtcblxuZm9yICh2YXIgZXM2U3ltYm9scyA9IChcbiAgLy8gMTkuNC4yLjIsIDE5LjQuMi4zLCAxOS40LjIuNCwgMTkuNC4yLjYsIDE5LjQuMi44LCAxOS40LjIuOSwgMTkuNC4yLjEwLCAxOS40LjIuMTEsIDE5LjQuMi4xMiwgMTkuNC4yLjEzLCAxOS40LjIuMTRcbiAgJ2hhc0luc3RhbmNlLGlzQ29uY2F0U3ByZWFkYWJsZSxpdGVyYXRvcixtYXRjaCxyZXBsYWNlLHNlYXJjaCxzcGVjaWVzLHNwbGl0LHRvUHJpbWl0aXZlLHRvU3RyaW5nVGFnLHVuc2NvcGFibGVzJ1xuKS5zcGxpdCgnLCcpLCBqID0gMDsgZXM2U3ltYm9scy5sZW5ndGggPiBqOyl3a3MoZXM2U3ltYm9sc1tqKytdKTtcblxuZm9yICh2YXIgd2VsbEtub3duU3ltYm9scyA9ICRrZXlzKHdrcy5zdG9yZSksIGsgPSAwOyB3ZWxsS25vd25TeW1ib2xzLmxlbmd0aCA+IGs7KSB3a3NEZWZpbmUod2VsbEtub3duU3ltYm9sc1trKytdKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhVVNFX05BVElWRSwgJ1N5bWJvbCcsIHtcbiAgLy8gMTkuNC4yLjEgU3ltYm9sLmZvcihrZXkpXG4gICdmb3InOiBmdW5jdGlvbiAoa2V5KSB7XG4gICAgcmV0dXJuIGhhcyhTeW1ib2xSZWdpc3RyeSwga2V5ICs9ICcnKVxuICAgICAgPyBTeW1ib2xSZWdpc3RyeVtrZXldXG4gICAgICA6IFN5bWJvbFJlZ2lzdHJ5W2tleV0gPSAkU3ltYm9sKGtleSk7XG4gIH0sXG4gIC8vIDE5LjQuMi41IFN5bWJvbC5rZXlGb3Ioc3ltKVxuICBrZXlGb3I6IGZ1bmN0aW9uIGtleUZvcihzeW0pIHtcbiAgICBpZiAoIWlzU3ltYm9sKHN5bSkpIHRocm93IFR5cGVFcnJvcihzeW0gKyAnIGlzIG5vdCBhIHN5bWJvbCEnKTtcbiAgICBmb3IgKHZhciBrZXkgaW4gU3ltYm9sUmVnaXN0cnkpIGlmIChTeW1ib2xSZWdpc3RyeVtrZXldID09PSBzeW0pIHJldHVybiBrZXk7XG4gIH0sXG4gIHVzZVNldHRlcjogZnVuY3Rpb24gKCkgeyBzZXR0ZXIgPSB0cnVlOyB9LFxuICB1c2VTaW1wbGU6IGZ1bmN0aW9uICgpIHsgc2V0dGVyID0gZmFsc2U7IH1cbn0pO1xuXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICFVU0VfTkFUSVZFLCAnT2JqZWN0Jywge1xuICAvLyAxOS4xLjIuMiBPYmplY3QuY3JlYXRlKE8gWywgUHJvcGVydGllc10pXG4gIGNyZWF0ZTogJGNyZWF0ZSxcbiAgLy8gMTkuMS4yLjQgT2JqZWN0LmRlZmluZVByb3BlcnR5KE8sIFAsIEF0dHJpYnV0ZXMpXG4gIGRlZmluZVByb3BlcnR5OiAkZGVmaW5lUHJvcGVydHksXG4gIC8vIDE5LjEuMi4zIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKE8sIFByb3BlcnRpZXMpXG4gIGRlZmluZVByb3BlcnRpZXM6ICRkZWZpbmVQcm9wZXJ0aWVzLFxuICAvLyAxOS4xLjIuNiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE8sIFApXG4gIGdldE93blByb3BlcnR5RGVzY3JpcHRvcjogJGdldE93blByb3BlcnR5RGVzY3JpcHRvcixcbiAgLy8gMTkuMS4yLjcgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoTylcbiAgZ2V0T3duUHJvcGVydHlOYW1lczogJGdldE93blByb3BlcnR5TmFtZXMsXG4gIC8vIDE5LjEuMi44IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoTylcbiAgZ2V0T3duUHJvcGVydHlTeW1ib2xzOiAkZ2V0T3duUHJvcGVydHlTeW1ib2xzXG59KTtcblxuLy8gMjQuMy4yIEpTT04uc3RyaW5naWZ5KHZhbHVlIFssIHJlcGxhY2VyIFssIHNwYWNlXV0pXG4kSlNPTiAmJiAkZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICghVVNFX05BVElWRSB8fCAkZmFpbHMoZnVuY3Rpb24gKCkge1xuICB2YXIgUyA9ICRTeW1ib2woKTtcbiAgLy8gTVMgRWRnZSBjb252ZXJ0cyBzeW1ib2wgdmFsdWVzIHRvIEpTT04gYXMge31cbiAgLy8gV2ViS2l0IGNvbnZlcnRzIHN5bWJvbCB2YWx1ZXMgdG8gSlNPTiBhcyBudWxsXG4gIC8vIFY4IHRocm93cyBvbiBib3hlZCBzeW1ib2xzXG4gIHJldHVybiBfc3RyaW5naWZ5KFtTXSkgIT0gJ1tudWxsXScgfHwgX3N0cmluZ2lmeSh7IGE6IFMgfSkgIT0gJ3t9JyB8fCBfc3RyaW5naWZ5KE9iamVjdChTKSkgIT0gJ3t9Jztcbn0pKSwgJ0pTT04nLCB7XG4gIHN0cmluZ2lmeTogZnVuY3Rpb24gc3RyaW5naWZ5KGl0KSB7XG4gICAgdmFyIGFyZ3MgPSBbaXRdO1xuICAgIHZhciBpID0gMTtcbiAgICB2YXIgcmVwbGFjZXIsICRyZXBsYWNlcjtcbiAgICB3aGlsZSAoYXJndW1lbnRzLmxlbmd0aCA+IGkpIGFyZ3MucHVzaChhcmd1bWVudHNbaSsrXSk7XG4gICAgJHJlcGxhY2VyID0gcmVwbGFjZXIgPSBhcmdzWzFdO1xuICAgIGlmICghaXNPYmplY3QocmVwbGFjZXIpICYmIGl0ID09PSB1bmRlZmluZWQgfHwgaXNTeW1ib2woaXQpKSByZXR1cm47IC8vIElFOCByZXR1cm5zIHN0cmluZyBvbiB1bmRlZmluZWRcbiAgICBpZiAoIWlzQXJyYXkocmVwbGFjZXIpKSByZXBsYWNlciA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgICBpZiAodHlwZW9mICRyZXBsYWNlciA9PSAnZnVuY3Rpb24nKSB2YWx1ZSA9ICRyZXBsYWNlci5jYWxsKHRoaXMsIGtleSwgdmFsdWUpO1xuICAgICAgaWYgKCFpc1N5bWJvbCh2YWx1ZSkpIHJldHVybiB2YWx1ZTtcbiAgICB9O1xuICAgIGFyZ3NbMV0gPSByZXBsYWNlcjtcbiAgICByZXR1cm4gX3N0cmluZ2lmeS5hcHBseSgkSlNPTiwgYXJncyk7XG4gIH1cbn0pO1xuXG4vLyAxOS40LjMuNCBTeW1ib2wucHJvdG90eXBlW0BAdG9QcmltaXRpdmVdKGhpbnQpXG4kU3ltYm9sW1BST1RPVFlQRV1bVE9fUFJJTUlUSVZFXSB8fCByZXF1aXJlKCcuL19oaWRlJykoJFN5bWJvbFtQUk9UT1RZUEVdLCBUT19QUklNSVRJVkUsICRTeW1ib2xbUFJPVE9UWVBFXS52YWx1ZU9mKTtcbi8vIDE5LjQuMy41IFN5bWJvbC5wcm90b3R5cGVbQEB0b1N0cmluZ1RhZ11cbnNldFRvU3RyaW5nVGFnKCRTeW1ib2wsICdTeW1ib2wnKTtcbi8vIDIwLjIuMS45IE1hdGhbQEB0b1N0cmluZ1RhZ11cbnNldFRvU3RyaW5nVGFnKE1hdGgsICdNYXRoJywgdHJ1ZSk7XG4vLyAyNC4zLjMgSlNPTltAQHRvU3RyaW5nVGFnXVxuc2V0VG9TdHJpbmdUYWcoZ2xvYmFsLkpTT04sICdKU09OJywgdHJ1ZSk7XG4iLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzNi5zeW1ib2wnKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9fY29yZScpLk9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjb3JlLWpzL2xpYnJhcnkvZm4vb2JqZWN0L2dldC1vd24tcHJvcGVydHktc3ltYm9sc1wiKTsiLCIvLyAxOS4xLjIuMTQgT2JqZWN0LmtleXMoTylcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpO1xudmFyICRrZXlzID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMnKTtcblxucmVxdWlyZSgnLi9fb2JqZWN0LXNhcCcpKCdrZXlzJywgZnVuY3Rpb24gKCkge1xuICByZXR1cm4gZnVuY3Rpb24ga2V5cyhpdCkge1xuICAgIHJldHVybiAka2V5cyh0b09iamVjdChpdCkpO1xuICB9O1xufSk7XG4iLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzNi5vYmplY3Qua2V5cycpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi8uLi9tb2R1bGVzL19jb3JlJykuT2JqZWN0LmtleXM7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjb3JlLWpzL2xpYnJhcnkvZm4vb2JqZWN0L2tleXNcIik7IiwidmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbi8vIDE5LjEuMi40IC8gMTUuMi4zLjYgT2JqZWN0LmRlZmluZVByb3BlcnR5KE8sIFAsIEF0dHJpYnV0ZXMpXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICFyZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpLCAnT2JqZWN0JywgeyBkZWZpbmVQcm9wZXJ0eTogcmVxdWlyZSgnLi9fb2JqZWN0LWRwJykuZiB9KTtcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXM2Lm9iamVjdC5kZWZpbmUtcHJvcGVydHknKTtcbnZhciAkT2JqZWN0ID0gcmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9fY29yZScpLk9iamVjdDtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkoaXQsIGtleSwgZGVzYykge1xuICByZXR1cm4gJE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpdCwga2V5LCBkZXNjKTtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjb3JlLWpzL2xpYnJhcnkvZm4vb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTsiLCJ2YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCIuLi9jb3JlLWpzL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHtcbiAgaWYgKGtleSBpbiBvYmopIHtcbiAgICBfT2JqZWN0JGRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7XG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IHRydWVcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBvYmpba2V5XSA9IHZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIG9iajtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfZGVmaW5lUHJvcGVydHk7IiwidmFyIF9PYmplY3QkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZShcIi4uL2NvcmUtanMvb2JqZWN0L2dldC1vd24tcHJvcGVydHktZGVzY3JpcHRvclwiKTtcblxudmFyIF9PYmplY3QkZ2V0T3duUHJvcGVydHlTeW1ib2xzID0gcmVxdWlyZShcIi4uL2NvcmUtanMvb2JqZWN0L2dldC1vd24tcHJvcGVydHktc3ltYm9sc1wiKTtcblxudmFyIF9PYmplY3Qka2V5cyA9IHJlcXVpcmUoXCIuLi9jb3JlLWpzL29iamVjdC9rZXlzXCIpO1xuXG52YXIgZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiLi9kZWZpbmVQcm9wZXJ0eVwiKTtcblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldICE9IG51bGwgPyBhcmd1bWVudHNbaV0gOiB7fTtcblxuICAgIHZhciBvd25LZXlzID0gX09iamVjdCRrZXlzKHNvdXJjZSk7XG5cbiAgICBpZiAodHlwZW9mIF9PYmplY3QkZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBvd25LZXlzID0gb3duS2V5cy5jb25jYXQoX09iamVjdCRnZXRPd25Qcm9wZXJ0eVN5bWJvbHMoc291cmNlKS5maWx0ZXIoZnVuY3Rpb24gKHN5bSkge1xuICAgICAgICByZXR1cm4gX09iamVjdCRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBzeW0pLmVudW1lcmFibGU7XG4gICAgICB9KSk7XG4gICAgfVxuXG4gICAgb3duS2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIGRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9vYmplY3RTcHJlYWQ7IiwiZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3Rvcikge1xuICBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfY2xhc3NDYWxsQ2hlY2s7IiwiLy8gV29ya3Mgd2l0aCBfX3Byb3RvX18gb25seS4gT2xkIHY4IGNhbid0IHdvcmsgd2l0aCBudWxsIHByb3RvIG9iamVjdHMuXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1wcm90byAqL1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBjaGVjayA9IGZ1bmN0aW9uIChPLCBwcm90bykge1xuICBhbk9iamVjdChPKTtcbiAgaWYgKCFpc09iamVjdChwcm90bykgJiYgcHJvdG8gIT09IG51bGwpIHRocm93IFR5cGVFcnJvcihwcm90byArIFwiOiBjYW4ndCBzZXQgYXMgcHJvdG90eXBlIVwiKTtcbn07XG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgc2V0OiBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgKCdfX3Byb3RvX18nIGluIHt9ID8gLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICAgIGZ1bmN0aW9uICh0ZXN0LCBidWdneSwgc2V0KSB7XG4gICAgICB0cnkge1xuICAgICAgICBzZXQgPSByZXF1aXJlKCcuL19jdHgnKShGdW5jdGlvbi5jYWxsLCByZXF1aXJlKCcuL19vYmplY3QtZ29wZCcpLmYoT2JqZWN0LnByb3RvdHlwZSwgJ19fcHJvdG9fXycpLnNldCwgMik7XG4gICAgICAgIHNldCh0ZXN0LCBbXSk7XG4gICAgICAgIGJ1Z2d5ID0gISh0ZXN0IGluc3RhbmNlb2YgQXJyYXkpO1xuICAgICAgfSBjYXRjaCAoZSkgeyBidWdneSA9IHRydWU7IH1cbiAgICAgIHJldHVybiBmdW5jdGlvbiBzZXRQcm90b3R5cGVPZihPLCBwcm90bykge1xuICAgICAgICBjaGVjayhPLCBwcm90byk7XG4gICAgICAgIGlmIChidWdneSkgTy5fX3Byb3RvX18gPSBwcm90bztcbiAgICAgICAgZWxzZSBzZXQoTywgcHJvdG8pO1xuICAgICAgICByZXR1cm4gTztcbiAgICAgIH07XG4gICAgfSh7fSwgZmFsc2UpIDogdW5kZWZpbmVkKSxcbiAgY2hlY2s6IGNoZWNrXG59O1xuIiwiLy8gMTkuMS4zLjE5IE9iamVjdC5zZXRQcm90b3R5cGVPZihPLCBwcm90bylcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG4kZXhwb3J0KCRleHBvcnQuUywgJ09iamVjdCcsIHsgc2V0UHJvdG90eXBlT2Y6IHJlcXVpcmUoJy4vX3NldC1wcm90bycpLnNldCB9KTtcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXM2Lm9iamVjdC5zZXQtcHJvdG90eXBlLW9mJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uLy4uL21vZHVsZXMvX2NvcmUnKS5PYmplY3Quc2V0UHJvdG90eXBlT2Y7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjb3JlLWpzL2xpYnJhcnkvZm4vb2JqZWN0L3NldC1wcm90b3R5cGUtb2ZcIik7IiwidmFyIF9PYmplY3Qkc2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKFwiLi4vY29yZS1qcy9vYmplY3Qvc2V0LXByb3RvdHlwZS1vZlwiKTtcblxuZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSBfc2V0UHJvdG90eXBlT2YgPSBfT2JqZWN0JHNldFByb3RvdHlwZU9mIHx8IGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7XG4gICAgby5fX3Byb3RvX18gPSBwO1xuICAgIHJldHVybiBvO1xuICB9O1xuXG4gIHJldHVybiBfc2V0UHJvdG90eXBlT2YobywgcCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX3NldFByb3RvdHlwZU9mOyIsInZhciBzZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoXCIuL3NldFByb3RvdHlwZU9mXCIpO1xuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHtcbiAgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvblwiKTtcbiAgfVxuXG4gIHNldFByb3RvdHlwZU9mKHN1YkNsYXNzLnByb3RvdHlwZSwgc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSk7XG4gIGlmIChzdXBlckNsYXNzKSBzZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2luaGVyaXRzOyIsInZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIi4uL2NvcmUtanMvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTtcbiAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7XG4gICAgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlO1xuICAgIGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7XG5cbiAgICBfT2JqZWN0JGRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHtcbiAgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7XG4gIGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTtcbiAgcmV0dXJuIENvbnN0cnVjdG9yO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9jcmVhdGVDbGFzczsiLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzNi5zdHJpbmcuaXRlcmF0b3InKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvd2ViLmRvbS5pdGVyYWJsZScpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi8uLi9tb2R1bGVzL193a3MtZXh0JykuZignaXRlcmF0b3InKTtcbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMvbGlicmFyeS9mbi9zeW1ib2wvaXRlcmF0b3JcIik7IiwicmVxdWlyZSgnLi9fd2tzLWRlZmluZScpKCdhc3luY0l0ZXJhdG9yJyk7XG4iLCJyZXF1aXJlKCcuL193a3MtZGVmaW5lJykoJ29ic2VydmFibGUnKTtcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXM2LnN5bWJvbCcpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lczYub2JqZWN0LnRvLXN0cmluZycpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lczcuc3ltYm9sLmFzeW5jLWl0ZXJhdG9yJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzNy5zeW1ib2wub2JzZXJ2YWJsZScpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi8uLi9tb2R1bGVzL19jb3JlJykuU3ltYm9sO1xuIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY29yZS1qcy9saWJyYXJ5L2ZuL3N5bWJvbFwiKTsiLCJ2YXIgX1N5bWJvbCRpdGVyYXRvciA9IHJlcXVpcmUoXCIuLi9jb3JlLWpzL3N5bWJvbC9pdGVyYXRvclwiKTtcblxudmFyIF9TeW1ib2wgPSByZXF1aXJlKFwiLi4vY29yZS1qcy9zeW1ib2xcIik7XG5cbmZ1bmN0aW9uIF90eXBlb2YyKG9iaikgeyBpZiAodHlwZW9mIF9TeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgX1N5bWJvbCRpdGVyYXRvciA9PT0gXCJzeW1ib2xcIikgeyBfdHlwZW9mMiA9IGZ1bmN0aW9uIF90eXBlb2YyKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfTsgfSBlbHNlIHsgX3R5cGVvZjIgPSBmdW5jdGlvbiBfdHlwZW9mMihvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgX1N5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gX1N5bWJvbCAmJiBvYmogIT09IF9TeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07IH0gcmV0dXJuIF90eXBlb2YyKG9iaik7IH1cblxuZnVuY3Rpb24gX3R5cGVvZihvYmopIHtcbiAgaWYgKHR5cGVvZiBfU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgX3R5cGVvZjIoX1N5bWJvbCRpdGVyYXRvcikgPT09IFwic3ltYm9sXCIpIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikge1xuICAgICAgcmV0dXJuIF90eXBlb2YyKG9iaik7XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikge1xuICAgICAgcmV0dXJuIG9iaiAmJiB0eXBlb2YgX1N5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gX1N5bWJvbCAmJiBvYmogIT09IF9TeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IF90eXBlb2YyKG9iaik7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBfdHlwZW9mKG9iaik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX3R5cGVvZjsiLCJmdW5jdGlvbiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpIHtcbiAgaWYgKHNlbGYgPT09IHZvaWQgMCkge1xuICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTtcbiAgfVxuXG4gIHJldHVybiBzZWxmO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQ7IiwidmFyIF90eXBlb2YgPSByZXF1aXJlKFwiLi4vaGVscGVycy90eXBlb2ZcIik7XG5cbnZhciBhc3NlcnRUaGlzSW5pdGlhbGl6ZWQgPSByZXF1aXJlKFwiLi9hc3NlcnRUaGlzSW5pdGlhbGl6ZWRcIik7XG5cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHtcbiAgaWYgKGNhbGwgJiYgKF90eXBlb2YoY2FsbCkgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikpIHtcbiAgICByZXR1cm4gY2FsbDtcbiAgfVxuXG4gIHJldHVybiBhc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm47IiwiLy8gMTkuMS4yLjkgT2JqZWN0LmdldFByb3RvdHlwZU9mKE8pXG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKTtcbnZhciAkZ2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuL19vYmplY3QtZ3BvJyk7XG5cbnJlcXVpcmUoJy4vX29iamVjdC1zYXAnKSgnZ2V0UHJvdG90eXBlT2YnLCBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBmdW5jdGlvbiBnZXRQcm90b3R5cGVPZihpdCkge1xuICAgIHJldHVybiAkZ2V0UHJvdG90eXBlT2YodG9PYmplY3QoaXQpKTtcbiAgfTtcbn0pO1xuIiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lczYub2JqZWN0LmdldC1wcm90b3R5cGUtb2YnKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9fY29yZScpLk9iamVjdC5nZXRQcm90b3R5cGVPZjtcbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMvbGlicmFyeS9mbi9vYmplY3QvZ2V0LXByb3RvdHlwZS1vZlwiKTsiLCJ2YXIgX09iamVjdCRnZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoXCIuLi9jb3JlLWpzL29iamVjdC9nZXQtcHJvdG90eXBlLW9mXCIpO1xuXG5mdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2Yobykge1xuICBtb2R1bGUuZXhwb3J0cyA9IF9nZXRQcm90b3R5cGVPZiA9IF9PYmplY3QkZ2V0UHJvdG90eXBlT2YgfHwgZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHtcbiAgICByZXR1cm4gby5fX3Byb3RvX187XG4gIH07XG5cbiAgcmV0dXJuIF9nZXRQcm90b3R5cGVPZihvKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfZ2V0UHJvdG90eXBlT2Y7IiwiZXhwb3J0IGNvbnN0IGV4dGVuZCA9IChvYmplY3QsIC4uLmV4dGVuc2lvbnMpID0+IHsgLy8gJC5leHRlbmQgYWx0ZXJuYXRpdmUsIC4uLiBpcyB0aGUgc3ByZWFkIG9wZXJhdG9yLlxuICBmb3IgKGNvbnN0IGV4dGVuc2lvbiBvZiBleHRlbnNpb25zKSB7XG4gICAgLy8gY29uc29sZS5sb2coZXh0ZW5zaW9uKTtcbiAgICAvLyBjb25zb2xlLmxvZyh0eXBlb2YgZXh0ZW5zaW9uKTtcblxuICAgIGlmICghZXh0ZW5zaW9uKVxuICAgICAgY29udGludWU7IC8vIElnbm9yZSBudWxsIGFuZCB1bmRlZmluZWQgb2JqZWN0cyBhbmQgcGFyYW1ldGVycy5cblxuICAgIGZvciAoY29uc3QgcHJvcCBvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhleHRlbnNpb24pKSB7IC8vIERvIG5vdCB0cmF2ZXJzZSB0aGUgcHJvdG90eXBlIGNoYWluLlxuICAgICAgaWYgKG9iamVjdFtwcm9wXSAhPT0gdW5kZWZpbmVkICYmIGV4dGVuc2lvbltwcm9wXVxuICAgICAgICAmJiBvYmplY3RbcHJvcF0udG9TdHJpbmcoKSA9PT0gJ1tvYmplY3QgT2JqZWN0XSdcbiAgICAgICAgJiYgZXh0ZW5zaW9uW3Byb3BdLnRvU3RyaW5nKCkgPT09ICdbb2JqZWN0IE9iamVjdF0nKSB7XG4gICAgICAgIC8vIEdvZXMgZGVlcCBvbmx5IGlmIG9iamVjdFtwcm9wXSBhbmQgZXh0ZW5zaW9uW3Byb3BdIGFyZSBib3RoIG9iamVjdHMgIVxuICAgICAgICBpZiAob2JqZWN0W3Byb3BdLmNvbnN0cnVjdG9yID09PSBPYmplY3QpIGV4dGVuZChvYmplY3RbcHJvcF0sIGV4dGVuc2lvbltwcm9wXSk7XG4gICAgICB9IGVsc2VcbiAgICAgICAgb2JqZWN0W3Byb3BdID0gdHlwZW9mIG9iamVjdFtwcm9wXSA9PT0gJ3VuZGVmaW5lZCcgPyBleHRlbnNpb25bcHJvcF0gOiBvYmplY3RbcHJvcF07XG5cbiAgICAgIGlmICh0eXBlb2Ygb2JqZWN0W3Byb3BdID09PSAndW5kZWZpbmVkJyAmJiBBcnJheS5pc0FycmF5KGV4dGVuc2lvbltwcm9wXSkpIG9iamVjdFtwcm9wXSA9IGV4dGVuc2lvbltwcm9wXS5zbGljZSgpOyAvLyBBZGQgdmFsdWVzIHRoYXQgZG8gbm90IGFscmVhZHkgZXhpc3QuXG4gICAgICBlbHNlIGlmICh0eXBlb2Ygb2JqZWN0W3Byb3BdID09PSAndW5kZWZpbmVkJyAmJiBBcnJheS5pc0FycmF5KGV4dGVuc2lvbltwcm9wXSkpIG9iamVjdFtwcm9wXSA9IGV4dGVuc2lvbltwcm9wXTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gb2JqZWN0O1xufTtcbiIsImV4cG9ydCBjb25zdCBpbnN0cnVjdCA9IChhcnJheSwgaW5zdEFycmF5KSA9PiB7XG4gIGNvbnN0IHRlbXBPYmplY3QgPSB7fTtcblxuICBmb3IgKGxldCBpID0gMCwgbWF4ID0gaW5zdEFycmF5Lmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7XG4gICAgY29uc3QgZ3VpZGUgPSBpbnN0QXJyYXlbaV07XG5cbiAgICB0ZW1wT2JqZWN0W2d1aWRlXSA9IGFycmF5W2ldO1xuICB9XG5cbiAgcmV0dXJuIHRlbXBPYmplY3Q7XG59O1xuXG5leHBvcnQgY29uc3QgdHJhbnNmb3JtRGF0YSA9IChvYmplY3QsIGluc3RydWN0aW9ucykgPT4ge1xuICBmb3IgKGNvbnN0IGtleSBpbiBpbnN0cnVjdGlvbnMpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShvYmplY3Rba2V5XSkpXG4gICAgICBvYmplY3Rba2V5XSA9IGluc3RydWN0KG9iamVjdFtrZXldLCBpbnN0cnVjdGlvbnNba2V5XSk7XG4gICAgZWxzZSBpZiAob2JqZWN0W2tleV0gaW5zdGFuY2VvZiBPYmplY3QgJiYgIShBcnJheS5pc0FycmF5KGluc3RydWN0aW9uc1trZXldKSkpXG4gICAgICBvYmplY3Rba2V5XSA9IHRyYW5zZm9ybURhdGEob2JqZWN0W2tleV0sIGluc3RydWN0aW9uc1trZXldKTtcbiAgfVxuXG4gIHJldHVybiBvYmplY3Q7XG59O1xuXG5leHBvcnQgY29uc3QgdG9BcnJheSA9IChvYmplY3QsIGluc3RydWN0aW9uKSA9PiB7XG4gIGNvbnN0IHRlbXBBcnJheSA9IFtdO1xuXG4gIGZvciAobGV0IGkgPSAwLCBtYXggPSBpbnN0cnVjdGlvbi5sZW5ndGg7IGkgPCBtYXg7IGkrKykge1xuICAgIGNvbnN0IGd1aWRlID0gaW5zdHJ1Y3Rpb25baV07XG5cbiAgICB0ZW1wQXJyYXlbaV0gPSBvYmplY3RbZ3VpZGVdO1xuICB9XG5cbiAgcmV0dXJuIHRlbXBBcnJheTtcbn07XG4iLCIvLyBQb2x5ZmlsbHNcblxuaWYgKCBOdW1iZXIuRVBTSUxPTiA9PT0gdW5kZWZpbmVkICkge1xuXG5cdE51bWJlci5FUFNJTE9OID0gTWF0aC5wb3coIDIsIC0gNTIgKTtcblxufVxuXG5pZiAoIE51bWJlci5pc0ludGVnZXIgPT09IHVuZGVmaW5lZCApIHtcblxuXHQvLyBNaXNzaW5nIGluIElFXG5cdC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL051bWJlci9pc0ludGVnZXJcblxuXHROdW1iZXIuaXNJbnRlZ2VyID0gZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIGlzRmluaXRlKCB2YWx1ZSApICYmIE1hdGguZmxvb3IoIHZhbHVlICkgPT09IHZhbHVlO1xuXG5cdH07XG5cbn1cblxuLy9cblxuaWYgKCBNYXRoLnNpZ24gPT09IHVuZGVmaW5lZCApIHtcblxuXHQvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9NYXRoL3NpZ25cblxuXHRNYXRoLnNpZ24gPSBmdW5jdGlvbiAoIHggKSB7XG5cblx0XHRyZXR1cm4gKCB4IDwgMCApID8gLSAxIDogKCB4ID4gMCApID8gMSA6ICsgeDtcblxuXHR9O1xuXG59XG5cbmlmICggJ25hbWUnIGluIEZ1bmN0aW9uLnByb3RvdHlwZSA9PT0gZmFsc2UgKSB7XG5cblx0Ly8gTWlzc2luZyBpbiBJRVxuXHQvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9GdW5jdGlvbi9uYW1lXG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KCBGdW5jdGlvbi5wcm90b3R5cGUsICduYW1lJywge1xuXG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLnRvU3RyaW5nKCkubWF0Y2goIC9eXFxzKmZ1bmN0aW9uXFxzKihbXlxcKFxcc10qKS8gKVsgMSBdO1xuXG5cdFx0fVxuXG5cdH0gKTtcblxufVxuXG5pZiAoIE9iamVjdC5hc3NpZ24gPT09IHVuZGVmaW5lZCApIHtcblxuXHQvLyBNaXNzaW5nIGluIElFXG5cdC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL09iamVjdC9hc3NpZ25cblxuXHQoIGZ1bmN0aW9uICgpIHtcblxuXHRcdE9iamVjdC5hc3NpZ24gPSBmdW5jdGlvbiAoIHRhcmdldCApIHtcblxuXHRcdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCB8fCB0YXJnZXQgPT09IG51bGwgKSB7XG5cblx0XHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvciggJ0Nhbm5vdCBjb252ZXJ0IHVuZGVmaW5lZCBvciBudWxsIHRvIG9iamVjdCcgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgb3V0cHV0ID0gT2JqZWN0KCB0YXJnZXQgKTtcblxuXHRcdFx0Zm9yICggdmFyIGluZGV4ID0gMTsgaW5kZXggPCBhcmd1bWVudHMubGVuZ3RoOyBpbmRleCArKyApIHtcblxuXHRcdFx0XHR2YXIgc291cmNlID0gYXJndW1lbnRzWyBpbmRleCBdO1xuXG5cdFx0XHRcdGlmICggc291cmNlICE9PSB1bmRlZmluZWQgJiYgc291cmNlICE9PSBudWxsICkge1xuXG5cdFx0XHRcdFx0Zm9yICggdmFyIG5leHRLZXkgaW4gc291cmNlICkge1xuXG5cdFx0XHRcdFx0XHRpZiAoIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCggc291cmNlLCBuZXh0S2V5ICkgKSB7XG5cblx0XHRcdFx0XHRcdFx0b3V0cHV0WyBuZXh0S2V5IF0gPSBzb3VyY2VbIG5leHRLZXkgXTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gb3V0cHV0O1xuXG5cdFx0fTtcblxuXHR9ICkoKTtcblxufVxuXG4vKipcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9tcmRvb2IvZXZlbnRkaXNwYXRjaGVyLmpzL1xuICovXG5cbmZ1bmN0aW9uIEV2ZW50RGlzcGF0Y2hlcigpIHt9XG5cbk9iamVjdC5hc3NpZ24oIEV2ZW50RGlzcGF0Y2hlci5wcm90b3R5cGUsIHtcblxuXHRhZGRFdmVudExpc3RlbmVyOiBmdW5jdGlvbiAoIHR5cGUsIGxpc3RlbmVyICkge1xuXG5cdFx0aWYgKCB0aGlzLl9saXN0ZW5lcnMgPT09IHVuZGVmaW5lZCApIHRoaXMuX2xpc3RlbmVycyA9IHt9O1xuXG5cdFx0dmFyIGxpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVycztcblxuXHRcdGlmICggbGlzdGVuZXJzWyB0eXBlIF0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0bGlzdGVuZXJzWyB0eXBlIF0gPSBbXTtcblxuXHRcdH1cblxuXHRcdGlmICggbGlzdGVuZXJzWyB0eXBlIF0uaW5kZXhPZiggbGlzdGVuZXIgKSA9PT0gLSAxICkge1xuXG5cdFx0XHRsaXN0ZW5lcnNbIHR5cGUgXS5wdXNoKCBsaXN0ZW5lciApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0aGFzRXZlbnRMaXN0ZW5lcjogZnVuY3Rpb24gKCB0eXBlLCBsaXN0ZW5lciApIHtcblxuXHRcdGlmICggdGhpcy5fbGlzdGVuZXJzID09PSB1bmRlZmluZWQgKSByZXR1cm4gZmFsc2U7XG5cblx0XHR2YXIgbGlzdGVuZXJzID0gdGhpcy5fbGlzdGVuZXJzO1xuXG5cdFx0cmV0dXJuIGxpc3RlbmVyc1sgdHlwZSBdICE9PSB1bmRlZmluZWQgJiYgbGlzdGVuZXJzWyB0eXBlIF0uaW5kZXhPZiggbGlzdGVuZXIgKSAhPT0gLSAxO1xuXG5cdH0sXG5cblx0cmVtb3ZlRXZlbnRMaXN0ZW5lcjogZnVuY3Rpb24gKCB0eXBlLCBsaXN0ZW5lciApIHtcblxuXHRcdGlmICggdGhpcy5fbGlzdGVuZXJzID09PSB1bmRlZmluZWQgKSByZXR1cm47XG5cblx0XHR2YXIgbGlzdGVuZXJzID0gdGhpcy5fbGlzdGVuZXJzO1xuXHRcdHZhciBsaXN0ZW5lckFycmF5ID0gbGlzdGVuZXJzWyB0eXBlIF07XG5cblx0XHRpZiAoIGxpc3RlbmVyQXJyYXkgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dmFyIGluZGV4ID0gbGlzdGVuZXJBcnJheS5pbmRleE9mKCBsaXN0ZW5lciApO1xuXG5cdFx0XHRpZiAoIGluZGV4ICE9PSAtIDEgKSB7XG5cblx0XHRcdFx0bGlzdGVuZXJBcnJheS5zcGxpY2UoIGluZGV4LCAxICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9LFxuXG5cdGRpc3BhdGNoRXZlbnQ6IGZ1bmN0aW9uICggZXZlbnQgKSB7XG5cblx0XHRpZiAoIHRoaXMuX2xpc3RlbmVycyA9PT0gdW5kZWZpbmVkICkgcmV0dXJuO1xuXG5cdFx0dmFyIGxpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVycztcblx0XHR2YXIgbGlzdGVuZXJBcnJheSA9IGxpc3RlbmVyc1sgZXZlbnQudHlwZSBdO1xuXG5cdFx0aWYgKCBsaXN0ZW5lckFycmF5ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGV2ZW50LnRhcmdldCA9IHRoaXM7XG5cblx0XHRcdHZhciBhcnJheSA9IGxpc3RlbmVyQXJyYXkuc2xpY2UoIDAgKTtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gYXJyYXkubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRhcnJheVsgaSBdLmNhbGwoIHRoaXMsIGV2ZW50ICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9XG5cbn0gKTtcblxudmFyIFJFVklTSU9OID0gJzkyJztcbnZhciBNT1VTRSA9IHsgTEVGVDogMCwgTUlERExFOiAxLCBSSUdIVDogMiB9O1xudmFyIEN1bGxGYWNlTm9uZSA9IDA7XG52YXIgQ3VsbEZhY2VCYWNrID0gMTtcbnZhciBDdWxsRmFjZUZyb250ID0gMjtcbnZhciBDdWxsRmFjZUZyb250QmFjayA9IDM7XG52YXIgRnJvbnRGYWNlRGlyZWN0aW9uQ1cgPSAwO1xudmFyIEZyb250RmFjZURpcmVjdGlvbkNDVyA9IDE7XG52YXIgQmFzaWNTaGFkb3dNYXAgPSAwO1xudmFyIFBDRlNoYWRvd01hcCA9IDE7XG52YXIgUENGU29mdFNoYWRvd01hcCA9IDI7XG52YXIgRnJvbnRTaWRlID0gMDtcbnZhciBCYWNrU2lkZSA9IDE7XG52YXIgRG91YmxlU2lkZSA9IDI7XG52YXIgRmxhdFNoYWRpbmcgPSAxO1xudmFyIFNtb290aFNoYWRpbmcgPSAyO1xudmFyIE5vQ29sb3JzID0gMDtcbnZhciBGYWNlQ29sb3JzID0gMTtcbnZhciBWZXJ0ZXhDb2xvcnMgPSAyO1xudmFyIE5vQmxlbmRpbmcgPSAwO1xudmFyIE5vcm1hbEJsZW5kaW5nID0gMTtcbnZhciBBZGRpdGl2ZUJsZW5kaW5nID0gMjtcbnZhciBTdWJ0cmFjdGl2ZUJsZW5kaW5nID0gMztcbnZhciBNdWx0aXBseUJsZW5kaW5nID0gNDtcbnZhciBDdXN0b21CbGVuZGluZyA9IDU7XG52YXIgQWRkRXF1YXRpb24gPSAxMDA7XG52YXIgU3VidHJhY3RFcXVhdGlvbiA9IDEwMTtcbnZhciBSZXZlcnNlU3VidHJhY3RFcXVhdGlvbiA9IDEwMjtcbnZhciBNaW5FcXVhdGlvbiA9IDEwMztcbnZhciBNYXhFcXVhdGlvbiA9IDEwNDtcbnZhciBaZXJvRmFjdG9yID0gMjAwO1xudmFyIE9uZUZhY3RvciA9IDIwMTtcbnZhciBTcmNDb2xvckZhY3RvciA9IDIwMjtcbnZhciBPbmVNaW51c1NyY0NvbG9yRmFjdG9yID0gMjAzO1xudmFyIFNyY0FscGhhRmFjdG9yID0gMjA0O1xudmFyIE9uZU1pbnVzU3JjQWxwaGFGYWN0b3IgPSAyMDU7XG52YXIgRHN0QWxwaGFGYWN0b3IgPSAyMDY7XG52YXIgT25lTWludXNEc3RBbHBoYUZhY3RvciA9IDIwNztcbnZhciBEc3RDb2xvckZhY3RvciA9IDIwODtcbnZhciBPbmVNaW51c0RzdENvbG9yRmFjdG9yID0gMjA5O1xudmFyIFNyY0FscGhhU2F0dXJhdGVGYWN0b3IgPSAyMTA7XG52YXIgTmV2ZXJEZXB0aCA9IDA7XG52YXIgQWx3YXlzRGVwdGggPSAxO1xudmFyIExlc3NEZXB0aCA9IDI7XG52YXIgTGVzc0VxdWFsRGVwdGggPSAzO1xudmFyIEVxdWFsRGVwdGggPSA0O1xudmFyIEdyZWF0ZXJFcXVhbERlcHRoID0gNTtcbnZhciBHcmVhdGVyRGVwdGggPSA2O1xudmFyIE5vdEVxdWFsRGVwdGggPSA3O1xudmFyIE11bHRpcGx5T3BlcmF0aW9uID0gMDtcbnZhciBNaXhPcGVyYXRpb24gPSAxO1xudmFyIEFkZE9wZXJhdGlvbiA9IDI7XG52YXIgTm9Ub25lTWFwcGluZyA9IDA7XG52YXIgTGluZWFyVG9uZU1hcHBpbmcgPSAxO1xudmFyIFJlaW5oYXJkVG9uZU1hcHBpbmcgPSAyO1xudmFyIFVuY2hhcnRlZDJUb25lTWFwcGluZyA9IDM7XG52YXIgQ2luZW9uVG9uZU1hcHBpbmcgPSA0O1xudmFyIFVWTWFwcGluZyA9IDMwMDtcbnZhciBDdWJlUmVmbGVjdGlvbk1hcHBpbmcgPSAzMDE7XG52YXIgQ3ViZVJlZnJhY3Rpb25NYXBwaW5nID0gMzAyO1xudmFyIEVxdWlyZWN0YW5ndWxhclJlZmxlY3Rpb25NYXBwaW5nID0gMzAzO1xudmFyIEVxdWlyZWN0YW5ndWxhclJlZnJhY3Rpb25NYXBwaW5nID0gMzA0O1xudmFyIFNwaGVyaWNhbFJlZmxlY3Rpb25NYXBwaW5nID0gMzA1O1xudmFyIEN1YmVVVlJlZmxlY3Rpb25NYXBwaW5nID0gMzA2O1xudmFyIEN1YmVVVlJlZnJhY3Rpb25NYXBwaW5nID0gMzA3O1xudmFyIFJlcGVhdFdyYXBwaW5nID0gMTAwMDtcbnZhciBDbGFtcFRvRWRnZVdyYXBwaW5nID0gMTAwMTtcbnZhciBNaXJyb3JlZFJlcGVhdFdyYXBwaW5nID0gMTAwMjtcbnZhciBOZWFyZXN0RmlsdGVyID0gMTAwMztcbnZhciBOZWFyZXN0TWlwTWFwTmVhcmVzdEZpbHRlciA9IDEwMDQ7XG52YXIgTmVhcmVzdE1pcE1hcExpbmVhckZpbHRlciA9IDEwMDU7XG52YXIgTGluZWFyRmlsdGVyID0gMTAwNjtcbnZhciBMaW5lYXJNaXBNYXBOZWFyZXN0RmlsdGVyID0gMTAwNztcbnZhciBMaW5lYXJNaXBNYXBMaW5lYXJGaWx0ZXIgPSAxMDA4O1xudmFyIFVuc2lnbmVkQnl0ZVR5cGUgPSAxMDA5O1xudmFyIEJ5dGVUeXBlID0gMTAxMDtcbnZhciBTaG9ydFR5cGUgPSAxMDExO1xudmFyIFVuc2lnbmVkU2hvcnRUeXBlID0gMTAxMjtcbnZhciBJbnRUeXBlID0gMTAxMztcbnZhciBVbnNpZ25lZEludFR5cGUgPSAxMDE0O1xudmFyIEZsb2F0VHlwZSA9IDEwMTU7XG52YXIgSGFsZkZsb2F0VHlwZSA9IDEwMTY7XG52YXIgVW5zaWduZWRTaG9ydDQ0NDRUeXBlID0gMTAxNztcbnZhciBVbnNpZ25lZFNob3J0NTU1MVR5cGUgPSAxMDE4O1xudmFyIFVuc2lnbmVkU2hvcnQ1NjVUeXBlID0gMTAxOTtcbnZhciBVbnNpZ25lZEludDI0OFR5cGUgPSAxMDIwO1xudmFyIEFscGhhRm9ybWF0ID0gMTAyMTtcbnZhciBSR0JGb3JtYXQgPSAxMDIyO1xudmFyIFJHQkFGb3JtYXQgPSAxMDIzO1xudmFyIEx1bWluYW5jZUZvcm1hdCA9IDEwMjQ7XG52YXIgTHVtaW5hbmNlQWxwaGFGb3JtYXQgPSAxMDI1O1xudmFyIFJHQkVGb3JtYXQgPSBSR0JBRm9ybWF0O1xudmFyIERlcHRoRm9ybWF0ID0gMTAyNjtcbnZhciBEZXB0aFN0ZW5jaWxGb3JtYXQgPSAxMDI3O1xudmFyIFJHQl9TM1RDX0RYVDFfRm9ybWF0ID0gMzM3NzY7XG52YXIgUkdCQV9TM1RDX0RYVDFfRm9ybWF0ID0gMzM3Nzc7XG52YXIgUkdCQV9TM1RDX0RYVDNfRm9ybWF0ID0gMzM3Nzg7XG52YXIgUkdCQV9TM1RDX0RYVDVfRm9ybWF0ID0gMzM3Nzk7XG52YXIgUkdCX1BWUlRDXzRCUFBWMV9Gb3JtYXQgPSAzNTg0MDtcbnZhciBSR0JfUFZSVENfMkJQUFYxX0Zvcm1hdCA9IDM1ODQxO1xudmFyIFJHQkFfUFZSVENfNEJQUFYxX0Zvcm1hdCA9IDM1ODQyO1xudmFyIFJHQkFfUFZSVENfMkJQUFYxX0Zvcm1hdCA9IDM1ODQzO1xudmFyIFJHQl9FVEMxX0Zvcm1hdCA9IDM2MTk2O1xudmFyIFJHQkFfQVNUQ180eDRfRm9ybWF0ID0gMzc4MDg7XG52YXIgUkdCQV9BU1RDXzV4NF9Gb3JtYXQgPSAzNzgwOTtcbnZhciBSR0JBX0FTVENfNXg1X0Zvcm1hdCA9IDM3ODEwO1xudmFyIFJHQkFfQVNUQ182eDVfRm9ybWF0ID0gMzc4MTE7XG52YXIgUkdCQV9BU1RDXzZ4Nl9Gb3JtYXQgPSAzNzgxMjtcbnZhciBSR0JBX0FTVENfOHg1X0Zvcm1hdCA9IDM3ODEzO1xudmFyIFJHQkFfQVNUQ184eDZfRm9ybWF0ID0gMzc4MTQ7XG52YXIgUkdCQV9BU1RDXzh4OF9Gb3JtYXQgPSAzNzgxNTtcbnZhciBSR0JBX0FTVENfMTB4NV9Gb3JtYXQgPSAzNzgxNjtcbnZhciBSR0JBX0FTVENfMTB4Nl9Gb3JtYXQgPSAzNzgxNztcbnZhciBSR0JBX0FTVENfMTB4OF9Gb3JtYXQgPSAzNzgxODtcbnZhciBSR0JBX0FTVENfMTB4MTBfRm9ybWF0ID0gMzc4MTk7XG52YXIgUkdCQV9BU1RDXzEyeDEwX0Zvcm1hdCA9IDM3ODIwO1xudmFyIFJHQkFfQVNUQ18xMngxMl9Gb3JtYXQgPSAzNzgyMTtcbnZhciBMb29wT25jZSA9IDIyMDA7XG52YXIgTG9vcFJlcGVhdCA9IDIyMDE7XG52YXIgTG9vcFBpbmdQb25nID0gMjIwMjtcbnZhciBJbnRlcnBvbGF0ZURpc2NyZXRlID0gMjMwMDtcbnZhciBJbnRlcnBvbGF0ZUxpbmVhciA9IDIzMDE7XG52YXIgSW50ZXJwb2xhdGVTbW9vdGggPSAyMzAyO1xudmFyIFplcm9DdXJ2YXR1cmVFbmRpbmcgPSAyNDAwO1xudmFyIFplcm9TbG9wZUVuZGluZyA9IDI0MDE7XG52YXIgV3JhcEFyb3VuZEVuZGluZyA9IDI0MDI7XG52YXIgVHJpYW5nbGVzRHJhd01vZGUgPSAwO1xudmFyIFRyaWFuZ2xlU3RyaXBEcmF3TW9kZSA9IDE7XG52YXIgVHJpYW5nbGVGYW5EcmF3TW9kZSA9IDI7XG52YXIgTGluZWFyRW5jb2RpbmcgPSAzMDAwO1xudmFyIHNSR0JFbmNvZGluZyA9IDMwMDE7XG52YXIgR2FtbWFFbmNvZGluZyA9IDMwMDc7XG52YXIgUkdCRUVuY29kaW5nID0gMzAwMjtcbnZhciBMb2dMdXZFbmNvZGluZyA9IDMwMDM7XG52YXIgUkdCTTdFbmNvZGluZyA9IDMwMDQ7XG52YXIgUkdCTTE2RW5jb2RpbmcgPSAzMDA1O1xudmFyIFJHQkRFbmNvZGluZyA9IDMwMDY7XG52YXIgQmFzaWNEZXB0aFBhY2tpbmcgPSAzMjAwO1xudmFyIFJHQkFEZXB0aFBhY2tpbmcgPSAzMjAxO1xuXG4vKipcbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbnZhciBfTWF0aCA9IHtcblxuXHRERUcyUkFEOiBNYXRoLlBJIC8gMTgwLFxuXHRSQUQyREVHOiAxODAgLyBNYXRoLlBJLFxuXG5cdGdlbmVyYXRlVVVJRDogKCBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzEwNTAzNC9ob3ctdG8tY3JlYXRlLWEtZ3VpZC11dWlkLWluLWphdmFzY3JpcHQvMjE5NjMxMzYjMjE5NjMxMzZcblxuXHRcdHZhciBsdXQgPSBbXTtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IDI1NjsgaSArKyApIHtcblxuXHRcdFx0bHV0WyBpIF0gPSAoIGkgPCAxNiA/ICcwJyA6ICcnICkgKyAoIGkgKS50b1N0cmluZyggMTYgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBmdW5jdGlvbiBnZW5lcmF0ZVVVSUQoKSB7XG5cblx0XHRcdHZhciBkMCA9IE1hdGgucmFuZG9tKCkgKiAweGZmZmZmZmZmIHwgMDtcblx0XHRcdHZhciBkMSA9IE1hdGgucmFuZG9tKCkgKiAweGZmZmZmZmZmIHwgMDtcblx0XHRcdHZhciBkMiA9IE1hdGgucmFuZG9tKCkgKiAweGZmZmZmZmZmIHwgMDtcblx0XHRcdHZhciBkMyA9IE1hdGgucmFuZG9tKCkgKiAweGZmZmZmZmZmIHwgMDtcblx0XHRcdHZhciB1dWlkID0gbHV0WyBkMCAmIDB4ZmYgXSArIGx1dFsgZDAgPj4gOCAmIDB4ZmYgXSArIGx1dFsgZDAgPj4gMTYgJiAweGZmIF0gKyBsdXRbIGQwID4+IDI0ICYgMHhmZiBdICsgJy0nICtcblx0XHRcdFx0bHV0WyBkMSAmIDB4ZmYgXSArIGx1dFsgZDEgPj4gOCAmIDB4ZmYgXSArICctJyArIGx1dFsgZDEgPj4gMTYgJiAweDBmIHwgMHg0MCBdICsgbHV0WyBkMSA+PiAyNCAmIDB4ZmYgXSArICctJyArXG5cdFx0XHRcdGx1dFsgZDIgJiAweDNmIHwgMHg4MCBdICsgbHV0WyBkMiA+PiA4ICYgMHhmZiBdICsgJy0nICsgbHV0WyBkMiA+PiAxNiAmIDB4ZmYgXSArIGx1dFsgZDIgPj4gMjQgJiAweGZmIF0gK1xuXHRcdFx0XHRsdXRbIGQzICYgMHhmZiBdICsgbHV0WyBkMyA+PiA4ICYgMHhmZiBdICsgbHV0WyBkMyA+PiAxNiAmIDB4ZmYgXSArIGx1dFsgZDMgPj4gMjQgJiAweGZmIF07XG5cblx0XHRcdC8vIC50b1VwcGVyQ2FzZSgpIGhlcmUgZmxhdHRlbnMgY29uY2F0ZW5hdGVkIHN0cmluZ3MgdG8gc2F2ZSBoZWFwIG1lbW9yeSBzcGFjZS5cblx0XHRcdHJldHVybiB1dWlkLnRvVXBwZXJDYXNlKCk7XG5cblx0XHR9O1xuXG5cdH0gKSgpLFxuXG5cdGNsYW1wOiBmdW5jdGlvbiAoIHZhbHVlLCBtaW4sIG1heCApIHtcblxuXHRcdHJldHVybiBNYXRoLm1heCggbWluLCBNYXRoLm1pbiggbWF4LCB2YWx1ZSApICk7XG5cblx0fSxcblxuXHQvLyBjb21wdXRlIGV1Y2xpZGlhbiBtb2R1bG8gb2YgbSAlIG5cblx0Ly8gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTW9kdWxvX29wZXJhdGlvblxuXG5cdGV1Y2xpZGVhbk1vZHVsbzogZnVuY3Rpb24gKCBuLCBtICkge1xuXG5cdFx0cmV0dXJuICggKCBuICUgbSApICsgbSApICUgbTtcblxuXHR9LFxuXG5cdC8vIExpbmVhciBtYXBwaW5nIGZyb20gcmFuZ2UgPGExLCBhMj4gdG8gcmFuZ2UgPGIxLCBiMj5cblxuXHRtYXBMaW5lYXI6IGZ1bmN0aW9uICggeCwgYTEsIGEyLCBiMSwgYjIgKSB7XG5cblx0XHRyZXR1cm4gYjEgKyAoIHggLSBhMSApICogKCBiMiAtIGIxICkgLyAoIGEyIC0gYTEgKTtcblxuXHR9LFxuXG5cdC8vIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0xpbmVhcl9pbnRlcnBvbGF0aW9uXG5cblx0bGVycDogZnVuY3Rpb24gKCB4LCB5LCB0ICkge1xuXG5cdFx0cmV0dXJuICggMSAtIHQgKSAqIHggKyB0ICogeTtcblxuXHR9LFxuXG5cdC8vIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU21vb3Roc3RlcFxuXG5cdHNtb290aHN0ZXA6IGZ1bmN0aW9uICggeCwgbWluLCBtYXggKSB7XG5cblx0XHRpZiAoIHggPD0gbWluICkgcmV0dXJuIDA7XG5cdFx0aWYgKCB4ID49IG1heCApIHJldHVybiAxO1xuXG5cdFx0eCA9ICggeCAtIG1pbiApIC8gKCBtYXggLSBtaW4gKTtcblxuXHRcdHJldHVybiB4ICogeCAqICggMyAtIDIgKiB4ICk7XG5cblx0fSxcblxuXHRzbW9vdGhlcnN0ZXA6IGZ1bmN0aW9uICggeCwgbWluLCBtYXggKSB7XG5cblx0XHRpZiAoIHggPD0gbWluICkgcmV0dXJuIDA7XG5cdFx0aWYgKCB4ID49IG1heCApIHJldHVybiAxO1xuXG5cdFx0eCA9ICggeCAtIG1pbiApIC8gKCBtYXggLSBtaW4gKTtcblxuXHRcdHJldHVybiB4ICogeCAqIHggKiAoIHggKiAoIHggKiA2IC0gMTUgKSArIDEwICk7XG5cblx0fSxcblxuXHQvLyBSYW5kb20gaW50ZWdlciBmcm9tIDxsb3csIGhpZ2g+IGludGVydmFsXG5cblx0cmFuZEludDogZnVuY3Rpb24gKCBsb3csIGhpZ2ggKSB7XG5cblx0XHRyZXR1cm4gbG93ICsgTWF0aC5mbG9vciggTWF0aC5yYW5kb20oKSAqICggaGlnaCAtIGxvdyArIDEgKSApO1xuXG5cdH0sXG5cblx0Ly8gUmFuZG9tIGZsb2F0IGZyb20gPGxvdywgaGlnaD4gaW50ZXJ2YWxcblxuXHRyYW5kRmxvYXQ6IGZ1bmN0aW9uICggbG93LCBoaWdoICkge1xuXG5cdFx0cmV0dXJuIGxvdyArIE1hdGgucmFuZG9tKCkgKiAoIGhpZ2ggLSBsb3cgKTtcblxuXHR9LFxuXG5cdC8vIFJhbmRvbSBmbG9hdCBmcm9tIDwtcmFuZ2UvMiwgcmFuZ2UvMj4gaW50ZXJ2YWxcblxuXHRyYW5kRmxvYXRTcHJlYWQ6IGZ1bmN0aW9uICggcmFuZ2UgKSB7XG5cblx0XHRyZXR1cm4gcmFuZ2UgKiAoIDAuNSAtIE1hdGgucmFuZG9tKCkgKTtcblxuXHR9LFxuXG5cdGRlZ1RvUmFkOiBmdW5jdGlvbiAoIGRlZ3JlZXMgKSB7XG5cblx0XHRyZXR1cm4gZGVncmVlcyAqIF9NYXRoLkRFRzJSQUQ7XG5cblx0fSxcblxuXHRyYWRUb0RlZzogZnVuY3Rpb24gKCByYWRpYW5zICkge1xuXG5cdFx0cmV0dXJuIHJhZGlhbnMgKiBfTWF0aC5SQUQyREVHO1xuXG5cdH0sXG5cblx0aXNQb3dlck9mVHdvOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0cmV0dXJuICggdmFsdWUgJiAoIHZhbHVlIC0gMSApICkgPT09IDAgJiYgdmFsdWUgIT09IDA7XG5cblx0fSxcblxuXHRjZWlsUG93ZXJPZlR3bzogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHJldHVybiBNYXRoLnBvdyggMiwgTWF0aC5jZWlsKCBNYXRoLmxvZyggdmFsdWUgKSAvIE1hdGguTE4yICkgKTtcblxuXHR9LFxuXG5cdGZsb29yUG93ZXJPZlR3bzogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHJldHVybiBNYXRoLnBvdyggMiwgTWF0aC5mbG9vciggTWF0aC5sb2coIHZhbHVlICkgLyBNYXRoLkxOMiApICk7XG5cblx0fVxuXG59O1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIHBoaWxvZ2IgLyBodHRwOi8vYmxvZy50aGVqaXQub3JnL1xuICogQGF1dGhvciBlZ3JhZXRoZXIgLyBodHRwOi8vZWdyYWV0aGVyLmNvbS9cbiAqIEBhdXRob3Igeno4NSAvIGh0dHA6Ly93d3cubGFiNGdhbWVzLm5ldC96ejg1L2Jsb2dcbiAqL1xuXG5mdW5jdGlvbiBWZWN0b3IyKCB4LCB5ICkge1xuXG5cdHRoaXMueCA9IHggfHwgMDtcblx0dGhpcy55ID0geSB8fCAwO1xuXG59XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBWZWN0b3IyLnByb3RvdHlwZSwge1xuXG5cdFwid2lkdGhcIjoge1xuXG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLng7XG5cblx0XHR9LFxuXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHR0aGlzLnggPSB2YWx1ZTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdFwiaGVpZ2h0XCI6IHtcblxuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy55O1xuXG5cdFx0fSxcblxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0dGhpcy55ID0gdmFsdWU7XG5cblx0XHR9XG5cblx0fVxuXG59ICk7XG5cbk9iamVjdC5hc3NpZ24oIFZlY3RvcjIucHJvdG90eXBlLCB7XG5cblx0aXNWZWN0b3IyOiB0cnVlLFxuXG5cdHNldDogZnVuY3Rpb24gKCB4LCB5ICkge1xuXG5cdFx0dGhpcy54ID0geDtcblx0XHR0aGlzLnkgPSB5O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRTY2FsYXI6IGZ1bmN0aW9uICggc2NhbGFyICkge1xuXG5cdFx0dGhpcy54ID0gc2NhbGFyO1xuXHRcdHRoaXMueSA9IHNjYWxhcjtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0WDogZnVuY3Rpb24gKCB4ICkge1xuXG5cdFx0dGhpcy54ID0geDtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0WTogZnVuY3Rpb24gKCB5ICkge1xuXG5cdFx0dGhpcy55ID0geTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0Q29tcG9uZW50OiBmdW5jdGlvbiAoIGluZGV4LCB2YWx1ZSApIHtcblxuXHRcdHN3aXRjaCAoIGluZGV4ICkge1xuXG5cdFx0XHRjYXNlIDA6IHRoaXMueCA9IHZhbHVlOyBicmVhaztcblx0XHRcdGNhc2UgMTogdGhpcy55ID0gdmFsdWU7IGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDogdGhyb3cgbmV3IEVycm9yKCAnaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAnICsgaW5kZXggKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Z2V0Q29tcG9uZW50OiBmdW5jdGlvbiAoIGluZGV4ICkge1xuXG5cdFx0c3dpdGNoICggaW5kZXggKSB7XG5cblx0XHRcdGNhc2UgMDogcmV0dXJuIHRoaXMueDtcblx0XHRcdGNhc2UgMTogcmV0dXJuIHRoaXMueTtcblx0XHRcdGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvciggJ2luZGV4IGlzIG91dCBvZiByYW5nZTogJyArIGluZGV4ICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCB0aGlzLngsIHRoaXMueSApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0dGhpcy54ID0gdi54O1xuXHRcdHRoaXMueSA9IHYueTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YWRkOiBmdW5jdGlvbiAoIHYsIHcgKSB7XG5cblx0XHRpZiAoIHcgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yMjogLmFkZCgpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLmFkZFZlY3RvcnMoIGEsIGIgKSBpbnN0ZWFkLicgKTtcblx0XHRcdHJldHVybiB0aGlzLmFkZFZlY3RvcnMoIHYsIHcgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMueCArPSB2Lng7XG5cdFx0dGhpcy55ICs9IHYueTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YWRkU2NhbGFyOiBmdW5jdGlvbiAoIHMgKSB7XG5cblx0XHR0aGlzLnggKz0gcztcblx0XHR0aGlzLnkgKz0gcztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YWRkVmVjdG9yczogZnVuY3Rpb24gKCBhLCBiICkge1xuXG5cdFx0dGhpcy54ID0gYS54ICsgYi54O1xuXHRcdHRoaXMueSA9IGEueSArIGIueTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YWRkU2NhbGVkVmVjdG9yOiBmdW5jdGlvbiAoIHYsIHMgKSB7XG5cblx0XHR0aGlzLnggKz0gdi54ICogcztcblx0XHR0aGlzLnkgKz0gdi55ICogcztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c3ViOiBmdW5jdGlvbiAoIHYsIHcgKSB7XG5cblx0XHRpZiAoIHcgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yMjogLnN1YigpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLnN1YlZlY3RvcnMoIGEsIGIgKSBpbnN0ZWFkLicgKTtcblx0XHRcdHJldHVybiB0aGlzLnN1YlZlY3RvcnMoIHYsIHcgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMueCAtPSB2Lng7XG5cdFx0dGhpcy55IC09IHYueTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c3ViU2NhbGFyOiBmdW5jdGlvbiAoIHMgKSB7XG5cblx0XHR0aGlzLnggLT0gcztcblx0XHR0aGlzLnkgLT0gcztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c3ViVmVjdG9yczogZnVuY3Rpb24gKCBhLCBiICkge1xuXG5cdFx0dGhpcy54ID0gYS54IC0gYi54O1xuXHRcdHRoaXMueSA9IGEueSAtIGIueTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bXVsdGlwbHk6IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHRoaXMueCAqPSB2Lng7XG5cdFx0dGhpcy55ICo9IHYueTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bXVsdGlwbHlTY2FsYXI6IGZ1bmN0aW9uICggc2NhbGFyICkge1xuXG5cdFx0dGhpcy54ICo9IHNjYWxhcjtcblx0XHR0aGlzLnkgKj0gc2NhbGFyO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRkaXZpZGU6IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHRoaXMueCAvPSB2Lng7XG5cdFx0dGhpcy55IC89IHYueTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZGl2aWRlU2NhbGFyOiBmdW5jdGlvbiAoIHNjYWxhciApIHtcblxuXHRcdHJldHVybiB0aGlzLm11bHRpcGx5U2NhbGFyKCAxIC8gc2NhbGFyICk7XG5cblx0fSxcblxuXHRhcHBseU1hdHJpeDM6IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdHZhciB4ID0gdGhpcy54LCB5ID0gdGhpcy55O1xuXHRcdHZhciBlID0gbS5lbGVtZW50cztcblxuXHRcdHRoaXMueCA9IGVbIDAgXSAqIHggKyBlWyAzIF0gKiB5ICsgZVsgNiBdO1xuXHRcdHRoaXMueSA9IGVbIDEgXSAqIHggKyBlWyA0IF0gKiB5ICsgZVsgNyBdO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtaW46IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHRoaXMueCA9IE1hdGgubWluKCB0aGlzLngsIHYueCApO1xuXHRcdHRoaXMueSA9IE1hdGgubWluKCB0aGlzLnksIHYueSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtYXg6IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHRoaXMueCA9IE1hdGgubWF4KCB0aGlzLngsIHYueCApO1xuXHRcdHRoaXMueSA9IE1hdGgubWF4KCB0aGlzLnksIHYueSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjbGFtcDogZnVuY3Rpb24gKCBtaW4sIG1heCApIHtcblxuXHRcdC8vIGFzc3VtZXMgbWluIDwgbWF4LCBjb21wb25lbnR3aXNlXG5cblx0XHR0aGlzLnggPSBNYXRoLm1heCggbWluLngsIE1hdGgubWluKCBtYXgueCwgdGhpcy54ICkgKTtcblx0XHR0aGlzLnkgPSBNYXRoLm1heCggbWluLnksIE1hdGgubWluKCBtYXgueSwgdGhpcy55ICkgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xhbXBTY2FsYXI6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBtaW4gPSBuZXcgVmVjdG9yMigpO1xuXHRcdHZhciBtYXggPSBuZXcgVmVjdG9yMigpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGNsYW1wU2NhbGFyKCBtaW5WYWwsIG1heFZhbCApIHtcblxuXHRcdFx0bWluLnNldCggbWluVmFsLCBtaW5WYWwgKTtcblx0XHRcdG1heC5zZXQoIG1heFZhbCwgbWF4VmFsICk7XG5cblx0XHRcdHJldHVybiB0aGlzLmNsYW1wKCBtaW4sIG1heCApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0Y2xhbXBMZW5ndGg6IGZ1bmN0aW9uICggbWluLCBtYXggKSB7XG5cblx0XHR2YXIgbGVuZ3RoID0gdGhpcy5sZW5ndGgoKTtcblxuXHRcdHJldHVybiB0aGlzLmRpdmlkZVNjYWxhciggbGVuZ3RoIHx8IDEgKS5tdWx0aXBseVNjYWxhciggTWF0aC5tYXgoIG1pbiwgTWF0aC5taW4oIG1heCwgbGVuZ3RoICkgKSApO1xuXG5cdH0sXG5cblx0Zmxvb3I6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMueCA9IE1hdGguZmxvb3IoIHRoaXMueCApO1xuXHRcdHRoaXMueSA9IE1hdGguZmxvb3IoIHRoaXMueSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjZWlsOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLnggPSBNYXRoLmNlaWwoIHRoaXMueCApO1xuXHRcdHRoaXMueSA9IE1hdGguY2VpbCggdGhpcy55ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHJvdW5kOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLnggPSBNYXRoLnJvdW5kKCB0aGlzLnggKTtcblx0XHR0aGlzLnkgPSBNYXRoLnJvdW5kKCB0aGlzLnkgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0cm91bmRUb1plcm86IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMueCA9ICggdGhpcy54IDwgMCApID8gTWF0aC5jZWlsKCB0aGlzLnggKSA6IE1hdGguZmxvb3IoIHRoaXMueCApO1xuXHRcdHRoaXMueSA9ICggdGhpcy55IDwgMCApID8gTWF0aC5jZWlsKCB0aGlzLnkgKSA6IE1hdGguZmxvb3IoIHRoaXMueSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRuZWdhdGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMueCA9IC0gdGhpcy54O1xuXHRcdHRoaXMueSA9IC0gdGhpcy55O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRkb3Q6IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHJldHVybiB0aGlzLnggKiB2LnggKyB0aGlzLnkgKiB2Lnk7XG5cblx0fSxcblxuXHRsZW5ndGhTcTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMueCAqIHRoaXMueCArIHRoaXMueSAqIHRoaXMueTtcblxuXHR9LFxuXG5cdGxlbmd0aDogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIE1hdGguc3FydCggdGhpcy54ICogdGhpcy54ICsgdGhpcy55ICogdGhpcy55ICk7XG5cblx0fSxcblxuXHRtYW5oYXR0YW5MZW5ndGg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBNYXRoLmFicyggdGhpcy54ICkgKyBNYXRoLmFicyggdGhpcy55ICk7XG5cblx0fSxcblxuXHRub3JtYWxpemU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLmRpdmlkZVNjYWxhciggdGhpcy5sZW5ndGgoKSB8fCAxICk7XG5cblx0fSxcblxuXHRhbmdsZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gY29tcHV0ZXMgdGhlIGFuZ2xlIGluIHJhZGlhbnMgd2l0aCByZXNwZWN0IHRvIHRoZSBwb3NpdGl2ZSB4LWF4aXNcblxuXHRcdHZhciBhbmdsZSA9IE1hdGguYXRhbjIoIHRoaXMueSwgdGhpcy54ICk7XG5cblx0XHRpZiAoIGFuZ2xlIDwgMCApIGFuZ2xlICs9IDIgKiBNYXRoLlBJO1xuXG5cdFx0cmV0dXJuIGFuZ2xlO1xuXG5cdH0sXG5cblx0ZGlzdGFuY2VUbzogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0cmV0dXJuIE1hdGguc3FydCggdGhpcy5kaXN0YW5jZVRvU3F1YXJlZCggdiApICk7XG5cblx0fSxcblxuXHRkaXN0YW5jZVRvU3F1YXJlZDogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0dmFyIGR4ID0gdGhpcy54IC0gdi54LCBkeSA9IHRoaXMueSAtIHYueTtcblx0XHRyZXR1cm4gZHggKiBkeCArIGR5ICogZHk7XG5cblx0fSxcblxuXHRtYW5oYXR0YW5EaXN0YW5jZVRvOiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHRyZXR1cm4gTWF0aC5hYnMoIHRoaXMueCAtIHYueCApICsgTWF0aC5hYnMoIHRoaXMueSAtIHYueSApO1xuXG5cdH0sXG5cblx0c2V0TGVuZ3RoOiBmdW5jdGlvbiAoIGxlbmd0aCApIHtcblxuXHRcdHJldHVybiB0aGlzLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKCBsZW5ndGggKTtcblxuXHR9LFxuXG5cdGxlcnA6IGZ1bmN0aW9uICggdiwgYWxwaGEgKSB7XG5cblx0XHR0aGlzLnggKz0gKCB2LnggLSB0aGlzLnggKSAqIGFscGhhO1xuXHRcdHRoaXMueSArPSAoIHYueSAtIHRoaXMueSApICogYWxwaGE7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGxlcnBWZWN0b3JzOiBmdW5jdGlvbiAoIHYxLCB2MiwgYWxwaGEgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5zdWJWZWN0b3JzKCB2MiwgdjEgKS5tdWx0aXBseVNjYWxhciggYWxwaGEgKS5hZGQoIHYxICk7XG5cblx0fSxcblxuXHRlcXVhbHM6IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHJldHVybiAoICggdi54ID09PSB0aGlzLnggKSAmJiAoIHYueSA9PT0gdGhpcy55ICkgKTtcblxuXHR9LFxuXG5cdGZyb21BcnJheTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkge1xuXG5cdFx0aWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7XG5cblx0XHR0aGlzLnggPSBhcnJheVsgb2Zmc2V0IF07XG5cdFx0dGhpcy55ID0gYXJyYXlbIG9mZnNldCArIDEgXTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dG9BcnJheTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkge1xuXG5cdFx0aWYgKCBhcnJheSA9PT0gdW5kZWZpbmVkICkgYXJyYXkgPSBbXTtcblx0XHRpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkgb2Zmc2V0ID0gMDtcblxuXHRcdGFycmF5WyBvZmZzZXQgXSA9IHRoaXMueDtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMSBdID0gdGhpcy55O1xuXG5cdFx0cmV0dXJuIGFycmF5O1xuXG5cdH0sXG5cblx0ZnJvbUJ1ZmZlckF0dHJpYnV0ZTogZnVuY3Rpb24gKCBhdHRyaWJ1dGUsIGluZGV4LCBvZmZzZXQgKSB7XG5cblx0XHRpZiAoIG9mZnNldCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3IyOiBvZmZzZXQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIC5mcm9tQnVmZmVyQXR0cmlidXRlKCkuJyApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy54ID0gYXR0cmlidXRlLmdldFgoIGluZGV4ICk7XG5cdFx0dGhpcy55ID0gYXR0cmlidXRlLmdldFkoIGluZGV4ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHJvdGF0ZUFyb3VuZDogZnVuY3Rpb24gKCBjZW50ZXIsIGFuZ2xlICkge1xuXG5cdFx0dmFyIGMgPSBNYXRoLmNvcyggYW5nbGUgKSwgcyA9IE1hdGguc2luKCBhbmdsZSApO1xuXG5cdFx0dmFyIHggPSB0aGlzLnggLSBjZW50ZXIueDtcblx0XHR2YXIgeSA9IHRoaXMueSAtIGNlbnRlci55O1xuXG5cdFx0dGhpcy54ID0geCAqIGMgLSB5ICogcyArIGNlbnRlci54O1xuXHRcdHRoaXMueSA9IHggKiBzICsgeSAqIGMgKyBjZW50ZXIueTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIHN1cGVyZWdnYmVydCAvIGh0dHA6Ly93d3cucGF1bGJydW50LmNvLnVrL1xuICogQGF1dGhvciBwaGlsb2diIC8gaHR0cDovL2Jsb2cudGhlaml0Lm9yZy9cbiAqIEBhdXRob3Igam9yZGlfcm9zIC8gaHR0cDovL3BsYXR0c29mdC5jb21cbiAqIEBhdXRob3IgRDFwbG8xZCAvIGh0dHA6Ly9naXRodWIuY29tL0QxcGxvMWRcbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKiBAYXV0aG9yIG1pa2FlbCBlbXRpbmdlciAvIGh0dHA6Ly9nb21vLnNlL1xuICogQGF1dGhvciB0aW1rbmlwIC8gaHR0cDovL3d3dy5mbG9vcnBsYW5uZXIuY29tL1xuICogQGF1dGhvciBiaG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pb1xuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKi9cblxuZnVuY3Rpb24gTWF0cml4NCgpIHtcblxuXHR0aGlzLmVsZW1lbnRzID0gW1xuXG5cdFx0MSwgMCwgMCwgMCxcblx0XHQwLCAxLCAwLCAwLFxuXHRcdDAsIDAsIDEsIDAsXG5cdFx0MCwgMCwgMCwgMVxuXG5cdF07XG5cblx0aWYgKCBhcmd1bWVudHMubGVuZ3RoID4gMCApIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5NYXRyaXg0OiB0aGUgY29uc3RydWN0b3Igbm8gbG9uZ2VyIHJlYWRzIGFyZ3VtZW50cy4gdXNlIC5zZXQoKSBpbnN0ZWFkLicgKTtcblxuXHR9XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggTWF0cml4NC5wcm90b3R5cGUsIHtcblxuXHRpc01hdHJpeDQ6IHRydWUsXG5cblx0c2V0OiBmdW5jdGlvbiAoIG4xMSwgbjEyLCBuMTMsIG4xNCwgbjIxLCBuMjIsIG4yMywgbjI0LCBuMzEsIG4zMiwgbjMzLCBuMzQsIG40MSwgbjQyLCBuNDMsIG40NCApIHtcblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHR0ZVsgMCBdID0gbjExOyB0ZVsgNCBdID0gbjEyOyB0ZVsgOCBdID0gbjEzOyB0ZVsgMTIgXSA9IG4xNDtcblx0XHR0ZVsgMSBdID0gbjIxOyB0ZVsgNSBdID0gbjIyOyB0ZVsgOSBdID0gbjIzOyB0ZVsgMTMgXSA9IG4yNDtcblx0XHR0ZVsgMiBdID0gbjMxOyB0ZVsgNiBdID0gbjMyOyB0ZVsgMTAgXSA9IG4zMzsgdGVbIDE0IF0gPSBuMzQ7XG5cdFx0dGVbIDMgXSA9IG40MTsgdGVbIDcgXSA9IG40MjsgdGVbIDExIF0gPSBuNDM7IHRlWyAxNSBdID0gbjQ0O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRpZGVudGl0eTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5zZXQoXG5cblx0XHRcdDEsIDAsIDAsIDAsXG5cdFx0XHQwLCAxLCAwLCAwLFxuXHRcdFx0MCwgMCwgMSwgMCxcblx0XHRcdDAsIDAsIDAsIDFcblxuXHRcdCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IE1hdHJpeDQoKS5mcm9tQXJyYXkoIHRoaXMuZWxlbWVudHMgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cdFx0dmFyIG1lID0gbS5lbGVtZW50cztcblxuXHRcdHRlWyAwIF0gPSBtZVsgMCBdOyB0ZVsgMSBdID0gbWVbIDEgXTsgdGVbIDIgXSA9IG1lWyAyIF07IHRlWyAzIF0gPSBtZVsgMyBdO1xuXHRcdHRlWyA0IF0gPSBtZVsgNCBdOyB0ZVsgNSBdID0gbWVbIDUgXTsgdGVbIDYgXSA9IG1lWyA2IF07IHRlWyA3IF0gPSBtZVsgNyBdO1xuXHRcdHRlWyA4IF0gPSBtZVsgOCBdOyB0ZVsgOSBdID0gbWVbIDkgXTsgdGVbIDEwIF0gPSBtZVsgMTAgXTsgdGVbIDExIF0gPSBtZVsgMTEgXTtcblx0XHR0ZVsgMTIgXSA9IG1lWyAxMiBdOyB0ZVsgMTMgXSA9IG1lWyAxMyBdOyB0ZVsgMTQgXSA9IG1lWyAxNCBdOyB0ZVsgMTUgXSA9IG1lWyAxNSBdO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjb3B5UG9zaXRpb246IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHMsIG1lID0gbS5lbGVtZW50cztcblxuXHRcdHRlWyAxMiBdID0gbWVbIDEyIF07XG5cdFx0dGVbIDEzIF0gPSBtZVsgMTMgXTtcblx0XHR0ZVsgMTQgXSA9IG1lWyAxNCBdO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRleHRyYWN0QmFzaXM6IGZ1bmN0aW9uICggeEF4aXMsIHlBeGlzLCB6QXhpcyApIHtcblxuXHRcdHhBeGlzLnNldEZyb21NYXRyaXhDb2x1bW4oIHRoaXMsIDAgKTtcblx0XHR5QXhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKCB0aGlzLCAxICk7XG5cdFx0ekF4aXMuc2V0RnJvbU1hdHJpeENvbHVtbiggdGhpcywgMiApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtYWtlQmFzaXM6IGZ1bmN0aW9uICggeEF4aXMsIHlBeGlzLCB6QXhpcyApIHtcblxuXHRcdHRoaXMuc2V0KFxuXHRcdFx0eEF4aXMueCwgeUF4aXMueCwgekF4aXMueCwgMCxcblx0XHRcdHhBeGlzLnksIHlBeGlzLnksIHpBeGlzLnksIDAsXG5cdFx0XHR4QXhpcy56LCB5QXhpcy56LCB6QXhpcy56LCAwLFxuXHRcdFx0MCwgMCwgMCwgMVxuXHRcdCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGV4dHJhY3RSb3RhdGlvbjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBleHRyYWN0Um90YXRpb24oIG0gKSB7XG5cblx0XHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cdFx0XHR2YXIgbWUgPSBtLmVsZW1lbnRzO1xuXG5cdFx0XHR2YXIgc2NhbGVYID0gMSAvIHYxLnNldEZyb21NYXRyaXhDb2x1bW4oIG0sIDAgKS5sZW5ndGgoKTtcblx0XHRcdHZhciBzY2FsZVkgPSAxIC8gdjEuc2V0RnJvbU1hdHJpeENvbHVtbiggbSwgMSApLmxlbmd0aCgpO1xuXHRcdFx0dmFyIHNjYWxlWiA9IDEgLyB2MS5zZXRGcm9tTWF0cml4Q29sdW1uKCBtLCAyICkubGVuZ3RoKCk7XG5cblx0XHRcdHRlWyAwIF0gPSBtZVsgMCBdICogc2NhbGVYO1xuXHRcdFx0dGVbIDEgXSA9IG1lWyAxIF0gKiBzY2FsZVg7XG5cdFx0XHR0ZVsgMiBdID0gbWVbIDIgXSAqIHNjYWxlWDtcblxuXHRcdFx0dGVbIDQgXSA9IG1lWyA0IF0gKiBzY2FsZVk7XG5cdFx0XHR0ZVsgNSBdID0gbWVbIDUgXSAqIHNjYWxlWTtcblx0XHRcdHRlWyA2IF0gPSBtZVsgNiBdICogc2NhbGVZO1xuXG5cdFx0XHR0ZVsgOCBdID0gbWVbIDggXSAqIHNjYWxlWjtcblx0XHRcdHRlWyA5IF0gPSBtZVsgOSBdICogc2NhbGVaO1xuXHRcdFx0dGVbIDEwIF0gPSBtZVsgMTAgXSAqIHNjYWxlWjtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRtYWtlUm90YXRpb25Gcm9tRXVsZXI6IGZ1bmN0aW9uICggZXVsZXIgKSB7XG5cblx0XHRpZiAoICEgKCBldWxlciAmJiBldWxlci5pc0V1bGVyICkgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5NYXRyaXg0OiAubWFrZVJvdGF0aW9uRnJvbUV1bGVyKCkgbm93IGV4cGVjdHMgYSBFdWxlciByb3RhdGlvbiByYXRoZXIgdGhhbiBhIFZlY3RvcjMgYW5kIG9yZGVyLicgKTtcblxuXHRcdH1cblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHR2YXIgeCA9IGV1bGVyLngsIHkgPSBldWxlci55LCB6ID0gZXVsZXIuejtcblx0XHR2YXIgYSA9IE1hdGguY29zKCB4ICksIGIgPSBNYXRoLnNpbiggeCApO1xuXHRcdHZhciBjID0gTWF0aC5jb3MoIHkgKSwgZCA9IE1hdGguc2luKCB5ICk7XG5cdFx0dmFyIGUgPSBNYXRoLmNvcyggeiApLCBmID0gTWF0aC5zaW4oIHogKTtcblxuXHRcdGlmICggZXVsZXIub3JkZXIgPT09ICdYWVonICkge1xuXG5cdFx0XHR2YXIgYWUgPSBhICogZSwgYWYgPSBhICogZiwgYmUgPSBiICogZSwgYmYgPSBiICogZjtcblxuXHRcdFx0dGVbIDAgXSA9IGMgKiBlO1xuXHRcdFx0dGVbIDQgXSA9IC0gYyAqIGY7XG5cdFx0XHR0ZVsgOCBdID0gZDtcblxuXHRcdFx0dGVbIDEgXSA9IGFmICsgYmUgKiBkO1xuXHRcdFx0dGVbIDUgXSA9IGFlIC0gYmYgKiBkO1xuXHRcdFx0dGVbIDkgXSA9IC0gYiAqIGM7XG5cblx0XHRcdHRlWyAyIF0gPSBiZiAtIGFlICogZDtcblx0XHRcdHRlWyA2IF0gPSBiZSArIGFmICogZDtcblx0XHRcdHRlWyAxMCBdID0gYSAqIGM7XG5cblx0XHR9IGVsc2UgaWYgKCBldWxlci5vcmRlciA9PT0gJ1lYWicgKSB7XG5cblx0XHRcdHZhciBjZSA9IGMgKiBlLCBjZiA9IGMgKiBmLCBkZSA9IGQgKiBlLCBkZiA9IGQgKiBmO1xuXG5cdFx0XHR0ZVsgMCBdID0gY2UgKyBkZiAqIGI7XG5cdFx0XHR0ZVsgNCBdID0gZGUgKiBiIC0gY2Y7XG5cdFx0XHR0ZVsgOCBdID0gYSAqIGQ7XG5cblx0XHRcdHRlWyAxIF0gPSBhICogZjtcblx0XHRcdHRlWyA1IF0gPSBhICogZTtcblx0XHRcdHRlWyA5IF0gPSAtIGI7XG5cblx0XHRcdHRlWyAyIF0gPSBjZiAqIGIgLSBkZTtcblx0XHRcdHRlWyA2IF0gPSBkZiArIGNlICogYjtcblx0XHRcdHRlWyAxMCBdID0gYSAqIGM7XG5cblx0XHR9IGVsc2UgaWYgKCBldWxlci5vcmRlciA9PT0gJ1pYWScgKSB7XG5cblx0XHRcdHZhciBjZSA9IGMgKiBlLCBjZiA9IGMgKiBmLCBkZSA9IGQgKiBlLCBkZiA9IGQgKiBmO1xuXG5cdFx0XHR0ZVsgMCBdID0gY2UgLSBkZiAqIGI7XG5cdFx0XHR0ZVsgNCBdID0gLSBhICogZjtcblx0XHRcdHRlWyA4IF0gPSBkZSArIGNmICogYjtcblxuXHRcdFx0dGVbIDEgXSA9IGNmICsgZGUgKiBiO1xuXHRcdFx0dGVbIDUgXSA9IGEgKiBlO1xuXHRcdFx0dGVbIDkgXSA9IGRmIC0gY2UgKiBiO1xuXG5cdFx0XHR0ZVsgMiBdID0gLSBhICogZDtcblx0XHRcdHRlWyA2IF0gPSBiO1xuXHRcdFx0dGVbIDEwIF0gPSBhICogYztcblxuXHRcdH0gZWxzZSBpZiAoIGV1bGVyLm9yZGVyID09PSAnWllYJyApIHtcblxuXHRcdFx0dmFyIGFlID0gYSAqIGUsIGFmID0gYSAqIGYsIGJlID0gYiAqIGUsIGJmID0gYiAqIGY7XG5cblx0XHRcdHRlWyAwIF0gPSBjICogZTtcblx0XHRcdHRlWyA0IF0gPSBiZSAqIGQgLSBhZjtcblx0XHRcdHRlWyA4IF0gPSBhZSAqIGQgKyBiZjtcblxuXHRcdFx0dGVbIDEgXSA9IGMgKiBmO1xuXHRcdFx0dGVbIDUgXSA9IGJmICogZCArIGFlO1xuXHRcdFx0dGVbIDkgXSA9IGFmICogZCAtIGJlO1xuXG5cdFx0XHR0ZVsgMiBdID0gLSBkO1xuXHRcdFx0dGVbIDYgXSA9IGIgKiBjO1xuXHRcdFx0dGVbIDEwIF0gPSBhICogYztcblxuXHRcdH0gZWxzZSBpZiAoIGV1bGVyLm9yZGVyID09PSAnWVpYJyApIHtcblxuXHRcdFx0dmFyIGFjID0gYSAqIGMsIGFkID0gYSAqIGQsIGJjID0gYiAqIGMsIGJkID0gYiAqIGQ7XG5cblx0XHRcdHRlWyAwIF0gPSBjICogZTtcblx0XHRcdHRlWyA0IF0gPSBiZCAtIGFjICogZjtcblx0XHRcdHRlWyA4IF0gPSBiYyAqIGYgKyBhZDtcblxuXHRcdFx0dGVbIDEgXSA9IGY7XG5cdFx0XHR0ZVsgNSBdID0gYSAqIGU7XG5cdFx0XHR0ZVsgOSBdID0gLSBiICogZTtcblxuXHRcdFx0dGVbIDIgXSA9IC0gZCAqIGU7XG5cdFx0XHR0ZVsgNiBdID0gYWQgKiBmICsgYmM7XG5cdFx0XHR0ZVsgMTAgXSA9IGFjIC0gYmQgKiBmO1xuXG5cdFx0fSBlbHNlIGlmICggZXVsZXIub3JkZXIgPT09ICdYWlknICkge1xuXG5cdFx0XHR2YXIgYWMgPSBhICogYywgYWQgPSBhICogZCwgYmMgPSBiICogYywgYmQgPSBiICogZDtcblxuXHRcdFx0dGVbIDAgXSA9IGMgKiBlO1xuXHRcdFx0dGVbIDQgXSA9IC0gZjtcblx0XHRcdHRlWyA4IF0gPSBkICogZTtcblxuXHRcdFx0dGVbIDEgXSA9IGFjICogZiArIGJkO1xuXHRcdFx0dGVbIDUgXSA9IGEgKiBlO1xuXHRcdFx0dGVbIDkgXSA9IGFkICogZiAtIGJjO1xuXG5cdFx0XHR0ZVsgMiBdID0gYmMgKiBmIC0gYWQ7XG5cdFx0XHR0ZVsgNiBdID0gYiAqIGU7XG5cdFx0XHR0ZVsgMTAgXSA9IGJkICogZiArIGFjO1xuXG5cdFx0fVxuXG5cdFx0Ly8gbGFzdCBjb2x1bW5cblx0XHR0ZVsgMyBdID0gMDtcblx0XHR0ZVsgNyBdID0gMDtcblx0XHR0ZVsgMTEgXSA9IDA7XG5cblx0XHQvLyBib3R0b20gcm93XG5cdFx0dGVbIDEyIF0gPSAwO1xuXHRcdHRlWyAxMyBdID0gMDtcblx0XHR0ZVsgMTQgXSA9IDA7XG5cdFx0dGVbIDE1IF0gPSAxO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbjogZnVuY3Rpb24gKCBxICkge1xuXG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblxuXHRcdHZhciB4ID0gcS5feCwgeSA9IHEuX3ksIHogPSBxLl96LCB3ID0gcS5fdztcblx0XHR2YXIgeDIgPSB4ICsgeCwgeTIgPSB5ICsgeSwgejIgPSB6ICsgejtcblx0XHR2YXIgeHggPSB4ICogeDIsIHh5ID0geCAqIHkyLCB4eiA9IHggKiB6Mjtcblx0XHR2YXIgeXkgPSB5ICogeTIsIHl6ID0geSAqIHoyLCB6eiA9IHogKiB6Mjtcblx0XHR2YXIgd3ggPSB3ICogeDIsIHd5ID0gdyAqIHkyLCB3eiA9IHcgKiB6MjtcblxuXHRcdHRlWyAwIF0gPSAxIC0gKCB5eSArIHp6ICk7XG5cdFx0dGVbIDQgXSA9IHh5IC0gd3o7XG5cdFx0dGVbIDggXSA9IHh6ICsgd3k7XG5cblx0XHR0ZVsgMSBdID0geHkgKyB3ejtcblx0XHR0ZVsgNSBdID0gMSAtICggeHggKyB6eiApO1xuXHRcdHRlWyA5IF0gPSB5eiAtIHd4O1xuXG5cdFx0dGVbIDIgXSA9IHh6IC0gd3k7XG5cdFx0dGVbIDYgXSA9IHl6ICsgd3g7XG5cdFx0dGVbIDEwIF0gPSAxIC0gKCB4eCArIHl5ICk7XG5cblx0XHQvLyBsYXN0IGNvbHVtblxuXHRcdHRlWyAzIF0gPSAwO1xuXHRcdHRlWyA3IF0gPSAwO1xuXHRcdHRlWyAxMSBdID0gMDtcblxuXHRcdC8vIGJvdHRvbSByb3dcblx0XHR0ZVsgMTIgXSA9IDA7XG5cdFx0dGVbIDEzIF0gPSAwO1xuXHRcdHRlWyAxNCBdID0gMDtcblx0XHR0ZVsgMTUgXSA9IDE7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGxvb2tBdDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHggPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciB5ID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgeiA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gbG9va0F0KCBleWUsIHRhcmdldCwgdXAgKSB7XG5cblx0XHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHRcdHouc3ViVmVjdG9ycyggZXllLCB0YXJnZXQgKTtcblxuXHRcdFx0aWYgKCB6Lmxlbmd0aFNxKCkgPT09IDAgKSB7XG5cblx0XHRcdFx0Ly8gZXllIGFuZCB0YXJnZXQgYXJlIGluIHRoZSBzYW1lIHBvc2l0aW9uXG5cblx0XHRcdFx0ei56ID0gMTtcblxuXHRcdFx0fVxuXG5cdFx0XHR6Lm5vcm1hbGl6ZSgpO1xuXHRcdFx0eC5jcm9zc1ZlY3RvcnMoIHVwLCB6ICk7XG5cblx0XHRcdGlmICggeC5sZW5ndGhTcSgpID09PSAwICkge1xuXG5cdFx0XHRcdC8vIHVwIGFuZCB6IGFyZSBwYXJhbGxlbFxuXG5cdFx0XHRcdGlmICggTWF0aC5hYnMoIHVwLnogKSA9PT0gMSApIHtcblxuXHRcdFx0XHRcdHoueCArPSAwLjAwMDE7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdHoueiArPSAwLjAwMDE7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHoubm9ybWFsaXplKCk7XG5cdFx0XHRcdHguY3Jvc3NWZWN0b3JzKCB1cCwgeiApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHgubm9ybWFsaXplKCk7XG5cdFx0XHR5LmNyb3NzVmVjdG9ycyggeiwgeCApO1xuXG5cdFx0XHR0ZVsgMCBdID0geC54OyB0ZVsgNCBdID0geS54OyB0ZVsgOCBdID0gei54O1xuXHRcdFx0dGVbIDEgXSA9IHgueTsgdGVbIDUgXSA9IHkueTsgdGVbIDkgXSA9IHoueTtcblx0XHRcdHRlWyAyIF0gPSB4Lno7IHRlWyA2IF0gPSB5Lno7IHRlWyAxMCBdID0gei56O1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdG11bHRpcGx5OiBmdW5jdGlvbiAoIG0sIG4gKSB7XG5cblx0XHRpZiAoIG4gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0cml4NDogLm11bHRpcGx5KCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAubXVsdGlwbHlNYXRyaWNlcyggYSwgYiApIGluc3RlYWQuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMubXVsdGlwbHlNYXRyaWNlcyggbSwgbiApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMubXVsdGlwbHlNYXRyaWNlcyggdGhpcywgbSApO1xuXG5cdH0sXG5cblx0cHJlbXVsdGlwbHk6IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdHJldHVybiB0aGlzLm11bHRpcGx5TWF0cmljZXMoIG0sIHRoaXMgKTtcblxuXHR9LFxuXG5cdG11bHRpcGx5TWF0cmljZXM6IGZ1bmN0aW9uICggYSwgYiApIHtcblxuXHRcdHZhciBhZSA9IGEuZWxlbWVudHM7XG5cdFx0dmFyIGJlID0gYi5lbGVtZW50cztcblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXG5cdFx0dmFyIGExMSA9IGFlWyAwIF0sIGExMiA9IGFlWyA0IF0sIGExMyA9IGFlWyA4IF0sIGExNCA9IGFlWyAxMiBdO1xuXHRcdHZhciBhMjEgPSBhZVsgMSBdLCBhMjIgPSBhZVsgNSBdLCBhMjMgPSBhZVsgOSBdLCBhMjQgPSBhZVsgMTMgXTtcblx0XHR2YXIgYTMxID0gYWVbIDIgXSwgYTMyID0gYWVbIDYgXSwgYTMzID0gYWVbIDEwIF0sIGEzNCA9IGFlWyAxNCBdO1xuXHRcdHZhciBhNDEgPSBhZVsgMyBdLCBhNDIgPSBhZVsgNyBdLCBhNDMgPSBhZVsgMTEgXSwgYTQ0ID0gYWVbIDE1IF07XG5cblx0XHR2YXIgYjExID0gYmVbIDAgXSwgYjEyID0gYmVbIDQgXSwgYjEzID0gYmVbIDggXSwgYjE0ID0gYmVbIDEyIF07XG5cdFx0dmFyIGIyMSA9IGJlWyAxIF0sIGIyMiA9IGJlWyA1IF0sIGIyMyA9IGJlWyA5IF0sIGIyNCA9IGJlWyAxMyBdO1xuXHRcdHZhciBiMzEgPSBiZVsgMiBdLCBiMzIgPSBiZVsgNiBdLCBiMzMgPSBiZVsgMTAgXSwgYjM0ID0gYmVbIDE0IF07XG5cdFx0dmFyIGI0MSA9IGJlWyAzIF0sIGI0MiA9IGJlWyA3IF0sIGI0MyA9IGJlWyAxMSBdLCBiNDQgPSBiZVsgMTUgXTtcblxuXHRcdHRlWyAwIF0gPSBhMTEgKiBiMTEgKyBhMTIgKiBiMjEgKyBhMTMgKiBiMzEgKyBhMTQgKiBiNDE7XG5cdFx0dGVbIDQgXSA9IGExMSAqIGIxMiArIGExMiAqIGIyMiArIGExMyAqIGIzMiArIGExNCAqIGI0Mjtcblx0XHR0ZVsgOCBdID0gYTExICogYjEzICsgYTEyICogYjIzICsgYTEzICogYjMzICsgYTE0ICogYjQzO1xuXHRcdHRlWyAxMiBdID0gYTExICogYjE0ICsgYTEyICogYjI0ICsgYTEzICogYjM0ICsgYTE0ICogYjQ0O1xuXG5cdFx0dGVbIDEgXSA9IGEyMSAqIGIxMSArIGEyMiAqIGIyMSArIGEyMyAqIGIzMSArIGEyNCAqIGI0MTtcblx0XHR0ZVsgNSBdID0gYTIxICogYjEyICsgYTIyICogYjIyICsgYTIzICogYjMyICsgYTI0ICogYjQyO1xuXHRcdHRlWyA5IF0gPSBhMjEgKiBiMTMgKyBhMjIgKiBiMjMgKyBhMjMgKiBiMzMgKyBhMjQgKiBiNDM7XG5cdFx0dGVbIDEzIF0gPSBhMjEgKiBiMTQgKyBhMjIgKiBiMjQgKyBhMjMgKiBiMzQgKyBhMjQgKiBiNDQ7XG5cblx0XHR0ZVsgMiBdID0gYTMxICogYjExICsgYTMyICogYjIxICsgYTMzICogYjMxICsgYTM0ICogYjQxO1xuXHRcdHRlWyA2IF0gPSBhMzEgKiBiMTIgKyBhMzIgKiBiMjIgKyBhMzMgKiBiMzIgKyBhMzQgKiBiNDI7XG5cdFx0dGVbIDEwIF0gPSBhMzEgKiBiMTMgKyBhMzIgKiBiMjMgKyBhMzMgKiBiMzMgKyBhMzQgKiBiNDM7XG5cdFx0dGVbIDE0IF0gPSBhMzEgKiBiMTQgKyBhMzIgKiBiMjQgKyBhMzMgKiBiMzQgKyBhMzQgKiBiNDQ7XG5cblx0XHR0ZVsgMyBdID0gYTQxICogYjExICsgYTQyICogYjIxICsgYTQzICogYjMxICsgYTQ0ICogYjQxO1xuXHRcdHRlWyA3IF0gPSBhNDEgKiBiMTIgKyBhNDIgKiBiMjIgKyBhNDMgKiBiMzIgKyBhNDQgKiBiNDI7XG5cdFx0dGVbIDExIF0gPSBhNDEgKiBiMTMgKyBhNDIgKiBiMjMgKyBhNDMgKiBiMzMgKyBhNDQgKiBiNDM7XG5cdFx0dGVbIDE1IF0gPSBhNDEgKiBiMTQgKyBhNDIgKiBiMjQgKyBhNDMgKiBiMzQgKyBhNDQgKiBiNDQ7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG11bHRpcGx5U2NhbGFyOiBmdW5jdGlvbiAoIHMgKSB7XG5cblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXG5cdFx0dGVbIDAgXSAqPSBzOyB0ZVsgNCBdICo9IHM7IHRlWyA4IF0gKj0gczsgdGVbIDEyIF0gKj0gcztcblx0XHR0ZVsgMSBdICo9IHM7IHRlWyA1IF0gKj0gczsgdGVbIDkgXSAqPSBzOyB0ZVsgMTMgXSAqPSBzO1xuXHRcdHRlWyAyIF0gKj0gczsgdGVbIDYgXSAqPSBzOyB0ZVsgMTAgXSAqPSBzOyB0ZVsgMTQgXSAqPSBzO1xuXHRcdHRlWyAzIF0gKj0gczsgdGVbIDcgXSAqPSBzOyB0ZVsgMTEgXSAqPSBzOyB0ZVsgMTUgXSAqPSBzO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRhcHBseVRvQnVmZmVyQXR0cmlidXRlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGFwcGx5VG9CdWZmZXJBdHRyaWJ1dGUoIGF0dHJpYnV0ZSApIHtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gYXR0cmlidXRlLmNvdW50OyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHR2MS54ID0gYXR0cmlidXRlLmdldFgoIGkgKTtcblx0XHRcdFx0djEueSA9IGF0dHJpYnV0ZS5nZXRZKCBpICk7XG5cdFx0XHRcdHYxLnogPSBhdHRyaWJ1dGUuZ2V0WiggaSApO1xuXG5cdFx0XHRcdHYxLmFwcGx5TWF0cml4NCggdGhpcyApO1xuXG5cdFx0XHRcdGF0dHJpYnV0ZS5zZXRYWVooIGksIHYxLngsIHYxLnksIHYxLnogKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gYXR0cmlidXRlO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0ZGV0ZXJtaW5hbnQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHR2YXIgbjExID0gdGVbIDAgXSwgbjEyID0gdGVbIDQgXSwgbjEzID0gdGVbIDggXSwgbjE0ID0gdGVbIDEyIF07XG5cdFx0dmFyIG4yMSA9IHRlWyAxIF0sIG4yMiA9IHRlWyA1IF0sIG4yMyA9IHRlWyA5IF0sIG4yNCA9IHRlWyAxMyBdO1xuXHRcdHZhciBuMzEgPSB0ZVsgMiBdLCBuMzIgPSB0ZVsgNiBdLCBuMzMgPSB0ZVsgMTAgXSwgbjM0ID0gdGVbIDE0IF07XG5cdFx0dmFyIG40MSA9IHRlWyAzIF0sIG40MiA9IHRlWyA3IF0sIG40MyA9IHRlWyAxMSBdLCBuNDQgPSB0ZVsgMTUgXTtcblxuXHRcdC8vVE9ETzogbWFrZSB0aGlzIG1vcmUgZWZmaWNpZW50XG5cdFx0Ly8oIGJhc2VkIG9uIGh0dHA6Ly93d3cuZXVjbGlkZWFuc3BhY2UuY29tL21hdGhzL2FsZ2VicmEvbWF0cml4L2Z1bmN0aW9ucy9pbnZlcnNlL2ZvdXJEL2luZGV4Lmh0bSApXG5cblx0XHRyZXR1cm4gKFxuXHRcdFx0bjQxICogKFxuXHRcdFx0XHQrIG4xNCAqIG4yMyAqIG4zMlxuXHRcdFx0XHQgLSBuMTMgKiBuMjQgKiBuMzJcblx0XHRcdFx0IC0gbjE0ICogbjIyICogbjMzXG5cdFx0XHRcdCArIG4xMiAqIG4yNCAqIG4zM1xuXHRcdFx0XHQgKyBuMTMgKiBuMjIgKiBuMzRcblx0XHRcdFx0IC0gbjEyICogbjIzICogbjM0XG5cdFx0XHQpICtcblx0XHRcdG40MiAqIChcblx0XHRcdFx0KyBuMTEgKiBuMjMgKiBuMzRcblx0XHRcdFx0IC0gbjExICogbjI0ICogbjMzXG5cdFx0XHRcdCArIG4xNCAqIG4yMSAqIG4zM1xuXHRcdFx0XHQgLSBuMTMgKiBuMjEgKiBuMzRcblx0XHRcdFx0ICsgbjEzICogbjI0ICogbjMxXG5cdFx0XHRcdCAtIG4xNCAqIG4yMyAqIG4zMVxuXHRcdFx0KSArXG5cdFx0XHRuNDMgKiAoXG5cdFx0XHRcdCsgbjExICogbjI0ICogbjMyXG5cdFx0XHRcdCAtIG4xMSAqIG4yMiAqIG4zNFxuXHRcdFx0XHQgLSBuMTQgKiBuMjEgKiBuMzJcblx0XHRcdFx0ICsgbjEyICogbjIxICogbjM0XG5cdFx0XHRcdCArIG4xNCAqIG4yMiAqIG4zMVxuXHRcdFx0XHQgLSBuMTIgKiBuMjQgKiBuMzFcblx0XHRcdCkgK1xuXHRcdFx0bjQ0ICogKFxuXHRcdFx0XHQtIG4xMyAqIG4yMiAqIG4zMVxuXHRcdFx0XHQgLSBuMTEgKiBuMjMgKiBuMzJcblx0XHRcdFx0ICsgbjExICogbjIyICogbjMzXG5cdFx0XHRcdCArIG4xMyAqIG4yMSAqIG4zMlxuXHRcdFx0XHQgLSBuMTIgKiBuMjEgKiBuMzNcblx0XHRcdFx0ICsgbjEyICogbjIzICogbjMxXG5cdFx0XHQpXG5cblx0XHQpO1xuXG5cdH0sXG5cblx0dHJhbnNwb3NlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXHRcdHZhciB0bXA7XG5cblx0XHR0bXAgPSB0ZVsgMSBdOyB0ZVsgMSBdID0gdGVbIDQgXTsgdGVbIDQgXSA9IHRtcDtcblx0XHR0bXAgPSB0ZVsgMiBdOyB0ZVsgMiBdID0gdGVbIDggXTsgdGVbIDggXSA9IHRtcDtcblx0XHR0bXAgPSB0ZVsgNiBdOyB0ZVsgNiBdID0gdGVbIDkgXTsgdGVbIDkgXSA9IHRtcDtcblxuXHRcdHRtcCA9IHRlWyAzIF07IHRlWyAzIF0gPSB0ZVsgMTIgXTsgdGVbIDEyIF0gPSB0bXA7XG5cdFx0dG1wID0gdGVbIDcgXTsgdGVbIDcgXSA9IHRlWyAxMyBdOyB0ZVsgMTMgXSA9IHRtcDtcblx0XHR0bXAgPSB0ZVsgMTEgXTsgdGVbIDExIF0gPSB0ZVsgMTQgXTsgdGVbIDE0IF0gPSB0bXA7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFBvc2l0aW9uOiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXG5cdFx0dGVbIDEyIF0gPSB2Lng7XG5cdFx0dGVbIDEzIF0gPSB2Lnk7XG5cdFx0dGVbIDE0IF0gPSB2Lno7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGdldEludmVyc2U6IGZ1bmN0aW9uICggbSwgdGhyb3dPbkRlZ2VuZXJhdGUgKSB7XG5cblx0XHQvLyBiYXNlZCBvbiBodHRwOi8vd3d3LmV1Y2xpZGVhbnNwYWNlLmNvbS9tYXRocy9hbGdlYnJhL21hdHJpeC9mdW5jdGlvbnMvaW52ZXJzZS9mb3VyRC9pbmRleC5odG1cblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzLFxuXHRcdFx0bWUgPSBtLmVsZW1lbnRzLFxuXG5cdFx0XHRuMTEgPSBtZVsgMCBdLCBuMjEgPSBtZVsgMSBdLCBuMzEgPSBtZVsgMiBdLCBuNDEgPSBtZVsgMyBdLFxuXHRcdFx0bjEyID0gbWVbIDQgXSwgbjIyID0gbWVbIDUgXSwgbjMyID0gbWVbIDYgXSwgbjQyID0gbWVbIDcgXSxcblx0XHRcdG4xMyA9IG1lWyA4IF0sIG4yMyA9IG1lWyA5IF0sIG4zMyA9IG1lWyAxMCBdLCBuNDMgPSBtZVsgMTEgXSxcblx0XHRcdG4xNCA9IG1lWyAxMiBdLCBuMjQgPSBtZVsgMTMgXSwgbjM0ID0gbWVbIDE0IF0sIG40NCA9IG1lWyAxNSBdLFxuXG5cdFx0XHR0MTEgPSBuMjMgKiBuMzQgKiBuNDIgLSBuMjQgKiBuMzMgKiBuNDIgKyBuMjQgKiBuMzIgKiBuNDMgLSBuMjIgKiBuMzQgKiBuNDMgLSBuMjMgKiBuMzIgKiBuNDQgKyBuMjIgKiBuMzMgKiBuNDQsXG5cdFx0XHR0MTIgPSBuMTQgKiBuMzMgKiBuNDIgLSBuMTMgKiBuMzQgKiBuNDIgLSBuMTQgKiBuMzIgKiBuNDMgKyBuMTIgKiBuMzQgKiBuNDMgKyBuMTMgKiBuMzIgKiBuNDQgLSBuMTIgKiBuMzMgKiBuNDQsXG5cdFx0XHR0MTMgPSBuMTMgKiBuMjQgKiBuNDIgLSBuMTQgKiBuMjMgKiBuNDIgKyBuMTQgKiBuMjIgKiBuNDMgLSBuMTIgKiBuMjQgKiBuNDMgLSBuMTMgKiBuMjIgKiBuNDQgKyBuMTIgKiBuMjMgKiBuNDQsXG5cdFx0XHR0MTQgPSBuMTQgKiBuMjMgKiBuMzIgLSBuMTMgKiBuMjQgKiBuMzIgLSBuMTQgKiBuMjIgKiBuMzMgKyBuMTIgKiBuMjQgKiBuMzMgKyBuMTMgKiBuMjIgKiBuMzQgLSBuMTIgKiBuMjMgKiBuMzQ7XG5cblx0XHR2YXIgZGV0ID0gbjExICogdDExICsgbjIxICogdDEyICsgbjMxICogdDEzICsgbjQxICogdDE0O1xuXG5cdFx0aWYgKCBkZXQgPT09IDAgKSB7XG5cblx0XHRcdHZhciBtc2cgPSBcIlRIUkVFLk1hdHJpeDQ6IC5nZXRJbnZlcnNlKCkgY2FuJ3QgaW52ZXJ0IG1hdHJpeCwgZGV0ZXJtaW5hbnQgaXMgMFwiO1xuXG5cdFx0XHRpZiAoIHRocm93T25EZWdlbmVyYXRlID09PSB0cnVlICkge1xuXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvciggbXNnICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCBtc2cgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdGhpcy5pZGVudGl0eSgpO1xuXG5cdFx0fVxuXG5cdFx0dmFyIGRldEludiA9IDEgLyBkZXQ7XG5cblx0XHR0ZVsgMCBdID0gdDExICogZGV0SW52O1xuXHRcdHRlWyAxIF0gPSAoIG4yNCAqIG4zMyAqIG40MSAtIG4yMyAqIG4zNCAqIG40MSAtIG4yNCAqIG4zMSAqIG40MyArIG4yMSAqIG4zNCAqIG40MyArIG4yMyAqIG4zMSAqIG40NCAtIG4yMSAqIG4zMyAqIG40NCApICogZGV0SW52O1xuXHRcdHRlWyAyIF0gPSAoIG4yMiAqIG4zNCAqIG40MSAtIG4yNCAqIG4zMiAqIG40MSArIG4yNCAqIG4zMSAqIG40MiAtIG4yMSAqIG4zNCAqIG40MiAtIG4yMiAqIG4zMSAqIG40NCArIG4yMSAqIG4zMiAqIG40NCApICogZGV0SW52O1xuXHRcdHRlWyAzIF0gPSAoIG4yMyAqIG4zMiAqIG40MSAtIG4yMiAqIG4zMyAqIG40MSAtIG4yMyAqIG4zMSAqIG40MiArIG4yMSAqIG4zMyAqIG40MiArIG4yMiAqIG4zMSAqIG40MyAtIG4yMSAqIG4zMiAqIG40MyApICogZGV0SW52O1xuXG5cdFx0dGVbIDQgXSA9IHQxMiAqIGRldEludjtcblx0XHR0ZVsgNSBdID0gKCBuMTMgKiBuMzQgKiBuNDEgLSBuMTQgKiBuMzMgKiBuNDEgKyBuMTQgKiBuMzEgKiBuNDMgLSBuMTEgKiBuMzQgKiBuNDMgLSBuMTMgKiBuMzEgKiBuNDQgKyBuMTEgKiBuMzMgKiBuNDQgKSAqIGRldEludjtcblx0XHR0ZVsgNiBdID0gKCBuMTQgKiBuMzIgKiBuNDEgLSBuMTIgKiBuMzQgKiBuNDEgLSBuMTQgKiBuMzEgKiBuNDIgKyBuMTEgKiBuMzQgKiBuNDIgKyBuMTIgKiBuMzEgKiBuNDQgLSBuMTEgKiBuMzIgKiBuNDQgKSAqIGRldEludjtcblx0XHR0ZVsgNyBdID0gKCBuMTIgKiBuMzMgKiBuNDEgLSBuMTMgKiBuMzIgKiBuNDEgKyBuMTMgKiBuMzEgKiBuNDIgLSBuMTEgKiBuMzMgKiBuNDIgLSBuMTIgKiBuMzEgKiBuNDMgKyBuMTEgKiBuMzIgKiBuNDMgKSAqIGRldEludjtcblxuXHRcdHRlWyA4IF0gPSB0MTMgKiBkZXRJbnY7XG5cdFx0dGVbIDkgXSA9ICggbjE0ICogbjIzICogbjQxIC0gbjEzICogbjI0ICogbjQxIC0gbjE0ICogbjIxICogbjQzICsgbjExICogbjI0ICogbjQzICsgbjEzICogbjIxICogbjQ0IC0gbjExICogbjIzICogbjQ0ICkgKiBkZXRJbnY7XG5cdFx0dGVbIDEwIF0gPSAoIG4xMiAqIG4yNCAqIG40MSAtIG4xNCAqIG4yMiAqIG40MSArIG4xNCAqIG4yMSAqIG40MiAtIG4xMSAqIG4yNCAqIG40MiAtIG4xMiAqIG4yMSAqIG40NCArIG4xMSAqIG4yMiAqIG40NCApICogZGV0SW52O1xuXHRcdHRlWyAxMSBdID0gKCBuMTMgKiBuMjIgKiBuNDEgLSBuMTIgKiBuMjMgKiBuNDEgLSBuMTMgKiBuMjEgKiBuNDIgKyBuMTEgKiBuMjMgKiBuNDIgKyBuMTIgKiBuMjEgKiBuNDMgLSBuMTEgKiBuMjIgKiBuNDMgKSAqIGRldEludjtcblxuXHRcdHRlWyAxMiBdID0gdDE0ICogZGV0SW52O1xuXHRcdHRlWyAxMyBdID0gKCBuMTMgKiBuMjQgKiBuMzEgLSBuMTQgKiBuMjMgKiBuMzEgKyBuMTQgKiBuMjEgKiBuMzMgLSBuMTEgKiBuMjQgKiBuMzMgLSBuMTMgKiBuMjEgKiBuMzQgKyBuMTEgKiBuMjMgKiBuMzQgKSAqIGRldEludjtcblx0XHR0ZVsgMTQgXSA9ICggbjE0ICogbjIyICogbjMxIC0gbjEyICogbjI0ICogbjMxIC0gbjE0ICogbjIxICogbjMyICsgbjExICogbjI0ICogbjMyICsgbjEyICogbjIxICogbjM0IC0gbjExICogbjIyICogbjM0ICkgKiBkZXRJbnY7XG5cdFx0dGVbIDE1IF0gPSAoIG4xMiAqIG4yMyAqIG4zMSAtIG4xMyAqIG4yMiAqIG4zMSArIG4xMyAqIG4yMSAqIG4zMiAtIG4xMSAqIG4yMyAqIG4zMiAtIG4xMiAqIG4yMSAqIG4zMyArIG4xMSAqIG4yMiAqIG4zMyApICogZGV0SW52O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzY2FsZTogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblx0XHR2YXIgeCA9IHYueCwgeSA9IHYueSwgeiA9IHYuejtcblxuXHRcdHRlWyAwIF0gKj0geDsgdGVbIDQgXSAqPSB5OyB0ZVsgOCBdICo9IHo7XG5cdFx0dGVbIDEgXSAqPSB4OyB0ZVsgNSBdICo9IHk7IHRlWyA5IF0gKj0gejtcblx0XHR0ZVsgMiBdICo9IHg7IHRlWyA2IF0gKj0geTsgdGVbIDEwIF0gKj0gejtcblx0XHR0ZVsgMyBdICo9IHg7IHRlWyA3IF0gKj0geTsgdGVbIDExIF0gKj0gejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Z2V0TWF4U2NhbGVPbkF4aXM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHR2YXIgc2NhbGVYU3EgPSB0ZVsgMCBdICogdGVbIDAgXSArIHRlWyAxIF0gKiB0ZVsgMSBdICsgdGVbIDIgXSAqIHRlWyAyIF07XG5cdFx0dmFyIHNjYWxlWVNxID0gdGVbIDQgXSAqIHRlWyA0IF0gKyB0ZVsgNSBdICogdGVbIDUgXSArIHRlWyA2IF0gKiB0ZVsgNiBdO1xuXHRcdHZhciBzY2FsZVpTcSA9IHRlWyA4IF0gKiB0ZVsgOCBdICsgdGVbIDkgXSAqIHRlWyA5IF0gKyB0ZVsgMTAgXSAqIHRlWyAxMCBdO1xuXG5cdFx0cmV0dXJuIE1hdGguc3FydCggTWF0aC5tYXgoIHNjYWxlWFNxLCBzY2FsZVlTcSwgc2NhbGVaU3EgKSApO1xuXG5cdH0sXG5cblx0bWFrZVRyYW5zbGF0aW9uOiBmdW5jdGlvbiAoIHgsIHksIHogKSB7XG5cblx0XHR0aGlzLnNldChcblxuXHRcdFx0MSwgMCwgMCwgeCxcblx0XHRcdDAsIDEsIDAsIHksXG5cdFx0XHQwLCAwLCAxLCB6LFxuXHRcdFx0MCwgMCwgMCwgMVxuXG5cdFx0KTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bWFrZVJvdGF0aW9uWDogZnVuY3Rpb24gKCB0aGV0YSApIHtcblxuXHRcdHZhciBjID0gTWF0aC5jb3MoIHRoZXRhICksIHMgPSBNYXRoLnNpbiggdGhldGEgKTtcblxuXHRcdHRoaXMuc2V0KFxuXG5cdFx0XHQxLCAwLCAwLCAwLFxuXHRcdFx0MCwgYywgLSBzLCAwLFxuXHRcdFx0MCwgcywgYywgMCxcblx0XHRcdDAsIDAsIDAsIDFcblxuXHRcdCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG1ha2VSb3RhdGlvblk6IGZ1bmN0aW9uICggdGhldGEgKSB7XG5cblx0XHR2YXIgYyA9IE1hdGguY29zKCB0aGV0YSApLCBzID0gTWF0aC5zaW4oIHRoZXRhICk7XG5cblx0XHR0aGlzLnNldChcblxuXHRcdFx0IGMsIDAsIHMsIDAsXG5cdFx0XHQgMCwgMSwgMCwgMCxcblx0XHRcdC0gcywgMCwgYywgMCxcblx0XHRcdCAwLCAwLCAwLCAxXG5cblx0XHQpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtYWtlUm90YXRpb25aOiBmdW5jdGlvbiAoIHRoZXRhICkge1xuXG5cdFx0dmFyIGMgPSBNYXRoLmNvcyggdGhldGEgKSwgcyA9IE1hdGguc2luKCB0aGV0YSApO1xuXG5cdFx0dGhpcy5zZXQoXG5cblx0XHRcdGMsIC0gcywgMCwgMCxcblx0XHRcdHMsIGMsIDAsIDAsXG5cdFx0XHQwLCAwLCAxLCAwLFxuXHRcdFx0MCwgMCwgMCwgMVxuXG5cdFx0KTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bWFrZVJvdGF0aW9uQXhpczogZnVuY3Rpb24gKCBheGlzLCBhbmdsZSApIHtcblxuXHRcdC8vIEJhc2VkIG9uIGh0dHA6Ly93d3cuZ2FtZWRldi5uZXQvcmVmZXJlbmNlL2FydGljbGVzL2FydGljbGUxMTk5LmFzcFxuXG5cdFx0dmFyIGMgPSBNYXRoLmNvcyggYW5nbGUgKTtcblx0XHR2YXIgcyA9IE1hdGguc2luKCBhbmdsZSApO1xuXHRcdHZhciB0ID0gMSAtIGM7XG5cdFx0dmFyIHggPSBheGlzLngsIHkgPSBheGlzLnksIHogPSBheGlzLno7XG5cdFx0dmFyIHR4ID0gdCAqIHgsIHR5ID0gdCAqIHk7XG5cblx0XHR0aGlzLnNldChcblxuXHRcdFx0dHggKiB4ICsgYywgdHggKiB5IC0gcyAqIHosIHR4ICogeiArIHMgKiB5LCAwLFxuXHRcdFx0dHggKiB5ICsgcyAqIHosIHR5ICogeSArIGMsIHR5ICogeiAtIHMgKiB4LCAwLFxuXHRcdFx0dHggKiB6IC0gcyAqIHksIHR5ICogeiArIHMgKiB4LCB0ICogeiAqIHogKyBjLCAwLFxuXHRcdFx0MCwgMCwgMCwgMVxuXG5cdFx0KTtcblxuXHRcdCByZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG1ha2VTY2FsZTogZnVuY3Rpb24gKCB4LCB5LCB6ICkge1xuXG5cdFx0dGhpcy5zZXQoXG5cblx0XHRcdHgsIDAsIDAsIDAsXG5cdFx0XHQwLCB5LCAwLCAwLFxuXHRcdFx0MCwgMCwgeiwgMCxcblx0XHRcdDAsIDAsIDAsIDFcblxuXHRcdCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG1ha2VTaGVhcjogZnVuY3Rpb24gKCB4LCB5LCB6ICkge1xuXG5cdFx0dGhpcy5zZXQoXG5cblx0XHRcdDEsIHksIHosIDAsXG5cdFx0XHR4LCAxLCB6LCAwLFxuXHRcdFx0eCwgeSwgMSwgMCxcblx0XHRcdDAsIDAsIDAsIDFcblxuXHRcdCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvbXBvc2U6IGZ1bmN0aW9uICggcG9zaXRpb24sIHF1YXRlcm5pb24sIHNjYWxlICkge1xuXG5cdFx0dGhpcy5tYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbiggcXVhdGVybmlvbiApO1xuXHRcdHRoaXMuc2NhbGUoIHNjYWxlICk7XG5cdFx0dGhpcy5zZXRQb3NpdGlvbiggcG9zaXRpb24gKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZGVjb21wb3NlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdmVjdG9yID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgbWF0cml4ID0gbmV3IE1hdHJpeDQoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBkZWNvbXBvc2UoIHBvc2l0aW9uLCBxdWF0ZXJuaW9uLCBzY2FsZSApIHtcblxuXHRcdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblxuXHRcdFx0dmFyIHN4ID0gdmVjdG9yLnNldCggdGVbIDAgXSwgdGVbIDEgXSwgdGVbIDIgXSApLmxlbmd0aCgpO1xuXHRcdFx0dmFyIHN5ID0gdmVjdG9yLnNldCggdGVbIDQgXSwgdGVbIDUgXSwgdGVbIDYgXSApLmxlbmd0aCgpO1xuXHRcdFx0dmFyIHN6ID0gdmVjdG9yLnNldCggdGVbIDggXSwgdGVbIDkgXSwgdGVbIDEwIF0gKS5sZW5ndGgoKTtcblxuXHRcdFx0Ly8gaWYgZGV0ZXJtaW5lIGlzIG5lZ2F0aXZlLCB3ZSBuZWVkIHRvIGludmVydCBvbmUgc2NhbGVcblx0XHRcdHZhciBkZXQgPSB0aGlzLmRldGVybWluYW50KCk7XG5cdFx0XHRpZiAoIGRldCA8IDAgKSBzeCA9IC0gc3g7XG5cblx0XHRcdHBvc2l0aW9uLnggPSB0ZVsgMTIgXTtcblx0XHRcdHBvc2l0aW9uLnkgPSB0ZVsgMTMgXTtcblx0XHRcdHBvc2l0aW9uLnogPSB0ZVsgMTQgXTtcblxuXHRcdFx0Ly8gc2NhbGUgdGhlIHJvdGF0aW9uIHBhcnRcblx0XHRcdG1hdHJpeC5jb3B5KCB0aGlzICk7XG5cblx0XHRcdHZhciBpbnZTWCA9IDEgLyBzeDtcblx0XHRcdHZhciBpbnZTWSA9IDEgLyBzeTtcblx0XHRcdHZhciBpbnZTWiA9IDEgLyBzejtcblxuXHRcdFx0bWF0cml4LmVsZW1lbnRzWyAwIF0gKj0gaW52U1g7XG5cdFx0XHRtYXRyaXguZWxlbWVudHNbIDEgXSAqPSBpbnZTWDtcblx0XHRcdG1hdHJpeC5lbGVtZW50c1sgMiBdICo9IGludlNYO1xuXG5cdFx0XHRtYXRyaXguZWxlbWVudHNbIDQgXSAqPSBpbnZTWTtcblx0XHRcdG1hdHJpeC5lbGVtZW50c1sgNSBdICo9IGludlNZO1xuXHRcdFx0bWF0cml4LmVsZW1lbnRzWyA2IF0gKj0gaW52U1k7XG5cblx0XHRcdG1hdHJpeC5lbGVtZW50c1sgOCBdICo9IGludlNaO1xuXHRcdFx0bWF0cml4LmVsZW1lbnRzWyA5IF0gKj0gaW52U1o7XG5cdFx0XHRtYXRyaXguZWxlbWVudHNbIDEwIF0gKj0gaW52U1o7XG5cblx0XHRcdHF1YXRlcm5pb24uc2V0RnJvbVJvdGF0aW9uTWF0cml4KCBtYXRyaXggKTtcblxuXHRcdFx0c2NhbGUueCA9IHN4O1xuXHRcdFx0c2NhbGUueSA9IHN5O1xuXHRcdFx0c2NhbGUueiA9IHN6O1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdG1ha2VQZXJzcGVjdGl2ZTogZnVuY3Rpb24gKCBsZWZ0LCByaWdodCwgdG9wLCBib3R0b20sIG5lYXIsIGZhciApIHtcblxuXHRcdGlmICggZmFyID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJpeDQ6IC5tYWtlUGVyc3BlY3RpdmUoKSBoYXMgYmVlbiByZWRlZmluZWQgYW5kIGhhcyBhIG5ldyBzaWduYXR1cmUuIFBsZWFzZSBjaGVjayB0aGUgZG9jcy4nICk7XG5cblx0XHR9XG5cblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXHRcdHZhciB4ID0gMiAqIG5lYXIgLyAoIHJpZ2h0IC0gbGVmdCApO1xuXHRcdHZhciB5ID0gMiAqIG5lYXIgLyAoIHRvcCAtIGJvdHRvbSApO1xuXG5cdFx0dmFyIGEgPSAoIHJpZ2h0ICsgbGVmdCApIC8gKCByaWdodCAtIGxlZnQgKTtcblx0XHR2YXIgYiA9ICggdG9wICsgYm90dG9tICkgLyAoIHRvcCAtIGJvdHRvbSApO1xuXHRcdHZhciBjID0gLSAoIGZhciArIG5lYXIgKSAvICggZmFyIC0gbmVhciApO1xuXHRcdHZhciBkID0gLSAyICogZmFyICogbmVhciAvICggZmFyIC0gbmVhciApO1xuXG5cdFx0dGVbIDAgXSA9IHg7XHR0ZVsgNCBdID0gMDtcdHRlWyA4IF0gPSBhO1x0dGVbIDEyIF0gPSAwO1xuXHRcdHRlWyAxIF0gPSAwO1x0dGVbIDUgXSA9IHk7XHR0ZVsgOSBdID0gYjtcdHRlWyAxMyBdID0gMDtcblx0XHR0ZVsgMiBdID0gMDtcdHRlWyA2IF0gPSAwO1x0dGVbIDEwIF0gPSBjO1x0dGVbIDE0IF0gPSBkO1xuXHRcdHRlWyAzIF0gPSAwO1x0dGVbIDcgXSA9IDA7XHR0ZVsgMTEgXSA9IC0gMTtcdHRlWyAxNSBdID0gMDtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bWFrZU9ydGhvZ3JhcGhpYzogZnVuY3Rpb24gKCBsZWZ0LCByaWdodCwgdG9wLCBib3R0b20sIG5lYXIsIGZhciApIHtcblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cdFx0dmFyIHcgPSAxLjAgLyAoIHJpZ2h0IC0gbGVmdCApO1xuXHRcdHZhciBoID0gMS4wIC8gKCB0b3AgLSBib3R0b20gKTtcblx0XHR2YXIgcCA9IDEuMCAvICggZmFyIC0gbmVhciApO1xuXG5cdFx0dmFyIHggPSAoIHJpZ2h0ICsgbGVmdCApICogdztcblx0XHR2YXIgeSA9ICggdG9wICsgYm90dG9tICkgKiBoO1xuXHRcdHZhciB6ID0gKCBmYXIgKyBuZWFyICkgKiBwO1xuXG5cdFx0dGVbIDAgXSA9IDIgKiB3O1x0dGVbIDQgXSA9IDA7XHR0ZVsgOCBdID0gMDtcdHRlWyAxMiBdID0gLSB4O1xuXHRcdHRlWyAxIF0gPSAwO1x0dGVbIDUgXSA9IDIgKiBoO1x0dGVbIDkgXSA9IDA7XHR0ZVsgMTMgXSA9IC0geTtcblx0XHR0ZVsgMiBdID0gMDtcdHRlWyA2IF0gPSAwO1x0dGVbIDEwIF0gPSAtIDIgKiBwO1x0dGVbIDE0IF0gPSAtIHo7XG5cdFx0dGVbIDMgXSA9IDA7XHR0ZVsgNyBdID0gMDtcdHRlWyAxMSBdID0gMDtcdHRlWyAxNSBdID0gMTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZXF1YWxzOiBmdW5jdGlvbiAoIG1hdHJpeCApIHtcblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cdFx0dmFyIG1lID0gbWF0cml4LmVsZW1lbnRzO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgMTY7IGkgKysgKSB7XG5cblx0XHRcdGlmICggdGVbIGkgXSAhPT0gbWVbIGkgXSApIHJldHVybiBmYWxzZTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXG5cdH0sXG5cblx0ZnJvbUFycmF5OiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7XG5cblx0XHRpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkgb2Zmc2V0ID0gMDtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IDE2OyBpICsrICkge1xuXG5cdFx0XHR0aGlzLmVsZW1lbnRzWyBpIF0gPSBhcnJheVsgaSArIG9mZnNldCBdO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHR0b0FycmF5OiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7XG5cblx0XHRpZiAoIGFycmF5ID09PSB1bmRlZmluZWQgKSBhcnJheSA9IFtdO1xuXHRcdGlmICggb2Zmc2V0ID09PSB1bmRlZmluZWQgKSBvZmZzZXQgPSAwO1xuXG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblxuXHRcdGFycmF5WyBvZmZzZXQgXSA9IHRlWyAwIF07XG5cdFx0YXJyYXlbIG9mZnNldCArIDEgXSA9IHRlWyAxIF07XG5cdFx0YXJyYXlbIG9mZnNldCArIDIgXSA9IHRlWyAyIF07XG5cdFx0YXJyYXlbIG9mZnNldCArIDMgXSA9IHRlWyAzIF07XG5cblx0XHRhcnJheVsgb2Zmc2V0ICsgNCBdID0gdGVbIDQgXTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgNSBdID0gdGVbIDUgXTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgNiBdID0gdGVbIDYgXTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgNyBdID0gdGVbIDcgXTtcblxuXHRcdGFycmF5WyBvZmZzZXQgKyA4IF0gPSB0ZVsgOCBdO1xuXHRcdGFycmF5WyBvZmZzZXQgKyA5IF0gPSB0ZVsgOSBdO1xuXHRcdGFycmF5WyBvZmZzZXQgKyAxMCBdID0gdGVbIDEwIF07XG5cdFx0YXJyYXlbIG9mZnNldCArIDExIF0gPSB0ZVsgMTEgXTtcblxuXHRcdGFycmF5WyBvZmZzZXQgKyAxMiBdID0gdGVbIDEyIF07XG5cdFx0YXJyYXlbIG9mZnNldCArIDEzIF0gPSB0ZVsgMTMgXTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMTQgXSA9IHRlWyAxNCBdO1xuXHRcdGFycmF5WyBvZmZzZXQgKyAxNSBdID0gdGVbIDE1IF07XG5cblx0XHRyZXR1cm4gYXJyYXk7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtaWthZWwgZW10aW5nZXIgLyBodHRwOi8vZ29tby5zZS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqIEBhdXRob3IgYmhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW9cbiAqL1xuXG5mdW5jdGlvbiBRdWF0ZXJuaW9uKCB4LCB5LCB6LCB3ICkge1xuXG5cdHRoaXMuX3ggPSB4IHx8IDA7XG5cdHRoaXMuX3kgPSB5IHx8IDA7XG5cdHRoaXMuX3ogPSB6IHx8IDA7XG5cdHRoaXMuX3cgPSAoIHcgIT09IHVuZGVmaW5lZCApID8gdyA6IDE7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggUXVhdGVybmlvbiwge1xuXG5cdHNsZXJwOiBmdW5jdGlvbiAoIHFhLCBxYiwgcW0sIHQgKSB7XG5cblx0XHRyZXR1cm4gcW0uY29weSggcWEgKS5zbGVycCggcWIsIHQgKTtcblxuXHR9LFxuXG5cdHNsZXJwRmxhdDogZnVuY3Rpb24gKCBkc3QsIGRzdE9mZnNldCwgc3JjMCwgc3JjT2Zmc2V0MCwgc3JjMSwgc3JjT2Zmc2V0MSwgdCApIHtcblxuXHRcdC8vIGZ1enotZnJlZSwgYXJyYXktYmFzZWQgUXVhdGVybmlvbiBTTEVSUCBvcGVyYXRpb25cblxuXHRcdHZhciB4MCA9IHNyYzBbIHNyY09mZnNldDAgKyAwIF0sXG5cdFx0XHR5MCA9IHNyYzBbIHNyY09mZnNldDAgKyAxIF0sXG5cdFx0XHR6MCA9IHNyYzBbIHNyY09mZnNldDAgKyAyIF0sXG5cdFx0XHR3MCA9IHNyYzBbIHNyY09mZnNldDAgKyAzIF0sXG5cblx0XHRcdHgxID0gc3JjMVsgc3JjT2Zmc2V0MSArIDAgXSxcblx0XHRcdHkxID0gc3JjMVsgc3JjT2Zmc2V0MSArIDEgXSxcblx0XHRcdHoxID0gc3JjMVsgc3JjT2Zmc2V0MSArIDIgXSxcblx0XHRcdHcxID0gc3JjMVsgc3JjT2Zmc2V0MSArIDMgXTtcblxuXHRcdGlmICggdzAgIT09IHcxIHx8IHgwICE9PSB4MSB8fCB5MCAhPT0geTEgfHwgejAgIT09IHoxICkge1xuXG5cdFx0XHR2YXIgcyA9IDEgLSB0LFxuXG5cdFx0XHRcdGNvcyA9IHgwICogeDEgKyB5MCAqIHkxICsgejAgKiB6MSArIHcwICogdzEsXG5cblx0XHRcdFx0ZGlyID0gKCBjb3MgPj0gMCA/IDEgOiAtIDEgKSxcblx0XHRcdFx0c3FyU2luID0gMSAtIGNvcyAqIGNvcztcblxuXHRcdFx0Ly8gU2tpcCB0aGUgU2xlcnAgZm9yIHRpbnkgc3RlcHMgdG8gYXZvaWQgbnVtZXJpYyBwcm9ibGVtczpcblx0XHRcdGlmICggc3FyU2luID4gTnVtYmVyLkVQU0lMT04gKSB7XG5cblx0XHRcdFx0dmFyIHNpbiA9IE1hdGguc3FydCggc3FyU2luICksXG5cdFx0XHRcdFx0bGVuID0gTWF0aC5hdGFuMiggc2luLCBjb3MgKiBkaXIgKTtcblxuXHRcdFx0XHRzID0gTWF0aC5zaW4oIHMgKiBsZW4gKSAvIHNpbjtcblx0XHRcdFx0dCA9IE1hdGguc2luKCB0ICogbGVuICkgLyBzaW47XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIHREaXIgPSB0ICogZGlyO1xuXG5cdFx0XHR4MCA9IHgwICogcyArIHgxICogdERpcjtcblx0XHRcdHkwID0geTAgKiBzICsgeTEgKiB0RGlyO1xuXHRcdFx0ejAgPSB6MCAqIHMgKyB6MSAqIHREaXI7XG5cdFx0XHR3MCA9IHcwICogcyArIHcxICogdERpcjtcblxuXHRcdFx0Ly8gTm9ybWFsaXplIGluIGNhc2Ugd2UganVzdCBkaWQgYSBsZXJwOlxuXHRcdFx0aWYgKCBzID09PSAxIC0gdCApIHtcblxuXHRcdFx0XHR2YXIgZiA9IDEgLyBNYXRoLnNxcnQoIHgwICogeDAgKyB5MCAqIHkwICsgejAgKiB6MCArIHcwICogdzAgKTtcblxuXHRcdFx0XHR4MCAqPSBmO1xuXHRcdFx0XHR5MCAqPSBmO1xuXHRcdFx0XHR6MCAqPSBmO1xuXHRcdFx0XHR3MCAqPSBmO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRkc3RbIGRzdE9mZnNldCBdID0geDA7XG5cdFx0ZHN0WyBkc3RPZmZzZXQgKyAxIF0gPSB5MDtcblx0XHRkc3RbIGRzdE9mZnNldCArIDIgXSA9IHowO1xuXHRcdGRzdFsgZHN0T2Zmc2V0ICsgMyBdID0gdzA7XG5cblx0fVxuXG59ICk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBRdWF0ZXJuaW9uLnByb3RvdHlwZSwge1xuXG5cdHg6IHtcblxuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5feDtcblxuXHRcdH0sXG5cblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdHRoaXMuX3ggPSB2YWx1ZTtcblx0XHRcdHRoaXMub25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0eToge1xuXG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLl95O1xuXG5cdFx0fSxcblxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0dGhpcy5feSA9IHZhbHVlO1xuXHRcdFx0dGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHR9XG5cblx0fSxcblxuXHR6OiB7XG5cblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMuX3o7XG5cblx0XHR9LFxuXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHR0aGlzLl96ID0gdmFsdWU7XG5cdFx0XHR0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdHc6IHtcblxuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5fdztcblxuXHRcdH0sXG5cblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdHRoaXMuX3cgPSB2YWx1ZTtcblx0XHRcdHRoaXMub25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdFx0fVxuXG5cdH1cblxufSApO1xuXG5PYmplY3QuYXNzaWduKCBRdWF0ZXJuaW9uLnByb3RvdHlwZSwge1xuXG5cdHNldDogZnVuY3Rpb24gKCB4LCB5LCB6LCB3ICkge1xuXG5cdFx0dGhpcy5feCA9IHg7XG5cdFx0dGhpcy5feSA9IHk7XG5cdFx0dGhpcy5feiA9IHo7XG5cdFx0dGhpcy5fdyA9IHc7XG5cblx0XHR0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvciggdGhpcy5feCwgdGhpcy5feSwgdGhpcy5feiwgdGhpcy5fdyApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBxdWF0ZXJuaW9uICkge1xuXG5cdFx0dGhpcy5feCA9IHF1YXRlcm5pb24ueDtcblx0XHR0aGlzLl95ID0gcXVhdGVybmlvbi55O1xuXHRcdHRoaXMuX3ogPSBxdWF0ZXJuaW9uLno7XG5cdFx0dGhpcy5fdyA9IHF1YXRlcm5pb24udztcblxuXHRcdHRoaXMub25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRGcm9tRXVsZXI6IGZ1bmN0aW9uICggZXVsZXIsIHVwZGF0ZSApIHtcblxuXHRcdGlmICggISAoIGV1bGVyICYmIGV1bGVyLmlzRXVsZXIgKSApIHtcblxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCAnVEhSRUUuUXVhdGVybmlvbjogLnNldEZyb21FdWxlcigpIG5vdyBleHBlY3RzIGFuIEV1bGVyIHJvdGF0aW9uIHJhdGhlciB0aGFuIGEgVmVjdG9yMyBhbmQgb3JkZXIuJyApO1xuXG5cdFx0fVxuXG5cdFx0dmFyIHggPSBldWxlci5feCwgeSA9IGV1bGVyLl95LCB6ID0gZXVsZXIuX3osIG9yZGVyID0gZXVsZXIub3JkZXI7XG5cblx0XHQvLyBodHRwOi8vd3d3Lm1hdGh3b3Jrcy5jb20vbWF0bGFiY2VudHJhbC9maWxlZXhjaGFuZ2UvXG5cdFx0Ly8gXHQyMDY5Ni1mdW5jdGlvbi10by1jb252ZXJ0LWJldHdlZW4tZGNtLWV1bGVyLWFuZ2xlcy1xdWF0ZXJuaW9ucy1hbmQtZXVsZXItdmVjdG9ycy9cblx0XHQvL1x0Y29udGVudC9TcGluQ2FsYy5tXG5cblx0XHR2YXIgY29zID0gTWF0aC5jb3M7XG5cdFx0dmFyIHNpbiA9IE1hdGguc2luO1xuXG5cdFx0dmFyIGMxID0gY29zKCB4IC8gMiApO1xuXHRcdHZhciBjMiA9IGNvcyggeSAvIDIgKTtcblx0XHR2YXIgYzMgPSBjb3MoIHogLyAyICk7XG5cblx0XHR2YXIgczEgPSBzaW4oIHggLyAyICk7XG5cdFx0dmFyIHMyID0gc2luKCB5IC8gMiApO1xuXHRcdHZhciBzMyA9IHNpbiggeiAvIDIgKTtcblxuXHRcdGlmICggb3JkZXIgPT09ICdYWVonICkge1xuXG5cdFx0XHR0aGlzLl94ID0gczEgKiBjMiAqIGMzICsgYzEgKiBzMiAqIHMzO1xuXHRcdFx0dGhpcy5feSA9IGMxICogczIgKiBjMyAtIHMxICogYzIgKiBzMztcblx0XHRcdHRoaXMuX3ogPSBjMSAqIGMyICogczMgKyBzMSAqIHMyICogYzM7XG5cdFx0XHR0aGlzLl93ID0gYzEgKiBjMiAqIGMzIC0gczEgKiBzMiAqIHMzO1xuXG5cdFx0fSBlbHNlIGlmICggb3JkZXIgPT09ICdZWFonICkge1xuXG5cdFx0XHR0aGlzLl94ID0gczEgKiBjMiAqIGMzICsgYzEgKiBzMiAqIHMzO1xuXHRcdFx0dGhpcy5feSA9IGMxICogczIgKiBjMyAtIHMxICogYzIgKiBzMztcblx0XHRcdHRoaXMuX3ogPSBjMSAqIGMyICogczMgLSBzMSAqIHMyICogYzM7XG5cdFx0XHR0aGlzLl93ID0gYzEgKiBjMiAqIGMzICsgczEgKiBzMiAqIHMzO1xuXG5cdFx0fSBlbHNlIGlmICggb3JkZXIgPT09ICdaWFknICkge1xuXG5cdFx0XHR0aGlzLl94ID0gczEgKiBjMiAqIGMzIC0gYzEgKiBzMiAqIHMzO1xuXHRcdFx0dGhpcy5feSA9IGMxICogczIgKiBjMyArIHMxICogYzIgKiBzMztcblx0XHRcdHRoaXMuX3ogPSBjMSAqIGMyICogczMgKyBzMSAqIHMyICogYzM7XG5cdFx0XHR0aGlzLl93ID0gYzEgKiBjMiAqIGMzIC0gczEgKiBzMiAqIHMzO1xuXG5cdFx0fSBlbHNlIGlmICggb3JkZXIgPT09ICdaWVgnICkge1xuXG5cdFx0XHR0aGlzLl94ID0gczEgKiBjMiAqIGMzIC0gYzEgKiBzMiAqIHMzO1xuXHRcdFx0dGhpcy5feSA9IGMxICogczIgKiBjMyArIHMxICogYzIgKiBzMztcblx0XHRcdHRoaXMuX3ogPSBjMSAqIGMyICogczMgLSBzMSAqIHMyICogYzM7XG5cdFx0XHR0aGlzLl93ID0gYzEgKiBjMiAqIGMzICsgczEgKiBzMiAqIHMzO1xuXG5cdFx0fSBlbHNlIGlmICggb3JkZXIgPT09ICdZWlgnICkge1xuXG5cdFx0XHR0aGlzLl94ID0gczEgKiBjMiAqIGMzICsgYzEgKiBzMiAqIHMzO1xuXHRcdFx0dGhpcy5feSA9IGMxICogczIgKiBjMyArIHMxICogYzIgKiBzMztcblx0XHRcdHRoaXMuX3ogPSBjMSAqIGMyICogczMgLSBzMSAqIHMyICogYzM7XG5cdFx0XHR0aGlzLl93ID0gYzEgKiBjMiAqIGMzIC0gczEgKiBzMiAqIHMzO1xuXG5cdFx0fSBlbHNlIGlmICggb3JkZXIgPT09ICdYWlknICkge1xuXG5cdFx0XHR0aGlzLl94ID0gczEgKiBjMiAqIGMzIC0gYzEgKiBzMiAqIHMzO1xuXHRcdFx0dGhpcy5feSA9IGMxICogczIgKiBjMyAtIHMxICogYzIgKiBzMztcblx0XHRcdHRoaXMuX3ogPSBjMSAqIGMyICogczMgKyBzMSAqIHMyICogYzM7XG5cdFx0XHR0aGlzLl93ID0gYzEgKiBjMiAqIGMzICsgczEgKiBzMiAqIHMzO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB1cGRhdGUgIT09IGZhbHNlICkgdGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21BeGlzQW5nbGU6IGZ1bmN0aW9uICggYXhpcywgYW5nbGUgKSB7XG5cblx0XHQvLyBodHRwOi8vd3d3LmV1Y2xpZGVhbnNwYWNlLmNvbS9tYXRocy9nZW9tZXRyeS9yb3RhdGlvbnMvY29udmVyc2lvbnMvYW5nbGVUb1F1YXRlcm5pb24vaW5kZXguaHRtXG5cblx0XHQvLyBhc3N1bWVzIGF4aXMgaXMgbm9ybWFsaXplZFxuXG5cdFx0dmFyIGhhbGZBbmdsZSA9IGFuZ2xlIC8gMiwgcyA9IE1hdGguc2luKCBoYWxmQW5nbGUgKTtcblxuXHRcdHRoaXMuX3ggPSBheGlzLnggKiBzO1xuXHRcdHRoaXMuX3kgPSBheGlzLnkgKiBzO1xuXHRcdHRoaXMuX3ogPSBheGlzLnogKiBzO1xuXHRcdHRoaXMuX3cgPSBNYXRoLmNvcyggaGFsZkFuZ2xlICk7XG5cblx0XHR0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbVJvdGF0aW9uTWF0cml4OiBmdW5jdGlvbiAoIG0gKSB7XG5cblx0XHQvLyBodHRwOi8vd3d3LmV1Y2xpZGVhbnNwYWNlLmNvbS9tYXRocy9nZW9tZXRyeS9yb3RhdGlvbnMvY29udmVyc2lvbnMvbWF0cml4VG9RdWF0ZXJuaW9uL2luZGV4Lmh0bVxuXG5cdFx0Ly8gYXNzdW1lcyB0aGUgdXBwZXIgM3gzIG9mIG0gaXMgYSBwdXJlIHJvdGF0aW9uIG1hdHJpeCAoaS5lLCB1bnNjYWxlZClcblxuXHRcdHZhciB0ZSA9IG0uZWxlbWVudHMsXG5cblx0XHRcdG0xMSA9IHRlWyAwIF0sIG0xMiA9IHRlWyA0IF0sIG0xMyA9IHRlWyA4IF0sXG5cdFx0XHRtMjEgPSB0ZVsgMSBdLCBtMjIgPSB0ZVsgNSBdLCBtMjMgPSB0ZVsgOSBdLFxuXHRcdFx0bTMxID0gdGVbIDIgXSwgbTMyID0gdGVbIDYgXSwgbTMzID0gdGVbIDEwIF0sXG5cblx0XHRcdHRyYWNlID0gbTExICsgbTIyICsgbTMzLFxuXHRcdFx0cztcblxuXHRcdGlmICggdHJhY2UgPiAwICkge1xuXG5cdFx0XHRzID0gMC41IC8gTWF0aC5zcXJ0KCB0cmFjZSArIDEuMCApO1xuXG5cdFx0XHR0aGlzLl93ID0gMC4yNSAvIHM7XG5cdFx0XHR0aGlzLl94ID0gKCBtMzIgLSBtMjMgKSAqIHM7XG5cdFx0XHR0aGlzLl95ID0gKCBtMTMgLSBtMzEgKSAqIHM7XG5cdFx0XHR0aGlzLl96ID0gKCBtMjEgLSBtMTIgKSAqIHM7XG5cblx0XHR9IGVsc2UgaWYgKCBtMTEgPiBtMjIgJiYgbTExID4gbTMzICkge1xuXG5cdFx0XHRzID0gMi4wICogTWF0aC5zcXJ0KCAxLjAgKyBtMTEgLSBtMjIgLSBtMzMgKTtcblxuXHRcdFx0dGhpcy5fdyA9ICggbTMyIC0gbTIzICkgLyBzO1xuXHRcdFx0dGhpcy5feCA9IDAuMjUgKiBzO1xuXHRcdFx0dGhpcy5feSA9ICggbTEyICsgbTIxICkgLyBzO1xuXHRcdFx0dGhpcy5feiA9ICggbTEzICsgbTMxICkgLyBzO1xuXG5cdFx0fSBlbHNlIGlmICggbTIyID4gbTMzICkge1xuXG5cdFx0XHRzID0gMi4wICogTWF0aC5zcXJ0KCAxLjAgKyBtMjIgLSBtMTEgLSBtMzMgKTtcblxuXHRcdFx0dGhpcy5fdyA9ICggbTEzIC0gbTMxICkgLyBzO1xuXHRcdFx0dGhpcy5feCA9ICggbTEyICsgbTIxICkgLyBzO1xuXHRcdFx0dGhpcy5feSA9IDAuMjUgKiBzO1xuXHRcdFx0dGhpcy5feiA9ICggbTIzICsgbTMyICkgLyBzO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0cyA9IDIuMCAqIE1hdGguc3FydCggMS4wICsgbTMzIC0gbTExIC0gbTIyICk7XG5cblx0XHRcdHRoaXMuX3cgPSAoIG0yMSAtIG0xMiApIC8gcztcblx0XHRcdHRoaXMuX3ggPSAoIG0xMyArIG0zMSApIC8gcztcblx0XHRcdHRoaXMuX3kgPSAoIG0yMyArIG0zMiApIC8gcztcblx0XHRcdHRoaXMuX3ogPSAwLjI1ICogcztcblxuXHRcdH1cblxuXHRcdHRoaXMub25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRGcm9tVW5pdFZlY3RvcnM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIGFzc3VtZXMgZGlyZWN0aW9uIHZlY3RvcnMgdkZyb20gYW5kIHZUbyBhcmUgbm9ybWFsaXplZFxuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgcjtcblxuXHRcdHZhciBFUFMgPSAwLjAwMDAwMTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBzZXRGcm9tVW5pdFZlY3RvcnMoIHZGcm9tLCB2VG8gKSB7XG5cblx0XHRcdGlmICggdjEgPT09IHVuZGVmaW5lZCApIHYxID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdFx0ciA9IHZGcm9tLmRvdCggdlRvICkgKyAxO1xuXG5cdFx0XHRpZiAoIHIgPCBFUFMgKSB7XG5cblx0XHRcdFx0ciA9IDA7XG5cblx0XHRcdFx0aWYgKCBNYXRoLmFicyggdkZyb20ueCApID4gTWF0aC5hYnMoIHZGcm9tLnogKSApIHtcblxuXHRcdFx0XHRcdHYxLnNldCggLSB2RnJvbS55LCB2RnJvbS54LCAwICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdHYxLnNldCggMCwgLSB2RnJvbS56LCB2RnJvbS55ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHYxLmNyb3NzVmVjdG9ycyggdkZyb20sIHZUbyApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuX3ggPSB2MS54O1xuXHRcdFx0dGhpcy5feSA9IHYxLnk7XG5cdFx0XHR0aGlzLl96ID0gdjEuejtcblx0XHRcdHRoaXMuX3cgPSByO1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5ub3JtYWxpemUoKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGludmVyc2U6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIHF1YXRlcm5pb24gaXMgYXNzdW1lZCB0byBoYXZlIHVuaXQgbGVuZ3RoXG5cblx0XHRyZXR1cm4gdGhpcy5jb25qdWdhdGUoKTtcblxuXHR9LFxuXG5cdGNvbmp1Z2F0ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5feCAqPSAtIDE7XG5cdFx0dGhpcy5feSAqPSAtIDE7XG5cdFx0dGhpcy5feiAqPSAtIDE7XG5cblx0XHR0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZG90OiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5feCAqIHYuX3ggKyB0aGlzLl95ICogdi5feSArIHRoaXMuX3ogKiB2Ll96ICsgdGhpcy5fdyAqIHYuX3c7XG5cblx0fSxcblxuXHRsZW5ndGhTcTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuX3ggKiB0aGlzLl94ICsgdGhpcy5feSAqIHRoaXMuX3kgKyB0aGlzLl96ICogdGhpcy5feiArIHRoaXMuX3cgKiB0aGlzLl93O1xuXG5cdH0sXG5cblx0bGVuZ3RoOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gTWF0aC5zcXJ0KCB0aGlzLl94ICogdGhpcy5feCArIHRoaXMuX3kgKiB0aGlzLl95ICsgdGhpcy5feiAqIHRoaXMuX3ogKyB0aGlzLl93ICogdGhpcy5fdyApO1xuXG5cdH0sXG5cblx0bm9ybWFsaXplOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgbCA9IHRoaXMubGVuZ3RoKCk7XG5cblx0XHRpZiAoIGwgPT09IDAgKSB7XG5cblx0XHRcdHRoaXMuX3ggPSAwO1xuXHRcdFx0dGhpcy5feSA9IDA7XG5cdFx0XHR0aGlzLl96ID0gMDtcblx0XHRcdHRoaXMuX3cgPSAxO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0bCA9IDEgLyBsO1xuXG5cdFx0XHR0aGlzLl94ID0gdGhpcy5feCAqIGw7XG5cdFx0XHR0aGlzLl95ID0gdGhpcy5feSAqIGw7XG5cdFx0XHR0aGlzLl96ID0gdGhpcy5feiAqIGw7XG5cdFx0XHR0aGlzLl93ID0gdGhpcy5fdyAqIGw7XG5cblx0XHR9XG5cblx0XHR0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bXVsdGlwbHk6IGZ1bmN0aW9uICggcSwgcCApIHtcblxuXHRcdGlmICggcCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5RdWF0ZXJuaW9uOiAubXVsdGlwbHkoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5tdWx0aXBseVF1YXRlcm5pb25zKCBhLCBiICkgaW5zdGVhZC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5tdWx0aXBseVF1YXRlcm5pb25zKCBxLCBwICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5tdWx0aXBseVF1YXRlcm5pb25zKCB0aGlzLCBxICk7XG5cblx0fSxcblxuXHRwcmVtdWx0aXBseTogZnVuY3Rpb24gKCBxICkge1xuXG5cdFx0cmV0dXJuIHRoaXMubXVsdGlwbHlRdWF0ZXJuaW9ucyggcSwgdGhpcyApO1xuXG5cdH0sXG5cblx0bXVsdGlwbHlRdWF0ZXJuaW9uczogZnVuY3Rpb24gKCBhLCBiICkge1xuXG5cdFx0Ly8gZnJvbSBodHRwOi8vd3d3LmV1Y2xpZGVhbnNwYWNlLmNvbS9tYXRocy9hbGdlYnJhL3JlYWxOb3JtZWRBbGdlYnJhL3F1YXRlcm5pb25zL2NvZGUvaW5kZXguaHRtXG5cblx0XHR2YXIgcWF4ID0gYS5feCwgcWF5ID0gYS5feSwgcWF6ID0gYS5feiwgcWF3ID0gYS5fdztcblx0XHR2YXIgcWJ4ID0gYi5feCwgcWJ5ID0gYi5feSwgcWJ6ID0gYi5feiwgcWJ3ID0gYi5fdztcblxuXHRcdHRoaXMuX3ggPSBxYXggKiBxYncgKyBxYXcgKiBxYnggKyBxYXkgKiBxYnogLSBxYXogKiBxYnk7XG5cdFx0dGhpcy5feSA9IHFheSAqIHFidyArIHFhdyAqIHFieSArIHFheiAqIHFieCAtIHFheCAqIHFiejtcblx0XHR0aGlzLl96ID0gcWF6ICogcWJ3ICsgcWF3ICogcWJ6ICsgcWF4ICogcWJ5IC0gcWF5ICogcWJ4O1xuXHRcdHRoaXMuX3cgPSBxYXcgKiBxYncgLSBxYXggKiBxYnggLSBxYXkgKiBxYnkgLSBxYXogKiBxYno7XG5cblx0XHR0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2xlcnA6IGZ1bmN0aW9uICggcWIsIHQgKSB7XG5cblx0XHRpZiAoIHQgPT09IDAgKSByZXR1cm4gdGhpcztcblx0XHRpZiAoIHQgPT09IDEgKSByZXR1cm4gdGhpcy5jb3B5KCBxYiApO1xuXG5cdFx0dmFyIHggPSB0aGlzLl94LCB5ID0gdGhpcy5feSwgeiA9IHRoaXMuX3osIHcgPSB0aGlzLl93O1xuXG5cdFx0Ly8gaHR0cDovL3d3dy5ldWNsaWRlYW5zcGFjZS5jb20vbWF0aHMvYWxnZWJyYS9yZWFsTm9ybWVkQWxnZWJyYS9xdWF0ZXJuaW9ucy9zbGVycC9cblxuXHRcdHZhciBjb3NIYWxmVGhldGEgPSB3ICogcWIuX3cgKyB4ICogcWIuX3ggKyB5ICogcWIuX3kgKyB6ICogcWIuX3o7XG5cblx0XHRpZiAoIGNvc0hhbGZUaGV0YSA8IDAgKSB7XG5cblx0XHRcdHRoaXMuX3cgPSAtIHFiLl93O1xuXHRcdFx0dGhpcy5feCA9IC0gcWIuX3g7XG5cdFx0XHR0aGlzLl95ID0gLSBxYi5feTtcblx0XHRcdHRoaXMuX3ogPSAtIHFiLl96O1xuXG5cdFx0XHRjb3NIYWxmVGhldGEgPSAtIGNvc0hhbGZUaGV0YTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHRoaXMuY29weSggcWIgKTtcblxuXHRcdH1cblxuXHRcdGlmICggY29zSGFsZlRoZXRhID49IDEuMCApIHtcblxuXHRcdFx0dGhpcy5fdyA9IHc7XG5cdFx0XHR0aGlzLl94ID0geDtcblx0XHRcdHRoaXMuX3kgPSB5O1xuXHRcdFx0dGhpcy5feiA9IHo7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fVxuXG5cdFx0dmFyIHNpbkhhbGZUaGV0YSA9IE1hdGguc3FydCggMS4wIC0gY29zSGFsZlRoZXRhICogY29zSGFsZlRoZXRhICk7XG5cblx0XHRpZiAoIE1hdGguYWJzKCBzaW5IYWxmVGhldGEgKSA8IDAuMDAxICkge1xuXG5cdFx0XHR0aGlzLl93ID0gMC41ICogKCB3ICsgdGhpcy5fdyApO1xuXHRcdFx0dGhpcy5feCA9IDAuNSAqICggeCArIHRoaXMuX3ggKTtcblx0XHRcdHRoaXMuX3kgPSAwLjUgKiAoIHkgKyB0aGlzLl95ICk7XG5cdFx0XHR0aGlzLl96ID0gMC41ICogKCB6ICsgdGhpcy5feiApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH1cblxuXHRcdHZhciBoYWxmVGhldGEgPSBNYXRoLmF0YW4yKCBzaW5IYWxmVGhldGEsIGNvc0hhbGZUaGV0YSApO1xuXHRcdHZhciByYXRpb0EgPSBNYXRoLnNpbiggKCAxIC0gdCApICogaGFsZlRoZXRhICkgLyBzaW5IYWxmVGhldGEsXG5cdFx0XHRyYXRpb0IgPSBNYXRoLnNpbiggdCAqIGhhbGZUaGV0YSApIC8gc2luSGFsZlRoZXRhO1xuXG5cdFx0dGhpcy5fdyA9ICggdyAqIHJhdGlvQSArIHRoaXMuX3cgKiByYXRpb0IgKTtcblx0XHR0aGlzLl94ID0gKCB4ICogcmF0aW9BICsgdGhpcy5feCAqIHJhdGlvQiApO1xuXHRcdHRoaXMuX3kgPSAoIHkgKiByYXRpb0EgKyB0aGlzLl95ICogcmF0aW9CICk7XG5cdFx0dGhpcy5feiA9ICggeiAqIHJhdGlvQSArIHRoaXMuX3ogKiByYXRpb0IgKTtcblxuXHRcdHRoaXMub25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRlcXVhbHM6IGZ1bmN0aW9uICggcXVhdGVybmlvbiApIHtcblxuXHRcdHJldHVybiAoIHF1YXRlcm5pb24uX3ggPT09IHRoaXMuX3ggKSAmJiAoIHF1YXRlcm5pb24uX3kgPT09IHRoaXMuX3kgKSAmJiAoIHF1YXRlcm5pb24uX3ogPT09IHRoaXMuX3ogKSAmJiAoIHF1YXRlcm5pb24uX3cgPT09IHRoaXMuX3cgKTtcblxuXHR9LFxuXG5cdGZyb21BcnJheTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkge1xuXG5cdFx0aWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7XG5cblx0XHR0aGlzLl94ID0gYXJyYXlbIG9mZnNldCBdO1xuXHRcdHRoaXMuX3kgPSBhcnJheVsgb2Zmc2V0ICsgMSBdO1xuXHRcdHRoaXMuX3ogPSBhcnJheVsgb2Zmc2V0ICsgMiBdO1xuXHRcdHRoaXMuX3cgPSBhcnJheVsgb2Zmc2V0ICsgMyBdO1xuXG5cdFx0dGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHRvQXJyYXk6IGZ1bmN0aW9uICggYXJyYXksIG9mZnNldCApIHtcblxuXHRcdGlmICggYXJyYXkgPT09IHVuZGVmaW5lZCApIGFycmF5ID0gW107XG5cdFx0aWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7XG5cblx0XHRhcnJheVsgb2Zmc2V0IF0gPSB0aGlzLl94O1xuXHRcdGFycmF5WyBvZmZzZXQgKyAxIF0gPSB0aGlzLl95O1xuXHRcdGFycmF5WyBvZmZzZXQgKyAyIF0gPSB0aGlzLl96O1xuXHRcdGFycmF5WyBvZmZzZXQgKyAzIF0gPSB0aGlzLl93O1xuXG5cdFx0cmV0dXJuIGFycmF5O1xuXG5cdH0sXG5cblx0b25DaGFuZ2U6IGZ1bmN0aW9uICggY2FsbGJhY2sgKSB7XG5cblx0XHR0aGlzLm9uQ2hhbmdlQ2FsbGJhY2sgPSBjYWxsYmFjaztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0b25DaGFuZ2VDYWxsYmFjazogZnVuY3Rpb24gKCkge31cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIGtpbGUgLyBodHRwOi8va2lsZS5zdHJhdmFnYW56YS5vcmcvXG4gKiBAYXV0aG9yIHBoaWxvZ2IgLyBodHRwOi8vYmxvZy50aGVqaXQub3JnL1xuICogQGF1dGhvciBtaWthZWwgZW10aW5nZXIgLyBodHRwOi8vZ29tby5zZS9cbiAqIEBhdXRob3IgZWdyYWV0aGVyIC8gaHR0cDovL2VncmFldGhlci5jb20vXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqL1xuXG5mdW5jdGlvbiBWZWN0b3IzKCB4LCB5LCB6ICkge1xuXG5cdHRoaXMueCA9IHggfHwgMDtcblx0dGhpcy55ID0geSB8fCAwO1xuXHR0aGlzLnogPSB6IHx8IDA7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggVmVjdG9yMy5wcm90b3R5cGUsIHtcblxuXHRpc1ZlY3RvcjM6IHRydWUsXG5cblx0c2V0OiBmdW5jdGlvbiAoIHgsIHksIHogKSB7XG5cblx0XHR0aGlzLnggPSB4O1xuXHRcdHRoaXMueSA9IHk7XG5cdFx0dGhpcy56ID0gejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0U2NhbGFyOiBmdW5jdGlvbiAoIHNjYWxhciApIHtcblxuXHRcdHRoaXMueCA9IHNjYWxhcjtcblx0XHR0aGlzLnkgPSBzY2FsYXI7XG5cdFx0dGhpcy56ID0gc2NhbGFyO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRYOiBmdW5jdGlvbiAoIHggKSB7XG5cblx0XHR0aGlzLnggPSB4O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRZOiBmdW5jdGlvbiAoIHkgKSB7XG5cblx0XHR0aGlzLnkgPSB5O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRaOiBmdW5jdGlvbiAoIHogKSB7XG5cblx0XHR0aGlzLnogPSB6O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRDb21wb25lbnQ6IGZ1bmN0aW9uICggaW5kZXgsIHZhbHVlICkge1xuXG5cdFx0c3dpdGNoICggaW5kZXggKSB7XG5cblx0XHRcdGNhc2UgMDogdGhpcy54ID0gdmFsdWU7IGJyZWFrO1xuXHRcdFx0Y2FzZSAxOiB0aGlzLnkgPSB2YWx1ZTsgYnJlYWs7XG5cdFx0XHRjYXNlIDI6IHRoaXMueiA9IHZhbHVlOyBicmVhaztcblx0XHRcdGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvciggJ2luZGV4IGlzIG91dCBvZiByYW5nZTogJyArIGluZGV4ICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGdldENvbXBvbmVudDogZnVuY3Rpb24gKCBpbmRleCApIHtcblxuXHRcdHN3aXRjaCAoIGluZGV4ICkge1xuXG5cdFx0XHRjYXNlIDA6IHJldHVybiB0aGlzLng7XG5cdFx0XHRjYXNlIDE6IHJldHVybiB0aGlzLnk7XG5cdFx0XHRjYXNlIDI6IHJldHVybiB0aGlzLno7XG5cdFx0XHRkZWZhdWx0OiB0aHJvdyBuZXcgRXJyb3IoICdpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICcgKyBpbmRleCApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvciggdGhpcy54LCB0aGlzLnksIHRoaXMueiApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0dGhpcy54ID0gdi54O1xuXHRcdHRoaXMueSA9IHYueTtcblx0XHR0aGlzLnogPSB2Lno7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGFkZDogZnVuY3Rpb24gKCB2LCB3ICkge1xuXG5cdFx0aWYgKCB3ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjM6IC5hZGQoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5hZGRWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5hZGRWZWN0b3JzKCB2LCB3ICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLnggKz0gdi54O1xuXHRcdHRoaXMueSArPSB2Lnk7XG5cdFx0dGhpcy56ICs9IHYuejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YWRkU2NhbGFyOiBmdW5jdGlvbiAoIHMgKSB7XG5cblx0XHR0aGlzLnggKz0gcztcblx0XHR0aGlzLnkgKz0gcztcblx0XHR0aGlzLnogKz0gcztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YWRkVmVjdG9yczogZnVuY3Rpb24gKCBhLCBiICkge1xuXG5cdFx0dGhpcy54ID0gYS54ICsgYi54O1xuXHRcdHRoaXMueSA9IGEueSArIGIueTtcblx0XHR0aGlzLnogPSBhLnogKyBiLno7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGFkZFNjYWxlZFZlY3RvcjogZnVuY3Rpb24gKCB2LCBzICkge1xuXG5cdFx0dGhpcy54ICs9IHYueCAqIHM7XG5cdFx0dGhpcy55ICs9IHYueSAqIHM7XG5cdFx0dGhpcy56ICs9IHYueiAqIHM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHN1YjogZnVuY3Rpb24gKCB2LCB3ICkge1xuXG5cdFx0aWYgKCB3ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjM6IC5zdWIoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5zdWJWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5zdWJWZWN0b3JzKCB2LCB3ICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLnggLT0gdi54O1xuXHRcdHRoaXMueSAtPSB2Lnk7XG5cdFx0dGhpcy56IC09IHYuejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c3ViU2NhbGFyOiBmdW5jdGlvbiAoIHMgKSB7XG5cblx0XHR0aGlzLnggLT0gcztcblx0XHR0aGlzLnkgLT0gcztcblx0XHR0aGlzLnogLT0gcztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c3ViVmVjdG9yczogZnVuY3Rpb24gKCBhLCBiICkge1xuXG5cdFx0dGhpcy54ID0gYS54IC0gYi54O1xuXHRcdHRoaXMueSA9IGEueSAtIGIueTtcblx0XHR0aGlzLnogPSBhLnogLSBiLno7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG11bHRpcGx5OiBmdW5jdGlvbiAoIHYsIHcgKSB7XG5cblx0XHRpZiAoIHcgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yMzogLm11bHRpcGx5KCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAubXVsdGlwbHlWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5tdWx0aXBseVZlY3RvcnMoIHYsIHcgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMueCAqPSB2Lng7XG5cdFx0dGhpcy55ICo9IHYueTtcblx0XHR0aGlzLnogKj0gdi56O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtdWx0aXBseVNjYWxhcjogZnVuY3Rpb24gKCBzY2FsYXIgKSB7XG5cblx0XHR0aGlzLnggKj0gc2NhbGFyO1xuXHRcdHRoaXMueSAqPSBzY2FsYXI7XG5cdFx0dGhpcy56ICo9IHNjYWxhcjtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bXVsdGlwbHlWZWN0b3JzOiBmdW5jdGlvbiAoIGEsIGIgKSB7XG5cblx0XHR0aGlzLnggPSBhLnggKiBiLng7XG5cdFx0dGhpcy55ID0gYS55ICogYi55O1xuXHRcdHRoaXMueiA9IGEueiAqIGIuejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YXBwbHlFdWxlcjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHF1YXRlcm5pb24gPSBuZXcgUXVhdGVybmlvbigpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGFwcGx5RXVsZXIoIGV1bGVyICkge1xuXG5cdFx0XHRpZiAoICEgKCBldWxlciAmJiBldWxlci5pc0V1bGVyICkgKSB7XG5cblx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlZlY3RvcjM6IC5hcHBseUV1bGVyKCkgbm93IGV4cGVjdHMgYW4gRXVsZXIgcm90YXRpb24gcmF0aGVyIHRoYW4gYSBWZWN0b3IzIGFuZCBvcmRlci4nICk7XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRoaXMuYXBwbHlRdWF0ZXJuaW9uKCBxdWF0ZXJuaW9uLnNldEZyb21FdWxlciggZXVsZXIgKSApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0YXBwbHlBeGlzQW5nbGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBxdWF0ZXJuaW9uID0gbmV3IFF1YXRlcm5pb24oKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBhcHBseUF4aXNBbmdsZSggYXhpcywgYW5nbGUgKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLmFwcGx5UXVhdGVybmlvbiggcXVhdGVybmlvbi5zZXRGcm9tQXhpc0FuZ2xlKCBheGlzLCBhbmdsZSApICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRhcHBseU1hdHJpeDM6IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdHZhciB4ID0gdGhpcy54LCB5ID0gdGhpcy55LCB6ID0gdGhpcy56O1xuXHRcdHZhciBlID0gbS5lbGVtZW50cztcblxuXHRcdHRoaXMueCA9IGVbIDAgXSAqIHggKyBlWyAzIF0gKiB5ICsgZVsgNiBdICogejtcblx0XHR0aGlzLnkgPSBlWyAxIF0gKiB4ICsgZVsgNCBdICogeSArIGVbIDcgXSAqIHo7XG5cdFx0dGhpcy56ID0gZVsgMiBdICogeCArIGVbIDUgXSAqIHkgKyBlWyA4IF0gKiB6O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRhcHBseU1hdHJpeDQ6IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdHZhciB4ID0gdGhpcy54LCB5ID0gdGhpcy55LCB6ID0gdGhpcy56O1xuXHRcdHZhciBlID0gbS5lbGVtZW50cztcblxuXHRcdHZhciB3ID0gMSAvICggZVsgMyBdICogeCArIGVbIDcgXSAqIHkgKyBlWyAxMSBdICogeiArIGVbIDE1IF0gKTtcblxuXHRcdHRoaXMueCA9ICggZVsgMCBdICogeCArIGVbIDQgXSAqIHkgKyBlWyA4IF0gKiB6ICsgZVsgMTIgXSApICogdztcblx0XHR0aGlzLnkgPSAoIGVbIDEgXSAqIHggKyBlWyA1IF0gKiB5ICsgZVsgOSBdICogeiArIGVbIDEzIF0gKSAqIHc7XG5cdFx0dGhpcy56ID0gKCBlWyAyIF0gKiB4ICsgZVsgNiBdICogeSArIGVbIDEwIF0gKiB6ICsgZVsgMTQgXSApICogdztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YXBwbHlRdWF0ZXJuaW9uOiBmdW5jdGlvbiAoIHEgKSB7XG5cblx0XHR2YXIgeCA9IHRoaXMueCwgeSA9IHRoaXMueSwgeiA9IHRoaXMuejtcblx0XHR2YXIgcXggPSBxLngsIHF5ID0gcS55LCBxeiA9IHEueiwgcXcgPSBxLnc7XG5cblx0XHQvLyBjYWxjdWxhdGUgcXVhdCAqIHZlY3RvclxuXG5cdFx0dmFyIGl4ID0gcXcgKiB4ICsgcXkgKiB6IC0gcXogKiB5O1xuXHRcdHZhciBpeSA9IHF3ICogeSArIHF6ICogeCAtIHF4ICogejtcblx0XHR2YXIgaXogPSBxdyAqIHogKyBxeCAqIHkgLSBxeSAqIHg7XG5cdFx0dmFyIGl3ID0gLSBxeCAqIHggLSBxeSAqIHkgLSBxeiAqIHo7XG5cblx0XHQvLyBjYWxjdWxhdGUgcmVzdWx0ICogaW52ZXJzZSBxdWF0XG5cblx0XHR0aGlzLnggPSBpeCAqIHF3ICsgaXcgKiAtIHF4ICsgaXkgKiAtIHF6IC0gaXogKiAtIHF5O1xuXHRcdHRoaXMueSA9IGl5ICogcXcgKyBpdyAqIC0gcXkgKyBpeiAqIC0gcXggLSBpeCAqIC0gcXo7XG5cdFx0dGhpcy56ID0gaXogKiBxdyArIGl3ICogLSBxeiArIGl4ICogLSBxeSAtIGl5ICogLSBxeDtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0cHJvamVjdDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIG1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gcHJvamVjdCggY2FtZXJhICkge1xuXG5cdFx0XHRtYXRyaXgubXVsdGlwbHlNYXRyaWNlcyggY2FtZXJhLnByb2plY3Rpb25NYXRyaXgsIG1hdHJpeC5nZXRJbnZlcnNlKCBjYW1lcmEubWF0cml4V29ybGQgKSApO1xuXHRcdFx0cmV0dXJuIHRoaXMuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHVucHJvamVjdDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIG1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gdW5wcm9qZWN0KCBjYW1lcmEgKSB7XG5cblx0XHRcdG1hdHJpeC5tdWx0aXBseU1hdHJpY2VzKCBjYW1lcmEubWF0cml4V29ybGQsIG1hdHJpeC5nZXRJbnZlcnNlKCBjYW1lcmEucHJvamVjdGlvbk1hdHJpeCApICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5hcHBseU1hdHJpeDQoIG1hdHJpeCApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0dHJhbnNmb3JtRGlyZWN0aW9uOiBmdW5jdGlvbiAoIG0gKSB7XG5cblx0XHQvLyBpbnB1dDogVEhSRUUuTWF0cml4NCBhZmZpbmUgbWF0cml4XG5cdFx0Ly8gdmVjdG9yIGludGVycHJldGVkIGFzIGEgZGlyZWN0aW9uXG5cblx0XHR2YXIgeCA9IHRoaXMueCwgeSA9IHRoaXMueSwgeiA9IHRoaXMuejtcblx0XHR2YXIgZSA9IG0uZWxlbWVudHM7XG5cblx0XHR0aGlzLnggPSBlWyAwIF0gKiB4ICsgZVsgNCBdICogeSArIGVbIDggXSAqIHo7XG5cdFx0dGhpcy55ID0gZVsgMSBdICogeCArIGVbIDUgXSAqIHkgKyBlWyA5IF0gKiB6O1xuXHRcdHRoaXMueiA9IGVbIDIgXSAqIHggKyBlWyA2IF0gKiB5ICsgZVsgMTAgXSAqIHo7XG5cblx0XHRyZXR1cm4gdGhpcy5ub3JtYWxpemUoKTtcblxuXHR9LFxuXG5cdGRpdmlkZTogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0dGhpcy54IC89IHYueDtcblx0XHR0aGlzLnkgLz0gdi55O1xuXHRcdHRoaXMueiAvPSB2Lno7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGRpdmlkZVNjYWxhcjogZnVuY3Rpb24gKCBzY2FsYXIgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5tdWx0aXBseVNjYWxhciggMSAvIHNjYWxhciApO1xuXG5cdH0sXG5cblx0bWluOiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHR0aGlzLnggPSBNYXRoLm1pbiggdGhpcy54LCB2LnggKTtcblx0XHR0aGlzLnkgPSBNYXRoLm1pbiggdGhpcy55LCB2LnkgKTtcblx0XHR0aGlzLnogPSBNYXRoLm1pbiggdGhpcy56LCB2LnogKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bWF4OiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHR0aGlzLnggPSBNYXRoLm1heCggdGhpcy54LCB2LnggKTtcblx0XHR0aGlzLnkgPSBNYXRoLm1heCggdGhpcy55LCB2LnkgKTtcblx0XHR0aGlzLnogPSBNYXRoLm1heCggdGhpcy56LCB2LnogKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xhbXA6IGZ1bmN0aW9uICggbWluLCBtYXggKSB7XG5cblx0XHQvLyBhc3N1bWVzIG1pbiA8IG1heCwgY29tcG9uZW50d2lzZVxuXG5cdFx0dGhpcy54ID0gTWF0aC5tYXgoIG1pbi54LCBNYXRoLm1pbiggbWF4LngsIHRoaXMueCApICk7XG5cdFx0dGhpcy55ID0gTWF0aC5tYXgoIG1pbi55LCBNYXRoLm1pbiggbWF4LnksIHRoaXMueSApICk7XG5cdFx0dGhpcy56ID0gTWF0aC5tYXgoIG1pbi56LCBNYXRoLm1pbiggbWF4LnosIHRoaXMueiApICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNsYW1wU2NhbGFyOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgbWluID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgbWF4ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBjbGFtcFNjYWxhciggbWluVmFsLCBtYXhWYWwgKSB7XG5cblx0XHRcdG1pbi5zZXQoIG1pblZhbCwgbWluVmFsLCBtaW5WYWwgKTtcblx0XHRcdG1heC5zZXQoIG1heFZhbCwgbWF4VmFsLCBtYXhWYWwgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXMuY2xhbXAoIG1pbiwgbWF4ICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRjbGFtcExlbmd0aDogZnVuY3Rpb24gKCBtaW4sIG1heCApIHtcblxuXHRcdHZhciBsZW5ndGggPSB0aGlzLmxlbmd0aCgpO1xuXG5cdFx0cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKCBsZW5ndGggfHwgMSApLm11bHRpcGx5U2NhbGFyKCBNYXRoLm1heCggbWluLCBNYXRoLm1pbiggbWF4LCBsZW5ndGggKSApICk7XG5cblx0fSxcblxuXHRmbG9vcjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy54ID0gTWF0aC5mbG9vciggdGhpcy54ICk7XG5cdFx0dGhpcy55ID0gTWF0aC5mbG9vciggdGhpcy55ICk7XG5cdFx0dGhpcy56ID0gTWF0aC5mbG9vciggdGhpcy56ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNlaWw6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMueCA9IE1hdGguY2VpbCggdGhpcy54ICk7XG5cdFx0dGhpcy55ID0gTWF0aC5jZWlsKCB0aGlzLnkgKTtcblx0XHR0aGlzLnogPSBNYXRoLmNlaWwoIHRoaXMueiApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRyb3VuZDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy54ID0gTWF0aC5yb3VuZCggdGhpcy54ICk7XG5cdFx0dGhpcy55ID0gTWF0aC5yb3VuZCggdGhpcy55ICk7XG5cdFx0dGhpcy56ID0gTWF0aC5yb3VuZCggdGhpcy56ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHJvdW5kVG9aZXJvOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLnggPSAoIHRoaXMueCA8IDAgKSA/IE1hdGguY2VpbCggdGhpcy54ICkgOiBNYXRoLmZsb29yKCB0aGlzLnggKTtcblx0XHR0aGlzLnkgPSAoIHRoaXMueSA8IDAgKSA/IE1hdGguY2VpbCggdGhpcy55ICkgOiBNYXRoLmZsb29yKCB0aGlzLnkgKTtcblx0XHR0aGlzLnogPSAoIHRoaXMueiA8IDAgKSA/IE1hdGguY2VpbCggdGhpcy56ICkgOiBNYXRoLmZsb29yKCB0aGlzLnogKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bmVnYXRlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLnggPSAtIHRoaXMueDtcblx0XHR0aGlzLnkgPSAtIHRoaXMueTtcblx0XHR0aGlzLnogPSAtIHRoaXMuejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZG90OiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy54ICogdi54ICsgdGhpcy55ICogdi55ICsgdGhpcy56ICogdi56O1xuXG5cdH0sXG5cblx0Ly8gVE9ETyBsZW5ndGhTcXVhcmVkP1xuXG5cdGxlbmd0aFNxOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy54ICogdGhpcy54ICsgdGhpcy55ICogdGhpcy55ICsgdGhpcy56ICogdGhpcy56O1xuXG5cdH0sXG5cblx0bGVuZ3RoOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gTWF0aC5zcXJ0KCB0aGlzLnggKiB0aGlzLnggKyB0aGlzLnkgKiB0aGlzLnkgKyB0aGlzLnogKiB0aGlzLnogKTtcblxuXHR9LFxuXG5cdG1hbmhhdHRhbkxlbmd0aDogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIE1hdGguYWJzKCB0aGlzLnggKSArIE1hdGguYWJzKCB0aGlzLnkgKSArIE1hdGguYWJzKCB0aGlzLnogKTtcblxuXHR9LFxuXG5cdG5vcm1hbGl6ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKCB0aGlzLmxlbmd0aCgpIHx8IDEgKTtcblxuXHR9LFxuXG5cdHNldExlbmd0aDogZnVuY3Rpb24gKCBsZW5ndGggKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhciggbGVuZ3RoICk7XG5cblx0fSxcblxuXHRsZXJwOiBmdW5jdGlvbiAoIHYsIGFscGhhICkge1xuXG5cdFx0dGhpcy54ICs9ICggdi54IC0gdGhpcy54ICkgKiBhbHBoYTtcblx0XHR0aGlzLnkgKz0gKCB2LnkgLSB0aGlzLnkgKSAqIGFscGhhO1xuXHRcdHRoaXMueiArPSAoIHYueiAtIHRoaXMueiApICogYWxwaGE7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGxlcnBWZWN0b3JzOiBmdW5jdGlvbiAoIHYxLCB2MiwgYWxwaGEgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5zdWJWZWN0b3JzKCB2MiwgdjEgKS5tdWx0aXBseVNjYWxhciggYWxwaGEgKS5hZGQoIHYxICk7XG5cblx0fSxcblxuXHRjcm9zczogZnVuY3Rpb24gKCB2LCB3ICkge1xuXG5cdFx0aWYgKCB3ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjM6IC5jcm9zcygpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLmNyb3NzVmVjdG9ycyggYSwgYiApIGluc3RlYWQuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMuY3Jvc3NWZWN0b3JzKCB2LCB3ICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5jcm9zc1ZlY3RvcnMoIHRoaXMsIHYgKTtcblxuXHR9LFxuXG5cdGNyb3NzVmVjdG9yczogZnVuY3Rpb24gKCBhLCBiICkge1xuXG5cdFx0dmFyIGF4ID0gYS54LCBheSA9IGEueSwgYXogPSBhLno7XG5cdFx0dmFyIGJ4ID0gYi54LCBieSA9IGIueSwgYnogPSBiLno7XG5cblx0XHR0aGlzLnggPSBheSAqIGJ6IC0gYXogKiBieTtcblx0XHR0aGlzLnkgPSBheiAqIGJ4IC0gYXggKiBiejtcblx0XHR0aGlzLnogPSBheCAqIGJ5IC0gYXkgKiBieDtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0cHJvamVjdE9uVmVjdG9yOiBmdW5jdGlvbiAoIHZlY3RvciApIHtcblxuXHRcdHZhciBzY2FsYXIgPSB2ZWN0b3IuZG90KCB0aGlzICkgLyB2ZWN0b3IubGVuZ3RoU3EoKTtcblxuXHRcdHJldHVybiB0aGlzLmNvcHkoIHZlY3RvciApLm11bHRpcGx5U2NhbGFyKCBzY2FsYXIgKTtcblxuXHR9LFxuXG5cdHByb2plY3RPblBsYW5lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHByb2plY3RPblBsYW5lKCBwbGFuZU5vcm1hbCApIHtcblxuXHRcdFx0djEuY29weSggdGhpcyApLnByb2plY3RPblZlY3RvciggcGxhbmVOb3JtYWwgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXMuc3ViKCB2MSApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0cmVmbGVjdDogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gcmVmbGVjdCBpbmNpZGVudCB2ZWN0b3Igb2ZmIHBsYW5lIG9ydGhvZ29uYWwgdG8gbm9ybWFsXG5cdFx0Ly8gbm9ybWFsIGlzIGFzc3VtZWQgdG8gaGF2ZSB1bml0IGxlbmd0aFxuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiByZWZsZWN0KCBub3JtYWwgKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLnN1YiggdjEuY29weSggbm9ybWFsICkubXVsdGlwbHlTY2FsYXIoIDIgKiB0aGlzLmRvdCggbm9ybWFsICkgKSApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0YW5nbGVUbzogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0dmFyIHRoZXRhID0gdGhpcy5kb3QoIHYgKSAvICggTWF0aC5zcXJ0KCB0aGlzLmxlbmd0aFNxKCkgKiB2Lmxlbmd0aFNxKCkgKSApO1xuXG5cdFx0Ly8gY2xhbXAsIHRvIGhhbmRsZSBudW1lcmljYWwgcHJvYmxlbXNcblxuXHRcdHJldHVybiBNYXRoLmFjb3MoIF9NYXRoLmNsYW1wKCB0aGV0YSwgLSAxLCAxICkgKTtcblxuXHR9LFxuXG5cdGRpc3RhbmNlVG86IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHJldHVybiBNYXRoLnNxcnQoIHRoaXMuZGlzdGFuY2VUb1NxdWFyZWQoIHYgKSApO1xuXG5cdH0sXG5cblx0ZGlzdGFuY2VUb1NxdWFyZWQ6IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHZhciBkeCA9IHRoaXMueCAtIHYueCwgZHkgPSB0aGlzLnkgLSB2LnksIGR6ID0gdGhpcy56IC0gdi56O1xuXG5cdFx0cmV0dXJuIGR4ICogZHggKyBkeSAqIGR5ICsgZHogKiBkejtcblxuXHR9LFxuXG5cdG1hbmhhdHRhbkRpc3RhbmNlVG86IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHJldHVybiBNYXRoLmFicyggdGhpcy54IC0gdi54ICkgKyBNYXRoLmFicyggdGhpcy55IC0gdi55ICkgKyBNYXRoLmFicyggdGhpcy56IC0gdi56ICk7XG5cblx0fSxcblxuXHRzZXRGcm9tU3BoZXJpY2FsOiBmdW5jdGlvbiAoIHMgKSB7XG5cblx0XHR2YXIgc2luUGhpUmFkaXVzID0gTWF0aC5zaW4oIHMucGhpICkgKiBzLnJhZGl1cztcblxuXHRcdHRoaXMueCA9IHNpblBoaVJhZGl1cyAqIE1hdGguc2luKCBzLnRoZXRhICk7XG5cdFx0dGhpcy55ID0gTWF0aC5jb3MoIHMucGhpICkgKiBzLnJhZGl1cztcblx0XHR0aGlzLnogPSBzaW5QaGlSYWRpdXMgKiBNYXRoLmNvcyggcy50aGV0YSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRGcm9tQ3lsaW5kcmljYWw6IGZ1bmN0aW9uICggYyApIHtcblxuXHRcdHRoaXMueCA9IGMucmFkaXVzICogTWF0aC5zaW4oIGMudGhldGEgKTtcblx0XHR0aGlzLnkgPSBjLnk7XG5cdFx0dGhpcy56ID0gYy5yYWRpdXMgKiBNYXRoLmNvcyggYy50aGV0YSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRGcm9tTWF0cml4UG9zaXRpb246IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdHZhciBlID0gbS5lbGVtZW50cztcblxuXHRcdHRoaXMueCA9IGVbIDEyIF07XG5cdFx0dGhpcy55ID0gZVsgMTMgXTtcblx0XHR0aGlzLnogPSBlWyAxNCBdO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRGcm9tTWF0cml4U2NhbGU6IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdHZhciBzeCA9IHRoaXMuc2V0RnJvbU1hdHJpeENvbHVtbiggbSwgMCApLmxlbmd0aCgpO1xuXHRcdHZhciBzeSA9IHRoaXMuc2V0RnJvbU1hdHJpeENvbHVtbiggbSwgMSApLmxlbmd0aCgpO1xuXHRcdHZhciBzeiA9IHRoaXMuc2V0RnJvbU1hdHJpeENvbHVtbiggbSwgMiApLmxlbmd0aCgpO1xuXG5cdFx0dGhpcy54ID0gc3g7XG5cdFx0dGhpcy55ID0gc3k7XG5cdFx0dGhpcy56ID0gc3o7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21NYXRyaXhDb2x1bW46IGZ1bmN0aW9uICggbSwgaW5kZXggKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5mcm9tQXJyYXkoIG0uZWxlbWVudHMsIGluZGV4ICogNCApO1xuXG5cdH0sXG5cblx0ZXF1YWxzOiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHRyZXR1cm4gKCAoIHYueCA9PT0gdGhpcy54ICkgJiYgKCB2LnkgPT09IHRoaXMueSApICYmICggdi56ID09PSB0aGlzLnogKSApO1xuXG5cdH0sXG5cblx0ZnJvbUFycmF5OiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7XG5cblx0XHRpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkgb2Zmc2V0ID0gMDtcblxuXHRcdHRoaXMueCA9IGFycmF5WyBvZmZzZXQgXTtcblx0XHR0aGlzLnkgPSBhcnJheVsgb2Zmc2V0ICsgMSBdO1xuXHRcdHRoaXMueiA9IGFycmF5WyBvZmZzZXQgKyAyIF07XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHRvQXJyYXk6IGZ1bmN0aW9uICggYXJyYXksIG9mZnNldCApIHtcblxuXHRcdGlmICggYXJyYXkgPT09IHVuZGVmaW5lZCApIGFycmF5ID0gW107XG5cdFx0aWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7XG5cblx0XHRhcnJheVsgb2Zmc2V0IF0gPSB0aGlzLng7XG5cdFx0YXJyYXlbIG9mZnNldCArIDEgXSA9IHRoaXMueTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMiBdID0gdGhpcy56O1xuXG5cdFx0cmV0dXJuIGFycmF5O1xuXG5cdH0sXG5cblx0ZnJvbUJ1ZmZlckF0dHJpYnV0ZTogZnVuY3Rpb24gKCBhdHRyaWJ1dGUsIGluZGV4LCBvZmZzZXQgKSB7XG5cblx0XHRpZiAoIG9mZnNldCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3IzOiBvZmZzZXQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIC5mcm9tQnVmZmVyQXR0cmlidXRlKCkuJyApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy54ID0gYXR0cmlidXRlLmdldFgoIGluZGV4ICk7XG5cdFx0dGhpcy55ID0gYXR0cmlidXRlLmdldFkoIGluZGV4ICk7XG5cdFx0dGhpcy56ID0gYXR0cmlidXRlLmdldFooIGluZGV4ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvXG4gKiBAYXV0aG9yIHRzY2h3XG4gKi9cblxuZnVuY3Rpb24gTWF0cml4MygpIHtcblxuXHR0aGlzLmVsZW1lbnRzID0gW1xuXG5cdFx0MSwgMCwgMCxcblx0XHQwLCAxLCAwLFxuXHRcdDAsIDAsIDFcblxuXHRdO1xuXG5cdGlmICggYXJndW1lbnRzLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuTWF0cml4MzogdGhlIGNvbnN0cnVjdG9yIG5vIGxvbmdlciByZWFkcyBhcmd1bWVudHMuIHVzZSAuc2V0KCkgaW5zdGVhZC4nICk7XG5cblx0fVxuXG59XG5cbk9iamVjdC5hc3NpZ24oIE1hdHJpeDMucHJvdG90eXBlLCB7XG5cblx0aXNNYXRyaXgzOiB0cnVlLFxuXG5cdHNldDogZnVuY3Rpb24gKCBuMTEsIG4xMiwgbjEzLCBuMjEsIG4yMiwgbjIzLCBuMzEsIG4zMiwgbjMzICkge1xuXG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblxuXHRcdHRlWyAwIF0gPSBuMTE7IHRlWyAxIF0gPSBuMjE7IHRlWyAyIF0gPSBuMzE7XG5cdFx0dGVbIDMgXSA9IG4xMjsgdGVbIDQgXSA9IG4yMjsgdGVbIDUgXSA9IG4zMjtcblx0XHR0ZVsgNiBdID0gbjEzOyB0ZVsgNyBdID0gbjIzOyB0ZVsgOCBdID0gbjMzO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRpZGVudGl0eTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5zZXQoXG5cblx0XHRcdDEsIDAsIDAsXG5cdFx0XHQwLCAxLCAwLFxuXHRcdFx0MCwgMCwgMVxuXG5cdFx0KTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmZyb21BcnJheSggdGhpcy5lbGVtZW50cyApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBtICkge1xuXG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblx0XHR2YXIgbWUgPSBtLmVsZW1lbnRzO1xuXG5cdFx0dGVbIDAgXSA9IG1lWyAwIF07IHRlWyAxIF0gPSBtZVsgMSBdOyB0ZVsgMiBdID0gbWVbIDIgXTtcblx0XHR0ZVsgMyBdID0gbWVbIDMgXTsgdGVbIDQgXSA9IG1lWyA0IF07IHRlWyA1IF0gPSBtZVsgNSBdO1xuXHRcdHRlWyA2IF0gPSBtZVsgNiBdOyB0ZVsgNyBdID0gbWVbIDcgXTsgdGVbIDggXSA9IG1lWyA4IF07XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21NYXRyaXg0OiBmdW5jdGlvbiAoIG0gKSB7XG5cblx0XHR2YXIgbWUgPSBtLmVsZW1lbnRzO1xuXG5cdFx0dGhpcy5zZXQoXG5cblx0XHRcdG1lWyAwIF0sIG1lWyA0IF0sIG1lWyA4IF0sXG5cdFx0XHRtZVsgMSBdLCBtZVsgNSBdLCBtZVsgOSBdLFxuXHRcdFx0bWVbIDIgXSwgbWVbIDYgXSwgbWVbIDEwIF1cblxuXHRcdCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGFwcGx5VG9CdWZmZXJBdHRyaWJ1dGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gYXBwbHlUb0J1ZmZlckF0dHJpYnV0ZSggYXR0cmlidXRlICkge1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBhdHRyaWJ1dGUuY291bnQ7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdHYxLnggPSBhdHRyaWJ1dGUuZ2V0WCggaSApO1xuXHRcdFx0XHR2MS55ID0gYXR0cmlidXRlLmdldFkoIGkgKTtcblx0XHRcdFx0djEueiA9IGF0dHJpYnV0ZS5nZXRaKCBpICk7XG5cblx0XHRcdFx0djEuYXBwbHlNYXRyaXgzKCB0aGlzICk7XG5cblx0XHRcdFx0YXR0cmlidXRlLnNldFhZWiggaSwgdjEueCwgdjEueSwgdjEueiApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBhdHRyaWJ1dGU7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRtdWx0aXBseTogZnVuY3Rpb24gKCBtICkge1xuXG5cdFx0cmV0dXJuIHRoaXMubXVsdGlwbHlNYXRyaWNlcyggdGhpcywgbSApO1xuXG5cdH0sXG5cblx0cHJlbXVsdGlwbHk6IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdHJldHVybiB0aGlzLm11bHRpcGx5TWF0cmljZXMoIG0sIHRoaXMgKTtcblxuXHR9LFxuXG5cdG11bHRpcGx5TWF0cmljZXM6IGZ1bmN0aW9uICggYSwgYiApIHtcblxuXHRcdHZhciBhZSA9IGEuZWxlbWVudHM7XG5cdFx0dmFyIGJlID0gYi5lbGVtZW50cztcblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXG5cdFx0dmFyIGExMSA9IGFlWyAwIF0sIGExMiA9IGFlWyAzIF0sIGExMyA9IGFlWyA2IF07XG5cdFx0dmFyIGEyMSA9IGFlWyAxIF0sIGEyMiA9IGFlWyA0IF0sIGEyMyA9IGFlWyA3IF07XG5cdFx0dmFyIGEzMSA9IGFlWyAyIF0sIGEzMiA9IGFlWyA1IF0sIGEzMyA9IGFlWyA4IF07XG5cblx0XHR2YXIgYjExID0gYmVbIDAgXSwgYjEyID0gYmVbIDMgXSwgYjEzID0gYmVbIDYgXTtcblx0XHR2YXIgYjIxID0gYmVbIDEgXSwgYjIyID0gYmVbIDQgXSwgYjIzID0gYmVbIDcgXTtcblx0XHR2YXIgYjMxID0gYmVbIDIgXSwgYjMyID0gYmVbIDUgXSwgYjMzID0gYmVbIDggXTtcblxuXHRcdHRlWyAwIF0gPSBhMTEgKiBiMTEgKyBhMTIgKiBiMjEgKyBhMTMgKiBiMzE7XG5cdFx0dGVbIDMgXSA9IGExMSAqIGIxMiArIGExMiAqIGIyMiArIGExMyAqIGIzMjtcblx0XHR0ZVsgNiBdID0gYTExICogYjEzICsgYTEyICogYjIzICsgYTEzICogYjMzO1xuXG5cdFx0dGVbIDEgXSA9IGEyMSAqIGIxMSArIGEyMiAqIGIyMSArIGEyMyAqIGIzMTtcblx0XHR0ZVsgNCBdID0gYTIxICogYjEyICsgYTIyICogYjIyICsgYTIzICogYjMyO1xuXHRcdHRlWyA3IF0gPSBhMjEgKiBiMTMgKyBhMjIgKiBiMjMgKyBhMjMgKiBiMzM7XG5cblx0XHR0ZVsgMiBdID0gYTMxICogYjExICsgYTMyICogYjIxICsgYTMzICogYjMxO1xuXHRcdHRlWyA1IF0gPSBhMzEgKiBiMTIgKyBhMzIgKiBiMjIgKyBhMzMgKiBiMzI7XG5cdFx0dGVbIDggXSA9IGEzMSAqIGIxMyArIGEzMiAqIGIyMyArIGEzMyAqIGIzMztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bXVsdGlwbHlTY2FsYXI6IGZ1bmN0aW9uICggcyApIHtcblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHR0ZVsgMCBdICo9IHM7IHRlWyAzIF0gKj0gczsgdGVbIDYgXSAqPSBzO1xuXHRcdHRlWyAxIF0gKj0gczsgdGVbIDQgXSAqPSBzOyB0ZVsgNyBdICo9IHM7XG5cdFx0dGVbIDIgXSAqPSBzOyB0ZVsgNSBdICo9IHM7IHRlWyA4IF0gKj0gcztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZGV0ZXJtaW5hbnQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHR2YXIgYSA9IHRlWyAwIF0sIGIgPSB0ZVsgMSBdLCBjID0gdGVbIDIgXSxcblx0XHRcdGQgPSB0ZVsgMyBdLCBlID0gdGVbIDQgXSwgZiA9IHRlWyA1IF0sXG5cdFx0XHRnID0gdGVbIDYgXSwgaCA9IHRlWyA3IF0sIGkgPSB0ZVsgOCBdO1xuXG5cdFx0cmV0dXJuIGEgKiBlICogaSAtIGEgKiBmICogaCAtIGIgKiBkICogaSArIGIgKiBmICogZyArIGMgKiBkICogaCAtIGMgKiBlICogZztcblxuXHR9LFxuXG5cdGdldEludmVyc2U6IGZ1bmN0aW9uICggbWF0cml4LCB0aHJvd09uRGVnZW5lcmF0ZSApIHtcblxuXHRcdGlmICggbWF0cml4ICYmIG1hdHJpeC5pc01hdHJpeDQgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoIFwiVEhSRUUuTWF0cml4MzogLmdldEludmVyc2UoKSBubyBsb25nZXIgdGFrZXMgYSBNYXRyaXg0IGFyZ3VtZW50LlwiICk7XG5cblx0XHR9XG5cblx0XHR2YXIgbWUgPSBtYXRyaXguZWxlbWVudHMsXG5cdFx0XHR0ZSA9IHRoaXMuZWxlbWVudHMsXG5cblx0XHRcdG4xMSA9IG1lWyAwIF0sIG4yMSA9IG1lWyAxIF0sIG4zMSA9IG1lWyAyIF0sXG5cdFx0XHRuMTIgPSBtZVsgMyBdLCBuMjIgPSBtZVsgNCBdLCBuMzIgPSBtZVsgNSBdLFxuXHRcdFx0bjEzID0gbWVbIDYgXSwgbjIzID0gbWVbIDcgXSwgbjMzID0gbWVbIDggXSxcblxuXHRcdFx0dDExID0gbjMzICogbjIyIC0gbjMyICogbjIzLFxuXHRcdFx0dDEyID0gbjMyICogbjEzIC0gbjMzICogbjEyLFxuXHRcdFx0dDEzID0gbjIzICogbjEyIC0gbjIyICogbjEzLFxuXG5cdFx0XHRkZXQgPSBuMTEgKiB0MTEgKyBuMjEgKiB0MTIgKyBuMzEgKiB0MTM7XG5cblx0XHRpZiAoIGRldCA9PT0gMCApIHtcblxuXHRcdFx0dmFyIG1zZyA9IFwiVEhSRUUuTWF0cml4MzogLmdldEludmVyc2UoKSBjYW4ndCBpbnZlcnQgbWF0cml4LCBkZXRlcm1pbmFudCBpcyAwXCI7XG5cblx0XHRcdGlmICggdGhyb3dPbkRlZ2VuZXJhdGUgPT09IHRydWUgKSB7XG5cblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCBtc2cgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oIG1zZyApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB0aGlzLmlkZW50aXR5KCk7XG5cblx0XHR9XG5cblx0XHR2YXIgZGV0SW52ID0gMSAvIGRldDtcblxuXHRcdHRlWyAwIF0gPSB0MTEgKiBkZXRJbnY7XG5cdFx0dGVbIDEgXSA9ICggbjMxICogbjIzIC0gbjMzICogbjIxICkgKiBkZXRJbnY7XG5cdFx0dGVbIDIgXSA9ICggbjMyICogbjIxIC0gbjMxICogbjIyICkgKiBkZXRJbnY7XG5cblx0XHR0ZVsgMyBdID0gdDEyICogZGV0SW52O1xuXHRcdHRlWyA0IF0gPSAoIG4zMyAqIG4xMSAtIG4zMSAqIG4xMyApICogZGV0SW52O1xuXHRcdHRlWyA1IF0gPSAoIG4zMSAqIG4xMiAtIG4zMiAqIG4xMSApICogZGV0SW52O1xuXG5cdFx0dGVbIDYgXSA9IHQxMyAqIGRldEludjtcblx0XHR0ZVsgNyBdID0gKCBuMjEgKiBuMTMgLSBuMjMgKiBuMTEgKSAqIGRldEludjtcblx0XHR0ZVsgOCBdID0gKCBuMjIgKiBuMTEgLSBuMjEgKiBuMTIgKSAqIGRldEludjtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dHJhbnNwb3NlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdG1wLCBtID0gdGhpcy5lbGVtZW50cztcblxuXHRcdHRtcCA9IG1bIDEgXTsgbVsgMSBdID0gbVsgMyBdOyBtWyAzIF0gPSB0bXA7XG5cdFx0dG1wID0gbVsgMiBdOyBtWyAyIF0gPSBtWyA2IF07IG1bIDYgXSA9IHRtcDtcblx0XHR0bXAgPSBtWyA1IF07IG1bIDUgXSA9IG1bIDcgXTsgbVsgNyBdID0gdG1wO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRnZXROb3JtYWxNYXRyaXg6IGZ1bmN0aW9uICggbWF0cml4NCApIHtcblxuXHRcdHJldHVybiB0aGlzLnNldEZyb21NYXRyaXg0KCBtYXRyaXg0ICkuZ2V0SW52ZXJzZSggdGhpcyApLnRyYW5zcG9zZSgpO1xuXG5cdH0sXG5cblx0dHJhbnNwb3NlSW50b0FycmF5OiBmdW5jdGlvbiAoIHIgKSB7XG5cblx0XHR2YXIgbSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHRyWyAwIF0gPSBtWyAwIF07XG5cdFx0clsgMSBdID0gbVsgMyBdO1xuXHRcdHJbIDIgXSA9IG1bIDYgXTtcblx0XHRyWyAzIF0gPSBtWyAxIF07XG5cdFx0clsgNCBdID0gbVsgNCBdO1xuXHRcdHJbIDUgXSA9IG1bIDcgXTtcblx0XHRyWyA2IF0gPSBtWyAyIF07XG5cdFx0clsgNyBdID0gbVsgNSBdO1xuXHRcdHJbIDggXSA9IG1bIDggXTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0VXZUcmFuc2Zvcm06IGZ1bmN0aW9uICggdHgsIHR5LCBzeCwgc3ksIHJvdGF0aW9uLCBjeCwgY3kgKSB7XG5cblx0XHR2YXIgYyA9IE1hdGguY29zKCByb3RhdGlvbiApO1xuXHRcdHZhciBzID0gTWF0aC5zaW4oIHJvdGF0aW9uICk7XG5cblx0XHR0aGlzLnNldChcblx0XHRcdHN4ICogYywgc3ggKiBzLCAtIHN4ICogKCBjICogY3ggKyBzICogY3kgKSArIGN4ICsgdHgsXG5cdFx0XHQtIHN5ICogcywgc3kgKiBjLCAtIHN5ICogKCAtIHMgKiBjeCArIGMgKiBjeSApICsgY3kgKyB0eSxcblx0XHRcdDAsIDAsIDFcblx0XHQpO1xuXG5cdH0sXG5cblx0c2NhbGU6IGZ1bmN0aW9uICggc3gsIHN5ICkge1xuXG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblxuXHRcdHRlWyAwIF0gKj0gc3g7IHRlWyAzIF0gKj0gc3g7IHRlWyA2IF0gKj0gc3g7XG5cdFx0dGVbIDEgXSAqPSBzeTsgdGVbIDQgXSAqPSBzeTsgdGVbIDcgXSAqPSBzeTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0cm90YXRlOiBmdW5jdGlvbiAoIHRoZXRhICkge1xuXG5cdFx0dmFyIGMgPSBNYXRoLmNvcyggdGhldGEgKTtcblx0XHR2YXIgcyA9IE1hdGguc2luKCB0aGV0YSApO1xuXG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblxuXHRcdHZhciBhMTEgPSB0ZVsgMCBdLCBhMTIgPSB0ZVsgMyBdLCBhMTMgPSB0ZVsgNiBdO1xuXHRcdHZhciBhMjEgPSB0ZVsgMSBdLCBhMjIgPSB0ZVsgNCBdLCBhMjMgPSB0ZVsgNyBdO1xuXG5cdFx0dGVbIDAgXSA9IGMgKiBhMTEgKyBzICogYTIxO1xuXHRcdHRlWyAzIF0gPSBjICogYTEyICsgcyAqIGEyMjtcblx0XHR0ZVsgNiBdID0gYyAqIGExMyArIHMgKiBhMjM7XG5cblx0XHR0ZVsgMSBdID0gLSBzICogYTExICsgYyAqIGEyMTtcblx0XHR0ZVsgNCBdID0gLSBzICogYTEyICsgYyAqIGEyMjtcblx0XHR0ZVsgNyBdID0gLSBzICogYTEzICsgYyAqIGEyMztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dHJhbnNsYXRlOiBmdW5jdGlvbiAoIHR4LCB0eSApIHtcblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHR0ZVsgMCBdICs9IHR4ICogdGVbIDIgXTsgdGVbIDMgXSArPSB0eCAqIHRlWyA1IF07IHRlWyA2IF0gKz0gdHggKiB0ZVsgOCBdO1xuXHRcdHRlWyAxIF0gKz0gdHkgKiB0ZVsgMiBdOyB0ZVsgNCBdICs9IHR5ICogdGVbIDUgXTsgdGVbIDcgXSArPSB0eSAqIHRlWyA4IF07XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGVxdWFsczogZnVuY3Rpb24gKCBtYXRyaXggKSB7XG5cblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXHRcdHZhciBtZSA9IG1hdHJpeC5lbGVtZW50cztcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IDk7IGkgKysgKSB7XG5cblx0XHRcdGlmICggdGVbIGkgXSAhPT0gbWVbIGkgXSApIHJldHVybiBmYWxzZTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXG5cdH0sXG5cblx0ZnJvbUFycmF5OiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7XG5cblx0XHRpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkgb2Zmc2V0ID0gMDtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IDk7IGkgKysgKSB7XG5cblx0XHRcdHRoaXMuZWxlbWVudHNbIGkgXSA9IGFycmF5WyBpICsgb2Zmc2V0IF07XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHRvQXJyYXk6IGZ1bmN0aW9uICggYXJyYXksIG9mZnNldCApIHtcblxuXHRcdGlmICggYXJyYXkgPT09IHVuZGVmaW5lZCApIGFycmF5ID0gW107XG5cdFx0aWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7XG5cblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXG5cdFx0YXJyYXlbIG9mZnNldCBdID0gdGVbIDAgXTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMSBdID0gdGVbIDEgXTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMiBdID0gdGVbIDIgXTtcblxuXHRcdGFycmF5WyBvZmZzZXQgKyAzIF0gPSB0ZVsgMyBdO1xuXHRcdGFycmF5WyBvZmZzZXQgKyA0IF0gPSB0ZVsgNCBdO1xuXHRcdGFycmF5WyBvZmZzZXQgKyA1IF0gPSB0ZVsgNSBdO1xuXG5cdFx0YXJyYXlbIG9mZnNldCArIDYgXSA9IHRlWyA2IF07XG5cdFx0YXJyYXlbIG9mZnNldCArIDcgXSA9IHRlWyA3IF07XG5cdFx0YXJyYXlbIG9mZnNldCArIDggXSA9IHRlWyA4IF07XG5cblx0XHRyZXR1cm4gYXJyYXk7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKiBAYXV0aG9yIHN6aW1layAvIGh0dHBzOi8vZ2l0aHViLmNvbS9zemltZWsvXG4gKi9cblxudmFyIHRleHR1cmVJZCA9IDA7XG5cbmZ1bmN0aW9uIFRleHR1cmUoIGltYWdlLCBtYXBwaW5nLCB3cmFwUywgd3JhcFQsIG1hZ0ZpbHRlciwgbWluRmlsdGVyLCBmb3JtYXQsIHR5cGUsIGFuaXNvdHJvcHksIGVuY29kaW5nICkge1xuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggdGhpcywgJ2lkJywgeyB2YWx1ZTogdGV4dHVyZUlkICsrIH0gKTtcblxuXHR0aGlzLnV1aWQgPSBfTWF0aC5nZW5lcmF0ZVVVSUQoKTtcblxuXHR0aGlzLm5hbWUgPSAnJztcblxuXHR0aGlzLmltYWdlID0gaW1hZ2UgIT09IHVuZGVmaW5lZCA/IGltYWdlIDogVGV4dHVyZS5ERUZBVUxUX0lNQUdFO1xuXHR0aGlzLm1pcG1hcHMgPSBbXTtcblxuXHR0aGlzLm1hcHBpbmcgPSBtYXBwaW5nICE9PSB1bmRlZmluZWQgPyBtYXBwaW5nIDogVGV4dHVyZS5ERUZBVUxUX01BUFBJTkc7XG5cblx0dGhpcy53cmFwUyA9IHdyYXBTICE9PSB1bmRlZmluZWQgPyB3cmFwUyA6IENsYW1wVG9FZGdlV3JhcHBpbmc7XG5cdHRoaXMud3JhcFQgPSB3cmFwVCAhPT0gdW5kZWZpbmVkID8gd3JhcFQgOiBDbGFtcFRvRWRnZVdyYXBwaW5nO1xuXG5cdHRoaXMubWFnRmlsdGVyID0gbWFnRmlsdGVyICE9PSB1bmRlZmluZWQgPyBtYWdGaWx0ZXIgOiBMaW5lYXJGaWx0ZXI7XG5cdHRoaXMubWluRmlsdGVyID0gbWluRmlsdGVyICE9PSB1bmRlZmluZWQgPyBtaW5GaWx0ZXIgOiBMaW5lYXJNaXBNYXBMaW5lYXJGaWx0ZXI7XG5cblx0dGhpcy5hbmlzb3Ryb3B5ID0gYW5pc290cm9weSAhPT0gdW5kZWZpbmVkID8gYW5pc290cm9weSA6IDE7XG5cblx0dGhpcy5mb3JtYXQgPSBmb3JtYXQgIT09IHVuZGVmaW5lZCA/IGZvcm1hdCA6IFJHQkFGb3JtYXQ7XG5cdHRoaXMudHlwZSA9IHR5cGUgIT09IHVuZGVmaW5lZCA/IHR5cGUgOiBVbnNpZ25lZEJ5dGVUeXBlO1xuXG5cdHRoaXMub2Zmc2V0ID0gbmV3IFZlY3RvcjIoIDAsIDAgKTtcblx0dGhpcy5yZXBlYXQgPSBuZXcgVmVjdG9yMiggMSwgMSApO1xuXHR0aGlzLmNlbnRlciA9IG5ldyBWZWN0b3IyKCAwLCAwICk7XG5cdHRoaXMucm90YXRpb24gPSAwO1xuXG5cdHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IHRydWU7XG5cdHRoaXMubWF0cml4ID0gbmV3IE1hdHJpeDMoKTtcblxuXHR0aGlzLmdlbmVyYXRlTWlwbWFwcyA9IHRydWU7XG5cdHRoaXMucHJlbXVsdGlwbHlBbHBoYSA9IGZhbHNlO1xuXHR0aGlzLmZsaXBZID0gdHJ1ZTtcblx0dGhpcy51bnBhY2tBbGlnbm1lbnQgPSA0O1x0Ly8gdmFsaWQgdmFsdWVzOiAxLCAyLCA0LCA4IChzZWUgaHR0cDovL3d3dy5raHJvbm9zLm9yZy9vcGVuZ2xlcy9zZGsvZG9jcy9tYW4veGh0bWwvZ2xQaXhlbFN0b3JlaS54bWwpXG5cblx0Ly8gVmFsdWVzIG9mIGVuY29kaW5nICE9PSBUSFJFRS5MaW5lYXJFbmNvZGluZyBvbmx5IHN1cHBvcnRlZCBvbiBtYXAsIGVudk1hcCBhbmQgZW1pc3NpdmVNYXAuXG5cdC8vXG5cdC8vIEFsc28gY2hhbmdpbmcgdGhlIGVuY29kaW5nIGFmdGVyIGFscmVhZHkgdXNlZCBieSBhIE1hdGVyaWFsIHdpbGwgbm90IGF1dG9tYXRpY2FsbHkgbWFrZSB0aGUgTWF0ZXJpYWxcblx0Ly8gdXBkYXRlLiAgWW91IG5lZWQgdG8gZXhwbGljaXRseSBjYWxsIE1hdGVyaWFsLm5lZWRzVXBkYXRlIHRvIHRyaWdnZXIgaXQgdG8gcmVjb21waWxlLlxuXHR0aGlzLmVuY29kaW5nID0gZW5jb2RpbmcgIT09IHVuZGVmaW5lZCA/IGVuY29kaW5nIDogTGluZWFyRW5jb2Rpbmc7XG5cblx0dGhpcy52ZXJzaW9uID0gMDtcblx0dGhpcy5vblVwZGF0ZSA9IG51bGw7XG5cbn1cblxuVGV4dHVyZS5ERUZBVUxUX0lNQUdFID0gdW5kZWZpbmVkO1xuVGV4dHVyZS5ERUZBVUxUX01BUFBJTkcgPSBVVk1hcHBpbmc7XG5cblRleHR1cmUucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggRXZlbnREaXNwYXRjaGVyLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IFRleHR1cmUsXG5cblx0aXNUZXh0dXJlOiB0cnVlLFxuXG5cdHVwZGF0ZU1hdHJpeDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5tYXRyaXguc2V0VXZUcmFuc2Zvcm0oIHRoaXMub2Zmc2V0LngsIHRoaXMub2Zmc2V0LnksIHRoaXMucmVwZWF0LngsIHRoaXMucmVwZWF0LnksIHRoaXMucm90YXRpb24sIHRoaXMuY2VudGVyLngsIHRoaXMuY2VudGVyLnkgKTtcblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRcdHRoaXMubmFtZSA9IHNvdXJjZS5uYW1lO1xuXG5cdFx0dGhpcy5pbWFnZSA9IHNvdXJjZS5pbWFnZTtcblx0XHR0aGlzLm1pcG1hcHMgPSBzb3VyY2UubWlwbWFwcy5zbGljZSggMCApO1xuXG5cdFx0dGhpcy5tYXBwaW5nID0gc291cmNlLm1hcHBpbmc7XG5cblx0XHR0aGlzLndyYXBTID0gc291cmNlLndyYXBTO1xuXHRcdHRoaXMud3JhcFQgPSBzb3VyY2Uud3JhcFQ7XG5cblx0XHR0aGlzLm1hZ0ZpbHRlciA9IHNvdXJjZS5tYWdGaWx0ZXI7XG5cdFx0dGhpcy5taW5GaWx0ZXIgPSBzb3VyY2UubWluRmlsdGVyO1xuXG5cdFx0dGhpcy5hbmlzb3Ryb3B5ID0gc291cmNlLmFuaXNvdHJvcHk7XG5cblx0XHR0aGlzLmZvcm1hdCA9IHNvdXJjZS5mb3JtYXQ7XG5cdFx0dGhpcy50eXBlID0gc291cmNlLnR5cGU7XG5cblx0XHR0aGlzLm9mZnNldC5jb3B5KCBzb3VyY2Uub2Zmc2V0ICk7XG5cdFx0dGhpcy5yZXBlYXQuY29weSggc291cmNlLnJlcGVhdCApO1xuXHRcdHRoaXMuY2VudGVyLmNvcHkoIHNvdXJjZS5jZW50ZXIgKTtcblx0XHR0aGlzLnJvdGF0aW9uID0gc291cmNlLnJvdGF0aW9uO1xuXG5cdFx0dGhpcy5tYXRyaXhBdXRvVXBkYXRlID0gc291cmNlLm1hdHJpeEF1dG9VcGRhdGU7XG5cdFx0dGhpcy5tYXRyaXguY29weSggc291cmNlLm1hdHJpeCApO1xuXG5cdFx0dGhpcy5nZW5lcmF0ZU1pcG1hcHMgPSBzb3VyY2UuZ2VuZXJhdGVNaXBtYXBzO1xuXHRcdHRoaXMucHJlbXVsdGlwbHlBbHBoYSA9IHNvdXJjZS5wcmVtdWx0aXBseUFscGhhO1xuXHRcdHRoaXMuZmxpcFkgPSBzb3VyY2UuZmxpcFk7XG5cdFx0dGhpcy51bnBhY2tBbGlnbm1lbnQgPSBzb3VyY2UudW5wYWNrQWxpZ25tZW50O1xuXHRcdHRoaXMuZW5jb2RpbmcgPSBzb3VyY2UuZW5jb2Rpbmc7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCBtZXRhICkge1xuXG5cdFx0dmFyIGlzUm9vdE9iamVjdCA9ICggbWV0YSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBtZXRhID09PSAnc3RyaW5nJyApO1xuXG5cdFx0aWYgKCAhIGlzUm9vdE9iamVjdCAmJiBtZXRhLnRleHR1cmVzWyB0aGlzLnV1aWQgXSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRyZXR1cm4gbWV0YS50ZXh0dXJlc1sgdGhpcy51dWlkIF07XG5cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBnZXREYXRhVVJMKCBpbWFnZSApIHtcblxuXHRcdFx0dmFyIGNhbnZhcztcblxuXHRcdFx0aWYgKCBpbWFnZSBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50ICkge1xuXG5cdFx0XHRcdGNhbnZhcyA9IGltYWdlO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyggJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnLCAnY2FudmFzJyApO1xuXHRcdFx0XHRjYW52YXMud2lkdGggPSBpbWFnZS53aWR0aDtcblx0XHRcdFx0Y2FudmFzLmhlaWdodCA9IGltYWdlLmhlaWdodDtcblxuXHRcdFx0XHR2YXIgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KCAnMmQnICk7XG5cblx0XHRcdFx0aWYgKCBpbWFnZSBpbnN0YW5jZW9mIEltYWdlRGF0YSApIHtcblxuXHRcdFx0XHRcdGNvbnRleHQucHV0SW1hZ2VEYXRhKCBpbWFnZSwgMCwgMCApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRjb250ZXh0LmRyYXdJbWFnZSggaW1hZ2UsIDAsIDAsIGltYWdlLndpZHRoLCBpbWFnZS5oZWlnaHQgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBjYW52YXMud2lkdGggPiAyMDQ4IHx8IGNhbnZhcy5oZWlnaHQgPiAyMDQ4ICkge1xuXG5cdFx0XHRcdHJldHVybiBjYW52YXMudG9EYXRhVVJMKCAnaW1hZ2UvanBlZycsIDAuNiApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHJldHVybiBjYW52YXMudG9EYXRhVVJMKCAnaW1hZ2UvcG5nJyApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHR2YXIgb3V0cHV0ID0ge1xuXG5cdFx0XHRtZXRhZGF0YToge1xuXHRcdFx0XHR2ZXJzaW9uOiA0LjUsXG5cdFx0XHRcdHR5cGU6ICdUZXh0dXJlJyxcblx0XHRcdFx0Z2VuZXJhdG9yOiAnVGV4dHVyZS50b0pTT04nXG5cdFx0XHR9LFxuXG5cdFx0XHR1dWlkOiB0aGlzLnV1aWQsXG5cdFx0XHRuYW1lOiB0aGlzLm5hbWUsXG5cblx0XHRcdG1hcHBpbmc6IHRoaXMubWFwcGluZyxcblxuXHRcdFx0cmVwZWF0OiBbIHRoaXMucmVwZWF0LngsIHRoaXMucmVwZWF0LnkgXSxcblx0XHRcdG9mZnNldDogWyB0aGlzLm9mZnNldC54LCB0aGlzLm9mZnNldC55IF0sXG5cdFx0XHRjZW50ZXI6IFsgdGhpcy5jZW50ZXIueCwgdGhpcy5jZW50ZXIueSBdLFxuXHRcdFx0cm90YXRpb246IHRoaXMucm90YXRpb24sXG5cblx0XHRcdHdyYXA6IFsgdGhpcy53cmFwUywgdGhpcy53cmFwVCBdLFxuXG5cdFx0XHRmb3JtYXQ6IHRoaXMuZm9ybWF0LFxuXHRcdFx0bWluRmlsdGVyOiB0aGlzLm1pbkZpbHRlcixcblx0XHRcdG1hZ0ZpbHRlcjogdGhpcy5tYWdGaWx0ZXIsXG5cdFx0XHRhbmlzb3Ryb3B5OiB0aGlzLmFuaXNvdHJvcHksXG5cblx0XHRcdGZsaXBZOiB0aGlzLmZsaXBZXG5cblx0XHR9O1xuXG5cdFx0aWYgKCB0aGlzLmltYWdlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdC8vIFRPRE86IE1vdmUgdG8gVEhSRUUuSW1hZ2VcblxuXHRcdFx0dmFyIGltYWdlID0gdGhpcy5pbWFnZTtcblxuXHRcdFx0aWYgKCBpbWFnZS51dWlkID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0aW1hZ2UudXVpZCA9IF9NYXRoLmdlbmVyYXRlVVVJRCgpOyAvLyBVR0hcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoICEgaXNSb290T2JqZWN0ICYmIG1ldGEuaW1hZ2VzWyBpbWFnZS51dWlkIF0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRtZXRhLmltYWdlc1sgaW1hZ2UudXVpZCBdID0ge1xuXHRcdFx0XHRcdHV1aWQ6IGltYWdlLnV1aWQsXG5cdFx0XHRcdFx0dXJsOiBnZXREYXRhVVJMKCBpbWFnZSApXG5cdFx0XHRcdH07XG5cblx0XHRcdH1cblxuXHRcdFx0b3V0cHV0LmltYWdlID0gaW1hZ2UudXVpZDtcblxuXHRcdH1cblxuXHRcdGlmICggISBpc1Jvb3RPYmplY3QgKSB7XG5cblx0XHRcdG1ldGEudGV4dHVyZXNbIHRoaXMudXVpZCBdID0gb3V0cHV0O1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIG91dHB1dDtcblxuXHR9LFxuXG5cdGRpc3Bvc2U6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuZGlzcGF0Y2hFdmVudCggeyB0eXBlOiAnZGlzcG9zZScgfSApO1xuXG5cdH0sXG5cblx0dHJhbnNmb3JtVXY6IGZ1bmN0aW9uICggdXYgKSB7XG5cblx0XHRpZiAoIHRoaXMubWFwcGluZyAhPT0gVVZNYXBwaW5nICkgcmV0dXJuO1xuXG5cdFx0dXYuYXBwbHlNYXRyaXgzKCB0aGlzLm1hdHJpeCApO1xuXG5cdFx0aWYgKCB1di54IDwgMCB8fCB1di54ID4gMSApIHtcblxuXHRcdFx0c3dpdGNoICggdGhpcy53cmFwUyApIHtcblxuXHRcdFx0XHRjYXNlIFJlcGVhdFdyYXBwaW5nOlxuXG5cdFx0XHRcdFx0dXYueCA9IHV2LnggLSBNYXRoLmZsb29yKCB1di54ICk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSBDbGFtcFRvRWRnZVdyYXBwaW5nOlxuXG5cdFx0XHRcdFx0dXYueCA9IHV2LnggPCAwID8gMCA6IDE7XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSBNaXJyb3JlZFJlcGVhdFdyYXBwaW5nOlxuXG5cdFx0XHRcdFx0aWYgKCBNYXRoLmFicyggTWF0aC5mbG9vciggdXYueCApICUgMiApID09PSAxICkge1xuXG5cdFx0XHRcdFx0XHR1di54ID0gTWF0aC5jZWlsKCB1di54ICkgLSB1di54O1xuXG5cdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0dXYueCA9IHV2LnggLSBNYXRoLmZsb29yKCB1di54ICk7XG5cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggdXYueSA8IDAgfHwgdXYueSA+IDEgKSB7XG5cblx0XHRcdHN3aXRjaCAoIHRoaXMud3JhcFQgKSB7XG5cblx0XHRcdFx0Y2FzZSBSZXBlYXRXcmFwcGluZzpcblxuXHRcdFx0XHRcdHV2LnkgPSB1di55IC0gTWF0aC5mbG9vciggdXYueSApO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgQ2xhbXBUb0VkZ2VXcmFwcGluZzpcblxuXHRcdFx0XHRcdHV2LnkgPSB1di55IDwgMCA/IDAgOiAxO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgTWlycm9yZWRSZXBlYXRXcmFwcGluZzpcblxuXHRcdFx0XHRcdGlmICggTWF0aC5hYnMoIE1hdGguZmxvb3IoIHV2LnkgKSAlIDIgKSA9PT0gMSApIHtcblxuXHRcdFx0XHRcdFx0dXYueSA9IE1hdGguY2VpbCggdXYueSApIC0gdXYueTtcblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdHV2LnkgPSB1di55IC0gTWF0aC5mbG9vciggdXYueSApO1xuXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIHRoaXMuZmxpcFkgKSB7XG5cblx0XHRcdHV2LnkgPSAxIC0gdXYueTtcblxuXHRcdH1cblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KCBUZXh0dXJlLnByb3RvdHlwZSwgXCJuZWVkc1VwZGF0ZVwiLCB7XG5cblx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0aWYgKCB2YWx1ZSA9PT0gdHJ1ZSApIHRoaXMudmVyc2lvbiArKztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIHN1cGVyZWdnYmVydCAvIGh0dHA6Ly93d3cucGF1bGJydW50LmNvLnVrL1xuICogQGF1dGhvciBwaGlsb2diIC8gaHR0cDovL2Jsb2cudGhlaml0Lm9yZy9cbiAqIEBhdXRob3IgbWlrYWVsIGVtdGluZ2VyIC8gaHR0cDovL2dvbW8uc2UvXG4gKiBAYXV0aG9yIGVncmFldGhlciAvIGh0dHA6Ly9lZ3JhZXRoZXIuY29tL1xuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKi9cblxuZnVuY3Rpb24gVmVjdG9yNCggeCwgeSwgeiwgdyApIHtcblxuXHR0aGlzLnggPSB4IHx8IDA7XG5cdHRoaXMueSA9IHkgfHwgMDtcblx0dGhpcy56ID0geiB8fCAwO1xuXHR0aGlzLncgPSAoIHcgIT09IHVuZGVmaW5lZCApID8gdyA6IDE7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggVmVjdG9yNC5wcm90b3R5cGUsIHtcblxuXHRpc1ZlY3RvcjQ6IHRydWUsXG5cblx0c2V0OiBmdW5jdGlvbiAoIHgsIHksIHosIHcgKSB7XG5cblx0XHR0aGlzLnggPSB4O1xuXHRcdHRoaXMueSA9IHk7XG5cdFx0dGhpcy56ID0gejtcblx0XHR0aGlzLncgPSB3O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRTY2FsYXI6IGZ1bmN0aW9uICggc2NhbGFyICkge1xuXG5cdFx0dGhpcy54ID0gc2NhbGFyO1xuXHRcdHRoaXMueSA9IHNjYWxhcjtcblx0XHR0aGlzLnogPSBzY2FsYXI7XG5cdFx0dGhpcy53ID0gc2NhbGFyO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRYOiBmdW5jdGlvbiAoIHggKSB7XG5cblx0XHR0aGlzLnggPSB4O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRZOiBmdW5jdGlvbiAoIHkgKSB7XG5cblx0XHR0aGlzLnkgPSB5O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRaOiBmdW5jdGlvbiAoIHogKSB7XG5cblx0XHR0aGlzLnogPSB6O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRXOiBmdW5jdGlvbiAoIHcgKSB7XG5cblx0XHR0aGlzLncgPSB3O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRDb21wb25lbnQ6IGZ1bmN0aW9uICggaW5kZXgsIHZhbHVlICkge1xuXG5cdFx0c3dpdGNoICggaW5kZXggKSB7XG5cblx0XHRcdGNhc2UgMDogdGhpcy54ID0gdmFsdWU7IGJyZWFrO1xuXHRcdFx0Y2FzZSAxOiB0aGlzLnkgPSB2YWx1ZTsgYnJlYWs7XG5cdFx0XHRjYXNlIDI6IHRoaXMueiA9IHZhbHVlOyBicmVhaztcblx0XHRcdGNhc2UgMzogdGhpcy53ID0gdmFsdWU7IGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDogdGhyb3cgbmV3IEVycm9yKCAnaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAnICsgaW5kZXggKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Z2V0Q29tcG9uZW50OiBmdW5jdGlvbiAoIGluZGV4ICkge1xuXG5cdFx0c3dpdGNoICggaW5kZXggKSB7XG5cblx0XHRcdGNhc2UgMDogcmV0dXJuIHRoaXMueDtcblx0XHRcdGNhc2UgMTogcmV0dXJuIHRoaXMueTtcblx0XHRcdGNhc2UgMjogcmV0dXJuIHRoaXMuejtcblx0XHRcdGNhc2UgMzogcmV0dXJuIHRoaXMudztcblx0XHRcdGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvciggJ2luZGV4IGlzIG91dCBvZiByYW5nZTogJyArIGluZGV4ICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCB0aGlzLngsIHRoaXMueSwgdGhpcy56LCB0aGlzLncgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHRoaXMueCA9IHYueDtcblx0XHR0aGlzLnkgPSB2Lnk7XG5cdFx0dGhpcy56ID0gdi56O1xuXHRcdHRoaXMudyA9ICggdi53ICE9PSB1bmRlZmluZWQgKSA/IHYudyA6IDE7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGFkZDogZnVuY3Rpb24gKCB2LCB3ICkge1xuXG5cdFx0aWYgKCB3ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjQ6IC5hZGQoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5hZGRWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5hZGRWZWN0b3JzKCB2LCB3ICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLnggKz0gdi54O1xuXHRcdHRoaXMueSArPSB2Lnk7XG5cdFx0dGhpcy56ICs9IHYuejtcblx0XHR0aGlzLncgKz0gdi53O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRhZGRTY2FsYXI6IGZ1bmN0aW9uICggcyApIHtcblxuXHRcdHRoaXMueCArPSBzO1xuXHRcdHRoaXMueSArPSBzO1xuXHRcdHRoaXMueiArPSBzO1xuXHRcdHRoaXMudyArPSBzO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRhZGRWZWN0b3JzOiBmdW5jdGlvbiAoIGEsIGIgKSB7XG5cblx0XHR0aGlzLnggPSBhLnggKyBiLng7XG5cdFx0dGhpcy55ID0gYS55ICsgYi55O1xuXHRcdHRoaXMueiA9IGEueiArIGIuejtcblx0XHR0aGlzLncgPSBhLncgKyBiLnc7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGFkZFNjYWxlZFZlY3RvcjogZnVuY3Rpb24gKCB2LCBzICkge1xuXG5cdFx0dGhpcy54ICs9IHYueCAqIHM7XG5cdFx0dGhpcy55ICs9IHYueSAqIHM7XG5cdFx0dGhpcy56ICs9IHYueiAqIHM7XG5cdFx0dGhpcy53ICs9IHYudyAqIHM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHN1YjogZnVuY3Rpb24gKCB2LCB3ICkge1xuXG5cdFx0aWYgKCB3ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjQ6IC5zdWIoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5zdWJWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5zdWJWZWN0b3JzKCB2LCB3ICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLnggLT0gdi54O1xuXHRcdHRoaXMueSAtPSB2Lnk7XG5cdFx0dGhpcy56IC09IHYuejtcblx0XHR0aGlzLncgLT0gdi53O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzdWJTY2FsYXI6IGZ1bmN0aW9uICggcyApIHtcblxuXHRcdHRoaXMueCAtPSBzO1xuXHRcdHRoaXMueSAtPSBzO1xuXHRcdHRoaXMueiAtPSBzO1xuXHRcdHRoaXMudyAtPSBzO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzdWJWZWN0b3JzOiBmdW5jdGlvbiAoIGEsIGIgKSB7XG5cblx0XHR0aGlzLnggPSBhLnggLSBiLng7XG5cdFx0dGhpcy55ID0gYS55IC0gYi55O1xuXHRcdHRoaXMueiA9IGEueiAtIGIuejtcblx0XHR0aGlzLncgPSBhLncgLSBiLnc7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG11bHRpcGx5U2NhbGFyOiBmdW5jdGlvbiAoIHNjYWxhciApIHtcblxuXHRcdHRoaXMueCAqPSBzY2FsYXI7XG5cdFx0dGhpcy55ICo9IHNjYWxhcjtcblx0XHR0aGlzLnogKj0gc2NhbGFyO1xuXHRcdHRoaXMudyAqPSBzY2FsYXI7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGFwcGx5TWF0cml4NDogZnVuY3Rpb24gKCBtICkge1xuXG5cdFx0dmFyIHggPSB0aGlzLngsIHkgPSB0aGlzLnksIHogPSB0aGlzLnosIHcgPSB0aGlzLnc7XG5cdFx0dmFyIGUgPSBtLmVsZW1lbnRzO1xuXG5cdFx0dGhpcy54ID0gZVsgMCBdICogeCArIGVbIDQgXSAqIHkgKyBlWyA4IF0gKiB6ICsgZVsgMTIgXSAqIHc7XG5cdFx0dGhpcy55ID0gZVsgMSBdICogeCArIGVbIDUgXSAqIHkgKyBlWyA5IF0gKiB6ICsgZVsgMTMgXSAqIHc7XG5cdFx0dGhpcy56ID0gZVsgMiBdICogeCArIGVbIDYgXSAqIHkgKyBlWyAxMCBdICogeiArIGVbIDE0IF0gKiB3O1xuXHRcdHRoaXMudyA9IGVbIDMgXSAqIHggKyBlWyA3IF0gKiB5ICsgZVsgMTEgXSAqIHogKyBlWyAxNSBdICogdztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZGl2aWRlU2NhbGFyOiBmdW5jdGlvbiAoIHNjYWxhciApIHtcblxuXHRcdHJldHVybiB0aGlzLm11bHRpcGx5U2NhbGFyKCAxIC8gc2NhbGFyICk7XG5cblx0fSxcblxuXHRzZXRBeGlzQW5nbGVGcm9tUXVhdGVybmlvbjogZnVuY3Rpb24gKCBxICkge1xuXG5cdFx0Ly8gaHR0cDovL3d3dy5ldWNsaWRlYW5zcGFjZS5jb20vbWF0aHMvZ2VvbWV0cnkvcm90YXRpb25zL2NvbnZlcnNpb25zL3F1YXRlcm5pb25Ub0FuZ2xlL2luZGV4Lmh0bVxuXG5cdFx0Ly8gcSBpcyBhc3N1bWVkIHRvIGJlIG5vcm1hbGl6ZWRcblxuXHRcdHRoaXMudyA9IDIgKiBNYXRoLmFjb3MoIHEudyApO1xuXG5cdFx0dmFyIHMgPSBNYXRoLnNxcnQoIDEgLSBxLncgKiBxLncgKTtcblxuXHRcdGlmICggcyA8IDAuMDAwMSApIHtcblxuXHRcdFx0dGhpcy54ID0gMTtcblx0XHRcdHRoaXMueSA9IDA7XG5cdFx0XHR0aGlzLnogPSAwO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dGhpcy54ID0gcS54IC8gcztcblx0XHRcdHRoaXMueSA9IHEueSAvIHM7XG5cdFx0XHR0aGlzLnogPSBxLnogLyBzO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRBeGlzQW5nbGVGcm9tUm90YXRpb25NYXRyaXg6IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdC8vIGh0dHA6Ly93d3cuZXVjbGlkZWFuc3BhY2UuY29tL21hdGhzL2dlb21ldHJ5L3JvdGF0aW9ucy9jb252ZXJzaW9ucy9tYXRyaXhUb0FuZ2xlL2luZGV4Lmh0bVxuXG5cdFx0Ly8gYXNzdW1lcyB0aGUgdXBwZXIgM3gzIG9mIG0gaXMgYSBwdXJlIHJvdGF0aW9uIG1hdHJpeCAoaS5lLCB1bnNjYWxlZClcblxuXHRcdHZhciBhbmdsZSwgeCwgeSwgeixcdFx0Ly8gdmFyaWFibGVzIGZvciByZXN1bHRcblx0XHRcdGVwc2lsb24gPSAwLjAxLFx0XHQvLyBtYXJnaW4gdG8gYWxsb3cgZm9yIHJvdW5kaW5nIGVycm9yc1xuXHRcdFx0ZXBzaWxvbjIgPSAwLjEsXHRcdC8vIG1hcmdpbiB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIDAgYW5kIDE4MCBkZWdyZWVzXG5cblx0XHRcdHRlID0gbS5lbGVtZW50cyxcblxuXHRcdFx0bTExID0gdGVbIDAgXSwgbTEyID0gdGVbIDQgXSwgbTEzID0gdGVbIDggXSxcblx0XHRcdG0yMSA9IHRlWyAxIF0sIG0yMiA9IHRlWyA1IF0sIG0yMyA9IHRlWyA5IF0sXG5cdFx0XHRtMzEgPSB0ZVsgMiBdLCBtMzIgPSB0ZVsgNiBdLCBtMzMgPSB0ZVsgMTAgXTtcblxuXHRcdGlmICggKCBNYXRoLmFicyggbTEyIC0gbTIxICkgPCBlcHNpbG9uICkgJiZcblx0XHQgICAgICggTWF0aC5hYnMoIG0xMyAtIG0zMSApIDwgZXBzaWxvbiApICYmXG5cdFx0ICAgICAoIE1hdGguYWJzKCBtMjMgLSBtMzIgKSA8IGVwc2lsb24gKSApIHtcblxuXHRcdFx0Ly8gc2luZ3VsYXJpdHkgZm91bmRcblx0XHRcdC8vIGZpcnN0IGNoZWNrIGZvciBpZGVudGl0eSBtYXRyaXggd2hpY2ggbXVzdCBoYXZlICsxIGZvciBhbGwgdGVybXNcblx0XHRcdC8vIGluIGxlYWRpbmcgZGlhZ29uYWwgYW5kIHplcm8gaW4gb3RoZXIgdGVybXNcblxuXHRcdFx0aWYgKCAoIE1hdGguYWJzKCBtMTIgKyBtMjEgKSA8IGVwc2lsb24yICkgJiZcblx0XHRcdCAgICAgKCBNYXRoLmFicyggbTEzICsgbTMxICkgPCBlcHNpbG9uMiApICYmXG5cdFx0XHQgICAgICggTWF0aC5hYnMoIG0yMyArIG0zMiApIDwgZXBzaWxvbjIgKSAmJlxuXHRcdFx0ICAgICAoIE1hdGguYWJzKCBtMTEgKyBtMjIgKyBtMzMgLSAzICkgPCBlcHNpbG9uMiApICkge1xuXG5cdFx0XHRcdC8vIHRoaXMgc2luZ3VsYXJpdHkgaXMgaWRlbnRpdHkgbWF0cml4IHNvIGFuZ2xlID0gMFxuXG5cdFx0XHRcdHRoaXMuc2V0KCAxLCAwLCAwLCAwICk7XG5cblx0XHRcdFx0cmV0dXJuIHRoaXM7IC8vIHplcm8gYW5nbGUsIGFyYml0cmFyeSBheGlzXG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gb3RoZXJ3aXNlIHRoaXMgc2luZ3VsYXJpdHkgaXMgYW5nbGUgPSAxODBcblxuXHRcdFx0YW5nbGUgPSBNYXRoLlBJO1xuXG5cdFx0XHR2YXIgeHggPSAoIG0xMSArIDEgKSAvIDI7XG5cdFx0XHR2YXIgeXkgPSAoIG0yMiArIDEgKSAvIDI7XG5cdFx0XHR2YXIgenogPSAoIG0zMyArIDEgKSAvIDI7XG5cdFx0XHR2YXIgeHkgPSAoIG0xMiArIG0yMSApIC8gNDtcblx0XHRcdHZhciB4eiA9ICggbTEzICsgbTMxICkgLyA0O1xuXHRcdFx0dmFyIHl6ID0gKCBtMjMgKyBtMzIgKSAvIDQ7XG5cblx0XHRcdGlmICggKCB4eCA+IHl5ICkgJiYgKCB4eCA+IHp6ICkgKSB7XG5cblx0XHRcdFx0Ly8gbTExIGlzIHRoZSBsYXJnZXN0IGRpYWdvbmFsIHRlcm1cblxuXHRcdFx0XHRpZiAoIHh4IDwgZXBzaWxvbiApIHtcblxuXHRcdFx0XHRcdHggPSAwO1xuXHRcdFx0XHRcdHkgPSAwLjcwNzEwNjc4MTtcblx0XHRcdFx0XHR6ID0gMC43MDcxMDY3ODE7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdHggPSBNYXRoLnNxcnQoIHh4ICk7XG5cdFx0XHRcdFx0eSA9IHh5IC8geDtcblx0XHRcdFx0XHR6ID0geHogLyB4O1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIGlmICggeXkgPiB6eiApIHtcblxuXHRcdFx0XHQvLyBtMjIgaXMgdGhlIGxhcmdlc3QgZGlhZ29uYWwgdGVybVxuXG5cdFx0XHRcdGlmICggeXkgPCBlcHNpbG9uICkge1xuXG5cdFx0XHRcdFx0eCA9IDAuNzA3MTA2NzgxO1xuXHRcdFx0XHRcdHkgPSAwO1xuXHRcdFx0XHRcdHogPSAwLjcwNzEwNjc4MTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0eSA9IE1hdGguc3FydCggeXkgKTtcblx0XHRcdFx0XHR4ID0geHkgLyB5O1xuXHRcdFx0XHRcdHogPSB5eiAvIHk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdC8vIG0zMyBpcyB0aGUgbGFyZ2VzdCBkaWFnb25hbCB0ZXJtIHNvIGJhc2UgcmVzdWx0IG9uIHRoaXNcblxuXHRcdFx0XHRpZiAoIHp6IDwgZXBzaWxvbiApIHtcblxuXHRcdFx0XHRcdHggPSAwLjcwNzEwNjc4MTtcblx0XHRcdFx0XHR5ID0gMC43MDcxMDY3ODE7XG5cdFx0XHRcdFx0eiA9IDA7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdHogPSBNYXRoLnNxcnQoIHp6ICk7XG5cdFx0XHRcdFx0eCA9IHh6IC8gejtcblx0XHRcdFx0XHR5ID0geXogLyB6O1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLnNldCggeCwgeSwgeiwgYW5nbGUgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7IC8vIHJldHVybiAxODAgZGVnIHJvdGF0aW9uXG5cblx0XHR9XG5cblx0XHQvLyBhcyB3ZSBoYXZlIHJlYWNoZWQgaGVyZSB0aGVyZSBhcmUgbm8gc2luZ3VsYXJpdGllcyBzbyB3ZSBjYW4gaGFuZGxlIG5vcm1hbGx5XG5cblx0XHR2YXIgcyA9IE1hdGguc3FydCggKCBtMzIgLSBtMjMgKSAqICggbTMyIC0gbTIzICkgK1xuXHRcdCAgICAgICAgICAgICAgICAgICAoIG0xMyAtIG0zMSApICogKCBtMTMgLSBtMzEgKSArXG5cdFx0ICAgICAgICAgICAgICAgICAgICggbTIxIC0gbTEyICkgKiAoIG0yMSAtIG0xMiApICk7IC8vIHVzZWQgdG8gbm9ybWFsaXplXG5cblx0XHRpZiAoIE1hdGguYWJzKCBzICkgPCAwLjAwMSApIHMgPSAxO1xuXG5cdFx0Ly8gcHJldmVudCBkaXZpZGUgYnkgemVybywgc2hvdWxkIG5vdCBoYXBwZW4gaWYgbWF0cml4IGlzIG9ydGhvZ29uYWwgYW5kIHNob3VsZCBiZVxuXHRcdC8vIGNhdWdodCBieSBzaW5ndWxhcml0eSB0ZXN0IGFib3ZlLCBidXQgSSd2ZSBsZWZ0IGl0IGluIGp1c3QgaW4gY2FzZVxuXG5cdFx0dGhpcy54ID0gKCBtMzIgLSBtMjMgKSAvIHM7XG5cdFx0dGhpcy55ID0gKCBtMTMgLSBtMzEgKSAvIHM7XG5cdFx0dGhpcy56ID0gKCBtMjEgLSBtMTIgKSAvIHM7XG5cdFx0dGhpcy53ID0gTWF0aC5hY29zKCAoIG0xMSArIG0yMiArIG0zMyAtIDEgKSAvIDIgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bWluOiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHR0aGlzLnggPSBNYXRoLm1pbiggdGhpcy54LCB2LnggKTtcblx0XHR0aGlzLnkgPSBNYXRoLm1pbiggdGhpcy55LCB2LnkgKTtcblx0XHR0aGlzLnogPSBNYXRoLm1pbiggdGhpcy56LCB2LnogKTtcblx0XHR0aGlzLncgPSBNYXRoLm1pbiggdGhpcy53LCB2LncgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bWF4OiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHR0aGlzLnggPSBNYXRoLm1heCggdGhpcy54LCB2LnggKTtcblx0XHR0aGlzLnkgPSBNYXRoLm1heCggdGhpcy55LCB2LnkgKTtcblx0XHR0aGlzLnogPSBNYXRoLm1heCggdGhpcy56LCB2LnogKTtcblx0XHR0aGlzLncgPSBNYXRoLm1heCggdGhpcy53LCB2LncgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xhbXA6IGZ1bmN0aW9uICggbWluLCBtYXggKSB7XG5cblx0XHQvLyBhc3N1bWVzIG1pbiA8IG1heCwgY29tcG9uZW50d2lzZVxuXG5cdFx0dGhpcy54ID0gTWF0aC5tYXgoIG1pbi54LCBNYXRoLm1pbiggbWF4LngsIHRoaXMueCApICk7XG5cdFx0dGhpcy55ID0gTWF0aC5tYXgoIG1pbi55LCBNYXRoLm1pbiggbWF4LnksIHRoaXMueSApICk7XG5cdFx0dGhpcy56ID0gTWF0aC5tYXgoIG1pbi56LCBNYXRoLm1pbiggbWF4LnosIHRoaXMueiApICk7XG5cdFx0dGhpcy53ID0gTWF0aC5tYXgoIG1pbi53LCBNYXRoLm1pbiggbWF4LncsIHRoaXMudyApICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNsYW1wU2NhbGFyOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgbWluLCBtYXg7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gY2xhbXBTY2FsYXIoIG1pblZhbCwgbWF4VmFsICkge1xuXG5cdFx0XHRpZiAoIG1pbiA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdG1pbiA9IG5ldyBWZWN0b3I0KCk7XG5cdFx0XHRcdG1heCA9IG5ldyBWZWN0b3I0KCk7XG5cblx0XHRcdH1cblxuXHRcdFx0bWluLnNldCggbWluVmFsLCBtaW5WYWwsIG1pblZhbCwgbWluVmFsICk7XG5cdFx0XHRtYXguc2V0KCBtYXhWYWwsIG1heFZhbCwgbWF4VmFsLCBtYXhWYWwgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXMuY2xhbXAoIG1pbiwgbWF4ICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRjbGFtcExlbmd0aDogZnVuY3Rpb24gKCBtaW4sIG1heCApIHtcblxuXHRcdHZhciBsZW5ndGggPSB0aGlzLmxlbmd0aCgpO1xuXG5cdFx0cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKCBsZW5ndGggfHwgMSApLm11bHRpcGx5U2NhbGFyKCBNYXRoLm1heCggbWluLCBNYXRoLm1pbiggbWF4LCBsZW5ndGggKSApICk7XG5cblx0fSxcblxuXHRmbG9vcjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy54ID0gTWF0aC5mbG9vciggdGhpcy54ICk7XG5cdFx0dGhpcy55ID0gTWF0aC5mbG9vciggdGhpcy55ICk7XG5cdFx0dGhpcy56ID0gTWF0aC5mbG9vciggdGhpcy56ICk7XG5cdFx0dGhpcy53ID0gTWF0aC5mbG9vciggdGhpcy53ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNlaWw6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMueCA9IE1hdGguY2VpbCggdGhpcy54ICk7XG5cdFx0dGhpcy55ID0gTWF0aC5jZWlsKCB0aGlzLnkgKTtcblx0XHR0aGlzLnogPSBNYXRoLmNlaWwoIHRoaXMueiApO1xuXHRcdHRoaXMudyA9IE1hdGguY2VpbCggdGhpcy53ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHJvdW5kOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLnggPSBNYXRoLnJvdW5kKCB0aGlzLnggKTtcblx0XHR0aGlzLnkgPSBNYXRoLnJvdW5kKCB0aGlzLnkgKTtcblx0XHR0aGlzLnogPSBNYXRoLnJvdW5kKCB0aGlzLnogKTtcblx0XHR0aGlzLncgPSBNYXRoLnJvdW5kKCB0aGlzLncgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0cm91bmRUb1plcm86IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMueCA9ICggdGhpcy54IDwgMCApID8gTWF0aC5jZWlsKCB0aGlzLnggKSA6IE1hdGguZmxvb3IoIHRoaXMueCApO1xuXHRcdHRoaXMueSA9ICggdGhpcy55IDwgMCApID8gTWF0aC5jZWlsKCB0aGlzLnkgKSA6IE1hdGguZmxvb3IoIHRoaXMueSApO1xuXHRcdHRoaXMueiA9ICggdGhpcy56IDwgMCApID8gTWF0aC5jZWlsKCB0aGlzLnogKSA6IE1hdGguZmxvb3IoIHRoaXMueiApO1xuXHRcdHRoaXMudyA9ICggdGhpcy53IDwgMCApID8gTWF0aC5jZWlsKCB0aGlzLncgKSA6IE1hdGguZmxvb3IoIHRoaXMudyApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRuZWdhdGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMueCA9IC0gdGhpcy54O1xuXHRcdHRoaXMueSA9IC0gdGhpcy55O1xuXHRcdHRoaXMueiA9IC0gdGhpcy56O1xuXHRcdHRoaXMudyA9IC0gdGhpcy53O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRkb3Q6IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHJldHVybiB0aGlzLnggKiB2LnggKyB0aGlzLnkgKiB2LnkgKyB0aGlzLnogKiB2LnogKyB0aGlzLncgKiB2Lnc7XG5cblx0fSxcblxuXHRsZW5ndGhTcTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMueCAqIHRoaXMueCArIHRoaXMueSAqIHRoaXMueSArIHRoaXMueiAqIHRoaXMueiArIHRoaXMudyAqIHRoaXMudztcblxuXHR9LFxuXG5cdGxlbmd0aDogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIE1hdGguc3FydCggdGhpcy54ICogdGhpcy54ICsgdGhpcy55ICogdGhpcy55ICsgdGhpcy56ICogdGhpcy56ICsgdGhpcy53ICogdGhpcy53ICk7XG5cblx0fSxcblxuXHRtYW5oYXR0YW5MZW5ndGg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBNYXRoLmFicyggdGhpcy54ICkgKyBNYXRoLmFicyggdGhpcy55ICkgKyBNYXRoLmFicyggdGhpcy56ICkgKyBNYXRoLmFicyggdGhpcy53ICk7XG5cblx0fSxcblxuXHRub3JtYWxpemU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLmRpdmlkZVNjYWxhciggdGhpcy5sZW5ndGgoKSB8fCAxICk7XG5cblx0fSxcblxuXHRzZXRMZW5ndGg6IGZ1bmN0aW9uICggbGVuZ3RoICkge1xuXG5cdFx0cmV0dXJuIHRoaXMubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIoIGxlbmd0aCApO1xuXG5cdH0sXG5cblx0bGVycDogZnVuY3Rpb24gKCB2LCBhbHBoYSApIHtcblxuXHRcdHRoaXMueCArPSAoIHYueCAtIHRoaXMueCApICogYWxwaGE7XG5cdFx0dGhpcy55ICs9ICggdi55IC0gdGhpcy55ICkgKiBhbHBoYTtcblx0XHR0aGlzLnogKz0gKCB2LnogLSB0aGlzLnogKSAqIGFscGhhO1xuXHRcdHRoaXMudyArPSAoIHYudyAtIHRoaXMudyApICogYWxwaGE7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGxlcnBWZWN0b3JzOiBmdW5jdGlvbiAoIHYxLCB2MiwgYWxwaGEgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5zdWJWZWN0b3JzKCB2MiwgdjEgKS5tdWx0aXBseVNjYWxhciggYWxwaGEgKS5hZGQoIHYxICk7XG5cblx0fSxcblxuXHRlcXVhbHM6IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHJldHVybiAoICggdi54ID09PSB0aGlzLnggKSAmJiAoIHYueSA9PT0gdGhpcy55ICkgJiYgKCB2LnogPT09IHRoaXMueiApICYmICggdi53ID09PSB0aGlzLncgKSApO1xuXG5cdH0sXG5cblx0ZnJvbUFycmF5OiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7XG5cblx0XHRpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkgb2Zmc2V0ID0gMDtcblxuXHRcdHRoaXMueCA9IGFycmF5WyBvZmZzZXQgXTtcblx0XHR0aGlzLnkgPSBhcnJheVsgb2Zmc2V0ICsgMSBdO1xuXHRcdHRoaXMueiA9IGFycmF5WyBvZmZzZXQgKyAyIF07XG5cdFx0dGhpcy53ID0gYXJyYXlbIG9mZnNldCArIDMgXTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dG9BcnJheTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkge1xuXG5cdFx0aWYgKCBhcnJheSA9PT0gdW5kZWZpbmVkICkgYXJyYXkgPSBbXTtcblx0XHRpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkgb2Zmc2V0ID0gMDtcblxuXHRcdGFycmF5WyBvZmZzZXQgXSA9IHRoaXMueDtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMSBdID0gdGhpcy55O1xuXHRcdGFycmF5WyBvZmZzZXQgKyAyIF0gPSB0aGlzLno7XG5cdFx0YXJyYXlbIG9mZnNldCArIDMgXSA9IHRoaXMudztcblxuXHRcdHJldHVybiBhcnJheTtcblxuXHR9LFxuXG5cdGZyb21CdWZmZXJBdHRyaWJ1dGU6IGZ1bmN0aW9uICggYXR0cmlidXRlLCBpbmRleCwgb2Zmc2V0ICkge1xuXG5cdFx0aWYgKCBvZmZzZXQgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yNDogb2Zmc2V0IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSAuZnJvbUJ1ZmZlckF0dHJpYnV0ZSgpLicgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMueCA9IGF0dHJpYnV0ZS5nZXRYKCBpbmRleCApO1xuXHRcdHRoaXMueSA9IGF0dHJpYnV0ZS5nZXRZKCBpbmRleCApO1xuXHRcdHRoaXMueiA9IGF0dHJpYnV0ZS5nZXRaKCBpbmRleCApO1xuXHRcdHRoaXMudyA9IGF0dHJpYnV0ZS5nZXRXKCBpbmRleCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBzemltZWsgLyBodHRwczovL2dpdGh1Yi5jb20vc3ppbWVrL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3IgTWFyaXVzIEtpbnRlbCAvIGh0dHBzOi8vZ2l0aHViLmNvbS9raW50ZWxcbiAqL1xuXG4vKlxuIEluIG9wdGlvbnMsIHdlIGNhbiBzcGVjaWZ5OlxuICogVGV4dHVyZSBwYXJhbWV0ZXJzIGZvciBhbiBhdXRvLWdlbmVyYXRlZCB0YXJnZXQgdGV4dHVyZVxuICogZGVwdGhCdWZmZXIvc3RlbmNpbEJ1ZmZlcjogQm9vbGVhbnMgdG8gaW5kaWNhdGUgaWYgd2Ugc2hvdWxkIGdlbmVyYXRlIHRoZXNlIGJ1ZmZlcnNcbiovXG5mdW5jdGlvbiBXZWJHTFJlbmRlclRhcmdldCggd2lkdGgsIGhlaWdodCwgb3B0aW9ucyApIHtcblxuXHR0aGlzLndpZHRoID0gd2lkdGg7XG5cdHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuXG5cdHRoaXMuc2Npc3NvciA9IG5ldyBWZWN0b3I0KCAwLCAwLCB3aWR0aCwgaGVpZ2h0ICk7XG5cdHRoaXMuc2Npc3NvclRlc3QgPSBmYWxzZTtcblxuXHR0aGlzLnZpZXdwb3J0ID0gbmV3IFZlY3RvcjQoIDAsIDAsIHdpZHRoLCBoZWlnaHQgKTtcblxuXHRvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuXHRpZiAoIG9wdGlvbnMubWluRmlsdGVyID09PSB1bmRlZmluZWQgKSBvcHRpb25zLm1pbkZpbHRlciA9IExpbmVhckZpbHRlcjtcblxuXHR0aGlzLnRleHR1cmUgPSBuZXcgVGV4dHVyZSggdW5kZWZpbmVkLCB1bmRlZmluZWQsIG9wdGlvbnMud3JhcFMsIG9wdGlvbnMud3JhcFQsIG9wdGlvbnMubWFnRmlsdGVyLCBvcHRpb25zLm1pbkZpbHRlciwgb3B0aW9ucy5mb3JtYXQsIG9wdGlvbnMudHlwZSwgb3B0aW9ucy5hbmlzb3Ryb3B5LCBvcHRpb25zLmVuY29kaW5nICk7XG5cblx0dGhpcy5kZXB0aEJ1ZmZlciA9IG9wdGlvbnMuZGVwdGhCdWZmZXIgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuZGVwdGhCdWZmZXIgOiB0cnVlO1xuXHR0aGlzLnN0ZW5jaWxCdWZmZXIgPSBvcHRpb25zLnN0ZW5jaWxCdWZmZXIgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuc3RlbmNpbEJ1ZmZlciA6IHRydWU7XG5cdHRoaXMuZGVwdGhUZXh0dXJlID0gb3B0aW9ucy5kZXB0aFRleHR1cmUgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuZGVwdGhUZXh0dXJlIDogbnVsbDtcblxufVxuXG5XZWJHTFJlbmRlclRhcmdldC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBFdmVudERpc3BhdGNoZXIucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogV2ViR0xSZW5kZXJUYXJnZXQsXG5cblx0aXNXZWJHTFJlbmRlclRhcmdldDogdHJ1ZSxcblxuXHRzZXRTaXplOiBmdW5jdGlvbiAoIHdpZHRoLCBoZWlnaHQgKSB7XG5cblx0XHRpZiAoIHRoaXMud2lkdGggIT09IHdpZHRoIHx8IHRoaXMuaGVpZ2h0ICE9PSBoZWlnaHQgKSB7XG5cblx0XHRcdHRoaXMud2lkdGggPSB3aWR0aDtcblx0XHRcdHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuXG5cdFx0XHR0aGlzLmRpc3Bvc2UoKTtcblxuXHRcdH1cblxuXHRcdHRoaXMudmlld3BvcnQuc2V0KCAwLCAwLCB3aWR0aCwgaGVpZ2h0ICk7XG5cdFx0dGhpcy5zY2lzc29yLnNldCggMCwgMCwgd2lkdGgsIGhlaWdodCApO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0dGhpcy53aWR0aCA9IHNvdXJjZS53aWR0aDtcblx0XHR0aGlzLmhlaWdodCA9IHNvdXJjZS5oZWlnaHQ7XG5cblx0XHR0aGlzLnZpZXdwb3J0LmNvcHkoIHNvdXJjZS52aWV3cG9ydCApO1xuXG5cdFx0dGhpcy50ZXh0dXJlID0gc291cmNlLnRleHR1cmUuY2xvbmUoKTtcblxuXHRcdHRoaXMuZGVwdGhCdWZmZXIgPSBzb3VyY2UuZGVwdGhCdWZmZXI7XG5cdFx0dGhpcy5zdGVuY2lsQnVmZmVyID0gc291cmNlLnN0ZW5jaWxCdWZmZXI7XG5cdFx0dGhpcy5kZXB0aFRleHR1cmUgPSBzb3VyY2UuZGVwdGhUZXh0dXJlO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRkaXNwb3NlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLmRpc3BhdGNoRXZlbnQoIHsgdHlwZTogJ2Rpc3Bvc2UnIH0gKTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tXG4gKi9cblxuZnVuY3Rpb24gV2ViR0xSZW5kZXJUYXJnZXRDdWJlKCB3aWR0aCwgaGVpZ2h0LCBvcHRpb25zICkge1xuXG5cdFdlYkdMUmVuZGVyVGFyZ2V0LmNhbGwoIHRoaXMsIHdpZHRoLCBoZWlnaHQsIG9wdGlvbnMgKTtcblxuXHR0aGlzLmFjdGl2ZUN1YmVGYWNlID0gMDsgLy8gUFggMCwgTlggMSwgUFkgMiwgTlkgMywgUFogNCwgTlogNVxuXHR0aGlzLmFjdGl2ZU1pcE1hcExldmVsID0gMDtcblxufVxuXG5XZWJHTFJlbmRlclRhcmdldEN1YmUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggV2ViR0xSZW5kZXJUYXJnZXQucHJvdG90eXBlICk7XG5XZWJHTFJlbmRlclRhcmdldEN1YmUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gV2ViR0xSZW5kZXJUYXJnZXRDdWJlO1xuXG5XZWJHTFJlbmRlclRhcmdldEN1YmUucHJvdG90eXBlLmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlID0gdHJ1ZTtcblxuLyoqXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICovXG5cbmZ1bmN0aW9uIERhdGFUZXh0dXJlKCBkYXRhLCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHR5cGUsIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmlsdGVyLCBtaW5GaWx0ZXIsIGFuaXNvdHJvcHksIGVuY29kaW5nICkge1xuXG5cdFRleHR1cmUuY2FsbCggdGhpcywgbnVsbCwgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIsIG1pbkZpbHRlciwgZm9ybWF0LCB0eXBlLCBhbmlzb3Ryb3B5LCBlbmNvZGluZyApO1xuXG5cdHRoaXMuaW1hZ2UgPSB7IGRhdGE6IGRhdGEsIHdpZHRoOiB3aWR0aCwgaGVpZ2h0OiBoZWlnaHQgfTtcblxuXHR0aGlzLm1hZ0ZpbHRlciA9IG1hZ0ZpbHRlciAhPT0gdW5kZWZpbmVkID8gbWFnRmlsdGVyIDogTmVhcmVzdEZpbHRlcjtcblx0dGhpcy5taW5GaWx0ZXIgPSBtaW5GaWx0ZXIgIT09IHVuZGVmaW5lZCA/IG1pbkZpbHRlciA6IE5lYXJlc3RGaWx0ZXI7XG5cblx0dGhpcy5nZW5lcmF0ZU1pcG1hcHMgPSBmYWxzZTtcblx0dGhpcy5mbGlwWSA9IGZhbHNlO1xuXHR0aGlzLnVucGFja0FsaWdubWVudCA9IDE7XG5cbn1cblxuRGF0YVRleHR1cmUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggVGV4dHVyZS5wcm90b3R5cGUgKTtcbkRhdGFUZXh0dXJlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IERhdGFUZXh0dXJlO1xuXG5EYXRhVGV4dHVyZS5wcm90b3R5cGUuaXNEYXRhVGV4dHVyZSA9IHRydWU7XG5cbi8qKlxuICogQGF1dGhvciBiaG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pb1xuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKi9cblxuZnVuY3Rpb24gQm94MyggbWluLCBtYXggKSB7XG5cblx0dGhpcy5taW4gPSAoIG1pbiAhPT0gdW5kZWZpbmVkICkgPyBtaW4gOiBuZXcgVmVjdG9yMyggKyBJbmZpbml0eSwgKyBJbmZpbml0eSwgKyBJbmZpbml0eSApO1xuXHR0aGlzLm1heCA9ICggbWF4ICE9PSB1bmRlZmluZWQgKSA/IG1heCA6IG5ldyBWZWN0b3IzKCAtIEluZmluaXR5LCAtIEluZmluaXR5LCAtIEluZmluaXR5ICk7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggQm94My5wcm90b3R5cGUsIHtcblxuXHRpc0JveDM6IHRydWUsXG5cblx0c2V0OiBmdW5jdGlvbiAoIG1pbiwgbWF4ICkge1xuXG5cdFx0dGhpcy5taW4uY29weSggbWluICk7XG5cdFx0dGhpcy5tYXguY29weSggbWF4ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21BcnJheTogZnVuY3Rpb24gKCBhcnJheSApIHtcblxuXHRcdHZhciBtaW5YID0gKyBJbmZpbml0eTtcblx0XHR2YXIgbWluWSA9ICsgSW5maW5pdHk7XG5cdFx0dmFyIG1pblogPSArIEluZmluaXR5O1xuXG5cdFx0dmFyIG1heFggPSAtIEluZmluaXR5O1xuXHRcdHZhciBtYXhZID0gLSBJbmZpbml0eTtcblx0XHR2YXIgbWF4WiA9IC0gSW5maW5pdHk7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBhcnJheS5sZW5ndGg7IGkgPCBsOyBpICs9IDMgKSB7XG5cblx0XHRcdHZhciB4ID0gYXJyYXlbIGkgXTtcblx0XHRcdHZhciB5ID0gYXJyYXlbIGkgKyAxIF07XG5cdFx0XHR2YXIgeiA9IGFycmF5WyBpICsgMiBdO1xuXG5cdFx0XHRpZiAoIHggPCBtaW5YICkgbWluWCA9IHg7XG5cdFx0XHRpZiAoIHkgPCBtaW5ZICkgbWluWSA9IHk7XG5cdFx0XHRpZiAoIHogPCBtaW5aICkgbWluWiA9IHo7XG5cblx0XHRcdGlmICggeCA+IG1heFggKSBtYXhYID0geDtcblx0XHRcdGlmICggeSA+IG1heFkgKSBtYXhZID0geTtcblx0XHRcdGlmICggeiA+IG1heFogKSBtYXhaID0gejtcblxuXHRcdH1cblxuXHRcdHRoaXMubWluLnNldCggbWluWCwgbWluWSwgbWluWiApO1xuXHRcdHRoaXMubWF4LnNldCggbWF4WCwgbWF4WSwgbWF4WiApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRGcm9tQnVmZmVyQXR0cmlidXRlOiBmdW5jdGlvbiAoIGF0dHJpYnV0ZSApIHtcblxuXHRcdHZhciBtaW5YID0gKyBJbmZpbml0eTtcblx0XHR2YXIgbWluWSA9ICsgSW5maW5pdHk7XG5cdFx0dmFyIG1pblogPSArIEluZmluaXR5O1xuXG5cdFx0dmFyIG1heFggPSAtIEluZmluaXR5O1xuXHRcdHZhciBtYXhZID0gLSBJbmZpbml0eTtcblx0XHR2YXIgbWF4WiA9IC0gSW5maW5pdHk7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBhdHRyaWJ1dGUuY291bnQ7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgeCA9IGF0dHJpYnV0ZS5nZXRYKCBpICk7XG5cdFx0XHR2YXIgeSA9IGF0dHJpYnV0ZS5nZXRZKCBpICk7XG5cdFx0XHR2YXIgeiA9IGF0dHJpYnV0ZS5nZXRaKCBpICk7XG5cblx0XHRcdGlmICggeCA8IG1pblggKSBtaW5YID0geDtcblx0XHRcdGlmICggeSA8IG1pblkgKSBtaW5ZID0geTtcblx0XHRcdGlmICggeiA8IG1pblogKSBtaW5aID0gejtcblxuXHRcdFx0aWYgKCB4ID4gbWF4WCApIG1heFggPSB4O1xuXHRcdFx0aWYgKCB5ID4gbWF4WSApIG1heFkgPSB5O1xuXHRcdFx0aWYgKCB6ID4gbWF4WiApIG1heFogPSB6O1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5taW4uc2V0KCBtaW5YLCBtaW5ZLCBtaW5aICk7XG5cdFx0dGhpcy5tYXguc2V0KCBtYXhYLCBtYXhZLCBtYXhaICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21Qb2ludHM6IGZ1bmN0aW9uICggcG9pbnRzICkge1xuXG5cdFx0dGhpcy5tYWtlRW1wdHkoKTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBwb2ludHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHRoaXMuZXhwYW5kQnlQb2ludCggcG9pbnRzWyBpIF0gKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbUNlbnRlckFuZFNpemU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gc2V0RnJvbUNlbnRlckFuZFNpemUoIGNlbnRlciwgc2l6ZSApIHtcblxuXHRcdFx0dmFyIGhhbGZTaXplID0gdjEuY29weSggc2l6ZSApLm11bHRpcGx5U2NhbGFyKCAwLjUgKTtcblxuXHRcdFx0dGhpcy5taW4uY29weSggY2VudGVyICkuc3ViKCBoYWxmU2l6ZSApO1xuXHRcdFx0dGhpcy5tYXguY29weSggY2VudGVyICkuYWRkKCBoYWxmU2l6ZSApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHNldEZyb21PYmplY3Q6IGZ1bmN0aW9uICggb2JqZWN0ICkge1xuXG5cdFx0dGhpcy5tYWtlRW1wdHkoKTtcblxuXHRcdHJldHVybiB0aGlzLmV4cGFuZEJ5T2JqZWN0KCBvYmplY3QgKTtcblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIGJveCApIHtcblxuXHRcdHRoaXMubWluLmNvcHkoIGJveC5taW4gKTtcblx0XHR0aGlzLm1heC5jb3B5KCBib3gubWF4ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG1ha2VFbXB0eTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5taW4ueCA9IHRoaXMubWluLnkgPSB0aGlzLm1pbi56ID0gKyBJbmZpbml0eTtcblx0XHR0aGlzLm1heC54ID0gdGhpcy5tYXgueSA9IHRoaXMubWF4LnogPSAtIEluZmluaXR5O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRpc0VtcHR5OiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyB0aGlzIGlzIGEgbW9yZSByb2J1c3QgY2hlY2sgZm9yIGVtcHR5IHRoYW4gKCB2b2x1bWUgPD0gMCApIGJlY2F1c2Ugdm9sdW1lIGNhbiBnZXQgcG9zaXRpdmUgd2l0aCB0d28gbmVnYXRpdmUgYXhlc1xuXG5cdFx0cmV0dXJuICggdGhpcy5tYXgueCA8IHRoaXMubWluLnggKSB8fCAoIHRoaXMubWF4LnkgPCB0aGlzLm1pbi55ICkgfHwgKCB0aGlzLm1heC56IDwgdGhpcy5taW4ueiApO1xuXG5cdH0sXG5cblx0Z2V0Q2VudGVyOiBmdW5jdGlvbiAoIHRhcmdldCApIHtcblxuXHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJveDM6IC5nZXRDZW50ZXIoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApO1xuXHRcdFx0dGFyZ2V0ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmlzRW1wdHkoKSA/IHRhcmdldC5zZXQoIDAsIDAsIDAgKSA6IHRhcmdldC5hZGRWZWN0b3JzKCB0aGlzLm1pbiwgdGhpcy5tYXggKS5tdWx0aXBseVNjYWxhciggMC41ICk7XG5cblx0fSxcblxuXHRnZXRTaXplOiBmdW5jdGlvbiAoIHRhcmdldCApIHtcblxuXHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJveDM6IC5nZXRTaXplKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5pc0VtcHR5KCkgPyB0YXJnZXQuc2V0KCAwLCAwLCAwICkgOiB0YXJnZXQuc3ViVmVjdG9ycyggdGhpcy5tYXgsIHRoaXMubWluICk7XG5cblx0fSxcblxuXHRleHBhbmRCeVBvaW50OiBmdW5jdGlvbiAoIHBvaW50ICkge1xuXG5cdFx0dGhpcy5taW4ubWluKCBwb2ludCApO1xuXHRcdHRoaXMubWF4Lm1heCggcG9pbnQgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZXhwYW5kQnlWZWN0b3I6IGZ1bmN0aW9uICggdmVjdG9yICkge1xuXG5cdFx0dGhpcy5taW4uc3ViKCB2ZWN0b3IgKTtcblx0XHR0aGlzLm1heC5hZGQoIHZlY3RvciApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRleHBhbmRCeVNjYWxhcjogZnVuY3Rpb24gKCBzY2FsYXIgKSB7XG5cblx0XHR0aGlzLm1pbi5hZGRTY2FsYXIoIC0gc2NhbGFyICk7XG5cdFx0dGhpcy5tYXguYWRkU2NhbGFyKCBzY2FsYXIgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZXhwYW5kQnlPYmplY3Q6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIENvbXB1dGVzIHRoZSB3b3JsZC1heGlzLWFsaWduZWQgYm91bmRpbmcgYm94IG9mIGFuIG9iamVjdCAoaW5jbHVkaW5nIGl0cyBjaGlsZHJlbiksXG5cdFx0Ly8gYWNjb3VudGluZyBmb3IgYm90aCB0aGUgb2JqZWN0J3MsIGFuZCBjaGlsZHJlbidzLCB3b3JsZCB0cmFuc2Zvcm1zXG5cblx0XHR2YXIgc2NvcGUsIGksIGw7XG5cblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0ZnVuY3Rpb24gdHJhdmVyc2UoIG5vZGUgKSB7XG5cblx0XHRcdHZhciBnZW9tZXRyeSA9IG5vZGUuZ2VvbWV0cnk7XG5cblx0XHRcdGlmICggZ2VvbWV0cnkgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRpZiAoIGdlb21ldHJ5LmlzR2VvbWV0cnkgKSB7XG5cblx0XHRcdFx0XHR2YXIgdmVydGljZXMgPSBnZW9tZXRyeS52ZXJ0aWNlcztcblxuXHRcdFx0XHRcdGZvciAoIGkgPSAwLCBsID0gdmVydGljZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdFx0djEuY29weSggdmVydGljZXNbIGkgXSApO1xuXHRcdFx0XHRcdFx0djEuYXBwbHlNYXRyaXg0KCBub2RlLm1hdHJpeFdvcmxkICk7XG5cblx0XHRcdFx0XHRcdHNjb3BlLmV4cGFuZEJ5UG9pbnQoIHYxICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSBlbHNlIGlmICggZ2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSApIHtcblxuXHRcdFx0XHRcdHZhciBhdHRyaWJ1dGUgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uO1xuXG5cdFx0XHRcdFx0aWYgKCBhdHRyaWJ1dGUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdFx0Zm9yICggaSA9IDAsIGwgPSBhdHRyaWJ1dGUuY291bnQ7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0XHRcdHYxLmZyb21CdWZmZXJBdHRyaWJ1dGUoIGF0dHJpYnV0ZSwgaSApLmFwcGx5TWF0cml4NCggbm9kZS5tYXRyaXhXb3JsZCApO1xuXG5cdFx0XHRcdFx0XHRcdHNjb3BlLmV4cGFuZEJ5UG9pbnQoIHYxICk7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiBmdW5jdGlvbiBleHBhbmRCeU9iamVjdCggb2JqZWN0ICkge1xuXG5cdFx0XHRzY29wZSA9IHRoaXM7XG5cblx0XHRcdG9iamVjdC51cGRhdGVNYXRyaXhXb3JsZCggdHJ1ZSApO1xuXG5cdFx0XHRvYmplY3QudHJhdmVyc2UoIHRyYXZlcnNlICk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0Y29udGFpbnNQb2ludDogZnVuY3Rpb24gKCBwb2ludCApIHtcblxuXHRcdHJldHVybiBwb2ludC54IDwgdGhpcy5taW4ueCB8fCBwb2ludC54ID4gdGhpcy5tYXgueCB8fFxuXHRcdFx0cG9pbnQueSA8IHRoaXMubWluLnkgfHwgcG9pbnQueSA+IHRoaXMubWF4LnkgfHxcblx0XHRcdHBvaW50LnogPCB0aGlzLm1pbi56IHx8IHBvaW50LnogPiB0aGlzLm1heC56ID8gZmFsc2UgOiB0cnVlO1xuXG5cdH0sXG5cblx0Y29udGFpbnNCb3g6IGZ1bmN0aW9uICggYm94ICkge1xuXG5cdFx0cmV0dXJuIHRoaXMubWluLnggPD0gYm94Lm1pbi54ICYmIGJveC5tYXgueCA8PSB0aGlzLm1heC54ICYmXG5cdFx0XHR0aGlzLm1pbi55IDw9IGJveC5taW4ueSAmJiBib3gubWF4LnkgPD0gdGhpcy5tYXgueSAmJlxuXHRcdFx0dGhpcy5taW4ueiA8PSBib3gubWluLnogJiYgYm94Lm1heC56IDw9IHRoaXMubWF4Lno7XG5cblx0fSxcblxuXHRnZXRQYXJhbWV0ZXI6IGZ1bmN0aW9uICggcG9pbnQsIHRhcmdldCApIHtcblxuXHRcdC8vIFRoaXMgY2FuIHBvdGVudGlhbGx5IGhhdmUgYSBkaXZpZGUgYnkgemVybyBpZiB0aGUgYm94XG5cdFx0Ly8gaGFzIGEgc2l6ZSBkaW1lbnNpb24gb2YgMC5cblxuXHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJveDM6IC5nZXRQYXJhbWV0ZXIoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApO1xuXHRcdFx0dGFyZ2V0ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0YXJnZXQuc2V0KFxuXHRcdFx0KCBwb2ludC54IC0gdGhpcy5taW4ueCApIC8gKCB0aGlzLm1heC54IC0gdGhpcy5taW4ueCApLFxuXHRcdFx0KCBwb2ludC55IC0gdGhpcy5taW4ueSApIC8gKCB0aGlzLm1heC55IC0gdGhpcy5taW4ueSApLFxuXHRcdFx0KCBwb2ludC56IC0gdGhpcy5taW4ueiApIC8gKCB0aGlzLm1heC56IC0gdGhpcy5taW4ueiApXG5cdFx0KTtcblxuXHR9LFxuXG5cdGludGVyc2VjdHNCb3g6IGZ1bmN0aW9uICggYm94ICkge1xuXG5cdFx0Ly8gdXNpbmcgNiBzcGxpdHRpbmcgcGxhbmVzIHRvIHJ1bGUgb3V0IGludGVyc2VjdGlvbnMuXG5cdFx0cmV0dXJuIGJveC5tYXgueCA8IHRoaXMubWluLnggfHwgYm94Lm1pbi54ID4gdGhpcy5tYXgueCB8fFxuXHRcdFx0Ym94Lm1heC55IDwgdGhpcy5taW4ueSB8fCBib3gubWluLnkgPiB0aGlzLm1heC55IHx8XG5cdFx0XHRib3gubWF4LnogPCB0aGlzLm1pbi56IHx8IGJveC5taW4ueiA+IHRoaXMubWF4LnogPyBmYWxzZSA6IHRydWU7XG5cblx0fSxcblxuXHRpbnRlcnNlY3RzU3BoZXJlOiAoIGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBjbG9zZXN0UG9pbnQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGludGVyc2VjdHNTcGhlcmUoIHNwaGVyZSApIHtcblxuXHRcdFx0Ly8gRmluZCB0aGUgcG9pbnQgb24gdGhlIEFBQkIgY2xvc2VzdCB0byB0aGUgc3BoZXJlIGNlbnRlci5cblx0XHRcdHRoaXMuY2xhbXBQb2ludCggc3BoZXJlLmNlbnRlciwgY2xvc2VzdFBvaW50ICk7XG5cblx0XHRcdC8vIElmIHRoYXQgcG9pbnQgaXMgaW5zaWRlIHRoZSBzcGhlcmUsIHRoZSBBQUJCIGFuZCBzcGhlcmUgaW50ZXJzZWN0LlxuXHRcdFx0cmV0dXJuIGNsb3Nlc3RQb2ludC5kaXN0YW5jZVRvU3F1YXJlZCggc3BoZXJlLmNlbnRlciApIDw9ICggc3BoZXJlLnJhZGl1cyAqIHNwaGVyZS5yYWRpdXMgKTtcblxuXHRcdH07XG5cblx0fSApKCksXG5cblx0aW50ZXJzZWN0c1BsYW5lOiBmdW5jdGlvbiAoIHBsYW5lICkge1xuXG5cdFx0Ly8gV2UgY29tcHV0ZSB0aGUgbWluaW11bSBhbmQgbWF4aW11bSBkb3QgcHJvZHVjdCB2YWx1ZXMuIElmIHRob3NlIHZhbHVlc1xuXHRcdC8vIGFyZSBvbiB0aGUgc2FtZSBzaWRlIChiYWNrIG9yIGZyb250KSBvZiB0aGUgcGxhbmUsIHRoZW4gdGhlcmUgaXMgbm8gaW50ZXJzZWN0aW9uLlxuXG5cdFx0dmFyIG1pbiwgbWF4O1xuXG5cdFx0aWYgKCBwbGFuZS5ub3JtYWwueCA+IDAgKSB7XG5cblx0XHRcdG1pbiA9IHBsYW5lLm5vcm1hbC54ICogdGhpcy5taW4ueDtcblx0XHRcdG1heCA9IHBsYW5lLm5vcm1hbC54ICogdGhpcy5tYXgueDtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdG1pbiA9IHBsYW5lLm5vcm1hbC54ICogdGhpcy5tYXgueDtcblx0XHRcdG1heCA9IHBsYW5lLm5vcm1hbC54ICogdGhpcy5taW4ueDtcblxuXHRcdH1cblxuXHRcdGlmICggcGxhbmUubm9ybWFsLnkgPiAwICkge1xuXG5cdFx0XHRtaW4gKz0gcGxhbmUubm9ybWFsLnkgKiB0aGlzLm1pbi55O1xuXHRcdFx0bWF4ICs9IHBsYW5lLm5vcm1hbC55ICogdGhpcy5tYXgueTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdG1pbiArPSBwbGFuZS5ub3JtYWwueSAqIHRoaXMubWF4Lnk7XG5cdFx0XHRtYXggKz0gcGxhbmUubm9ybWFsLnkgKiB0aGlzLm1pbi55O1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBwbGFuZS5ub3JtYWwueiA+IDAgKSB7XG5cblx0XHRcdG1pbiArPSBwbGFuZS5ub3JtYWwueiAqIHRoaXMubWluLno7XG5cdFx0XHRtYXggKz0gcGxhbmUubm9ybWFsLnogKiB0aGlzLm1heC56O1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0bWluICs9IHBsYW5lLm5vcm1hbC56ICogdGhpcy5tYXguejtcblx0XHRcdG1heCArPSBwbGFuZS5ub3JtYWwueiAqIHRoaXMubWluLno7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gKCBtaW4gPD0gcGxhbmUuY29uc3RhbnQgJiYgbWF4ID49IHBsYW5lLmNvbnN0YW50ICk7XG5cblx0fSxcblxuXHRpbnRlcnNlY3RzVHJpYW5nbGU6ICggZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gdHJpYW5nbGUgY2VudGVyZWQgdmVydGljZXNcblx0XHR2YXIgdjAgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIHYyID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdC8vIHRyaWFuZ2xlIGVkZ2UgdmVjdG9yc1xuXHRcdHZhciBmMCA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIGYxID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgZjIgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0dmFyIHRlc3RBeGlzID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHZhciBjZW50ZXIgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciBleHRlbnRzID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHZhciB0cmlhbmdsZU5vcm1hbCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRmdW5jdGlvbiBzYXRGb3JBeGVzKCBheGVzICkge1xuXG5cdFx0XHR2YXIgaSwgajtcblxuXHRcdFx0Zm9yICggaSA9IDAsIGogPSBheGVzLmxlbmd0aCAtIDM7IGkgPD0gajsgaSArPSAzICkge1xuXG5cdFx0XHRcdHRlc3RBeGlzLmZyb21BcnJheSggYXhlcywgaSApO1xuXHRcdFx0XHQvLyBwcm9qZWN0IHRoZSBhYWJiIG9udG8gdGhlIHNlcGVyYXRpbmcgYXhpc1xuXHRcdFx0XHR2YXIgciA9IGV4dGVudHMueCAqIE1hdGguYWJzKCB0ZXN0QXhpcy54ICkgKyBleHRlbnRzLnkgKiBNYXRoLmFicyggdGVzdEF4aXMueSApICsgZXh0ZW50cy56ICogTWF0aC5hYnMoIHRlc3RBeGlzLnogKTtcblx0XHRcdFx0Ly8gcHJvamVjdCBhbGwgMyB2ZXJ0aWNlcyBvZiB0aGUgdHJpYW5nbGUgb250byB0aGUgc2VwZXJhdGluZyBheGlzXG5cdFx0XHRcdHZhciBwMCA9IHYwLmRvdCggdGVzdEF4aXMgKTtcblx0XHRcdFx0dmFyIHAxID0gdjEuZG90KCB0ZXN0QXhpcyApO1xuXHRcdFx0XHR2YXIgcDIgPSB2Mi5kb3QoIHRlc3RBeGlzICk7XG5cdFx0XHRcdC8vIGFjdHVhbCB0ZXN0LCBiYXNpY2FsbHkgc2VlIGlmIGVpdGhlciBvZiB0aGUgbW9zdCBleHRyZW1lIG9mIHRoZSB0cmlhbmdsZSBwb2ludHMgaW50ZXJzZWN0cyByXG5cdFx0XHRcdGlmICggTWF0aC5tYXgoIC0gTWF0aC5tYXgoIHAwLCBwMSwgcDIgKSwgTWF0aC5taW4oIHAwLCBwMSwgcDIgKSApID4gciApIHtcblxuXHRcdFx0XHRcdC8vIHBvaW50cyBvZiB0aGUgcHJvamVjdGVkIHRyaWFuZ2xlIGFyZSBvdXRzaWRlIHRoZSBwcm9qZWN0ZWQgaGFsZi1sZW5ndGggb2YgdGhlIGFhYmJcblx0XHRcdFx0XHQvLyB0aGUgYXhpcyBpcyBzZXBlcmF0aW5nIGFuZCB3ZSBjYW4gZXhpdFxuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRydWU7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gaW50ZXJzZWN0c1RyaWFuZ2xlKCB0cmlhbmdsZSApIHtcblxuXHRcdFx0aWYgKCB0aGlzLmlzRW1wdHkoKSApIHtcblxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gY29tcHV0ZSBib3ggY2VudGVyIGFuZCBleHRlbnRzXG5cdFx0XHR0aGlzLmdldENlbnRlciggY2VudGVyICk7XG5cdFx0XHRleHRlbnRzLnN1YlZlY3RvcnMoIHRoaXMubWF4LCBjZW50ZXIgKTtcblxuXHRcdFx0Ly8gdHJhbnNsYXRlIHRyaWFuZ2xlIHRvIGFhYmIgb3JpZ2luXG5cdFx0XHR2MC5zdWJWZWN0b3JzKCB0cmlhbmdsZS5hLCBjZW50ZXIgKTtcblx0XHRcdHYxLnN1YlZlY3RvcnMoIHRyaWFuZ2xlLmIsIGNlbnRlciApO1xuXHRcdFx0djIuc3ViVmVjdG9ycyggdHJpYW5nbGUuYywgY2VudGVyICk7XG5cblx0XHRcdC8vIGNvbXB1dGUgZWRnZSB2ZWN0b3JzIGZvciB0cmlhbmdsZVxuXHRcdFx0ZjAuc3ViVmVjdG9ycyggdjEsIHYwICk7XG5cdFx0XHRmMS5zdWJWZWN0b3JzKCB2MiwgdjEgKTtcblx0XHRcdGYyLnN1YlZlY3RvcnMoIHYwLCB2MiApO1xuXG5cdFx0XHQvLyB0ZXN0IGFnYWluc3QgYXhlcyB0aGF0IGFyZSBnaXZlbiBieSBjcm9zcyBwcm9kdWN0IGNvbWJpbmF0aW9ucyBvZiB0aGUgZWRnZXMgb2YgdGhlIHRyaWFuZ2xlIGFuZCB0aGUgZWRnZXMgb2YgdGhlIGFhYmJcblx0XHRcdC8vIG1ha2UgYW4gYXhpcyB0ZXN0aW5nIG9mIGVhY2ggb2YgdGhlIDMgc2lkZXMgb2YgdGhlIGFhYmIgYWdhaW5zdCBlYWNoIG9mIHRoZSAzIHNpZGVzIG9mIHRoZSB0cmlhbmdsZSA9IDkgYXhpcyBvZiBzZXBhcmF0aW9uXG5cdFx0XHQvLyBheGlzX2lqID0gdV9pIHggZl9qICh1MCwgdTEsIHUyID0gZmFjZSBub3JtYWxzIG9mIGFhYmIgPSB4LHkseiBheGVzIHZlY3RvcnMgc2luY2UgYWFiYiBpcyBheGlzIGFsaWduZWQpXG5cdFx0XHR2YXIgYXhlcyA9IFtcblx0XHRcdFx0MCwgLSBmMC56LCBmMC55LCAwLCAtIGYxLnosIGYxLnksIDAsIC0gZjIueiwgZjIueSxcblx0XHRcdFx0ZjAueiwgMCwgLSBmMC54LCBmMS56LCAwLCAtIGYxLngsIGYyLnosIDAsIC0gZjIueCxcblx0XHRcdFx0LSBmMC55LCBmMC54LCAwLCAtIGYxLnksIGYxLngsIDAsIC0gZjIueSwgZjIueCwgMFxuXHRcdFx0XTtcblx0XHRcdGlmICggISBzYXRGb3JBeGVzKCBheGVzICkgKSB7XG5cblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIHRlc3QgMyBmYWNlIG5vcm1hbHMgZnJvbSB0aGUgYWFiYlxuXHRcdFx0YXhlcyA9IFsgMSwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMSBdO1xuXHRcdFx0aWYgKCAhIHNhdEZvckF4ZXMoIGF4ZXMgKSApIHtcblxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gZmluYWxseSB0ZXN0aW5nIHRoZSBmYWNlIG5vcm1hbCBvZiB0aGUgdHJpYW5nbGVcblx0XHRcdC8vIHVzZSBhbHJlYWR5IGV4aXN0aW5nIHRyaWFuZ2xlIGVkZ2UgdmVjdG9ycyBoZXJlXG5cdFx0XHR0cmlhbmdsZU5vcm1hbC5jcm9zc1ZlY3RvcnMoIGYwLCBmMSApO1xuXHRcdFx0YXhlcyA9IFsgdHJpYW5nbGVOb3JtYWwueCwgdHJpYW5nbGVOb3JtYWwueSwgdHJpYW5nbGVOb3JtYWwueiBdO1xuXHRcdFx0cmV0dXJuIHNhdEZvckF4ZXMoIGF4ZXMgKTtcblxuXHRcdH07XG5cblx0fSApKCksXG5cblx0Y2xhbXBQb2ludDogZnVuY3Rpb24gKCBwb2ludCwgdGFyZ2V0ICkge1xuXG5cdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQm94MzogLmNsYW1wUG9pbnQoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApO1xuXHRcdFx0dGFyZ2V0ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0YXJnZXQuY29weSggcG9pbnQgKS5jbGFtcCggdGhpcy5taW4sIHRoaXMubWF4ICk7XG5cblx0fSxcblxuXHRkaXN0YW5jZVRvUG9pbnQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gZGlzdGFuY2VUb1BvaW50KCBwb2ludCApIHtcblxuXHRcdFx0dmFyIGNsYW1wZWRQb2ludCA9IHYxLmNvcHkoIHBvaW50ICkuY2xhbXAoIHRoaXMubWluLCB0aGlzLm1heCApO1xuXHRcdFx0cmV0dXJuIGNsYW1wZWRQb2ludC5zdWIoIHBvaW50ICkubGVuZ3RoKCk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRnZXRCb3VuZGluZ1NwaGVyZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBnZXRCb3VuZGluZ1NwaGVyZSggdGFyZ2V0ICkge1xuXG5cdFx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJveDM6IC5nZXRCb3VuZGluZ1NwaGVyZSgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHRcdHRhcmdldCA9IG5ldyBTcGhlcmUoKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmdldENlbnRlciggdGFyZ2V0LmNlbnRlciApO1xuXG5cdFx0XHR0YXJnZXQucmFkaXVzID0gdGhpcy5nZXRTaXplKCB2MSApLmxlbmd0aCgpICogMC41O1xuXG5cdFx0XHRyZXR1cm4gdGFyZ2V0O1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0aW50ZXJzZWN0OiBmdW5jdGlvbiAoIGJveCApIHtcblxuXHRcdHRoaXMubWluLm1heCggYm94Lm1pbiApO1xuXHRcdHRoaXMubWF4Lm1pbiggYm94Lm1heCApO1xuXG5cdFx0Ly8gZW5zdXJlIHRoYXQgaWYgdGhlcmUgaXMgbm8gb3ZlcmxhcCwgdGhlIHJlc3VsdCBpcyBmdWxseSBlbXB0eSwgbm90IHNsaWdodGx5IGVtcHR5IHdpdGggbm9uLWluZi8raW5mIHZhbHVlcyB0aGF0IHdpbGwgY2F1c2Ugc3Vic2VxdWVuY2UgaW50ZXJzZWN0cyB0byBlcnJvbmVvdXNseSByZXR1cm4gdmFsaWQgdmFsdWVzLlxuXHRcdGlmICggdGhpcy5pc0VtcHR5KCkgKSB0aGlzLm1ha2VFbXB0eSgpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHR1bmlvbjogZnVuY3Rpb24gKCBib3ggKSB7XG5cblx0XHR0aGlzLm1pbi5taW4oIGJveC5taW4gKTtcblx0XHR0aGlzLm1heC5tYXgoIGJveC5tYXggKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YXBwbHlNYXRyaXg0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgcG9pbnRzID0gW1xuXHRcdFx0bmV3IFZlY3RvcjMoKSxcblx0XHRcdG5ldyBWZWN0b3IzKCksXG5cdFx0XHRuZXcgVmVjdG9yMygpLFxuXHRcdFx0bmV3IFZlY3RvcjMoKSxcblx0XHRcdG5ldyBWZWN0b3IzKCksXG5cdFx0XHRuZXcgVmVjdG9yMygpLFxuXHRcdFx0bmV3IFZlY3RvcjMoKSxcblx0XHRcdG5ldyBWZWN0b3IzKClcblx0XHRdO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGFwcGx5TWF0cml4NCggbWF0cml4ICkge1xuXG5cdFx0XHQvLyB0cmFuc2Zvcm0gb2YgZW1wdHkgYm94IGlzIGFuIGVtcHR5IGJveC5cblx0XHRcdGlmICggdGhpcy5pc0VtcHR5KCkgKSByZXR1cm4gdGhpcztcblxuXHRcdFx0Ly8gTk9URTogSSBhbSB1c2luZyBhIGJpbmFyeSBwYXR0ZXJuIHRvIHNwZWNpZnkgYWxsIDJeMyBjb21iaW5hdGlvbnMgYmVsb3dcblx0XHRcdHBvaW50c1sgMCBdLnNldCggdGhpcy5taW4ueCwgdGhpcy5taW4ueSwgdGhpcy5taW4ueiApLmFwcGx5TWF0cml4NCggbWF0cml4ICk7IC8vIDAwMFxuXHRcdFx0cG9pbnRzWyAxIF0uc2V0KCB0aGlzLm1pbi54LCB0aGlzLm1pbi55LCB0aGlzLm1heC56ICkuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTsgLy8gMDAxXG5cdFx0XHRwb2ludHNbIDIgXS5zZXQoIHRoaXMubWluLngsIHRoaXMubWF4LnksIHRoaXMubWluLnogKS5hcHBseU1hdHJpeDQoIG1hdHJpeCApOyAvLyAwMTBcblx0XHRcdHBvaW50c1sgMyBdLnNldCggdGhpcy5taW4ueCwgdGhpcy5tYXgueSwgdGhpcy5tYXgueiApLmFwcGx5TWF0cml4NCggbWF0cml4ICk7IC8vIDAxMVxuXHRcdFx0cG9pbnRzWyA0IF0uc2V0KCB0aGlzLm1heC54LCB0aGlzLm1pbi55LCB0aGlzLm1pbi56ICkuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTsgLy8gMTAwXG5cdFx0XHRwb2ludHNbIDUgXS5zZXQoIHRoaXMubWF4LngsIHRoaXMubWluLnksIHRoaXMubWF4LnogKS5hcHBseU1hdHJpeDQoIG1hdHJpeCApOyAvLyAxMDFcblx0XHRcdHBvaW50c1sgNiBdLnNldCggdGhpcy5tYXgueCwgdGhpcy5tYXgueSwgdGhpcy5taW4ueiApLmFwcGx5TWF0cml4NCggbWF0cml4ICk7IC8vIDExMFxuXHRcdFx0cG9pbnRzWyA3IF0uc2V0KCB0aGlzLm1heC54LCB0aGlzLm1heC55LCB0aGlzLm1heC56ICkuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTtcdC8vIDExMVxuXG5cdFx0XHR0aGlzLnNldEZyb21Qb2ludHMoIHBvaW50cyApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHRyYW5zbGF0ZTogZnVuY3Rpb24gKCBvZmZzZXQgKSB7XG5cblx0XHR0aGlzLm1pbi5hZGQoIG9mZnNldCApO1xuXHRcdHRoaXMubWF4LmFkZCggb2Zmc2V0ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGVxdWFsczogZnVuY3Rpb24gKCBib3ggKSB7XG5cblx0XHRyZXR1cm4gYm94Lm1pbi5lcXVhbHMoIHRoaXMubWluICkgJiYgYm94Lm1heC5lcXVhbHMoIHRoaXMubWF4ICk7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBiaG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pb1xuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBTcGhlcmUoIGNlbnRlciwgcmFkaXVzICkge1xuXG5cdHRoaXMuY2VudGVyID0gKCBjZW50ZXIgIT09IHVuZGVmaW5lZCApID8gY2VudGVyIDogbmV3IFZlY3RvcjMoKTtcblx0dGhpcy5yYWRpdXMgPSAoIHJhZGl1cyAhPT0gdW5kZWZpbmVkICkgPyByYWRpdXMgOiAwO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIFNwaGVyZS5wcm90b3R5cGUsIHtcblxuXHRzZXQ6IGZ1bmN0aW9uICggY2VudGVyLCByYWRpdXMgKSB7XG5cblx0XHR0aGlzLmNlbnRlci5jb3B5KCBjZW50ZXIgKTtcblx0XHR0aGlzLnJhZGl1cyA9IHJhZGl1cztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbVBvaW50czogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGJveCA9IG5ldyBCb3gzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gc2V0RnJvbVBvaW50cyggcG9pbnRzLCBvcHRpb25hbENlbnRlciApIHtcblxuXHRcdFx0dmFyIGNlbnRlciA9IHRoaXMuY2VudGVyO1xuXG5cdFx0XHRpZiAoIG9wdGlvbmFsQ2VudGVyICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Y2VudGVyLmNvcHkoIG9wdGlvbmFsQ2VudGVyICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Ym94LnNldEZyb21Qb2ludHMoIHBvaW50cyApLmdldENlbnRlciggY2VudGVyICk7XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIG1heFJhZGl1c1NxID0gMDtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IHBvaW50cy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHRtYXhSYWRpdXNTcSA9IE1hdGgubWF4KCBtYXhSYWRpdXNTcSwgY2VudGVyLmRpc3RhbmNlVG9TcXVhcmVkKCBwb2ludHNbIGkgXSApICk7XG5cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5yYWRpdXMgPSBNYXRoLnNxcnQoIG1heFJhZGl1c1NxICk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc3BoZXJlICkge1xuXG5cdFx0dGhpcy5jZW50ZXIuY29weSggc3BoZXJlLmNlbnRlciApO1xuXHRcdHRoaXMucmFkaXVzID0gc3BoZXJlLnJhZGl1cztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZW1wdHk6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiAoIHRoaXMucmFkaXVzIDw9IDAgKTtcblxuXHR9LFxuXG5cdGNvbnRhaW5zUG9pbnQ6IGZ1bmN0aW9uICggcG9pbnQgKSB7XG5cblx0XHRyZXR1cm4gKCBwb2ludC5kaXN0YW5jZVRvU3F1YXJlZCggdGhpcy5jZW50ZXIgKSA8PSAoIHRoaXMucmFkaXVzICogdGhpcy5yYWRpdXMgKSApO1xuXG5cdH0sXG5cblx0ZGlzdGFuY2VUb1BvaW50OiBmdW5jdGlvbiAoIHBvaW50ICkge1xuXG5cdFx0cmV0dXJuICggcG9pbnQuZGlzdGFuY2VUbyggdGhpcy5jZW50ZXIgKSAtIHRoaXMucmFkaXVzICk7XG5cblx0fSxcblxuXHRpbnRlcnNlY3RzU3BoZXJlOiBmdW5jdGlvbiAoIHNwaGVyZSApIHtcblxuXHRcdHZhciByYWRpdXNTdW0gPSB0aGlzLnJhZGl1cyArIHNwaGVyZS5yYWRpdXM7XG5cblx0XHRyZXR1cm4gc3BoZXJlLmNlbnRlci5kaXN0YW5jZVRvU3F1YXJlZCggdGhpcy5jZW50ZXIgKSA8PSAoIHJhZGl1c1N1bSAqIHJhZGl1c1N1bSApO1xuXG5cdH0sXG5cblx0aW50ZXJzZWN0c0JveDogZnVuY3Rpb24gKCBib3ggKSB7XG5cblx0XHRyZXR1cm4gYm94LmludGVyc2VjdHNTcGhlcmUoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGludGVyc2VjdHNQbGFuZTogZnVuY3Rpb24gKCBwbGFuZSApIHtcblxuXHRcdHJldHVybiBNYXRoLmFicyggcGxhbmUuZGlzdGFuY2VUb1BvaW50KCB0aGlzLmNlbnRlciApICkgPD0gdGhpcy5yYWRpdXM7XG5cblx0fSxcblxuXHRjbGFtcFBvaW50OiBmdW5jdGlvbiAoIHBvaW50LCB0YXJnZXQgKSB7XG5cblx0XHR2YXIgZGVsdGFMZW5ndGhTcSA9IHRoaXMuY2VudGVyLmRpc3RhbmNlVG9TcXVhcmVkKCBwb2ludCApO1xuXG5cdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuU3BoZXJlOiAuY2xhbXBQb2ludCgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHR0YXJnZXQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0fVxuXG5cdFx0dGFyZ2V0LmNvcHkoIHBvaW50ICk7XG5cblx0XHRpZiAoIGRlbHRhTGVuZ3RoU3EgPiAoIHRoaXMucmFkaXVzICogdGhpcy5yYWRpdXMgKSApIHtcblxuXHRcdFx0dGFyZ2V0LnN1YiggdGhpcy5jZW50ZXIgKS5ub3JtYWxpemUoKTtcblx0XHRcdHRhcmdldC5tdWx0aXBseVNjYWxhciggdGhpcy5yYWRpdXMgKS5hZGQoIHRoaXMuY2VudGVyICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGFyZ2V0O1xuXG5cdH0sXG5cblx0Z2V0Qm91bmRpbmdCb3g6IGZ1bmN0aW9uICggdGFyZ2V0ICkge1xuXG5cdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuU3BoZXJlOiAuZ2V0Qm91bmRpbmdCb3goKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApO1xuXHRcdFx0dGFyZ2V0ID0gbmV3IEJveDMoKTtcblxuXHRcdH1cblxuXHRcdHRhcmdldC5zZXQoIHRoaXMuY2VudGVyLCB0aGlzLmNlbnRlciApO1xuXHRcdHRhcmdldC5leHBhbmRCeVNjYWxhciggdGhpcy5yYWRpdXMgKTtcblxuXHRcdHJldHVybiB0YXJnZXQ7XG5cblx0fSxcblxuXHRhcHBseU1hdHJpeDQ6IGZ1bmN0aW9uICggbWF0cml4ICkge1xuXG5cdFx0dGhpcy5jZW50ZXIuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTtcblx0XHR0aGlzLnJhZGl1cyA9IHRoaXMucmFkaXVzICogbWF0cml4LmdldE1heFNjYWxlT25BeGlzKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHRyYW5zbGF0ZTogZnVuY3Rpb24gKCBvZmZzZXQgKSB7XG5cblx0XHR0aGlzLmNlbnRlci5hZGQoIG9mZnNldCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRlcXVhbHM6IGZ1bmN0aW9uICggc3BoZXJlICkge1xuXG5cdFx0cmV0dXJuIHNwaGVyZS5jZW50ZXIuZXF1YWxzKCB0aGlzLmNlbnRlciApICYmICggc3BoZXJlLnJhZGl1cyA9PT0gdGhpcy5yYWRpdXMgKTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvXG4gKi9cblxuZnVuY3Rpb24gUGxhbmUoIG5vcm1hbCwgY29uc3RhbnQgKSB7XG5cblx0Ly8gbm9ybWFsIGlzIGFzc3VtZWQgdG8gYmUgbm9ybWFsaXplZFxuXG5cdHRoaXMubm9ybWFsID0gKCBub3JtYWwgIT09IHVuZGVmaW5lZCApID8gbm9ybWFsIDogbmV3IFZlY3RvcjMoIDEsIDAsIDAgKTtcblx0dGhpcy5jb25zdGFudCA9ICggY29uc3RhbnQgIT09IHVuZGVmaW5lZCApID8gY29uc3RhbnQgOiAwO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIFBsYW5lLnByb3RvdHlwZSwge1xuXG5cdHNldDogZnVuY3Rpb24gKCBub3JtYWwsIGNvbnN0YW50ICkge1xuXG5cdFx0dGhpcy5ub3JtYWwuY29weSggbm9ybWFsICk7XG5cdFx0dGhpcy5jb25zdGFudCA9IGNvbnN0YW50O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRDb21wb25lbnRzOiBmdW5jdGlvbiAoIHgsIHksIHosIHcgKSB7XG5cblx0XHR0aGlzLm5vcm1hbC5zZXQoIHgsIHksIHogKTtcblx0XHR0aGlzLmNvbnN0YW50ID0gdztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbU5vcm1hbEFuZENvcGxhbmFyUG9pbnQ6IGZ1bmN0aW9uICggbm9ybWFsLCBwb2ludCApIHtcblxuXHRcdHRoaXMubm9ybWFsLmNvcHkoIG5vcm1hbCApO1xuXHRcdHRoaXMuY29uc3RhbnQgPSAtIHBvaW50LmRvdCggdGhpcy5ub3JtYWwgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbUNvcGxhbmFyUG9pbnRzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciB2MiA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gc2V0RnJvbUNvcGxhbmFyUG9pbnRzKCBhLCBiLCBjICkge1xuXG5cdFx0XHR2YXIgbm9ybWFsID0gdjEuc3ViVmVjdG9ycyggYywgYiApLmNyb3NzKCB2Mi5zdWJWZWN0b3JzKCBhLCBiICkgKS5ub3JtYWxpemUoKTtcblxuXHRcdFx0Ly8gUTogc2hvdWxkIGFuIGVycm9yIGJlIHRocm93biBpZiBub3JtYWwgaXMgemVybyAoZS5nLiBkZWdlbmVyYXRlIHBsYW5lKT9cblxuXHRcdFx0dGhpcy5zZXRGcm9tTm9ybWFsQW5kQ29wbGFuYXJQb2ludCggbm9ybWFsLCBhICk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggcGxhbmUgKSB7XG5cblx0XHR0aGlzLm5vcm1hbC5jb3B5KCBwbGFuZS5ub3JtYWwgKTtcblx0XHR0aGlzLmNvbnN0YW50ID0gcGxhbmUuY29uc3RhbnQ7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG5vcm1hbGl6ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gTm90ZTogd2lsbCBsZWFkIHRvIGEgZGl2aWRlIGJ5IHplcm8gaWYgdGhlIHBsYW5lIGlzIGludmFsaWQuXG5cblx0XHR2YXIgaW52ZXJzZU5vcm1hbExlbmd0aCA9IDEuMCAvIHRoaXMubm9ybWFsLmxlbmd0aCgpO1xuXHRcdHRoaXMubm9ybWFsLm11bHRpcGx5U2NhbGFyKCBpbnZlcnNlTm9ybWFsTGVuZ3RoICk7XG5cdFx0dGhpcy5jb25zdGFudCAqPSBpbnZlcnNlTm9ybWFsTGVuZ3RoO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRuZWdhdGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuY29uc3RhbnQgKj0gLSAxO1xuXHRcdHRoaXMubm9ybWFsLm5lZ2F0ZSgpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRkaXN0YW5jZVRvUG9pbnQ6IGZ1bmN0aW9uICggcG9pbnQgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5ub3JtYWwuZG90KCBwb2ludCApICsgdGhpcy5jb25zdGFudDtcblxuXHR9LFxuXG5cdGRpc3RhbmNlVG9TcGhlcmU6IGZ1bmN0aW9uICggc3BoZXJlICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZGlzdGFuY2VUb1BvaW50KCBzcGhlcmUuY2VudGVyICkgLSBzcGhlcmUucmFkaXVzO1xuXG5cdH0sXG5cblx0cHJvamVjdFBvaW50OiBmdW5jdGlvbiAoIHBvaW50LCB0YXJnZXQgKSB7XG5cblx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5QbGFuZTogLnByb2plY3RQb2ludCgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHR0YXJnZXQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRhcmdldC5jb3B5KCB0aGlzLm5vcm1hbCApLm11bHRpcGx5U2NhbGFyKCAtIHRoaXMuZGlzdGFuY2VUb1BvaW50KCBwb2ludCApICkuYWRkKCBwb2ludCApO1xuXG5cdH0sXG5cblx0aW50ZXJzZWN0TGluZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBpbnRlcnNlY3RMaW5lKCBsaW5lLCB0YXJnZXQgKSB7XG5cblx0XHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuUGxhbmU6IC5pbnRlcnNlY3RMaW5lKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdFx0dGFyZ2V0ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgZGlyZWN0aW9uID0gbGluZS5kZWx0YSggdjEgKTtcblxuXHRcdFx0dmFyIGRlbm9taW5hdG9yID0gdGhpcy5ub3JtYWwuZG90KCBkaXJlY3Rpb24gKTtcblxuXHRcdFx0aWYgKCBkZW5vbWluYXRvciA9PT0gMCApIHtcblxuXHRcdFx0XHQvLyBsaW5lIGlzIGNvcGxhbmFyLCByZXR1cm4gb3JpZ2luXG5cdFx0XHRcdGlmICggdGhpcy5kaXN0YW5jZVRvUG9pbnQoIGxpbmUuc3RhcnQgKSA9PT0gMCApIHtcblxuXHRcdFx0XHRcdHJldHVybiB0YXJnZXQuY29weSggbGluZS5zdGFydCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBVbnN1cmUgaWYgdGhpcyBpcyB0aGUgY29ycmVjdCBtZXRob2QgdG8gaGFuZGxlIHRoaXMgY2FzZS5cblx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgdCA9IC0gKCBsaW5lLnN0YXJ0LmRvdCggdGhpcy5ub3JtYWwgKSArIHRoaXMuY29uc3RhbnQgKSAvIGRlbm9taW5hdG9yO1xuXG5cdFx0XHRpZiAoIHQgPCAwIHx8IHQgPiAxICkge1xuXG5cdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRhcmdldC5jb3B5KCBkaXJlY3Rpb24gKS5tdWx0aXBseVNjYWxhciggdCApLmFkZCggbGluZS5zdGFydCApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0aW50ZXJzZWN0c0xpbmU6IGZ1bmN0aW9uICggbGluZSApIHtcblxuXHRcdC8vIE5vdGU6IHRoaXMgdGVzdHMgaWYgYSBsaW5lIGludGVyc2VjdHMgdGhlIHBsYW5lLCBub3Qgd2hldGhlciBpdCAob3IgaXRzIGVuZC1wb2ludHMpIGFyZSBjb3BsYW5hciB3aXRoIGl0LlxuXG5cdFx0dmFyIHN0YXJ0U2lnbiA9IHRoaXMuZGlzdGFuY2VUb1BvaW50KCBsaW5lLnN0YXJ0ICk7XG5cdFx0dmFyIGVuZFNpZ24gPSB0aGlzLmRpc3RhbmNlVG9Qb2ludCggbGluZS5lbmQgKTtcblxuXHRcdHJldHVybiAoIHN0YXJ0U2lnbiA8IDAgJiYgZW5kU2lnbiA+IDAgKSB8fCAoIGVuZFNpZ24gPCAwICYmIHN0YXJ0U2lnbiA+IDAgKTtcblxuXHR9LFxuXG5cdGludGVyc2VjdHNCb3g6IGZ1bmN0aW9uICggYm94ICkge1xuXG5cdFx0cmV0dXJuIGJveC5pbnRlcnNlY3RzUGxhbmUoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGludGVyc2VjdHNTcGhlcmU6IGZ1bmN0aW9uICggc3BoZXJlICkge1xuXG5cdFx0cmV0dXJuIHNwaGVyZS5pbnRlcnNlY3RzUGxhbmUoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNvcGxhbmFyUG9pbnQ6IGZ1bmN0aW9uICggdGFyZ2V0ICkge1xuXG5cdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuUGxhbmU6IC5jb3BsYW5hclBvaW50KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGFyZ2V0LmNvcHkoIHRoaXMubm9ybWFsICkubXVsdGlwbHlTY2FsYXIoIC0gdGhpcy5jb25zdGFudCApO1xuXG5cdH0sXG5cblx0YXBwbHlNYXRyaXg0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciBtMSA9IG5ldyBNYXRyaXgzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gYXBwbHlNYXRyaXg0KCBtYXRyaXgsIG9wdGlvbmFsTm9ybWFsTWF0cml4ICkge1xuXG5cdFx0XHR2YXIgbm9ybWFsTWF0cml4ID0gb3B0aW9uYWxOb3JtYWxNYXRyaXggfHwgbTEuZ2V0Tm9ybWFsTWF0cml4KCBtYXRyaXggKTtcblxuXHRcdFx0dmFyIHJlZmVyZW5jZVBvaW50ID0gdGhpcy5jb3BsYW5hclBvaW50KCB2MSApLmFwcGx5TWF0cml4NCggbWF0cml4ICk7XG5cblx0XHRcdHZhciBub3JtYWwgPSB0aGlzLm5vcm1hbC5hcHBseU1hdHJpeDMoIG5vcm1hbE1hdHJpeCApLm5vcm1hbGl6ZSgpO1xuXG5cdFx0XHR0aGlzLmNvbnN0YW50ID0gLSByZWZlcmVuY2VQb2ludC5kb3QoIG5vcm1hbCApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHRyYW5zbGF0ZTogZnVuY3Rpb24gKCBvZmZzZXQgKSB7XG5cblx0XHR0aGlzLmNvbnN0YW50IC09IG9mZnNldC5kb3QoIHRoaXMubm9ybWFsICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGVxdWFsczogZnVuY3Rpb24gKCBwbGFuZSApIHtcblxuXHRcdHJldHVybiBwbGFuZS5ub3JtYWwuZXF1YWxzKCB0aGlzLm5vcm1hbCApICYmICggcGxhbmUuY29uc3RhbnQgPT09IHRoaXMuY29uc3RhbnQgKTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3IgYmhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW9cbiAqL1xuXG5mdW5jdGlvbiBGcnVzdHVtKCBwMCwgcDEsIHAyLCBwMywgcDQsIHA1ICkge1xuXG5cdHRoaXMucGxhbmVzID0gW1xuXG5cdFx0KCBwMCAhPT0gdW5kZWZpbmVkICkgPyBwMCA6IG5ldyBQbGFuZSgpLFxuXHRcdCggcDEgIT09IHVuZGVmaW5lZCApID8gcDEgOiBuZXcgUGxhbmUoKSxcblx0XHQoIHAyICE9PSB1bmRlZmluZWQgKSA/IHAyIDogbmV3IFBsYW5lKCksXG5cdFx0KCBwMyAhPT0gdW5kZWZpbmVkICkgPyBwMyA6IG5ldyBQbGFuZSgpLFxuXHRcdCggcDQgIT09IHVuZGVmaW5lZCApID8gcDQgOiBuZXcgUGxhbmUoKSxcblx0XHQoIHA1ICE9PSB1bmRlZmluZWQgKSA/IHA1IDogbmV3IFBsYW5lKClcblxuXHRdO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIEZydXN0dW0ucHJvdG90eXBlLCB7XG5cblx0c2V0OiBmdW5jdGlvbiAoIHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUgKSB7XG5cblx0XHR2YXIgcGxhbmVzID0gdGhpcy5wbGFuZXM7XG5cblx0XHRwbGFuZXNbIDAgXS5jb3B5KCBwMCApO1xuXHRcdHBsYW5lc1sgMSBdLmNvcHkoIHAxICk7XG5cdFx0cGxhbmVzWyAyIF0uY29weSggcDIgKTtcblx0XHRwbGFuZXNbIDMgXS5jb3B5KCBwMyApO1xuXHRcdHBsYW5lc1sgNCBdLmNvcHkoIHA0ICk7XG5cdFx0cGxhbmVzWyA1IF0uY29weSggcDUgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggZnJ1c3R1bSApIHtcblxuXHRcdHZhciBwbGFuZXMgPSB0aGlzLnBsYW5lcztcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IDY7IGkgKysgKSB7XG5cblx0XHRcdHBsYW5lc1sgaSBdLmNvcHkoIGZydXN0dW0ucGxhbmVzWyBpIF0gKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbU1hdHJpeDogZnVuY3Rpb24gKCBtICkge1xuXG5cdFx0dmFyIHBsYW5lcyA9IHRoaXMucGxhbmVzO1xuXHRcdHZhciBtZSA9IG0uZWxlbWVudHM7XG5cdFx0dmFyIG1lMCA9IG1lWyAwIF0sIG1lMSA9IG1lWyAxIF0sIG1lMiA9IG1lWyAyIF0sIG1lMyA9IG1lWyAzIF07XG5cdFx0dmFyIG1lNCA9IG1lWyA0IF0sIG1lNSA9IG1lWyA1IF0sIG1lNiA9IG1lWyA2IF0sIG1lNyA9IG1lWyA3IF07XG5cdFx0dmFyIG1lOCA9IG1lWyA4IF0sIG1lOSA9IG1lWyA5IF0sIG1lMTAgPSBtZVsgMTAgXSwgbWUxMSA9IG1lWyAxMSBdO1xuXHRcdHZhciBtZTEyID0gbWVbIDEyIF0sIG1lMTMgPSBtZVsgMTMgXSwgbWUxNCA9IG1lWyAxNCBdLCBtZTE1ID0gbWVbIDE1IF07XG5cblx0XHRwbGFuZXNbIDAgXS5zZXRDb21wb25lbnRzKCBtZTMgLSBtZTAsIG1lNyAtIG1lNCwgbWUxMSAtIG1lOCwgbWUxNSAtIG1lMTIgKS5ub3JtYWxpemUoKTtcblx0XHRwbGFuZXNbIDEgXS5zZXRDb21wb25lbnRzKCBtZTMgKyBtZTAsIG1lNyArIG1lNCwgbWUxMSArIG1lOCwgbWUxNSArIG1lMTIgKS5ub3JtYWxpemUoKTtcblx0XHRwbGFuZXNbIDIgXS5zZXRDb21wb25lbnRzKCBtZTMgKyBtZTEsIG1lNyArIG1lNSwgbWUxMSArIG1lOSwgbWUxNSArIG1lMTMgKS5ub3JtYWxpemUoKTtcblx0XHRwbGFuZXNbIDMgXS5zZXRDb21wb25lbnRzKCBtZTMgLSBtZTEsIG1lNyAtIG1lNSwgbWUxMSAtIG1lOSwgbWUxNSAtIG1lMTMgKS5ub3JtYWxpemUoKTtcblx0XHRwbGFuZXNbIDQgXS5zZXRDb21wb25lbnRzKCBtZTMgLSBtZTIsIG1lNyAtIG1lNiwgbWUxMSAtIG1lMTAsIG1lMTUgLSBtZTE0ICkubm9ybWFsaXplKCk7XG5cdFx0cGxhbmVzWyA1IF0uc2V0Q29tcG9uZW50cyggbWUzICsgbWUyLCBtZTcgKyBtZTYsIG1lMTEgKyBtZTEwLCBtZTE1ICsgbWUxNCApLm5vcm1hbGl6ZSgpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRpbnRlcnNlY3RzT2JqZWN0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgc3BoZXJlID0gbmV3IFNwaGVyZSgpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGludGVyc2VjdHNPYmplY3QoIG9iamVjdCApIHtcblxuXHRcdFx0dmFyIGdlb21ldHJ5ID0gb2JqZWN0Lmdlb21ldHJ5O1xuXG5cdFx0XHRpZiAoIGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlID09PSBudWxsIClcblx0XHRcdFx0Z2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7XG5cblx0XHRcdHNwaGVyZS5jb3B5KCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSApXG5cdFx0XHRcdC5hcHBseU1hdHJpeDQoIG9iamVjdC5tYXRyaXhXb3JsZCApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5pbnRlcnNlY3RzU3BoZXJlKCBzcGhlcmUgKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGludGVyc2VjdHNTcHJpdGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBzcGhlcmUgPSBuZXcgU3BoZXJlKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gaW50ZXJzZWN0c1Nwcml0ZSggc3ByaXRlICkge1xuXG5cdFx0XHRzcGhlcmUuY2VudGVyLnNldCggMCwgMCwgMCApO1xuXHRcdFx0c3BoZXJlLnJhZGl1cyA9IDAuNzA3MTA2NzgxMTg2NTQ3Njtcblx0XHRcdHNwaGVyZS5hcHBseU1hdHJpeDQoIHNwcml0ZS5tYXRyaXhXb3JsZCApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5pbnRlcnNlY3RzU3BoZXJlKCBzcGhlcmUgKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGludGVyc2VjdHNTcGhlcmU6IGZ1bmN0aW9uICggc3BoZXJlICkge1xuXG5cdFx0dmFyIHBsYW5lcyA9IHRoaXMucGxhbmVzO1xuXHRcdHZhciBjZW50ZXIgPSBzcGhlcmUuY2VudGVyO1xuXHRcdHZhciBuZWdSYWRpdXMgPSAtIHNwaGVyZS5yYWRpdXM7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCA2OyBpICsrICkge1xuXG5cdFx0XHR2YXIgZGlzdGFuY2UgPSBwbGFuZXNbIGkgXS5kaXN0YW5jZVRvUG9pbnQoIGNlbnRlciApO1xuXG5cdFx0XHRpZiAoIGRpc3RhbmNlIDwgbmVnUmFkaXVzICkge1xuXG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRydWU7XG5cblx0fSxcblxuXHRpbnRlcnNlY3RzQm94OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgcDEgPSBuZXcgVmVjdG9yMygpLFxuXHRcdFx0cDIgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGludGVyc2VjdHNCb3goIGJveCApIHtcblxuXHRcdFx0dmFyIHBsYW5lcyA9IHRoaXMucGxhbmVzO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCA2OyBpICsrICkge1xuXG5cdFx0XHRcdHZhciBwbGFuZSA9IHBsYW5lc1sgaSBdO1xuXG5cdFx0XHRcdHAxLnggPSBwbGFuZS5ub3JtYWwueCA+IDAgPyBib3gubWluLnggOiBib3gubWF4Lng7XG5cdFx0XHRcdHAyLnggPSBwbGFuZS5ub3JtYWwueCA+IDAgPyBib3gubWF4LnggOiBib3gubWluLng7XG5cdFx0XHRcdHAxLnkgPSBwbGFuZS5ub3JtYWwueSA+IDAgPyBib3gubWluLnkgOiBib3gubWF4Lnk7XG5cdFx0XHRcdHAyLnkgPSBwbGFuZS5ub3JtYWwueSA+IDAgPyBib3gubWF4LnkgOiBib3gubWluLnk7XG5cdFx0XHRcdHAxLnogPSBwbGFuZS5ub3JtYWwueiA+IDAgPyBib3gubWluLnogOiBib3gubWF4Lno7XG5cdFx0XHRcdHAyLnogPSBwbGFuZS5ub3JtYWwueiA+IDAgPyBib3gubWF4LnogOiBib3gubWluLno7XG5cblx0XHRcdFx0dmFyIGQxID0gcGxhbmUuZGlzdGFuY2VUb1BvaW50KCBwMSApO1xuXHRcdFx0XHR2YXIgZDIgPSBwbGFuZS5kaXN0YW5jZVRvUG9pbnQoIHAyICk7XG5cblx0XHRcdFx0Ly8gaWYgYm90aCBvdXRzaWRlIHBsYW5lLCBubyBpbnRlcnNlY3Rpb25cblxuXHRcdFx0XHRpZiAoIGQxIDwgMCAmJiBkMiA8IDAgKSB7XG5cblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB0cnVlO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0Y29udGFpbnNQb2ludDogZnVuY3Rpb24gKCBwb2ludCApIHtcblxuXHRcdHZhciBwbGFuZXMgPSB0aGlzLnBsYW5lcztcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IDY7IGkgKysgKSB7XG5cblx0XHRcdGlmICggcGxhbmVzWyBpIF0uZGlzdGFuY2VUb1BvaW50KCBwb2ludCApIDwgMCApIHtcblxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXG5cdH1cblxufSApO1xuXG52YXIgYWxwaGFtYXBfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfQUxQSEFNQVBcXG5cXHRkaWZmdXNlQ29sb3IuYSAqPSB0ZXh0dXJlMkQoIGFscGhhTWFwLCB2VXYgKS5nO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgYWxwaGFtYXBfcGFyc19mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9BTFBIQU1BUFxcblxcdHVuaWZvcm0gc2FtcGxlcjJEIGFscGhhTWFwO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgYWxwaGF0ZXN0X2ZyYWdtZW50ID0gXCIjaWZkZWYgQUxQSEFURVNUXFxuXFx0aWYgKCBkaWZmdXNlQ29sb3IuYSA8IEFMUEhBVEVTVCApIGRpc2NhcmQ7XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBhb21hcF9mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9BT01BUFxcblxcdGZsb2F0IGFtYmllbnRPY2NsdXNpb24gPSAoIHRleHR1cmUyRCggYW9NYXAsIHZVdjIgKS5yIC0gMS4wICkgKiBhb01hcEludGVuc2l0eSArIDEuMDtcXG5cXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKj0gYW1iaWVudE9jY2x1c2lvbjtcXG5cXHQjaWYgZGVmaW5lZCggVVNFX0VOVk1BUCApICYmIGRlZmluZWQoIFBIWVNJQ0FMIClcXG5cXHRcXHRmbG9hdCBkb3ROViA9IHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZ2VvbWV0cnkudmlld0RpciApICk7XFxuXFx0XFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3RTcGVjdWxhciAqPSBjb21wdXRlU3BlY3VsYXJPY2NsdXNpb24oIGRvdE5WLCBhbWJpZW50T2NjbHVzaW9uLCBtYXRlcmlhbC5zcGVjdWxhclJvdWdobmVzcyApO1xcblxcdCNlbmRpZlxcbiNlbmRpZlxcblwiO1xuXG52YXIgYW9tYXBfcGFyc19mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9BT01BUFxcblxcdHVuaWZvcm0gc2FtcGxlcjJEIGFvTWFwO1xcblxcdHVuaWZvcm0gZmxvYXQgYW9NYXBJbnRlbnNpdHk7XFxuI2VuZGlmXCI7XG5cbnZhciBiZWdpbl92ZXJ0ZXggPSBcIlxcbnZlYzMgdHJhbnNmb3JtZWQgPSB2ZWMzKCBwb3NpdGlvbiApO1xcblwiO1xuXG52YXIgYmVnaW5ub3JtYWxfdmVydGV4ID0gXCJcXG52ZWMzIG9iamVjdE5vcm1hbCA9IHZlYzMoIG5vcm1hbCApO1xcblwiO1xuXG52YXIgYnNkZnMgPSBcImZsb2F0IHB1bmN0dWFsTGlnaHRJbnRlbnNpdHlUb0lycmFkaWFuY2VGYWN0b3IoIGNvbnN0IGluIGZsb2F0IGxpZ2h0RGlzdGFuY2UsIGNvbnN0IGluIGZsb2F0IGN1dG9mZkRpc3RhbmNlLCBjb25zdCBpbiBmbG9hdCBkZWNheUV4cG9uZW50ICkge1xcblxcdGlmKCBkZWNheUV4cG9uZW50ID4gMC4wICkge1xcbiNpZiBkZWZpbmVkICggUEhZU0lDQUxMWV9DT1JSRUNUX0xJR0hUUyApXFxuXFx0XFx0ZmxvYXQgZGlzdGFuY2VGYWxsb2ZmID0gMS4wIC8gbWF4KCBwb3coIGxpZ2h0RGlzdGFuY2UsIGRlY2F5RXhwb25lbnQgKSwgMC4wMSApO1xcblxcdFxcdGZsb2F0IG1heERpc3RhbmNlQ3V0b2ZmRmFjdG9yID0gcG93Miggc2F0dXJhdGUoIDEuMCAtIHBvdzQoIGxpZ2h0RGlzdGFuY2UgLyBjdXRvZmZEaXN0YW5jZSApICkgKTtcXG5cXHRcXHRyZXR1cm4gZGlzdGFuY2VGYWxsb2ZmICogbWF4RGlzdGFuY2VDdXRvZmZGYWN0b3I7XFxuI2Vsc2VcXG5cXHRcXHRyZXR1cm4gcG93KCBzYXR1cmF0ZSggLWxpZ2h0RGlzdGFuY2UgLyBjdXRvZmZEaXN0YW5jZSArIDEuMCApLCBkZWNheUV4cG9uZW50ICk7XFxuI2VuZGlmXFxuXFx0fVxcblxcdHJldHVybiAxLjA7XFxufVxcbnZlYzMgQlJERl9EaWZmdXNlX0xhbWJlcnQoIGNvbnN0IGluIHZlYzMgZGlmZnVzZUNvbG9yICkge1xcblxcdHJldHVybiBSRUNJUFJPQ0FMX1BJICogZGlmZnVzZUNvbG9yO1xcbn1cXG52ZWMzIEZfU2NobGljayggY29uc3QgaW4gdmVjMyBzcGVjdWxhckNvbG9yLCBjb25zdCBpbiBmbG9hdCBkb3RMSCApIHtcXG5cXHRmbG9hdCBmcmVzbmVsID0gZXhwMiggKCAtNS41NTQ3MyAqIGRvdExIIC0gNi45ODMxNiApICogZG90TEggKTtcXG5cXHRyZXR1cm4gKCAxLjAgLSBzcGVjdWxhckNvbG9yICkgKiBmcmVzbmVsICsgc3BlY3VsYXJDb2xvcjtcXG59XFxuZmxvYXQgR19HR1hfU21pdGgoIGNvbnN0IGluIGZsb2F0IGFscGhhLCBjb25zdCBpbiBmbG9hdCBkb3ROTCwgY29uc3QgaW4gZmxvYXQgZG90TlYgKSB7XFxuXFx0ZmxvYXQgYTIgPSBwb3cyKCBhbHBoYSApO1xcblxcdGZsb2F0IGdsID0gZG90TkwgKyBzcXJ0KCBhMiArICggMS4wIC0gYTIgKSAqIHBvdzIoIGRvdE5MICkgKTtcXG5cXHRmbG9hdCBndiA9IGRvdE5WICsgc3FydCggYTIgKyAoIDEuMCAtIGEyICkgKiBwb3cyKCBkb3ROViApICk7XFxuXFx0cmV0dXJuIDEuMCAvICggZ2wgKiBndiApO1xcbn1cXG5mbG9hdCBHX0dHWF9TbWl0aENvcnJlbGF0ZWQoIGNvbnN0IGluIGZsb2F0IGFscGhhLCBjb25zdCBpbiBmbG9hdCBkb3ROTCwgY29uc3QgaW4gZmxvYXQgZG90TlYgKSB7XFxuXFx0ZmxvYXQgYTIgPSBwb3cyKCBhbHBoYSApO1xcblxcdGZsb2F0IGd2ID0gZG90TkwgKiBzcXJ0KCBhMiArICggMS4wIC0gYTIgKSAqIHBvdzIoIGRvdE5WICkgKTtcXG5cXHRmbG9hdCBnbCA9IGRvdE5WICogc3FydCggYTIgKyAoIDEuMCAtIGEyICkgKiBwb3cyKCBkb3ROTCApICk7XFxuXFx0cmV0dXJuIDAuNSAvIG1heCggZ3YgKyBnbCwgRVBTSUxPTiApO1xcbn1cXG5mbG9hdCBEX0dHWCggY29uc3QgaW4gZmxvYXQgYWxwaGEsIGNvbnN0IGluIGZsb2F0IGRvdE5IICkge1xcblxcdGZsb2F0IGEyID0gcG93MiggYWxwaGEgKTtcXG5cXHRmbG9hdCBkZW5vbSA9IHBvdzIoIGRvdE5IICkgKiAoIGEyIC0gMS4wICkgKyAxLjA7XFxuXFx0cmV0dXJuIFJFQ0lQUk9DQUxfUEkgKiBhMiAvIHBvdzIoIGRlbm9tICk7XFxufVxcbnZlYzMgQlJERl9TcGVjdWxhcl9HR1goIGNvbnN0IGluIEluY2lkZW50TGlnaHQgaW5jaWRlbnRMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gdmVjMyBzcGVjdWxhckNvbG9yLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MgKSB7XFxuXFx0ZmxvYXQgYWxwaGEgPSBwb3cyKCByb3VnaG5lc3MgKTtcXG5cXHR2ZWMzIGhhbGZEaXIgPSBub3JtYWxpemUoIGluY2lkZW50TGlnaHQuZGlyZWN0aW9uICsgZ2VvbWV0cnkudmlld0RpciApO1xcblxcdGZsb2F0IGRvdE5MID0gc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBpbmNpZGVudExpZ2h0LmRpcmVjdGlvbiApICk7XFxuXFx0ZmxvYXQgZG90TlYgPSBzYXR1cmF0ZSggZG90KCBnZW9tZXRyeS5ub3JtYWwsIGdlb21ldHJ5LnZpZXdEaXIgKSApO1xcblxcdGZsb2F0IGRvdE5IID0gc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBoYWxmRGlyICkgKTtcXG5cXHRmbG9hdCBkb3RMSCA9IHNhdHVyYXRlKCBkb3QoIGluY2lkZW50TGlnaHQuZGlyZWN0aW9uLCBoYWxmRGlyICkgKTtcXG5cXHR2ZWMzIEYgPSBGX1NjaGxpY2soIHNwZWN1bGFyQ29sb3IsIGRvdExIICk7XFxuXFx0ZmxvYXQgRyA9IEdfR0dYX1NtaXRoQ29ycmVsYXRlZCggYWxwaGEsIGRvdE5MLCBkb3ROViApO1xcblxcdGZsb2F0IEQgPSBEX0dHWCggYWxwaGEsIGRvdE5IICk7XFxuXFx0cmV0dXJuIEYgKiAoIEcgKiBEICk7XFxufVxcbnZlYzIgTFRDX1V2KCBjb25zdCBpbiB2ZWMzIE4sIGNvbnN0IGluIHZlYzMgViwgY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzICkge1xcblxcdGNvbnN0IGZsb2F0IExVVF9TSVpFICA9IDY0LjA7XFxuXFx0Y29uc3QgZmxvYXQgTFVUX1NDQUxFID0gKCBMVVRfU0laRSAtIDEuMCApIC8gTFVUX1NJWkU7XFxuXFx0Y29uc3QgZmxvYXQgTFVUX0JJQVMgID0gMC41IC8gTFVUX1NJWkU7XFxuXFx0ZmxvYXQgZG90TlYgPSBzYXR1cmF0ZSggZG90KCBOLCBWICkgKTtcXG5cXHR2ZWMyIHV2ID0gdmVjMiggcm91Z2huZXNzLCBzcXJ0KCAxLjAgLSBkb3ROViApICk7XFxuXFx0dXYgPSB1diAqIExVVF9TQ0FMRSArIExVVF9CSUFTO1xcblxcdHJldHVybiB1djtcXG59XFxuZmxvYXQgTFRDX0NsaXBwZWRTcGhlcmVGb3JtRmFjdG9yKCBjb25zdCBpbiB2ZWMzIGYgKSB7XFxuXFx0ZmxvYXQgbCA9IGxlbmd0aCggZiApO1xcblxcdHJldHVybiBtYXgoICggbCAqIGwgKyBmLnogKSAvICggbCArIDEuMCApLCAwLjAgKTtcXG59XFxudmVjMyBMVENfRWRnZVZlY3RvckZvcm1GYWN0b3IoIGNvbnN0IGluIHZlYzMgdjEsIGNvbnN0IGluIHZlYzMgdjIgKSB7XFxuXFx0ZmxvYXQgeCA9IGRvdCggdjEsIHYyICk7XFxuXFx0ZmxvYXQgeSA9IGFicyggeCApO1xcblxcdGZsb2F0IGEgPSAwLjg1NDM5ODUgKyAoIDAuNDk2NTE1NSArIDAuMDE0NTIwNiAqIHkgKSAqIHk7XFxuXFx0ZmxvYXQgYiA9IDMuNDE3NTk0MCArICggNC4xNjE2NzI0ICsgeSApICogeTtcXG5cXHRmbG9hdCB2ID0gYSAvIGI7XFxuXFx0ZmxvYXQgdGhldGFfc2ludGhldGEgPSAoIHggPiAwLjAgKSA/IHYgOiAwLjUgKiBpbnZlcnNlc3FydCggbWF4KCAxLjAgLSB4ICogeCwgMWUtNyApICkgLSB2O1xcblxcdHJldHVybiBjcm9zcyggdjEsIHYyICkgKiB0aGV0YV9zaW50aGV0YTtcXG59XFxudmVjMyBMVENfRXZhbHVhdGUoIGNvbnN0IGluIHZlYzMgTiwgY29uc3QgaW4gdmVjMyBWLCBjb25zdCBpbiB2ZWMzIFAsIGNvbnN0IGluIG1hdDMgbUludiwgY29uc3QgaW4gdmVjMyByZWN0Q29vcmRzWyA0IF0gKSB7XFxuXFx0dmVjMyB2MSA9IHJlY3RDb29yZHNbIDEgXSAtIHJlY3RDb29yZHNbIDAgXTtcXG5cXHR2ZWMzIHYyID0gcmVjdENvb3Jkc1sgMyBdIC0gcmVjdENvb3Jkc1sgMCBdO1xcblxcdHZlYzMgbGlnaHROb3JtYWwgPSBjcm9zcyggdjEsIHYyICk7XFxuXFx0aWYoIGRvdCggbGlnaHROb3JtYWwsIFAgLSByZWN0Q29vcmRzWyAwIF0gKSA8IDAuMCApIHJldHVybiB2ZWMzKCAwLjAgKTtcXG5cXHR2ZWMzIFQxLCBUMjtcXG5cXHRUMSA9IG5vcm1hbGl6ZSggViAtIE4gKiBkb3QoIFYsIE4gKSApO1xcblxcdFQyID0gLSBjcm9zcyggTiwgVDEgKTtcXG5cXHRtYXQzIG1hdCA9IG1JbnYgKiB0cmFuc3Bvc2VNYXQzKCBtYXQzKCBUMSwgVDIsIE4gKSApO1xcblxcdHZlYzMgY29vcmRzWyA0IF07XFxuXFx0Y29vcmRzWyAwIF0gPSBtYXQgKiAoIHJlY3RDb29yZHNbIDAgXSAtIFAgKTtcXG5cXHRjb29yZHNbIDEgXSA9IG1hdCAqICggcmVjdENvb3Jkc1sgMSBdIC0gUCApO1xcblxcdGNvb3Jkc1sgMiBdID0gbWF0ICogKCByZWN0Q29vcmRzWyAyIF0gLSBQICk7XFxuXFx0Y29vcmRzWyAzIF0gPSBtYXQgKiAoIHJlY3RDb29yZHNbIDMgXSAtIFAgKTtcXG5cXHRjb29yZHNbIDAgXSA9IG5vcm1hbGl6ZSggY29vcmRzWyAwIF0gKTtcXG5cXHRjb29yZHNbIDEgXSA9IG5vcm1hbGl6ZSggY29vcmRzWyAxIF0gKTtcXG5cXHRjb29yZHNbIDIgXSA9IG5vcm1hbGl6ZSggY29vcmRzWyAyIF0gKTtcXG5cXHRjb29yZHNbIDMgXSA9IG5vcm1hbGl6ZSggY29vcmRzWyAzIF0gKTtcXG5cXHR2ZWMzIHZlY3RvckZvcm1GYWN0b3IgPSB2ZWMzKCAwLjAgKTtcXG5cXHR2ZWN0b3JGb3JtRmFjdG9yICs9IExUQ19FZGdlVmVjdG9yRm9ybUZhY3RvciggY29vcmRzWyAwIF0sIGNvb3Jkc1sgMSBdICk7XFxuXFx0dmVjdG9yRm9ybUZhY3RvciArPSBMVENfRWRnZVZlY3RvckZvcm1GYWN0b3IoIGNvb3Jkc1sgMSBdLCBjb29yZHNbIDIgXSApO1xcblxcdHZlY3RvckZvcm1GYWN0b3IgKz0gTFRDX0VkZ2VWZWN0b3JGb3JtRmFjdG9yKCBjb29yZHNbIDIgXSwgY29vcmRzWyAzIF0gKTtcXG5cXHR2ZWN0b3JGb3JtRmFjdG9yICs9IExUQ19FZGdlVmVjdG9yRm9ybUZhY3RvciggY29vcmRzWyAzIF0sIGNvb3Jkc1sgMCBdICk7XFxuXFx0ZmxvYXQgcmVzdWx0ID0gTFRDX0NsaXBwZWRTcGhlcmVGb3JtRmFjdG9yKCB2ZWN0b3JGb3JtRmFjdG9yICk7XFxuXFx0cmV0dXJuIHZlYzMoIHJlc3VsdCApO1xcbn1cXG52ZWMzIEJSREZfU3BlY3VsYXJfR0dYX0Vudmlyb25tZW50KCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiB2ZWMzIHNwZWN1bGFyQ29sb3IsIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcyApIHtcXG5cXHRmbG9hdCBkb3ROViA9IHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZ2VvbWV0cnkudmlld0RpciApICk7XFxuXFx0Y29uc3QgdmVjNCBjMCA9IHZlYzQoIC0gMSwgLSAwLjAyNzUsIC0gMC41NzIsIDAuMDIyICk7XFxuXFx0Y29uc3QgdmVjNCBjMSA9IHZlYzQoIDEsIDAuMDQyNSwgMS4wNCwgLSAwLjA0ICk7XFxuXFx0dmVjNCByID0gcm91Z2huZXNzICogYzAgKyBjMTtcXG5cXHRmbG9hdCBhMDA0ID0gbWluKCByLnggKiByLngsIGV4cDIoIC0gOS4yOCAqIGRvdE5WICkgKSAqIHIueCArIHIueTtcXG5cXHR2ZWMyIEFCID0gdmVjMiggLTEuMDQsIDEuMDQgKSAqIGEwMDQgKyByLnp3O1xcblxcdHJldHVybiBzcGVjdWxhckNvbG9yICogQUIueCArIEFCLnk7XFxufVxcbmZsb2F0IEdfQmxpbm5QaG9uZ19JbXBsaWNpdCggKSB7XFxuXFx0cmV0dXJuIDAuMjU7XFxufVxcbmZsb2F0IERfQmxpbm5QaG9uZyggY29uc3QgaW4gZmxvYXQgc2hpbmluZXNzLCBjb25zdCBpbiBmbG9hdCBkb3ROSCApIHtcXG5cXHRyZXR1cm4gUkVDSVBST0NBTF9QSSAqICggc2hpbmluZXNzICogMC41ICsgMS4wICkgKiBwb3coIGRvdE5ILCBzaGluaW5lc3MgKTtcXG59XFxudmVjMyBCUkRGX1NwZWN1bGFyX0JsaW5uUGhvbmcoIGNvbnN0IGluIEluY2lkZW50TGlnaHQgaW5jaWRlbnRMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gdmVjMyBzcGVjdWxhckNvbG9yLCBjb25zdCBpbiBmbG9hdCBzaGluaW5lc3MgKSB7XFxuXFx0dmVjMyBoYWxmRGlyID0gbm9ybWFsaXplKCBpbmNpZGVudExpZ2h0LmRpcmVjdGlvbiArIGdlb21ldHJ5LnZpZXdEaXIgKTtcXG5cXHRmbG9hdCBkb3ROSCA9IHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgaGFsZkRpciApICk7XFxuXFx0ZmxvYXQgZG90TEggPSBzYXR1cmF0ZSggZG90KCBpbmNpZGVudExpZ2h0LmRpcmVjdGlvbiwgaGFsZkRpciApICk7XFxuXFx0dmVjMyBGID0gRl9TY2hsaWNrKCBzcGVjdWxhckNvbG9yLCBkb3RMSCApO1xcblxcdGZsb2F0IEcgPSBHX0JsaW5uUGhvbmdfSW1wbGljaXQoICk7XFxuXFx0ZmxvYXQgRCA9IERfQmxpbm5QaG9uZyggc2hpbmluZXNzLCBkb3ROSCApO1xcblxcdHJldHVybiBGICogKCBHICogRCApO1xcbn1cXG5mbG9hdCBHR1hSb3VnaG5lc3NUb0JsaW5uRXhwb25lbnQoIGNvbnN0IGluIGZsb2F0IGdneFJvdWdobmVzcyApIHtcXG5cXHRyZXR1cm4gKCAyLjAgLyBwb3cyKCBnZ3hSb3VnaG5lc3MgKyAwLjAwMDEgKSAtIDIuMCApO1xcbn1cXG5mbG9hdCBCbGlubkV4cG9uZW50VG9HR1hSb3VnaG5lc3MoIGNvbnN0IGluIGZsb2F0IGJsaW5uRXhwb25lbnQgKSB7XFxuXFx0cmV0dXJuIHNxcnQoIDIuMCAvICggYmxpbm5FeHBvbmVudCArIDIuMCApICk7XFxufVxcblwiO1xuXG52YXIgYnVtcG1hcF9wYXJzX2ZyYWdtZW50ID0gXCIjaWZkZWYgVVNFX0JVTVBNQVBcXG5cXHR1bmlmb3JtIHNhbXBsZXIyRCBidW1wTWFwO1xcblxcdHVuaWZvcm0gZmxvYXQgYnVtcFNjYWxlO1xcblxcdHZlYzIgZEhkeHlfZndkKCkge1xcblxcdFxcdHZlYzIgZFNUZHggPSBkRmR4KCB2VXYgKTtcXG5cXHRcXHR2ZWMyIGRTVGR5ID0gZEZkeSggdlV2ICk7XFxuXFx0XFx0ZmxvYXQgSGxsID0gYnVtcFNjYWxlICogdGV4dHVyZTJEKCBidW1wTWFwLCB2VXYgKS54O1xcblxcdFxcdGZsb2F0IGRCeCA9IGJ1bXBTY2FsZSAqIHRleHR1cmUyRCggYnVtcE1hcCwgdlV2ICsgZFNUZHggKS54IC0gSGxsO1xcblxcdFxcdGZsb2F0IGRCeSA9IGJ1bXBTY2FsZSAqIHRleHR1cmUyRCggYnVtcE1hcCwgdlV2ICsgZFNUZHkgKS54IC0gSGxsO1xcblxcdFxcdHJldHVybiB2ZWMyKCBkQngsIGRCeSApO1xcblxcdH1cXG5cXHR2ZWMzIHBlcnR1cmJOb3JtYWxBcmIoIHZlYzMgc3VyZl9wb3MsIHZlYzMgc3VyZl9ub3JtLCB2ZWMyIGRIZHh5ICkge1xcblxcdFxcdHZlYzMgdlNpZ21hWCA9IHZlYzMoIGRGZHgoIHN1cmZfcG9zLnggKSwgZEZkeCggc3VyZl9wb3MueSApLCBkRmR4KCBzdXJmX3Bvcy56ICkgKTtcXG5cXHRcXHR2ZWMzIHZTaWdtYVkgPSB2ZWMzKCBkRmR5KCBzdXJmX3Bvcy54ICksIGRGZHkoIHN1cmZfcG9zLnkgKSwgZEZkeSggc3VyZl9wb3MueiApICk7XFxuXFx0XFx0dmVjMyB2TiA9IHN1cmZfbm9ybTtcXG5cXHRcXHR2ZWMzIFIxID0gY3Jvc3MoIHZTaWdtYVksIHZOICk7XFxuXFx0XFx0dmVjMyBSMiA9IGNyb3NzKCB2TiwgdlNpZ21hWCApO1xcblxcdFxcdGZsb2F0IGZEZXQgPSBkb3QoIHZTaWdtYVgsIFIxICk7XFxuXFx0XFx0dmVjMyB2R3JhZCA9IHNpZ24oIGZEZXQgKSAqICggZEhkeHkueCAqIFIxICsgZEhkeHkueSAqIFIyICk7XFxuXFx0XFx0cmV0dXJuIG5vcm1hbGl6ZSggYWJzKCBmRGV0ICkgKiBzdXJmX25vcm0gLSB2R3JhZCApO1xcblxcdH1cXG4jZW5kaWZcXG5cIjtcblxudmFyIGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudCA9IFwiI2lmIE5VTV9DTElQUElOR19QTEFORVMgPiAwXFxuXFx0dmVjNCBwbGFuZTtcXG5cXHQjcHJhZ21hIHVucm9sbF9sb29wXFxuXFx0Zm9yICggaW50IGkgPSAwOyBpIDwgVU5JT05fQ0xJUFBJTkdfUExBTkVTOyBpICsrICkge1xcblxcdFxcdHBsYW5lID0gY2xpcHBpbmdQbGFuZXNbIGkgXTtcXG5cXHRcXHRpZiAoIGRvdCggdlZpZXdQb3NpdGlvbiwgcGxhbmUueHl6ICkgPiBwbGFuZS53ICkgZGlzY2FyZDtcXG5cXHR9XFxuXFx0I2lmIFVOSU9OX0NMSVBQSU5HX1BMQU5FUyA8IE5VTV9DTElQUElOR19QTEFORVNcXG5cXHRcXHRib29sIGNsaXBwZWQgPSB0cnVlO1xcblxcdFxcdCNwcmFnbWEgdW5yb2xsX2xvb3BcXG5cXHRcXHRmb3IgKCBpbnQgaSA9IFVOSU9OX0NMSVBQSU5HX1BMQU5FUzsgaSA8IE5VTV9DTElQUElOR19QTEFORVM7IGkgKysgKSB7XFxuXFx0XFx0XFx0cGxhbmUgPSBjbGlwcGluZ1BsYW5lc1sgaSBdO1xcblxcdFxcdFxcdGNsaXBwZWQgPSAoIGRvdCggdlZpZXdQb3NpdGlvbiwgcGxhbmUueHl6ICkgPiBwbGFuZS53ICkgJiYgY2xpcHBlZDtcXG5cXHRcXHR9XFxuXFx0XFx0aWYgKCBjbGlwcGVkICkgZGlzY2FyZDtcXG5cXHQjZW5kaWZcXG4jZW5kaWZcXG5cIjtcblxudmFyIGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50ID0gXCIjaWYgTlVNX0NMSVBQSU5HX1BMQU5FUyA+IDBcXG5cXHQjaWYgISBkZWZpbmVkKCBQSFlTSUNBTCApICYmICEgZGVmaW5lZCggUEhPTkcgKVxcblxcdFxcdHZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xcblxcdCNlbmRpZlxcblxcdHVuaWZvcm0gdmVjNCBjbGlwcGluZ1BsYW5lc1sgTlVNX0NMSVBQSU5HX1BMQU5FUyBdO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgY2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4ID0gXCIjaWYgTlVNX0NMSVBQSU5HX1BMQU5FUyA+IDAgJiYgISBkZWZpbmVkKCBQSFlTSUNBTCApICYmICEgZGVmaW5lZCggUEhPTkcgKVxcblxcdHZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgY2xpcHBpbmdfcGxhbmVzX3ZlcnRleCA9IFwiI2lmIE5VTV9DTElQUElOR19QTEFORVMgPiAwICYmICEgZGVmaW5lZCggUEhZU0lDQUwgKSAmJiAhIGRlZmluZWQoIFBIT05HIClcXG5cXHR2Vmlld1Bvc2l0aW9uID0gLSBtdlBvc2l0aW9uLnh5ejtcXG4jZW5kaWZcXG5cIjtcblxudmFyIGNvbG9yX2ZyYWdtZW50ID0gXCIjaWZkZWYgVVNFX0NPTE9SXFxuXFx0ZGlmZnVzZUNvbG9yLnJnYiAqPSB2Q29sb3I7XFxuI2VuZGlmXCI7XG5cbnZhciBjb2xvcl9wYXJzX2ZyYWdtZW50ID0gXCIjaWZkZWYgVVNFX0NPTE9SXFxuXFx0dmFyeWluZyB2ZWMzIHZDb2xvcjtcXG4jZW5kaWZcXG5cIjtcblxudmFyIGNvbG9yX3BhcnNfdmVydGV4ID0gXCIjaWZkZWYgVVNFX0NPTE9SXFxuXFx0dmFyeWluZyB2ZWMzIHZDb2xvcjtcXG4jZW5kaWZcIjtcblxudmFyIGNvbG9yX3ZlcnRleCA9IFwiI2lmZGVmIFVTRV9DT0xPUlxcblxcdHZDb2xvci54eXogPSBjb2xvci54eXo7XFxuI2VuZGlmXCI7XG5cbnZhciBjb21tb24gPSBcIiNkZWZpbmUgUEkgMy4xNDE1OTI2NTM1OVxcbiNkZWZpbmUgUEkyIDYuMjgzMTg1MzA3MThcXG4jZGVmaW5lIFBJX0hBTEYgMS41NzA3OTYzMjY3OTQ5XFxuI2RlZmluZSBSRUNJUFJPQ0FMX1BJIDAuMzE4MzA5ODg2MThcXG4jZGVmaW5lIFJFQ0lQUk9DQUxfUEkyIDAuMTU5MTU0OTRcXG4jZGVmaW5lIExPRzIgMS40NDI2OTVcXG4jZGVmaW5lIEVQU0lMT04gMWUtNlxcbiNkZWZpbmUgc2F0dXJhdGUoYSkgY2xhbXAoIGEsIDAuMCwgMS4wIClcXG4jZGVmaW5lIHdoaXRlQ29tcGxpbWVudChhKSAoIDEuMCAtIHNhdHVyYXRlKCBhICkgKVxcbmZsb2F0IHBvdzIoIGNvbnN0IGluIGZsb2F0IHggKSB7IHJldHVybiB4Kng7IH1cXG5mbG9hdCBwb3czKCBjb25zdCBpbiBmbG9hdCB4ICkgeyByZXR1cm4geCp4Kng7IH1cXG5mbG9hdCBwb3c0KCBjb25zdCBpbiBmbG9hdCB4ICkgeyBmbG9hdCB4MiA9IHgqeDsgcmV0dXJuIHgyKngyOyB9XFxuZmxvYXQgYXZlcmFnZSggY29uc3QgaW4gdmVjMyBjb2xvciApIHsgcmV0dXJuIGRvdCggY29sb3IsIHZlYzMoIDAuMzMzMyApICk7IH1cXG5oaWdocCBmbG9hdCByYW5kKCBjb25zdCBpbiB2ZWMyIHV2ICkge1xcblxcdGNvbnN0IGhpZ2hwIGZsb2F0IGEgPSAxMi45ODk4LCBiID0gNzguMjMzLCBjID0gNDM3NTguNTQ1MztcXG5cXHRoaWdocCBmbG9hdCBkdCA9IGRvdCggdXYueHksIHZlYzIoIGEsYiApICksIHNuID0gbW9kKCBkdCwgUEkgKTtcXG5cXHRyZXR1cm4gZnJhY3Qoc2luKHNuKSAqIGMpO1xcbn1cXG5zdHJ1Y3QgSW5jaWRlbnRMaWdodCB7XFxuXFx0dmVjMyBjb2xvcjtcXG5cXHR2ZWMzIGRpcmVjdGlvbjtcXG5cXHRib29sIHZpc2libGU7XFxufTtcXG5zdHJ1Y3QgUmVmbGVjdGVkTGlnaHQge1xcblxcdHZlYzMgZGlyZWN0RGlmZnVzZTtcXG5cXHR2ZWMzIGRpcmVjdFNwZWN1bGFyO1xcblxcdHZlYzMgaW5kaXJlY3REaWZmdXNlO1xcblxcdHZlYzMgaW5kaXJlY3RTcGVjdWxhcjtcXG59O1xcbnN0cnVjdCBHZW9tZXRyaWNDb250ZXh0IHtcXG5cXHR2ZWMzIHBvc2l0aW9uO1xcblxcdHZlYzMgbm9ybWFsO1xcblxcdHZlYzMgdmlld0RpcjtcXG59O1xcbnZlYzMgdHJhbnNmb3JtRGlyZWN0aW9uKCBpbiB2ZWMzIGRpciwgaW4gbWF0NCBtYXRyaXggKSB7XFxuXFx0cmV0dXJuIG5vcm1hbGl6ZSggKCBtYXRyaXggKiB2ZWM0KCBkaXIsIDAuMCApICkueHl6ICk7XFxufVxcbnZlYzMgaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggaW4gdmVjMyBkaXIsIGluIG1hdDQgbWF0cml4ICkge1xcblxcdHJldHVybiBub3JtYWxpemUoICggdmVjNCggZGlyLCAwLjAgKSAqIG1hdHJpeCApLnh5eiApO1xcbn1cXG52ZWMzIHByb2plY3RPblBsYW5lKGluIHZlYzMgcG9pbnQsIGluIHZlYzMgcG9pbnRPblBsYW5lLCBpbiB2ZWMzIHBsYW5lTm9ybWFsICkge1xcblxcdGZsb2F0IGRpc3RhbmNlID0gZG90KCBwbGFuZU5vcm1hbCwgcG9pbnQgLSBwb2ludE9uUGxhbmUgKTtcXG5cXHRyZXR1cm4gLSBkaXN0YW5jZSAqIHBsYW5lTm9ybWFsICsgcG9pbnQ7XFxufVxcbmZsb2F0IHNpZGVPZlBsYW5lKCBpbiB2ZWMzIHBvaW50LCBpbiB2ZWMzIHBvaW50T25QbGFuZSwgaW4gdmVjMyBwbGFuZU5vcm1hbCApIHtcXG5cXHRyZXR1cm4gc2lnbiggZG90KCBwb2ludCAtIHBvaW50T25QbGFuZSwgcGxhbmVOb3JtYWwgKSApO1xcbn1cXG52ZWMzIGxpbmVQbGFuZUludGVyc2VjdCggaW4gdmVjMyBwb2ludE9uTGluZSwgaW4gdmVjMyBsaW5lRGlyZWN0aW9uLCBpbiB2ZWMzIHBvaW50T25QbGFuZSwgaW4gdmVjMyBwbGFuZU5vcm1hbCApIHtcXG5cXHRyZXR1cm4gbGluZURpcmVjdGlvbiAqICggZG90KCBwbGFuZU5vcm1hbCwgcG9pbnRPblBsYW5lIC0gcG9pbnRPbkxpbmUgKSAvIGRvdCggcGxhbmVOb3JtYWwsIGxpbmVEaXJlY3Rpb24gKSApICsgcG9pbnRPbkxpbmU7XFxufVxcbm1hdDMgdHJhbnNwb3NlTWF0MyggY29uc3QgaW4gbWF0MyBtICkge1xcblxcdG1hdDMgdG1wO1xcblxcdHRtcFsgMCBdID0gdmVjMyggbVsgMCBdLngsIG1bIDEgXS54LCBtWyAyIF0ueCApO1xcblxcdHRtcFsgMSBdID0gdmVjMyggbVsgMCBdLnksIG1bIDEgXS55LCBtWyAyIF0ueSApO1xcblxcdHRtcFsgMiBdID0gdmVjMyggbVsgMCBdLnosIG1bIDEgXS56LCBtWyAyIF0ueiApO1xcblxcdHJldHVybiB0bXA7XFxufVxcbmZsb2F0IGxpbmVhclRvUmVsYXRpdmVMdW1pbmFuY2UoIGNvbnN0IGluIHZlYzMgY29sb3IgKSB7XFxuXFx0dmVjMyB3ZWlnaHRzID0gdmVjMyggMC4yMTI2LCAwLjcxNTIsIDAuMDcyMiApO1xcblxcdHJldHVybiBkb3QoIHdlaWdodHMsIGNvbG9yLnJnYiApO1xcbn1cXG5cIjtcblxudmFyIGN1YmVfdXZfcmVmbGVjdGlvbl9mcmFnbWVudCA9IFwiI2lmZGVmIEVOVk1BUF9UWVBFX0NVQkVfVVZcXG4jZGVmaW5lIGN1YmVVVl90ZXh0dXJlU2l6ZSAoMTAyNC4wKVxcbmludCBnZXRGYWNlRnJvbURpcmVjdGlvbih2ZWMzIGRpcmVjdGlvbikge1xcblxcdHZlYzMgYWJzRGlyZWN0aW9uID0gYWJzKGRpcmVjdGlvbik7XFxuXFx0aW50IGZhY2UgPSAtMTtcXG5cXHRpZiggYWJzRGlyZWN0aW9uLnggPiBhYnNEaXJlY3Rpb24ueiApIHtcXG5cXHRcXHRpZihhYnNEaXJlY3Rpb24ueCA+IGFic0RpcmVjdGlvbi55IClcXG5cXHRcXHRcXHRmYWNlID0gZGlyZWN0aW9uLnggPiAwLjAgPyAwIDogMztcXG5cXHRcXHRlbHNlXFxuXFx0XFx0XFx0ZmFjZSA9IGRpcmVjdGlvbi55ID4gMC4wID8gMSA6IDQ7XFxuXFx0fVxcblxcdGVsc2Uge1xcblxcdFxcdGlmKGFic0RpcmVjdGlvbi56ID4gYWJzRGlyZWN0aW9uLnkgKVxcblxcdFxcdFxcdGZhY2UgPSBkaXJlY3Rpb24ueiA+IDAuMCA/IDIgOiA1O1xcblxcdFxcdGVsc2VcXG5cXHRcXHRcXHRmYWNlID0gZGlyZWN0aW9uLnkgPiAwLjAgPyAxIDogNDtcXG5cXHR9XFxuXFx0cmV0dXJuIGZhY2U7XFxufVxcbiNkZWZpbmUgY3ViZVVWX21heExvZHMxICAobG9nMihjdWJlVVZfdGV4dHVyZVNpemUqMC4yNSkgLSAxLjApXFxuI2RlZmluZSBjdWJlVVZfcmFuZ2VDbGFtcCAoZXhwMigoNi4wIC0gMS4wKSAqIDIuMCkpXFxudmVjMiBNaXBMZXZlbEluZm8oIHZlYzMgdmVjLCBmbG9hdCByb3VnaG5lc3NMZXZlbCwgZmxvYXQgcm91Z2huZXNzICkge1xcblxcdGZsb2F0IHNjYWxlID0gZXhwMihjdWJlVVZfbWF4TG9kczEgLSByb3VnaG5lc3NMZXZlbCk7XFxuXFx0ZmxvYXQgZHhSb3VnaG5lc3MgPSBkRmR4KHJvdWdobmVzcyk7XFxuXFx0ZmxvYXQgZHlSb3VnaG5lc3MgPSBkRmR5KHJvdWdobmVzcyk7XFxuXFx0dmVjMyBkeCA9IGRGZHgoIHZlYyAqIHNjYWxlICogZHhSb3VnaG5lc3MgKTtcXG5cXHR2ZWMzIGR5ID0gZEZkeSggdmVjICogc2NhbGUgKiBkeVJvdWdobmVzcyApO1xcblxcdGZsb2F0IGQgPSBtYXgoIGRvdCggZHgsIGR4ICksIGRvdCggZHksIGR5ICkgKTtcXG5cXHRkID0gY2xhbXAoZCwgMS4wLCBjdWJlVVZfcmFuZ2VDbGFtcCk7XFxuXFx0ZmxvYXQgbWlwTGV2ZWwgPSAwLjUgKiBsb2cyKGQpO1xcblxcdHJldHVybiB2ZWMyKGZsb29yKG1pcExldmVsKSwgZnJhY3QobWlwTGV2ZWwpKTtcXG59XFxuI2RlZmluZSBjdWJlVVZfbWF4TG9kczIgKGxvZzIoY3ViZVVWX3RleHR1cmVTaXplKjAuMjUpIC0gMi4wKVxcbiNkZWZpbmUgY3ViZVVWX3JjcFRleHR1cmVTaXplICgxLjAgLyBjdWJlVVZfdGV4dHVyZVNpemUpXFxudmVjMiBnZXRDdWJlVVYodmVjMyBkaXJlY3Rpb24sIGZsb2F0IHJvdWdobmVzc0xldmVsLCBmbG9hdCBtaXBMZXZlbCkge1xcblxcdG1pcExldmVsID0gcm91Z2huZXNzTGV2ZWwgPiBjdWJlVVZfbWF4TG9kczIgLSAzLjAgPyAwLjAgOiBtaXBMZXZlbDtcXG5cXHRmbG9hdCBhID0gMTYuMCAqIGN1YmVVVl9yY3BUZXh0dXJlU2l6ZTtcXG5cXHR2ZWMyIGV4cDJfcGFja2VkID0gZXhwMiggdmVjMiggcm91Z2huZXNzTGV2ZWwsIG1pcExldmVsICkgKTtcXG5cXHR2ZWMyIHJjcF9leHAyX3BhY2tlZCA9IHZlYzIoIDEuMCApIC8gZXhwMl9wYWNrZWQ7XFxuXFx0ZmxvYXQgcG93U2NhbGUgPSBleHAyX3BhY2tlZC54ICogZXhwMl9wYWNrZWQueTtcXG5cXHRmbG9hdCBzY2FsZSA9IHJjcF9leHAyX3BhY2tlZC54ICogcmNwX2V4cDJfcGFja2VkLnkgKiAwLjI1O1xcblxcdGZsb2F0IG1pcE9mZnNldCA9IDAuNzUqKDEuMCAtIHJjcF9leHAyX3BhY2tlZC55KSAqIHJjcF9leHAyX3BhY2tlZC54O1xcblxcdGJvb2wgYlJlcyA9IG1pcExldmVsID09IDAuMDtcXG5cXHRzY2FsZSA9ICBiUmVzICYmIChzY2FsZSA8IGEpID8gYSA6IHNjYWxlO1xcblxcdHZlYzMgcjtcXG5cXHR2ZWMyIG9mZnNldDtcXG5cXHRpbnQgZmFjZSA9IGdldEZhY2VGcm9tRGlyZWN0aW9uKGRpcmVjdGlvbik7XFxuXFx0ZmxvYXQgcmNwUG93U2NhbGUgPSAxLjAgLyBwb3dTY2FsZTtcXG5cXHRpZiggZmFjZSA9PSAwKSB7XFxuXFx0XFx0ciA9IHZlYzMoZGlyZWN0aW9uLngsIC1kaXJlY3Rpb24ueiwgZGlyZWN0aW9uLnkpO1xcblxcdFxcdG9mZnNldCA9IHZlYzIoMC4wK21pcE9mZnNldCwwLjc1ICogcmNwUG93U2NhbGUpO1xcblxcdFxcdG9mZnNldC55ID0gYlJlcyAmJiAob2Zmc2V0LnkgPCAyLjAqYSkgPyBhIDogb2Zmc2V0Lnk7XFxuXFx0fVxcblxcdGVsc2UgaWYoIGZhY2UgPT0gMSkge1xcblxcdFxcdHIgPSB2ZWMzKGRpcmVjdGlvbi55LCBkaXJlY3Rpb24ueCwgZGlyZWN0aW9uLnopO1xcblxcdFxcdG9mZnNldCA9IHZlYzIoc2NhbGUrbWlwT2Zmc2V0LCAwLjc1ICogcmNwUG93U2NhbGUpO1xcblxcdFxcdG9mZnNldC55ID0gYlJlcyAmJiAob2Zmc2V0LnkgPCAyLjAqYSkgPyBhIDogb2Zmc2V0Lnk7XFxuXFx0fVxcblxcdGVsc2UgaWYoIGZhY2UgPT0gMikge1xcblxcdFxcdHIgPSB2ZWMzKGRpcmVjdGlvbi56LCBkaXJlY3Rpb24ueCwgZGlyZWN0aW9uLnkpO1xcblxcdFxcdG9mZnNldCA9IHZlYzIoMi4wKnNjYWxlK21pcE9mZnNldCwgMC43NSAqIHJjcFBvd1NjYWxlKTtcXG5cXHRcXHRvZmZzZXQueSA9IGJSZXMgJiYgKG9mZnNldC55IDwgMi4wKmEpID8gYSA6IG9mZnNldC55O1xcblxcdH1cXG5cXHRlbHNlIGlmKCBmYWNlID09IDMpIHtcXG5cXHRcXHRyID0gdmVjMyhkaXJlY3Rpb24ueCwgZGlyZWN0aW9uLnosIGRpcmVjdGlvbi55KTtcXG5cXHRcXHRvZmZzZXQgPSB2ZWMyKDAuMCttaXBPZmZzZXQsMC41ICogcmNwUG93U2NhbGUpO1xcblxcdFxcdG9mZnNldC55ID0gYlJlcyAmJiAob2Zmc2V0LnkgPCAyLjAqYSkgPyAwLjAgOiBvZmZzZXQueTtcXG5cXHR9XFxuXFx0ZWxzZSBpZiggZmFjZSA9PSA0KSB7XFxuXFx0XFx0ciA9IHZlYzMoZGlyZWN0aW9uLnksIGRpcmVjdGlvbi54LCAtZGlyZWN0aW9uLnopO1xcblxcdFxcdG9mZnNldCA9IHZlYzIoc2NhbGUrbWlwT2Zmc2V0LCAwLjUgKiByY3BQb3dTY2FsZSk7XFxuXFx0XFx0b2Zmc2V0LnkgPSBiUmVzICYmIChvZmZzZXQueSA8IDIuMCphKSA/IDAuMCA6IG9mZnNldC55O1xcblxcdH1cXG5cXHRlbHNlIHtcXG5cXHRcXHRyID0gdmVjMyhkaXJlY3Rpb24ueiwgLWRpcmVjdGlvbi54LCBkaXJlY3Rpb24ueSk7XFxuXFx0XFx0b2Zmc2V0ID0gdmVjMigyLjAqc2NhbGUrbWlwT2Zmc2V0LCAwLjUgKiByY3BQb3dTY2FsZSk7XFxuXFx0XFx0b2Zmc2V0LnkgPSBiUmVzICYmIChvZmZzZXQueSA8IDIuMCphKSA/IDAuMCA6IG9mZnNldC55O1xcblxcdH1cXG5cXHRyID0gbm9ybWFsaXplKHIpO1xcblxcdGZsb2F0IHRleGVsT2Zmc2V0ID0gMC41ICogY3ViZVVWX3JjcFRleHR1cmVTaXplO1xcblxcdHZlYzIgcyA9ICggci55eiAvIGFicyggci54ICkgKyB2ZWMyKCAxLjAgKSApICogMC41O1xcblxcdHZlYzIgYmFzZSA9IG9mZnNldCArIHZlYzIoIHRleGVsT2Zmc2V0ICk7XFxuXFx0cmV0dXJuIGJhc2UgKyBzICogKCBzY2FsZSAtIDIuMCAqIHRleGVsT2Zmc2V0ICk7XFxufVxcbiNkZWZpbmUgY3ViZVVWX21heExvZHMzIChsb2cyKGN1YmVVVl90ZXh0dXJlU2l6ZSowLjI1KSAtIDMuMClcXG52ZWM0IHRleHR1cmVDdWJlVVYodmVjMyByZWZsZWN0ZWREaXJlY3Rpb24sIGZsb2F0IHJvdWdobmVzcyApIHtcXG5cXHRmbG9hdCByb3VnaG5lc3NWYWwgPSByb3VnaG5lc3MqIGN1YmVVVl9tYXhMb2RzMztcXG5cXHRmbG9hdCByMSA9IGZsb29yKHJvdWdobmVzc1ZhbCk7XFxuXFx0ZmxvYXQgcjIgPSByMSArIDEuMDtcXG5cXHRmbG9hdCB0ID0gZnJhY3Qocm91Z2huZXNzVmFsKTtcXG5cXHR2ZWMyIG1pcEluZm8gPSBNaXBMZXZlbEluZm8ocmVmbGVjdGVkRGlyZWN0aW9uLCByMSwgcm91Z2huZXNzKTtcXG5cXHRmbG9hdCBzID0gbWlwSW5mby55O1xcblxcdGZsb2F0IGxldmVsMCA9IG1pcEluZm8ueDtcXG5cXHRmbG9hdCBsZXZlbDEgPSBsZXZlbDAgKyAxLjA7XFxuXFx0bGV2ZWwxID0gbGV2ZWwxID4gNS4wID8gNS4wIDogbGV2ZWwxO1xcblxcdGxldmVsMCArPSBtaW4oIGZsb29yKCBzICsgMC41ICksIDUuMCApO1xcblxcdHZlYzIgdXZfMTAgPSBnZXRDdWJlVVYocmVmbGVjdGVkRGlyZWN0aW9uLCByMSwgbGV2ZWwwKTtcXG5cXHR2ZWM0IGNvbG9yMTAgPSBlbnZNYXBUZXhlbFRvTGluZWFyKHRleHR1cmUyRChlbnZNYXAsIHV2XzEwKSk7XFxuXFx0dmVjMiB1dl8yMCA9IGdldEN1YmVVVihyZWZsZWN0ZWREaXJlY3Rpb24sIHIyLCBsZXZlbDApO1xcblxcdHZlYzQgY29sb3IyMCA9IGVudk1hcFRleGVsVG9MaW5lYXIodGV4dHVyZTJEKGVudk1hcCwgdXZfMjApKTtcXG5cXHR2ZWM0IHJlc3VsdCA9IG1peChjb2xvcjEwLCBjb2xvcjIwLCB0KTtcXG5cXHRyZXR1cm4gdmVjNChyZXN1bHQucmdiLCAxLjApO1xcbn1cXG4jZW5kaWZcXG5cIjtcblxudmFyIGRlZmF1bHRub3JtYWxfdmVydGV4ID0gXCJ2ZWMzIHRyYW5zZm9ybWVkTm9ybWFsID0gbm9ybWFsTWF0cml4ICogb2JqZWN0Tm9ybWFsO1xcbiNpZmRlZiBGTElQX1NJREVEXFxuXFx0dHJhbnNmb3JtZWROb3JtYWwgPSAtIHRyYW5zZm9ybWVkTm9ybWFsO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4ID0gXCIjaWZkZWYgVVNFX0RJU1BMQUNFTUVOVE1BUFxcblxcdHVuaWZvcm0gc2FtcGxlcjJEIGRpc3BsYWNlbWVudE1hcDtcXG5cXHR1bmlmb3JtIGZsb2F0IGRpc3BsYWNlbWVudFNjYWxlO1xcblxcdHVuaWZvcm0gZmxvYXQgZGlzcGxhY2VtZW50QmlhcztcXG4jZW5kaWZcXG5cIjtcblxudmFyIGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXggPSBcIiNpZmRlZiBVU0VfRElTUExBQ0VNRU5UTUFQXFxuXFx0dHJhbnNmb3JtZWQgKz0gbm9ybWFsaXplKCBvYmplY3ROb3JtYWwgKSAqICggdGV4dHVyZTJEKCBkaXNwbGFjZW1lbnRNYXAsIHV2ICkueCAqIGRpc3BsYWNlbWVudFNjYWxlICsgZGlzcGxhY2VtZW50QmlhcyApO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgZW1pc3NpdmVtYXBfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfRU1JU1NJVkVNQVBcXG5cXHR2ZWM0IGVtaXNzaXZlQ29sb3IgPSB0ZXh0dXJlMkQoIGVtaXNzaXZlTWFwLCB2VXYgKTtcXG5cXHRlbWlzc2l2ZUNvbG9yLnJnYiA9IGVtaXNzaXZlTWFwVGV4ZWxUb0xpbmVhciggZW1pc3NpdmVDb2xvciApLnJnYjtcXG5cXHR0b3RhbEVtaXNzaXZlUmFkaWFuY2UgKj0gZW1pc3NpdmVDb2xvci5yZ2I7XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBlbWlzc2l2ZW1hcF9wYXJzX2ZyYWdtZW50ID0gXCIjaWZkZWYgVVNFX0VNSVNTSVZFTUFQXFxuXFx0dW5pZm9ybSBzYW1wbGVyMkQgZW1pc3NpdmVNYXA7XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBlbmNvZGluZ3NfZnJhZ21lbnQgPSBcIiAgZ2xfRnJhZ0NvbG9yID0gbGluZWFyVG9PdXRwdXRUZXhlbCggZ2xfRnJhZ0NvbG9yICk7XFxuXCI7XG5cbnZhciBlbmNvZGluZ3NfcGFyc19mcmFnbWVudCA9IFwiXFxudmVjNCBMaW5lYXJUb0xpbmVhciggaW4gdmVjNCB2YWx1ZSApIHtcXG5cXHRyZXR1cm4gdmFsdWU7XFxufVxcbnZlYzQgR2FtbWFUb0xpbmVhciggaW4gdmVjNCB2YWx1ZSwgaW4gZmxvYXQgZ2FtbWFGYWN0b3IgKSB7XFxuXFx0cmV0dXJuIHZlYzQoIHBvdyggdmFsdWUueHl6LCB2ZWMzKCBnYW1tYUZhY3RvciApICksIHZhbHVlLncgKTtcXG59XFxudmVjNCBMaW5lYXJUb0dhbW1hKCBpbiB2ZWM0IHZhbHVlLCBpbiBmbG9hdCBnYW1tYUZhY3RvciApIHtcXG5cXHRyZXR1cm4gdmVjNCggcG93KCB2YWx1ZS54eXosIHZlYzMoIDEuMCAvIGdhbW1hRmFjdG9yICkgKSwgdmFsdWUudyApO1xcbn1cXG52ZWM0IHNSR0JUb0xpbmVhciggaW4gdmVjNCB2YWx1ZSApIHtcXG5cXHRyZXR1cm4gdmVjNCggbWl4KCBwb3coIHZhbHVlLnJnYiAqIDAuOTQ3ODY3Mjk4NiArIHZlYzMoIDAuMDUyMTMyNzAxNCApLCB2ZWMzKCAyLjQgKSApLCB2YWx1ZS5yZ2IgKiAwLjA3NzM5OTM4MDgsIHZlYzMoIGxlc3NUaGFuRXF1YWwoIHZhbHVlLnJnYiwgdmVjMyggMC4wNDA0NSApICkgKSApLCB2YWx1ZS53ICk7XFxufVxcbnZlYzQgTGluZWFyVG9zUkdCKCBpbiB2ZWM0IHZhbHVlICkge1xcblxcdHJldHVybiB2ZWM0KCBtaXgoIHBvdyggdmFsdWUucmdiLCB2ZWMzKCAwLjQxNjY2ICkgKSAqIDEuMDU1IC0gdmVjMyggMC4wNTUgKSwgdmFsdWUucmdiICogMTIuOTIsIHZlYzMoIGxlc3NUaGFuRXF1YWwoIHZhbHVlLnJnYiwgdmVjMyggMC4wMDMxMzA4ICkgKSApICksIHZhbHVlLncgKTtcXG59XFxudmVjNCBSR0JFVG9MaW5lYXIoIGluIHZlYzQgdmFsdWUgKSB7XFxuXFx0cmV0dXJuIHZlYzQoIHZhbHVlLnJnYiAqIGV4cDIoIHZhbHVlLmEgKiAyNTUuMCAtIDEyOC4wICksIDEuMCApO1xcbn1cXG52ZWM0IExpbmVhclRvUkdCRSggaW4gdmVjNCB2YWx1ZSApIHtcXG5cXHRmbG9hdCBtYXhDb21wb25lbnQgPSBtYXgoIG1heCggdmFsdWUuciwgdmFsdWUuZyApLCB2YWx1ZS5iICk7XFxuXFx0ZmxvYXQgZkV4cCA9IGNsYW1wKCBjZWlsKCBsb2cyKCBtYXhDb21wb25lbnQgKSApLCAtMTI4LjAsIDEyNy4wICk7XFxuXFx0cmV0dXJuIHZlYzQoIHZhbHVlLnJnYiAvIGV4cDIoIGZFeHAgKSwgKCBmRXhwICsgMTI4LjAgKSAvIDI1NS4wICk7XFxufVxcbnZlYzQgUkdCTVRvTGluZWFyKCBpbiB2ZWM0IHZhbHVlLCBpbiBmbG9hdCBtYXhSYW5nZSApIHtcXG5cXHRyZXR1cm4gdmVjNCggdmFsdWUueHl6ICogdmFsdWUudyAqIG1heFJhbmdlLCAxLjAgKTtcXG59XFxudmVjNCBMaW5lYXJUb1JHQk0oIGluIHZlYzQgdmFsdWUsIGluIGZsb2F0IG1heFJhbmdlICkge1xcblxcdGZsb2F0IG1heFJHQiA9IG1heCggdmFsdWUueCwgbWF4KCB2YWx1ZS5nLCB2YWx1ZS5iICkgKTtcXG5cXHRmbG9hdCBNICAgICAgPSBjbGFtcCggbWF4UkdCIC8gbWF4UmFuZ2UsIDAuMCwgMS4wICk7XFxuXFx0TSAgICAgICAgICAgID0gY2VpbCggTSAqIDI1NS4wICkgLyAyNTUuMDtcXG5cXHRyZXR1cm4gdmVjNCggdmFsdWUucmdiIC8gKCBNICogbWF4UmFuZ2UgKSwgTSApO1xcbn1cXG52ZWM0IFJHQkRUb0xpbmVhciggaW4gdmVjNCB2YWx1ZSwgaW4gZmxvYXQgbWF4UmFuZ2UgKSB7XFxuXFx0cmV0dXJuIHZlYzQoIHZhbHVlLnJnYiAqICggKCBtYXhSYW5nZSAvIDI1NS4wICkgLyB2YWx1ZS5hICksIDEuMCApO1xcbn1cXG52ZWM0IExpbmVhclRvUkdCRCggaW4gdmVjNCB2YWx1ZSwgaW4gZmxvYXQgbWF4UmFuZ2UgKSB7XFxuXFx0ZmxvYXQgbWF4UkdCID0gbWF4KCB2YWx1ZS54LCBtYXgoIHZhbHVlLmcsIHZhbHVlLmIgKSApO1xcblxcdGZsb2F0IEQgICAgICA9IG1heCggbWF4UmFuZ2UgLyBtYXhSR0IsIDEuMCApO1xcblxcdEQgICAgICAgICAgICA9IG1pbiggZmxvb3IoIEQgKSAvIDI1NS4wLCAxLjAgKTtcXG5cXHRyZXR1cm4gdmVjNCggdmFsdWUucmdiICogKCBEICogKCAyNTUuMCAvIG1heFJhbmdlICkgKSwgRCApO1xcbn1cXG5jb25zdCBtYXQzIGNMb2dMdXZNID0gbWF0MyggMC4yMjA5LCAwLjMzOTAsIDAuNDE4NCwgMC4xMTM4LCAwLjY3ODAsIDAuNzMxOSwgMC4wMTAyLCAwLjExMzAsIDAuMjk2OSApO1xcbnZlYzQgTGluZWFyVG9Mb2dMdXYoIGluIHZlYzQgdmFsdWUgKSAge1xcblxcdHZlYzMgWHBfWV9YWVpwID0gdmFsdWUucmdiICogY0xvZ0x1dk07XFxuXFx0WHBfWV9YWVpwID0gbWF4KFhwX1lfWFlacCwgdmVjMygxZS02LCAxZS02LCAxZS02KSk7XFxuXFx0dmVjNCB2UmVzdWx0O1xcblxcdHZSZXN1bHQueHkgPSBYcF9ZX1hZWnAueHkgLyBYcF9ZX1hZWnAuejtcXG5cXHRmbG9hdCBMZSA9IDIuMCAqIGxvZzIoWHBfWV9YWVpwLnkpICsgMTI3LjA7XFxuXFx0dlJlc3VsdC53ID0gZnJhY3QoTGUpO1xcblxcdHZSZXN1bHQueiA9IChMZSAtIChmbG9vcih2UmVzdWx0LncqMjU1LjApKS8yNTUuMCkvMjU1LjA7XFxuXFx0cmV0dXJuIHZSZXN1bHQ7XFxufVxcbmNvbnN0IG1hdDMgY0xvZ0x1dkludmVyc2VNID0gbWF0MyggNi4wMDE0LCAtMi43MDA4LCAtMS43OTk2LCAtMS4zMzIwLCAzLjEwMjksIC01Ljc3MjEsIDAuMzAwOCwgLTEuMDg4MiwgNS42MjY4ICk7XFxudmVjNCBMb2dMdXZUb0xpbmVhciggaW4gdmVjNCB2YWx1ZSApIHtcXG5cXHRmbG9hdCBMZSA9IHZhbHVlLnogKiAyNTUuMCArIHZhbHVlLnc7XFxuXFx0dmVjMyBYcF9ZX1hZWnA7XFxuXFx0WHBfWV9YWVpwLnkgPSBleHAyKChMZSAtIDEyNy4wKSAvIDIuMCk7XFxuXFx0WHBfWV9YWVpwLnogPSBYcF9ZX1hZWnAueSAvIHZhbHVlLnk7XFxuXFx0WHBfWV9YWVpwLnggPSB2YWx1ZS54ICogWHBfWV9YWVpwLno7XFxuXFx0dmVjMyB2UkdCID0gWHBfWV9YWVpwLnJnYiAqIGNMb2dMdXZJbnZlcnNlTTtcXG5cXHRyZXR1cm4gdmVjNCggbWF4KHZSR0IsIDAuMCksIDEuMCApO1xcbn1cXG5cIjtcblxudmFyIGVudm1hcF9mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9FTlZNQVBcXG5cXHQjaWYgZGVmaW5lZCggVVNFX0JVTVBNQVAgKSB8fCBkZWZpbmVkKCBVU0VfTk9STUFMTUFQICkgfHwgZGVmaW5lZCggUEhPTkcgKVxcblxcdFxcdHZlYzMgY2FtZXJhVG9WZXJ0ZXggPSBub3JtYWxpemUoIHZXb3JsZFBvc2l0aW9uIC0gY2FtZXJhUG9zaXRpb24gKTtcXG5cXHRcXHR2ZWMzIHdvcmxkTm9ybWFsID0gaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggbm9ybWFsLCB2aWV3TWF0cml4ICk7XFxuXFx0XFx0I2lmZGVmIEVOVk1BUF9NT0RFX1JFRkxFQ1RJT05cXG5cXHRcXHRcXHR2ZWMzIHJlZmxlY3RWZWMgPSByZWZsZWN0KCBjYW1lcmFUb1ZlcnRleCwgd29ybGROb3JtYWwgKTtcXG5cXHRcXHQjZWxzZVxcblxcdFxcdFxcdHZlYzMgcmVmbGVjdFZlYyA9IHJlZnJhY3QoIGNhbWVyYVRvVmVydGV4LCB3b3JsZE5vcm1hbCwgcmVmcmFjdGlvblJhdGlvICk7XFxuXFx0XFx0I2VuZGlmXFxuXFx0I2Vsc2VcXG5cXHRcXHR2ZWMzIHJlZmxlY3RWZWMgPSB2UmVmbGVjdDtcXG5cXHQjZW5kaWZcXG5cXHQjaWZkZWYgRU5WTUFQX1RZUEVfQ1VCRVxcblxcdFxcdHZlYzQgZW52Q29sb3IgPSB0ZXh0dXJlQ3ViZSggZW52TWFwLCB2ZWMzKCBmbGlwRW52TWFwICogcmVmbGVjdFZlYy54LCByZWZsZWN0VmVjLnl6ICkgKTtcXG5cXHQjZWxpZiBkZWZpbmVkKCBFTlZNQVBfVFlQRV9FUVVJUkVDIClcXG5cXHRcXHR2ZWMyIHNhbXBsZVVWO1xcblxcdFxcdHJlZmxlY3RWZWMgPSBub3JtYWxpemUoIHJlZmxlY3RWZWMgKTtcXG5cXHRcXHRzYW1wbGVVVi55ID0gYXNpbiggY2xhbXAoIHJlZmxlY3RWZWMueSwgLSAxLjAsIDEuMCApICkgKiBSRUNJUFJPQ0FMX1BJICsgMC41O1xcblxcdFxcdHNhbXBsZVVWLnggPSBhdGFuKCByZWZsZWN0VmVjLnosIHJlZmxlY3RWZWMueCApICogUkVDSVBST0NBTF9QSTIgKyAwLjU7XFxuXFx0XFx0dmVjNCBlbnZDb2xvciA9IHRleHR1cmUyRCggZW52TWFwLCBzYW1wbGVVViApO1xcblxcdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9UWVBFX1NQSEVSRSApXFxuXFx0XFx0cmVmbGVjdFZlYyA9IG5vcm1hbGl6ZSggcmVmbGVjdFZlYyApO1xcblxcdFxcdHZlYzMgcmVmbGVjdFZpZXcgPSBub3JtYWxpemUoICggdmlld01hdHJpeCAqIHZlYzQoIHJlZmxlY3RWZWMsIDAuMCApICkueHl6ICsgdmVjMyggMC4wLCAwLjAsIDEuMCApICk7XFxuXFx0XFx0dmVjNCBlbnZDb2xvciA9IHRleHR1cmUyRCggZW52TWFwLCByZWZsZWN0Vmlldy54eSAqIDAuNSArIDAuNSApO1xcblxcdCNlbHNlXFxuXFx0XFx0dmVjNCBlbnZDb2xvciA9IHZlYzQoIDAuMCApO1xcblxcdCNlbmRpZlxcblxcdGVudkNvbG9yID0gZW52TWFwVGV4ZWxUb0xpbmVhciggZW52Q29sb3IgKTtcXG5cXHQjaWZkZWYgRU5WTUFQX0JMRU5ESU5HX01VTFRJUExZXFxuXFx0XFx0b3V0Z29pbmdMaWdodCA9IG1peCggb3V0Z29pbmdMaWdodCwgb3V0Z29pbmdMaWdodCAqIGVudkNvbG9yLnh5eiwgc3BlY3VsYXJTdHJlbmd0aCAqIHJlZmxlY3Rpdml0eSApO1xcblxcdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9CTEVORElOR19NSVggKVxcblxcdFxcdG91dGdvaW5nTGlnaHQgPSBtaXgoIG91dGdvaW5nTGlnaHQsIGVudkNvbG9yLnh5eiwgc3BlY3VsYXJTdHJlbmd0aCAqIHJlZmxlY3Rpdml0eSApO1xcblxcdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9CTEVORElOR19BREQgKVxcblxcdFxcdG91dGdvaW5nTGlnaHQgKz0gZW52Q29sb3IueHl6ICogc3BlY3VsYXJTdHJlbmd0aCAqIHJlZmxlY3Rpdml0eTtcXG5cXHQjZW5kaWZcXG4jZW5kaWZcXG5cIjtcblxudmFyIGVudm1hcF9wYXJzX2ZyYWdtZW50ID0gXCIjaWYgZGVmaW5lZCggVVNFX0VOVk1BUCApIHx8IGRlZmluZWQoIFBIWVNJQ0FMIClcXG5cXHR1bmlmb3JtIGZsb2F0IHJlZmxlY3Rpdml0eTtcXG5cXHR1bmlmb3JtIGZsb2F0IGVudk1hcEludGVuc2l0eTtcXG4jZW5kaWZcXG4jaWZkZWYgVVNFX0VOVk1BUFxcblxcdCNpZiAhIGRlZmluZWQoIFBIWVNJQ0FMICkgJiYgKCBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFVTRV9OT1JNQUxNQVAgKSB8fCBkZWZpbmVkKCBQSE9ORyApIClcXG5cXHRcXHR2YXJ5aW5nIHZlYzMgdldvcmxkUG9zaXRpb247XFxuXFx0I2VuZGlmXFxuXFx0I2lmZGVmIEVOVk1BUF9UWVBFX0NVQkVcXG5cXHRcXHR1bmlmb3JtIHNhbXBsZXJDdWJlIGVudk1hcDtcXG5cXHQjZWxzZVxcblxcdFxcdHVuaWZvcm0gc2FtcGxlcjJEIGVudk1hcDtcXG5cXHQjZW5kaWZcXG5cXHR1bmlmb3JtIGZsb2F0IGZsaXBFbnZNYXA7XFxuXFx0dW5pZm9ybSBpbnQgbWF4TWlwTGV2ZWw7XFxuXFx0I2lmIGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVVNFX05PUk1BTE1BUCApIHx8IGRlZmluZWQoIFBIT05HICkgfHwgZGVmaW5lZCggUEhZU0lDQUwgKVxcblxcdFxcdHVuaWZvcm0gZmxvYXQgcmVmcmFjdGlvblJhdGlvO1xcblxcdCNlbHNlXFxuXFx0XFx0dmFyeWluZyB2ZWMzIHZSZWZsZWN0O1xcblxcdCNlbmRpZlxcbiNlbmRpZlxcblwiO1xuXG52YXIgZW52bWFwX3BhcnNfdmVydGV4ID0gXCIjaWZkZWYgVVNFX0VOVk1BUFxcblxcdCNpZiBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFVTRV9OT1JNQUxNQVAgKSB8fCBkZWZpbmVkKCBQSE9ORyApXFxuXFx0XFx0dmFyeWluZyB2ZWMzIHZXb3JsZFBvc2l0aW9uO1xcblxcdCNlbHNlXFxuXFx0XFx0dmFyeWluZyB2ZWMzIHZSZWZsZWN0O1xcblxcdFxcdHVuaWZvcm0gZmxvYXQgcmVmcmFjdGlvblJhdGlvO1xcblxcdCNlbmRpZlxcbiNlbmRpZlxcblwiO1xuXG52YXIgZW52bWFwX3ZlcnRleCA9IFwiI2lmZGVmIFVTRV9FTlZNQVBcXG5cXHQjaWYgZGVmaW5lZCggVVNFX0JVTVBNQVAgKSB8fCBkZWZpbmVkKCBVU0VfTk9STUFMTUFQICkgfHwgZGVmaW5lZCggUEhPTkcgKVxcblxcdFxcdHZXb3JsZFBvc2l0aW9uID0gd29ybGRQb3NpdGlvbi54eXo7XFxuXFx0I2Vsc2VcXG5cXHRcXHR2ZWMzIGNhbWVyYVRvVmVydGV4ID0gbm9ybWFsaXplKCB3b3JsZFBvc2l0aW9uLnh5eiAtIGNhbWVyYVBvc2l0aW9uICk7XFxuXFx0XFx0dmVjMyB3b3JsZE5vcm1hbCA9IGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIHRyYW5zZm9ybWVkTm9ybWFsLCB2aWV3TWF0cml4ICk7XFxuXFx0XFx0I2lmZGVmIEVOVk1BUF9NT0RFX1JFRkxFQ1RJT05cXG5cXHRcXHRcXHR2UmVmbGVjdCA9IHJlZmxlY3QoIGNhbWVyYVRvVmVydGV4LCB3b3JsZE5vcm1hbCApO1xcblxcdFxcdCNlbHNlXFxuXFx0XFx0XFx0dlJlZmxlY3QgPSByZWZyYWN0KCBjYW1lcmFUb1ZlcnRleCwgd29ybGROb3JtYWwsIHJlZnJhY3Rpb25SYXRpbyApO1xcblxcdFxcdCNlbmRpZlxcblxcdCNlbmRpZlxcbiNlbmRpZlxcblwiO1xuXG52YXIgZm9nX3ZlcnRleCA9IFwiXFxuI2lmZGVmIFVTRV9GT0dcXG5mb2dEZXB0aCA9IC1tdlBvc2l0aW9uLno7XFxuI2VuZGlmXCI7XG5cbnZhciBmb2dfcGFyc192ZXJ0ZXggPSBcIiNpZmRlZiBVU0VfRk9HXFxuICB2YXJ5aW5nIGZsb2F0IGZvZ0RlcHRoO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgZm9nX2ZyYWdtZW50ID0gXCIjaWZkZWYgVVNFX0ZPR1xcblxcdCNpZmRlZiBGT0dfRVhQMlxcblxcdFxcdGZsb2F0IGZvZ0ZhY3RvciA9IHdoaXRlQ29tcGxpbWVudCggZXhwMiggLSBmb2dEZW5zaXR5ICogZm9nRGVuc2l0eSAqIGZvZ0RlcHRoICogZm9nRGVwdGggKiBMT0cyICkgKTtcXG5cXHQjZWxzZVxcblxcdFxcdGZsb2F0IGZvZ0ZhY3RvciA9IHNtb290aHN0ZXAoIGZvZ05lYXIsIGZvZ0ZhciwgZm9nRGVwdGggKTtcXG5cXHQjZW5kaWZcXG5cXHRnbF9GcmFnQ29sb3IucmdiID0gbWl4KCBnbF9GcmFnQ29sb3IucmdiLCBmb2dDb2xvciwgZm9nRmFjdG9yICk7XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBmb2dfcGFyc19mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9GT0dcXG5cXHR1bmlmb3JtIHZlYzMgZm9nQ29sb3I7XFxuXFx0dmFyeWluZyBmbG9hdCBmb2dEZXB0aDtcXG5cXHQjaWZkZWYgRk9HX0VYUDJcXG5cXHRcXHR1bmlmb3JtIGZsb2F0IGZvZ0RlbnNpdHk7XFxuXFx0I2Vsc2VcXG5cXHRcXHR1bmlmb3JtIGZsb2F0IGZvZ05lYXI7XFxuXFx0XFx0dW5pZm9ybSBmbG9hdCBmb2dGYXI7XFxuXFx0I2VuZGlmXFxuI2VuZGlmXFxuXCI7XG5cbnZhciBncmFkaWVudG1hcF9wYXJzX2ZyYWdtZW50ID0gXCIjaWZkZWYgVE9PTlxcblxcdHVuaWZvcm0gc2FtcGxlcjJEIGdyYWRpZW50TWFwO1xcblxcdHZlYzMgZ2V0R3JhZGllbnRJcnJhZGlhbmNlKCB2ZWMzIG5vcm1hbCwgdmVjMyBsaWdodERpcmVjdGlvbiApIHtcXG5cXHRcXHRmbG9hdCBkb3ROTCA9IGRvdCggbm9ybWFsLCBsaWdodERpcmVjdGlvbiApO1xcblxcdFxcdHZlYzIgY29vcmQgPSB2ZWMyKCBkb3ROTCAqIDAuNSArIDAuNSwgMC4wICk7XFxuXFx0XFx0I2lmZGVmIFVTRV9HUkFESUVOVE1BUFxcblxcdFxcdFxcdHJldHVybiB0ZXh0dXJlMkQoIGdyYWRpZW50TWFwLCBjb29yZCApLnJnYjtcXG5cXHRcXHQjZWxzZVxcblxcdFxcdFxcdHJldHVybiAoIGNvb3JkLnggPCAwLjcgKSA/IHZlYzMoIDAuNyApIDogdmVjMyggMS4wICk7XFxuXFx0XFx0I2VuZGlmXFxuXFx0fVxcbiNlbmRpZlxcblwiO1xuXG52YXIgbGlnaHRtYXBfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfTElHSFRNQVBcXG5cXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKz0gUEkgKiB0ZXh0dXJlMkQoIGxpZ2h0TWFwLCB2VXYyICkueHl6ICogbGlnaHRNYXBJbnRlbnNpdHk7XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBsaWdodG1hcF9wYXJzX2ZyYWdtZW50ID0gXCIjaWZkZWYgVVNFX0xJR0hUTUFQXFxuXFx0dW5pZm9ybSBzYW1wbGVyMkQgbGlnaHRNYXA7XFxuXFx0dW5pZm9ybSBmbG9hdCBsaWdodE1hcEludGVuc2l0eTtcXG4jZW5kaWZcIjtcblxudmFyIGxpZ2h0c19sYW1iZXJ0X3ZlcnRleCA9IFwidmVjMyBkaWZmdXNlID0gdmVjMyggMS4wICk7XFxuR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeTtcXG5nZW9tZXRyeS5wb3NpdGlvbiA9IG12UG9zaXRpb24ueHl6O1xcbmdlb21ldHJ5Lm5vcm1hbCA9IG5vcm1hbGl6ZSggdHJhbnNmb3JtZWROb3JtYWwgKTtcXG5nZW9tZXRyeS52aWV3RGlyID0gbm9ybWFsaXplKCAtbXZQb3NpdGlvbi54eXogKTtcXG5HZW9tZXRyaWNDb250ZXh0IGJhY2tHZW9tZXRyeTtcXG5iYWNrR2VvbWV0cnkucG9zaXRpb24gPSBnZW9tZXRyeS5wb3NpdGlvbjtcXG5iYWNrR2VvbWV0cnkubm9ybWFsID0gLWdlb21ldHJ5Lm5vcm1hbDtcXG5iYWNrR2VvbWV0cnkudmlld0RpciA9IGdlb21ldHJ5LnZpZXdEaXI7XFxudkxpZ2h0RnJvbnQgPSB2ZWMzKCAwLjAgKTtcXG4jaWZkZWYgRE9VQkxFX1NJREVEXFxuXFx0dkxpZ2h0QmFjayA9IHZlYzMoIDAuMCApO1xcbiNlbmRpZlxcbkluY2lkZW50TGlnaHQgZGlyZWN0TGlnaHQ7XFxuZmxvYXQgZG90Tkw7XFxudmVjMyBkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2U7XFxuI2lmIE5VTV9QT0lOVF9MSUdIVFMgPiAwXFxuXFx0I3ByYWdtYSB1bnJvbGxfbG9vcFxcblxcdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9QT0lOVF9MSUdIVFM7IGkgKysgKSB7XFxuXFx0XFx0Z2V0UG9pbnREaXJlY3RMaWdodElycmFkaWFuY2UoIHBvaW50TGlnaHRzWyBpIF0sIGdlb21ldHJ5LCBkaXJlY3RMaWdodCApO1xcblxcdFxcdGRvdE5MID0gZG90KCBnZW9tZXRyeS5ub3JtYWwsIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiApO1xcblxcdFxcdGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZSA9IFBJICogZGlyZWN0TGlnaHQuY29sb3I7XFxuXFx0XFx0dkxpZ2h0RnJvbnQgKz0gc2F0dXJhdGUoIGRvdE5MICkgKiBkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2U7XFxuXFx0XFx0I2lmZGVmIERPVUJMRV9TSURFRFxcblxcdFxcdFxcdHZMaWdodEJhY2sgKz0gc2F0dXJhdGUoIC1kb3ROTCApICogZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlO1xcblxcdFxcdCNlbmRpZlxcblxcdH1cXG4jZW5kaWZcXG4jaWYgTlVNX1NQT1RfTElHSFRTID4gMFxcblxcdCNwcmFnbWEgdW5yb2xsX2xvb3BcXG5cXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fU1BPVF9MSUdIVFM7IGkgKysgKSB7XFxuXFx0XFx0Z2V0U3BvdERpcmVjdExpZ2h0SXJyYWRpYW5jZSggc3BvdExpZ2h0c1sgaSBdLCBnZW9tZXRyeSwgZGlyZWN0TGlnaHQgKTtcXG5cXHRcXHRkb3ROTCA9IGRvdCggZ2VvbWV0cnkubm9ybWFsLCBkaXJlY3RMaWdodC5kaXJlY3Rpb24gKTtcXG5cXHRcXHRkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2UgPSBQSSAqIGRpcmVjdExpZ2h0LmNvbG9yO1xcblxcdFxcdHZMaWdodEZyb250ICs9IHNhdHVyYXRlKCBkb3ROTCApICogZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlO1xcblxcdFxcdCNpZmRlZiBET1VCTEVfU0lERURcXG5cXHRcXHRcXHR2TGlnaHRCYWNrICs9IHNhdHVyYXRlKCAtZG90TkwgKSAqIGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZTtcXG5cXHRcXHQjZW5kaWZcXG5cXHR9XFxuI2VuZGlmXFxuI2lmIE5VTV9ESVJfTElHSFRTID4gMFxcblxcdCNwcmFnbWEgdW5yb2xsX2xvb3BcXG5cXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fRElSX0xJR0hUUzsgaSArKyApIHtcXG5cXHRcXHRnZXREaXJlY3Rpb25hbERpcmVjdExpZ2h0SXJyYWRpYW5jZSggZGlyZWN0aW9uYWxMaWdodHNbIGkgXSwgZ2VvbWV0cnksIGRpcmVjdExpZ2h0ICk7XFxuXFx0XFx0ZG90TkwgPSBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICk7XFxuXFx0XFx0ZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlID0gUEkgKiBkaXJlY3RMaWdodC5jb2xvcjtcXG5cXHRcXHR2TGlnaHRGcm9udCArPSBzYXR1cmF0ZSggZG90TkwgKSAqIGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZTtcXG5cXHRcXHQjaWZkZWYgRE9VQkxFX1NJREVEXFxuXFx0XFx0XFx0dkxpZ2h0QmFjayArPSBzYXR1cmF0ZSggLWRvdE5MICkgKiBkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2U7XFxuXFx0XFx0I2VuZGlmXFxuXFx0fVxcbiNlbmRpZlxcbiNpZiBOVU1fSEVNSV9MSUdIVFMgPiAwXFxuXFx0I3ByYWdtYSB1bnJvbGxfbG9vcFxcblxcdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9IRU1JX0xJR0hUUzsgaSArKyApIHtcXG5cXHRcXHR2TGlnaHRGcm9udCArPSBnZXRIZW1pc3BoZXJlTGlnaHRJcnJhZGlhbmNlKCBoZW1pc3BoZXJlTGlnaHRzWyBpIF0sIGdlb21ldHJ5ICk7XFxuXFx0XFx0I2lmZGVmIERPVUJMRV9TSURFRFxcblxcdFxcdFxcdHZMaWdodEJhY2sgKz0gZ2V0SGVtaXNwaGVyZUxpZ2h0SXJyYWRpYW5jZSggaGVtaXNwaGVyZUxpZ2h0c1sgaSBdLCBiYWNrR2VvbWV0cnkgKTtcXG5cXHRcXHQjZW5kaWZcXG5cXHR9XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBsaWdodHNfcGFyc19iZWdpbiA9IFwidW5pZm9ybSB2ZWMzIGFtYmllbnRMaWdodENvbG9yO1xcbnZlYzMgZ2V0QW1iaWVudExpZ2h0SXJyYWRpYW5jZSggY29uc3QgaW4gdmVjMyBhbWJpZW50TGlnaHRDb2xvciApIHtcXG5cXHR2ZWMzIGlycmFkaWFuY2UgPSBhbWJpZW50TGlnaHRDb2xvcjtcXG5cXHQjaWZuZGVmIFBIWVNJQ0FMTFlfQ09SUkVDVF9MSUdIVFNcXG5cXHRcXHRpcnJhZGlhbmNlICo9IFBJO1xcblxcdCNlbmRpZlxcblxcdHJldHVybiBpcnJhZGlhbmNlO1xcbn1cXG4jaWYgTlVNX0RJUl9MSUdIVFMgPiAwXFxuXFx0c3RydWN0IERpcmVjdGlvbmFsTGlnaHQge1xcblxcdFxcdHZlYzMgZGlyZWN0aW9uO1xcblxcdFxcdHZlYzMgY29sb3I7XFxuXFx0XFx0aW50IHNoYWRvdztcXG5cXHRcXHRmbG9hdCBzaGFkb3dCaWFzO1xcblxcdFxcdGZsb2F0IHNoYWRvd1JhZGl1cztcXG5cXHRcXHR2ZWMyIHNoYWRvd01hcFNpemU7XFxuXFx0fTtcXG5cXHR1bmlmb3JtIERpcmVjdGlvbmFsTGlnaHQgZGlyZWN0aW9uYWxMaWdodHNbIE5VTV9ESVJfTElHSFRTIF07XFxuXFx0dm9pZCBnZXREaXJlY3Rpb25hbERpcmVjdExpZ2h0SXJyYWRpYW5jZSggY29uc3QgaW4gRGlyZWN0aW9uYWxMaWdodCBkaXJlY3Rpb25hbExpZ2h0LCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBvdXQgSW5jaWRlbnRMaWdodCBkaXJlY3RMaWdodCApIHtcXG5cXHRcXHRkaXJlY3RMaWdodC5jb2xvciA9IGRpcmVjdGlvbmFsTGlnaHQuY29sb3I7XFxuXFx0XFx0ZGlyZWN0TGlnaHQuZGlyZWN0aW9uID0gZGlyZWN0aW9uYWxMaWdodC5kaXJlY3Rpb247XFxuXFx0XFx0ZGlyZWN0TGlnaHQudmlzaWJsZSA9IHRydWU7XFxuXFx0fVxcbiNlbmRpZlxcbiNpZiBOVU1fUE9JTlRfTElHSFRTID4gMFxcblxcdHN0cnVjdCBQb2ludExpZ2h0IHtcXG5cXHRcXHR2ZWMzIHBvc2l0aW9uO1xcblxcdFxcdHZlYzMgY29sb3I7XFxuXFx0XFx0ZmxvYXQgZGlzdGFuY2U7XFxuXFx0XFx0ZmxvYXQgZGVjYXk7XFxuXFx0XFx0aW50IHNoYWRvdztcXG5cXHRcXHRmbG9hdCBzaGFkb3dCaWFzO1xcblxcdFxcdGZsb2F0IHNoYWRvd1JhZGl1cztcXG5cXHRcXHR2ZWMyIHNoYWRvd01hcFNpemU7XFxuXFx0XFx0ZmxvYXQgc2hhZG93Q2FtZXJhTmVhcjtcXG5cXHRcXHRmbG9hdCBzaGFkb3dDYW1lcmFGYXI7XFxuXFx0fTtcXG5cXHR1bmlmb3JtIFBvaW50TGlnaHQgcG9pbnRMaWdodHNbIE5VTV9QT0lOVF9MSUdIVFMgXTtcXG5cXHR2b2lkIGdldFBvaW50RGlyZWN0TGlnaHRJcnJhZGlhbmNlKCBjb25zdCBpbiBQb2ludExpZ2h0IHBvaW50TGlnaHQsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIG91dCBJbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0ICkge1xcblxcdFxcdHZlYzMgbFZlY3RvciA9IHBvaW50TGlnaHQucG9zaXRpb24gLSBnZW9tZXRyeS5wb3NpdGlvbjtcXG5cXHRcXHRkaXJlY3RMaWdodC5kaXJlY3Rpb24gPSBub3JtYWxpemUoIGxWZWN0b3IgKTtcXG5cXHRcXHRmbG9hdCBsaWdodERpc3RhbmNlID0gbGVuZ3RoKCBsVmVjdG9yICk7XFxuXFx0XFx0ZGlyZWN0TGlnaHQuY29sb3IgPSBwb2ludExpZ2h0LmNvbG9yO1xcblxcdFxcdGRpcmVjdExpZ2h0LmNvbG9yICo9IHB1bmN0dWFsTGlnaHRJbnRlbnNpdHlUb0lycmFkaWFuY2VGYWN0b3IoIGxpZ2h0RGlzdGFuY2UsIHBvaW50TGlnaHQuZGlzdGFuY2UsIHBvaW50TGlnaHQuZGVjYXkgKTtcXG5cXHRcXHRkaXJlY3RMaWdodC52aXNpYmxlID0gKCBkaXJlY3RMaWdodC5jb2xvciAhPSB2ZWMzKCAwLjAgKSApO1xcblxcdH1cXG4jZW5kaWZcXG4jaWYgTlVNX1NQT1RfTElHSFRTID4gMFxcblxcdHN0cnVjdCBTcG90TGlnaHQge1xcblxcdFxcdHZlYzMgcG9zaXRpb247XFxuXFx0XFx0dmVjMyBkaXJlY3Rpb247XFxuXFx0XFx0dmVjMyBjb2xvcjtcXG5cXHRcXHRmbG9hdCBkaXN0YW5jZTtcXG5cXHRcXHRmbG9hdCBkZWNheTtcXG5cXHRcXHRmbG9hdCBjb25lQ29zO1xcblxcdFxcdGZsb2F0IHBlbnVtYnJhQ29zO1xcblxcdFxcdGludCBzaGFkb3c7XFxuXFx0XFx0ZmxvYXQgc2hhZG93QmlhcztcXG5cXHRcXHRmbG9hdCBzaGFkb3dSYWRpdXM7XFxuXFx0XFx0dmVjMiBzaGFkb3dNYXBTaXplO1xcblxcdH07XFxuXFx0dW5pZm9ybSBTcG90TGlnaHQgc3BvdExpZ2h0c1sgTlVNX1NQT1RfTElHSFRTIF07XFxuXFx0dm9pZCBnZXRTcG90RGlyZWN0TGlnaHRJcnJhZGlhbmNlKCBjb25zdCBpbiBTcG90TGlnaHQgc3BvdExpZ2h0LCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBvdXQgSW5jaWRlbnRMaWdodCBkaXJlY3RMaWdodCAgKSB7XFxuXFx0XFx0dmVjMyBsVmVjdG9yID0gc3BvdExpZ2h0LnBvc2l0aW9uIC0gZ2VvbWV0cnkucG9zaXRpb247XFxuXFx0XFx0ZGlyZWN0TGlnaHQuZGlyZWN0aW9uID0gbm9ybWFsaXplKCBsVmVjdG9yICk7XFxuXFx0XFx0ZmxvYXQgbGlnaHREaXN0YW5jZSA9IGxlbmd0aCggbFZlY3RvciApO1xcblxcdFxcdGZsb2F0IGFuZ2xlQ29zID0gZG90KCBkaXJlY3RMaWdodC5kaXJlY3Rpb24sIHNwb3RMaWdodC5kaXJlY3Rpb24gKTtcXG5cXHRcXHRpZiAoIGFuZ2xlQ29zID4gc3BvdExpZ2h0LmNvbmVDb3MgKSB7XFxuXFx0XFx0XFx0ZmxvYXQgc3BvdEVmZmVjdCA9IHNtb290aHN0ZXAoIHNwb3RMaWdodC5jb25lQ29zLCBzcG90TGlnaHQucGVudW1icmFDb3MsIGFuZ2xlQ29zICk7XFxuXFx0XFx0XFx0ZGlyZWN0TGlnaHQuY29sb3IgPSBzcG90TGlnaHQuY29sb3I7XFxuXFx0XFx0XFx0ZGlyZWN0TGlnaHQuY29sb3IgKj0gc3BvdEVmZmVjdCAqIHB1bmN0dWFsTGlnaHRJbnRlbnNpdHlUb0lycmFkaWFuY2VGYWN0b3IoIGxpZ2h0RGlzdGFuY2UsIHNwb3RMaWdodC5kaXN0YW5jZSwgc3BvdExpZ2h0LmRlY2F5ICk7XFxuXFx0XFx0XFx0ZGlyZWN0TGlnaHQudmlzaWJsZSA9IHRydWU7XFxuXFx0XFx0fSBlbHNlIHtcXG5cXHRcXHRcXHRkaXJlY3RMaWdodC5jb2xvciA9IHZlYzMoIDAuMCApO1xcblxcdFxcdFxcdGRpcmVjdExpZ2h0LnZpc2libGUgPSBmYWxzZTtcXG5cXHRcXHR9XFxuXFx0fVxcbiNlbmRpZlxcbiNpZiBOVU1fUkVDVF9BUkVBX0xJR0hUUyA+IDBcXG5cXHRzdHJ1Y3QgUmVjdEFyZWFMaWdodCB7XFxuXFx0XFx0dmVjMyBjb2xvcjtcXG5cXHRcXHR2ZWMzIHBvc2l0aW9uO1xcblxcdFxcdHZlYzMgaGFsZldpZHRoO1xcblxcdFxcdHZlYzMgaGFsZkhlaWdodDtcXG5cXHR9O1xcblxcdHVuaWZvcm0gc2FtcGxlcjJEIGx0Y18xO1xcdHVuaWZvcm0gc2FtcGxlcjJEIGx0Y18yO1xcblxcdHVuaWZvcm0gUmVjdEFyZWFMaWdodCByZWN0QXJlYUxpZ2h0c1sgTlVNX1JFQ1RfQVJFQV9MSUdIVFMgXTtcXG4jZW5kaWZcXG4jaWYgTlVNX0hFTUlfTElHSFRTID4gMFxcblxcdHN0cnVjdCBIZW1pc3BoZXJlTGlnaHQge1xcblxcdFxcdHZlYzMgZGlyZWN0aW9uO1xcblxcdFxcdHZlYzMgc2t5Q29sb3I7XFxuXFx0XFx0dmVjMyBncm91bmRDb2xvcjtcXG5cXHR9O1xcblxcdHVuaWZvcm0gSGVtaXNwaGVyZUxpZ2h0IGhlbWlzcGhlcmVMaWdodHNbIE5VTV9IRU1JX0xJR0hUUyBdO1xcblxcdHZlYzMgZ2V0SGVtaXNwaGVyZUxpZ2h0SXJyYWRpYW5jZSggY29uc3QgaW4gSGVtaXNwaGVyZUxpZ2h0IGhlbWlMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSApIHtcXG5cXHRcXHRmbG9hdCBkb3ROTCA9IGRvdCggZ2VvbWV0cnkubm9ybWFsLCBoZW1pTGlnaHQuZGlyZWN0aW9uICk7XFxuXFx0XFx0ZmxvYXQgaGVtaURpZmZ1c2VXZWlnaHQgPSAwLjUgKiBkb3ROTCArIDAuNTtcXG5cXHRcXHR2ZWMzIGlycmFkaWFuY2UgPSBtaXgoIGhlbWlMaWdodC5ncm91bmRDb2xvciwgaGVtaUxpZ2h0LnNreUNvbG9yLCBoZW1pRGlmZnVzZVdlaWdodCApO1xcblxcdFxcdCNpZm5kZWYgUEhZU0lDQUxMWV9DT1JSRUNUX0xJR0hUU1xcblxcdFxcdFxcdGlycmFkaWFuY2UgKj0gUEk7XFxuXFx0XFx0I2VuZGlmXFxuXFx0XFx0cmV0dXJuIGlycmFkaWFuY2U7XFxuXFx0fVxcbiNlbmRpZlxcblwiO1xuXG52YXIgbGlnaHRzX3BhcnNfbWFwcyA9IFwiI2lmIGRlZmluZWQoIFVTRV9FTlZNQVAgKSAmJiBkZWZpbmVkKCBQSFlTSUNBTCApXFxuXFx0dmVjMyBnZXRMaWdodFByb2JlSW5kaXJlY3RJcnJhZGlhbmNlKCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiBpbnQgbWF4TUlQTGV2ZWwgKSB7XFxuXFx0XFx0dmVjMyB3b3JsZE5vcm1hbCA9IGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIGdlb21ldHJ5Lm5vcm1hbCwgdmlld01hdHJpeCApO1xcblxcdFxcdCNpZmRlZiBFTlZNQVBfVFlQRV9DVUJFXFxuXFx0XFx0XFx0dmVjMyBxdWVyeVZlYyA9IHZlYzMoIGZsaXBFbnZNYXAgKiB3b3JsZE5vcm1hbC54LCB3b3JsZE5vcm1hbC55eiApO1xcblxcdFxcdFxcdCNpZmRlZiBURVhUVVJFX0xPRF9FWFRcXG5cXHRcXHRcXHRcXHR2ZWM0IGVudk1hcENvbG9yID0gdGV4dHVyZUN1YmVMb2RFWFQoIGVudk1hcCwgcXVlcnlWZWMsIGZsb2F0KCBtYXhNSVBMZXZlbCApICk7XFxuXFx0XFx0XFx0I2Vsc2VcXG5cXHRcXHRcXHRcXHR2ZWM0IGVudk1hcENvbG9yID0gdGV4dHVyZUN1YmUoIGVudk1hcCwgcXVlcnlWZWMsIGZsb2F0KCBtYXhNSVBMZXZlbCApICk7XFxuXFx0XFx0XFx0I2VuZGlmXFxuXFx0XFx0XFx0ZW52TWFwQ29sb3IucmdiID0gZW52TWFwVGV4ZWxUb0xpbmVhciggZW52TWFwQ29sb3IgKS5yZ2I7XFxuXFx0XFx0I2VsaWYgZGVmaW5lZCggRU5WTUFQX1RZUEVfQ1VCRV9VViApXFxuXFx0XFx0XFx0dmVjMyBxdWVyeVZlYyA9IHZlYzMoIGZsaXBFbnZNYXAgKiB3b3JsZE5vcm1hbC54LCB3b3JsZE5vcm1hbC55eiApO1xcblxcdFxcdFxcdHZlYzQgZW52TWFwQ29sb3IgPSB0ZXh0dXJlQ3ViZVVWKCBxdWVyeVZlYywgMS4wICk7XFxuXFx0XFx0I2Vsc2VcXG5cXHRcXHRcXHR2ZWM0IGVudk1hcENvbG9yID0gdmVjNCggMC4wICk7XFxuXFx0XFx0I2VuZGlmXFxuXFx0XFx0cmV0dXJuIFBJICogZW52TWFwQ29sb3IucmdiICogZW52TWFwSW50ZW5zaXR5O1xcblxcdH1cXG5cXHRmbG9hdCBnZXRTcGVjdWxhck1JUExldmVsKCBjb25zdCBpbiBmbG9hdCBibGlublNoaW5pbmVzc0V4cG9uZW50LCBjb25zdCBpbiBpbnQgbWF4TUlQTGV2ZWwgKSB7XFxuXFx0XFx0ZmxvYXQgbWF4TUlQTGV2ZWxTY2FsYXIgPSBmbG9hdCggbWF4TUlQTGV2ZWwgKTtcXG5cXHRcXHRmbG9hdCBkZXNpcmVkTUlQTGV2ZWwgPSBtYXhNSVBMZXZlbFNjYWxhciArIDAuNzkyNDggLSAwLjUgKiBsb2cyKCBwb3cyKCBibGlublNoaW5pbmVzc0V4cG9uZW50ICkgKyAxLjAgKTtcXG5cXHRcXHRyZXR1cm4gY2xhbXAoIGRlc2lyZWRNSVBMZXZlbCwgMC4wLCBtYXhNSVBMZXZlbFNjYWxhciApO1xcblxcdH1cXG5cXHR2ZWMzIGdldExpZ2h0UHJvYmVJbmRpcmVjdFJhZGlhbmNlKCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiBmbG9hdCBibGlublNoaW5pbmVzc0V4cG9uZW50LCBjb25zdCBpbiBpbnQgbWF4TUlQTGV2ZWwgKSB7XFxuXFx0XFx0I2lmZGVmIEVOVk1BUF9NT0RFX1JFRkxFQ1RJT05cXG5cXHRcXHRcXHR2ZWMzIHJlZmxlY3RWZWMgPSByZWZsZWN0KCAtZ2VvbWV0cnkudmlld0RpciwgZ2VvbWV0cnkubm9ybWFsICk7XFxuXFx0XFx0I2Vsc2VcXG5cXHRcXHRcXHR2ZWMzIHJlZmxlY3RWZWMgPSByZWZyYWN0KCAtZ2VvbWV0cnkudmlld0RpciwgZ2VvbWV0cnkubm9ybWFsLCByZWZyYWN0aW9uUmF0aW8gKTtcXG5cXHRcXHQjZW5kaWZcXG5cXHRcXHRyZWZsZWN0VmVjID0gaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggcmVmbGVjdFZlYywgdmlld01hdHJpeCApO1xcblxcdFxcdGZsb2F0IHNwZWN1bGFyTUlQTGV2ZWwgPSBnZXRTcGVjdWxhck1JUExldmVsKCBibGlublNoaW5pbmVzc0V4cG9uZW50LCBtYXhNSVBMZXZlbCApO1xcblxcdFxcdCNpZmRlZiBFTlZNQVBfVFlQRV9DVUJFXFxuXFx0XFx0XFx0dmVjMyBxdWVyeVJlZmxlY3RWZWMgPSB2ZWMzKCBmbGlwRW52TWFwICogcmVmbGVjdFZlYy54LCByZWZsZWN0VmVjLnl6ICk7XFxuXFx0XFx0XFx0I2lmZGVmIFRFWFRVUkVfTE9EX0VYVFxcblxcdFxcdFxcdFxcdHZlYzQgZW52TWFwQ29sb3IgPSB0ZXh0dXJlQ3ViZUxvZEVYVCggZW52TWFwLCBxdWVyeVJlZmxlY3RWZWMsIHNwZWN1bGFyTUlQTGV2ZWwgKTtcXG5cXHRcXHRcXHQjZWxzZVxcblxcdFxcdFxcdFxcdHZlYzQgZW52TWFwQ29sb3IgPSB0ZXh0dXJlQ3ViZSggZW52TWFwLCBxdWVyeVJlZmxlY3RWZWMsIHNwZWN1bGFyTUlQTGV2ZWwgKTtcXG5cXHRcXHRcXHQjZW5kaWZcXG5cXHRcXHRcXHRlbnZNYXBDb2xvci5yZ2IgPSBlbnZNYXBUZXhlbFRvTGluZWFyKCBlbnZNYXBDb2xvciApLnJnYjtcXG5cXHRcXHQjZWxpZiBkZWZpbmVkKCBFTlZNQVBfVFlQRV9DVUJFX1VWIClcXG5cXHRcXHRcXHR2ZWMzIHF1ZXJ5UmVmbGVjdFZlYyA9IHZlYzMoIGZsaXBFbnZNYXAgKiByZWZsZWN0VmVjLngsIHJlZmxlY3RWZWMueXogKTtcXG5cXHRcXHRcXHR2ZWM0IGVudk1hcENvbG9yID0gdGV4dHVyZUN1YmVVVihxdWVyeVJlZmxlY3RWZWMsIEJsaW5uRXhwb25lbnRUb0dHWFJvdWdobmVzcyhibGlublNoaW5pbmVzc0V4cG9uZW50KSk7XFxuXFx0XFx0I2VsaWYgZGVmaW5lZCggRU5WTUFQX1RZUEVfRVFVSVJFQyApXFxuXFx0XFx0XFx0dmVjMiBzYW1wbGVVVjtcXG5cXHRcXHRcXHRzYW1wbGVVVi55ID0gYXNpbiggY2xhbXAoIHJlZmxlY3RWZWMueSwgLSAxLjAsIDEuMCApICkgKiBSRUNJUFJPQ0FMX1BJICsgMC41O1xcblxcdFxcdFxcdHNhbXBsZVVWLnggPSBhdGFuKCByZWZsZWN0VmVjLnosIHJlZmxlY3RWZWMueCApICogUkVDSVBST0NBTF9QSTIgKyAwLjU7XFxuXFx0XFx0XFx0I2lmZGVmIFRFWFRVUkVfTE9EX0VYVFxcblxcdFxcdFxcdFxcdHZlYzQgZW52TWFwQ29sb3IgPSB0ZXh0dXJlMkRMb2RFWFQoIGVudk1hcCwgc2FtcGxlVVYsIHNwZWN1bGFyTUlQTGV2ZWwgKTtcXG5cXHRcXHRcXHQjZWxzZVxcblxcdFxcdFxcdFxcdHZlYzQgZW52TWFwQ29sb3IgPSB0ZXh0dXJlMkQoIGVudk1hcCwgc2FtcGxlVVYsIHNwZWN1bGFyTUlQTGV2ZWwgKTtcXG5cXHRcXHRcXHQjZW5kaWZcXG5cXHRcXHRcXHRlbnZNYXBDb2xvci5yZ2IgPSBlbnZNYXBUZXhlbFRvTGluZWFyKCBlbnZNYXBDb2xvciApLnJnYjtcXG5cXHRcXHQjZWxpZiBkZWZpbmVkKCBFTlZNQVBfVFlQRV9TUEhFUkUgKVxcblxcdFxcdFxcdHZlYzMgcmVmbGVjdFZpZXcgPSBub3JtYWxpemUoICggdmlld01hdHJpeCAqIHZlYzQoIHJlZmxlY3RWZWMsIDAuMCApICkueHl6ICsgdmVjMyggMC4wLDAuMCwxLjAgKSApO1xcblxcdFxcdFxcdCNpZmRlZiBURVhUVVJFX0xPRF9FWFRcXG5cXHRcXHRcXHRcXHR2ZWM0IGVudk1hcENvbG9yID0gdGV4dHVyZTJETG9kRVhUKCBlbnZNYXAsIHJlZmxlY3RWaWV3Lnh5ICogMC41ICsgMC41LCBzcGVjdWxhck1JUExldmVsICk7XFxuXFx0XFx0XFx0I2Vsc2VcXG5cXHRcXHRcXHRcXHR2ZWM0IGVudk1hcENvbG9yID0gdGV4dHVyZTJEKCBlbnZNYXAsIHJlZmxlY3RWaWV3Lnh5ICogMC41ICsgMC41LCBzcGVjdWxhck1JUExldmVsICk7XFxuXFx0XFx0XFx0I2VuZGlmXFxuXFx0XFx0XFx0ZW52TWFwQ29sb3IucmdiID0gZW52TWFwVGV4ZWxUb0xpbmVhciggZW52TWFwQ29sb3IgKS5yZ2I7XFxuXFx0XFx0I2VuZGlmXFxuXFx0XFx0cmV0dXJuIGVudk1hcENvbG9yLnJnYiAqIGVudk1hcEludGVuc2l0eTtcXG5cXHR9XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBsaWdodHNfcGhvbmdfZnJhZ21lbnQgPSBcIkJsaW5uUGhvbmdNYXRlcmlhbCBtYXRlcmlhbDtcXG5tYXRlcmlhbC5kaWZmdXNlQ29sb3IgPSBkaWZmdXNlQ29sb3IucmdiO1xcbm1hdGVyaWFsLnNwZWN1bGFyQ29sb3IgPSBzcGVjdWxhcjtcXG5tYXRlcmlhbC5zcGVjdWxhclNoaW5pbmVzcyA9IHNoaW5pbmVzcztcXG5tYXRlcmlhbC5zcGVjdWxhclN0cmVuZ3RoID0gc3BlY3VsYXJTdHJlbmd0aDtcXG5cIjtcblxudmFyIGxpZ2h0c19waG9uZ19wYXJzX2ZyYWdtZW50ID0gXCJ2YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcXG4jaWZuZGVmIEZMQVRfU0hBREVEXFxuXFx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XFxuI2VuZGlmXFxuc3RydWN0IEJsaW5uUGhvbmdNYXRlcmlhbCB7XFxuXFx0dmVjM1xcdGRpZmZ1c2VDb2xvcjtcXG5cXHR2ZWMzXFx0c3BlY3VsYXJDb2xvcjtcXG5cXHRmbG9hdFxcdHNwZWN1bGFyU2hpbmluZXNzO1xcblxcdGZsb2F0XFx0c3BlY3VsYXJTdHJlbmd0aDtcXG59O1xcbnZvaWQgUkVfRGlyZWN0X0JsaW5uUGhvbmcoIGNvbnN0IGluIEluY2lkZW50TGlnaHQgZGlyZWN0TGlnaHQsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIEJsaW5uUGhvbmdNYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7XFxuXFx0I2lmZGVmIFRPT05cXG5cXHRcXHR2ZWMzIGlycmFkaWFuY2UgPSBnZXRHcmFkaWVudElycmFkaWFuY2UoIGdlb21ldHJ5Lm5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICkgKiBkaXJlY3RMaWdodC5jb2xvcjtcXG5cXHQjZWxzZVxcblxcdFxcdGZsb2F0IGRvdE5MID0gc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBkaXJlY3RMaWdodC5kaXJlY3Rpb24gKSApO1xcblxcdFxcdHZlYzMgaXJyYWRpYW5jZSA9IGRvdE5MICogZGlyZWN0TGlnaHQuY29sb3I7XFxuXFx0I2VuZGlmXFxuXFx0I2lmbmRlZiBQSFlTSUNBTExZX0NPUlJFQ1RfTElHSFRTXFxuXFx0XFx0aXJyYWRpYW5jZSAqPSBQSTtcXG5cXHQjZW5kaWZcXG5cXHRyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICs9IGlycmFkaWFuY2UgKiBCUkRGX0RpZmZ1c2VfTGFtYmVydCggbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICk7XFxuXFx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgKz0gaXJyYWRpYW5jZSAqIEJSREZfU3BlY3VsYXJfQmxpbm5QaG9uZyggZGlyZWN0TGlnaHQsIGdlb21ldHJ5LCBtYXRlcmlhbC5zcGVjdWxhckNvbG9yLCBtYXRlcmlhbC5zcGVjdWxhclNoaW5pbmVzcyApICogbWF0ZXJpYWwuc3BlY3VsYXJTdHJlbmd0aDtcXG59XFxudm9pZCBSRV9JbmRpcmVjdERpZmZ1c2VfQmxpbm5QaG9uZyggY29uc3QgaW4gdmVjMyBpcnJhZGlhbmNlLCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiBCbGlublBob25nTWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ICkge1xcblxcdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArPSBpcnJhZGlhbmNlICogQlJERl9EaWZmdXNlX0xhbWJlcnQoIG1hdGVyaWFsLmRpZmZ1c2VDb2xvciApO1xcbn1cXG4jZGVmaW5lIFJFX0RpcmVjdFxcdFxcdFxcdFxcdFJFX0RpcmVjdF9CbGlublBob25nXFxuI2RlZmluZSBSRV9JbmRpcmVjdERpZmZ1c2VcXHRcXHRSRV9JbmRpcmVjdERpZmZ1c2VfQmxpbm5QaG9uZ1xcbiNkZWZpbmUgTWF0ZXJpYWxfTGlnaHRQcm9iZUxPRCggbWF0ZXJpYWwgKVxcdCgwKVxcblwiO1xuXG52YXIgbGlnaHRzX3BoeXNpY2FsX2ZyYWdtZW50ID0gXCJQaHlzaWNhbE1hdGVyaWFsIG1hdGVyaWFsO1xcbm1hdGVyaWFsLmRpZmZ1c2VDb2xvciA9IGRpZmZ1c2VDb2xvci5yZ2IgKiAoIDEuMCAtIG1ldGFsbmVzc0ZhY3RvciApO1xcbm1hdGVyaWFsLnNwZWN1bGFyUm91Z2huZXNzID0gY2xhbXAoIHJvdWdobmVzc0ZhY3RvciwgMC4wNCwgMS4wICk7XFxuI2lmZGVmIFNUQU5EQVJEXFxuXFx0bWF0ZXJpYWwuc3BlY3VsYXJDb2xvciA9IG1peCggdmVjMyggREVGQVVMVF9TUEVDVUxBUl9DT0VGRklDSUVOVCApLCBkaWZmdXNlQ29sb3IucmdiLCBtZXRhbG5lc3NGYWN0b3IgKTtcXG4jZWxzZVxcblxcdG1hdGVyaWFsLnNwZWN1bGFyQ29sb3IgPSBtaXgoIHZlYzMoIE1BWElNVU1fU1BFQ1VMQVJfQ09FRkZJQ0lFTlQgKiBwb3cyKCByZWZsZWN0aXZpdHkgKSApLCBkaWZmdXNlQ29sb3IucmdiLCBtZXRhbG5lc3NGYWN0b3IgKTtcXG5cXHRtYXRlcmlhbC5jbGVhckNvYXQgPSBzYXR1cmF0ZSggY2xlYXJDb2F0ICk7XFx0bWF0ZXJpYWwuY2xlYXJDb2F0Um91Z2huZXNzID0gY2xhbXAoIGNsZWFyQ29hdFJvdWdobmVzcywgMC4wNCwgMS4wICk7XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBsaWdodHNfcGh5c2ljYWxfcGFyc19mcmFnbWVudCA9IFwic3RydWN0IFBoeXNpY2FsTWF0ZXJpYWwge1xcblxcdHZlYzNcXHRkaWZmdXNlQ29sb3I7XFxuXFx0ZmxvYXRcXHRzcGVjdWxhclJvdWdobmVzcztcXG5cXHR2ZWMzXFx0c3BlY3VsYXJDb2xvcjtcXG5cXHQjaWZuZGVmIFNUQU5EQVJEXFxuXFx0XFx0ZmxvYXQgY2xlYXJDb2F0O1xcblxcdFxcdGZsb2F0IGNsZWFyQ29hdFJvdWdobmVzcztcXG5cXHQjZW5kaWZcXG59O1xcbiNkZWZpbmUgTUFYSU1VTV9TUEVDVUxBUl9DT0VGRklDSUVOVCAwLjE2XFxuI2RlZmluZSBERUZBVUxUX1NQRUNVTEFSX0NPRUZGSUNJRU5UIDAuMDRcXG5mbG9hdCBjbGVhckNvYXRESFJBcHByb3goIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcywgY29uc3QgaW4gZmxvYXQgZG90TkwgKSB7XFxuXFx0cmV0dXJuIERFRkFVTFRfU1BFQ1VMQVJfQ09FRkZJQ0lFTlQgKyAoIDEuMCAtIERFRkFVTFRfU1BFQ1VMQVJfQ09FRkZJQ0lFTlQgKSAqICggcG93KCAxLjAgLSBkb3ROTCwgNS4wICkgKiBwb3coIDEuMCAtIHJvdWdobmVzcywgMi4wICkgKTtcXG59XFxuI2lmIE5VTV9SRUNUX0FSRUFfTElHSFRTID4gMFxcblxcdHZvaWQgUkVfRGlyZWN0X1JlY3RBcmVhX1BoeXNpY2FsKCBjb25zdCBpbiBSZWN0QXJlYUxpZ2h0IHJlY3RBcmVhTGlnaHQsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIFBoeXNpY2FsTWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ICkge1xcblxcdFxcdHZlYzMgbm9ybWFsID0gZ2VvbWV0cnkubm9ybWFsO1xcblxcdFxcdHZlYzMgdmlld0RpciA9IGdlb21ldHJ5LnZpZXdEaXI7XFxuXFx0XFx0dmVjMyBwb3NpdGlvbiA9IGdlb21ldHJ5LnBvc2l0aW9uO1xcblxcdFxcdHZlYzMgbGlnaHRQb3MgPSByZWN0QXJlYUxpZ2h0LnBvc2l0aW9uO1xcblxcdFxcdHZlYzMgaGFsZldpZHRoID0gcmVjdEFyZWFMaWdodC5oYWxmV2lkdGg7XFxuXFx0XFx0dmVjMyBoYWxmSGVpZ2h0ID0gcmVjdEFyZWFMaWdodC5oYWxmSGVpZ2h0O1xcblxcdFxcdHZlYzMgbGlnaHRDb2xvciA9IHJlY3RBcmVhTGlnaHQuY29sb3I7XFxuXFx0XFx0ZmxvYXQgcm91Z2huZXNzID0gbWF0ZXJpYWwuc3BlY3VsYXJSb3VnaG5lc3M7XFxuXFx0XFx0dmVjMyByZWN0Q29vcmRzWyA0IF07XFxuXFx0XFx0cmVjdENvb3Jkc1sgMCBdID0gbGlnaHRQb3MgLSBoYWxmV2lkdGggLSBoYWxmSGVpZ2h0O1xcdFxcdHJlY3RDb29yZHNbIDEgXSA9IGxpZ2h0UG9zICsgaGFsZldpZHRoIC0gaGFsZkhlaWdodDtcXG5cXHRcXHRyZWN0Q29vcmRzWyAyIF0gPSBsaWdodFBvcyArIGhhbGZXaWR0aCArIGhhbGZIZWlnaHQ7XFxuXFx0XFx0cmVjdENvb3Jkc1sgMyBdID0gbGlnaHRQb3MgLSBoYWxmV2lkdGggKyBoYWxmSGVpZ2h0O1xcblxcdFxcdHZlYzIgdXYgPSBMVENfVXYoIG5vcm1hbCwgdmlld0Rpciwgcm91Z2huZXNzICk7XFxuXFx0XFx0dmVjNCB0MSA9IHRleHR1cmUyRCggbHRjXzEsIHV2ICk7XFxuXFx0XFx0dmVjNCB0MiA9IHRleHR1cmUyRCggbHRjXzIsIHV2ICk7XFxuXFx0XFx0bWF0MyBtSW52ID0gbWF0MyhcXG5cXHRcXHRcXHR2ZWMzKCB0MS54LCAwLCB0MS55ICksXFxuXFx0XFx0XFx0dmVjMyggICAgMCwgMSwgICAgMCApLFxcblxcdFxcdFxcdHZlYzMoIHQxLnosIDAsIHQxLncgKVxcblxcdFxcdCk7XFxuXFx0XFx0dmVjMyBmcmVzbmVsID0gKCBtYXRlcmlhbC5zcGVjdWxhckNvbG9yICogdDIueCArICggdmVjMyggMS4wICkgLSBtYXRlcmlhbC5zcGVjdWxhckNvbG9yICkgKiB0Mi55ICk7XFxuXFx0XFx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgKz0gbGlnaHRDb2xvciAqIGZyZXNuZWwgKiBMVENfRXZhbHVhdGUoIG5vcm1hbCwgdmlld0RpciwgcG9zaXRpb24sIG1JbnYsIHJlY3RDb29yZHMgKTtcXG5cXHRcXHRyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICs9IGxpZ2h0Q29sb3IgKiBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKiBMVENfRXZhbHVhdGUoIG5vcm1hbCwgdmlld0RpciwgcG9zaXRpb24sIG1hdDMoIDEuMCApLCByZWN0Q29vcmRzICk7XFxuXFx0fVxcbiNlbmRpZlxcbnZvaWQgUkVfRGlyZWN0X1BoeXNpY2FsKCBjb25zdCBpbiBJbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0LCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiBQaHlzaWNhbE1hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHtcXG5cXHRmbG9hdCBkb3ROTCA9IHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICkgKTtcXG5cXHR2ZWMzIGlycmFkaWFuY2UgPSBkb3ROTCAqIGRpcmVjdExpZ2h0LmNvbG9yO1xcblxcdCNpZm5kZWYgUEhZU0lDQUxMWV9DT1JSRUNUX0xJR0hUU1xcblxcdFxcdGlycmFkaWFuY2UgKj0gUEk7XFxuXFx0I2VuZGlmXFxuXFx0I2lmbmRlZiBTVEFOREFSRFxcblxcdFxcdGZsb2F0IGNsZWFyQ29hdERIUiA9IG1hdGVyaWFsLmNsZWFyQ29hdCAqIGNsZWFyQ29hdERIUkFwcHJveCggbWF0ZXJpYWwuY2xlYXJDb2F0Um91Z2huZXNzLCBkb3ROTCApO1xcblxcdCNlbHNlXFxuXFx0XFx0ZmxvYXQgY2xlYXJDb2F0REhSID0gMC4wO1xcblxcdCNlbmRpZlxcblxcdHJlZmxlY3RlZExpZ2h0LmRpcmVjdFNwZWN1bGFyICs9ICggMS4wIC0gY2xlYXJDb2F0REhSICkgKiBpcnJhZGlhbmNlICogQlJERl9TcGVjdWxhcl9HR1goIGRpcmVjdExpZ2h0LCBnZW9tZXRyeSwgbWF0ZXJpYWwuc3BlY3VsYXJDb2xvciwgbWF0ZXJpYWwuc3BlY3VsYXJSb3VnaG5lc3MgKTtcXG5cXHRyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICs9ICggMS4wIC0gY2xlYXJDb2F0REhSICkgKiBpcnJhZGlhbmNlICogQlJERl9EaWZmdXNlX0xhbWJlcnQoIG1hdGVyaWFsLmRpZmZ1c2VDb2xvciApO1xcblxcdCNpZm5kZWYgU1RBTkRBUkRcXG5cXHRcXHRyZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArPSBpcnJhZGlhbmNlICogbWF0ZXJpYWwuY2xlYXJDb2F0ICogQlJERl9TcGVjdWxhcl9HR1goIGRpcmVjdExpZ2h0LCBnZW9tZXRyeSwgdmVjMyggREVGQVVMVF9TUEVDVUxBUl9DT0VGRklDSUVOVCApLCBtYXRlcmlhbC5jbGVhckNvYXRSb3VnaG5lc3MgKTtcXG5cXHQjZW5kaWZcXG59XFxudm9pZCBSRV9JbmRpcmVjdERpZmZ1c2VfUGh5c2ljYWwoIGNvbnN0IGluIHZlYzMgaXJyYWRpYW5jZSwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gUGh5c2ljYWxNYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7XFxuXFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICs9IGlycmFkaWFuY2UgKiBCUkRGX0RpZmZ1c2VfTGFtYmVydCggbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICk7XFxufVxcbnZvaWQgUkVfSW5kaXJlY3RTcGVjdWxhcl9QaHlzaWNhbCggY29uc3QgaW4gdmVjMyByYWRpYW5jZSwgY29uc3QgaW4gdmVjMyBjbGVhckNvYXRSYWRpYW5jZSwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gUGh5c2ljYWxNYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7XFxuXFx0I2lmbmRlZiBTVEFOREFSRFxcblxcdFxcdGZsb2F0IGRvdE5WID0gc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBnZW9tZXRyeS52aWV3RGlyICkgKTtcXG5cXHRcXHRmbG9hdCBkb3ROTCA9IGRvdE5WO1xcblxcdFxcdGZsb2F0IGNsZWFyQ29hdERIUiA9IG1hdGVyaWFsLmNsZWFyQ29hdCAqIGNsZWFyQ29hdERIUkFwcHJveCggbWF0ZXJpYWwuY2xlYXJDb2F0Um91Z2huZXNzLCBkb3ROTCApO1xcblxcdCNlbHNlXFxuXFx0XFx0ZmxvYXQgY2xlYXJDb2F0REhSID0gMC4wO1xcblxcdCNlbmRpZlxcblxcdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0U3BlY3VsYXIgKz0gKCAxLjAgLSBjbGVhckNvYXRESFIgKSAqIHJhZGlhbmNlICogQlJERl9TcGVjdWxhcl9HR1hfRW52aXJvbm1lbnQoIGdlb21ldHJ5LCBtYXRlcmlhbC5zcGVjdWxhckNvbG9yLCBtYXRlcmlhbC5zcGVjdWxhclJvdWdobmVzcyApO1xcblxcdCNpZm5kZWYgU1RBTkRBUkRcXG5cXHRcXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyICs9IGNsZWFyQ29hdFJhZGlhbmNlICogbWF0ZXJpYWwuY2xlYXJDb2F0ICogQlJERl9TcGVjdWxhcl9HR1hfRW52aXJvbm1lbnQoIGdlb21ldHJ5LCB2ZWMzKCBERUZBVUxUX1NQRUNVTEFSX0NPRUZGSUNJRU5UICksIG1hdGVyaWFsLmNsZWFyQ29hdFJvdWdobmVzcyApO1xcblxcdCNlbmRpZlxcbn1cXG4jZGVmaW5lIFJFX0RpcmVjdFxcdFxcdFxcdFxcdFJFX0RpcmVjdF9QaHlzaWNhbFxcbiNkZWZpbmUgUkVfRGlyZWN0X1JlY3RBcmVhXFx0XFx0UkVfRGlyZWN0X1JlY3RBcmVhX1BoeXNpY2FsXFxuI2RlZmluZSBSRV9JbmRpcmVjdERpZmZ1c2VcXHRcXHRSRV9JbmRpcmVjdERpZmZ1c2VfUGh5c2ljYWxcXG4jZGVmaW5lIFJFX0luZGlyZWN0U3BlY3VsYXJcXHRcXHRSRV9JbmRpcmVjdFNwZWN1bGFyX1BoeXNpY2FsXFxuI2RlZmluZSBNYXRlcmlhbF9CbGlublNoaW5pbmVzc0V4cG9uZW50KCBtYXRlcmlhbCApICAgR0dYUm91Z2huZXNzVG9CbGlubkV4cG9uZW50KCBtYXRlcmlhbC5zcGVjdWxhclJvdWdobmVzcyApXFxuI2RlZmluZSBNYXRlcmlhbF9DbGVhckNvYXRfQmxpbm5TaGluaW5lc3NFeHBvbmVudCggbWF0ZXJpYWwgKSAgIEdHWFJvdWdobmVzc1RvQmxpbm5FeHBvbmVudCggbWF0ZXJpYWwuY2xlYXJDb2F0Um91Z2huZXNzIClcXG5mbG9hdCBjb21wdXRlU3BlY3VsYXJPY2NsdXNpb24oIGNvbnN0IGluIGZsb2F0IGRvdE5WLCBjb25zdCBpbiBmbG9hdCBhbWJpZW50T2NjbHVzaW9uLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MgKSB7XFxuXFx0cmV0dXJuIHNhdHVyYXRlKCBwb3coIGRvdE5WICsgYW1iaWVudE9jY2x1c2lvbiwgZXhwMiggLSAxNi4wICogcm91Z2huZXNzIC0gMS4wICkgKSAtIDEuMCArIGFtYmllbnRPY2NsdXNpb24gKTtcXG59XFxuXCI7XG5cbnZhciBsaWdodHNfZnJhZ21lbnRfYmVnaW4gPSBcIlxcbkdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnk7XFxuZ2VvbWV0cnkucG9zaXRpb24gPSAtIHZWaWV3UG9zaXRpb247XFxuZ2VvbWV0cnkubm9ybWFsID0gbm9ybWFsO1xcbmdlb21ldHJ5LnZpZXdEaXIgPSBub3JtYWxpemUoIHZWaWV3UG9zaXRpb24gKTtcXG5JbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0O1xcbiNpZiAoIE5VTV9QT0lOVF9MSUdIVFMgPiAwICkgJiYgZGVmaW5lZCggUkVfRGlyZWN0IClcXG5cXHRQb2ludExpZ2h0IHBvaW50TGlnaHQ7XFxuXFx0I3ByYWdtYSB1bnJvbGxfbG9vcFxcblxcdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9QT0lOVF9MSUdIVFM7IGkgKysgKSB7XFxuXFx0XFx0cG9pbnRMaWdodCA9IHBvaW50TGlnaHRzWyBpIF07XFxuXFx0XFx0Z2V0UG9pbnREaXJlY3RMaWdodElycmFkaWFuY2UoIHBvaW50TGlnaHQsIGdlb21ldHJ5LCBkaXJlY3RMaWdodCApO1xcblxcdFxcdCNpZmRlZiBVU0VfU0hBRE9XTUFQXFxuXFx0XFx0ZGlyZWN0TGlnaHQuY29sb3IgKj0gYWxsKCBidmVjMiggcG9pbnRMaWdodC5zaGFkb3csIGRpcmVjdExpZ2h0LnZpc2libGUgKSApID8gZ2V0UG9pbnRTaGFkb3coIHBvaW50U2hhZG93TWFwWyBpIF0sIHBvaW50TGlnaHQuc2hhZG93TWFwU2l6ZSwgcG9pbnRMaWdodC5zaGFkb3dCaWFzLCBwb2ludExpZ2h0LnNoYWRvd1JhZGl1cywgdlBvaW50U2hhZG93Q29vcmRbIGkgXSwgcG9pbnRMaWdodC5zaGFkb3dDYW1lcmFOZWFyLCBwb2ludExpZ2h0LnNoYWRvd0NhbWVyYUZhciApIDogMS4wO1xcblxcdFxcdCNlbmRpZlxcblxcdFxcdFJFX0RpcmVjdCggZGlyZWN0TGlnaHQsIGdlb21ldHJ5LCBtYXRlcmlhbCwgcmVmbGVjdGVkTGlnaHQgKTtcXG5cXHR9XFxuI2VuZGlmXFxuI2lmICggTlVNX1NQT1RfTElHSFRTID4gMCApICYmIGRlZmluZWQoIFJFX0RpcmVjdCApXFxuXFx0U3BvdExpZ2h0IHNwb3RMaWdodDtcXG5cXHQjcHJhZ21hIHVucm9sbF9sb29wXFxuXFx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX1NQT1RfTElHSFRTOyBpICsrICkge1xcblxcdFxcdHNwb3RMaWdodCA9IHNwb3RMaWdodHNbIGkgXTtcXG5cXHRcXHRnZXRTcG90RGlyZWN0TGlnaHRJcnJhZGlhbmNlKCBzcG90TGlnaHQsIGdlb21ldHJ5LCBkaXJlY3RMaWdodCApO1xcblxcdFxcdCNpZmRlZiBVU0VfU0hBRE9XTUFQXFxuXFx0XFx0ZGlyZWN0TGlnaHQuY29sb3IgKj0gYWxsKCBidmVjMiggc3BvdExpZ2h0LnNoYWRvdywgZGlyZWN0TGlnaHQudmlzaWJsZSApICkgPyBnZXRTaGFkb3coIHNwb3RTaGFkb3dNYXBbIGkgXSwgc3BvdExpZ2h0LnNoYWRvd01hcFNpemUsIHNwb3RMaWdodC5zaGFkb3dCaWFzLCBzcG90TGlnaHQuc2hhZG93UmFkaXVzLCB2U3BvdFNoYWRvd0Nvb3JkWyBpIF0gKSA6IDEuMDtcXG5cXHRcXHQjZW5kaWZcXG5cXHRcXHRSRV9EaXJlY3QoIGRpcmVjdExpZ2h0LCBnZW9tZXRyeSwgbWF0ZXJpYWwsIHJlZmxlY3RlZExpZ2h0ICk7XFxuXFx0fVxcbiNlbmRpZlxcbiNpZiAoIE5VTV9ESVJfTElHSFRTID4gMCApICYmIGRlZmluZWQoIFJFX0RpcmVjdCApXFxuXFx0RGlyZWN0aW9uYWxMaWdodCBkaXJlY3Rpb25hbExpZ2h0O1xcblxcdCNwcmFnbWEgdW5yb2xsX2xvb3BcXG5cXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fRElSX0xJR0hUUzsgaSArKyApIHtcXG5cXHRcXHRkaXJlY3Rpb25hbExpZ2h0ID0gZGlyZWN0aW9uYWxMaWdodHNbIGkgXTtcXG5cXHRcXHRnZXREaXJlY3Rpb25hbERpcmVjdExpZ2h0SXJyYWRpYW5jZSggZGlyZWN0aW9uYWxMaWdodCwgZ2VvbWV0cnksIGRpcmVjdExpZ2h0ICk7XFxuXFx0XFx0I2lmZGVmIFVTRV9TSEFET1dNQVBcXG5cXHRcXHRkaXJlY3RMaWdodC5jb2xvciAqPSBhbGwoIGJ2ZWMyKCBkaXJlY3Rpb25hbExpZ2h0LnNoYWRvdywgZGlyZWN0TGlnaHQudmlzaWJsZSApICkgPyBnZXRTaGFkb3coIGRpcmVjdGlvbmFsU2hhZG93TWFwWyBpIF0sIGRpcmVjdGlvbmFsTGlnaHQuc2hhZG93TWFwU2l6ZSwgZGlyZWN0aW9uYWxMaWdodC5zaGFkb3dCaWFzLCBkaXJlY3Rpb25hbExpZ2h0LnNoYWRvd1JhZGl1cywgdkRpcmVjdGlvbmFsU2hhZG93Q29vcmRbIGkgXSApIDogMS4wO1xcblxcdFxcdCNlbmRpZlxcblxcdFxcdFJFX0RpcmVjdCggZGlyZWN0TGlnaHQsIGdlb21ldHJ5LCBtYXRlcmlhbCwgcmVmbGVjdGVkTGlnaHQgKTtcXG5cXHR9XFxuI2VuZGlmXFxuI2lmICggTlVNX1JFQ1RfQVJFQV9MSUdIVFMgPiAwICkgJiYgZGVmaW5lZCggUkVfRGlyZWN0X1JlY3RBcmVhIClcXG5cXHRSZWN0QXJlYUxpZ2h0IHJlY3RBcmVhTGlnaHQ7XFxuXFx0I3ByYWdtYSB1bnJvbGxfbG9vcFxcblxcdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9SRUNUX0FSRUFfTElHSFRTOyBpICsrICkge1xcblxcdFxcdHJlY3RBcmVhTGlnaHQgPSByZWN0QXJlYUxpZ2h0c1sgaSBdO1xcblxcdFxcdFJFX0RpcmVjdF9SZWN0QXJlYSggcmVjdEFyZWFMaWdodCwgZ2VvbWV0cnksIG1hdGVyaWFsLCByZWZsZWN0ZWRMaWdodCApO1xcblxcdH1cXG4jZW5kaWZcXG4jaWYgZGVmaW5lZCggUkVfSW5kaXJlY3REaWZmdXNlIClcXG5cXHR2ZWMzIGlycmFkaWFuY2UgPSBnZXRBbWJpZW50TGlnaHRJcnJhZGlhbmNlKCBhbWJpZW50TGlnaHRDb2xvciApO1xcblxcdCNpZiAoIE5VTV9IRU1JX0xJR0hUUyA+IDAgKVxcblxcdFxcdCNwcmFnbWEgdW5yb2xsX2xvb3BcXG5cXHRcXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fSEVNSV9MSUdIVFM7IGkgKysgKSB7XFxuXFx0XFx0XFx0aXJyYWRpYW5jZSArPSBnZXRIZW1pc3BoZXJlTGlnaHRJcnJhZGlhbmNlKCBoZW1pc3BoZXJlTGlnaHRzWyBpIF0sIGdlb21ldHJ5ICk7XFxuXFx0XFx0fVxcblxcdCNlbmRpZlxcbiNlbmRpZlxcbiNpZiBkZWZpbmVkKCBSRV9JbmRpcmVjdFNwZWN1bGFyIClcXG5cXHR2ZWMzIHJhZGlhbmNlID0gdmVjMyggMC4wICk7XFxuXFx0dmVjMyBjbGVhckNvYXRSYWRpYW5jZSA9IHZlYzMoIDAuMCApO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgbGlnaHRzX2ZyYWdtZW50X21hcHMgPSBcIiNpZiBkZWZpbmVkKCBSRV9JbmRpcmVjdERpZmZ1c2UgKVxcblxcdCNpZmRlZiBVU0VfTElHSFRNQVBcXG5cXHRcXHR2ZWMzIGxpZ2h0TWFwSXJyYWRpYW5jZSA9IHRleHR1cmUyRCggbGlnaHRNYXAsIHZVdjIgKS54eXogKiBsaWdodE1hcEludGVuc2l0eTtcXG5cXHRcXHQjaWZuZGVmIFBIWVNJQ0FMTFlfQ09SUkVDVF9MSUdIVFNcXG5cXHRcXHRcXHRsaWdodE1hcElycmFkaWFuY2UgKj0gUEk7XFxuXFx0XFx0I2VuZGlmXFxuXFx0XFx0aXJyYWRpYW5jZSArPSBsaWdodE1hcElycmFkaWFuY2U7XFxuXFx0I2VuZGlmXFxuXFx0I2lmIGRlZmluZWQoIFVTRV9FTlZNQVAgKSAmJiBkZWZpbmVkKCBQSFlTSUNBTCApICYmIGRlZmluZWQoIEVOVk1BUF9UWVBFX0NVQkVfVVYgKVxcblxcdFxcdGlycmFkaWFuY2UgKz0gZ2V0TGlnaHRQcm9iZUluZGlyZWN0SXJyYWRpYW5jZSggZ2VvbWV0cnksIG1heE1pcExldmVsICk7XFxuXFx0I2VuZGlmXFxuI2VuZGlmXFxuI2lmIGRlZmluZWQoIFVTRV9FTlZNQVAgKSAmJiBkZWZpbmVkKCBSRV9JbmRpcmVjdFNwZWN1bGFyIClcXG5cXHRyYWRpYW5jZSArPSBnZXRMaWdodFByb2JlSW5kaXJlY3RSYWRpYW5jZSggZ2VvbWV0cnksIE1hdGVyaWFsX0JsaW5uU2hpbmluZXNzRXhwb25lbnQoIG1hdGVyaWFsICksIG1heE1pcExldmVsICk7XFxuXFx0I2lmbmRlZiBTVEFOREFSRFxcblxcdFxcdGNsZWFyQ29hdFJhZGlhbmNlICs9IGdldExpZ2h0UHJvYmVJbmRpcmVjdFJhZGlhbmNlKCBnZW9tZXRyeSwgTWF0ZXJpYWxfQ2xlYXJDb2F0X0JsaW5uU2hpbmluZXNzRXhwb25lbnQoIG1hdGVyaWFsICksIG1heE1pcExldmVsICk7XFxuXFx0I2VuZGlmXFxuI2VuZGlmXFxuXCI7XG5cbnZhciBsaWdodHNfZnJhZ21lbnRfZW5kID0gXCIjaWYgZGVmaW5lZCggUkVfSW5kaXJlY3REaWZmdXNlIClcXG5cXHRSRV9JbmRpcmVjdERpZmZ1c2UoIGlycmFkaWFuY2UsIGdlb21ldHJ5LCBtYXRlcmlhbCwgcmVmbGVjdGVkTGlnaHQgKTtcXG4jZW5kaWZcXG4jaWYgZGVmaW5lZCggUkVfSW5kaXJlY3RTcGVjdWxhciApXFxuXFx0UkVfSW5kaXJlY3RTcGVjdWxhciggcmFkaWFuY2UsIGNsZWFyQ29hdFJhZGlhbmNlLCBnZW9tZXRyeSwgbWF0ZXJpYWwsIHJlZmxlY3RlZExpZ2h0ICk7XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBsb2dkZXB0aGJ1Zl9mcmFnbWVudCA9IFwiI2lmIGRlZmluZWQoIFVTRV9MT0dERVBUSEJVRiApICYmIGRlZmluZWQoIFVTRV9MT0dERVBUSEJVRl9FWFQgKVxcblxcdGdsX0ZyYWdEZXB0aEVYVCA9IGxvZzIoIHZGcmFnRGVwdGggKSAqIGxvZ0RlcHRoQnVmRkMgKiAwLjU7XFxuI2VuZGlmXCI7XG5cbnZhciBsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50ID0gXCIjaWZkZWYgVVNFX0xPR0RFUFRIQlVGXFxuXFx0dW5pZm9ybSBmbG9hdCBsb2dEZXB0aEJ1ZkZDO1xcblxcdCNpZmRlZiBVU0VfTE9HREVQVEhCVUZfRVhUXFxuXFx0XFx0dmFyeWluZyBmbG9hdCB2RnJhZ0RlcHRoO1xcblxcdCNlbmRpZlxcbiNlbmRpZlxcblwiO1xuXG52YXIgbG9nZGVwdGhidWZfcGFyc192ZXJ0ZXggPSBcIiNpZmRlZiBVU0VfTE9HREVQVEhCVUZcXG5cXHQjaWZkZWYgVVNFX0xPR0RFUFRIQlVGX0VYVFxcblxcdFxcdHZhcnlpbmcgZmxvYXQgdkZyYWdEZXB0aDtcXG5cXHQjZW5kaWZcXG5cXHR1bmlmb3JtIGZsb2F0IGxvZ0RlcHRoQnVmRkM7XFxuI2VuZGlmXCI7XG5cbnZhciBsb2dkZXB0aGJ1Zl92ZXJ0ZXggPSBcIiNpZmRlZiBVU0VfTE9HREVQVEhCVUZcXG5cXHQjaWZkZWYgVVNFX0xPR0RFUFRIQlVGX0VYVFxcblxcdFxcdHZGcmFnRGVwdGggPSAxLjAgKyBnbF9Qb3NpdGlvbi53O1xcblxcdCNlbHNlXFxuXFx0XFx0Z2xfUG9zaXRpb24ueiA9IGxvZzIoIG1heCggRVBTSUxPTiwgZ2xfUG9zaXRpb24udyArIDEuMCApICkgKiBsb2dEZXB0aEJ1ZkZDIC0gMS4wO1xcblxcdFxcdGdsX1Bvc2l0aW9uLnogKj0gZ2xfUG9zaXRpb24udztcXG5cXHQjZW5kaWZcXG4jZW5kaWZcXG5cIjtcblxudmFyIG1hcF9mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9NQVBcXG5cXHR2ZWM0IHRleGVsQ29sb3IgPSB0ZXh0dXJlMkQoIG1hcCwgdlV2ICk7XFxuXFx0dGV4ZWxDb2xvciA9IG1hcFRleGVsVG9MaW5lYXIoIHRleGVsQ29sb3IgKTtcXG5cXHRkaWZmdXNlQ29sb3IgKj0gdGV4ZWxDb2xvcjtcXG4jZW5kaWZcXG5cIjtcblxudmFyIG1hcF9wYXJzX2ZyYWdtZW50ID0gXCIjaWZkZWYgVVNFX01BUFxcblxcdHVuaWZvcm0gc2FtcGxlcjJEIG1hcDtcXG4jZW5kaWZcXG5cIjtcblxudmFyIG1hcF9wYXJ0aWNsZV9mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9NQVBcXG5cXHR2ZWMyIHV2ID0gKCB1dlRyYW5zZm9ybSAqIHZlYzMoIGdsX1BvaW50Q29vcmQueCwgMS4wIC0gZ2xfUG9pbnRDb29yZC55LCAxICkgKS54eTtcXG5cXHR2ZWM0IG1hcFRleGVsID0gdGV4dHVyZTJEKCBtYXAsIHV2ICk7XFxuXFx0ZGlmZnVzZUNvbG9yICo9IG1hcFRleGVsVG9MaW5lYXIoIG1hcFRleGVsICk7XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBtYXBfcGFydGljbGVfcGFyc19mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9NQVBcXG5cXHR1bmlmb3JtIG1hdDMgdXZUcmFuc2Zvcm07XFxuXFx0dW5pZm9ybSBzYW1wbGVyMkQgbWFwO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgbWV0YWxuZXNzbWFwX2ZyYWdtZW50ID0gXCJmbG9hdCBtZXRhbG5lc3NGYWN0b3IgPSBtZXRhbG5lc3M7XFxuI2lmZGVmIFVTRV9NRVRBTE5FU1NNQVBcXG5cXHR2ZWM0IHRleGVsTWV0YWxuZXNzID0gdGV4dHVyZTJEKCBtZXRhbG5lc3NNYXAsIHZVdiApO1xcblxcdG1ldGFsbmVzc0ZhY3RvciAqPSB0ZXhlbE1ldGFsbmVzcy5iO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgbWV0YWxuZXNzbWFwX3BhcnNfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfTUVUQUxORVNTTUFQXFxuXFx0dW5pZm9ybSBzYW1wbGVyMkQgbWV0YWxuZXNzTWFwO1xcbiNlbmRpZlwiO1xuXG52YXIgbW9ycGhub3JtYWxfdmVydGV4ID0gXCIjaWZkZWYgVVNFX01PUlBITk9STUFMU1xcblxcdG9iamVjdE5vcm1hbCArPSAoIG1vcnBoTm9ybWFsMCAtIG5vcm1hbCApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAwIF07XFxuXFx0b2JqZWN0Tm9ybWFsICs9ICggbW9ycGhOb3JtYWwxIC0gbm9ybWFsICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDEgXTtcXG5cXHRvYmplY3ROb3JtYWwgKz0gKCBtb3JwaE5vcm1hbDIgLSBub3JtYWwgKSAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgMiBdO1xcblxcdG9iamVjdE5vcm1hbCArPSAoIG1vcnBoTm9ybWFsMyAtIG5vcm1hbCApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAzIF07XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBtb3JwaHRhcmdldF9wYXJzX3ZlcnRleCA9IFwiI2lmZGVmIFVTRV9NT1JQSFRBUkdFVFNcXG5cXHQjaWZuZGVmIFVTRV9NT1JQSE5PUk1BTFNcXG5cXHR1bmlmb3JtIGZsb2F0IG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgOCBdO1xcblxcdCNlbHNlXFxuXFx0dW5pZm9ybSBmbG9hdCBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDQgXTtcXG5cXHQjZW5kaWZcXG4jZW5kaWZcIjtcblxudmFyIG1vcnBodGFyZ2V0X3ZlcnRleCA9IFwiI2lmZGVmIFVTRV9NT1JQSFRBUkdFVFNcXG5cXHR0cmFuc2Zvcm1lZCArPSAoIG1vcnBoVGFyZ2V0MCAtIHBvc2l0aW9uICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDAgXTtcXG5cXHR0cmFuc2Zvcm1lZCArPSAoIG1vcnBoVGFyZ2V0MSAtIHBvc2l0aW9uICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDEgXTtcXG5cXHR0cmFuc2Zvcm1lZCArPSAoIG1vcnBoVGFyZ2V0MiAtIHBvc2l0aW9uICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDIgXTtcXG5cXHR0cmFuc2Zvcm1lZCArPSAoIG1vcnBoVGFyZ2V0MyAtIHBvc2l0aW9uICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDMgXTtcXG5cXHQjaWZuZGVmIFVTRV9NT1JQSE5PUk1BTFNcXG5cXHR0cmFuc2Zvcm1lZCArPSAoIG1vcnBoVGFyZ2V0NCAtIHBvc2l0aW9uICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDQgXTtcXG5cXHR0cmFuc2Zvcm1lZCArPSAoIG1vcnBoVGFyZ2V0NSAtIHBvc2l0aW9uICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDUgXTtcXG5cXHR0cmFuc2Zvcm1lZCArPSAoIG1vcnBoVGFyZ2V0NiAtIHBvc2l0aW9uICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDYgXTtcXG5cXHR0cmFuc2Zvcm1lZCArPSAoIG1vcnBoVGFyZ2V0NyAtIHBvc2l0aW9uICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDcgXTtcXG5cXHQjZW5kaWZcXG4jZW5kaWZcXG5cIjtcblxudmFyIG5vcm1hbF9mcmFnbWVudF9iZWdpbiA9IFwiI2lmZGVmIEZMQVRfU0hBREVEXFxuXFx0dmVjMyBmZHggPSB2ZWMzKCBkRmR4KCB2Vmlld1Bvc2l0aW9uLnggKSwgZEZkeCggdlZpZXdQb3NpdGlvbi55ICksIGRGZHgoIHZWaWV3UG9zaXRpb24ueiApICk7XFxuXFx0dmVjMyBmZHkgPSB2ZWMzKCBkRmR5KCB2Vmlld1Bvc2l0aW9uLnggKSwgZEZkeSggdlZpZXdQb3NpdGlvbi55ICksIGRGZHkoIHZWaWV3UG9zaXRpb24ueiApICk7XFxuXFx0dmVjMyBub3JtYWwgPSBub3JtYWxpemUoIGNyb3NzKCBmZHgsIGZkeSApICk7XFxuI2Vsc2VcXG5cXHR2ZWMzIG5vcm1hbCA9IG5vcm1hbGl6ZSggdk5vcm1hbCApO1xcblxcdCNpZmRlZiBET1VCTEVfU0lERURcXG5cXHRcXHRub3JtYWwgPSBub3JtYWwgKiAoIGZsb2F0KCBnbF9Gcm9udEZhY2luZyApICogMi4wIC0gMS4wICk7XFxuXFx0I2VuZGlmXFxuI2VuZGlmXFxuXCI7XG5cbnZhciBub3JtYWxfZnJhZ21lbnRfbWFwcyA9IFwiI2lmZGVmIFVTRV9OT1JNQUxNQVBcXG5cXHRub3JtYWwgPSBwZXJ0dXJiTm9ybWFsMkFyYiggLXZWaWV3UG9zaXRpb24sIG5vcm1hbCApO1xcbiNlbGlmIGRlZmluZWQoIFVTRV9CVU1QTUFQIClcXG5cXHRub3JtYWwgPSBwZXJ0dXJiTm9ybWFsQXJiKCAtdlZpZXdQb3NpdGlvbiwgbm9ybWFsLCBkSGR4eV9md2QoKSApO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgbm9ybWFsbWFwX3BhcnNfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfTk9STUFMTUFQXFxuXFx0dW5pZm9ybSBzYW1wbGVyMkQgbm9ybWFsTWFwO1xcblxcdHVuaWZvcm0gdmVjMiBub3JtYWxTY2FsZTtcXG5cXHR2ZWMzIHBlcnR1cmJOb3JtYWwyQXJiKCB2ZWMzIGV5ZV9wb3MsIHZlYzMgc3VyZl9ub3JtICkge1xcblxcdFxcdHZlYzMgcTAgPSB2ZWMzKCBkRmR4KCBleWVfcG9zLnggKSwgZEZkeCggZXllX3Bvcy55ICksIGRGZHgoIGV5ZV9wb3MueiApICk7XFxuXFx0XFx0dmVjMyBxMSA9IHZlYzMoIGRGZHkoIGV5ZV9wb3MueCApLCBkRmR5KCBleWVfcG9zLnkgKSwgZEZkeSggZXllX3Bvcy56ICkgKTtcXG5cXHRcXHR2ZWMyIHN0MCA9IGRGZHgoIHZVdi5zdCApO1xcblxcdFxcdHZlYzIgc3QxID0gZEZkeSggdlV2LnN0ICk7XFxuXFx0XFx0ZmxvYXQgc2NhbGUgPSBzaWduKCBzdDEudCAqIHN0MC5zIC0gc3QwLnQgKiBzdDEucyApO1xcdFxcdHNjYWxlICo9IGZsb2F0KCBnbF9Gcm9udEZhY2luZyApICogMi4wIC0gMS4wO1xcblxcdFxcdHZlYzMgUyA9IG5vcm1hbGl6ZSggKCBxMCAqIHN0MS50IC0gcTEgKiBzdDAudCApICogc2NhbGUgKTtcXG5cXHRcXHR2ZWMzIFQgPSBub3JtYWxpemUoICggLSBxMCAqIHN0MS5zICsgcTEgKiBzdDAucyApICogc2NhbGUgKTtcXG5cXHRcXHR2ZWMzIE4gPSBub3JtYWxpemUoIHN1cmZfbm9ybSApO1xcblxcdFxcdHZlYzMgbWFwTiA9IHRleHR1cmUyRCggbm9ybWFsTWFwLCB2VXYgKS54eXogKiAyLjAgLSAxLjA7XFxuXFx0XFx0bWFwTi54eSA9IG5vcm1hbFNjYWxlICogbWFwTi54eTtcXG5cXHRcXHRtYXQzIHRzbiA9IG1hdDMoIFMsIFQsIE4gKTtcXG5cXHRcXHRyZXR1cm4gbm9ybWFsaXplKCB0c24gKiBtYXBOICk7XFxuXFx0fVxcbiNlbmRpZlxcblwiO1xuXG52YXIgcGFja2luZyA9IFwidmVjMyBwYWNrTm9ybWFsVG9SR0IoIGNvbnN0IGluIHZlYzMgbm9ybWFsICkge1xcblxcdHJldHVybiBub3JtYWxpemUoIG5vcm1hbCApICogMC41ICsgMC41O1xcbn1cXG52ZWMzIHVucGFja1JHQlRvTm9ybWFsKCBjb25zdCBpbiB2ZWMzIHJnYiApIHtcXG5cXHRyZXR1cm4gMi4wICogcmdiLnh5eiAtIDEuMDtcXG59XFxuY29uc3QgZmxvYXQgUGFja1Vwc2NhbGUgPSAyNTYuIC8gMjU1Ljtjb25zdCBmbG9hdCBVbnBhY2tEb3duc2NhbGUgPSAyNTUuIC8gMjU2LjtcXG5jb25zdCB2ZWMzIFBhY2tGYWN0b3JzID0gdmVjMyggMjU2LiAqIDI1Ni4gKiAyNTYuLCAyNTYuICogMjU2LiwgIDI1Ni4gKTtcXG5jb25zdCB2ZWM0IFVucGFja0ZhY3RvcnMgPSBVbnBhY2tEb3duc2NhbGUgLyB2ZWM0KCBQYWNrRmFjdG9ycywgMS4gKTtcXG5jb25zdCBmbG9hdCBTaGlmdFJpZ2h0OCA9IDEuIC8gMjU2LjtcXG52ZWM0IHBhY2tEZXB0aFRvUkdCQSggY29uc3QgaW4gZmxvYXQgdiApIHtcXG5cXHR2ZWM0IHIgPSB2ZWM0KCBmcmFjdCggdiAqIFBhY2tGYWN0b3JzICksIHYgKTtcXG5cXHRyLnl6dyAtPSByLnh5eiAqIFNoaWZ0UmlnaHQ4O1xcdHJldHVybiByICogUGFja1Vwc2NhbGU7XFxufVxcbmZsb2F0IHVucGFja1JHQkFUb0RlcHRoKCBjb25zdCBpbiB2ZWM0IHYgKSB7XFxuXFx0cmV0dXJuIGRvdCggdiwgVW5wYWNrRmFjdG9ycyApO1xcbn1cXG5mbG9hdCB2aWV3WlRvT3J0aG9ncmFwaGljRGVwdGgoIGNvbnN0IGluIGZsb2F0IHZpZXdaLCBjb25zdCBpbiBmbG9hdCBuZWFyLCBjb25zdCBpbiBmbG9hdCBmYXIgKSB7XFxuXFx0cmV0dXJuICggdmlld1ogKyBuZWFyICkgLyAoIG5lYXIgLSBmYXIgKTtcXG59XFxuZmxvYXQgb3J0aG9ncmFwaGljRGVwdGhUb1ZpZXdaKCBjb25zdCBpbiBmbG9hdCBsaW5lYXJDbGlwWiwgY29uc3QgaW4gZmxvYXQgbmVhciwgY29uc3QgaW4gZmxvYXQgZmFyICkge1xcblxcdHJldHVybiBsaW5lYXJDbGlwWiAqICggbmVhciAtIGZhciApIC0gbmVhcjtcXG59XFxuZmxvYXQgdmlld1pUb1BlcnNwZWN0aXZlRGVwdGgoIGNvbnN0IGluIGZsb2F0IHZpZXdaLCBjb25zdCBpbiBmbG9hdCBuZWFyLCBjb25zdCBpbiBmbG9hdCBmYXIgKSB7XFxuXFx0cmV0dXJuICgoIG5lYXIgKyB2aWV3WiApICogZmFyICkgLyAoKCBmYXIgLSBuZWFyICkgKiB2aWV3WiApO1xcbn1cXG5mbG9hdCBwZXJzcGVjdGl2ZURlcHRoVG9WaWV3WiggY29uc3QgaW4gZmxvYXQgaW52Q2xpcFosIGNvbnN0IGluIGZsb2F0IG5lYXIsIGNvbnN0IGluIGZsb2F0IGZhciApIHtcXG5cXHRyZXR1cm4gKCBuZWFyICogZmFyICkgLyAoICggZmFyIC0gbmVhciApICogaW52Q2xpcFogLSBmYXIgKTtcXG59XFxuXCI7XG5cbnZhciBwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50ID0gXCIjaWZkZWYgUFJFTVVMVElQTElFRF9BTFBIQVxcblxcdGdsX0ZyYWdDb2xvci5yZ2IgKj0gZ2xfRnJhZ0NvbG9yLmE7XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBwcm9qZWN0X3ZlcnRleCA9IFwidmVjNCBtdlBvc2l0aW9uID0gbW9kZWxWaWV3TWF0cml4ICogdmVjNCggdHJhbnNmb3JtZWQsIDEuMCApO1xcbmdsX1Bvc2l0aW9uID0gcHJvamVjdGlvbk1hdHJpeCAqIG12UG9zaXRpb247XFxuXCI7XG5cbnZhciBkaXRoZXJpbmdfZnJhZ21lbnQgPSBcIiNpZiBkZWZpbmVkKCBESVRIRVJJTkcgKVxcbiAgZ2xfRnJhZ0NvbG9yLnJnYiA9IGRpdGhlcmluZyggZ2xfRnJhZ0NvbG9yLnJnYiApO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnQgPSBcIiNpZiBkZWZpbmVkKCBESVRIRVJJTkcgKVxcblxcdHZlYzMgZGl0aGVyaW5nKCB2ZWMzIGNvbG9yICkge1xcblxcdFxcdGZsb2F0IGdyaWRfcG9zaXRpb24gPSByYW5kKCBnbF9GcmFnQ29vcmQueHkgKTtcXG5cXHRcXHR2ZWMzIGRpdGhlcl9zaGlmdF9SR0IgPSB2ZWMzKCAwLjI1IC8gMjU1LjAsIC0wLjI1IC8gMjU1LjAsIDAuMjUgLyAyNTUuMCApO1xcblxcdFxcdGRpdGhlcl9zaGlmdF9SR0IgPSBtaXgoIDIuMCAqIGRpdGhlcl9zaGlmdF9SR0IsIC0yLjAgKiBkaXRoZXJfc2hpZnRfUkdCLCBncmlkX3Bvc2l0aW9uICk7XFxuXFx0XFx0cmV0dXJuIGNvbG9yICsgZGl0aGVyX3NoaWZ0X1JHQjtcXG5cXHR9XFxuI2VuZGlmXFxuXCI7XG5cbnZhciByb3VnaG5lc3NtYXBfZnJhZ21lbnQgPSBcImZsb2F0IHJvdWdobmVzc0ZhY3RvciA9IHJvdWdobmVzcztcXG4jaWZkZWYgVVNFX1JPVUdITkVTU01BUFxcblxcdHZlYzQgdGV4ZWxSb3VnaG5lc3MgPSB0ZXh0dXJlMkQoIHJvdWdobmVzc01hcCwgdlV2ICk7XFxuXFx0cm91Z2huZXNzRmFjdG9yICo9IHRleGVsUm91Z2huZXNzLmc7XFxuI2VuZGlmXFxuXCI7XG5cbnZhciByb3VnaG5lc3NtYXBfcGFyc19mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9ST1VHSE5FU1NNQVBcXG5cXHR1bmlmb3JtIHNhbXBsZXIyRCByb3VnaG5lc3NNYXA7XFxuI2VuZGlmXCI7XG5cbnZhciBzaGFkb3dtYXBfcGFyc19mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9TSEFET1dNQVBcXG5cXHQjaWYgTlVNX0RJUl9MSUdIVFMgPiAwXFxuXFx0XFx0dW5pZm9ybSBzYW1wbGVyMkQgZGlyZWN0aW9uYWxTaGFkb3dNYXBbIE5VTV9ESVJfTElHSFRTIF07XFxuXFx0XFx0dmFyeWluZyB2ZWM0IHZEaXJlY3Rpb25hbFNoYWRvd0Nvb3JkWyBOVU1fRElSX0xJR0hUUyBdO1xcblxcdCNlbmRpZlxcblxcdCNpZiBOVU1fU1BPVF9MSUdIVFMgPiAwXFxuXFx0XFx0dW5pZm9ybSBzYW1wbGVyMkQgc3BvdFNoYWRvd01hcFsgTlVNX1NQT1RfTElHSFRTIF07XFxuXFx0XFx0dmFyeWluZyB2ZWM0IHZTcG90U2hhZG93Q29vcmRbIE5VTV9TUE9UX0xJR0hUUyBdO1xcblxcdCNlbmRpZlxcblxcdCNpZiBOVU1fUE9JTlRfTElHSFRTID4gMFxcblxcdFxcdHVuaWZvcm0gc2FtcGxlcjJEIHBvaW50U2hhZG93TWFwWyBOVU1fUE9JTlRfTElHSFRTIF07XFxuXFx0XFx0dmFyeWluZyB2ZWM0IHZQb2ludFNoYWRvd0Nvb3JkWyBOVU1fUE9JTlRfTElHSFRTIF07XFxuXFx0I2VuZGlmXFxuXFx0ZmxvYXQgdGV4dHVyZTJEQ29tcGFyZSggc2FtcGxlcjJEIGRlcHRocywgdmVjMiB1diwgZmxvYXQgY29tcGFyZSApIHtcXG5cXHRcXHRyZXR1cm4gc3RlcCggY29tcGFyZSwgdW5wYWNrUkdCQVRvRGVwdGgoIHRleHR1cmUyRCggZGVwdGhzLCB1diApICkgKTtcXG5cXHR9XFxuXFx0ZmxvYXQgdGV4dHVyZTJEU2hhZG93TGVycCggc2FtcGxlcjJEIGRlcHRocywgdmVjMiBzaXplLCB2ZWMyIHV2LCBmbG9hdCBjb21wYXJlICkge1xcblxcdFxcdGNvbnN0IHZlYzIgb2Zmc2V0ID0gdmVjMiggMC4wLCAxLjAgKTtcXG5cXHRcXHR2ZWMyIHRleGVsU2l6ZSA9IHZlYzIoIDEuMCApIC8gc2l6ZTtcXG5cXHRcXHR2ZWMyIGNlbnRyb2lkVVYgPSBmbG9vciggdXYgKiBzaXplICsgMC41ICkgLyBzaXplO1xcblxcdFxcdGZsb2F0IGxiID0gdGV4dHVyZTJEQ29tcGFyZSggZGVwdGhzLCBjZW50cm9pZFVWICsgdGV4ZWxTaXplICogb2Zmc2V0Lnh4LCBjb21wYXJlICk7XFxuXFx0XFx0ZmxvYXQgbHQgPSB0ZXh0dXJlMkRDb21wYXJlKCBkZXB0aHMsIGNlbnRyb2lkVVYgKyB0ZXhlbFNpemUgKiBvZmZzZXQueHksIGNvbXBhcmUgKTtcXG5cXHRcXHRmbG9hdCByYiA9IHRleHR1cmUyRENvbXBhcmUoIGRlcHRocywgY2VudHJvaWRVViArIHRleGVsU2l6ZSAqIG9mZnNldC55eCwgY29tcGFyZSApO1xcblxcdFxcdGZsb2F0IHJ0ID0gdGV4dHVyZTJEQ29tcGFyZSggZGVwdGhzLCBjZW50cm9pZFVWICsgdGV4ZWxTaXplICogb2Zmc2V0Lnl5LCBjb21wYXJlICk7XFxuXFx0XFx0dmVjMiBmID0gZnJhY3QoIHV2ICogc2l6ZSArIDAuNSApO1xcblxcdFxcdGZsb2F0IGEgPSBtaXgoIGxiLCBsdCwgZi55ICk7XFxuXFx0XFx0ZmxvYXQgYiA9IG1peCggcmIsIHJ0LCBmLnkgKTtcXG5cXHRcXHRmbG9hdCBjID0gbWl4KCBhLCBiLCBmLnggKTtcXG5cXHRcXHRyZXR1cm4gYztcXG5cXHR9XFxuXFx0ZmxvYXQgZ2V0U2hhZG93KCBzYW1wbGVyMkQgc2hhZG93TWFwLCB2ZWMyIHNoYWRvd01hcFNpemUsIGZsb2F0IHNoYWRvd0JpYXMsIGZsb2F0IHNoYWRvd1JhZGl1cywgdmVjNCBzaGFkb3dDb29yZCApIHtcXG5cXHRcXHRmbG9hdCBzaGFkb3cgPSAxLjA7XFxuXFx0XFx0c2hhZG93Q29vcmQueHl6IC89IHNoYWRvd0Nvb3JkLnc7XFxuXFx0XFx0c2hhZG93Q29vcmQueiArPSBzaGFkb3dCaWFzO1xcblxcdFxcdGJ2ZWM0IGluRnJ1c3R1bVZlYyA9IGJ2ZWM0ICggc2hhZG93Q29vcmQueCA+PSAwLjAsIHNoYWRvd0Nvb3JkLnggPD0gMS4wLCBzaGFkb3dDb29yZC55ID49IDAuMCwgc2hhZG93Q29vcmQueSA8PSAxLjAgKTtcXG5cXHRcXHRib29sIGluRnJ1c3R1bSA9IGFsbCggaW5GcnVzdHVtVmVjICk7XFxuXFx0XFx0YnZlYzIgZnJ1c3R1bVRlc3RWZWMgPSBidmVjMiggaW5GcnVzdHVtLCBzaGFkb3dDb29yZC56IDw9IDEuMCApO1xcblxcdFxcdGJvb2wgZnJ1c3R1bVRlc3QgPSBhbGwoIGZydXN0dW1UZXN0VmVjICk7XFxuXFx0XFx0aWYgKCBmcnVzdHVtVGVzdCApIHtcXG5cXHRcXHQjaWYgZGVmaW5lZCggU0hBRE9XTUFQX1RZUEVfUENGIClcXG5cXHRcXHRcXHR2ZWMyIHRleGVsU2l6ZSA9IHZlYzIoIDEuMCApIC8gc2hhZG93TWFwU2l6ZTtcXG5cXHRcXHRcXHRmbG9hdCBkeDAgPSAtIHRleGVsU2l6ZS54ICogc2hhZG93UmFkaXVzO1xcblxcdFxcdFxcdGZsb2F0IGR5MCA9IC0gdGV4ZWxTaXplLnkgKiBzaGFkb3dSYWRpdXM7XFxuXFx0XFx0XFx0ZmxvYXQgZHgxID0gKyB0ZXhlbFNpemUueCAqIHNoYWRvd1JhZGl1cztcXG5cXHRcXHRcXHRmbG9hdCBkeTEgPSArIHRleGVsU2l6ZS55ICogc2hhZG93UmFkaXVzO1xcblxcdFxcdFxcdHNoYWRvdyA9IChcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgwLCBkeTAgKSwgc2hhZG93Q29vcmQueiApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggMC4wLCBkeTAgKSwgc2hhZG93Q29vcmQueiApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgxLCBkeTAgKSwgc2hhZG93Q29vcmQueiApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgwLCAwLjAgKSwgc2hhZG93Q29vcmQueiApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5LCBzaGFkb3dDb29yZC56ICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDEsIDAuMCApLCBzaGFkb3dDb29yZC56ICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDAsIGR5MSApLCBzaGFkb3dDb29yZC56ICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCAwLjAsIGR5MSApLCBzaGFkb3dDb29yZC56ICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDEsIGR5MSApLCBzaGFkb3dDb29yZC56IClcXG5cXHRcXHRcXHQpICogKCAxLjAgLyA5LjAgKTtcXG5cXHRcXHQjZWxpZiBkZWZpbmVkKCBTSEFET1dNQVBfVFlQRV9QQ0ZfU09GVCApXFxuXFx0XFx0XFx0dmVjMiB0ZXhlbFNpemUgPSB2ZWMyKCAxLjAgKSAvIHNoYWRvd01hcFNpemU7XFxuXFx0XFx0XFx0ZmxvYXQgZHgwID0gLSB0ZXhlbFNpemUueCAqIHNoYWRvd1JhZGl1cztcXG5cXHRcXHRcXHRmbG9hdCBkeTAgPSAtIHRleGVsU2l6ZS55ICogc2hhZG93UmFkaXVzO1xcblxcdFxcdFxcdGZsb2F0IGR4MSA9ICsgdGV4ZWxTaXplLnggKiBzaGFkb3dSYWRpdXM7XFxuXFx0XFx0XFx0ZmxvYXQgZHkxID0gKyB0ZXhlbFNpemUueSAqIHNoYWRvd1JhZGl1cztcXG5cXHRcXHRcXHRzaGFkb3cgPSAoXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEU2hhZG93TGVycCggc2hhZG93TWFwLCBzaGFkb3dNYXBTaXplLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MCwgZHkwICksIHNoYWRvd0Nvb3JkLnogKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEU2hhZG93TGVycCggc2hhZG93TWFwLCBzaGFkb3dNYXBTaXplLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIDAuMCwgZHkwICksIHNoYWRvd0Nvb3JkLnogKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEU2hhZG93TGVycCggc2hhZG93TWFwLCBzaGFkb3dNYXBTaXplLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MSwgZHkwICksIHNoYWRvd0Nvb3JkLnogKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEU2hhZG93TGVycCggc2hhZG93TWFwLCBzaGFkb3dNYXBTaXplLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MCwgMC4wICksIHNoYWRvd0Nvb3JkLnogKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEU2hhZG93TGVycCggc2hhZG93TWFwLCBzaGFkb3dNYXBTaXplLCBzaGFkb3dDb29yZC54eSwgc2hhZG93Q29vcmQueiApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRTaGFkb3dMZXJwKCBzaGFkb3dNYXAsIHNoYWRvd01hcFNpemUsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgxLCAwLjAgKSwgc2hhZG93Q29vcmQueiApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRTaGFkb3dMZXJwKCBzaGFkb3dNYXAsIHNoYWRvd01hcFNpemUsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgwLCBkeTEgKSwgc2hhZG93Q29vcmQueiApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRTaGFkb3dMZXJwKCBzaGFkb3dNYXAsIHNoYWRvd01hcFNpemUsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggMC4wLCBkeTEgKSwgc2hhZG93Q29vcmQueiApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRTaGFkb3dMZXJwKCBzaGFkb3dNYXAsIHNoYWRvd01hcFNpemUsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgxLCBkeTEgKSwgc2hhZG93Q29vcmQueiApXFxuXFx0XFx0XFx0KSAqICggMS4wIC8gOS4wICk7XFxuXFx0XFx0I2Vsc2VcXG5cXHRcXHRcXHRzaGFkb3cgPSB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5LCBzaGFkb3dDb29yZC56ICk7XFxuXFx0XFx0I2VuZGlmXFxuXFx0XFx0fVxcblxcdFxcdHJldHVybiBzaGFkb3c7XFxuXFx0fVxcblxcdHZlYzIgY3ViZVRvVVYoIHZlYzMgdiwgZmxvYXQgdGV4ZWxTaXplWSApIHtcXG5cXHRcXHR2ZWMzIGFic1YgPSBhYnMoIHYgKTtcXG5cXHRcXHRmbG9hdCBzY2FsZVRvQ3ViZSA9IDEuMCAvIG1heCggYWJzVi54LCBtYXgoIGFic1YueSwgYWJzVi56ICkgKTtcXG5cXHRcXHRhYnNWICo9IHNjYWxlVG9DdWJlO1xcblxcdFxcdHYgKj0gc2NhbGVUb0N1YmUgKiAoIDEuMCAtIDIuMCAqIHRleGVsU2l6ZVkgKTtcXG5cXHRcXHR2ZWMyIHBsYW5hciA9IHYueHk7XFxuXFx0XFx0ZmxvYXQgYWxtb3N0QVRleGVsID0gMS41ICogdGV4ZWxTaXplWTtcXG5cXHRcXHRmbG9hdCBhbG1vc3RPbmUgPSAxLjAgLSBhbG1vc3RBVGV4ZWw7XFxuXFx0XFx0aWYgKCBhYnNWLnogPj0gYWxtb3N0T25lICkge1xcblxcdFxcdFxcdGlmICggdi56ID4gMC4wIClcXG5cXHRcXHRcXHRcXHRwbGFuYXIueCA9IDQuMCAtIHYueDtcXG5cXHRcXHR9IGVsc2UgaWYgKCBhYnNWLnggPj0gYWxtb3N0T25lICkge1xcblxcdFxcdFxcdGZsb2F0IHNpZ25YID0gc2lnbiggdi54ICk7XFxuXFx0XFx0XFx0cGxhbmFyLnggPSB2LnogKiBzaWduWCArIDIuMCAqIHNpZ25YO1xcblxcdFxcdH0gZWxzZSBpZiAoIGFic1YueSA+PSBhbG1vc3RPbmUgKSB7XFxuXFx0XFx0XFx0ZmxvYXQgc2lnblkgPSBzaWduKCB2LnkgKTtcXG5cXHRcXHRcXHRwbGFuYXIueCA9IHYueCArIDIuMCAqIHNpZ25ZICsgMi4wO1xcblxcdFxcdFxcdHBsYW5hci55ID0gdi56ICogc2lnblkgLSAyLjA7XFxuXFx0XFx0fVxcblxcdFxcdHJldHVybiB2ZWMyKCAwLjEyNSwgMC4yNSApICogcGxhbmFyICsgdmVjMiggMC4zNzUsIDAuNzUgKTtcXG5cXHR9XFxuXFx0ZmxvYXQgZ2V0UG9pbnRTaGFkb3coIHNhbXBsZXIyRCBzaGFkb3dNYXAsIHZlYzIgc2hhZG93TWFwU2l6ZSwgZmxvYXQgc2hhZG93QmlhcywgZmxvYXQgc2hhZG93UmFkaXVzLCB2ZWM0IHNoYWRvd0Nvb3JkLCBmbG9hdCBzaGFkb3dDYW1lcmFOZWFyLCBmbG9hdCBzaGFkb3dDYW1lcmFGYXIgKSB7XFxuXFx0XFx0dmVjMiB0ZXhlbFNpemUgPSB2ZWMyKCAxLjAgKSAvICggc2hhZG93TWFwU2l6ZSAqIHZlYzIoIDQuMCwgMi4wICkgKTtcXG5cXHRcXHR2ZWMzIGxpZ2h0VG9Qb3NpdGlvbiA9IHNoYWRvd0Nvb3JkLnh5ejtcXG5cXHRcXHRmbG9hdCBkcCA9ICggbGVuZ3RoKCBsaWdodFRvUG9zaXRpb24gKSAtIHNoYWRvd0NhbWVyYU5lYXIgKSAvICggc2hhZG93Q2FtZXJhRmFyIC0gc2hhZG93Q2FtZXJhTmVhciApO1xcdFxcdGRwICs9IHNoYWRvd0JpYXM7XFxuXFx0XFx0dmVjMyBiZDNEID0gbm9ybWFsaXplKCBsaWdodFRvUG9zaXRpb24gKTtcXG5cXHRcXHQjaWYgZGVmaW5lZCggU0hBRE9XTUFQX1RZUEVfUENGICkgfHwgZGVmaW5lZCggU0hBRE9XTUFQX1RZUEVfUENGX1NPRlQgKVxcblxcdFxcdFxcdHZlYzIgb2Zmc2V0ID0gdmVjMiggLSAxLCAxICkgKiBzaGFkb3dSYWRpdXMgKiB0ZXhlbFNpemUueTtcXG5cXHRcXHRcXHRyZXR1cm4gKFxcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueHl5LCB0ZXhlbFNpemUueSApLCBkcCApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnl5eSwgdGV4ZWxTaXplLnkgKSwgZHAgKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC54eXgsIHRleGVsU2l6ZS55ICksIGRwICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueXl4LCB0ZXhlbFNpemUueSApLCBkcCApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNELCB0ZXhlbFNpemUueSApLCBkcCApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnh4eSwgdGV4ZWxTaXplLnkgKSwgZHAgKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC55eHksIHRleGVsU2l6ZS55ICksIGRwICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueHh4LCB0ZXhlbFNpemUueSApLCBkcCApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnl4eCwgdGV4ZWxTaXplLnkgKSwgZHAgKVxcblxcdFxcdFxcdCkgKiAoIDEuMCAvIDkuMCApO1xcblxcdFxcdCNlbHNlXFxuXFx0XFx0XFx0cmV0dXJuIHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QsIHRleGVsU2l6ZS55ICksIGRwICk7XFxuXFx0XFx0I2VuZGlmXFxuXFx0fVxcbiNlbmRpZlxcblwiO1xuXG52YXIgc2hhZG93bWFwX3BhcnNfdmVydGV4ID0gXCIjaWZkZWYgVVNFX1NIQURPV01BUFxcblxcdCNpZiBOVU1fRElSX0xJR0hUUyA+IDBcXG5cXHRcXHR1bmlmb3JtIG1hdDQgZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXhbIE5VTV9ESVJfTElHSFRTIF07XFxuXFx0XFx0dmFyeWluZyB2ZWM0IHZEaXJlY3Rpb25hbFNoYWRvd0Nvb3JkWyBOVU1fRElSX0xJR0hUUyBdO1xcblxcdCNlbmRpZlxcblxcdCNpZiBOVU1fU1BPVF9MSUdIVFMgPiAwXFxuXFx0XFx0dW5pZm9ybSBtYXQ0IHNwb3RTaGFkb3dNYXRyaXhbIE5VTV9TUE9UX0xJR0hUUyBdO1xcblxcdFxcdHZhcnlpbmcgdmVjNCB2U3BvdFNoYWRvd0Nvb3JkWyBOVU1fU1BPVF9MSUdIVFMgXTtcXG5cXHQjZW5kaWZcXG5cXHQjaWYgTlVNX1BPSU5UX0xJR0hUUyA+IDBcXG5cXHRcXHR1bmlmb3JtIG1hdDQgcG9pbnRTaGFkb3dNYXRyaXhbIE5VTV9QT0lOVF9MSUdIVFMgXTtcXG5cXHRcXHR2YXJ5aW5nIHZlYzQgdlBvaW50U2hhZG93Q29vcmRbIE5VTV9QT0lOVF9MSUdIVFMgXTtcXG5cXHQjZW5kaWZcXG4jZW5kaWZcXG5cIjtcblxudmFyIHNoYWRvd21hcF92ZXJ0ZXggPSBcIiNpZmRlZiBVU0VfU0hBRE9XTUFQXFxuXFx0I2lmIE5VTV9ESVJfTElHSFRTID4gMFxcblxcdCNwcmFnbWEgdW5yb2xsX2xvb3BcXG5cXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fRElSX0xJR0hUUzsgaSArKyApIHtcXG5cXHRcXHR2RGlyZWN0aW9uYWxTaGFkb3dDb29yZFsgaSBdID0gZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXhbIGkgXSAqIHdvcmxkUG9zaXRpb247XFxuXFx0fVxcblxcdCNlbmRpZlxcblxcdCNpZiBOVU1fU1BPVF9MSUdIVFMgPiAwXFxuXFx0I3ByYWdtYSB1bnJvbGxfbG9vcFxcblxcdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9TUE9UX0xJR0hUUzsgaSArKyApIHtcXG5cXHRcXHR2U3BvdFNoYWRvd0Nvb3JkWyBpIF0gPSBzcG90U2hhZG93TWF0cml4WyBpIF0gKiB3b3JsZFBvc2l0aW9uO1xcblxcdH1cXG5cXHQjZW5kaWZcXG5cXHQjaWYgTlVNX1BPSU5UX0xJR0hUUyA+IDBcXG5cXHQjcHJhZ21hIHVucm9sbF9sb29wXFxuXFx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX1BPSU5UX0xJR0hUUzsgaSArKyApIHtcXG5cXHRcXHR2UG9pbnRTaGFkb3dDb29yZFsgaSBdID0gcG9pbnRTaGFkb3dNYXRyaXhbIGkgXSAqIHdvcmxkUG9zaXRpb247XFxuXFx0fVxcblxcdCNlbmRpZlxcbiNlbmRpZlxcblwiO1xuXG52YXIgc2hhZG93bWFza19wYXJzX2ZyYWdtZW50ID0gXCJmbG9hdCBnZXRTaGFkb3dNYXNrKCkge1xcblxcdGZsb2F0IHNoYWRvdyA9IDEuMDtcXG5cXHQjaWZkZWYgVVNFX1NIQURPV01BUFxcblxcdCNpZiBOVU1fRElSX0xJR0hUUyA+IDBcXG5cXHREaXJlY3Rpb25hbExpZ2h0IGRpcmVjdGlvbmFsTGlnaHQ7XFxuXFx0I3ByYWdtYSB1bnJvbGxfbG9vcFxcblxcdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9ESVJfTElHSFRTOyBpICsrICkge1xcblxcdFxcdGRpcmVjdGlvbmFsTGlnaHQgPSBkaXJlY3Rpb25hbExpZ2h0c1sgaSBdO1xcblxcdFxcdHNoYWRvdyAqPSBib29sKCBkaXJlY3Rpb25hbExpZ2h0LnNoYWRvdyApID8gZ2V0U2hhZG93KCBkaXJlY3Rpb25hbFNoYWRvd01hcFsgaSBdLCBkaXJlY3Rpb25hbExpZ2h0LnNoYWRvd01hcFNpemUsIGRpcmVjdGlvbmFsTGlnaHQuc2hhZG93QmlhcywgZGlyZWN0aW9uYWxMaWdodC5zaGFkb3dSYWRpdXMsIHZEaXJlY3Rpb25hbFNoYWRvd0Nvb3JkWyBpIF0gKSA6IDEuMDtcXG5cXHR9XFxuXFx0I2VuZGlmXFxuXFx0I2lmIE5VTV9TUE9UX0xJR0hUUyA+IDBcXG5cXHRTcG90TGlnaHQgc3BvdExpZ2h0O1xcblxcdCNwcmFnbWEgdW5yb2xsX2xvb3BcXG5cXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fU1BPVF9MSUdIVFM7IGkgKysgKSB7XFxuXFx0XFx0c3BvdExpZ2h0ID0gc3BvdExpZ2h0c1sgaSBdO1xcblxcdFxcdHNoYWRvdyAqPSBib29sKCBzcG90TGlnaHQuc2hhZG93ICkgPyBnZXRTaGFkb3coIHNwb3RTaGFkb3dNYXBbIGkgXSwgc3BvdExpZ2h0LnNoYWRvd01hcFNpemUsIHNwb3RMaWdodC5zaGFkb3dCaWFzLCBzcG90TGlnaHQuc2hhZG93UmFkaXVzLCB2U3BvdFNoYWRvd0Nvb3JkWyBpIF0gKSA6IDEuMDtcXG5cXHR9XFxuXFx0I2VuZGlmXFxuXFx0I2lmIE5VTV9QT0lOVF9MSUdIVFMgPiAwXFxuXFx0UG9pbnRMaWdodCBwb2ludExpZ2h0O1xcblxcdCNwcmFnbWEgdW5yb2xsX2xvb3BcXG5cXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fUE9JTlRfTElHSFRTOyBpICsrICkge1xcblxcdFxcdHBvaW50TGlnaHQgPSBwb2ludExpZ2h0c1sgaSBdO1xcblxcdFxcdHNoYWRvdyAqPSBib29sKCBwb2ludExpZ2h0LnNoYWRvdyApID8gZ2V0UG9pbnRTaGFkb3coIHBvaW50U2hhZG93TWFwWyBpIF0sIHBvaW50TGlnaHQuc2hhZG93TWFwU2l6ZSwgcG9pbnRMaWdodC5zaGFkb3dCaWFzLCBwb2ludExpZ2h0LnNoYWRvd1JhZGl1cywgdlBvaW50U2hhZG93Q29vcmRbIGkgXSwgcG9pbnRMaWdodC5zaGFkb3dDYW1lcmFOZWFyLCBwb2ludExpZ2h0LnNoYWRvd0NhbWVyYUZhciApIDogMS4wO1xcblxcdH1cXG5cXHQjZW5kaWZcXG5cXHQjZW5kaWZcXG5cXHRyZXR1cm4gc2hhZG93O1xcbn1cXG5cIjtcblxudmFyIHNraW5iYXNlX3ZlcnRleCA9IFwiI2lmZGVmIFVTRV9TS0lOTklOR1xcblxcdG1hdDQgYm9uZU1hdFggPSBnZXRCb25lTWF0cml4KCBza2luSW5kZXgueCApO1xcblxcdG1hdDQgYm9uZU1hdFkgPSBnZXRCb25lTWF0cml4KCBza2luSW5kZXgueSApO1xcblxcdG1hdDQgYm9uZU1hdFogPSBnZXRCb25lTWF0cml4KCBza2luSW5kZXgueiApO1xcblxcdG1hdDQgYm9uZU1hdFcgPSBnZXRCb25lTWF0cml4KCBza2luSW5kZXgudyApO1xcbiNlbmRpZlwiO1xuXG52YXIgc2tpbm5pbmdfcGFyc192ZXJ0ZXggPSBcIiNpZmRlZiBVU0VfU0tJTk5JTkdcXG5cXHR1bmlmb3JtIG1hdDQgYmluZE1hdHJpeDtcXG5cXHR1bmlmb3JtIG1hdDQgYmluZE1hdHJpeEludmVyc2U7XFxuXFx0I2lmZGVmIEJPTkVfVEVYVFVSRVxcblxcdFxcdHVuaWZvcm0gc2FtcGxlcjJEIGJvbmVUZXh0dXJlO1xcblxcdFxcdHVuaWZvcm0gaW50IGJvbmVUZXh0dXJlU2l6ZTtcXG5cXHRcXHRtYXQ0IGdldEJvbmVNYXRyaXgoIGNvbnN0IGluIGZsb2F0IGkgKSB7XFxuXFx0XFx0XFx0ZmxvYXQgaiA9IGkgKiA0LjA7XFxuXFx0XFx0XFx0ZmxvYXQgeCA9IG1vZCggaiwgZmxvYXQoIGJvbmVUZXh0dXJlU2l6ZSApICk7XFxuXFx0XFx0XFx0ZmxvYXQgeSA9IGZsb29yKCBqIC8gZmxvYXQoIGJvbmVUZXh0dXJlU2l6ZSApICk7XFxuXFx0XFx0XFx0ZmxvYXQgZHggPSAxLjAgLyBmbG9hdCggYm9uZVRleHR1cmVTaXplICk7XFxuXFx0XFx0XFx0ZmxvYXQgZHkgPSAxLjAgLyBmbG9hdCggYm9uZVRleHR1cmVTaXplICk7XFxuXFx0XFx0XFx0eSA9IGR5ICogKCB5ICsgMC41ICk7XFxuXFx0XFx0XFx0dmVjNCB2MSA9IHRleHR1cmUyRCggYm9uZVRleHR1cmUsIHZlYzIoIGR4ICogKCB4ICsgMC41ICksIHkgKSApO1xcblxcdFxcdFxcdHZlYzQgdjIgPSB0ZXh0dXJlMkQoIGJvbmVUZXh0dXJlLCB2ZWMyKCBkeCAqICggeCArIDEuNSApLCB5ICkgKTtcXG5cXHRcXHRcXHR2ZWM0IHYzID0gdGV4dHVyZTJEKCBib25lVGV4dHVyZSwgdmVjMiggZHggKiAoIHggKyAyLjUgKSwgeSApICk7XFxuXFx0XFx0XFx0dmVjNCB2NCA9IHRleHR1cmUyRCggYm9uZVRleHR1cmUsIHZlYzIoIGR4ICogKCB4ICsgMy41ICksIHkgKSApO1xcblxcdFxcdFxcdG1hdDQgYm9uZSA9IG1hdDQoIHYxLCB2MiwgdjMsIHY0ICk7XFxuXFx0XFx0XFx0cmV0dXJuIGJvbmU7XFxuXFx0XFx0fVxcblxcdCNlbHNlXFxuXFx0XFx0dW5pZm9ybSBtYXQ0IGJvbmVNYXRyaWNlc1sgTUFYX0JPTkVTIF07XFxuXFx0XFx0bWF0NCBnZXRCb25lTWF0cml4KCBjb25zdCBpbiBmbG9hdCBpICkge1xcblxcdFxcdFxcdG1hdDQgYm9uZSA9IGJvbmVNYXRyaWNlc1sgaW50KGkpIF07XFxuXFx0XFx0XFx0cmV0dXJuIGJvbmU7XFxuXFx0XFx0fVxcblxcdCNlbmRpZlxcbiNlbmRpZlxcblwiO1xuXG52YXIgc2tpbm5pbmdfdmVydGV4ID0gXCIjaWZkZWYgVVNFX1NLSU5OSU5HXFxuXFx0dmVjNCBza2luVmVydGV4ID0gYmluZE1hdHJpeCAqIHZlYzQoIHRyYW5zZm9ybWVkLCAxLjAgKTtcXG5cXHR2ZWM0IHNraW5uZWQgPSB2ZWM0KCAwLjAgKTtcXG5cXHRza2lubmVkICs9IGJvbmVNYXRYICogc2tpblZlcnRleCAqIHNraW5XZWlnaHQueDtcXG5cXHRza2lubmVkICs9IGJvbmVNYXRZICogc2tpblZlcnRleCAqIHNraW5XZWlnaHQueTtcXG5cXHRza2lubmVkICs9IGJvbmVNYXRaICogc2tpblZlcnRleCAqIHNraW5XZWlnaHQuejtcXG5cXHRza2lubmVkICs9IGJvbmVNYXRXICogc2tpblZlcnRleCAqIHNraW5XZWlnaHQudztcXG5cXHR0cmFuc2Zvcm1lZCA9ICggYmluZE1hdHJpeEludmVyc2UgKiBza2lubmVkICkueHl6O1xcbiNlbmRpZlxcblwiO1xuXG52YXIgc2tpbm5vcm1hbF92ZXJ0ZXggPSBcIiNpZmRlZiBVU0VfU0tJTk5JTkdcXG5cXHRtYXQ0IHNraW5NYXRyaXggPSBtYXQ0KCAwLjAgKTtcXG5cXHRza2luTWF0cml4ICs9IHNraW5XZWlnaHQueCAqIGJvbmVNYXRYO1xcblxcdHNraW5NYXRyaXggKz0gc2tpbldlaWdodC55ICogYm9uZU1hdFk7XFxuXFx0c2tpbk1hdHJpeCArPSBza2luV2VpZ2h0LnogKiBib25lTWF0WjtcXG5cXHRza2luTWF0cml4ICs9IHNraW5XZWlnaHQudyAqIGJvbmVNYXRXO1xcblxcdHNraW5NYXRyaXggID0gYmluZE1hdHJpeEludmVyc2UgKiBza2luTWF0cml4ICogYmluZE1hdHJpeDtcXG5cXHRvYmplY3ROb3JtYWwgPSB2ZWM0KCBza2luTWF0cml4ICogdmVjNCggb2JqZWN0Tm9ybWFsLCAwLjAgKSApLnh5ejtcXG4jZW5kaWZcXG5cIjtcblxudmFyIHNwZWN1bGFybWFwX2ZyYWdtZW50ID0gXCJmbG9hdCBzcGVjdWxhclN0cmVuZ3RoO1xcbiNpZmRlZiBVU0VfU1BFQ1VMQVJNQVBcXG5cXHR2ZWM0IHRleGVsU3BlY3VsYXIgPSB0ZXh0dXJlMkQoIHNwZWN1bGFyTWFwLCB2VXYgKTtcXG5cXHRzcGVjdWxhclN0cmVuZ3RoID0gdGV4ZWxTcGVjdWxhci5yO1xcbiNlbHNlXFxuXFx0c3BlY3VsYXJTdHJlbmd0aCA9IDEuMDtcXG4jZW5kaWZcIjtcblxudmFyIHNwZWN1bGFybWFwX3BhcnNfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfU1BFQ1VMQVJNQVBcXG5cXHR1bmlmb3JtIHNhbXBsZXIyRCBzcGVjdWxhck1hcDtcXG4jZW5kaWZcIjtcblxudmFyIHRvbmVtYXBwaW5nX2ZyYWdtZW50ID0gXCIjaWYgZGVmaW5lZCggVE9ORV9NQVBQSU5HIClcXG4gIGdsX0ZyYWdDb2xvci5yZ2IgPSB0b25lTWFwcGluZyggZ2xfRnJhZ0NvbG9yLnJnYiApO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgdG9uZW1hcHBpbmdfcGFyc19mcmFnbWVudCA9IFwiI2lmbmRlZiBzYXR1cmF0ZVxcblxcdCNkZWZpbmUgc2F0dXJhdGUoYSkgY2xhbXAoIGEsIDAuMCwgMS4wIClcXG4jZW5kaWZcXG51bmlmb3JtIGZsb2F0IHRvbmVNYXBwaW5nRXhwb3N1cmU7XFxudW5pZm9ybSBmbG9hdCB0b25lTWFwcGluZ1doaXRlUG9pbnQ7XFxudmVjMyBMaW5lYXJUb25lTWFwcGluZyggdmVjMyBjb2xvciApIHtcXG5cXHRyZXR1cm4gdG9uZU1hcHBpbmdFeHBvc3VyZSAqIGNvbG9yO1xcbn1cXG52ZWMzIFJlaW5oYXJkVG9uZU1hcHBpbmcoIHZlYzMgY29sb3IgKSB7XFxuXFx0Y29sb3IgKj0gdG9uZU1hcHBpbmdFeHBvc3VyZTtcXG5cXHRyZXR1cm4gc2F0dXJhdGUoIGNvbG9yIC8gKCB2ZWMzKCAxLjAgKSArIGNvbG9yICkgKTtcXG59XFxuI2RlZmluZSBVbmNoYXJ0ZWQySGVscGVyKCB4ICkgbWF4KCAoICggeCAqICggMC4xNSAqIHggKyAwLjEwICogMC41MCApICsgMC4yMCAqIDAuMDIgKSAvICggeCAqICggMC4xNSAqIHggKyAwLjUwICkgKyAwLjIwICogMC4zMCApICkgLSAwLjAyIC8gMC4zMCwgdmVjMyggMC4wICkgKVxcbnZlYzMgVW5jaGFydGVkMlRvbmVNYXBwaW5nKCB2ZWMzIGNvbG9yICkge1xcblxcdGNvbG9yICo9IHRvbmVNYXBwaW5nRXhwb3N1cmU7XFxuXFx0cmV0dXJuIHNhdHVyYXRlKCBVbmNoYXJ0ZWQySGVscGVyKCBjb2xvciApIC8gVW5jaGFydGVkMkhlbHBlciggdmVjMyggdG9uZU1hcHBpbmdXaGl0ZVBvaW50ICkgKSApO1xcbn1cXG52ZWMzIE9wdGltaXplZENpbmVvblRvbmVNYXBwaW5nKCB2ZWMzIGNvbG9yICkge1xcblxcdGNvbG9yICo9IHRvbmVNYXBwaW5nRXhwb3N1cmU7XFxuXFx0Y29sb3IgPSBtYXgoIHZlYzMoIDAuMCApLCBjb2xvciAtIDAuMDA0ICk7XFxuXFx0cmV0dXJuIHBvdyggKCBjb2xvciAqICggNi4yICogY29sb3IgKyAwLjUgKSApIC8gKCBjb2xvciAqICggNi4yICogY29sb3IgKyAxLjcgKSArIDAuMDYgKSwgdmVjMyggMi4yICkgKTtcXG59XFxuXCI7XG5cbnZhciB1dl9wYXJzX2ZyYWdtZW50ID0gXCIjaWYgZGVmaW5lZCggVVNFX01BUCApIHx8IGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVVNFX05PUk1BTE1BUCApIHx8IGRlZmluZWQoIFVTRV9TUEVDVUxBUk1BUCApIHx8IGRlZmluZWQoIFVTRV9BTFBIQU1BUCApIHx8IGRlZmluZWQoIFVTRV9FTUlTU0lWRU1BUCApIHx8IGRlZmluZWQoIFVTRV9ST1VHSE5FU1NNQVAgKSB8fCBkZWZpbmVkKCBVU0VfTUVUQUxORVNTTUFQIClcXG5cXHR2YXJ5aW5nIHZlYzIgdlV2O1xcbiNlbmRpZlwiO1xuXG52YXIgdXZfcGFyc192ZXJ0ZXggPSBcIiNpZiBkZWZpbmVkKCBVU0VfTUFQICkgfHwgZGVmaW5lZCggVVNFX0JVTVBNQVAgKSB8fCBkZWZpbmVkKCBVU0VfTk9STUFMTUFQICkgfHwgZGVmaW5lZCggVVNFX1NQRUNVTEFSTUFQICkgfHwgZGVmaW5lZCggVVNFX0FMUEhBTUFQICkgfHwgZGVmaW5lZCggVVNFX0VNSVNTSVZFTUFQICkgfHwgZGVmaW5lZCggVVNFX1JPVUdITkVTU01BUCApIHx8IGRlZmluZWQoIFVTRV9NRVRBTE5FU1NNQVAgKVxcblxcdHZhcnlpbmcgdmVjMiB2VXY7XFxuXFx0dW5pZm9ybSBtYXQzIHV2VHJhbnNmb3JtO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgdXZfdmVydGV4ID0gXCIjaWYgZGVmaW5lZCggVVNFX01BUCApIHx8IGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVVNFX05PUk1BTE1BUCApIHx8IGRlZmluZWQoIFVTRV9TUEVDVUxBUk1BUCApIHx8IGRlZmluZWQoIFVTRV9BTFBIQU1BUCApIHx8IGRlZmluZWQoIFVTRV9FTUlTU0lWRU1BUCApIHx8IGRlZmluZWQoIFVTRV9ST1VHSE5FU1NNQVAgKSB8fCBkZWZpbmVkKCBVU0VfTUVUQUxORVNTTUFQIClcXG5cXHR2VXYgPSAoIHV2VHJhbnNmb3JtICogdmVjMyggdXYsIDEgKSApLnh5O1xcbiNlbmRpZlwiO1xuXG52YXIgdXYyX3BhcnNfZnJhZ21lbnQgPSBcIiNpZiBkZWZpbmVkKCBVU0VfTElHSFRNQVAgKSB8fCBkZWZpbmVkKCBVU0VfQU9NQVAgKVxcblxcdHZhcnlpbmcgdmVjMiB2VXYyO1xcbiNlbmRpZlwiO1xuXG52YXIgdXYyX3BhcnNfdmVydGV4ID0gXCIjaWYgZGVmaW5lZCggVVNFX0xJR0hUTUFQICkgfHwgZGVmaW5lZCggVVNFX0FPTUFQIClcXG5cXHRhdHRyaWJ1dGUgdmVjMiB1djI7XFxuXFx0dmFyeWluZyB2ZWMyIHZVdjI7XFxuI2VuZGlmXCI7XG5cbnZhciB1djJfdmVydGV4ID0gXCIjaWYgZGVmaW5lZCggVVNFX0xJR0hUTUFQICkgfHwgZGVmaW5lZCggVVNFX0FPTUFQIClcXG5cXHR2VXYyID0gdXYyO1xcbiNlbmRpZlwiO1xuXG52YXIgd29ybGRwb3NfdmVydGV4ID0gXCIjaWYgZGVmaW5lZCggVVNFX0VOVk1BUCApIHx8IGRlZmluZWQoIERJU1RBTkNFICkgfHwgZGVmaW5lZCAoIFVTRV9TSEFET1dNQVAgKVxcblxcdHZlYzQgd29ybGRQb3NpdGlvbiA9IG1vZGVsTWF0cml4ICogdmVjNCggdHJhbnNmb3JtZWQsIDEuMCApO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgY3ViZV9mcmFnID0gXCJ1bmlmb3JtIHNhbXBsZXJDdWJlIHRDdWJlO1xcbnVuaWZvcm0gZmxvYXQgdEZsaXA7XFxudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xcbnZhcnlpbmcgdmVjMyB2V29ybGRQb3NpdGlvbjtcXG52b2lkIG1haW4oKSB7XFxuXFx0Z2xfRnJhZ0NvbG9yID0gdGV4dHVyZUN1YmUoIHRDdWJlLCB2ZWMzKCB0RmxpcCAqIHZXb3JsZFBvc2l0aW9uLngsIHZXb3JsZFBvc2l0aW9uLnl6ICkgKTtcXG5cXHRnbF9GcmFnQ29sb3IuYSAqPSBvcGFjaXR5O1xcbn1cXG5cIjtcblxudmFyIGN1YmVfdmVydCA9IFwidmFyeWluZyB2ZWMzIHZXb3JsZFBvc2l0aW9uO1xcbiNpbmNsdWRlIDxjb21tb24+XFxudm9pZCBtYWluKCkge1xcblxcdHZXb3JsZFBvc2l0aW9uID0gdHJhbnNmb3JtRGlyZWN0aW9uKCBwb3NpdGlvbiwgbW9kZWxNYXRyaXggKTtcXG5cXHQjaW5jbHVkZSA8YmVnaW5fdmVydGV4PlxcblxcdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cXG5cXHRnbF9Qb3NpdGlvbi56ID0gZ2xfUG9zaXRpb24udztcXG59XFxuXCI7XG5cbnZhciBkZXB0aF9mcmFnID0gXCIjaWYgREVQVEhfUEFDS0lORyA9PSAzMjAwXFxuXFx0dW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xcbiNlbmRpZlxcbiNpbmNsdWRlIDxjb21tb24+XFxuI2luY2x1ZGUgPHBhY2tpbmc+XFxuI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPG1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxhbHBoYW1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD5cXG52b2lkIG1haW4oKSB7XFxuXFx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD5cXG5cXHR2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIDEuMCApO1xcblxcdCNpZiBERVBUSF9QQUNLSU5HID09IDMyMDBcXG5cXHRcXHRkaWZmdXNlQ29sb3IuYSA9IG9wYWNpdHk7XFxuXFx0I2VuZGlmXFxuXFx0I2luY2x1ZGUgPG1hcF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8YWxwaGFtYXBfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGFscGhhdGVzdF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+XFxuXFx0I2lmIERFUFRIX1BBQ0tJTkcgPT0gMzIwMFxcblxcdFxcdGdsX0ZyYWdDb2xvciA9IHZlYzQoIHZlYzMoIDEuMCAtIGdsX0ZyYWdDb29yZC56ICksIG9wYWNpdHkgKTtcXG5cXHQjZWxpZiBERVBUSF9QQUNLSU5HID09IDMyMDFcXG5cXHRcXHRnbF9GcmFnQ29sb3IgPSBwYWNrRGVwdGhUb1JHQkEoIGdsX0ZyYWdDb29yZC56ICk7XFxuXFx0I2VuZGlmXFxufVxcblwiO1xuXG52YXIgZGVwdGhfdmVydCA9IFwiI2luY2x1ZGUgPGNvbW1vbj5cXG4jaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPHNraW5uaW5nX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4PlxcbnZvaWQgbWFpbigpIHtcXG5cXHQjaW5jbHVkZSA8dXZfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2luYmFzZV92ZXJ0ZXg+XFxuXFx0I2lmZGVmIFVTRV9ESVNQTEFDRU1FTlRNQVBcXG5cXHRcXHQjaW5jbHVkZSA8YmVnaW5ub3JtYWxfdmVydGV4PlxcblxcdFxcdCNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+XFxuXFx0XFx0I2luY2x1ZGUgPHNraW5ub3JtYWxfdmVydGV4PlxcblxcdCNlbmRpZlxcblxcdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2tpbm5pbmdfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4Plxcbn1cXG5cIjtcblxudmFyIGRpc3RhbmNlUkdCQV9mcmFnID0gXCIjZGVmaW5lIERJU1RBTkNFXFxudW5pZm9ybSB2ZWMzIHJlZmVyZW5jZVBvc2l0aW9uO1xcbnVuaWZvcm0gZmxvYXQgbmVhckRpc3RhbmNlO1xcbnVuaWZvcm0gZmxvYXQgZmFyRGlzdGFuY2U7XFxudmFyeWluZyB2ZWMzIHZXb3JsZFBvc2l0aW9uO1xcbiNpbmNsdWRlIDxjb21tb24+XFxuI2luY2x1ZGUgPHBhY2tpbmc+XFxuI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPG1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxhbHBoYW1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD5cXG52b2lkIG1haW4gKCkge1xcblxcdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+XFxuXFx0dmVjNCBkaWZmdXNlQ29sb3IgPSB2ZWM0KCAxLjAgKTtcXG5cXHQjaW5jbHVkZSA8bWFwX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxhbHBoYW1hcF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8YWxwaGF0ZXN0X2ZyYWdtZW50PlxcblxcdGZsb2F0IGRpc3QgPSBsZW5ndGgoIHZXb3JsZFBvc2l0aW9uIC0gcmVmZXJlbmNlUG9zaXRpb24gKTtcXG5cXHRkaXN0ID0gKCBkaXN0IC0gbmVhckRpc3RhbmNlICkgLyAoIGZhckRpc3RhbmNlIC0gbmVhckRpc3RhbmNlICk7XFxuXFx0ZGlzdCA9IHNhdHVyYXRlKCBkaXN0ICk7XFxuXFx0Z2xfRnJhZ0NvbG9yID0gcGFja0RlcHRoVG9SR0JBKCBkaXN0ICk7XFxufVxcblwiO1xuXG52YXIgZGlzdGFuY2VSR0JBX3ZlcnQgPSBcIiNkZWZpbmUgRElTVEFOQ0VcXG52YXJ5aW5nIHZlYzMgdldvcmxkUG9zaXRpb247XFxuI2luY2x1ZGUgPGNvbW1vbj5cXG4jaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPHNraW5uaW5nX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+XFxudm9pZCBtYWluKCkge1xcblxcdCNpbmNsdWRlIDx1dl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHNraW5iYXNlX3ZlcnRleD5cXG5cXHQjaWZkZWYgVVNFX0RJU1BMQUNFTUVOVE1BUFxcblxcdFxcdCNpbmNsdWRlIDxiZWdpbm5vcm1hbF92ZXJ0ZXg+XFxuXFx0XFx0I2luY2x1ZGUgPG1vcnBobm9ybWFsX3ZlcnRleD5cXG5cXHRcXHQjaW5jbHVkZSA8c2tpbm5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2VuZGlmXFxuXFx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxcblxcdCNpbmNsdWRlIDx3b3JsZHBvc192ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+XFxuXFx0dldvcmxkUG9zaXRpb24gPSB3b3JsZFBvc2l0aW9uLnh5ejtcXG59XFxuXCI7XG5cbnZhciBlcXVpcmVjdF9mcmFnID0gXCJ1bmlmb3JtIHNhbXBsZXIyRCB0RXF1aXJlY3Q7XFxudmFyeWluZyB2ZWMzIHZXb3JsZFBvc2l0aW9uO1xcbiNpbmNsdWRlIDxjb21tb24+XFxudm9pZCBtYWluKCkge1xcblxcdHZlYzMgZGlyZWN0aW9uID0gbm9ybWFsaXplKCB2V29ybGRQb3NpdGlvbiApO1xcblxcdHZlYzIgc2FtcGxlVVY7XFxuXFx0c2FtcGxlVVYueSA9IGFzaW4oIGNsYW1wKCBkaXJlY3Rpb24ueSwgLSAxLjAsIDEuMCApICkgKiBSRUNJUFJPQ0FMX1BJICsgMC41O1xcblxcdHNhbXBsZVVWLnggPSBhdGFuKCBkaXJlY3Rpb24ueiwgZGlyZWN0aW9uLnggKSAqIFJFQ0lQUk9DQUxfUEkyICsgMC41O1xcblxcdGdsX0ZyYWdDb2xvciA9IHRleHR1cmUyRCggdEVxdWlyZWN0LCBzYW1wbGVVViApO1xcbn1cXG5cIjtcblxudmFyIGVxdWlyZWN0X3ZlcnQgPSBcInZhcnlpbmcgdmVjMyB2V29ybGRQb3NpdGlvbjtcXG4jaW5jbHVkZSA8Y29tbW9uPlxcbnZvaWQgbWFpbigpIHtcXG5cXHR2V29ybGRQb3NpdGlvbiA9IHRyYW5zZm9ybURpcmVjdGlvbiggcG9zaXRpb24sIG1vZGVsTWF0cml4ICk7XFxuXFx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XFxufVxcblwiO1xuXG52YXIgbGluZWRhc2hlZF9mcmFnID0gXCJ1bmlmb3JtIHZlYzMgZGlmZnVzZTtcXG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XFxudW5pZm9ybSBmbG9hdCBkYXNoU2l6ZTtcXG51bmlmb3JtIGZsb2F0IHRvdGFsU2l6ZTtcXG52YXJ5aW5nIGZsb2F0IHZMaW5lRGlzdGFuY2U7XFxuI2luY2x1ZGUgPGNvbW1vbj5cXG4jaW5jbHVkZSA8Y29sb3JfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50PlxcbnZvaWQgbWFpbigpIHtcXG5cXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxcblxcdGlmICggbW9kKCB2TGluZURpc3RhbmNlLCB0b3RhbFNpemUgKSA+IGRhc2hTaXplICkge1xcblxcdFxcdGRpc2NhcmQ7XFxuXFx0fVxcblxcdHZlYzMgb3V0Z29pbmdMaWdodCA9IHZlYzMoIDAuMCApO1xcblxcdHZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApO1xcblxcdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8Y29sb3JfZnJhZ21lbnQ+XFxuXFx0b3V0Z29pbmdMaWdodCA9IGRpZmZ1c2VDb2xvci5yZ2I7XFxuXFx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggb3V0Z29pbmdMaWdodCwgZGlmZnVzZUNvbG9yLmEgKTtcXG5cXHQjaW5jbHVkZSA8cHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGVuY29kaW5nc19mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8Zm9nX2ZyYWdtZW50Plxcbn1cXG5cIjtcblxudmFyIGxpbmVkYXNoZWRfdmVydCA9IFwidW5pZm9ybSBmbG9hdCBzY2FsZTtcXG5hdHRyaWJ1dGUgZmxvYXQgbGluZURpc3RhbmNlO1xcbnZhcnlpbmcgZmxvYXQgdkxpbmVEaXN0YW5jZTtcXG4jaW5jbHVkZSA8Y29tbW9uPlxcbiNpbmNsdWRlIDxjb2xvcl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8Zm9nX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4PlxcbnZvaWQgbWFpbigpIHtcXG5cXHQjaW5jbHVkZSA8Y29sb3JfdmVydGV4PlxcblxcdHZMaW5lRGlzdGFuY2UgPSBzY2FsZSAqIGxpbmVEaXN0YW5jZTtcXG5cXHR2ZWM0IG12UG9zaXRpb24gPSBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KCBwb3NpdGlvbiwgMS4wICk7XFxuXFx0Z2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbXZQb3NpdGlvbjtcXG5cXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxmb2dfdmVydGV4Plxcbn1cXG5cIjtcblxudmFyIG1lc2hiYXNpY19mcmFnID0gXCJ1bmlmb3JtIHZlYzMgZGlmZnVzZTtcXG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XFxuI2lmbmRlZiBGTEFUX1NIQURFRFxcblxcdHZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xcbiNlbmRpZlxcbiNpbmNsdWRlIDxjb21tb24+XFxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHV2Ml9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8YWxwaGFtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8YW9tYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bGlnaHRtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8ZW52bWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGZvZ19wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxzcGVjdWxhcm1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD5cXG52b2lkIG1haW4oKSB7XFxuXFx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD5cXG5cXHR2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTtcXG5cXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPG1hcF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8Y29sb3JfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGFscGhhbWFwX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPHNwZWN1bGFybWFwX2ZyYWdtZW50PlxcblxcdFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ID0gUmVmbGVjdGVkTGlnaHQoIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApICk7XFxuXFx0I2lmZGVmIFVTRV9MSUdIVE1BUFxcblxcdFxcdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArPSB0ZXh0dXJlMkQoIGxpZ2h0TWFwLCB2VXYyICkueHl6ICogbGlnaHRNYXBJbnRlbnNpdHk7XFxuXFx0I2Vsc2VcXG5cXHRcXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKz0gdmVjMyggMS4wICk7XFxuXFx0I2VuZGlmXFxuXFx0I2luY2x1ZGUgPGFvbWFwX2ZyYWdtZW50PlxcblxcdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSAqPSBkaWZmdXNlQ29sb3IucmdiO1xcblxcdHZlYzMgb3V0Z29pbmdMaWdodCA9IHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZTtcXG5cXHQjaW5jbHVkZSA8ZW52bWFwX2ZyYWdtZW50PlxcblxcdGdsX0ZyYWdDb2xvciA9IHZlYzQoIG91dGdvaW5nTGlnaHQsIGRpZmZ1c2VDb2xvci5hICk7XFxuXFx0I2luY2x1ZGUgPHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxlbmNvZGluZ3NfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGZvZ19mcmFnbWVudD5cXG59XFxuXCI7XG5cbnZhciBtZXNoYmFzaWNfdmVydCA9IFwiI2luY2x1ZGUgPGNvbW1vbj5cXG4jaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPHV2Ml9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8ZW52bWFwX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxjb2xvcl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8Zm9nX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+XFxudm9pZCBtYWluKCkge1xcblxcdCNpbmNsdWRlIDx1dl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHV2Ml92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGNvbG9yX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PlxcblxcdCNpZmRlZiBVU0VfRU5WTUFQXFxuXFx0I2luY2x1ZGUgPGJlZ2lubm9ybWFsX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bW9ycGhub3JtYWxfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2lubm9ybWFsX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8ZGVmYXVsdG5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2VuZGlmXFxuXFx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHdvcmxkcG9zX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8ZW52bWFwX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8Zm9nX3ZlcnRleD5cXG59XFxuXCI7XG5cbnZhciBtZXNobGFtYmVydF9mcmFnID0gXCJ1bmlmb3JtIHZlYzMgZGlmZnVzZTtcXG51bmlmb3JtIHZlYzMgZW1pc3NpdmU7XFxudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xcbnZhcnlpbmcgdmVjMyB2TGlnaHRGcm9udDtcXG4jaWZkZWYgRE9VQkxFX1NJREVEXFxuXFx0dmFyeWluZyB2ZWMzIHZMaWdodEJhY2s7XFxuI2VuZGlmXFxuI2luY2x1ZGUgPGNvbW1vbj5cXG4jaW5jbHVkZSA8cGFja2luZz5cXG4jaW5jbHVkZSA8ZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHV2Ml9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8YWxwaGFtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8YW9tYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bGlnaHRtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8ZW1pc3NpdmVtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8ZW52bWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGJzZGZzPlxcbiNpbmNsdWRlIDxsaWdodHNfcGFyc19iZWdpbj5cXG4jaW5jbHVkZSA8bGlnaHRzX3BhcnNfbWFwcz5cXG4jaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxzaGFkb3dtYXNrX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHNwZWN1bGFybWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50PlxcbnZvaWQgbWFpbigpIHtcXG5cXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxcblxcdHZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApO1xcblxcdFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ID0gUmVmbGVjdGVkTGlnaHQoIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApICk7XFxuXFx0dmVjMyB0b3RhbEVtaXNzaXZlUmFkaWFuY2UgPSBlbWlzc2l2ZTtcXG5cXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPG1hcF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8Y29sb3JfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGFscGhhbWFwX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPHNwZWN1bGFybWFwX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxlbWlzc2l2ZW1hcF9mcmFnbWVudD5cXG5cXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgPSBnZXRBbWJpZW50TGlnaHRJcnJhZGlhbmNlKCBhbWJpZW50TGlnaHRDb2xvciApO1xcblxcdCNpbmNsdWRlIDxsaWdodG1hcF9mcmFnbWVudD5cXG5cXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKj0gQlJERl9EaWZmdXNlX0xhbWJlcnQoIGRpZmZ1c2VDb2xvci5yZ2IgKTtcXG5cXHQjaWZkZWYgRE9VQkxFX1NJREVEXFxuXFx0XFx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSA9ICggZ2xfRnJvbnRGYWNpbmcgKSA/IHZMaWdodEZyb250IDogdkxpZ2h0QmFjaztcXG5cXHQjZWxzZVxcblxcdFxcdHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgPSB2TGlnaHRGcm9udDtcXG5cXHQjZW5kaWZcXG5cXHRyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICo9IEJSREZfRGlmZnVzZV9MYW1iZXJ0KCBkaWZmdXNlQ29sb3IucmdiICkgKiBnZXRTaGFkb3dNYXNrKCk7XFxuXFx0I2luY2x1ZGUgPGFvbWFwX2ZyYWdtZW50PlxcblxcdHZlYzMgb3V0Z29pbmdMaWdodCA9IHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKyByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKyB0b3RhbEVtaXNzaXZlUmFkaWFuY2U7XFxuXFx0I2luY2x1ZGUgPGVudm1hcF9mcmFnbWVudD5cXG5cXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KCBvdXRnb2luZ0xpZ2h0LCBkaWZmdXNlQ29sb3IuYSApO1xcblxcdCNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8ZW5jb2RpbmdzX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxmb2dfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGRpdGhlcmluZ19mcmFnbWVudD5cXG59XFxuXCI7XG5cbnZhciBtZXNobGFtYmVydF92ZXJ0ID0gXCIjZGVmaW5lIExBTUJFUlRcXG52YXJ5aW5nIHZlYzMgdkxpZ2h0RnJvbnQ7XFxuI2lmZGVmIERPVUJMRV9TSURFRFxcblxcdHZhcnlpbmcgdmVjMyB2TGlnaHRCYWNrO1xcbiNlbmRpZlxcbiNpbmNsdWRlIDxjb21tb24+XFxuI2luY2x1ZGUgPHV2X3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDx1djJfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGVudm1hcF9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8YnNkZnM+XFxuI2luY2x1ZGUgPGxpZ2h0c19wYXJzX2JlZ2luPlxcbiNpbmNsdWRlIDxsaWdodHNfcGFyc19tYXBzPlxcbiNpbmNsdWRlIDxjb2xvcl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8Zm9nX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD5cXG52b2lkIG1haW4oKSB7XFxuXFx0I2luY2x1ZGUgPHV2X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8dXYyX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8Y29sb3JfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxiZWdpbm5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPG1vcnBobm9ybWFsX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2lubm9ybWFsX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8ZGVmYXVsdG5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHdvcmxkcG9zX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8ZW52bWFwX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bGlnaHRzX2xhbWJlcnRfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxzaGFkb3dtYXBfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxmb2dfdmVydGV4Plxcbn1cXG5cIjtcblxudmFyIG1lc2hwaG9uZ19mcmFnID0gXCIjZGVmaW5lIFBIT05HXFxudW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XFxudW5pZm9ybSB2ZWMzIGVtaXNzaXZlO1xcbnVuaWZvcm0gdmVjMyBzcGVjdWxhcjtcXG51bmlmb3JtIGZsb2F0IHNoaW5pbmVzcztcXG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XFxuI2luY2x1ZGUgPGNvbW1vbj5cXG4jaW5jbHVkZSA8cGFja2luZz5cXG4jaW5jbHVkZSA8ZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHV2Ml9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8YWxwaGFtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8YW9tYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bGlnaHRtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8ZW1pc3NpdmVtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8ZW52bWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGdyYWRpZW50bWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGZvZ19wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxic2Rmcz5cXG4jaW5jbHVkZSA8bGlnaHRzX3BhcnNfYmVnaW4+XFxuI2luY2x1ZGUgPGxpZ2h0c19wYXJzX21hcHM+XFxuI2luY2x1ZGUgPGxpZ2h0c19waG9uZ19wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8YnVtcG1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxub3JtYWxtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8c3BlY3VsYXJtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+XFxudm9pZCBtYWluKCkge1xcblxcdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+XFxuXFx0dmVjNCBkaWZmdXNlQ29sb3IgPSB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7XFxuXFx0UmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgPSBSZWZsZWN0ZWRMaWdodCggdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICkgKTtcXG5cXHR2ZWMzIHRvdGFsRW1pc3NpdmVSYWRpYW5jZSA9IGVtaXNzaXZlO1xcblxcdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8bWFwX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxjb2xvcl9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8YWxwaGFtYXBfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGFscGhhdGVzdF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8c3BlY3VsYXJtYXBfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudF9iZWdpbj5cXG5cXHQjaW5jbHVkZSA8bm9ybWFsX2ZyYWdtZW50X21hcHM+XFxuXFx0I2luY2x1ZGUgPGVtaXNzaXZlbWFwX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxsaWdodHNfcGhvbmdfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGxpZ2h0c19mcmFnbWVudF9iZWdpbj5cXG5cXHQjaW5jbHVkZSA8bGlnaHRzX2ZyYWdtZW50X21hcHM+XFxuXFx0I2luY2x1ZGUgPGxpZ2h0c19mcmFnbWVudF9lbmQ+XFxuXFx0I2luY2x1ZGUgPGFvbWFwX2ZyYWdtZW50PlxcblxcdHZlYzMgb3V0Z29pbmdMaWdodCA9IHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKyByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKyByZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArIHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0U3BlY3VsYXIgKyB0b3RhbEVtaXNzaXZlUmFkaWFuY2U7XFxuXFx0I2luY2x1ZGUgPGVudm1hcF9mcmFnbWVudD5cXG5cXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KCBvdXRnb2luZ0xpZ2h0LCBkaWZmdXNlQ29sb3IuYSApO1xcblxcdCNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8ZW5jb2RpbmdzX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxmb2dfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGRpdGhlcmluZ19mcmFnbWVudD5cXG59XFxuXCI7XG5cbnZhciBtZXNocGhvbmdfdmVydCA9IFwiI2RlZmluZSBQSE9OR1xcbnZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xcbiNpZm5kZWYgRkxBVF9TSEFERURcXG5cXHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcXG4jZW5kaWZcXG4jaW5jbHVkZSA8Y29tbW9uPlxcbiNpbmNsdWRlIDx1dl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8dXYyX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGVudm1hcF9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8Y29sb3JfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPHNraW5uaW5nX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+XFxudm9pZCBtYWluKCkge1xcblxcdCNpbmNsdWRlIDx1dl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHV2Ml92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGNvbG9yX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8YmVnaW5ub3JtYWxfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHNraW5iYXNlX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2tpbm5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGRlZmF1bHRub3JtYWxfdmVydGV4PlxcbiNpZm5kZWYgRkxBVF9TSEFERURcXG5cXHR2Tm9ybWFsID0gbm9ybWFsaXplKCB0cmFuc2Zvcm1lZE5vcm1hbCApO1xcbiNlbmRpZlxcblxcdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2tpbm5pbmdfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PlxcblxcdHZWaWV3UG9zaXRpb24gPSAtIG12UG9zaXRpb24ueHl6O1xcblxcdCNpbmNsdWRlIDx3b3JsZHBvc192ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGVudm1hcF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHNoYWRvd21hcF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGZvZ192ZXJ0ZXg+XFxufVxcblwiO1xuXG52YXIgbWVzaHBoeXNpY2FsX2ZyYWcgPSBcIiNkZWZpbmUgUEhZU0lDQUxcXG51bmlmb3JtIHZlYzMgZGlmZnVzZTtcXG51bmlmb3JtIHZlYzMgZW1pc3NpdmU7XFxudW5pZm9ybSBmbG9hdCByb3VnaG5lc3M7XFxudW5pZm9ybSBmbG9hdCBtZXRhbG5lc3M7XFxudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xcbiNpZm5kZWYgU1RBTkRBUkRcXG5cXHR1bmlmb3JtIGZsb2F0IGNsZWFyQ29hdDtcXG5cXHR1bmlmb3JtIGZsb2F0IGNsZWFyQ29hdFJvdWdobmVzcztcXG4jZW5kaWZcXG52YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcXG4jaWZuZGVmIEZMQVRfU0hBREVEXFxuXFx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XFxuI2VuZGlmXFxuI2luY2x1ZGUgPGNvbW1vbj5cXG4jaW5jbHVkZSA8cGFja2luZz5cXG4jaW5jbHVkZSA8ZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHV2Ml9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8YWxwaGFtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8YW9tYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bGlnaHRtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8ZW1pc3NpdmVtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8ZW52bWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGZvZ19wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxic2Rmcz5cXG4jaW5jbHVkZSA8Y3ViZV91dl9yZWZsZWN0aW9uX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxsaWdodHNfcGFyc19iZWdpbj5cXG4jaW5jbHVkZSA8bGlnaHRzX3BhcnNfbWFwcz5cXG4jaW5jbHVkZSA8bGlnaHRzX3BoeXNpY2FsX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxidW1wbWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPG5vcm1hbG1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxyb3VnaG5lc3NtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bWV0YWxuZXNzbWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50PlxcbnZvaWQgbWFpbigpIHtcXG5cXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxcblxcdHZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApO1xcblxcdFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ID0gUmVmbGVjdGVkTGlnaHQoIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApICk7XFxuXFx0dmVjMyB0b3RhbEVtaXNzaXZlUmFkaWFuY2UgPSBlbWlzc2l2ZTtcXG5cXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPG1hcF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8Y29sb3JfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGFscGhhbWFwX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPHJvdWdobmVzc21hcF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8bWV0YWxuZXNzbWFwX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxub3JtYWxfZnJhZ21lbnRfYmVnaW4+XFxuXFx0I2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudF9tYXBzPlxcblxcdCNpbmNsdWRlIDxlbWlzc2l2ZW1hcF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8bGlnaHRzX3BoeXNpY2FsX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxsaWdodHNfZnJhZ21lbnRfYmVnaW4+XFxuXFx0I2luY2x1ZGUgPGxpZ2h0c19mcmFnbWVudF9tYXBzPlxcblxcdCNpbmNsdWRlIDxsaWdodHNfZnJhZ21lbnRfZW5kPlxcblxcdCNpbmNsdWRlIDxhb21hcF9mcmFnbWVudD5cXG5cXHR2ZWMzIG91dGdvaW5nTGlnaHQgPSByZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICsgcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICsgcmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgKyByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyICsgdG90YWxFbWlzc2l2ZVJhZGlhbmNlO1xcblxcdGdsX0ZyYWdDb2xvciA9IHZlYzQoIG91dGdvaW5nTGlnaHQsIGRpZmZ1c2VDb2xvci5hICk7XFxuXFx0I2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxlbmNvZGluZ3NfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGZvZ19mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8cHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8ZGl0aGVyaW5nX2ZyYWdtZW50Plxcbn1cXG5cIjtcblxudmFyIG1lc2hwaHlzaWNhbF92ZXJ0ID0gXCIjZGVmaW5lIFBIWVNJQ0FMXFxudmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XFxuI2lmbmRlZiBGTEFUX1NIQURFRFxcblxcdHZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xcbiNlbmRpZlxcbiNpbmNsdWRlIDxjb21tb24+XFxuI2luY2x1ZGUgPHV2X3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDx1djJfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8Y29sb3JfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPHNraW5uaW5nX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+XFxudm9pZCBtYWluKCkge1xcblxcdCNpbmNsdWRlIDx1dl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHV2Ml92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGNvbG9yX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8YmVnaW5ub3JtYWxfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHNraW5iYXNlX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2tpbm5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGRlZmF1bHRub3JtYWxfdmVydGV4PlxcbiNpZm5kZWYgRkxBVF9TSEFERURcXG5cXHR2Tm9ybWFsID0gbm9ybWFsaXplKCB0cmFuc2Zvcm1lZE5vcm1hbCApO1xcbiNlbmRpZlxcblxcdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2tpbm5pbmdfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PlxcblxcdHZWaWV3UG9zaXRpb24gPSAtIG12UG9zaXRpb24ueHl6O1xcblxcdCNpbmNsdWRlIDx3b3JsZHBvc192ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHNoYWRvd21hcF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGZvZ192ZXJ0ZXg+XFxufVxcblwiO1xuXG52YXIgbm9ybWFsX2ZyYWcgPSBcIiNkZWZpbmUgTk9STUFMXFxudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xcbiNpZiBkZWZpbmVkKCBGTEFUX1NIQURFRCApIHx8IGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVVNFX05PUk1BTE1BUCApXFxuXFx0dmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XFxuI2VuZGlmXFxuI2lmbmRlZiBGTEFUX1NIQURFRFxcblxcdHZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xcbiNlbmRpZlxcbiNpbmNsdWRlIDxwYWNraW5nPlxcbiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxidW1wbWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPG5vcm1hbG1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PlxcbnZvaWQgbWFpbigpIHtcXG5cXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudF9iZWdpbj5cXG5cXHQjaW5jbHVkZSA8bm9ybWFsX2ZyYWdtZW50X21hcHM+XFxuXFx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggcGFja05vcm1hbFRvUkdCKCBub3JtYWwgKSwgb3BhY2l0eSApO1xcbn1cXG5cIjtcblxudmFyIG5vcm1hbF92ZXJ0ID0gXCIjZGVmaW5lIE5PUk1BTFxcbiNpZiBkZWZpbmVkKCBGTEFUX1NIQURFRCApIHx8IGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVVNFX05PUk1BTE1BUCApXFxuXFx0dmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XFxuI2VuZGlmXFxuI2lmbmRlZiBGTEFUX1NIQURFRFxcblxcdHZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xcbiNlbmRpZlxcbiNpbmNsdWRlIDx1dl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PlxcbnZvaWQgbWFpbigpIHtcXG5cXHQjaW5jbHVkZSA8dXZfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxiZWdpbm5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPG1vcnBobm9ybWFsX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2lubm9ybWFsX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8ZGVmYXVsdG5vcm1hbF92ZXJ0ZXg+XFxuI2lmbmRlZiBGTEFUX1NIQURFRFxcblxcdHZOb3JtYWwgPSBub3JtYWxpemUoIHRyYW5zZm9ybWVkTm9ybWFsICk7XFxuI2VuZGlmXFxuXFx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+XFxuI2lmIGRlZmluZWQoIEZMQVRfU0hBREVEICkgfHwgZGVmaW5lZCggVVNFX0JVTVBNQVAgKSB8fCBkZWZpbmVkKCBVU0VfTk9STUFMTUFQIClcXG5cXHR2Vmlld1Bvc2l0aW9uID0gLSBtdlBvc2l0aW9uLnh5ejtcXG4jZW5kaWZcXG59XFxuXCI7XG5cbnZhciBwb2ludHNfZnJhZyA9IFwidW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XFxudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xcbiNpbmNsdWRlIDxjb21tb24+XFxuI2luY2x1ZGUgPHBhY2tpbmc+XFxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPG1hcF9wYXJ0aWNsZV9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxmb2dfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50PlxcbnZvaWQgbWFpbigpIHtcXG5cXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxcblxcdHZlYzMgb3V0Z29pbmdMaWdodCA9IHZlYzMoIDAuMCApO1xcblxcdHZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApO1xcblxcdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8bWFwX3BhcnRpY2xlX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxjb2xvcl9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8YWxwaGF0ZXN0X2ZyYWdtZW50PlxcblxcdG91dGdvaW5nTGlnaHQgPSBkaWZmdXNlQ29sb3IucmdiO1xcblxcdGdsX0ZyYWdDb2xvciA9IHZlYzQoIG91dGdvaW5nTGlnaHQsIGRpZmZ1c2VDb2xvci5hICk7XFxuXFx0I2luY2x1ZGUgPHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxlbmNvZGluZ3NfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGZvZ19mcmFnbWVudD5cXG59XFxuXCI7XG5cbnZhciBwb2ludHNfdmVydCA9IFwidW5pZm9ybSBmbG9hdCBzaXplO1xcbnVuaWZvcm0gZmxvYXQgc2NhbGU7XFxuI2luY2x1ZGUgPGNvbW1vbj5cXG4jaW5jbHVkZSA8Y29sb3JfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4PlxcbnZvaWQgbWFpbigpIHtcXG5cXHQjaW5jbHVkZSA8Y29sb3JfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxcblxcdCNpZmRlZiBVU0VfU0laRUFUVEVOVUFUSU9OXFxuXFx0XFx0Z2xfUG9pbnRTaXplID0gc2l6ZSAqICggc2NhbGUgLyAtIG12UG9zaXRpb24ueiApO1xcblxcdCNlbHNlXFxuXFx0XFx0Z2xfUG9pbnRTaXplID0gc2l6ZTtcXG5cXHQjZW5kaWZcXG5cXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PlxcblxcdCNpbmNsdWRlIDx3b3JsZHBvc192ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHNoYWRvd21hcF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGZvZ192ZXJ0ZXg+XFxufVxcblwiO1xuXG52YXIgc2hhZG93X2ZyYWcgPSBcInVuaWZvcm0gdmVjMyBjb2xvcjtcXG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XFxuI2luY2x1ZGUgPGNvbW1vbj5cXG4jaW5jbHVkZSA8cGFja2luZz5cXG4jaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGJzZGZzPlxcbiNpbmNsdWRlIDxsaWdodHNfcGFyc19iZWdpbj5cXG4jaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHNoYWRvd21hc2tfcGFyc19mcmFnbWVudD5cXG52b2lkIG1haW4oKSB7XFxuXFx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggY29sb3IsIG9wYWNpdHkgKiAoIDEuMCAtIGdldFNoYWRvd01hc2soKSApICk7XFxuXFx0I2luY2x1ZGUgPGZvZ19mcmFnbWVudD5cXG59XFxuXCI7XG5cbnZhciBzaGFkb3dfdmVydCA9IFwiI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfdmVydGV4PlxcbnZvaWQgbWFpbigpIHtcXG5cXHQjaW5jbHVkZSA8YmVnaW5fdmVydGV4PlxcblxcdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8d29ybGRwb3NfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxzaGFkb3dtYXBfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxmb2dfdmVydGV4Plxcbn1cXG5cIjtcblxudmFyIFNoYWRlckNodW5rID0ge1xuXHRhbHBoYW1hcF9mcmFnbWVudDogYWxwaGFtYXBfZnJhZ21lbnQsXG5cdGFscGhhbWFwX3BhcnNfZnJhZ21lbnQ6IGFscGhhbWFwX3BhcnNfZnJhZ21lbnQsXG5cdGFscGhhdGVzdF9mcmFnbWVudDogYWxwaGF0ZXN0X2ZyYWdtZW50LFxuXHRhb21hcF9mcmFnbWVudDogYW9tYXBfZnJhZ21lbnQsXG5cdGFvbWFwX3BhcnNfZnJhZ21lbnQ6IGFvbWFwX3BhcnNfZnJhZ21lbnQsXG5cdGJlZ2luX3ZlcnRleDogYmVnaW5fdmVydGV4LFxuXHRiZWdpbm5vcm1hbF92ZXJ0ZXg6IGJlZ2lubm9ybWFsX3ZlcnRleCxcblx0YnNkZnM6IGJzZGZzLFxuXHRidW1wbWFwX3BhcnNfZnJhZ21lbnQ6IGJ1bXBtYXBfcGFyc19mcmFnbWVudCxcblx0Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50OiBjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQsXG5cdGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50OiBjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudCxcblx0Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4OiBjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXgsXG5cdGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg6IGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXgsXG5cdGNvbG9yX2ZyYWdtZW50OiBjb2xvcl9mcmFnbWVudCxcblx0Y29sb3JfcGFyc19mcmFnbWVudDogY29sb3JfcGFyc19mcmFnbWVudCxcblx0Y29sb3JfcGFyc192ZXJ0ZXg6IGNvbG9yX3BhcnNfdmVydGV4LFxuXHRjb2xvcl92ZXJ0ZXg6IGNvbG9yX3ZlcnRleCxcblx0Y29tbW9uOiBjb21tb24sXG5cdGN1YmVfdXZfcmVmbGVjdGlvbl9mcmFnbWVudDogY3ViZV91dl9yZWZsZWN0aW9uX2ZyYWdtZW50LFxuXHRkZWZhdWx0bm9ybWFsX3ZlcnRleDogZGVmYXVsdG5vcm1hbF92ZXJ0ZXgsXG5cdGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleDogZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4LFxuXHRkaXNwbGFjZW1lbnRtYXBfdmVydGV4OiBkaXNwbGFjZW1lbnRtYXBfdmVydGV4LFxuXHRlbWlzc2l2ZW1hcF9mcmFnbWVudDogZW1pc3NpdmVtYXBfZnJhZ21lbnQsXG5cdGVtaXNzaXZlbWFwX3BhcnNfZnJhZ21lbnQ6IGVtaXNzaXZlbWFwX3BhcnNfZnJhZ21lbnQsXG5cdGVuY29kaW5nc19mcmFnbWVudDogZW5jb2RpbmdzX2ZyYWdtZW50LFxuXHRlbmNvZGluZ3NfcGFyc19mcmFnbWVudDogZW5jb2RpbmdzX3BhcnNfZnJhZ21lbnQsXG5cdGVudm1hcF9mcmFnbWVudDogZW52bWFwX2ZyYWdtZW50LFxuXHRlbnZtYXBfcGFyc19mcmFnbWVudDogZW52bWFwX3BhcnNfZnJhZ21lbnQsXG5cdGVudm1hcF9wYXJzX3ZlcnRleDogZW52bWFwX3BhcnNfdmVydGV4LFxuXHRlbnZtYXBfdmVydGV4OiBlbnZtYXBfdmVydGV4LFxuXHRmb2dfdmVydGV4OiBmb2dfdmVydGV4LFxuXHRmb2dfcGFyc192ZXJ0ZXg6IGZvZ19wYXJzX3ZlcnRleCxcblx0Zm9nX2ZyYWdtZW50OiBmb2dfZnJhZ21lbnQsXG5cdGZvZ19wYXJzX2ZyYWdtZW50OiBmb2dfcGFyc19mcmFnbWVudCxcblx0Z3JhZGllbnRtYXBfcGFyc19mcmFnbWVudDogZ3JhZGllbnRtYXBfcGFyc19mcmFnbWVudCxcblx0bGlnaHRtYXBfZnJhZ21lbnQ6IGxpZ2h0bWFwX2ZyYWdtZW50LFxuXHRsaWdodG1hcF9wYXJzX2ZyYWdtZW50OiBsaWdodG1hcF9wYXJzX2ZyYWdtZW50LFxuXHRsaWdodHNfbGFtYmVydF92ZXJ0ZXg6IGxpZ2h0c19sYW1iZXJ0X3ZlcnRleCxcblx0bGlnaHRzX3BhcnNfYmVnaW46IGxpZ2h0c19wYXJzX2JlZ2luLFxuXHRsaWdodHNfcGFyc19tYXBzOiBsaWdodHNfcGFyc19tYXBzLFxuXHRsaWdodHNfcGhvbmdfZnJhZ21lbnQ6IGxpZ2h0c19waG9uZ19mcmFnbWVudCxcblx0bGlnaHRzX3Bob25nX3BhcnNfZnJhZ21lbnQ6IGxpZ2h0c19waG9uZ19wYXJzX2ZyYWdtZW50LFxuXHRsaWdodHNfcGh5c2ljYWxfZnJhZ21lbnQ6IGxpZ2h0c19waHlzaWNhbF9mcmFnbWVudCxcblx0bGlnaHRzX3BoeXNpY2FsX3BhcnNfZnJhZ21lbnQ6IGxpZ2h0c19waHlzaWNhbF9wYXJzX2ZyYWdtZW50LFxuXHRsaWdodHNfZnJhZ21lbnRfYmVnaW46IGxpZ2h0c19mcmFnbWVudF9iZWdpbixcblx0bGlnaHRzX2ZyYWdtZW50X21hcHM6IGxpZ2h0c19mcmFnbWVudF9tYXBzLFxuXHRsaWdodHNfZnJhZ21lbnRfZW5kOiBsaWdodHNfZnJhZ21lbnRfZW5kLFxuXHRsb2dkZXB0aGJ1Zl9mcmFnbWVudDogbG9nZGVwdGhidWZfZnJhZ21lbnQsXG5cdGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ6IGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQsXG5cdGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4OiBsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleCxcblx0bG9nZGVwdGhidWZfdmVydGV4OiBsb2dkZXB0aGJ1Zl92ZXJ0ZXgsXG5cdG1hcF9mcmFnbWVudDogbWFwX2ZyYWdtZW50LFxuXHRtYXBfcGFyc19mcmFnbWVudDogbWFwX3BhcnNfZnJhZ21lbnQsXG5cdG1hcF9wYXJ0aWNsZV9mcmFnbWVudDogbWFwX3BhcnRpY2xlX2ZyYWdtZW50LFxuXHRtYXBfcGFydGljbGVfcGFyc19mcmFnbWVudDogbWFwX3BhcnRpY2xlX3BhcnNfZnJhZ21lbnQsXG5cdG1ldGFsbmVzc21hcF9mcmFnbWVudDogbWV0YWxuZXNzbWFwX2ZyYWdtZW50LFxuXHRtZXRhbG5lc3NtYXBfcGFyc19mcmFnbWVudDogbWV0YWxuZXNzbWFwX3BhcnNfZnJhZ21lbnQsXG5cdG1vcnBobm9ybWFsX3ZlcnRleDogbW9ycGhub3JtYWxfdmVydGV4LFxuXHRtb3JwaHRhcmdldF9wYXJzX3ZlcnRleDogbW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXgsXG5cdG1vcnBodGFyZ2V0X3ZlcnRleDogbW9ycGh0YXJnZXRfdmVydGV4LFxuXHRub3JtYWxfZnJhZ21lbnRfYmVnaW46IG5vcm1hbF9mcmFnbWVudF9iZWdpbixcblx0bm9ybWFsX2ZyYWdtZW50X21hcHM6IG5vcm1hbF9mcmFnbWVudF9tYXBzLFxuXHRub3JtYWxtYXBfcGFyc19mcmFnbWVudDogbm9ybWFsbWFwX3BhcnNfZnJhZ21lbnQsXG5cdHBhY2tpbmc6IHBhY2tpbmcsXG5cdHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ6IHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQsXG5cdHByb2plY3RfdmVydGV4OiBwcm9qZWN0X3ZlcnRleCxcblx0ZGl0aGVyaW5nX2ZyYWdtZW50OiBkaXRoZXJpbmdfZnJhZ21lbnQsXG5cdGRpdGhlcmluZ19wYXJzX2ZyYWdtZW50OiBkaXRoZXJpbmdfcGFyc19mcmFnbWVudCxcblx0cm91Z2huZXNzbWFwX2ZyYWdtZW50OiByb3VnaG5lc3NtYXBfZnJhZ21lbnQsXG5cdHJvdWdobmVzc21hcF9wYXJzX2ZyYWdtZW50OiByb3VnaG5lc3NtYXBfcGFyc19mcmFnbWVudCxcblx0c2hhZG93bWFwX3BhcnNfZnJhZ21lbnQ6IHNoYWRvd21hcF9wYXJzX2ZyYWdtZW50LFxuXHRzaGFkb3dtYXBfcGFyc192ZXJ0ZXg6IHNoYWRvd21hcF9wYXJzX3ZlcnRleCxcblx0c2hhZG93bWFwX3ZlcnRleDogc2hhZG93bWFwX3ZlcnRleCxcblx0c2hhZG93bWFza19wYXJzX2ZyYWdtZW50OiBzaGFkb3dtYXNrX3BhcnNfZnJhZ21lbnQsXG5cdHNraW5iYXNlX3ZlcnRleDogc2tpbmJhc2VfdmVydGV4LFxuXHRza2lubmluZ19wYXJzX3ZlcnRleDogc2tpbm5pbmdfcGFyc192ZXJ0ZXgsXG5cdHNraW5uaW5nX3ZlcnRleDogc2tpbm5pbmdfdmVydGV4LFxuXHRza2lubm9ybWFsX3ZlcnRleDogc2tpbm5vcm1hbF92ZXJ0ZXgsXG5cdHNwZWN1bGFybWFwX2ZyYWdtZW50OiBzcGVjdWxhcm1hcF9mcmFnbWVudCxcblx0c3BlY3VsYXJtYXBfcGFyc19mcmFnbWVudDogc3BlY3VsYXJtYXBfcGFyc19mcmFnbWVudCxcblx0dG9uZW1hcHBpbmdfZnJhZ21lbnQ6IHRvbmVtYXBwaW5nX2ZyYWdtZW50LFxuXHR0b25lbWFwcGluZ19wYXJzX2ZyYWdtZW50OiB0b25lbWFwcGluZ19wYXJzX2ZyYWdtZW50LFxuXHR1dl9wYXJzX2ZyYWdtZW50OiB1dl9wYXJzX2ZyYWdtZW50LFxuXHR1dl9wYXJzX3ZlcnRleDogdXZfcGFyc192ZXJ0ZXgsXG5cdHV2X3ZlcnRleDogdXZfdmVydGV4LFxuXHR1djJfcGFyc19mcmFnbWVudDogdXYyX3BhcnNfZnJhZ21lbnQsXG5cdHV2Ml9wYXJzX3ZlcnRleDogdXYyX3BhcnNfdmVydGV4LFxuXHR1djJfdmVydGV4OiB1djJfdmVydGV4LFxuXHR3b3JsZHBvc192ZXJ0ZXg6IHdvcmxkcG9zX3ZlcnRleCxcblxuXHRjdWJlX2ZyYWc6IGN1YmVfZnJhZyxcblx0Y3ViZV92ZXJ0OiBjdWJlX3ZlcnQsXG5cdGRlcHRoX2ZyYWc6IGRlcHRoX2ZyYWcsXG5cdGRlcHRoX3ZlcnQ6IGRlcHRoX3ZlcnQsXG5cdGRpc3RhbmNlUkdCQV9mcmFnOiBkaXN0YW5jZVJHQkFfZnJhZyxcblx0ZGlzdGFuY2VSR0JBX3ZlcnQ6IGRpc3RhbmNlUkdCQV92ZXJ0LFxuXHRlcXVpcmVjdF9mcmFnOiBlcXVpcmVjdF9mcmFnLFxuXHRlcXVpcmVjdF92ZXJ0OiBlcXVpcmVjdF92ZXJ0LFxuXHRsaW5lZGFzaGVkX2ZyYWc6IGxpbmVkYXNoZWRfZnJhZyxcblx0bGluZWRhc2hlZF92ZXJ0OiBsaW5lZGFzaGVkX3ZlcnQsXG5cdG1lc2hiYXNpY19mcmFnOiBtZXNoYmFzaWNfZnJhZyxcblx0bWVzaGJhc2ljX3ZlcnQ6IG1lc2hiYXNpY192ZXJ0LFxuXHRtZXNobGFtYmVydF9mcmFnOiBtZXNobGFtYmVydF9mcmFnLFxuXHRtZXNobGFtYmVydF92ZXJ0OiBtZXNobGFtYmVydF92ZXJ0LFxuXHRtZXNocGhvbmdfZnJhZzogbWVzaHBob25nX2ZyYWcsXG5cdG1lc2hwaG9uZ192ZXJ0OiBtZXNocGhvbmdfdmVydCxcblx0bWVzaHBoeXNpY2FsX2ZyYWc6IG1lc2hwaHlzaWNhbF9mcmFnLFxuXHRtZXNocGh5c2ljYWxfdmVydDogbWVzaHBoeXNpY2FsX3ZlcnQsXG5cdG5vcm1hbF9mcmFnOiBub3JtYWxfZnJhZyxcblx0bm9ybWFsX3ZlcnQ6IG5vcm1hbF92ZXJ0LFxuXHRwb2ludHNfZnJhZzogcG9pbnRzX2ZyYWcsXG5cdHBvaW50c192ZXJ0OiBwb2ludHNfdmVydCxcblx0c2hhZG93X2ZyYWc6IHNoYWRvd19mcmFnLFxuXHRzaGFkb3dfdmVydDogc2hhZG93X3ZlcnRcbn07XG5cbi8qKlxuICogVW5pZm9ybSBVdGlsaXRpZXNcbiAqL1xuXG52YXIgVW5pZm9ybXNVdGlscyA9IHtcblxuXHRtZXJnZTogZnVuY3Rpb24gKCB1bmlmb3JtcyApIHtcblxuXHRcdHZhciBtZXJnZWQgPSB7fTtcblxuXHRcdGZvciAoIHZhciB1ID0gMDsgdSA8IHVuaWZvcm1zLmxlbmd0aDsgdSArKyApIHtcblxuXHRcdFx0dmFyIHRtcCA9IHRoaXMuY2xvbmUoIHVuaWZvcm1zWyB1IF0gKTtcblxuXHRcdFx0Zm9yICggdmFyIHAgaW4gdG1wICkge1xuXG5cdFx0XHRcdG1lcmdlZFsgcCBdID0gdG1wWyBwIF07XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiBtZXJnZWQ7XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCB1bmlmb3Jtc19zcmMgKSB7XG5cblx0XHR2YXIgdW5pZm9ybXNfZHN0ID0ge307XG5cblx0XHRmb3IgKCB2YXIgdSBpbiB1bmlmb3Jtc19zcmMgKSB7XG5cblx0XHRcdHVuaWZvcm1zX2RzdFsgdSBdID0ge307XG5cblx0XHRcdGZvciAoIHZhciBwIGluIHVuaWZvcm1zX3NyY1sgdSBdICkge1xuXG5cdFx0XHRcdHZhciBwYXJhbWV0ZXJfc3JjID0gdW5pZm9ybXNfc3JjWyB1IF1bIHAgXTtcblxuXHRcdFx0XHRpZiAoIHBhcmFtZXRlcl9zcmMgJiYgKCBwYXJhbWV0ZXJfc3JjLmlzQ29sb3IgfHxcblx0XHRcdFx0XHRwYXJhbWV0ZXJfc3JjLmlzTWF0cml4MyB8fCBwYXJhbWV0ZXJfc3JjLmlzTWF0cml4NCB8fFxuXHRcdFx0XHRcdHBhcmFtZXRlcl9zcmMuaXNWZWN0b3IyIHx8IHBhcmFtZXRlcl9zcmMuaXNWZWN0b3IzIHx8IHBhcmFtZXRlcl9zcmMuaXNWZWN0b3I0IHx8XG5cdFx0XHRcdFx0cGFyYW1ldGVyX3NyYy5pc1RleHR1cmUgKSApIHtcblxuXHRcdFx0XHRcdHVuaWZvcm1zX2RzdFsgdSBdWyBwIF0gPSBwYXJhbWV0ZXJfc3JjLmNsb25lKCk7XG5cblx0XHRcdFx0fSBlbHNlIGlmICggQXJyYXkuaXNBcnJheSggcGFyYW1ldGVyX3NyYyApICkge1xuXG5cdFx0XHRcdFx0dW5pZm9ybXNfZHN0WyB1IF1bIHAgXSA9IHBhcmFtZXRlcl9zcmMuc2xpY2UoKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0dW5pZm9ybXNfZHN0WyB1IF1bIHAgXSA9IHBhcmFtZXRlcl9zcmM7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdW5pZm9ybXNfZHN0O1xuXG5cdH1cblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbnZhciBDb2xvcktleXdvcmRzID0geyAnYWxpY2VibHVlJzogMHhGMEY4RkYsICdhbnRpcXVld2hpdGUnOiAweEZBRUJENywgJ2FxdWEnOiAweDAwRkZGRiwgJ2FxdWFtYXJpbmUnOiAweDdGRkZENCwgJ2F6dXJlJzogMHhGMEZGRkYsXG5cdCdiZWlnZSc6IDB4RjVGNURDLCAnYmlzcXVlJzogMHhGRkU0QzQsICdibGFjayc6IDB4MDAwMDAwLCAnYmxhbmNoZWRhbG1vbmQnOiAweEZGRUJDRCwgJ2JsdWUnOiAweDAwMDBGRiwgJ2JsdWV2aW9sZXQnOiAweDhBMkJFMixcblx0J2Jyb3duJzogMHhBNTJBMkEsICdidXJseXdvb2QnOiAweERFQjg4NywgJ2NhZGV0Ymx1ZSc6IDB4NUY5RUEwLCAnY2hhcnRyZXVzZSc6IDB4N0ZGRjAwLCAnY2hvY29sYXRlJzogMHhEMjY5MUUsICdjb3JhbCc6IDB4RkY3RjUwLFxuXHQnY29ybmZsb3dlcmJsdWUnOiAweDY0OTVFRCwgJ2Nvcm5zaWxrJzogMHhGRkY4REMsICdjcmltc29uJzogMHhEQzE0M0MsICdjeWFuJzogMHgwMEZGRkYsICdkYXJrYmx1ZSc6IDB4MDAwMDhCLCAnZGFya2N5YW4nOiAweDAwOEI4Qixcblx0J2Rhcmtnb2xkZW5yb2QnOiAweEI4ODYwQiwgJ2RhcmtncmF5JzogMHhBOUE5QTksICdkYXJrZ3JlZW4nOiAweDAwNjQwMCwgJ2RhcmtncmV5JzogMHhBOUE5QTksICdkYXJra2hha2knOiAweEJEQjc2QiwgJ2RhcmttYWdlbnRhJzogMHg4QjAwOEIsXG5cdCdkYXJrb2xpdmVncmVlbic6IDB4NTU2QjJGLCAnZGFya29yYW5nZSc6IDB4RkY4QzAwLCAnZGFya29yY2hpZCc6IDB4OTkzMkNDLCAnZGFya3JlZCc6IDB4OEIwMDAwLCAnZGFya3NhbG1vbic6IDB4RTk5NjdBLCAnZGFya3NlYWdyZWVuJzogMHg4RkJDOEYsXG5cdCdkYXJrc2xhdGVibHVlJzogMHg0ODNEOEIsICdkYXJrc2xhdGVncmF5JzogMHgyRjRGNEYsICdkYXJrc2xhdGVncmV5JzogMHgyRjRGNEYsICdkYXJrdHVycXVvaXNlJzogMHgwMENFRDEsICdkYXJrdmlvbGV0JzogMHg5NDAwRDMsXG5cdCdkZWVwcGluayc6IDB4RkYxNDkzLCAnZGVlcHNreWJsdWUnOiAweDAwQkZGRiwgJ2RpbWdyYXknOiAweDY5Njk2OSwgJ2RpbWdyZXknOiAweDY5Njk2OSwgJ2RvZGdlcmJsdWUnOiAweDFFOTBGRiwgJ2ZpcmVicmljayc6IDB4QjIyMjIyLFxuXHQnZmxvcmFsd2hpdGUnOiAweEZGRkFGMCwgJ2ZvcmVzdGdyZWVuJzogMHgyMjhCMjIsICdmdWNoc2lhJzogMHhGRjAwRkYsICdnYWluc2Jvcm8nOiAweERDRENEQywgJ2dob3N0d2hpdGUnOiAweEY4RjhGRiwgJ2dvbGQnOiAweEZGRDcwMCxcblx0J2dvbGRlbnJvZCc6IDB4REFBNTIwLCAnZ3JheSc6IDB4ODA4MDgwLCAnZ3JlZW4nOiAweDAwODAwMCwgJ2dyZWVueWVsbG93JzogMHhBREZGMkYsICdncmV5JzogMHg4MDgwODAsICdob25leWRldyc6IDB4RjBGRkYwLCAnaG90cGluayc6IDB4RkY2OUI0LFxuXHQnaW5kaWFucmVkJzogMHhDRDVDNUMsICdpbmRpZ28nOiAweDRCMDA4MiwgJ2l2b3J5JzogMHhGRkZGRjAsICdraGFraSc6IDB4RjBFNjhDLCAnbGF2ZW5kZXInOiAweEU2RTZGQSwgJ2xhdmVuZGVyYmx1c2gnOiAweEZGRjBGNSwgJ2xhd25ncmVlbic6IDB4N0NGQzAwLFxuXHQnbGVtb25jaGlmZm9uJzogMHhGRkZBQ0QsICdsaWdodGJsdWUnOiAweEFERDhFNiwgJ2xpZ2h0Y29yYWwnOiAweEYwODA4MCwgJ2xpZ2h0Y3lhbic6IDB4RTBGRkZGLCAnbGlnaHRnb2xkZW5yb2R5ZWxsb3cnOiAweEZBRkFEMiwgJ2xpZ2h0Z3JheSc6IDB4RDNEM0QzLFxuXHQnbGlnaHRncmVlbic6IDB4OTBFRTkwLCAnbGlnaHRncmV5JzogMHhEM0QzRDMsICdsaWdodHBpbmsnOiAweEZGQjZDMSwgJ2xpZ2h0c2FsbW9uJzogMHhGRkEwN0EsICdsaWdodHNlYWdyZWVuJzogMHgyMEIyQUEsICdsaWdodHNreWJsdWUnOiAweDg3Q0VGQSxcblx0J2xpZ2h0c2xhdGVncmF5JzogMHg3Nzg4OTksICdsaWdodHNsYXRlZ3JleSc6IDB4Nzc4ODk5LCAnbGlnaHRzdGVlbGJsdWUnOiAweEIwQzRERSwgJ2xpZ2h0eWVsbG93JzogMHhGRkZGRTAsICdsaW1lJzogMHgwMEZGMDAsICdsaW1lZ3JlZW4nOiAweDMyQ0QzMixcblx0J2xpbmVuJzogMHhGQUYwRTYsICdtYWdlbnRhJzogMHhGRjAwRkYsICdtYXJvb24nOiAweDgwMDAwMCwgJ21lZGl1bWFxdWFtYXJpbmUnOiAweDY2Q0RBQSwgJ21lZGl1bWJsdWUnOiAweDAwMDBDRCwgJ21lZGl1bW9yY2hpZCc6IDB4QkE1NUQzLFxuXHQnbWVkaXVtcHVycGxlJzogMHg5MzcwREIsICdtZWRpdW1zZWFncmVlbic6IDB4M0NCMzcxLCAnbWVkaXVtc2xhdGVibHVlJzogMHg3QjY4RUUsICdtZWRpdW1zcHJpbmdncmVlbic6IDB4MDBGQTlBLCAnbWVkaXVtdHVycXVvaXNlJzogMHg0OEQxQ0MsXG5cdCdtZWRpdW12aW9sZXRyZWQnOiAweEM3MTU4NSwgJ21pZG5pZ2h0Ymx1ZSc6IDB4MTkxOTcwLCAnbWludGNyZWFtJzogMHhGNUZGRkEsICdtaXN0eXJvc2UnOiAweEZGRTRFMSwgJ21vY2Nhc2luJzogMHhGRkU0QjUsICduYXZham93aGl0ZSc6IDB4RkZERUFELFxuXHQnbmF2eSc6IDB4MDAwMDgwLCAnb2xkbGFjZSc6IDB4RkRGNUU2LCAnb2xpdmUnOiAweDgwODAwMCwgJ29saXZlZHJhYic6IDB4NkI4RTIzLCAnb3JhbmdlJzogMHhGRkE1MDAsICdvcmFuZ2VyZWQnOiAweEZGNDUwMCwgJ29yY2hpZCc6IDB4REE3MEQ2LFxuXHQncGFsZWdvbGRlbnJvZCc6IDB4RUVFOEFBLCAncGFsZWdyZWVuJzogMHg5OEZCOTgsICdwYWxldHVycXVvaXNlJzogMHhBRkVFRUUsICdwYWxldmlvbGV0cmVkJzogMHhEQjcwOTMsICdwYXBheWF3aGlwJzogMHhGRkVGRDUsICdwZWFjaHB1ZmYnOiAweEZGREFCOSxcblx0J3BlcnUnOiAweENEODUzRiwgJ3BpbmsnOiAweEZGQzBDQiwgJ3BsdW0nOiAweEREQTBERCwgJ3Bvd2RlcmJsdWUnOiAweEIwRTBFNiwgJ3B1cnBsZSc6IDB4ODAwMDgwLCAncmViZWNjYXB1cnBsZSc6IDB4NjYzMzk5LCAncmVkJzogMHhGRjAwMDAsICdyb3N5YnJvd24nOiAweEJDOEY4Rixcblx0J3JveWFsYmx1ZSc6IDB4NDE2OUUxLCAnc2FkZGxlYnJvd24nOiAweDhCNDUxMywgJ3NhbG1vbic6IDB4RkE4MDcyLCAnc2FuZHlicm93bic6IDB4RjRBNDYwLCAnc2VhZ3JlZW4nOiAweDJFOEI1NywgJ3NlYXNoZWxsJzogMHhGRkY1RUUsXG5cdCdzaWVubmEnOiAweEEwNTIyRCwgJ3NpbHZlcic6IDB4QzBDMEMwLCAnc2t5Ymx1ZSc6IDB4ODdDRUVCLCAnc2xhdGVibHVlJzogMHg2QTVBQ0QsICdzbGF0ZWdyYXknOiAweDcwODA5MCwgJ3NsYXRlZ3JleSc6IDB4NzA4MDkwLCAnc25vdyc6IDB4RkZGQUZBLFxuXHQnc3ByaW5nZ3JlZW4nOiAweDAwRkY3RiwgJ3N0ZWVsYmx1ZSc6IDB4NDY4MkI0LCAndGFuJzogMHhEMkI0OEMsICd0ZWFsJzogMHgwMDgwODAsICd0aGlzdGxlJzogMHhEOEJGRDgsICd0b21hdG8nOiAweEZGNjM0NywgJ3R1cnF1b2lzZSc6IDB4NDBFMEQwLFxuXHQndmlvbGV0JzogMHhFRTgyRUUsICd3aGVhdCc6IDB4RjVERUIzLCAnd2hpdGUnOiAweEZGRkZGRiwgJ3doaXRlc21va2UnOiAweEY1RjVGNSwgJ3llbGxvdyc6IDB4RkZGRjAwLCAneWVsbG93Z3JlZW4nOiAweDlBQ0QzMiB9O1xuXG5mdW5jdGlvbiBDb2xvciggciwgZywgYiApIHtcblxuXHRpZiAoIGcgPT09IHVuZGVmaW5lZCAmJiBiID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHQvLyByIGlzIFRIUkVFLkNvbG9yLCBoZXggb3Igc3RyaW5nXG5cdFx0cmV0dXJuIHRoaXMuc2V0KCByICk7XG5cblx0fVxuXG5cdHJldHVybiB0aGlzLnNldFJHQiggciwgZywgYiApO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIENvbG9yLnByb3RvdHlwZSwge1xuXG5cdGlzQ29sb3I6IHRydWUsXG5cblx0cjogMSwgZzogMSwgYjogMSxcblxuXHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRpZiAoIHZhbHVlICYmIHZhbHVlLmlzQ29sb3IgKSB7XG5cblx0XHRcdHRoaXMuY29weSggdmFsdWUgKTtcblxuXHRcdH0gZWxzZSBpZiAoIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgKSB7XG5cblx0XHRcdHRoaXMuc2V0SGV4KCB2YWx1ZSApO1xuXG5cdFx0fSBlbHNlIGlmICggdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyApIHtcblxuXHRcdFx0dGhpcy5zZXRTdHlsZSggdmFsdWUgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0U2NhbGFyOiBmdW5jdGlvbiAoIHNjYWxhciApIHtcblxuXHRcdHRoaXMuciA9IHNjYWxhcjtcblx0XHR0aGlzLmcgPSBzY2FsYXI7XG5cdFx0dGhpcy5iID0gc2NhbGFyO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRIZXg6IGZ1bmN0aW9uICggaGV4ICkge1xuXG5cdFx0aGV4ID0gTWF0aC5mbG9vciggaGV4ICk7XG5cblx0XHR0aGlzLnIgPSAoIGhleCA+PiAxNiAmIDI1NSApIC8gMjU1O1xuXHRcdHRoaXMuZyA9ICggaGV4ID4+IDggJiAyNTUgKSAvIDI1NTtcblx0XHR0aGlzLmIgPSAoIGhleCAmIDI1NSApIC8gMjU1O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRSR0I6IGZ1bmN0aW9uICggciwgZywgYiApIHtcblxuXHRcdHRoaXMuciA9IHI7XG5cdFx0dGhpcy5nID0gZztcblx0XHR0aGlzLmIgPSBiO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRIU0w6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGZ1bmN0aW9uIGh1ZTJyZ2IoIHAsIHEsIHQgKSB7XG5cblx0XHRcdGlmICggdCA8IDAgKSB0ICs9IDE7XG5cdFx0XHRpZiAoIHQgPiAxICkgdCAtPSAxO1xuXHRcdFx0aWYgKCB0IDwgMSAvIDYgKSByZXR1cm4gcCArICggcSAtIHAgKSAqIDYgKiB0O1xuXHRcdFx0aWYgKCB0IDwgMSAvIDIgKSByZXR1cm4gcTtcblx0XHRcdGlmICggdCA8IDIgLyAzICkgcmV0dXJuIHAgKyAoIHEgLSBwICkgKiA2ICogKCAyIC8gMyAtIHQgKTtcblx0XHRcdHJldHVybiBwO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHNldEhTTCggaCwgcywgbCApIHtcblxuXHRcdFx0Ly8gaCxzLGwgcmFuZ2VzIGFyZSBpbiAwLjAgLSAxLjBcblx0XHRcdGggPSBfTWF0aC5ldWNsaWRlYW5Nb2R1bG8oIGgsIDEgKTtcblx0XHRcdHMgPSBfTWF0aC5jbGFtcCggcywgMCwgMSApO1xuXHRcdFx0bCA9IF9NYXRoLmNsYW1wKCBsLCAwLCAxICk7XG5cblx0XHRcdGlmICggcyA9PT0gMCApIHtcblxuXHRcdFx0XHR0aGlzLnIgPSB0aGlzLmcgPSB0aGlzLmIgPSBsO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHZhciBwID0gbCA8PSAwLjUgPyBsICogKCAxICsgcyApIDogbCArIHMgLSAoIGwgKiBzICk7XG5cdFx0XHRcdHZhciBxID0gKCAyICogbCApIC0gcDtcblxuXHRcdFx0XHR0aGlzLnIgPSBodWUycmdiKCBxLCBwLCBoICsgMSAvIDMgKTtcblx0XHRcdFx0dGhpcy5nID0gaHVlMnJnYiggcSwgcCwgaCApO1xuXHRcdFx0XHR0aGlzLmIgPSBodWUycmdiKCBxLCBwLCBoIC0gMSAvIDMgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHNldFN0eWxlOiBmdW5jdGlvbiAoIHN0eWxlICkge1xuXG5cdFx0ZnVuY3Rpb24gaGFuZGxlQWxwaGEoIHN0cmluZyApIHtcblxuXHRcdFx0aWYgKCBzdHJpbmcgPT09IHVuZGVmaW5lZCApIHJldHVybjtcblxuXHRcdFx0aWYgKCBwYXJzZUZsb2F0KCBzdHJpbmcgKSA8IDEgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQ29sb3I6IEFscGhhIGNvbXBvbmVudCBvZiAnICsgc3R5bGUgKyAnIHdpbGwgYmUgaWdub3JlZC4nICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXG5cdFx0dmFyIG07XG5cblx0XHRpZiAoIG0gPSAvXigoPzpyZ2J8aHNsKWE/KVxcKFxccyooW15cXCldKilcXCkvLmV4ZWMoIHN0eWxlICkgKSB7XG5cblx0XHRcdC8vIHJnYiAvIGhzbFxuXG5cdFx0XHR2YXIgY29sb3I7XG5cdFx0XHR2YXIgbmFtZSA9IG1bIDEgXTtcblx0XHRcdHZhciBjb21wb25lbnRzID0gbVsgMiBdO1xuXG5cdFx0XHRzd2l0Y2ggKCBuYW1lICkge1xuXG5cdFx0XHRcdGNhc2UgJ3JnYic6XG5cdFx0XHRcdGNhc2UgJ3JnYmEnOlxuXG5cdFx0XHRcdFx0aWYgKCBjb2xvciA9IC9eKFxcZCspXFxzKixcXHMqKFxcZCspXFxzKixcXHMqKFxcZCspXFxzKigsXFxzKihbMC05XSpcXC4/WzAtOV0rKVxccyopPyQvLmV4ZWMoIGNvbXBvbmVudHMgKSApIHtcblxuXHRcdFx0XHRcdFx0Ly8gcmdiKDI1NSwwLDApIHJnYmEoMjU1LDAsMCwwLjUpXG5cdFx0XHRcdFx0XHR0aGlzLnIgPSBNYXRoLm1pbiggMjU1LCBwYXJzZUludCggY29sb3JbIDEgXSwgMTAgKSApIC8gMjU1O1xuXHRcdFx0XHRcdFx0dGhpcy5nID0gTWF0aC5taW4oIDI1NSwgcGFyc2VJbnQoIGNvbG9yWyAyIF0sIDEwICkgKSAvIDI1NTtcblx0XHRcdFx0XHRcdHRoaXMuYiA9IE1hdGgubWluKCAyNTUsIHBhcnNlSW50KCBjb2xvclsgMyBdLCAxMCApICkgLyAyNTU7XG5cblx0XHRcdFx0XHRcdGhhbmRsZUFscGhhKCBjb2xvclsgNSBdICk7XG5cblx0XHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKCBjb2xvciA9IC9eKFxcZCspXFwlXFxzKixcXHMqKFxcZCspXFwlXFxzKixcXHMqKFxcZCspXFwlXFxzKigsXFxzKihbMC05XSpcXC4/WzAtOV0rKVxccyopPyQvLmV4ZWMoIGNvbXBvbmVudHMgKSApIHtcblxuXHRcdFx0XHRcdFx0Ly8gcmdiKDEwMCUsMCUsMCUpIHJnYmEoMTAwJSwwJSwwJSwwLjUpXG5cdFx0XHRcdFx0XHR0aGlzLnIgPSBNYXRoLm1pbiggMTAwLCBwYXJzZUludCggY29sb3JbIDEgXSwgMTAgKSApIC8gMTAwO1xuXHRcdFx0XHRcdFx0dGhpcy5nID0gTWF0aC5taW4oIDEwMCwgcGFyc2VJbnQoIGNvbG9yWyAyIF0sIDEwICkgKSAvIDEwMDtcblx0XHRcdFx0XHRcdHRoaXMuYiA9IE1hdGgubWluKCAxMDAsIHBhcnNlSW50KCBjb2xvclsgMyBdLCAxMCApICkgLyAxMDA7XG5cblx0XHRcdFx0XHRcdGhhbmRsZUFscGhhKCBjb2xvclsgNSBdICk7XG5cblx0XHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSAnaHNsJzpcblx0XHRcdFx0Y2FzZSAnaHNsYSc6XG5cblx0XHRcdFx0XHRpZiAoIGNvbG9yID0gL14oWzAtOV0qXFwuP1swLTldKylcXHMqLFxccyooXFxkKylcXCVcXHMqLFxccyooXFxkKylcXCVcXHMqKCxcXHMqKFswLTldKlxcLj9bMC05XSspXFxzKik/JC8uZXhlYyggY29tcG9uZW50cyApICkge1xuXG5cdFx0XHRcdFx0XHQvLyBoc2woMTIwLDUwJSw1MCUpIGhzbGEoMTIwLDUwJSw1MCUsMC41KVxuXHRcdFx0XHRcdFx0dmFyIGggPSBwYXJzZUZsb2F0KCBjb2xvclsgMSBdICkgLyAzNjA7XG5cdFx0XHRcdFx0XHR2YXIgcyA9IHBhcnNlSW50KCBjb2xvclsgMiBdLCAxMCApIC8gMTAwO1xuXHRcdFx0XHRcdFx0dmFyIGwgPSBwYXJzZUludCggY29sb3JbIDMgXSwgMTAgKSAvIDEwMDtcblxuXHRcdFx0XHRcdFx0aGFuZGxlQWxwaGEoIGNvbG9yWyA1IF0gKTtcblxuXHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMuc2V0SFNMKCBoLCBzLCBsICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIGlmICggbSA9IC9eXFwjKFtBLUZhLWYwLTldKykkLy5leGVjKCBzdHlsZSApICkge1xuXG5cdFx0XHQvLyBoZXggY29sb3JcblxuXHRcdFx0dmFyIGhleCA9IG1bIDEgXTtcblx0XHRcdHZhciBzaXplID0gaGV4Lmxlbmd0aDtcblxuXHRcdFx0aWYgKCBzaXplID09PSAzICkge1xuXG5cdFx0XHRcdC8vICNmZjBcblx0XHRcdFx0dGhpcy5yID0gcGFyc2VJbnQoIGhleC5jaGFyQXQoIDAgKSArIGhleC5jaGFyQXQoIDAgKSwgMTYgKSAvIDI1NTtcblx0XHRcdFx0dGhpcy5nID0gcGFyc2VJbnQoIGhleC5jaGFyQXQoIDEgKSArIGhleC5jaGFyQXQoIDEgKSwgMTYgKSAvIDI1NTtcblx0XHRcdFx0dGhpcy5iID0gcGFyc2VJbnQoIGhleC5jaGFyQXQoIDIgKSArIGhleC5jaGFyQXQoIDIgKSwgMTYgKSAvIDI1NTtcblxuXHRcdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdFx0fSBlbHNlIGlmICggc2l6ZSA9PT0gNiApIHtcblxuXHRcdFx0XHQvLyAjZmYwMDAwXG5cdFx0XHRcdHRoaXMuciA9IHBhcnNlSW50KCBoZXguY2hhckF0KCAwICkgKyBoZXguY2hhckF0KCAxICksIDE2ICkgLyAyNTU7XG5cdFx0XHRcdHRoaXMuZyA9IHBhcnNlSW50KCBoZXguY2hhckF0KCAyICkgKyBoZXguY2hhckF0KCAzICksIDE2ICkgLyAyNTU7XG5cdFx0XHRcdHRoaXMuYiA9IHBhcnNlSW50KCBoZXguY2hhckF0KCA0ICkgKyBoZXguY2hhckF0KCA1ICksIDE2ICkgLyAyNTU7XG5cblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggc3R5bGUgJiYgc3R5bGUubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0Ly8gY29sb3Iga2V5d29yZHNcblx0XHRcdHZhciBoZXggPSBDb2xvcktleXdvcmRzWyBzdHlsZSBdO1xuXG5cdFx0XHRpZiAoIGhleCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdC8vIHJlZFxuXHRcdFx0XHR0aGlzLnNldEhleCggaGV4ICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Ly8gdW5rbm93biBjb2xvclxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Db2xvcjogVW5rbm93biBjb2xvciAnICsgc3R5bGUgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCB0aGlzLnIsIHRoaXMuZywgdGhpcy5iICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIGNvbG9yICkge1xuXG5cdFx0dGhpcy5yID0gY29sb3Iucjtcblx0XHR0aGlzLmcgPSBjb2xvci5nO1xuXHRcdHRoaXMuYiA9IGNvbG9yLmI7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvcHlHYW1tYVRvTGluZWFyOiBmdW5jdGlvbiAoIGNvbG9yLCBnYW1tYUZhY3RvciApIHtcblxuXHRcdGlmICggZ2FtbWFGYWN0b3IgPT09IHVuZGVmaW5lZCApIGdhbW1hRmFjdG9yID0gMi4wO1xuXG5cdFx0dGhpcy5yID0gTWF0aC5wb3coIGNvbG9yLnIsIGdhbW1hRmFjdG9yICk7XG5cdFx0dGhpcy5nID0gTWF0aC5wb3coIGNvbG9yLmcsIGdhbW1hRmFjdG9yICk7XG5cdFx0dGhpcy5iID0gTWF0aC5wb3coIGNvbG9yLmIsIGdhbW1hRmFjdG9yICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvcHlMaW5lYXJUb0dhbW1hOiBmdW5jdGlvbiAoIGNvbG9yLCBnYW1tYUZhY3RvciApIHtcblxuXHRcdGlmICggZ2FtbWFGYWN0b3IgPT09IHVuZGVmaW5lZCApIGdhbW1hRmFjdG9yID0gMi4wO1xuXG5cdFx0dmFyIHNhZmVJbnZlcnNlID0gKCBnYW1tYUZhY3RvciA+IDAgKSA/ICggMS4wIC8gZ2FtbWFGYWN0b3IgKSA6IDEuMDtcblxuXHRcdHRoaXMuciA9IE1hdGgucG93KCBjb2xvci5yLCBzYWZlSW52ZXJzZSApO1xuXHRcdHRoaXMuZyA9IE1hdGgucG93KCBjb2xvci5nLCBzYWZlSW52ZXJzZSApO1xuXHRcdHRoaXMuYiA9IE1hdGgucG93KCBjb2xvci5iLCBzYWZlSW52ZXJzZSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjb252ZXJ0R2FtbWFUb0xpbmVhcjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHIgPSB0aGlzLnIsIGcgPSB0aGlzLmcsIGIgPSB0aGlzLmI7XG5cblx0XHR0aGlzLnIgPSByICogcjtcblx0XHR0aGlzLmcgPSBnICogZztcblx0XHR0aGlzLmIgPSBiICogYjtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y29udmVydExpbmVhclRvR2FtbWE6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuciA9IE1hdGguc3FydCggdGhpcy5yICk7XG5cdFx0dGhpcy5nID0gTWF0aC5zcXJ0KCB0aGlzLmcgKTtcblx0XHR0aGlzLmIgPSBNYXRoLnNxcnQoIHRoaXMuYiApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRnZXRIZXg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiAoIHRoaXMuciAqIDI1NSApIDw8IDE2IF4gKCB0aGlzLmcgKiAyNTUgKSA8PCA4IF4gKCB0aGlzLmIgKiAyNTUgKSA8PCAwO1xuXG5cdH0sXG5cblx0Z2V0SGV4U3RyaW5nOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gKCAnMDAwMDAwJyArIHRoaXMuZ2V0SGV4KCkudG9TdHJpbmcoIDE2ICkgKS5zbGljZSggLSA2ICk7XG5cblx0fSxcblxuXHRnZXRIU0w6IGZ1bmN0aW9uICggdGFyZ2V0ICkge1xuXG5cdFx0Ly8gaCxzLGwgcmFuZ2VzIGFyZSBpbiAwLjAgLSAxLjBcblxuXHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkNvbG9yOiAuZ2V0SFNMKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IHsgaDogMCwgczogMCwgbDogMCB9O1xuXG5cdFx0fVxuXG5cdFx0dmFyIHIgPSB0aGlzLnIsIGcgPSB0aGlzLmcsIGIgPSB0aGlzLmI7XG5cblx0XHR2YXIgbWF4ID0gTWF0aC5tYXgoIHIsIGcsIGIgKTtcblx0XHR2YXIgbWluID0gTWF0aC5taW4oIHIsIGcsIGIgKTtcblxuXHRcdHZhciBodWUsIHNhdHVyYXRpb247XG5cdFx0dmFyIGxpZ2h0bmVzcyA9ICggbWluICsgbWF4ICkgLyAyLjA7XG5cblx0XHRpZiAoIG1pbiA9PT0gbWF4ICkge1xuXG5cdFx0XHRodWUgPSAwO1xuXHRcdFx0c2F0dXJhdGlvbiA9IDA7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR2YXIgZGVsdGEgPSBtYXggLSBtaW47XG5cblx0XHRcdHNhdHVyYXRpb24gPSBsaWdodG5lc3MgPD0gMC41ID8gZGVsdGEgLyAoIG1heCArIG1pbiApIDogZGVsdGEgLyAoIDIgLSBtYXggLSBtaW4gKTtcblxuXHRcdFx0c3dpdGNoICggbWF4ICkge1xuXG5cdFx0XHRcdGNhc2UgcjogaHVlID0gKCBnIC0gYiApIC8gZGVsdGEgKyAoIGcgPCBiID8gNiA6IDAgKTsgYnJlYWs7XG5cdFx0XHRcdGNhc2UgZzogaHVlID0gKCBiIC0gciApIC8gZGVsdGEgKyAyOyBicmVhaztcblx0XHRcdFx0Y2FzZSBiOiBodWUgPSAoIHIgLSBnICkgLyBkZWx0YSArIDQ7IGJyZWFrO1xuXG5cdFx0XHR9XG5cblx0XHRcdGh1ZSAvPSA2O1xuXG5cdFx0fVxuXG5cdFx0dGFyZ2V0LmggPSBodWU7XG5cdFx0dGFyZ2V0LnMgPSBzYXR1cmF0aW9uO1xuXHRcdHRhcmdldC5sID0gbGlnaHRuZXNzO1xuXG5cdFx0cmV0dXJuIHRhcmdldDtcblxuXHR9LFxuXG5cdGdldFN0eWxlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gJ3JnYignICsgKCAoIHRoaXMuciAqIDI1NSApIHwgMCApICsgJywnICsgKCAoIHRoaXMuZyAqIDI1NSApIHwgMCApICsgJywnICsgKCAoIHRoaXMuYiAqIDI1NSApIHwgMCApICsgJyknO1xuXG5cdH0sXG5cblx0b2Zmc2V0SFNMOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgaHNsID0ge307XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gKCBoLCBzLCBsICkge1xuXG5cdFx0XHR0aGlzLmdldEhTTCggaHNsICk7XG5cblx0XHRcdGhzbC5oICs9IGg7IGhzbC5zICs9IHM7IGhzbC5sICs9IGw7XG5cblx0XHRcdHRoaXMuc2V0SFNMKCBoc2wuaCwgaHNsLnMsIGhzbC5sICk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0YWRkOiBmdW5jdGlvbiAoIGNvbG9yICkge1xuXG5cdFx0dGhpcy5yICs9IGNvbG9yLnI7XG5cdFx0dGhpcy5nICs9IGNvbG9yLmc7XG5cdFx0dGhpcy5iICs9IGNvbG9yLmI7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGFkZENvbG9yczogZnVuY3Rpb24gKCBjb2xvcjEsIGNvbG9yMiApIHtcblxuXHRcdHRoaXMuciA9IGNvbG9yMS5yICsgY29sb3IyLnI7XG5cdFx0dGhpcy5nID0gY29sb3IxLmcgKyBjb2xvcjIuZztcblx0XHR0aGlzLmIgPSBjb2xvcjEuYiArIGNvbG9yMi5iO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRhZGRTY2FsYXI6IGZ1bmN0aW9uICggcyApIHtcblxuXHRcdHRoaXMuciArPSBzO1xuXHRcdHRoaXMuZyArPSBzO1xuXHRcdHRoaXMuYiArPSBzO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzdWI6IGZ1bmN0aW9uICggY29sb3IgKSB7XG5cblx0XHR0aGlzLnIgPSBNYXRoLm1heCggMCwgdGhpcy5yIC0gY29sb3IuciApO1xuXHRcdHRoaXMuZyA9IE1hdGgubWF4KCAwLCB0aGlzLmcgLSBjb2xvci5nICk7XG5cdFx0dGhpcy5iID0gTWF0aC5tYXgoIDAsIHRoaXMuYiAtIGNvbG9yLmIgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bXVsdGlwbHk6IGZ1bmN0aW9uICggY29sb3IgKSB7XG5cblx0XHR0aGlzLnIgKj0gY29sb3Iucjtcblx0XHR0aGlzLmcgKj0gY29sb3IuZztcblx0XHR0aGlzLmIgKj0gY29sb3IuYjtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bXVsdGlwbHlTY2FsYXI6IGZ1bmN0aW9uICggcyApIHtcblxuXHRcdHRoaXMuciAqPSBzO1xuXHRcdHRoaXMuZyAqPSBzO1xuXHRcdHRoaXMuYiAqPSBzO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRsZXJwOiBmdW5jdGlvbiAoIGNvbG9yLCBhbHBoYSApIHtcblxuXHRcdHRoaXMuciArPSAoIGNvbG9yLnIgLSB0aGlzLnIgKSAqIGFscGhhO1xuXHRcdHRoaXMuZyArPSAoIGNvbG9yLmcgLSB0aGlzLmcgKSAqIGFscGhhO1xuXHRcdHRoaXMuYiArPSAoIGNvbG9yLmIgLSB0aGlzLmIgKSAqIGFscGhhO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRlcXVhbHM6IGZ1bmN0aW9uICggYyApIHtcblxuXHRcdHJldHVybiAoIGMuciA9PT0gdGhpcy5yICkgJiYgKCBjLmcgPT09IHRoaXMuZyApICYmICggYy5iID09PSB0aGlzLmIgKTtcblxuXHR9LFxuXG5cdGZyb21BcnJheTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkge1xuXG5cdFx0aWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7XG5cblx0XHR0aGlzLnIgPSBhcnJheVsgb2Zmc2V0IF07XG5cdFx0dGhpcy5nID0gYXJyYXlbIG9mZnNldCArIDEgXTtcblx0XHR0aGlzLmIgPSBhcnJheVsgb2Zmc2V0ICsgMiBdO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHR0b0FycmF5OiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7XG5cblx0XHRpZiAoIGFycmF5ID09PSB1bmRlZmluZWQgKSBhcnJheSA9IFtdO1xuXHRcdGlmICggb2Zmc2V0ID09PSB1bmRlZmluZWQgKSBvZmZzZXQgPSAwO1xuXG5cdFx0YXJyYXlbIG9mZnNldCBdID0gdGhpcy5yO1xuXHRcdGFycmF5WyBvZmZzZXQgKyAxIF0gPSB0aGlzLmc7XG5cdFx0YXJyYXlbIG9mZnNldCArIDIgXSA9IHRoaXMuYjtcblxuXHRcdHJldHVybiBhcnJheTtcblxuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZ2V0SGV4KCk7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogVW5pZm9ybXMgbGlicmFyeSBmb3Igc2hhcmVkIHdlYmdsIHNoYWRlcnNcbiAqL1xuXG52YXIgVW5pZm9ybXNMaWIgPSB7XG5cblx0Y29tbW9uOiB7XG5cblx0XHRkaWZmdXNlOiB7IHZhbHVlOiBuZXcgQ29sb3IoIDB4ZWVlZWVlICkgfSxcblx0XHRvcGFjaXR5OiB7IHZhbHVlOiAxLjAgfSxcblxuXHRcdG1hcDogeyB2YWx1ZTogbnVsbCB9LFxuXHRcdHV2VHJhbnNmb3JtOiB7IHZhbHVlOiBuZXcgTWF0cml4MygpIH0sXG5cblx0XHRhbHBoYU1hcDogeyB2YWx1ZTogbnVsbCB9LFxuXG5cdH0sXG5cblx0c3BlY3VsYXJtYXA6IHtcblxuXHRcdHNwZWN1bGFyTWFwOiB7IHZhbHVlOiBudWxsIH0sXG5cblx0fSxcblxuXHRlbnZtYXA6IHtcblxuXHRcdGVudk1hcDogeyB2YWx1ZTogbnVsbCB9LFxuXHRcdGZsaXBFbnZNYXA6IHsgdmFsdWU6IC0gMSB9LFxuXHRcdHJlZmxlY3Rpdml0eTogeyB2YWx1ZTogMS4wIH0sXG5cdFx0cmVmcmFjdGlvblJhdGlvOiB7IHZhbHVlOiAwLjk4IH0sXG5cdFx0bWF4TWlwTGV2ZWw6IHsgdmFsdWU6IDAgfVxuXG5cdH0sXG5cblx0YW9tYXA6IHtcblxuXHRcdGFvTWFwOiB7IHZhbHVlOiBudWxsIH0sXG5cdFx0YW9NYXBJbnRlbnNpdHk6IHsgdmFsdWU6IDEgfVxuXG5cdH0sXG5cblx0bGlnaHRtYXA6IHtcblxuXHRcdGxpZ2h0TWFwOiB7IHZhbHVlOiBudWxsIH0sXG5cdFx0bGlnaHRNYXBJbnRlbnNpdHk6IHsgdmFsdWU6IDEgfVxuXG5cdH0sXG5cblx0ZW1pc3NpdmVtYXA6IHtcblxuXHRcdGVtaXNzaXZlTWFwOiB7IHZhbHVlOiBudWxsIH1cblxuXHR9LFxuXG5cdGJ1bXBtYXA6IHtcblxuXHRcdGJ1bXBNYXA6IHsgdmFsdWU6IG51bGwgfSxcblx0XHRidW1wU2NhbGU6IHsgdmFsdWU6IDEgfVxuXG5cdH0sXG5cblx0bm9ybWFsbWFwOiB7XG5cblx0XHRub3JtYWxNYXA6IHsgdmFsdWU6IG51bGwgfSxcblx0XHRub3JtYWxTY2FsZTogeyB2YWx1ZTogbmV3IFZlY3RvcjIoIDEsIDEgKSB9XG5cblx0fSxcblxuXHRkaXNwbGFjZW1lbnRtYXA6IHtcblxuXHRcdGRpc3BsYWNlbWVudE1hcDogeyB2YWx1ZTogbnVsbCB9LFxuXHRcdGRpc3BsYWNlbWVudFNjYWxlOiB7IHZhbHVlOiAxIH0sXG5cdFx0ZGlzcGxhY2VtZW50QmlhczogeyB2YWx1ZTogMCB9XG5cblx0fSxcblxuXHRyb3VnaG5lc3NtYXA6IHtcblxuXHRcdHJvdWdobmVzc01hcDogeyB2YWx1ZTogbnVsbCB9XG5cblx0fSxcblxuXHRtZXRhbG5lc3NtYXA6IHtcblxuXHRcdG1ldGFsbmVzc01hcDogeyB2YWx1ZTogbnVsbCB9XG5cblx0fSxcblxuXHRncmFkaWVudG1hcDoge1xuXG5cdFx0Z3JhZGllbnRNYXA6IHsgdmFsdWU6IG51bGwgfVxuXG5cdH0sXG5cblx0Zm9nOiB7XG5cblx0XHRmb2dEZW5zaXR5OiB7IHZhbHVlOiAwLjAwMDI1IH0sXG5cdFx0Zm9nTmVhcjogeyB2YWx1ZTogMSB9LFxuXHRcdGZvZ0ZhcjogeyB2YWx1ZTogMjAwMCB9LFxuXHRcdGZvZ0NvbG9yOiB7IHZhbHVlOiBuZXcgQ29sb3IoIDB4ZmZmZmZmICkgfVxuXG5cdH0sXG5cblx0bGlnaHRzOiB7XG5cblx0XHRhbWJpZW50TGlnaHRDb2xvcjogeyB2YWx1ZTogW10gfSxcblxuXHRcdGRpcmVjdGlvbmFsTGlnaHRzOiB7IHZhbHVlOiBbXSwgcHJvcGVydGllczoge1xuXHRcdFx0ZGlyZWN0aW9uOiB7fSxcblx0XHRcdGNvbG9yOiB7fSxcblxuXHRcdFx0c2hhZG93OiB7fSxcblx0XHRcdHNoYWRvd0JpYXM6IHt9LFxuXHRcdFx0c2hhZG93UmFkaXVzOiB7fSxcblx0XHRcdHNoYWRvd01hcFNpemU6IHt9XG5cdFx0fSB9LFxuXG5cdFx0ZGlyZWN0aW9uYWxTaGFkb3dNYXA6IHsgdmFsdWU6IFtdIH0sXG5cdFx0ZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXg6IHsgdmFsdWU6IFtdIH0sXG5cblx0XHRzcG90TGlnaHRzOiB7IHZhbHVlOiBbXSwgcHJvcGVydGllczoge1xuXHRcdFx0Y29sb3I6IHt9LFxuXHRcdFx0cG9zaXRpb246IHt9LFxuXHRcdFx0ZGlyZWN0aW9uOiB7fSxcblx0XHRcdGRpc3RhbmNlOiB7fSxcblx0XHRcdGNvbmVDb3M6IHt9LFxuXHRcdFx0cGVudW1icmFDb3M6IHt9LFxuXHRcdFx0ZGVjYXk6IHt9LFxuXG5cdFx0XHRzaGFkb3c6IHt9LFxuXHRcdFx0c2hhZG93Qmlhczoge30sXG5cdFx0XHRzaGFkb3dSYWRpdXM6IHt9LFxuXHRcdFx0c2hhZG93TWFwU2l6ZToge31cblx0XHR9IH0sXG5cblx0XHRzcG90U2hhZG93TWFwOiB7IHZhbHVlOiBbXSB9LFxuXHRcdHNwb3RTaGFkb3dNYXRyaXg6IHsgdmFsdWU6IFtdIH0sXG5cblx0XHRwb2ludExpZ2h0czogeyB2YWx1ZTogW10sIHByb3BlcnRpZXM6IHtcblx0XHRcdGNvbG9yOiB7fSxcblx0XHRcdHBvc2l0aW9uOiB7fSxcblx0XHRcdGRlY2F5OiB7fSxcblx0XHRcdGRpc3RhbmNlOiB7fSxcblxuXHRcdFx0c2hhZG93OiB7fSxcblx0XHRcdHNoYWRvd0JpYXM6IHt9LFxuXHRcdFx0c2hhZG93UmFkaXVzOiB7fSxcblx0XHRcdHNoYWRvd01hcFNpemU6IHt9LFxuXHRcdFx0c2hhZG93Q2FtZXJhTmVhcjoge30sXG5cdFx0XHRzaGFkb3dDYW1lcmFGYXI6IHt9XG5cdFx0fSB9LFxuXG5cdFx0cG9pbnRTaGFkb3dNYXA6IHsgdmFsdWU6IFtdIH0sXG5cdFx0cG9pbnRTaGFkb3dNYXRyaXg6IHsgdmFsdWU6IFtdIH0sXG5cblx0XHRoZW1pc3BoZXJlTGlnaHRzOiB7IHZhbHVlOiBbXSwgcHJvcGVydGllczoge1xuXHRcdFx0ZGlyZWN0aW9uOiB7fSxcblx0XHRcdHNreUNvbG9yOiB7fSxcblx0XHRcdGdyb3VuZENvbG9yOiB7fVxuXHRcdH0gfSxcblxuXHRcdC8vIFRPRE8gKGFiZWxuYXRpb24pOiBSZWN0QXJlYUxpZ2h0IEJSREYgZGF0YSBuZWVkcyB0byBiZSBtb3ZlZCBmcm9tIGV4YW1wbGUgdG8gbWFpbiBzcmNcblx0XHRyZWN0QXJlYUxpZ2h0czogeyB2YWx1ZTogW10sIHByb3BlcnRpZXM6IHtcblx0XHRcdGNvbG9yOiB7fSxcblx0XHRcdHBvc2l0aW9uOiB7fSxcblx0XHRcdHdpZHRoOiB7fSxcblx0XHRcdGhlaWdodDoge31cblx0XHR9IH1cblxuXHR9LFxuXG5cdHBvaW50czoge1xuXG5cdFx0ZGlmZnVzZTogeyB2YWx1ZTogbmV3IENvbG9yKCAweGVlZWVlZSApIH0sXG5cdFx0b3BhY2l0eTogeyB2YWx1ZTogMS4wIH0sXG5cdFx0c2l6ZTogeyB2YWx1ZTogMS4wIH0sXG5cdFx0c2NhbGU6IHsgdmFsdWU6IDEuMCB9LFxuXHRcdG1hcDogeyB2YWx1ZTogbnVsbCB9LFxuXHRcdHV2VHJhbnNmb3JtOiB7IHZhbHVlOiBuZXcgTWF0cml4MygpIH1cblxuXHR9XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIG1pa2FlbCBlbXRpbmdlciAvIGh0dHA6Ly9nb21vLnNlL1xuICovXG5cbnZhciBTaGFkZXJMaWIgPSB7XG5cblx0YmFzaWM6IHtcblxuXHRcdHVuaWZvcm1zOiBVbmlmb3Jtc1V0aWxzLm1lcmdlKCBbXG5cdFx0XHRVbmlmb3Jtc0xpYi5jb21tb24sXG5cdFx0XHRVbmlmb3Jtc0xpYi5zcGVjdWxhcm1hcCxcblx0XHRcdFVuaWZvcm1zTGliLmVudm1hcCxcblx0XHRcdFVuaWZvcm1zTGliLmFvbWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIubGlnaHRtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5mb2dcblx0XHRdICksXG5cblx0XHR2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLm1lc2hiYXNpY192ZXJ0LFxuXHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5tZXNoYmFzaWNfZnJhZ1xuXG5cdH0sXG5cblx0bGFtYmVydDoge1xuXG5cdFx0dW5pZm9ybXM6IFVuaWZvcm1zVXRpbHMubWVyZ2UoIFtcblx0XHRcdFVuaWZvcm1zTGliLmNvbW1vbixcblx0XHRcdFVuaWZvcm1zTGliLnNwZWN1bGFybWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuZW52bWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuYW9tYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5saWdodG1hcCxcblx0XHRcdFVuaWZvcm1zTGliLmVtaXNzaXZlbWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuZm9nLFxuXHRcdFx0VW5pZm9ybXNMaWIubGlnaHRzLFxuXHRcdFx0e1xuXHRcdFx0XHRlbWlzc2l2ZTogeyB2YWx1ZTogbmV3IENvbG9yKCAweDAwMDAwMCApIH1cblx0XHRcdH1cblx0XHRdICksXG5cblx0XHR2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLm1lc2hsYW1iZXJ0X3ZlcnQsXG5cdFx0ZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5rLm1lc2hsYW1iZXJ0X2ZyYWdcblxuXHR9LFxuXG5cdHBob25nOiB7XG5cblx0XHR1bmlmb3JtczogVW5pZm9ybXNVdGlscy5tZXJnZSggW1xuXHRcdFx0VW5pZm9ybXNMaWIuY29tbW9uLFxuXHRcdFx0VW5pZm9ybXNMaWIuc3BlY3VsYXJtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5lbnZtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5hb21hcCxcblx0XHRcdFVuaWZvcm1zTGliLmxpZ2h0bWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuZW1pc3NpdmVtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5idW1wbWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIubm9ybWFsbWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuZGlzcGxhY2VtZW50bWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuZ3JhZGllbnRtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5mb2csXG5cdFx0XHRVbmlmb3Jtc0xpYi5saWdodHMsXG5cdFx0XHR7XG5cdFx0XHRcdGVtaXNzaXZlOiB7IHZhbHVlOiBuZXcgQ29sb3IoIDB4MDAwMDAwICkgfSxcblx0XHRcdFx0c3BlY3VsYXI6IHsgdmFsdWU6IG5ldyBDb2xvciggMHgxMTExMTEgKSB9LFxuXHRcdFx0XHRzaGluaW5lc3M6IHsgdmFsdWU6IDMwIH1cblx0XHRcdH1cblx0XHRdICksXG5cblx0XHR2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLm1lc2hwaG9uZ192ZXJ0LFxuXHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5tZXNocGhvbmdfZnJhZ1xuXG5cdH0sXG5cblx0c3RhbmRhcmQ6IHtcblxuXHRcdHVuaWZvcm1zOiBVbmlmb3Jtc1V0aWxzLm1lcmdlKCBbXG5cdFx0XHRVbmlmb3Jtc0xpYi5jb21tb24sXG5cdFx0XHRVbmlmb3Jtc0xpYi5lbnZtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5hb21hcCxcblx0XHRcdFVuaWZvcm1zTGliLmxpZ2h0bWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuZW1pc3NpdmVtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5idW1wbWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIubm9ybWFsbWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuZGlzcGxhY2VtZW50bWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIucm91Z2huZXNzbWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIubWV0YWxuZXNzbWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuZm9nLFxuXHRcdFx0VW5pZm9ybXNMaWIubGlnaHRzLFxuXHRcdFx0e1xuXHRcdFx0XHRlbWlzc2l2ZTogeyB2YWx1ZTogbmV3IENvbG9yKCAweDAwMDAwMCApIH0sXG5cdFx0XHRcdHJvdWdobmVzczogeyB2YWx1ZTogMC41IH0sXG5cdFx0XHRcdG1ldGFsbmVzczogeyB2YWx1ZTogMC41IH0sXG5cdFx0XHRcdGVudk1hcEludGVuc2l0eTogeyB2YWx1ZTogMSB9IC8vIHRlbXBvcmFyeVxuXHRcdFx0fVxuXHRcdF0gKSxcblxuXHRcdHZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsubWVzaHBoeXNpY2FsX3ZlcnQsXG5cdFx0ZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5rLm1lc2hwaHlzaWNhbF9mcmFnXG5cblx0fSxcblxuXHRwb2ludHM6IHtcblxuXHRcdHVuaWZvcm1zOiBVbmlmb3Jtc1V0aWxzLm1lcmdlKCBbXG5cdFx0XHRVbmlmb3Jtc0xpYi5wb2ludHMsXG5cdFx0XHRVbmlmb3Jtc0xpYi5mb2dcblx0XHRdICksXG5cblx0XHR2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLnBvaW50c192ZXJ0LFxuXHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5wb2ludHNfZnJhZ1xuXG5cdH0sXG5cblx0ZGFzaGVkOiB7XG5cblx0XHR1bmlmb3JtczogVW5pZm9ybXNVdGlscy5tZXJnZSggW1xuXHRcdFx0VW5pZm9ybXNMaWIuY29tbW9uLFxuXHRcdFx0VW5pZm9ybXNMaWIuZm9nLFxuXHRcdFx0e1xuXHRcdFx0XHRzY2FsZTogeyB2YWx1ZTogMSB9LFxuXHRcdFx0XHRkYXNoU2l6ZTogeyB2YWx1ZTogMSB9LFxuXHRcdFx0XHR0b3RhbFNpemU6IHsgdmFsdWU6IDIgfVxuXHRcdFx0fVxuXHRcdF0gKSxcblxuXHRcdHZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsubGluZWRhc2hlZF92ZXJ0LFxuXHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5saW5lZGFzaGVkX2ZyYWdcblxuXHR9LFxuXG5cdGRlcHRoOiB7XG5cblx0XHR1bmlmb3JtczogVW5pZm9ybXNVdGlscy5tZXJnZSggW1xuXHRcdFx0VW5pZm9ybXNMaWIuY29tbW9uLFxuXHRcdFx0VW5pZm9ybXNMaWIuZGlzcGxhY2VtZW50bWFwXG5cdFx0XSApLFxuXG5cdFx0dmVydGV4U2hhZGVyOiBTaGFkZXJDaHVuay5kZXB0aF92ZXJ0LFxuXHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5kZXB0aF9mcmFnXG5cblx0fSxcblxuXHRub3JtYWw6IHtcblxuXHRcdHVuaWZvcm1zOiBVbmlmb3Jtc1V0aWxzLm1lcmdlKCBbXG5cdFx0XHRVbmlmb3Jtc0xpYi5jb21tb24sXG5cdFx0XHRVbmlmb3Jtc0xpYi5idW1wbWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIubm9ybWFsbWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuZGlzcGxhY2VtZW50bWFwLFxuXHRcdFx0e1xuXHRcdFx0XHRvcGFjaXR5OiB7IHZhbHVlOiAxLjAgfVxuXHRcdFx0fVxuXHRcdF0gKSxcblxuXHRcdHZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsubm9ybWFsX3ZlcnQsXG5cdFx0ZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5rLm5vcm1hbF9mcmFnXG5cblx0fSxcblxuXHQvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cdC8vXHRDdWJlIG1hcCBzaGFkZXJcblx0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuXHRjdWJlOiB7XG5cblx0XHR1bmlmb3Jtczoge1xuXHRcdFx0dEN1YmU6IHsgdmFsdWU6IG51bGwgfSxcblx0XHRcdHRGbGlwOiB7IHZhbHVlOiAtIDEgfSxcblx0XHRcdG9wYWNpdHk6IHsgdmFsdWU6IDEuMCB9XG5cdFx0fSxcblxuXHRcdHZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsuY3ViZV92ZXJ0LFxuXHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5jdWJlX2ZyYWdcblxuXHR9LFxuXG5cdGVxdWlyZWN0OiB7XG5cblx0XHR1bmlmb3Jtczoge1xuXHRcdFx0dEVxdWlyZWN0OiB7IHZhbHVlOiBudWxsIH0sXG5cdFx0fSxcblxuXHRcdHZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsuZXF1aXJlY3RfdmVydCxcblx0XHRmcmFnbWVudFNoYWRlcjogU2hhZGVyQ2h1bmsuZXF1aXJlY3RfZnJhZ1xuXG5cdH0sXG5cblx0ZGlzdGFuY2VSR0JBOiB7XG5cblx0XHR1bmlmb3JtczogVW5pZm9ybXNVdGlscy5tZXJnZSggW1xuXHRcdFx0VW5pZm9ybXNMaWIuY29tbW9uLFxuXHRcdFx0VW5pZm9ybXNMaWIuZGlzcGxhY2VtZW50bWFwLFxuXHRcdFx0e1xuXHRcdFx0XHRyZWZlcmVuY2VQb3NpdGlvbjogeyB2YWx1ZTogbmV3IFZlY3RvcjMoKSB9LFxuXHRcdFx0XHRuZWFyRGlzdGFuY2U6IHsgdmFsdWU6IDEgfSxcblx0XHRcdFx0ZmFyRGlzdGFuY2U6IHsgdmFsdWU6IDEwMDAgfVxuXHRcdFx0fVxuXHRcdF0gKSxcblxuXHRcdHZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsuZGlzdGFuY2VSR0JBX3ZlcnQsXG5cdFx0ZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5rLmRpc3RhbmNlUkdCQV9mcmFnXG5cblx0fSxcblxuXHRzaGFkb3c6IHtcblxuXHRcdHVuaWZvcm1zOiBVbmlmb3Jtc1V0aWxzLm1lcmdlKCBbXG5cdFx0XHRVbmlmb3Jtc0xpYi5saWdodHMsXG5cdFx0XHRVbmlmb3Jtc0xpYi5mb2csXG5cdFx0XHR7XG5cdFx0XHRcdGNvbG9yOiB7IHZhbHVlOiBuZXcgQ29sb3IoIDB4MDAwMDAgKSB9LFxuXHRcdFx0XHRvcGFjaXR5OiB7IHZhbHVlOiAxLjAgfVxuXHRcdFx0fSxcblx0XHRdICksXG5cblx0XHR2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLnNoYWRvd192ZXJ0LFxuXHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5zaGFkb3dfZnJhZ1xuXG5cdH1cblxufTtcblxuU2hhZGVyTGliLnBoeXNpY2FsID0ge1xuXG5cdHVuaWZvcm1zOiBVbmlmb3Jtc1V0aWxzLm1lcmdlKCBbXG5cdFx0U2hhZGVyTGliLnN0YW5kYXJkLnVuaWZvcm1zLFxuXHRcdHtcblx0XHRcdGNsZWFyQ29hdDogeyB2YWx1ZTogMCB9LFxuXHRcdFx0Y2xlYXJDb2F0Um91Z2huZXNzOiB7IHZhbHVlOiAwIH1cblx0XHR9XG5cdF0gKSxcblxuXHR2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLm1lc2hwaHlzaWNhbF92ZXJ0LFxuXHRmcmFnbWVudFNoYWRlcjogU2hhZGVyQ2h1bmsubWVzaHBoeXNpY2FsX2ZyYWdcblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIFdlYkdMQXR0cmlidXRlcyggZ2wgKSB7XG5cblx0dmFyIGJ1ZmZlcnMgPSBuZXcgV2Vha01hcCgpO1xuXG5cdGZ1bmN0aW9uIGNyZWF0ZUJ1ZmZlciggYXR0cmlidXRlLCBidWZmZXJUeXBlICkge1xuXG5cdFx0dmFyIGFycmF5ID0gYXR0cmlidXRlLmFycmF5O1xuXHRcdHZhciB1c2FnZSA9IGF0dHJpYnV0ZS5keW5hbWljID8gZ2wuRFlOQU1JQ19EUkFXIDogZ2wuU1RBVElDX0RSQVc7XG5cblx0XHR2YXIgYnVmZmVyID0gZ2wuY3JlYXRlQnVmZmVyKCk7XG5cblx0XHRnbC5iaW5kQnVmZmVyKCBidWZmZXJUeXBlLCBidWZmZXIgKTtcblx0XHRnbC5idWZmZXJEYXRhKCBidWZmZXJUeXBlLCBhcnJheSwgdXNhZ2UgKTtcblxuXHRcdGF0dHJpYnV0ZS5vblVwbG9hZENhbGxiYWNrKCk7XG5cblx0XHR2YXIgdHlwZSA9IGdsLkZMT0FUO1xuXG5cdFx0aWYgKCBhcnJheSBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheSApIHtcblxuXHRcdFx0dHlwZSA9IGdsLkZMT0FUO1xuXG5cdFx0fSBlbHNlIGlmICggYXJyYXkgaW5zdGFuY2VvZiBGbG9hdDY0QXJyYXkgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMQXR0cmlidXRlczogVW5zdXBwb3J0ZWQgZGF0YSBidWZmZXIgZm9ybWF0OiBGbG9hdDY0QXJyYXkuJyApO1xuXG5cdFx0fSBlbHNlIGlmICggYXJyYXkgaW5zdGFuY2VvZiBVaW50MTZBcnJheSApIHtcblxuXHRcdFx0dHlwZSA9IGdsLlVOU0lHTkVEX1NIT1JUO1xuXG5cdFx0fSBlbHNlIGlmICggYXJyYXkgaW5zdGFuY2VvZiBJbnQxNkFycmF5ICkge1xuXG5cdFx0XHR0eXBlID0gZ2wuU0hPUlQ7XG5cblx0XHR9IGVsc2UgaWYgKCBhcnJheSBpbnN0YW5jZW9mIFVpbnQzMkFycmF5ICkge1xuXG5cdFx0XHR0eXBlID0gZ2wuVU5TSUdORURfSU5UO1xuXG5cdFx0fSBlbHNlIGlmICggYXJyYXkgaW5zdGFuY2VvZiBJbnQzMkFycmF5ICkge1xuXG5cdFx0XHR0eXBlID0gZ2wuSU5UO1xuXG5cdFx0fSBlbHNlIGlmICggYXJyYXkgaW5zdGFuY2VvZiBJbnQ4QXJyYXkgKSB7XG5cblx0XHRcdHR5cGUgPSBnbC5CWVRFO1xuXG5cdFx0fSBlbHNlIGlmICggYXJyYXkgaW5zdGFuY2VvZiBVaW50OEFycmF5ICkge1xuXG5cdFx0XHR0eXBlID0gZ2wuVU5TSUdORURfQllURTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB7XG5cdFx0XHRidWZmZXI6IGJ1ZmZlcixcblx0XHRcdHR5cGU6IHR5cGUsXG5cdFx0XHRieXRlc1BlckVsZW1lbnQ6IGFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULFxuXHRcdFx0dmVyc2lvbjogYXR0cmlidXRlLnZlcnNpb25cblx0XHR9O1xuXG5cdH1cblxuXHRmdW5jdGlvbiB1cGRhdGVCdWZmZXIoIGJ1ZmZlciwgYXR0cmlidXRlLCBidWZmZXJUeXBlICkge1xuXG5cdFx0dmFyIGFycmF5ID0gYXR0cmlidXRlLmFycmF5O1xuXHRcdHZhciB1cGRhdGVSYW5nZSA9IGF0dHJpYnV0ZS51cGRhdGVSYW5nZTtcblxuXHRcdGdsLmJpbmRCdWZmZXIoIGJ1ZmZlclR5cGUsIGJ1ZmZlciApO1xuXG5cdFx0aWYgKCBhdHRyaWJ1dGUuZHluYW1pYyA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdGdsLmJ1ZmZlckRhdGEoIGJ1ZmZlclR5cGUsIGFycmF5LCBnbC5TVEFUSUNfRFJBVyApO1xuXG5cdFx0fSBlbHNlIGlmICggdXBkYXRlUmFuZ2UuY291bnQgPT09IC0gMSApIHtcblxuXHRcdFx0Ly8gTm90IHVzaW5nIHVwZGF0ZSByYW5nZXNcblxuXHRcdFx0Z2wuYnVmZmVyU3ViRGF0YSggYnVmZmVyVHlwZSwgMCwgYXJyYXkgKTtcblxuXHRcdH0gZWxzZSBpZiAoIHVwZGF0ZVJhbmdlLmNvdW50ID09PSAwICkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuV2ViR0xPYmplY3RzLnVwZGF0ZUJ1ZmZlcjogZHluYW1pYyBUSFJFRS5CdWZmZXJBdHRyaWJ1dGUgbWFya2VkIGFzIG5lZWRzVXBkYXRlIGJ1dCB1cGRhdGVSYW5nZS5jb3VudCBpcyAwLCBlbnN1cmUgeW91IGFyZSB1c2luZyBzZXQgbWV0aG9kcyBvciB1cGRhdGluZyBtYW51YWxseS4nICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRnbC5idWZmZXJTdWJEYXRhKCBidWZmZXJUeXBlLCB1cGRhdGVSYW5nZS5vZmZzZXQgKiBhcnJheS5CWVRFU19QRVJfRUxFTUVOVCxcblx0XHRcdFx0YXJyYXkuc3ViYXJyYXkoIHVwZGF0ZVJhbmdlLm9mZnNldCwgdXBkYXRlUmFuZ2Uub2Zmc2V0ICsgdXBkYXRlUmFuZ2UuY291bnQgKSApO1xuXG5cdFx0XHR1cGRhdGVSYW5nZS5jb3VudCA9IC0gMTsgLy8gcmVzZXQgcmFuZ2VcblxuXHRcdH1cblxuXHR9XG5cblx0Ly9cblxuXHRmdW5jdGlvbiBnZXQoIGF0dHJpYnV0ZSApIHtcblxuXHRcdGlmICggYXR0cmlidXRlLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUgKSBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGUuZGF0YTtcblxuXHRcdHJldHVybiBidWZmZXJzLmdldCggYXR0cmlidXRlICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlbW92ZSggYXR0cmlidXRlICkge1xuXG5cdFx0aWYgKCBhdHRyaWJ1dGUuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSApIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZS5kYXRhO1xuXG5cdFx0dmFyIGRhdGEgPSBidWZmZXJzLmdldCggYXR0cmlidXRlICk7XG5cblx0XHRpZiAoIGRhdGEgKSB7XG5cblx0XHRcdGdsLmRlbGV0ZUJ1ZmZlciggZGF0YS5idWZmZXIgKTtcblxuXHRcdFx0YnVmZmVycy5kZWxldGUoIGF0dHJpYnV0ZSApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiB1cGRhdGUoIGF0dHJpYnV0ZSwgYnVmZmVyVHlwZSApIHtcblxuXHRcdGlmICggYXR0cmlidXRlLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUgKSBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGUuZGF0YTtcblxuXHRcdHZhciBkYXRhID0gYnVmZmVycy5nZXQoIGF0dHJpYnV0ZSApO1xuXG5cdFx0aWYgKCBkYXRhID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGJ1ZmZlcnMuc2V0KCBhdHRyaWJ1dGUsIGNyZWF0ZUJ1ZmZlciggYXR0cmlidXRlLCBidWZmZXJUeXBlICkgKTtcblxuXHRcdH0gZWxzZSBpZiAoIGRhdGEudmVyc2lvbiA8IGF0dHJpYnV0ZS52ZXJzaW9uICkge1xuXG5cdFx0XHR1cGRhdGVCdWZmZXIoIGRhdGEuYnVmZmVyLCBhdHRyaWJ1dGUsIGJ1ZmZlclR5cGUgKTtcblxuXHRcdFx0ZGF0YS52ZXJzaW9uID0gYXR0cmlidXRlLnZlcnNpb247XG5cblx0XHR9XG5cblx0fVxuXG5cdHJldHVybiB7XG5cblx0XHRnZXQ6IGdldCxcblx0XHRyZW1vdmU6IHJlbW92ZSxcblx0XHR1cGRhdGU6IHVwZGF0ZVxuXG5cdH07XG5cbn1cblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvXG4gKi9cblxuZnVuY3Rpb24gRXVsZXIoIHgsIHksIHosIG9yZGVyICkge1xuXG5cdHRoaXMuX3ggPSB4IHx8IDA7XG5cdHRoaXMuX3kgPSB5IHx8IDA7XG5cdHRoaXMuX3ogPSB6IHx8IDA7XG5cdHRoaXMuX29yZGVyID0gb3JkZXIgfHwgRXVsZXIuRGVmYXVsdE9yZGVyO1xuXG59XG5cbkV1bGVyLlJvdGF0aW9uT3JkZXJzID0gWyAnWFlaJywgJ1laWCcsICdaWFknLCAnWFpZJywgJ1lYWicsICdaWVgnIF07XG5cbkV1bGVyLkRlZmF1bHRPcmRlciA9ICdYWVonO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyggRXVsZXIucHJvdG90eXBlLCB7XG5cblx0eDoge1xuXG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLl94O1xuXG5cdFx0fSxcblxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0dGhpcy5feCA9IHZhbHVlO1xuXHRcdFx0dGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHR9XG5cblx0fSxcblxuXHR5OiB7XG5cblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMuX3k7XG5cblx0XHR9LFxuXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHR0aGlzLl95ID0gdmFsdWU7XG5cdFx0XHR0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdHo6IHtcblxuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5fejtcblxuXHRcdH0sXG5cblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdHRoaXMuX3ogPSB2YWx1ZTtcblx0XHRcdHRoaXMub25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0b3JkZXI6IHtcblxuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5fb3JkZXI7XG5cblx0XHR9LFxuXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHR0aGlzLl9vcmRlciA9IHZhbHVlO1xuXHRcdFx0dGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHR9XG5cblx0fVxuXG59ICk7XG5cbk9iamVjdC5hc3NpZ24oIEV1bGVyLnByb3RvdHlwZSwge1xuXG5cdGlzRXVsZXI6IHRydWUsXG5cblx0c2V0OiBmdW5jdGlvbiAoIHgsIHksIHosIG9yZGVyICkge1xuXG5cdFx0dGhpcy5feCA9IHg7XG5cdFx0dGhpcy5feSA9IHk7XG5cdFx0dGhpcy5feiA9IHo7XG5cdFx0dGhpcy5fb3JkZXIgPSBvcmRlciB8fCB0aGlzLl9vcmRlcjtcblxuXHRcdHRoaXMub25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCB0aGlzLl94LCB0aGlzLl95LCB0aGlzLl96LCB0aGlzLl9vcmRlciApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBldWxlciApIHtcblxuXHRcdHRoaXMuX3ggPSBldWxlci5feDtcblx0XHR0aGlzLl95ID0gZXVsZXIuX3k7XG5cdFx0dGhpcy5feiA9IGV1bGVyLl96O1xuXHRcdHRoaXMuX29yZGVyID0gZXVsZXIuX29yZGVyO1xuXG5cdFx0dGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21Sb3RhdGlvbk1hdHJpeDogZnVuY3Rpb24gKCBtLCBvcmRlciwgdXBkYXRlICkge1xuXG5cdFx0dmFyIGNsYW1wID0gX01hdGguY2xhbXA7XG5cblx0XHQvLyBhc3N1bWVzIHRoZSB1cHBlciAzeDMgb2YgbSBpcyBhIHB1cmUgcm90YXRpb24gbWF0cml4IChpLmUsIHVuc2NhbGVkKVxuXG5cdFx0dmFyIHRlID0gbS5lbGVtZW50cztcblx0XHR2YXIgbTExID0gdGVbIDAgXSwgbTEyID0gdGVbIDQgXSwgbTEzID0gdGVbIDggXTtcblx0XHR2YXIgbTIxID0gdGVbIDEgXSwgbTIyID0gdGVbIDUgXSwgbTIzID0gdGVbIDkgXTtcblx0XHR2YXIgbTMxID0gdGVbIDIgXSwgbTMyID0gdGVbIDYgXSwgbTMzID0gdGVbIDEwIF07XG5cblx0XHRvcmRlciA9IG9yZGVyIHx8IHRoaXMuX29yZGVyO1xuXG5cdFx0aWYgKCBvcmRlciA9PT0gJ1hZWicgKSB7XG5cblx0XHRcdHRoaXMuX3kgPSBNYXRoLmFzaW4oIGNsYW1wKCBtMTMsIC0gMSwgMSApICk7XG5cblx0XHRcdGlmICggTWF0aC5hYnMoIG0xMyApIDwgMC45OTk5OSApIHtcblxuXHRcdFx0XHR0aGlzLl94ID0gTWF0aC5hdGFuMiggLSBtMjMsIG0zMyApO1xuXHRcdFx0XHR0aGlzLl96ID0gTWF0aC5hdGFuMiggLSBtMTIsIG0xMSApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHRoaXMuX3ggPSBNYXRoLmF0YW4yKCBtMzIsIG0yMiApO1xuXHRcdFx0XHR0aGlzLl96ID0gMDtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIGlmICggb3JkZXIgPT09ICdZWFonICkge1xuXG5cdFx0XHR0aGlzLl94ID0gTWF0aC5hc2luKCAtIGNsYW1wKCBtMjMsIC0gMSwgMSApICk7XG5cblx0XHRcdGlmICggTWF0aC5hYnMoIG0yMyApIDwgMC45OTk5OSApIHtcblxuXHRcdFx0XHR0aGlzLl95ID0gTWF0aC5hdGFuMiggbTEzLCBtMzMgKTtcblx0XHRcdFx0dGhpcy5feiA9IE1hdGguYXRhbjIoIG0yMSwgbTIyICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0dGhpcy5feSA9IE1hdGguYXRhbjIoIC0gbTMxLCBtMTEgKTtcblx0XHRcdFx0dGhpcy5feiA9IDA7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSBpZiAoIG9yZGVyID09PSAnWlhZJyApIHtcblxuXHRcdFx0dGhpcy5feCA9IE1hdGguYXNpbiggY2xhbXAoIG0zMiwgLSAxLCAxICkgKTtcblxuXHRcdFx0aWYgKCBNYXRoLmFicyggbTMyICkgPCAwLjk5OTk5ICkge1xuXG5cdFx0XHRcdHRoaXMuX3kgPSBNYXRoLmF0YW4yKCAtIG0zMSwgbTMzICk7XG5cdFx0XHRcdHRoaXMuX3ogPSBNYXRoLmF0YW4yKCAtIG0xMiwgbTIyICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0dGhpcy5feSA9IDA7XG5cdFx0XHRcdHRoaXMuX3ogPSBNYXRoLmF0YW4yKCBtMjEsIG0xMSApO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2UgaWYgKCBvcmRlciA9PT0gJ1pZWCcgKSB7XG5cblx0XHRcdHRoaXMuX3kgPSBNYXRoLmFzaW4oIC0gY2xhbXAoIG0zMSwgLSAxLCAxICkgKTtcblxuXHRcdFx0aWYgKCBNYXRoLmFicyggbTMxICkgPCAwLjk5OTk5ICkge1xuXG5cdFx0XHRcdHRoaXMuX3ggPSBNYXRoLmF0YW4yKCBtMzIsIG0zMyApO1xuXHRcdFx0XHR0aGlzLl96ID0gTWF0aC5hdGFuMiggbTIxLCBtMTEgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHR0aGlzLl94ID0gMDtcblx0XHRcdFx0dGhpcy5feiA9IE1hdGguYXRhbjIoIC0gbTEyLCBtMjIgKTtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIGlmICggb3JkZXIgPT09ICdZWlgnICkge1xuXG5cdFx0XHR0aGlzLl96ID0gTWF0aC5hc2luKCBjbGFtcCggbTIxLCAtIDEsIDEgKSApO1xuXG5cdFx0XHRpZiAoIE1hdGguYWJzKCBtMjEgKSA8IDAuOTk5OTkgKSB7XG5cblx0XHRcdFx0dGhpcy5feCA9IE1hdGguYXRhbjIoIC0gbTIzLCBtMjIgKTtcblx0XHRcdFx0dGhpcy5feSA9IE1hdGguYXRhbjIoIC0gbTMxLCBtMTEgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHR0aGlzLl94ID0gMDtcblx0XHRcdFx0dGhpcy5feSA9IE1hdGguYXRhbjIoIG0xMywgbTMzICk7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSBpZiAoIG9yZGVyID09PSAnWFpZJyApIHtcblxuXHRcdFx0dGhpcy5feiA9IE1hdGguYXNpbiggLSBjbGFtcCggbTEyLCAtIDEsIDEgKSApO1xuXG5cdFx0XHRpZiAoIE1hdGguYWJzKCBtMTIgKSA8IDAuOTk5OTkgKSB7XG5cblx0XHRcdFx0dGhpcy5feCA9IE1hdGguYXRhbjIoIG0zMiwgbTIyICk7XG5cdFx0XHRcdHRoaXMuX3kgPSBNYXRoLmF0YW4yKCBtMTMsIG0xMSApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHRoaXMuX3ggPSBNYXRoLmF0YW4yKCAtIG0yMywgbTMzICk7XG5cdFx0XHRcdHRoaXMuX3kgPSAwO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5FdWxlcjogLnNldEZyb21Sb3RhdGlvbk1hdHJpeCgpIGdpdmVuIHVuc3VwcG9ydGVkIG9yZGVyOiAnICsgb3JkZXIgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMuX29yZGVyID0gb3JkZXI7XG5cblx0XHRpZiAoIHVwZGF0ZSAhPT0gZmFsc2UgKSB0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbVF1YXRlcm5pb246IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBtYXRyaXggPSBuZXcgTWF0cml4NCgpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHNldEZyb21RdWF0ZXJuaW9uKCBxLCBvcmRlciwgdXBkYXRlICkge1xuXG5cdFx0XHRtYXRyaXgubWFrZVJvdGF0aW9uRnJvbVF1YXRlcm5pb24oIHEgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXMuc2V0RnJvbVJvdGF0aW9uTWF0cml4KCBtYXRyaXgsIG9yZGVyLCB1cGRhdGUgKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHNldEZyb21WZWN0b3IzOiBmdW5jdGlvbiAoIHYsIG9yZGVyICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuc2V0KCB2LngsIHYueSwgdi56LCBvcmRlciB8fCB0aGlzLl9vcmRlciApO1xuXG5cdH0sXG5cblx0cmVvcmRlcjogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gV0FSTklORzogdGhpcyBkaXNjYXJkcyByZXZvbHV0aW9uIGluZm9ybWF0aW9uIC1iaG91c3RvblxuXG5cdFx0dmFyIHEgPSBuZXcgUXVhdGVybmlvbigpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHJlb3JkZXIoIG5ld09yZGVyICkge1xuXG5cdFx0XHRxLnNldEZyb21FdWxlciggdGhpcyApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5zZXRGcm9tUXVhdGVybmlvbiggcSwgbmV3T3JkZXIgKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGVxdWFsczogZnVuY3Rpb24gKCBldWxlciApIHtcblxuXHRcdHJldHVybiAoIGV1bGVyLl94ID09PSB0aGlzLl94ICkgJiYgKCBldWxlci5feSA9PT0gdGhpcy5feSApICYmICggZXVsZXIuX3ogPT09IHRoaXMuX3ogKSAmJiAoIGV1bGVyLl9vcmRlciA9PT0gdGhpcy5fb3JkZXIgKTtcblxuXHR9LFxuXG5cdGZyb21BcnJheTogZnVuY3Rpb24gKCBhcnJheSApIHtcblxuXHRcdHRoaXMuX3ggPSBhcnJheVsgMCBdO1xuXHRcdHRoaXMuX3kgPSBhcnJheVsgMSBdO1xuXHRcdHRoaXMuX3ogPSBhcnJheVsgMiBdO1xuXHRcdGlmICggYXJyYXlbIDMgXSAhPT0gdW5kZWZpbmVkICkgdGhpcy5fb3JkZXIgPSBhcnJheVsgMyBdO1xuXG5cdFx0dGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHRvQXJyYXk6IGZ1bmN0aW9uICggYXJyYXksIG9mZnNldCApIHtcblxuXHRcdGlmICggYXJyYXkgPT09IHVuZGVmaW5lZCApIGFycmF5ID0gW107XG5cdFx0aWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7XG5cblx0XHRhcnJheVsgb2Zmc2V0IF0gPSB0aGlzLl94O1xuXHRcdGFycmF5WyBvZmZzZXQgKyAxIF0gPSB0aGlzLl95O1xuXHRcdGFycmF5WyBvZmZzZXQgKyAyIF0gPSB0aGlzLl96O1xuXHRcdGFycmF5WyBvZmZzZXQgKyAzIF0gPSB0aGlzLl9vcmRlcjtcblxuXHRcdHJldHVybiBhcnJheTtcblxuXHR9LFxuXG5cdHRvVmVjdG9yMzogZnVuY3Rpb24gKCBvcHRpb25hbFJlc3VsdCApIHtcblxuXHRcdGlmICggb3B0aW9uYWxSZXN1bHQgKSB7XG5cblx0XHRcdHJldHVybiBvcHRpb25hbFJlc3VsdC5zZXQoIHRoaXMuX3gsIHRoaXMuX3ksIHRoaXMuX3ogKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHJldHVybiBuZXcgVmVjdG9yMyggdGhpcy5feCwgdGhpcy5feSwgdGhpcy5feiApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0b25DaGFuZ2U6IGZ1bmN0aW9uICggY2FsbGJhY2sgKSB7XG5cblx0XHR0aGlzLm9uQ2hhbmdlQ2FsbGJhY2sgPSBjYWxsYmFjaztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0b25DaGFuZ2VDYWxsYmFjazogZnVuY3Rpb24gKCkge31cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gTGF5ZXJzKCkge1xuXG5cdHRoaXMubWFzayA9IDEgfCAwO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIExheWVycy5wcm90b3R5cGUsIHtcblxuXHRzZXQ6IGZ1bmN0aW9uICggY2hhbm5lbCApIHtcblxuXHRcdHRoaXMubWFzayA9IDEgPDwgY2hhbm5lbCB8IDA7XG5cblx0fSxcblxuXHRlbmFibGU6IGZ1bmN0aW9uICggY2hhbm5lbCApIHtcblxuXHRcdHRoaXMubWFzayB8PSAxIDw8IGNoYW5uZWwgfCAwO1xuXG5cdH0sXG5cblx0dG9nZ2xlOiBmdW5jdGlvbiAoIGNoYW5uZWwgKSB7XG5cblx0XHR0aGlzLm1hc2sgXj0gMSA8PCBjaGFubmVsIHwgMDtcblxuXHR9LFxuXG5cdGRpc2FibGU6IGZ1bmN0aW9uICggY2hhbm5lbCApIHtcblxuXHRcdHRoaXMubWFzayAmPSB+ICggMSA8PCBjaGFubmVsIHwgMCApO1xuXG5cdH0sXG5cblx0dGVzdDogZnVuY3Rpb24gKCBsYXllcnMgKSB7XG5cblx0XHRyZXR1cm4gKCB0aGlzLm1hc2sgJiBsYXllcnMubWFzayApICE9PSAwO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIG1pa2FlbCBlbXRpbmdlciAvIGh0dHA6Ly9nb21vLnNlL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleVxuICogQGF1dGhvciBlbGVwaGFudGF0d29yayAvIHd3dy5lbGVwaGFudGF0d29yay5jaFxuICovXG5cbnZhciBvYmplY3QzRElkID0gMDtcblxuZnVuY3Rpb24gT2JqZWN0M0QoKSB7XG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KCB0aGlzLCAnaWQnLCB7IHZhbHVlOiBvYmplY3QzRElkICsrIH0gKTtcblxuXHR0aGlzLnV1aWQgPSBfTWF0aC5nZW5lcmF0ZVVVSUQoKTtcblxuXHR0aGlzLm5hbWUgPSAnJztcblx0dGhpcy50eXBlID0gJ09iamVjdDNEJztcblxuXHR0aGlzLnBhcmVudCA9IG51bGw7XG5cdHRoaXMuY2hpbGRyZW4gPSBbXTtcblxuXHR0aGlzLnVwID0gT2JqZWN0M0QuRGVmYXVsdFVwLmNsb25lKCk7XG5cblx0dmFyIHBvc2l0aW9uID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIHJvdGF0aW9uID0gbmV3IEV1bGVyKCk7XG5cdHZhciBxdWF0ZXJuaW9uID0gbmV3IFF1YXRlcm5pb24oKTtcblx0dmFyIHNjYWxlID0gbmV3IFZlY3RvcjMoIDEsIDEsIDEgKTtcblxuXHRmdW5jdGlvbiBvblJvdGF0aW9uQ2hhbmdlKCkge1xuXG5cdFx0cXVhdGVybmlvbi5zZXRGcm9tRXVsZXIoIHJvdGF0aW9uLCBmYWxzZSApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBvblF1YXRlcm5pb25DaGFuZ2UoKSB7XG5cblx0XHRyb3RhdGlvbi5zZXRGcm9tUXVhdGVybmlvbiggcXVhdGVybmlvbiwgdW5kZWZpbmVkLCBmYWxzZSApO1xuXG5cdH1cblxuXHRyb3RhdGlvbi5vbkNoYW5nZSggb25Sb3RhdGlvbkNoYW5nZSApO1xuXHRxdWF0ZXJuaW9uLm9uQ2hhbmdlKCBvblF1YXRlcm5pb25DaGFuZ2UgKTtcblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydGllcyggdGhpcywge1xuXHRcdHBvc2l0aW9uOiB7XG5cdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0dmFsdWU6IHBvc2l0aW9uXG5cdFx0fSxcblx0XHRyb3RhdGlvbjoge1xuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdHZhbHVlOiByb3RhdGlvblxuXHRcdH0sXG5cdFx0cXVhdGVybmlvbjoge1xuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdHZhbHVlOiBxdWF0ZXJuaW9uXG5cdFx0fSxcblx0XHRzY2FsZToge1xuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdHZhbHVlOiBzY2FsZVxuXHRcdH0sXG5cdFx0bW9kZWxWaWV3TWF0cml4OiB7XG5cdFx0XHR2YWx1ZTogbmV3IE1hdHJpeDQoKVxuXHRcdH0sXG5cdFx0bm9ybWFsTWF0cml4OiB7XG5cdFx0XHR2YWx1ZTogbmV3IE1hdHJpeDMoKVxuXHRcdH1cblx0fSApO1xuXG5cdHRoaXMubWF0cml4ID0gbmV3IE1hdHJpeDQoKTtcblx0dGhpcy5tYXRyaXhXb3JsZCA9IG5ldyBNYXRyaXg0KCk7XG5cblx0dGhpcy5tYXRyaXhBdXRvVXBkYXRlID0gT2JqZWN0M0QuRGVmYXVsdE1hdHJpeEF1dG9VcGRhdGU7XG5cdHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZSA9IGZhbHNlO1xuXG5cdHRoaXMubGF5ZXJzID0gbmV3IExheWVycygpO1xuXHR0aGlzLnZpc2libGUgPSB0cnVlO1xuXG5cdHRoaXMuY2FzdFNoYWRvdyA9IGZhbHNlO1xuXHR0aGlzLnJlY2VpdmVTaGFkb3cgPSBmYWxzZTtcblxuXHR0aGlzLmZydXN0dW1DdWxsZWQgPSB0cnVlO1xuXHR0aGlzLnJlbmRlck9yZGVyID0gMDtcblxuXHR0aGlzLnVzZXJEYXRhID0ge307XG5cbn1cblxuT2JqZWN0M0QuRGVmYXVsdFVwID0gbmV3IFZlY3RvcjMoIDAsIDEsIDAgKTtcbk9iamVjdDNELkRlZmF1bHRNYXRyaXhBdXRvVXBkYXRlID0gdHJ1ZTtcblxuT2JqZWN0M0QucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggRXZlbnREaXNwYXRjaGVyLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IE9iamVjdDNELFxuXG5cdGlzT2JqZWN0M0Q6IHRydWUsXG5cblx0b25CZWZvcmVSZW5kZXI6IGZ1bmN0aW9uICgpIHt9LFxuXHRvbkFmdGVyUmVuZGVyOiBmdW5jdGlvbiAoKSB7fSxcblxuXHRhcHBseU1hdHJpeDogZnVuY3Rpb24gKCBtYXRyaXggKSB7XG5cblx0XHR0aGlzLm1hdHJpeC5tdWx0aXBseU1hdHJpY2VzKCBtYXRyaXgsIHRoaXMubWF0cml4ICk7XG5cblx0XHR0aGlzLm1hdHJpeC5kZWNvbXBvc2UoIHRoaXMucG9zaXRpb24sIHRoaXMucXVhdGVybmlvbiwgdGhpcy5zY2FsZSApO1xuXG5cdH0sXG5cblx0YXBwbHlRdWF0ZXJuaW9uOiBmdW5jdGlvbiAoIHEgKSB7XG5cblx0XHR0aGlzLnF1YXRlcm5pb24ucHJlbXVsdGlwbHkoIHEgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0Um90YXRpb25Gcm9tQXhpc0FuZ2xlOiBmdW5jdGlvbiAoIGF4aXMsIGFuZ2xlICkge1xuXG5cdFx0Ly8gYXNzdW1lcyBheGlzIGlzIG5vcm1hbGl6ZWRcblxuXHRcdHRoaXMucXVhdGVybmlvbi5zZXRGcm9tQXhpc0FuZ2xlKCBheGlzLCBhbmdsZSApO1xuXG5cdH0sXG5cblx0c2V0Um90YXRpb25Gcm9tRXVsZXI6IGZ1bmN0aW9uICggZXVsZXIgKSB7XG5cblx0XHR0aGlzLnF1YXRlcm5pb24uc2V0RnJvbUV1bGVyKCBldWxlciwgdHJ1ZSApO1xuXG5cdH0sXG5cblx0c2V0Um90YXRpb25Gcm9tTWF0cml4OiBmdW5jdGlvbiAoIG0gKSB7XG5cblx0XHQvLyBhc3N1bWVzIHRoZSB1cHBlciAzeDMgb2YgbSBpcyBhIHB1cmUgcm90YXRpb24gbWF0cml4IChpLmUsIHVuc2NhbGVkKVxuXG5cdFx0dGhpcy5xdWF0ZXJuaW9uLnNldEZyb21Sb3RhdGlvbk1hdHJpeCggbSApO1xuXG5cdH0sXG5cblx0c2V0Um90YXRpb25Gcm9tUXVhdGVybmlvbjogZnVuY3Rpb24gKCBxICkge1xuXG5cdFx0Ly8gYXNzdW1lcyBxIGlzIG5vcm1hbGl6ZWRcblxuXHRcdHRoaXMucXVhdGVybmlvbi5jb3B5KCBxICk7XG5cblx0fSxcblxuXHRyb3RhdGVPbkF4aXM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIHJvdGF0ZSBvYmplY3Qgb24gYXhpcyBpbiBvYmplY3Qgc3BhY2Vcblx0XHQvLyBheGlzIGlzIGFzc3VtZWQgdG8gYmUgbm9ybWFsaXplZFxuXG5cdFx0dmFyIHExID0gbmV3IFF1YXRlcm5pb24oKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiByb3RhdGVPbkF4aXMoIGF4aXMsIGFuZ2xlICkge1xuXG5cdFx0XHRxMS5zZXRGcm9tQXhpc0FuZ2xlKCBheGlzLCBhbmdsZSApO1xuXG5cdFx0XHR0aGlzLnF1YXRlcm5pb24ubXVsdGlwbHkoIHExICk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0cm90YXRlT25Xb3JsZEF4aXM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIHJvdGF0ZSBvYmplY3Qgb24gYXhpcyBpbiB3b3JsZCBzcGFjZVxuXHRcdC8vIGF4aXMgaXMgYXNzdW1lZCB0byBiZSBub3JtYWxpemVkXG5cdFx0Ly8gbWV0aG9kIGFzc3VtZXMgbm8gcm90YXRlZCBwYXJlbnRcblxuXHRcdHZhciBxMSA9IG5ldyBRdWF0ZXJuaW9uKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gcm90YXRlT25Xb3JsZEF4aXMoIGF4aXMsIGFuZ2xlICkge1xuXG5cdFx0XHRxMS5zZXRGcm9tQXhpc0FuZ2xlKCBheGlzLCBhbmdsZSApO1xuXG5cdFx0XHR0aGlzLnF1YXRlcm5pb24ucHJlbXVsdGlwbHkoIHExICk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0cm90YXRlWDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoIDEsIDAsIDAgKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiByb3RhdGVYKCBhbmdsZSApIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMucm90YXRlT25BeGlzKCB2MSwgYW5nbGUgKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHJvdGF0ZVk6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IzKCAwLCAxLCAwICk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gcm90YXRlWSggYW5nbGUgKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLnJvdGF0ZU9uQXhpcyggdjEsIGFuZ2xlICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRyb3RhdGVaOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMyggMCwgMCwgMSApO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHJvdGF0ZVooIGFuZ2xlICkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5yb3RhdGVPbkF4aXMoIHYxLCBhbmdsZSApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0dHJhbnNsYXRlT25BeGlzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyB0cmFuc2xhdGUgb2JqZWN0IGJ5IGRpc3RhbmNlIGFsb25nIGF4aXMgaW4gb2JqZWN0IHNwYWNlXG5cdFx0Ly8gYXhpcyBpcyBhc3N1bWVkIHRvIGJlIG5vcm1hbGl6ZWRcblxuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gdHJhbnNsYXRlT25BeGlzKCBheGlzLCBkaXN0YW5jZSApIHtcblxuXHRcdFx0djEuY29weSggYXhpcyApLmFwcGx5UXVhdGVybmlvbiggdGhpcy5xdWF0ZXJuaW9uICk7XG5cblx0XHRcdHRoaXMucG9zaXRpb24uYWRkKCB2MS5tdWx0aXBseVNjYWxhciggZGlzdGFuY2UgKSApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHRyYW5zbGF0ZVg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IzKCAxLCAwLCAwICk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gdHJhbnNsYXRlWCggZGlzdGFuY2UgKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLnRyYW5zbGF0ZU9uQXhpcyggdjEsIGRpc3RhbmNlICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHR0cmFuc2xhdGVZOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMyggMCwgMSwgMCApO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHRyYW5zbGF0ZVkoIGRpc3RhbmNlICkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy50cmFuc2xhdGVPbkF4aXMoIHYxLCBkaXN0YW5jZSApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0dHJhbnNsYXRlWjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoIDAsIDAsIDEgKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiB0cmFuc2xhdGVaKCBkaXN0YW5jZSApIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMudHJhbnNsYXRlT25BeGlzKCB2MSwgZGlzdGFuY2UgKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGxvY2FsVG9Xb3JsZDogZnVuY3Rpb24gKCB2ZWN0b3IgKSB7XG5cblx0XHRyZXR1cm4gdmVjdG9yLmFwcGx5TWF0cml4NCggdGhpcy5tYXRyaXhXb3JsZCApO1xuXG5cdH0sXG5cblx0d29ybGRUb0xvY2FsOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgbTEgPSBuZXcgTWF0cml4NCgpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHdvcmxkVG9Mb2NhbCggdmVjdG9yICkge1xuXG5cdFx0XHRyZXR1cm4gdmVjdG9yLmFwcGx5TWF0cml4NCggbTEuZ2V0SW52ZXJzZSggdGhpcy5tYXRyaXhXb3JsZCApICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRsb29rQXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIFRoaXMgbWV0aG9kIGRvZXMgbm90IHN1cHBvcnQgb2JqZWN0cyB3aXRoIHJvdGF0ZWQgYW5kL29yIHRyYW5zbGF0ZWQgcGFyZW50KHMpXG5cblx0XHR2YXIgbTEgPSBuZXcgTWF0cml4NCgpO1xuXHRcdHZhciB2ZWN0b3IgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGxvb2tBdCggeCwgeSwgeiApIHtcblxuXHRcdFx0aWYgKCB4LmlzVmVjdG9yMyApIHtcblxuXHRcdFx0XHR2ZWN0b3IuY29weSggeCApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHZlY3Rvci5zZXQoIHgsIHksIHogKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHRoaXMuaXNDYW1lcmEgKSB7XG5cblx0XHRcdFx0bTEubG9va0F0KCB0aGlzLnBvc2l0aW9uLCB2ZWN0b3IsIHRoaXMudXAgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRtMS5sb29rQXQoIHZlY3RvciwgdGhpcy5wb3NpdGlvbiwgdGhpcy51cCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHRoaXMucXVhdGVybmlvbi5zZXRGcm9tUm90YXRpb25NYXRyaXgoIG0xICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRhZGQ6IGZ1bmN0aW9uICggb2JqZWN0ICkge1xuXG5cdFx0aWYgKCBhcmd1bWVudHMubGVuZ3RoID4gMSApIHtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0XHR0aGlzLmFkZCggYXJndW1lbnRzWyBpIF0gKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH1cblxuXHRcdGlmICggb2JqZWN0ID09PSB0aGlzICkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCBcIlRIUkVFLk9iamVjdDNELmFkZDogb2JqZWN0IGNhbid0IGJlIGFkZGVkIGFzIGEgY2hpbGQgb2YgaXRzZWxmLlwiLCBvYmplY3QgKTtcblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCAoIG9iamVjdCAmJiBvYmplY3QuaXNPYmplY3QzRCApICkge1xuXG5cdFx0XHRpZiAoIG9iamVjdC5wYXJlbnQgIT09IG51bGwgKSB7XG5cblx0XHRcdFx0b2JqZWN0LnBhcmVudC5yZW1vdmUoIG9iamVjdCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdG9iamVjdC5wYXJlbnQgPSB0aGlzO1xuXHRcdFx0b2JqZWN0LmRpc3BhdGNoRXZlbnQoIHsgdHlwZTogJ2FkZGVkJyB9ICk7XG5cblx0XHRcdHRoaXMuY2hpbGRyZW4ucHVzaCggb2JqZWN0ICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCBcIlRIUkVFLk9iamVjdDNELmFkZDogb2JqZWN0IG5vdCBhbiBpbnN0YW5jZSBvZiBUSFJFRS5PYmplY3QzRC5cIiwgb2JqZWN0ICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHJlbW92ZTogZnVuY3Rpb24gKCBvYmplY3QgKSB7XG5cblx0XHRpZiAoIGFyZ3VtZW50cy5sZW5ndGggPiAxICkge1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRcdHRoaXMucmVtb3ZlKCBhcmd1bWVudHNbIGkgXSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fVxuXG5cdFx0dmFyIGluZGV4ID0gdGhpcy5jaGlsZHJlbi5pbmRleE9mKCBvYmplY3QgKTtcblxuXHRcdGlmICggaW5kZXggIT09IC0gMSApIHtcblxuXHRcdFx0b2JqZWN0LnBhcmVudCA9IG51bGw7XG5cblx0XHRcdG9iamVjdC5kaXNwYXRjaEV2ZW50KCB7IHR5cGU6ICdyZW1vdmVkJyB9ICk7XG5cblx0XHRcdHRoaXMuY2hpbGRyZW4uc3BsaWNlKCBpbmRleCwgMSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRnZXRPYmplY3RCeUlkOiBmdW5jdGlvbiAoIGlkICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZ2V0T2JqZWN0QnlQcm9wZXJ0eSggJ2lkJywgaWQgKTtcblxuXHR9LFxuXG5cdGdldE9iamVjdEJ5TmFtZTogZnVuY3Rpb24gKCBuYW1lICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZ2V0T2JqZWN0QnlQcm9wZXJ0eSggJ25hbWUnLCBuYW1lICk7XG5cblx0fSxcblxuXHRnZXRPYmplY3RCeVByb3BlcnR5OiBmdW5jdGlvbiAoIG5hbWUsIHZhbHVlICkge1xuXG5cdFx0aWYgKCB0aGlzWyBuYW1lIF0gPT09IHZhbHVlICkgcmV0dXJuIHRoaXM7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBjaGlsZCA9IHRoaXMuY2hpbGRyZW5bIGkgXTtcblx0XHRcdHZhciBvYmplY3QgPSBjaGlsZC5nZXRPYmplY3RCeVByb3BlcnR5KCBuYW1lLCB2YWx1ZSApO1xuXG5cdFx0XHRpZiAoIG9iamVjdCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHJldHVybiBvYmplY3Q7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cblx0fSxcblxuXHRnZXRXb3JsZFBvc2l0aW9uOiBmdW5jdGlvbiAoIHRhcmdldCApIHtcblxuXHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdDNEOiAuZ2V0V29ybGRQb3NpdGlvbigpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHR0YXJnZXQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy51cGRhdGVNYXRyaXhXb3JsZCggdHJ1ZSApO1xuXG5cdFx0cmV0dXJuIHRhcmdldC5zZXRGcm9tTWF0cml4UG9zaXRpb24oIHRoaXMubWF0cml4V29ybGQgKTtcblxuXHR9LFxuXG5cdGdldFdvcmxkUXVhdGVybmlvbjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHBvc2l0aW9uID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgc2NhbGUgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGdldFdvcmxkUXVhdGVybmlvbiggdGFyZ2V0ICkge1xuXG5cdFx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdDNEOiAuZ2V0V29ybGRRdWF0ZXJuaW9uKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdFx0dGFyZ2V0ID0gbmV3IFF1YXRlcm5pb24oKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLnVwZGF0ZU1hdHJpeFdvcmxkKCB0cnVlICk7XG5cblx0XHRcdHRoaXMubWF0cml4V29ybGQuZGVjb21wb3NlKCBwb3NpdGlvbiwgdGFyZ2V0LCBzY2FsZSApO1xuXG5cdFx0XHRyZXR1cm4gdGFyZ2V0O1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0Z2V0V29ybGRTY2FsZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHBvc2l0aW9uID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgcXVhdGVybmlvbiA9IG5ldyBRdWF0ZXJuaW9uKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gZ2V0V29ybGRTY2FsZSggdGFyZ2V0ICkge1xuXG5cdFx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdDNEOiAuZ2V0V29ybGRTY2FsZSgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRcdH1cblxuXHRcdFx0dGhpcy51cGRhdGVNYXRyaXhXb3JsZCggdHJ1ZSApO1xuXG5cdFx0XHR0aGlzLm1hdHJpeFdvcmxkLmRlY29tcG9zZSggcG9zaXRpb24sIHF1YXRlcm5pb24sIHRhcmdldCApO1xuXG5cdFx0XHRyZXR1cm4gdGFyZ2V0O1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0Z2V0V29ybGREaXJlY3Rpb246IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBxdWF0ZXJuaW9uID0gbmV3IFF1YXRlcm5pb24oKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBnZXRXb3JsZERpcmVjdGlvbiggdGFyZ2V0ICkge1xuXG5cdFx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdDNEOiAuZ2V0V29ybGREaXJlY3Rpb24oKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApO1xuXHRcdFx0XHR0YXJnZXQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuZ2V0V29ybGRRdWF0ZXJuaW9uKCBxdWF0ZXJuaW9uICk7XG5cblx0XHRcdHJldHVybiB0YXJnZXQuc2V0KCAwLCAwLCAxICkuYXBwbHlRdWF0ZXJuaW9uKCBxdWF0ZXJuaW9uICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRyYXljYXN0OiBmdW5jdGlvbiAoKSB7fSxcblxuXHR0cmF2ZXJzZTogZnVuY3Rpb24gKCBjYWxsYmFjayApIHtcblxuXHRcdGNhbGxiYWNrKCB0aGlzICk7XG5cblx0XHR2YXIgY2hpbGRyZW4gPSB0aGlzLmNoaWxkcmVuO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0Y2hpbGRyZW5bIGkgXS50cmF2ZXJzZSggY2FsbGJhY2sgKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdHRyYXZlcnNlVmlzaWJsZTogZnVuY3Rpb24gKCBjYWxsYmFjayApIHtcblxuXHRcdGlmICggdGhpcy52aXNpYmxlID09PSBmYWxzZSApIHJldHVybjtcblxuXHRcdGNhbGxiYWNrKCB0aGlzICk7XG5cblx0XHR2YXIgY2hpbGRyZW4gPSB0aGlzLmNoaWxkcmVuO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0Y2hpbGRyZW5bIGkgXS50cmF2ZXJzZVZpc2libGUoIGNhbGxiYWNrICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHR0cmF2ZXJzZUFuY2VzdG9yczogZnVuY3Rpb24gKCBjYWxsYmFjayApIHtcblxuXHRcdHZhciBwYXJlbnQgPSB0aGlzLnBhcmVudDtcblxuXHRcdGlmICggcGFyZW50ICE9PSBudWxsICkge1xuXG5cdFx0XHRjYWxsYmFjayggcGFyZW50ICk7XG5cblx0XHRcdHBhcmVudC50cmF2ZXJzZUFuY2VzdG9ycyggY2FsbGJhY2sgKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdHVwZGF0ZU1hdHJpeDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5tYXRyaXguY29tcG9zZSggdGhpcy5wb3NpdGlvbiwgdGhpcy5xdWF0ZXJuaW9uLCB0aGlzLnNjYWxlICk7XG5cblx0XHR0aGlzLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdH0sXG5cblx0dXBkYXRlTWF0cml4V29ybGQ6IGZ1bmN0aW9uICggZm9yY2UgKSB7XG5cblx0XHRpZiAoIHRoaXMubWF0cml4QXV0b1VwZGF0ZSApIHRoaXMudXBkYXRlTWF0cml4KCk7XG5cblx0XHRpZiAoIHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZSB8fCBmb3JjZSApIHtcblxuXHRcdFx0aWYgKCB0aGlzLnBhcmVudCA9PT0gbnVsbCApIHtcblxuXHRcdFx0XHR0aGlzLm1hdHJpeFdvcmxkLmNvcHkoIHRoaXMubWF0cml4ICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0dGhpcy5tYXRyaXhXb3JsZC5tdWx0aXBseU1hdHJpY2VzKCB0aGlzLnBhcmVudC5tYXRyaXhXb3JsZCwgdGhpcy5tYXRyaXggKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUgPSBmYWxzZTtcblxuXHRcdFx0Zm9yY2UgPSB0cnVlO1xuXG5cdFx0fVxuXG5cdFx0Ly8gdXBkYXRlIGNoaWxkcmVuXG5cblx0XHR2YXIgY2hpbGRyZW4gPSB0aGlzLmNoaWxkcmVuO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0Y2hpbGRyZW5bIGkgXS51cGRhdGVNYXRyaXhXb3JsZCggZm9yY2UgKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCBtZXRhICkge1xuXG5cdFx0Ly8gbWV0YSBpcyBhIHN0cmluZyB3aGVuIGNhbGxlZCBmcm9tIEpTT04uc3RyaW5naWZ5XG5cdFx0dmFyIGlzUm9vdE9iamVjdCA9ICggbWV0YSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBtZXRhID09PSAnc3RyaW5nJyApO1xuXG5cdFx0dmFyIG91dHB1dCA9IHt9O1xuXG5cdFx0Ly8gbWV0YSBpcyBhIGhhc2ggdXNlZCB0byBjb2xsZWN0IGdlb21ldHJpZXMsIG1hdGVyaWFscy5cblx0XHQvLyBub3QgcHJvdmlkaW5nIGl0IGltcGxpZXMgdGhhdCB0aGlzIGlzIHRoZSByb290IG9iamVjdFxuXHRcdC8vIGJlaW5nIHNlcmlhbGl6ZWQuXG5cdFx0aWYgKCBpc1Jvb3RPYmplY3QgKSB7XG5cblx0XHRcdC8vIGluaXRpYWxpemUgbWV0YSBvYmpcblx0XHRcdG1ldGEgPSB7XG5cdFx0XHRcdGdlb21ldHJpZXM6IHt9LFxuXHRcdFx0XHRtYXRlcmlhbHM6IHt9LFxuXHRcdFx0XHR0ZXh0dXJlczoge30sXG5cdFx0XHRcdGltYWdlczoge30sXG5cdFx0XHRcdHNoYXBlczoge31cblx0XHRcdH07XG5cblx0XHRcdG91dHB1dC5tZXRhZGF0YSA9IHtcblx0XHRcdFx0dmVyc2lvbjogNC41LFxuXHRcdFx0XHR0eXBlOiAnT2JqZWN0Jyxcblx0XHRcdFx0Z2VuZXJhdG9yOiAnT2JqZWN0M0QudG9KU09OJ1xuXHRcdFx0fTtcblxuXHRcdH1cblxuXHRcdC8vIHN0YW5kYXJkIE9iamVjdDNEIHNlcmlhbGl6YXRpb25cblxuXHRcdHZhciBvYmplY3QgPSB7fTtcblxuXHRcdG9iamVjdC51dWlkID0gdGhpcy51dWlkO1xuXHRcdG9iamVjdC50eXBlID0gdGhpcy50eXBlO1xuXG5cdFx0aWYgKCB0aGlzLm5hbWUgIT09ICcnICkgb2JqZWN0Lm5hbWUgPSB0aGlzLm5hbWU7XG5cdFx0aWYgKCB0aGlzLmNhc3RTaGFkb3cgPT09IHRydWUgKSBvYmplY3QuY2FzdFNoYWRvdyA9IHRydWU7XG5cdFx0aWYgKCB0aGlzLnJlY2VpdmVTaGFkb3cgPT09IHRydWUgKSBvYmplY3QucmVjZWl2ZVNoYWRvdyA9IHRydWU7XG5cdFx0aWYgKCB0aGlzLnZpc2libGUgPT09IGZhbHNlICkgb2JqZWN0LnZpc2libGUgPSBmYWxzZTtcblx0XHRpZiAoIHRoaXMuZnJ1c3R1bUN1bGxlZCA9PT0gZmFsc2UgKSBvYmplY3QuZnJ1c3R1bUN1bGxlZCA9IGZhbHNlO1xuXHRcdGlmICggdGhpcy5yZW5kZXJPcmRlciAhPT0gMCApIG9iamVjdC5yZW5kZXJPcmRlciA9IHRoaXMucmVuZGVyT3JkZXI7XG5cdFx0aWYgKCBKU09OLnN0cmluZ2lmeSggdGhpcy51c2VyRGF0YSApICE9PSAne30nICkgb2JqZWN0LnVzZXJEYXRhID0gdGhpcy51c2VyRGF0YTtcblxuXHRcdG9iamVjdC5tYXRyaXggPSB0aGlzLm1hdHJpeC50b0FycmF5KCk7XG5cblx0XHRpZiAoIHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9PT0gZmFsc2UgKSBvYmplY3QubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xuXG5cdFx0Ly9cblxuXHRcdGZ1bmN0aW9uIHNlcmlhbGl6ZSggbGlicmFyeSwgZWxlbWVudCApIHtcblxuXHRcdFx0aWYgKCBsaWJyYXJ5WyBlbGVtZW50LnV1aWQgXSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGxpYnJhcnlbIGVsZW1lbnQudXVpZCBdID0gZWxlbWVudC50b0pTT04oIG1ldGEgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZWxlbWVudC51dWlkO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLmdlb21ldHJ5ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdG9iamVjdC5nZW9tZXRyeSA9IHNlcmlhbGl6ZSggbWV0YS5nZW9tZXRyaWVzLCB0aGlzLmdlb21ldHJ5ICk7XG5cblx0XHRcdHZhciBwYXJhbWV0ZXJzID0gdGhpcy5nZW9tZXRyeS5wYXJhbWV0ZXJzO1xuXG5cdFx0XHRpZiAoIHBhcmFtZXRlcnMgIT09IHVuZGVmaW5lZCAmJiBwYXJhbWV0ZXJzLnNoYXBlcyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHZhciBzaGFwZXMgPSBwYXJhbWV0ZXJzLnNoYXBlcztcblxuXHRcdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIHNoYXBlcyApICkge1xuXG5cdFx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gc2hhcGVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdHZhciBzaGFwZSA9IHNoYXBlc1sgaSBdO1xuXG5cdFx0XHRcdFx0XHRzZXJpYWxpemUoIG1ldGEuc2hhcGVzLCBzaGFwZSApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRzZXJpYWxpemUoIG1ldGEuc2hhcGVzLCBzaGFwZXMgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5tYXRlcmlhbCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIHRoaXMubWF0ZXJpYWwgKSApIHtcblxuXHRcdFx0XHR2YXIgdXVpZHMgPSBbXTtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSB0aGlzLm1hdGVyaWFsLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHR1dWlkcy5wdXNoKCBzZXJpYWxpemUoIG1ldGEubWF0ZXJpYWxzLCB0aGlzLm1hdGVyaWFsWyBpIF0gKSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRvYmplY3QubWF0ZXJpYWwgPSB1dWlkcztcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRvYmplY3QubWF0ZXJpYWwgPSBzZXJpYWxpemUoIG1ldGEubWF0ZXJpYWxzLCB0aGlzLm1hdGVyaWFsICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vXG5cblx0XHRpZiAoIHRoaXMuY2hpbGRyZW4ubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0b2JqZWN0LmNoaWxkcmVuID0gW107XG5cblx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRcdG9iamVjdC5jaGlsZHJlbi5wdXNoKCB0aGlzLmNoaWxkcmVuWyBpIF0udG9KU09OKCBtZXRhICkub2JqZWN0ICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggaXNSb290T2JqZWN0ICkge1xuXG5cdFx0XHR2YXIgZ2VvbWV0cmllcyA9IGV4dHJhY3RGcm9tQ2FjaGUoIG1ldGEuZ2VvbWV0cmllcyApO1xuXHRcdFx0dmFyIG1hdGVyaWFscyA9IGV4dHJhY3RGcm9tQ2FjaGUoIG1ldGEubWF0ZXJpYWxzICk7XG5cdFx0XHR2YXIgdGV4dHVyZXMgPSBleHRyYWN0RnJvbUNhY2hlKCBtZXRhLnRleHR1cmVzICk7XG5cdFx0XHR2YXIgaW1hZ2VzID0gZXh0cmFjdEZyb21DYWNoZSggbWV0YS5pbWFnZXMgKTtcblx0XHRcdHZhciBzaGFwZXMgPSBleHRyYWN0RnJvbUNhY2hlKCBtZXRhLnNoYXBlcyApO1xuXG5cdFx0XHRpZiAoIGdlb21ldHJpZXMubGVuZ3RoID4gMCApIG91dHB1dC5nZW9tZXRyaWVzID0gZ2VvbWV0cmllcztcblx0XHRcdGlmICggbWF0ZXJpYWxzLmxlbmd0aCA+IDAgKSBvdXRwdXQubWF0ZXJpYWxzID0gbWF0ZXJpYWxzO1xuXHRcdFx0aWYgKCB0ZXh0dXJlcy5sZW5ndGggPiAwICkgb3V0cHV0LnRleHR1cmVzID0gdGV4dHVyZXM7XG5cdFx0XHRpZiAoIGltYWdlcy5sZW5ndGggPiAwICkgb3V0cHV0LmltYWdlcyA9IGltYWdlcztcblx0XHRcdGlmICggc2hhcGVzLmxlbmd0aCA+IDAgKSBvdXRwdXQuc2hhcGVzID0gc2hhcGVzO1xuXG5cdFx0fVxuXG5cdFx0b3V0cHV0Lm9iamVjdCA9IG9iamVjdDtcblxuXHRcdHJldHVybiBvdXRwdXQ7XG5cblx0XHQvLyBleHRyYWN0IGRhdGEgZnJvbSB0aGUgY2FjaGUgaGFzaFxuXHRcdC8vIHJlbW92ZSBtZXRhZGF0YSBvbiBlYWNoIGl0ZW1cblx0XHQvLyBhbmQgcmV0dXJuIGFzIGFycmF5XG5cdFx0ZnVuY3Rpb24gZXh0cmFjdEZyb21DYWNoZSggY2FjaGUgKSB7XG5cblx0XHRcdHZhciB2YWx1ZXMgPSBbXTtcblx0XHRcdGZvciAoIHZhciBrZXkgaW4gY2FjaGUgKSB7XG5cblx0XHRcdFx0dmFyIGRhdGEgPSBjYWNoZVsga2V5IF07XG5cdFx0XHRcdGRlbGV0ZSBkYXRhLm1ldGFkYXRhO1xuXHRcdFx0XHR2YWx1ZXMucHVzaCggZGF0YSApO1xuXG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdmFsdWVzO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICggcmVjdXJzaXZlICkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcywgcmVjdXJzaXZlICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSwgcmVjdXJzaXZlICkge1xuXG5cdFx0aWYgKCByZWN1cnNpdmUgPT09IHVuZGVmaW5lZCApIHJlY3Vyc2l2ZSA9IHRydWU7XG5cblx0XHR0aGlzLm5hbWUgPSBzb3VyY2UubmFtZTtcblxuXHRcdHRoaXMudXAuY29weSggc291cmNlLnVwICk7XG5cblx0XHR0aGlzLnBvc2l0aW9uLmNvcHkoIHNvdXJjZS5wb3NpdGlvbiApO1xuXHRcdHRoaXMucXVhdGVybmlvbi5jb3B5KCBzb3VyY2UucXVhdGVybmlvbiApO1xuXHRcdHRoaXMuc2NhbGUuY29weSggc291cmNlLnNjYWxlICk7XG5cblx0XHR0aGlzLm1hdHJpeC5jb3B5KCBzb3VyY2UubWF0cml4ICk7XG5cdFx0dGhpcy5tYXRyaXhXb3JsZC5jb3B5KCBzb3VyY2UubWF0cml4V29ybGQgKTtcblxuXHRcdHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IHNvdXJjZS5tYXRyaXhBdXRvVXBkYXRlO1xuXHRcdHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZSA9IHNvdXJjZS5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlO1xuXG5cdFx0dGhpcy5sYXllcnMubWFzayA9IHNvdXJjZS5sYXllcnMubWFzaztcblx0XHR0aGlzLnZpc2libGUgPSBzb3VyY2UudmlzaWJsZTtcblxuXHRcdHRoaXMuY2FzdFNoYWRvdyA9IHNvdXJjZS5jYXN0U2hhZG93O1xuXHRcdHRoaXMucmVjZWl2ZVNoYWRvdyA9IHNvdXJjZS5yZWNlaXZlU2hhZG93O1xuXG5cdFx0dGhpcy5mcnVzdHVtQ3VsbGVkID0gc291cmNlLmZydXN0dW1DdWxsZWQ7XG5cdFx0dGhpcy5yZW5kZXJPcmRlciA9IHNvdXJjZS5yZW5kZXJPcmRlcjtcblxuXHRcdHRoaXMudXNlckRhdGEgPSBKU09OLnBhcnNlKCBKU09OLnN0cmluZ2lmeSggc291cmNlLnVzZXJEYXRhICkgKTtcblxuXHRcdGlmICggcmVjdXJzaXZlID09PSB0cnVlICkge1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBzb3VyY2UuY2hpbGRyZW4ubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRcdHZhciBjaGlsZCA9IHNvdXJjZS5jaGlsZHJlblsgaSBdO1xuXHRcdFx0XHR0aGlzLmFkZCggY2hpbGQuY2xvbmUoKSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBtaWthZWwgZW10aW5nZXIgLyBodHRwOi8vZ29tby5zZS9cbiAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleVxuKi9cblxuZnVuY3Rpb24gQ2FtZXJhKCkge1xuXG5cdE9iamVjdDNELmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnQ2FtZXJhJztcblxuXHR0aGlzLm1hdHJpeFdvcmxkSW52ZXJzZSA9IG5ldyBNYXRyaXg0KCk7XG5cdHRoaXMucHJvamVjdGlvbk1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7XG5cbn1cblxuQ2FtZXJhLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IENhbWVyYSxcblxuXHRpc0NhbWVyYTogdHJ1ZSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSwgcmVjdXJzaXZlICkge1xuXG5cdFx0T2JqZWN0M0QucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlLCByZWN1cnNpdmUgKTtcblxuXHRcdHRoaXMubWF0cml4V29ybGRJbnZlcnNlLmNvcHkoIHNvdXJjZS5tYXRyaXhXb3JsZEludmVyc2UgKTtcblx0XHR0aGlzLnByb2plY3Rpb25NYXRyaXguY29weSggc291cmNlLnByb2plY3Rpb25NYXRyaXggKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Z2V0V29ybGREaXJlY3Rpb246IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBxdWF0ZXJuaW9uID0gbmV3IFF1YXRlcm5pb24oKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBnZXRXb3JsZERpcmVjdGlvbiggdGFyZ2V0ICkge1xuXG5cdFx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkNhbWVyYTogLmdldFdvcmxkRGlyZWN0aW9uKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdFx0dGFyZ2V0ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmdldFdvcmxkUXVhdGVybmlvbiggcXVhdGVybmlvbiApO1xuXG5cdFx0XHRyZXR1cm4gdGFyZ2V0LnNldCggMCwgMCwgLSAxICkuYXBwbHlRdWF0ZXJuaW9uKCBxdWF0ZXJuaW9uICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHR1cGRhdGVNYXRyaXhXb3JsZDogZnVuY3Rpb24gKCBmb3JjZSApIHtcblxuXHRcdE9iamVjdDNELnByb3RvdHlwZS51cGRhdGVNYXRyaXhXb3JsZC5jYWxsKCB0aGlzLCBmb3JjZSApO1xuXG5cdFx0dGhpcy5tYXRyaXhXb3JsZEludmVyc2UuZ2V0SW52ZXJzZSggdGhpcy5tYXRyaXhXb3JsZCApO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBhcm9zZSAvIGh0dHA6Ly9naXRodWIuY29tL2Fyb3NlXG4gKi9cblxuZnVuY3Rpb24gT3J0aG9ncmFwaGljQ2FtZXJhKCBsZWZ0LCByaWdodCwgdG9wLCBib3R0b20sIG5lYXIsIGZhciApIHtcblxuXHRDYW1lcmEuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdPcnRob2dyYXBoaWNDYW1lcmEnO1xuXG5cdHRoaXMuem9vbSA9IDE7XG5cdHRoaXMudmlldyA9IG51bGw7XG5cblx0dGhpcy5sZWZ0ID0gbGVmdDtcblx0dGhpcy5yaWdodCA9IHJpZ2h0O1xuXHR0aGlzLnRvcCA9IHRvcDtcblx0dGhpcy5ib3R0b20gPSBib3R0b207XG5cblx0dGhpcy5uZWFyID0gKCBuZWFyICE9PSB1bmRlZmluZWQgKSA/IG5lYXIgOiAwLjE7XG5cdHRoaXMuZmFyID0gKCBmYXIgIT09IHVuZGVmaW5lZCApID8gZmFyIDogMjAwMDtcblxuXHR0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTtcblxufVxuXG5PcnRob2dyYXBoaWNDYW1lcmEucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggQ2FtZXJhLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IE9ydGhvZ3JhcGhpY0NhbWVyYSxcblxuXHRpc09ydGhvZ3JhcGhpY0NhbWVyYTogdHJ1ZSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSwgcmVjdXJzaXZlICkge1xuXG5cdFx0Q2FtZXJhLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSwgcmVjdXJzaXZlICk7XG5cblx0XHR0aGlzLmxlZnQgPSBzb3VyY2UubGVmdDtcblx0XHR0aGlzLnJpZ2h0ID0gc291cmNlLnJpZ2h0O1xuXHRcdHRoaXMudG9wID0gc291cmNlLnRvcDtcblx0XHR0aGlzLmJvdHRvbSA9IHNvdXJjZS5ib3R0b207XG5cdFx0dGhpcy5uZWFyID0gc291cmNlLm5lYXI7XG5cdFx0dGhpcy5mYXIgPSBzb3VyY2UuZmFyO1xuXG5cdFx0dGhpcy56b29tID0gc291cmNlLnpvb207XG5cdFx0dGhpcy52aWV3ID0gc291cmNlLnZpZXcgPT09IG51bGwgPyBudWxsIDogT2JqZWN0LmFzc2lnbigge30sIHNvdXJjZS52aWV3ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFZpZXdPZmZzZXQ6IGZ1bmN0aW9uICggZnVsbFdpZHRoLCBmdWxsSGVpZ2h0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0ICkge1xuXG5cdFx0aWYgKCB0aGlzLnZpZXcgPT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMudmlldyA9IHtcblx0XHRcdFx0ZW5hYmxlZDogdHJ1ZSxcblx0XHRcdFx0ZnVsbFdpZHRoOiAxLFxuXHRcdFx0XHRmdWxsSGVpZ2h0OiAxLFxuXHRcdFx0XHRvZmZzZXRYOiAwLFxuXHRcdFx0XHRvZmZzZXRZOiAwLFxuXHRcdFx0XHR3aWR0aDogMSxcblx0XHRcdFx0aGVpZ2h0OiAxXG5cdFx0XHR9O1xuXG5cdFx0fVxuXG5cdFx0dGhpcy52aWV3LmVuYWJsZWQgPSB0cnVlO1xuXHRcdHRoaXMudmlldy5mdWxsV2lkdGggPSBmdWxsV2lkdGg7XG5cdFx0dGhpcy52aWV3LmZ1bGxIZWlnaHQgPSBmdWxsSGVpZ2h0O1xuXHRcdHRoaXMudmlldy5vZmZzZXRYID0geDtcblx0XHR0aGlzLnZpZXcub2Zmc2V0WSA9IHk7XG5cdFx0dGhpcy52aWV3LndpZHRoID0gd2lkdGg7XG5cdFx0dGhpcy52aWV3LmhlaWdodCA9IGhlaWdodDtcblxuXHRcdHRoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xuXG5cdH0sXG5cblx0Y2xlYXJWaWV3T2Zmc2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRpZiAoIHRoaXMudmlldyAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy52aWV3LmVuYWJsZWQgPSBmYWxzZTtcblxuXHRcdH1cblxuXHRcdHRoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xuXG5cdH0sXG5cblx0dXBkYXRlUHJvamVjdGlvbk1hdHJpeDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGR4ID0gKCB0aGlzLnJpZ2h0IC0gdGhpcy5sZWZ0ICkgLyAoIDIgKiB0aGlzLnpvb20gKTtcblx0XHR2YXIgZHkgPSAoIHRoaXMudG9wIC0gdGhpcy5ib3R0b20gKSAvICggMiAqIHRoaXMuem9vbSApO1xuXHRcdHZhciBjeCA9ICggdGhpcy5yaWdodCArIHRoaXMubGVmdCApIC8gMjtcblx0XHR2YXIgY3kgPSAoIHRoaXMudG9wICsgdGhpcy5ib3R0b20gKSAvIDI7XG5cblx0XHR2YXIgbGVmdCA9IGN4IC0gZHg7XG5cdFx0dmFyIHJpZ2h0ID0gY3ggKyBkeDtcblx0XHR2YXIgdG9wID0gY3kgKyBkeTtcblx0XHR2YXIgYm90dG9tID0gY3kgLSBkeTtcblxuXHRcdGlmICggdGhpcy52aWV3ICE9PSBudWxsICYmIHRoaXMudmlldy5lbmFibGVkICkge1xuXG5cdFx0XHR2YXIgem9vbVcgPSB0aGlzLnpvb20gLyAoIHRoaXMudmlldy53aWR0aCAvIHRoaXMudmlldy5mdWxsV2lkdGggKTtcblx0XHRcdHZhciB6b29tSCA9IHRoaXMuem9vbSAvICggdGhpcy52aWV3LmhlaWdodCAvIHRoaXMudmlldy5mdWxsSGVpZ2h0ICk7XG5cdFx0XHR2YXIgc2NhbGVXID0gKCB0aGlzLnJpZ2h0IC0gdGhpcy5sZWZ0ICkgLyB0aGlzLnZpZXcud2lkdGg7XG5cdFx0XHR2YXIgc2NhbGVIID0gKCB0aGlzLnRvcCAtIHRoaXMuYm90dG9tICkgLyB0aGlzLnZpZXcuaGVpZ2h0O1xuXG5cdFx0XHRsZWZ0ICs9IHNjYWxlVyAqICggdGhpcy52aWV3Lm9mZnNldFggLyB6b29tVyApO1xuXHRcdFx0cmlnaHQgPSBsZWZ0ICsgc2NhbGVXICogKCB0aGlzLnZpZXcud2lkdGggLyB6b29tVyApO1xuXHRcdFx0dG9wIC09IHNjYWxlSCAqICggdGhpcy52aWV3Lm9mZnNldFkgLyB6b29tSCApO1xuXHRcdFx0Ym90dG9tID0gdG9wIC0gc2NhbGVIICogKCB0aGlzLnZpZXcuaGVpZ2h0IC8gem9vbUggKTtcblxuXHRcdH1cblxuXHRcdHRoaXMucHJvamVjdGlvbk1hdHJpeC5tYWtlT3J0aG9ncmFwaGljKCBsZWZ0LCByaWdodCwgdG9wLCBib3R0b20sIHRoaXMubmVhciwgdGhpcy5mYXIgKTtcblxuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCBtZXRhICkge1xuXG5cdFx0dmFyIGRhdGEgPSBPYmplY3QzRC5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMsIG1ldGEgKTtcblxuXHRcdGRhdGEub2JqZWN0Lnpvb20gPSB0aGlzLnpvb207XG5cdFx0ZGF0YS5vYmplY3QubGVmdCA9IHRoaXMubGVmdDtcblx0XHRkYXRhLm9iamVjdC5yaWdodCA9IHRoaXMucmlnaHQ7XG5cdFx0ZGF0YS5vYmplY3QudG9wID0gdGhpcy50b3A7XG5cdFx0ZGF0YS5vYmplY3QuYm90dG9tID0gdGhpcy5ib3R0b207XG5cdFx0ZGF0YS5vYmplY3QubmVhciA9IHRoaXMubmVhcjtcblx0XHRkYXRhLm9iamVjdC5mYXIgPSB0aGlzLmZhcjtcblxuXHRcdGlmICggdGhpcy52aWV3ICE9PSBudWxsICkgZGF0YS5vYmplY3QudmlldyA9IE9iamVjdC5hc3NpZ24oIHt9LCB0aGlzLnZpZXcgKTtcblxuXHRcdHJldHVybiBkYXRhO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICovXG5cbmZ1bmN0aW9uIEZhY2UzKCBhLCBiLCBjLCBub3JtYWwsIGNvbG9yLCBtYXRlcmlhbEluZGV4ICkge1xuXG5cdHRoaXMuYSA9IGE7XG5cdHRoaXMuYiA9IGI7XG5cdHRoaXMuYyA9IGM7XG5cblx0dGhpcy5ub3JtYWwgPSAoIG5vcm1hbCAmJiBub3JtYWwuaXNWZWN0b3IzICkgPyBub3JtYWwgOiBuZXcgVmVjdG9yMygpO1xuXHR0aGlzLnZlcnRleE5vcm1hbHMgPSBBcnJheS5pc0FycmF5KCBub3JtYWwgKSA/IG5vcm1hbCA6IFtdO1xuXG5cdHRoaXMuY29sb3IgPSAoIGNvbG9yICYmIGNvbG9yLmlzQ29sb3IgKSA/IGNvbG9yIDogbmV3IENvbG9yKCk7XG5cdHRoaXMudmVydGV4Q29sb3JzID0gQXJyYXkuaXNBcnJheSggY29sb3IgKSA/IGNvbG9yIDogW107XG5cblx0dGhpcy5tYXRlcmlhbEluZGV4ID0gbWF0ZXJpYWxJbmRleCAhPT0gdW5kZWZpbmVkID8gbWF0ZXJpYWxJbmRleCA6IDA7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggRmFjZTMucHJvdG90eXBlLCB7XG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0dGhpcy5hID0gc291cmNlLmE7XG5cdFx0dGhpcy5iID0gc291cmNlLmI7XG5cdFx0dGhpcy5jID0gc291cmNlLmM7XG5cblx0XHR0aGlzLm5vcm1hbC5jb3B5KCBzb3VyY2Uubm9ybWFsICk7XG5cdFx0dGhpcy5jb2xvci5jb3B5KCBzb3VyY2UuY29sb3IgKTtcblxuXHRcdHRoaXMubWF0ZXJpYWxJbmRleCA9IHNvdXJjZS5tYXRlcmlhbEluZGV4O1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IHNvdXJjZS52ZXJ0ZXhOb3JtYWxzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR0aGlzLnZlcnRleE5vcm1hbHNbIGkgXSA9IHNvdXJjZS52ZXJ0ZXhOb3JtYWxzWyBpIF0uY2xvbmUoKTtcblxuXHRcdH1cblxuXHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBzb3VyY2UudmVydGV4Q29sb3JzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR0aGlzLnZlcnRleENvbG9yc1sgaSBdID0gc291cmNlLnZlcnRleENvbG9yc1sgaSBdLmNsb25lKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBraWxlIC8gaHR0cDovL2tpbGUuc3RyYXZhZ2FuemEub3JnL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3IgbWlrYWVsIGVtdGluZ2VyIC8gaHR0cDovL2dvbW8uc2UvXG4gKiBAYXV0aG9yIHp6ODUgLyBodHRwOi8vd3d3LmxhYjRnYW1lcy5uZXQveno4NS9ibG9nXG4gKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvXG4gKi9cblxudmFyIGdlb21ldHJ5SWQgPSAwOyAvLyBHZW9tZXRyeSB1c2VzIGV2ZW4gbnVtYmVycyBhcyBJZFxuXG5mdW5jdGlvbiBHZW9tZXRyeSgpIHtcblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoIHRoaXMsICdpZCcsIHsgdmFsdWU6IGdlb21ldHJ5SWQgKz0gMiB9ICk7XG5cblx0dGhpcy51dWlkID0gX01hdGguZ2VuZXJhdGVVVUlEKCk7XG5cblx0dGhpcy5uYW1lID0gJyc7XG5cdHRoaXMudHlwZSA9ICdHZW9tZXRyeSc7XG5cblx0dGhpcy52ZXJ0aWNlcyA9IFtdO1xuXHR0aGlzLmNvbG9ycyA9IFtdO1xuXHR0aGlzLmZhY2VzID0gW107XG5cdHRoaXMuZmFjZVZlcnRleFV2cyA9IFtbXV07XG5cblx0dGhpcy5tb3JwaFRhcmdldHMgPSBbXTtcblx0dGhpcy5tb3JwaE5vcm1hbHMgPSBbXTtcblxuXHR0aGlzLnNraW5XZWlnaHRzID0gW107XG5cdHRoaXMuc2tpbkluZGljZXMgPSBbXTtcblxuXHR0aGlzLmxpbmVEaXN0YW5jZXMgPSBbXTtcblxuXHR0aGlzLmJvdW5kaW5nQm94ID0gbnVsbDtcblx0dGhpcy5ib3VuZGluZ1NwaGVyZSA9IG51bGw7XG5cblx0Ly8gdXBkYXRlIGZsYWdzXG5cblx0dGhpcy5lbGVtZW50c05lZWRVcGRhdGUgPSBmYWxzZTtcblx0dGhpcy52ZXJ0aWNlc05lZWRVcGRhdGUgPSBmYWxzZTtcblx0dGhpcy51dnNOZWVkVXBkYXRlID0gZmFsc2U7XG5cdHRoaXMubm9ybWFsc05lZWRVcGRhdGUgPSBmYWxzZTtcblx0dGhpcy5jb2xvcnNOZWVkVXBkYXRlID0gZmFsc2U7XG5cdHRoaXMubGluZURpc3RhbmNlc05lZWRVcGRhdGUgPSBmYWxzZTtcblx0dGhpcy5ncm91cHNOZWVkVXBkYXRlID0gZmFsc2U7XG5cbn1cblxuR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggRXZlbnREaXNwYXRjaGVyLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IEdlb21ldHJ5LFxuXG5cdGlzR2VvbWV0cnk6IHRydWUsXG5cblx0YXBwbHlNYXRyaXg6IGZ1bmN0aW9uICggbWF0cml4ICkge1xuXG5cdFx0dmFyIG5vcm1hbE1hdHJpeCA9IG5ldyBNYXRyaXgzKCkuZ2V0Tm9ybWFsTWF0cml4KCBtYXRyaXggKTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSB0aGlzLnZlcnRpY2VzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgdmVydGV4ID0gdGhpcy52ZXJ0aWNlc1sgaSBdO1xuXHRcdFx0dmVydGV4LmFwcGx5TWF0cml4NCggbWF0cml4ICk7XG5cblx0XHR9XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gdGhpcy5mYWNlcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGZhY2UgPSB0aGlzLmZhY2VzWyBpIF07XG5cdFx0XHRmYWNlLm5vcm1hbC5hcHBseU1hdHJpeDMoIG5vcm1hbE1hdHJpeCApLm5vcm1hbGl6ZSgpO1xuXG5cdFx0XHRmb3IgKCB2YXIgaiA9IDAsIGpsID0gZmFjZS52ZXJ0ZXhOb3JtYWxzLmxlbmd0aDsgaiA8IGpsOyBqICsrICkge1xuXG5cdFx0XHRcdGZhY2UudmVydGV4Tm9ybWFsc1sgaiBdLmFwcGx5TWF0cml4Myggbm9ybWFsTWF0cml4ICkubm9ybWFsaXplKCk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5ib3VuZGluZ0JveCAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5jb21wdXRlQm91bmRpbmdCb3goKTtcblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5ib3VuZGluZ1NwaGVyZSAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtcblxuXHRcdH1cblxuXHRcdHRoaXMudmVydGljZXNOZWVkVXBkYXRlID0gdHJ1ZTtcblx0XHR0aGlzLm5vcm1hbHNOZWVkVXBkYXRlID0gdHJ1ZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0cm90YXRlWDogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gcm90YXRlIGdlb21ldHJ5IGFyb3VuZCB3b3JsZCB4LWF4aXNcblxuXHRcdHZhciBtMSA9IG5ldyBNYXRyaXg0KCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gcm90YXRlWCggYW5nbGUgKSB7XG5cblx0XHRcdG0xLm1ha2VSb3RhdGlvblgoIGFuZ2xlICk7XG5cblx0XHRcdHRoaXMuYXBwbHlNYXRyaXgoIG0xICk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0cm90YXRlWTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gcm90YXRlIGdlb21ldHJ5IGFyb3VuZCB3b3JsZCB5LWF4aXNcblxuXHRcdHZhciBtMSA9IG5ldyBNYXRyaXg0KCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gcm90YXRlWSggYW5nbGUgKSB7XG5cblx0XHRcdG0xLm1ha2VSb3RhdGlvblkoIGFuZ2xlICk7XG5cblx0XHRcdHRoaXMuYXBwbHlNYXRyaXgoIG0xICk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0cm90YXRlWjogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gcm90YXRlIGdlb21ldHJ5IGFyb3VuZCB3b3JsZCB6LWF4aXNcblxuXHRcdHZhciBtMSA9IG5ldyBNYXRyaXg0KCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gcm90YXRlWiggYW5nbGUgKSB7XG5cblx0XHRcdG0xLm1ha2VSb3RhdGlvblooIGFuZ2xlICk7XG5cblx0XHRcdHRoaXMuYXBwbHlNYXRyaXgoIG0xICk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0dHJhbnNsYXRlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyB0cmFuc2xhdGUgZ2VvbWV0cnlcblxuXHRcdHZhciBtMSA9IG5ldyBNYXRyaXg0KCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gdHJhbnNsYXRlKCB4LCB5LCB6ICkge1xuXG5cdFx0XHRtMS5tYWtlVHJhbnNsYXRpb24oIHgsIHksIHogKTtcblxuXHRcdFx0dGhpcy5hcHBseU1hdHJpeCggbTEgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRzY2FsZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gc2NhbGUgZ2VvbWV0cnlcblxuXHRcdHZhciBtMSA9IG5ldyBNYXRyaXg0KCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gc2NhbGUoIHgsIHksIHogKSB7XG5cblx0XHRcdG0xLm1ha2VTY2FsZSggeCwgeSwgeiApO1xuXG5cdFx0XHR0aGlzLmFwcGx5TWF0cml4KCBtMSApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGxvb2tBdDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIG9iaiA9IG5ldyBPYmplY3QzRCgpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGxvb2tBdCggdmVjdG9yICkge1xuXG5cdFx0XHRvYmoubG9va0F0KCB2ZWN0b3IgKTtcblxuXHRcdFx0b2JqLnVwZGF0ZU1hdHJpeCgpO1xuXG5cdFx0XHR0aGlzLmFwcGx5TWF0cml4KCBvYmoubWF0cml4ICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRmcm9tQnVmZmVyR2VvbWV0cnk6IGZ1bmN0aW9uICggZ2VvbWV0cnkgKSB7XG5cblx0XHR2YXIgc2NvcGUgPSB0aGlzO1xuXG5cdFx0dmFyIGluZGljZXMgPSBnZW9tZXRyeS5pbmRleCAhPT0gbnVsbCA/IGdlb21ldHJ5LmluZGV4LmFycmF5IDogdW5kZWZpbmVkO1xuXHRcdHZhciBhdHRyaWJ1dGVzID0gZ2VvbWV0cnkuYXR0cmlidXRlcztcblxuXHRcdHZhciBwb3NpdGlvbnMgPSBhdHRyaWJ1dGVzLnBvc2l0aW9uLmFycmF5O1xuXHRcdHZhciBub3JtYWxzID0gYXR0cmlidXRlcy5ub3JtYWwgIT09IHVuZGVmaW5lZCA/IGF0dHJpYnV0ZXMubm9ybWFsLmFycmF5IDogdW5kZWZpbmVkO1xuXHRcdHZhciBjb2xvcnMgPSBhdHRyaWJ1dGVzLmNvbG9yICE9PSB1bmRlZmluZWQgPyBhdHRyaWJ1dGVzLmNvbG9yLmFycmF5IDogdW5kZWZpbmVkO1xuXHRcdHZhciB1dnMgPSBhdHRyaWJ1dGVzLnV2ICE9PSB1bmRlZmluZWQgPyBhdHRyaWJ1dGVzLnV2LmFycmF5IDogdW5kZWZpbmVkO1xuXHRcdHZhciB1dnMyID0gYXR0cmlidXRlcy51djIgIT09IHVuZGVmaW5lZCA/IGF0dHJpYnV0ZXMudXYyLmFycmF5IDogdW5kZWZpbmVkO1xuXG5cdFx0aWYgKCB1dnMyICE9PSB1bmRlZmluZWQgKSB0aGlzLmZhY2VWZXJ0ZXhVdnNbIDEgXSA9IFtdO1xuXG5cdFx0dmFyIHRlbXBOb3JtYWxzID0gW107XG5cdFx0dmFyIHRlbXBVVnMgPSBbXTtcblx0XHR2YXIgdGVtcFVWczIgPSBbXTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgaiA9IDA7IGkgPCBwb3NpdGlvbnMubGVuZ3RoOyBpICs9IDMsIGogKz0gMiApIHtcblxuXHRcdFx0c2NvcGUudmVydGljZXMucHVzaCggbmV3IFZlY3RvcjMoIHBvc2l0aW9uc1sgaSBdLCBwb3NpdGlvbnNbIGkgKyAxIF0sIHBvc2l0aW9uc1sgaSArIDIgXSApICk7XG5cblx0XHRcdGlmICggbm9ybWFscyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHRlbXBOb3JtYWxzLnB1c2goIG5ldyBWZWN0b3IzKCBub3JtYWxzWyBpIF0sIG5vcm1hbHNbIGkgKyAxIF0sIG5vcm1hbHNbIGkgKyAyIF0gKSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggY29sb3JzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0c2NvcGUuY29sb3JzLnB1c2goIG5ldyBDb2xvciggY29sb3JzWyBpIF0sIGNvbG9yc1sgaSArIDEgXSwgY29sb3JzWyBpICsgMiBdICkgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHV2cyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHRlbXBVVnMucHVzaCggbmV3IFZlY3RvcjIoIHV2c1sgaiBdLCB1dnNbIGogKyAxIF0gKSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggdXZzMiAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHRlbXBVVnMyLnB1c2goIG5ldyBWZWN0b3IyKCB1dnMyWyBqIF0sIHV2czJbIGogKyAxIF0gKSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBhZGRGYWNlKCBhLCBiLCBjLCBtYXRlcmlhbEluZGV4ICkge1xuXG5cdFx0XHR2YXIgdmVydGV4Tm9ybWFscyA9IG5vcm1hbHMgIT09IHVuZGVmaW5lZCA/IFsgdGVtcE5vcm1hbHNbIGEgXS5jbG9uZSgpLCB0ZW1wTm9ybWFsc1sgYiBdLmNsb25lKCksIHRlbXBOb3JtYWxzWyBjIF0uY2xvbmUoKSBdIDogW107XG5cdFx0XHR2YXIgdmVydGV4Q29sb3JzID0gY29sb3JzICE9PSB1bmRlZmluZWQgPyBbIHNjb3BlLmNvbG9yc1sgYSBdLmNsb25lKCksIHNjb3BlLmNvbG9yc1sgYiBdLmNsb25lKCksIHNjb3BlLmNvbG9yc1sgYyBdLmNsb25lKCkgXSA6IFtdO1xuXG5cdFx0XHR2YXIgZmFjZSA9IG5ldyBGYWNlMyggYSwgYiwgYywgdmVydGV4Tm9ybWFscywgdmVydGV4Q29sb3JzLCBtYXRlcmlhbEluZGV4ICk7XG5cblx0XHRcdHNjb3BlLmZhY2VzLnB1c2goIGZhY2UgKTtcblxuXHRcdFx0aWYgKCB1dnMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRzY29wZS5mYWNlVmVydGV4VXZzWyAwIF0ucHVzaCggWyB0ZW1wVVZzWyBhIF0uY2xvbmUoKSwgdGVtcFVWc1sgYiBdLmNsb25lKCksIHRlbXBVVnNbIGMgXS5jbG9uZSgpIF0gKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHV2czIgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRzY29wZS5mYWNlVmVydGV4VXZzWyAxIF0ucHVzaCggWyB0ZW1wVVZzMlsgYSBdLmNsb25lKCksIHRlbXBVVnMyWyBiIF0uY2xvbmUoKSwgdGVtcFVWczJbIGMgXS5jbG9uZSgpIF0gKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0dmFyIGdyb3VwcyA9IGdlb21ldHJ5Lmdyb3VwcztcblxuXHRcdGlmICggZ3JvdXBzLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGdyb3Vwcy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdFx0dmFyIGdyb3VwID0gZ3JvdXBzWyBpIF07XG5cblx0XHRcdFx0dmFyIHN0YXJ0ID0gZ3JvdXAuc3RhcnQ7XG5cdFx0XHRcdHZhciBjb3VudCA9IGdyb3VwLmNvdW50O1xuXG5cdFx0XHRcdGZvciAoIHZhciBqID0gc3RhcnQsIGpsID0gc3RhcnQgKyBjb3VudDsgaiA8IGpsOyBqICs9IDMgKSB7XG5cblx0XHRcdFx0XHRpZiAoIGluZGljZXMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdFx0YWRkRmFjZSggaW5kaWNlc1sgaiBdLCBpbmRpY2VzWyBqICsgMSBdLCBpbmRpY2VzWyBqICsgMiBdLCBncm91cC5tYXRlcmlhbEluZGV4ICk7XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRhZGRGYWNlKCBqLCBqICsgMSwgaiArIDIsIGdyb3VwLm1hdGVyaWFsSW5kZXggKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGlmICggaW5kaWNlcyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGluZGljZXMubGVuZ3RoOyBpICs9IDMgKSB7XG5cblx0XHRcdFx0XHRhZGRGYWNlKCBpbmRpY2VzWyBpIF0sIGluZGljZXNbIGkgKyAxIF0sIGluZGljZXNbIGkgKyAyIF0gKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgcG9zaXRpb25zLmxlbmd0aCAvIDM7IGkgKz0gMyApIHtcblxuXHRcdFx0XHRcdGFkZEZhY2UoIGksIGkgKyAxLCBpICsgMiApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0dGhpcy5jb21wdXRlRmFjZU5vcm1hbHMoKTtcblxuXHRcdGlmICggZ2VvbWV0cnkuYm91bmRpbmdCb3ggIT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuYm91bmRpbmdCb3ggPSBnZW9tZXRyeS5ib3VuZGluZ0JveC5jbG9uZSgpO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5ib3VuZGluZ1NwaGVyZSA9IGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlLmNsb25lKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNlbnRlcjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIG9mZnNldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gY2VudGVyKCkge1xuXG5cdFx0XHR0aGlzLmNvbXB1dGVCb3VuZGluZ0JveCgpO1xuXG5cdFx0XHR0aGlzLmJvdW5kaW5nQm94LmdldENlbnRlciggb2Zmc2V0ICkubmVnYXRlKCk7XG5cblx0XHRcdHRoaXMudHJhbnNsYXRlKCBvZmZzZXQueCwgb2Zmc2V0LnksIG9mZnNldC56ICk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0bm9ybWFsaXplOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO1xuXG5cdFx0dmFyIGNlbnRlciA9IHRoaXMuYm91bmRpbmdTcGhlcmUuY2VudGVyO1xuXHRcdHZhciByYWRpdXMgPSB0aGlzLmJvdW5kaW5nU3BoZXJlLnJhZGl1cztcblxuXHRcdHZhciBzID0gcmFkaXVzID09PSAwID8gMSA6IDEuMCAvIHJhZGl1cztcblxuXHRcdHZhciBtYXRyaXggPSBuZXcgTWF0cml4NCgpO1xuXHRcdG1hdHJpeC5zZXQoXG5cdFx0XHRzLCAwLCAwLCAtIHMgKiBjZW50ZXIueCxcblx0XHRcdDAsIHMsIDAsIC0gcyAqIGNlbnRlci55LFxuXHRcdFx0MCwgMCwgcywgLSBzICogY2VudGVyLnosXG5cdFx0XHQwLCAwLCAwLCAxXG5cdFx0KTtcblxuXHRcdHRoaXMuYXBwbHlNYXRyaXgoIG1hdHJpeCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjb21wdXRlRmFjZU5vcm1hbHM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBjYiA9IG5ldyBWZWN0b3IzKCksIGFiID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdGZvciAoIHZhciBmID0gMCwgZmwgPSB0aGlzLmZhY2VzLmxlbmd0aDsgZiA8IGZsOyBmICsrICkge1xuXG5cdFx0XHR2YXIgZmFjZSA9IHRoaXMuZmFjZXNbIGYgXTtcblxuXHRcdFx0dmFyIHZBID0gdGhpcy52ZXJ0aWNlc1sgZmFjZS5hIF07XG5cdFx0XHR2YXIgdkIgPSB0aGlzLnZlcnRpY2VzWyBmYWNlLmIgXTtcblx0XHRcdHZhciB2QyA9IHRoaXMudmVydGljZXNbIGZhY2UuYyBdO1xuXG5cdFx0XHRjYi5zdWJWZWN0b3JzKCB2QywgdkIgKTtcblx0XHRcdGFiLnN1YlZlY3RvcnMoIHZBLCB2QiApO1xuXHRcdFx0Y2IuY3Jvc3MoIGFiICk7XG5cblx0XHRcdGNiLm5vcm1hbGl6ZSgpO1xuXG5cdFx0XHRmYWNlLm5vcm1hbC5jb3B5KCBjYiApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0Y29tcHV0ZVZlcnRleE5vcm1hbHM6IGZ1bmN0aW9uICggYXJlYVdlaWdodGVkICkge1xuXG5cdFx0aWYgKCBhcmVhV2VpZ2h0ZWQgPT09IHVuZGVmaW5lZCApIGFyZWFXZWlnaHRlZCA9IHRydWU7XG5cblx0XHR2YXIgdiwgdmwsIGYsIGZsLCBmYWNlLCB2ZXJ0aWNlcztcblxuXHRcdHZlcnRpY2VzID0gbmV3IEFycmF5KCB0aGlzLnZlcnRpY2VzLmxlbmd0aCApO1xuXG5cdFx0Zm9yICggdiA9IDAsIHZsID0gdGhpcy52ZXJ0aWNlcy5sZW5ndGg7IHYgPCB2bDsgdiArKyApIHtcblxuXHRcdFx0dmVydGljZXNbIHYgXSA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR9XG5cblx0XHRpZiAoIGFyZWFXZWlnaHRlZCApIHtcblxuXHRcdFx0Ly8gdmVydGV4IG5vcm1hbHMgd2VpZ2h0ZWQgYnkgdHJpYW5nbGUgYXJlYXNcblx0XHRcdC8vIGh0dHA6Ly93d3cuaXF1aWxlemxlcy5vcmcvd3d3L2FydGljbGVzL25vcm1hbHMvbm9ybWFscy5odG1cblxuXHRcdFx0dmFyIHZBLCB2QiwgdkM7XG5cdFx0XHR2YXIgY2IgPSBuZXcgVmVjdG9yMygpLCBhYiA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRcdGZvciAoIGYgPSAwLCBmbCA9IHRoaXMuZmFjZXMubGVuZ3RoOyBmIDwgZmw7IGYgKysgKSB7XG5cblx0XHRcdFx0ZmFjZSA9IHRoaXMuZmFjZXNbIGYgXTtcblxuXHRcdFx0XHR2QSA9IHRoaXMudmVydGljZXNbIGZhY2UuYSBdO1xuXHRcdFx0XHR2QiA9IHRoaXMudmVydGljZXNbIGZhY2UuYiBdO1xuXHRcdFx0XHR2QyA9IHRoaXMudmVydGljZXNbIGZhY2UuYyBdO1xuXG5cdFx0XHRcdGNiLnN1YlZlY3RvcnMoIHZDLCB2QiApO1xuXHRcdFx0XHRhYi5zdWJWZWN0b3JzKCB2QSwgdkIgKTtcblx0XHRcdFx0Y2IuY3Jvc3MoIGFiICk7XG5cblx0XHRcdFx0dmVydGljZXNbIGZhY2UuYSBdLmFkZCggY2IgKTtcblx0XHRcdFx0dmVydGljZXNbIGZhY2UuYiBdLmFkZCggY2IgKTtcblx0XHRcdFx0dmVydGljZXNbIGZhY2UuYyBdLmFkZCggY2IgKTtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dGhpcy5jb21wdXRlRmFjZU5vcm1hbHMoKTtcblxuXHRcdFx0Zm9yICggZiA9IDAsIGZsID0gdGhpcy5mYWNlcy5sZW5ndGg7IGYgPCBmbDsgZiArKyApIHtcblxuXHRcdFx0XHRmYWNlID0gdGhpcy5mYWNlc1sgZiBdO1xuXG5cdFx0XHRcdHZlcnRpY2VzWyBmYWNlLmEgXS5hZGQoIGZhY2Uubm9ybWFsICk7XG5cdFx0XHRcdHZlcnRpY2VzWyBmYWNlLmIgXS5hZGQoIGZhY2Uubm9ybWFsICk7XG5cdFx0XHRcdHZlcnRpY2VzWyBmYWNlLmMgXS5hZGQoIGZhY2Uubm9ybWFsICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGZvciAoIHYgPSAwLCB2bCA9IHRoaXMudmVydGljZXMubGVuZ3RoOyB2IDwgdmw7IHYgKysgKSB7XG5cblx0XHRcdHZlcnRpY2VzWyB2IF0ubm9ybWFsaXplKCk7XG5cblx0XHR9XG5cblx0XHRmb3IgKCBmID0gMCwgZmwgPSB0aGlzLmZhY2VzLmxlbmd0aDsgZiA8IGZsOyBmICsrICkge1xuXG5cdFx0XHRmYWNlID0gdGhpcy5mYWNlc1sgZiBdO1xuXG5cdFx0XHR2YXIgdmVydGV4Tm9ybWFscyA9IGZhY2UudmVydGV4Tm9ybWFscztcblxuXHRcdFx0aWYgKCB2ZXJ0ZXhOb3JtYWxzLmxlbmd0aCA9PT0gMyApIHtcblxuXHRcdFx0XHR2ZXJ0ZXhOb3JtYWxzWyAwIF0uY29weSggdmVydGljZXNbIGZhY2UuYSBdICk7XG5cdFx0XHRcdHZlcnRleE5vcm1hbHNbIDEgXS5jb3B5KCB2ZXJ0aWNlc1sgZmFjZS5iIF0gKTtcblx0XHRcdFx0dmVydGV4Tm9ybWFsc1sgMiBdLmNvcHkoIHZlcnRpY2VzWyBmYWNlLmMgXSApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHZlcnRleE5vcm1hbHNbIDAgXSA9IHZlcnRpY2VzWyBmYWNlLmEgXS5jbG9uZSgpO1xuXHRcdFx0XHR2ZXJ0ZXhOb3JtYWxzWyAxIF0gPSB2ZXJ0aWNlc1sgZmFjZS5iIF0uY2xvbmUoKTtcblx0XHRcdFx0dmVydGV4Tm9ybWFsc1sgMiBdID0gdmVydGljZXNbIGZhY2UuYyBdLmNsb25lKCk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5mYWNlcy5sZW5ndGggPiAwICkge1xuXG5cdFx0XHR0aGlzLm5vcm1hbHNOZWVkVXBkYXRlID0gdHJ1ZTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdGNvbXB1dGVGbGF0VmVydGV4Tm9ybWFsczogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGYsIGZsLCBmYWNlO1xuXG5cdFx0dGhpcy5jb21wdXRlRmFjZU5vcm1hbHMoKTtcblxuXHRcdGZvciAoIGYgPSAwLCBmbCA9IHRoaXMuZmFjZXMubGVuZ3RoOyBmIDwgZmw7IGYgKysgKSB7XG5cblx0XHRcdGZhY2UgPSB0aGlzLmZhY2VzWyBmIF07XG5cblx0XHRcdHZhciB2ZXJ0ZXhOb3JtYWxzID0gZmFjZS52ZXJ0ZXhOb3JtYWxzO1xuXG5cdFx0XHRpZiAoIHZlcnRleE5vcm1hbHMubGVuZ3RoID09PSAzICkge1xuXG5cdFx0XHRcdHZlcnRleE5vcm1hbHNbIDAgXS5jb3B5KCBmYWNlLm5vcm1hbCApO1xuXHRcdFx0XHR2ZXJ0ZXhOb3JtYWxzWyAxIF0uY29weSggZmFjZS5ub3JtYWwgKTtcblx0XHRcdFx0dmVydGV4Tm9ybWFsc1sgMiBdLmNvcHkoIGZhY2Uubm9ybWFsICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0dmVydGV4Tm9ybWFsc1sgMCBdID0gZmFjZS5ub3JtYWwuY2xvbmUoKTtcblx0XHRcdFx0dmVydGV4Tm9ybWFsc1sgMSBdID0gZmFjZS5ub3JtYWwuY2xvbmUoKTtcblx0XHRcdFx0dmVydGV4Tm9ybWFsc1sgMiBdID0gZmFjZS5ub3JtYWwuY2xvbmUoKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLmZhY2VzLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdHRoaXMubm9ybWFsc05lZWRVcGRhdGUgPSB0cnVlO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0Y29tcHV0ZU1vcnBoTm9ybWFsczogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGksIGlsLCBmLCBmbCwgZmFjZTtcblxuXHRcdC8vIHNhdmUgb3JpZ2luYWwgbm9ybWFsc1xuXHRcdC8vIC0gY3JlYXRlIHRlbXAgdmFyaWFibGVzIG9uIGZpcnN0IGFjY2Vzc1xuXHRcdC8vICAgb3RoZXJ3aXNlIGp1c3QgY29weSAoZm9yIGZhc3RlciByZXBlYXRlZCBjYWxscylcblxuXHRcdGZvciAoIGYgPSAwLCBmbCA9IHRoaXMuZmFjZXMubGVuZ3RoOyBmIDwgZmw7IGYgKysgKSB7XG5cblx0XHRcdGZhY2UgPSB0aGlzLmZhY2VzWyBmIF07XG5cblx0XHRcdGlmICggISBmYWNlLl9fb3JpZ2luYWxGYWNlTm9ybWFsICkge1xuXG5cdFx0XHRcdGZhY2UuX19vcmlnaW5hbEZhY2VOb3JtYWwgPSBmYWNlLm5vcm1hbC5jbG9uZSgpO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGZhY2UuX19vcmlnaW5hbEZhY2VOb3JtYWwuY29weSggZmFjZS5ub3JtYWwgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoICEgZmFjZS5fX29yaWdpbmFsVmVydGV4Tm9ybWFscyApIGZhY2UuX19vcmlnaW5hbFZlcnRleE5vcm1hbHMgPSBbXTtcblxuXHRcdFx0Zm9yICggaSA9IDAsIGlsID0gZmFjZS52ZXJ0ZXhOb3JtYWxzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdGlmICggISBmYWNlLl9fb3JpZ2luYWxWZXJ0ZXhOb3JtYWxzWyBpIF0gKSB7XG5cblx0XHRcdFx0XHRmYWNlLl9fb3JpZ2luYWxWZXJ0ZXhOb3JtYWxzWyBpIF0gPSBmYWNlLnZlcnRleE5vcm1hbHNbIGkgXS5jbG9uZSgpO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRmYWNlLl9fb3JpZ2luYWxWZXJ0ZXhOb3JtYWxzWyBpIF0uY29weSggZmFjZS52ZXJ0ZXhOb3JtYWxzWyBpIF0gKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIHVzZSB0ZW1wIGdlb21ldHJ5IHRvIGNvbXB1dGUgZmFjZSBhbmQgdmVydGV4IG5vcm1hbHMgZm9yIGVhY2ggbW9ycGhcblxuXHRcdHZhciB0bXBHZW8gPSBuZXcgR2VvbWV0cnkoKTtcblx0XHR0bXBHZW8uZmFjZXMgPSB0aGlzLmZhY2VzO1xuXG5cdFx0Zm9yICggaSA9IDAsIGlsID0gdGhpcy5tb3JwaFRhcmdldHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdC8vIGNyZWF0ZSBvbiBmaXJzdCBhY2Nlc3NcblxuXHRcdFx0aWYgKCAhIHRoaXMubW9ycGhOb3JtYWxzWyBpIF0gKSB7XG5cblx0XHRcdFx0dGhpcy5tb3JwaE5vcm1hbHNbIGkgXSA9IHt9O1xuXHRcdFx0XHR0aGlzLm1vcnBoTm9ybWFsc1sgaSBdLmZhY2VOb3JtYWxzID0gW107XG5cdFx0XHRcdHRoaXMubW9ycGhOb3JtYWxzWyBpIF0udmVydGV4Tm9ybWFscyA9IFtdO1xuXG5cdFx0XHRcdHZhciBkc3ROb3JtYWxzRmFjZSA9IHRoaXMubW9ycGhOb3JtYWxzWyBpIF0uZmFjZU5vcm1hbHM7XG5cdFx0XHRcdHZhciBkc3ROb3JtYWxzVmVydGV4ID0gdGhpcy5tb3JwaE5vcm1hbHNbIGkgXS52ZXJ0ZXhOb3JtYWxzO1xuXG5cdFx0XHRcdHZhciBmYWNlTm9ybWFsLCB2ZXJ0ZXhOb3JtYWxzO1xuXG5cdFx0XHRcdGZvciAoIGYgPSAwLCBmbCA9IHRoaXMuZmFjZXMubGVuZ3RoOyBmIDwgZmw7IGYgKysgKSB7XG5cblx0XHRcdFx0XHRmYWNlTm9ybWFsID0gbmV3IFZlY3RvcjMoKTtcblx0XHRcdFx0XHR2ZXJ0ZXhOb3JtYWxzID0geyBhOiBuZXcgVmVjdG9yMygpLCBiOiBuZXcgVmVjdG9yMygpLCBjOiBuZXcgVmVjdG9yMygpIH07XG5cblx0XHRcdFx0XHRkc3ROb3JtYWxzRmFjZS5wdXNoKCBmYWNlTm9ybWFsICk7XG5cdFx0XHRcdFx0ZHN0Tm9ybWFsc1ZlcnRleC5wdXNoKCB2ZXJ0ZXhOb3JtYWxzICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdHZhciBtb3JwaE5vcm1hbHMgPSB0aGlzLm1vcnBoTm9ybWFsc1sgaSBdO1xuXG5cdFx0XHQvLyBzZXQgdmVydGljZXMgdG8gbW9ycGggdGFyZ2V0XG5cblx0XHRcdHRtcEdlby52ZXJ0aWNlcyA9IHRoaXMubW9ycGhUYXJnZXRzWyBpIF0udmVydGljZXM7XG5cblx0XHRcdC8vIGNvbXB1dGUgbW9ycGggbm9ybWFsc1xuXG5cdFx0XHR0bXBHZW8uY29tcHV0ZUZhY2VOb3JtYWxzKCk7XG5cdFx0XHR0bXBHZW8uY29tcHV0ZVZlcnRleE5vcm1hbHMoKTtcblxuXHRcdFx0Ly8gc3RvcmUgbW9ycGggbm9ybWFsc1xuXG5cdFx0XHR2YXIgZmFjZU5vcm1hbCwgdmVydGV4Tm9ybWFscztcblxuXHRcdFx0Zm9yICggZiA9IDAsIGZsID0gdGhpcy5mYWNlcy5sZW5ndGg7IGYgPCBmbDsgZiArKyApIHtcblxuXHRcdFx0XHRmYWNlID0gdGhpcy5mYWNlc1sgZiBdO1xuXG5cdFx0XHRcdGZhY2VOb3JtYWwgPSBtb3JwaE5vcm1hbHMuZmFjZU5vcm1hbHNbIGYgXTtcblx0XHRcdFx0dmVydGV4Tm9ybWFscyA9IG1vcnBoTm9ybWFscy52ZXJ0ZXhOb3JtYWxzWyBmIF07XG5cblx0XHRcdFx0ZmFjZU5vcm1hbC5jb3B5KCBmYWNlLm5vcm1hbCApO1xuXG5cdFx0XHRcdHZlcnRleE5vcm1hbHMuYS5jb3B5KCBmYWNlLnZlcnRleE5vcm1hbHNbIDAgXSApO1xuXHRcdFx0XHR2ZXJ0ZXhOb3JtYWxzLmIuY29weSggZmFjZS52ZXJ0ZXhOb3JtYWxzWyAxIF0gKTtcblx0XHRcdFx0dmVydGV4Tm9ybWFscy5jLmNvcHkoIGZhY2UudmVydGV4Tm9ybWFsc1sgMiBdICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIHJlc3RvcmUgb3JpZ2luYWwgbm9ybWFsc1xuXG5cdFx0Zm9yICggZiA9IDAsIGZsID0gdGhpcy5mYWNlcy5sZW5ndGg7IGYgPCBmbDsgZiArKyApIHtcblxuXHRcdFx0ZmFjZSA9IHRoaXMuZmFjZXNbIGYgXTtcblxuXHRcdFx0ZmFjZS5ub3JtYWwgPSBmYWNlLl9fb3JpZ2luYWxGYWNlTm9ybWFsO1xuXHRcdFx0ZmFjZS52ZXJ0ZXhOb3JtYWxzID0gZmFjZS5fX29yaWdpbmFsVmVydGV4Tm9ybWFscztcblxuXHRcdH1cblxuXHR9LFxuXG5cdGNvbXB1dGVCb3VuZGluZ0JveDogZnVuY3Rpb24gKCkge1xuXG5cdFx0aWYgKCB0aGlzLmJvdW5kaW5nQm94ID09PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLmJvdW5kaW5nQm94ID0gbmV3IEJveDMoKTtcblxuXHRcdH1cblxuXHRcdHRoaXMuYm91bmRpbmdCb3guc2V0RnJvbVBvaW50cyggdGhpcy52ZXJ0aWNlcyApO1xuXG5cdH0sXG5cblx0Y29tcHV0ZUJvdW5kaW5nU3BoZXJlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRpZiAoIHRoaXMuYm91bmRpbmdTcGhlcmUgPT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuYm91bmRpbmdTcGhlcmUgPSBuZXcgU3BoZXJlKCk7XG5cblx0XHR9XG5cblx0XHR0aGlzLmJvdW5kaW5nU3BoZXJlLnNldEZyb21Qb2ludHMoIHRoaXMudmVydGljZXMgKTtcblxuXHR9LFxuXG5cdG1lcmdlOiBmdW5jdGlvbiAoIGdlb21ldHJ5LCBtYXRyaXgsIG1hdGVyaWFsSW5kZXhPZmZzZXQgKSB7XG5cblx0XHRpZiAoICEgKCBnZW9tZXRyeSAmJiBnZW9tZXRyeS5pc0dlb21ldHJ5ICkgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5HZW9tZXRyeS5tZXJnZSgpOiBnZW9tZXRyeSBub3QgYW4gaW5zdGFuY2Ugb2YgVEhSRUUuR2VvbWV0cnkuJywgZ2VvbWV0cnkgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdHZhciBub3JtYWxNYXRyaXgsXG5cdFx0XHR2ZXJ0ZXhPZmZzZXQgPSB0aGlzLnZlcnRpY2VzLmxlbmd0aCxcblx0XHRcdHZlcnRpY2VzMSA9IHRoaXMudmVydGljZXMsXG5cdFx0XHR2ZXJ0aWNlczIgPSBnZW9tZXRyeS52ZXJ0aWNlcyxcblx0XHRcdGZhY2VzMSA9IHRoaXMuZmFjZXMsXG5cdFx0XHRmYWNlczIgPSBnZW9tZXRyeS5mYWNlcyxcblx0XHRcdHV2czEgPSB0aGlzLmZhY2VWZXJ0ZXhVdnNbIDAgXSxcblx0XHRcdHV2czIgPSBnZW9tZXRyeS5mYWNlVmVydGV4VXZzWyAwIF0sXG5cdFx0XHRjb2xvcnMxID0gdGhpcy5jb2xvcnMsXG5cdFx0XHRjb2xvcnMyID0gZ2VvbWV0cnkuY29sb3JzO1xuXG5cdFx0aWYgKCBtYXRlcmlhbEluZGV4T2Zmc2V0ID09PSB1bmRlZmluZWQgKSBtYXRlcmlhbEluZGV4T2Zmc2V0ID0gMDtcblxuXHRcdGlmICggbWF0cml4ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdG5vcm1hbE1hdHJpeCA9IG5ldyBNYXRyaXgzKCkuZ2V0Tm9ybWFsTWF0cml4KCBtYXRyaXggKTtcblxuXHRcdH1cblxuXHRcdC8vIHZlcnRpY2VzXG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gdmVydGljZXMyLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgdmVydGV4ID0gdmVydGljZXMyWyBpIF07XG5cblx0XHRcdHZhciB2ZXJ0ZXhDb3B5ID0gdmVydGV4LmNsb25lKCk7XG5cblx0XHRcdGlmICggbWF0cml4ICE9PSB1bmRlZmluZWQgKSB2ZXJ0ZXhDb3B5LmFwcGx5TWF0cml4NCggbWF0cml4ICk7XG5cblx0XHRcdHZlcnRpY2VzMS5wdXNoKCB2ZXJ0ZXhDb3B5ICk7XG5cblx0XHR9XG5cblx0XHQvLyBjb2xvcnNcblxuXHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBjb2xvcnMyLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRjb2xvcnMxLnB1c2goIGNvbG9yczJbIGkgXS5jbG9uZSgpICk7XG5cblx0XHR9XG5cblx0XHQvLyBmYWNlc1xuXG5cdFx0Zm9yICggaSA9IDAsIGlsID0gZmFjZXMyLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgZmFjZSA9IGZhY2VzMlsgaSBdLCBmYWNlQ29weSwgbm9ybWFsLCBjb2xvcixcblx0XHRcdFx0ZmFjZVZlcnRleE5vcm1hbHMgPSBmYWNlLnZlcnRleE5vcm1hbHMsXG5cdFx0XHRcdGZhY2VWZXJ0ZXhDb2xvcnMgPSBmYWNlLnZlcnRleENvbG9ycztcblxuXHRcdFx0ZmFjZUNvcHkgPSBuZXcgRmFjZTMoIGZhY2UuYSArIHZlcnRleE9mZnNldCwgZmFjZS5iICsgdmVydGV4T2Zmc2V0LCBmYWNlLmMgKyB2ZXJ0ZXhPZmZzZXQgKTtcblx0XHRcdGZhY2VDb3B5Lm5vcm1hbC5jb3B5KCBmYWNlLm5vcm1hbCApO1xuXG5cdFx0XHRpZiAoIG5vcm1hbE1hdHJpeCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGZhY2VDb3B5Lm5vcm1hbC5hcHBseU1hdHJpeDMoIG5vcm1hbE1hdHJpeCApLm5vcm1hbGl6ZSgpO1xuXG5cdFx0XHR9XG5cblx0XHRcdGZvciAoIHZhciBqID0gMCwgamwgPSBmYWNlVmVydGV4Tm9ybWFscy5sZW5ndGg7IGogPCBqbDsgaiArKyApIHtcblxuXHRcdFx0XHRub3JtYWwgPSBmYWNlVmVydGV4Tm9ybWFsc1sgaiBdLmNsb25lKCk7XG5cblx0XHRcdFx0aWYgKCBub3JtYWxNYXRyaXggIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdG5vcm1hbC5hcHBseU1hdHJpeDMoIG5vcm1hbE1hdHJpeCApLm5vcm1hbGl6ZSgpO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRmYWNlQ29weS52ZXJ0ZXhOb3JtYWxzLnB1c2goIG5vcm1hbCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGZhY2VDb3B5LmNvbG9yLmNvcHkoIGZhY2UuY29sb3IgKTtcblxuXHRcdFx0Zm9yICggdmFyIGogPSAwLCBqbCA9IGZhY2VWZXJ0ZXhDb2xvcnMubGVuZ3RoOyBqIDwgamw7IGogKysgKSB7XG5cblx0XHRcdFx0Y29sb3IgPSBmYWNlVmVydGV4Q29sb3JzWyBqIF07XG5cdFx0XHRcdGZhY2VDb3B5LnZlcnRleENvbG9ycy5wdXNoKCBjb2xvci5jbG9uZSgpICk7XG5cblx0XHRcdH1cblxuXHRcdFx0ZmFjZUNvcHkubWF0ZXJpYWxJbmRleCA9IGZhY2UubWF0ZXJpYWxJbmRleCArIG1hdGVyaWFsSW5kZXhPZmZzZXQ7XG5cblx0XHRcdGZhY2VzMS5wdXNoKCBmYWNlQ29weSApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gdXZzXG5cblx0XHRmb3IgKCBpID0gMCwgaWwgPSB1dnMyLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgdXYgPSB1dnMyWyBpIF0sIHV2Q29weSA9IFtdO1xuXG5cdFx0XHRpZiAoIHV2ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Y29udGludWU7XG5cblx0XHRcdH1cblxuXHRcdFx0Zm9yICggdmFyIGogPSAwLCBqbCA9IHV2Lmxlbmd0aDsgaiA8IGpsOyBqICsrICkge1xuXG5cdFx0XHRcdHV2Q29weS5wdXNoKCB1dlsgaiBdLmNsb25lKCkgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR1dnMxLnB1c2goIHV2Q29weSApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0bWVyZ2VNZXNoOiBmdW5jdGlvbiAoIG1lc2ggKSB7XG5cblx0XHRpZiAoICEgKCBtZXNoICYmIG1lc2guaXNNZXNoICkgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5HZW9tZXRyeS5tZXJnZU1lc2goKTogbWVzaCBub3QgYW4gaW5zdGFuY2Ugb2YgVEhSRUUuTWVzaC4nLCBtZXNoICk7XG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHRpZiAoIG1lc2gubWF0cml4QXV0b1VwZGF0ZSApIG1lc2gudXBkYXRlTWF0cml4KCk7XG5cblx0XHR0aGlzLm1lcmdlKCBtZXNoLmdlb21ldHJ5LCBtZXNoLm1hdHJpeCApO1xuXG5cdH0sXG5cblx0Lypcblx0ICogQ2hlY2tzIGZvciBkdXBsaWNhdGUgdmVydGljZXMgd2l0aCBoYXNobWFwLlxuXHQgKiBEdXBsaWNhdGVkIHZlcnRpY2VzIGFyZSByZW1vdmVkXG5cdCAqIGFuZCBmYWNlcycgdmVydGljZXMgYXJlIHVwZGF0ZWQuXG5cdCAqL1xuXG5cdG1lcmdlVmVydGljZXM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2ZXJ0aWNlc01hcCA9IHt9OyAvLyBIYXNobWFwIGZvciBsb29raW5nIHVwIHZlcnRpY2VzIGJ5IHBvc2l0aW9uIGNvb3JkaW5hdGVzIChhbmQgbWFraW5nIHN1cmUgdGhleSBhcmUgdW5pcXVlKVxuXHRcdHZhciB1bmlxdWUgPSBbXSwgY2hhbmdlcyA9IFtdO1xuXG5cdFx0dmFyIHYsIGtleTtcblx0XHR2YXIgcHJlY2lzaW9uUG9pbnRzID0gNDsgLy8gbnVtYmVyIG9mIGRlY2ltYWwgcG9pbnRzLCBlLmcuIDQgZm9yIGVwc2lsb24gb2YgMC4wMDAxXG5cdFx0dmFyIHByZWNpc2lvbiA9IE1hdGgucG93KCAxMCwgcHJlY2lzaW9uUG9pbnRzICk7XG5cdFx0dmFyIGksIGlsLCBmYWNlO1xuXHRcdHZhciBpbmRpY2VzLCBqLCBqbDtcblxuXHRcdGZvciAoIGkgPSAwLCBpbCA9IHRoaXMudmVydGljZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHYgPSB0aGlzLnZlcnRpY2VzWyBpIF07XG5cdFx0XHRrZXkgPSBNYXRoLnJvdW5kKCB2LnggKiBwcmVjaXNpb24gKSArICdfJyArIE1hdGgucm91bmQoIHYueSAqIHByZWNpc2lvbiApICsgJ18nICsgTWF0aC5yb3VuZCggdi56ICogcHJlY2lzaW9uICk7XG5cblx0XHRcdGlmICggdmVydGljZXNNYXBbIGtleSBdID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0dmVydGljZXNNYXBbIGtleSBdID0gaTtcblx0XHRcdFx0dW5pcXVlLnB1c2goIHRoaXMudmVydGljZXNbIGkgXSApO1xuXHRcdFx0XHRjaGFuZ2VzWyBpIF0gPSB1bmlxdWUubGVuZ3RoIC0gMTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvL2NvbnNvbGUubG9nKCdEdXBsaWNhdGUgdmVydGV4IGZvdW5kLiAnLCBpLCAnIGNvdWxkIGJlIHVzaW5nICcsIHZlcnRpY2VzTWFwW2tleV0pO1xuXHRcdFx0XHRjaGFuZ2VzWyBpIF0gPSBjaGFuZ2VzWyB2ZXJ0aWNlc01hcFsga2V5IF0gXTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cblx0XHQvLyBpZiBmYWNlcyBhcmUgY29tcGxldGVseSBkZWdlbmVyYXRlIGFmdGVyIG1lcmdpbmcgdmVydGljZXMsIHdlXG5cdFx0Ly8gaGF2ZSB0byByZW1vdmUgdGhlbSBmcm9tIHRoZSBnZW9tZXRyeS5cblx0XHR2YXIgZmFjZUluZGljZXNUb1JlbW92ZSA9IFtdO1xuXG5cdFx0Zm9yICggaSA9IDAsIGlsID0gdGhpcy5mYWNlcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0ZmFjZSA9IHRoaXMuZmFjZXNbIGkgXTtcblxuXHRcdFx0ZmFjZS5hID0gY2hhbmdlc1sgZmFjZS5hIF07XG5cdFx0XHRmYWNlLmIgPSBjaGFuZ2VzWyBmYWNlLmIgXTtcblx0XHRcdGZhY2UuYyA9IGNoYW5nZXNbIGZhY2UuYyBdO1xuXG5cdFx0XHRpbmRpY2VzID0gWyBmYWNlLmEsIGZhY2UuYiwgZmFjZS5jIF07XG5cblx0XHRcdC8vIGlmIGFueSBkdXBsaWNhdGUgdmVydGljZXMgYXJlIGZvdW5kIGluIGEgRmFjZTNcblx0XHRcdC8vIHdlIGhhdmUgdG8gcmVtb3ZlIHRoZSBmYWNlIGFzIG5vdGhpbmcgY2FuIGJlIHNhdmVkXG5cdFx0XHRmb3IgKCB2YXIgbiA9IDA7IG4gPCAzOyBuICsrICkge1xuXG5cdFx0XHRcdGlmICggaW5kaWNlc1sgbiBdID09PSBpbmRpY2VzWyAoIG4gKyAxICkgJSAzIF0gKSB7XG5cblx0XHRcdFx0XHRmYWNlSW5kaWNlc1RvUmVtb3ZlLnB1c2goIGkgKTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGZvciAoIGkgPSBmYWNlSW5kaWNlc1RvUmVtb3ZlLmxlbmd0aCAtIDE7IGkgPj0gMDsgaSAtLSApIHtcblxuXHRcdFx0dmFyIGlkeCA9IGZhY2VJbmRpY2VzVG9SZW1vdmVbIGkgXTtcblxuXHRcdFx0dGhpcy5mYWNlcy5zcGxpY2UoIGlkeCwgMSApO1xuXG5cdFx0XHRmb3IgKCBqID0gMCwgamwgPSB0aGlzLmZhY2VWZXJ0ZXhVdnMubGVuZ3RoOyBqIDwgamw7IGogKysgKSB7XG5cblx0XHRcdFx0dGhpcy5mYWNlVmVydGV4VXZzWyBqIF0uc3BsaWNlKCBpZHgsIDEgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gVXNlIHVuaXF1ZSBzZXQgb2YgdmVydGljZXNcblxuXHRcdHZhciBkaWZmID0gdGhpcy52ZXJ0aWNlcy5sZW5ndGggLSB1bmlxdWUubGVuZ3RoO1xuXHRcdHRoaXMudmVydGljZXMgPSB1bmlxdWU7XG5cdFx0cmV0dXJuIGRpZmY7XG5cblx0fSxcblxuXHRzZXRGcm9tUG9pbnRzOiBmdW5jdGlvbiAoIHBvaW50cyApIHtcblxuXHRcdHRoaXMudmVydGljZXMgPSBbXTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHBvaW50cy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgcG9pbnQgPSBwb2ludHNbIGkgXTtcblx0XHRcdHRoaXMudmVydGljZXMucHVzaCggbmV3IFZlY3RvcjMoIHBvaW50LngsIHBvaW50LnksIHBvaW50LnogfHwgMCApICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNvcnRGYWNlc0J5TWF0ZXJpYWxJbmRleDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGZhY2VzID0gdGhpcy5mYWNlcztcblx0XHR2YXIgbGVuZ3RoID0gZmFjZXMubGVuZ3RoO1xuXG5cdFx0Ly8gdGFnIGZhY2VzXG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdGZhY2VzWyBpIF0uX2lkID0gaTtcblxuXHRcdH1cblxuXHRcdC8vIHNvcnQgZmFjZXNcblxuXHRcdGZ1bmN0aW9uIG1hdGVyaWFsSW5kZXhTb3J0KCBhLCBiICkge1xuXG5cdFx0XHRyZXR1cm4gYS5tYXRlcmlhbEluZGV4IC0gYi5tYXRlcmlhbEluZGV4O1xuXG5cdFx0fVxuXG5cdFx0ZmFjZXMuc29ydCggbWF0ZXJpYWxJbmRleFNvcnQgKTtcblxuXHRcdC8vIHNvcnQgdXZzXG5cblx0XHR2YXIgdXZzMSA9IHRoaXMuZmFjZVZlcnRleFV2c1sgMCBdO1xuXHRcdHZhciB1dnMyID0gdGhpcy5mYWNlVmVydGV4VXZzWyAxIF07XG5cblx0XHR2YXIgbmV3VXZzMSwgbmV3VXZzMjtcblxuXHRcdGlmICggdXZzMSAmJiB1dnMxLmxlbmd0aCA9PT0gbGVuZ3RoICkgbmV3VXZzMSA9IFtdO1xuXHRcdGlmICggdXZzMiAmJiB1dnMyLmxlbmd0aCA9PT0gbGVuZ3RoICkgbmV3VXZzMiA9IFtdO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHR2YXIgaWQgPSBmYWNlc1sgaSBdLl9pZDtcblxuXHRcdFx0aWYgKCBuZXdVdnMxICkgbmV3VXZzMS5wdXNoKCB1dnMxWyBpZCBdICk7XG5cdFx0XHRpZiAoIG5ld1V2czIgKSBuZXdVdnMyLnB1c2goIHV2czJbIGlkIF0gKTtcblxuXHRcdH1cblxuXHRcdGlmICggbmV3VXZzMSApIHRoaXMuZmFjZVZlcnRleFV2c1sgMCBdID0gbmV3VXZzMTtcblx0XHRpZiAoIG5ld1V2czIgKSB0aGlzLmZhY2VWZXJ0ZXhVdnNbIDEgXSA9IG5ld1V2czI7XG5cblx0fSxcblxuXHR0b0pTT046IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBkYXRhID0ge1xuXHRcdFx0bWV0YWRhdGE6IHtcblx0XHRcdFx0dmVyc2lvbjogNC41LFxuXHRcdFx0XHR0eXBlOiAnR2VvbWV0cnknLFxuXHRcdFx0XHRnZW5lcmF0b3I6ICdHZW9tZXRyeS50b0pTT04nXG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdC8vIHN0YW5kYXJkIEdlb21ldHJ5IHNlcmlhbGl6YXRpb25cblxuXHRcdGRhdGEudXVpZCA9IHRoaXMudXVpZDtcblx0XHRkYXRhLnR5cGUgPSB0aGlzLnR5cGU7XG5cdFx0aWYgKCB0aGlzLm5hbWUgIT09ICcnICkgZGF0YS5uYW1lID0gdGhpcy5uYW1lO1xuXG5cdFx0aWYgKCB0aGlzLnBhcmFtZXRlcnMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dmFyIHBhcmFtZXRlcnMgPSB0aGlzLnBhcmFtZXRlcnM7XG5cblx0XHRcdGZvciAoIHZhciBrZXkgaW4gcGFyYW1ldGVycyApIHtcblxuXHRcdFx0XHRpZiAoIHBhcmFtZXRlcnNbIGtleSBdICE9PSB1bmRlZmluZWQgKSBkYXRhWyBrZXkgXSA9IHBhcmFtZXRlcnNbIGtleSBdO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBkYXRhO1xuXG5cdFx0fVxuXG5cdFx0dmFyIHZlcnRpY2VzID0gW107XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCB0aGlzLnZlcnRpY2VzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0dmFyIHZlcnRleCA9IHRoaXMudmVydGljZXNbIGkgXTtcblx0XHRcdHZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTtcblxuXHRcdH1cblxuXHRcdHZhciBmYWNlcyA9IFtdO1xuXHRcdHZhciBub3JtYWxzID0gW107XG5cdFx0dmFyIG5vcm1hbHNIYXNoID0ge307XG5cdFx0dmFyIGNvbG9ycyA9IFtdO1xuXHRcdHZhciBjb2xvcnNIYXNoID0ge307XG5cdFx0dmFyIHV2cyA9IFtdO1xuXHRcdHZhciB1dnNIYXNoID0ge307XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCB0aGlzLmZhY2VzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGZhY2UgPSB0aGlzLmZhY2VzWyBpIF07XG5cblx0XHRcdHZhciBoYXNNYXRlcmlhbCA9IHRydWU7XG5cdFx0XHR2YXIgaGFzRmFjZVV2ID0gZmFsc2U7IC8vIGRlcHJlY2F0ZWRcblx0XHRcdHZhciBoYXNGYWNlVmVydGV4VXYgPSB0aGlzLmZhY2VWZXJ0ZXhVdnNbIDAgXVsgaSBdICE9PSB1bmRlZmluZWQ7XG5cdFx0XHR2YXIgaGFzRmFjZU5vcm1hbCA9IGZhY2Uubm9ybWFsLmxlbmd0aCgpID4gMDtcblx0XHRcdHZhciBoYXNGYWNlVmVydGV4Tm9ybWFsID0gZmFjZS52ZXJ0ZXhOb3JtYWxzLmxlbmd0aCA+IDA7XG5cdFx0XHR2YXIgaGFzRmFjZUNvbG9yID0gZmFjZS5jb2xvci5yICE9PSAxIHx8IGZhY2UuY29sb3IuZyAhPT0gMSB8fCBmYWNlLmNvbG9yLmIgIT09IDE7XG5cdFx0XHR2YXIgaGFzRmFjZVZlcnRleENvbG9yID0gZmFjZS52ZXJ0ZXhDb2xvcnMubGVuZ3RoID4gMDtcblxuXHRcdFx0dmFyIGZhY2VUeXBlID0gMDtcblxuXHRcdFx0ZmFjZVR5cGUgPSBzZXRCaXQoIGZhY2VUeXBlLCAwLCAwICk7IC8vIGlzUXVhZFxuXHRcdFx0ZmFjZVR5cGUgPSBzZXRCaXQoIGZhY2VUeXBlLCAxLCBoYXNNYXRlcmlhbCApO1xuXHRcdFx0ZmFjZVR5cGUgPSBzZXRCaXQoIGZhY2VUeXBlLCAyLCBoYXNGYWNlVXYgKTtcblx0XHRcdGZhY2VUeXBlID0gc2V0Qml0KCBmYWNlVHlwZSwgMywgaGFzRmFjZVZlcnRleFV2ICk7XG5cdFx0XHRmYWNlVHlwZSA9IHNldEJpdCggZmFjZVR5cGUsIDQsIGhhc0ZhY2VOb3JtYWwgKTtcblx0XHRcdGZhY2VUeXBlID0gc2V0Qml0KCBmYWNlVHlwZSwgNSwgaGFzRmFjZVZlcnRleE5vcm1hbCApO1xuXHRcdFx0ZmFjZVR5cGUgPSBzZXRCaXQoIGZhY2VUeXBlLCA2LCBoYXNGYWNlQ29sb3IgKTtcblx0XHRcdGZhY2VUeXBlID0gc2V0Qml0KCBmYWNlVHlwZSwgNywgaGFzRmFjZVZlcnRleENvbG9yICk7XG5cblx0XHRcdGZhY2VzLnB1c2goIGZhY2VUeXBlICk7XG5cdFx0XHRmYWNlcy5wdXNoKCBmYWNlLmEsIGZhY2UuYiwgZmFjZS5jICk7XG5cdFx0XHRmYWNlcy5wdXNoKCBmYWNlLm1hdGVyaWFsSW5kZXggKTtcblxuXHRcdFx0aWYgKCBoYXNGYWNlVmVydGV4VXYgKSB7XG5cblx0XHRcdFx0dmFyIGZhY2VWZXJ0ZXhVdnMgPSB0aGlzLmZhY2VWZXJ0ZXhVdnNbIDAgXVsgaSBdO1xuXG5cdFx0XHRcdGZhY2VzLnB1c2goXG5cdFx0XHRcdFx0Z2V0VXZJbmRleCggZmFjZVZlcnRleFV2c1sgMCBdICksXG5cdFx0XHRcdFx0Z2V0VXZJbmRleCggZmFjZVZlcnRleFV2c1sgMSBdICksXG5cdFx0XHRcdFx0Z2V0VXZJbmRleCggZmFjZVZlcnRleFV2c1sgMiBdIClcblx0XHRcdFx0KTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGhhc0ZhY2VOb3JtYWwgKSB7XG5cblx0XHRcdFx0ZmFjZXMucHVzaCggZ2V0Tm9ybWFsSW5kZXgoIGZhY2Uubm9ybWFsICkgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGhhc0ZhY2VWZXJ0ZXhOb3JtYWwgKSB7XG5cblx0XHRcdFx0dmFyIHZlcnRleE5vcm1hbHMgPSBmYWNlLnZlcnRleE5vcm1hbHM7XG5cblx0XHRcdFx0ZmFjZXMucHVzaChcblx0XHRcdFx0XHRnZXROb3JtYWxJbmRleCggdmVydGV4Tm9ybWFsc1sgMCBdICksXG5cdFx0XHRcdFx0Z2V0Tm9ybWFsSW5kZXgoIHZlcnRleE5vcm1hbHNbIDEgXSApLFxuXHRcdFx0XHRcdGdldE5vcm1hbEluZGV4KCB2ZXJ0ZXhOb3JtYWxzWyAyIF0gKVxuXHRcdFx0XHQpO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggaGFzRmFjZUNvbG9yICkge1xuXG5cdFx0XHRcdGZhY2VzLnB1c2goIGdldENvbG9ySW5kZXgoIGZhY2UuY29sb3IgKSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggaGFzRmFjZVZlcnRleENvbG9yICkge1xuXG5cdFx0XHRcdHZhciB2ZXJ0ZXhDb2xvcnMgPSBmYWNlLnZlcnRleENvbG9ycztcblxuXHRcdFx0XHRmYWNlcy5wdXNoKFxuXHRcdFx0XHRcdGdldENvbG9ySW5kZXgoIHZlcnRleENvbG9yc1sgMCBdICksXG5cdFx0XHRcdFx0Z2V0Q29sb3JJbmRleCggdmVydGV4Q29sb3JzWyAxIF0gKSxcblx0XHRcdFx0XHRnZXRDb2xvckluZGV4KCB2ZXJ0ZXhDb2xvcnNbIDIgXSApXG5cdFx0XHRcdCk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIHNldEJpdCggdmFsdWUsIHBvc2l0aW9uLCBlbmFibGVkICkge1xuXG5cdFx0XHRyZXR1cm4gZW5hYmxlZCA/IHZhbHVlIHwgKCAxIDw8IHBvc2l0aW9uICkgOiB2YWx1ZSAmICggfiAoIDEgPDwgcG9zaXRpb24gKSApO1xuXG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gZ2V0Tm9ybWFsSW5kZXgoIG5vcm1hbCApIHtcblxuXHRcdFx0dmFyIGhhc2ggPSBub3JtYWwueC50b1N0cmluZygpICsgbm9ybWFsLnkudG9TdHJpbmcoKSArIG5vcm1hbC56LnRvU3RyaW5nKCk7XG5cblx0XHRcdGlmICggbm9ybWFsc0hhc2hbIGhhc2ggXSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHJldHVybiBub3JtYWxzSGFzaFsgaGFzaCBdO1xuXG5cdFx0XHR9XG5cblx0XHRcdG5vcm1hbHNIYXNoWyBoYXNoIF0gPSBub3JtYWxzLmxlbmd0aCAvIDM7XG5cdFx0XHRub3JtYWxzLnB1c2goIG5vcm1hbC54LCBub3JtYWwueSwgbm9ybWFsLnogKTtcblxuXHRcdFx0cmV0dXJuIG5vcm1hbHNIYXNoWyBoYXNoIF07XG5cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBnZXRDb2xvckluZGV4KCBjb2xvciApIHtcblxuXHRcdFx0dmFyIGhhc2ggPSBjb2xvci5yLnRvU3RyaW5nKCkgKyBjb2xvci5nLnRvU3RyaW5nKCkgKyBjb2xvci5iLnRvU3RyaW5nKCk7XG5cblx0XHRcdGlmICggY29sb3JzSGFzaFsgaGFzaCBdICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0cmV0dXJuIGNvbG9yc0hhc2hbIGhhc2ggXTtcblxuXHRcdFx0fVxuXG5cdFx0XHRjb2xvcnNIYXNoWyBoYXNoIF0gPSBjb2xvcnMubGVuZ3RoO1xuXHRcdFx0Y29sb3JzLnB1c2goIGNvbG9yLmdldEhleCgpICk7XG5cblx0XHRcdHJldHVybiBjb2xvcnNIYXNoWyBoYXNoIF07XG5cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBnZXRVdkluZGV4KCB1diApIHtcblxuXHRcdFx0dmFyIGhhc2ggPSB1di54LnRvU3RyaW5nKCkgKyB1di55LnRvU3RyaW5nKCk7XG5cblx0XHRcdGlmICggdXZzSGFzaFsgaGFzaCBdICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0cmV0dXJuIHV2c0hhc2hbIGhhc2ggXTtcblxuXHRcdFx0fVxuXG5cdFx0XHR1dnNIYXNoWyBoYXNoIF0gPSB1dnMubGVuZ3RoIC8gMjtcblx0XHRcdHV2cy5wdXNoKCB1di54LCB1di55ICk7XG5cblx0XHRcdHJldHVybiB1dnNIYXNoWyBoYXNoIF07XG5cblx0XHR9XG5cblx0XHRkYXRhLmRhdGEgPSB7fTtcblxuXHRcdGRhdGEuZGF0YS52ZXJ0aWNlcyA9IHZlcnRpY2VzO1xuXHRcdGRhdGEuZGF0YS5ub3JtYWxzID0gbm9ybWFscztcblx0XHRpZiAoIGNvbG9ycy5sZW5ndGggPiAwICkgZGF0YS5kYXRhLmNvbG9ycyA9IGNvbG9ycztcblx0XHRpZiAoIHV2cy5sZW5ndGggPiAwICkgZGF0YS5kYXRhLnV2cyA9IFsgdXZzIF07IC8vIHRlbXBvcmFsIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcblx0XHRkYXRhLmRhdGEuZmFjZXMgPSBmYWNlcztcblxuXHRcdHJldHVybiBkYXRhO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8qXG5cdFx0IC8vIEhhbmRsZSBwcmltaXRpdmVzXG5cblx0XHQgdmFyIHBhcmFtZXRlcnMgPSB0aGlzLnBhcmFtZXRlcnM7XG5cblx0XHQgaWYgKCBwYXJhbWV0ZXJzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHQgdmFyIHZhbHVlcyA9IFtdO1xuXG5cdFx0IGZvciAoIHZhciBrZXkgaW4gcGFyYW1ldGVycyApIHtcblxuXHRcdCB2YWx1ZXMucHVzaCggcGFyYW1ldGVyc1sga2V5IF0gKTtcblxuXHRcdCB9XG5cblx0XHQgdmFyIGdlb21ldHJ5ID0gT2JqZWN0LmNyZWF0ZSggdGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUgKTtcblx0XHQgdGhpcy5jb25zdHJ1Y3Rvci5hcHBseSggZ2VvbWV0cnksIHZhbHVlcyApO1xuXHRcdCByZXR1cm4gZ2VvbWV0cnk7XG5cblx0XHQgfVxuXG5cdFx0IHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblx0XHQgKi9cblxuXHRcdHJldHVybiBuZXcgR2VvbWV0cnkoKS5jb3B5KCB0aGlzICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRcdHZhciBpLCBpbCwgaiwgamwsIGssIGtsO1xuXG5cdFx0Ly8gcmVzZXRcblxuXHRcdHRoaXMudmVydGljZXMgPSBbXTtcblx0XHR0aGlzLmNvbG9ycyA9IFtdO1xuXHRcdHRoaXMuZmFjZXMgPSBbXTtcblx0XHR0aGlzLmZhY2VWZXJ0ZXhVdnMgPSBbW11dO1xuXHRcdHRoaXMubW9ycGhUYXJnZXRzID0gW107XG5cdFx0dGhpcy5tb3JwaE5vcm1hbHMgPSBbXTtcblx0XHR0aGlzLnNraW5XZWlnaHRzID0gW107XG5cdFx0dGhpcy5za2luSW5kaWNlcyA9IFtdO1xuXHRcdHRoaXMubGluZURpc3RhbmNlcyA9IFtdO1xuXHRcdHRoaXMuYm91bmRpbmdCb3ggPSBudWxsO1xuXHRcdHRoaXMuYm91bmRpbmdTcGhlcmUgPSBudWxsO1xuXG5cdFx0Ly8gbmFtZVxuXG5cdFx0dGhpcy5uYW1lID0gc291cmNlLm5hbWU7XG5cblx0XHQvLyB2ZXJ0aWNlc1xuXG5cdFx0dmFyIHZlcnRpY2VzID0gc291cmNlLnZlcnRpY2VzO1xuXG5cdFx0Zm9yICggaSA9IDAsIGlsID0gdmVydGljZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHRoaXMudmVydGljZXMucHVzaCggdmVydGljZXNbIGkgXS5jbG9uZSgpICk7XG5cblx0XHR9XG5cblx0XHQvLyBjb2xvcnNcblxuXHRcdHZhciBjb2xvcnMgPSBzb3VyY2UuY29sb3JzO1xuXG5cdFx0Zm9yICggaSA9IDAsIGlsID0gY29sb3JzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR0aGlzLmNvbG9ycy5wdXNoKCBjb2xvcnNbIGkgXS5jbG9uZSgpICk7XG5cblx0XHR9XG5cblx0XHQvLyBmYWNlc1xuXG5cdFx0dmFyIGZhY2VzID0gc291cmNlLmZhY2VzO1xuXG5cdFx0Zm9yICggaSA9IDAsIGlsID0gZmFjZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHRoaXMuZmFjZXMucHVzaCggZmFjZXNbIGkgXS5jbG9uZSgpICk7XG5cblx0XHR9XG5cblx0XHQvLyBmYWNlIHZlcnRleCB1dnNcblxuXHRcdGZvciAoIGkgPSAwLCBpbCA9IHNvdXJjZS5mYWNlVmVydGV4VXZzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgZmFjZVZlcnRleFV2cyA9IHNvdXJjZS5mYWNlVmVydGV4VXZzWyBpIF07XG5cblx0XHRcdGlmICggdGhpcy5mYWNlVmVydGV4VXZzWyBpIF0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHR0aGlzLmZhY2VWZXJ0ZXhVdnNbIGkgXSA9IFtdO1xuXG5cdFx0XHR9XG5cblx0XHRcdGZvciAoIGogPSAwLCBqbCA9IGZhY2VWZXJ0ZXhVdnMubGVuZ3RoOyBqIDwgamw7IGogKysgKSB7XG5cblx0XHRcdFx0dmFyIHV2cyA9IGZhY2VWZXJ0ZXhVdnNbIGogXSwgdXZzQ29weSA9IFtdO1xuXG5cdFx0XHRcdGZvciAoIGsgPSAwLCBrbCA9IHV2cy5sZW5ndGg7IGsgPCBrbDsgayArKyApIHtcblxuXHRcdFx0XHRcdHZhciB1diA9IHV2c1sgayBdO1xuXG5cdFx0XHRcdFx0dXZzQ29weS5wdXNoKCB1di5jbG9uZSgpICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoaXMuZmFjZVZlcnRleFV2c1sgaSBdLnB1c2goIHV2c0NvcHkgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gbW9ycGggdGFyZ2V0c1xuXG5cdFx0dmFyIG1vcnBoVGFyZ2V0cyA9IHNvdXJjZS5tb3JwaFRhcmdldHM7XG5cblx0XHRmb3IgKCBpID0gMCwgaWwgPSBtb3JwaFRhcmdldHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBtb3JwaFRhcmdldCA9IHt9O1xuXHRcdFx0bW9ycGhUYXJnZXQubmFtZSA9IG1vcnBoVGFyZ2V0c1sgaSBdLm5hbWU7XG5cblx0XHRcdC8vIHZlcnRpY2VzXG5cblx0XHRcdGlmICggbW9ycGhUYXJnZXRzWyBpIF0udmVydGljZXMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRtb3JwaFRhcmdldC52ZXJ0aWNlcyA9IFtdO1xuXG5cdFx0XHRcdGZvciAoIGogPSAwLCBqbCA9IG1vcnBoVGFyZ2V0c1sgaSBdLnZlcnRpY2VzLmxlbmd0aDsgaiA8IGpsOyBqICsrICkge1xuXG5cdFx0XHRcdFx0bW9ycGhUYXJnZXQudmVydGljZXMucHVzaCggbW9ycGhUYXJnZXRzWyBpIF0udmVydGljZXNbIGogXS5jbG9uZSgpICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdC8vIG5vcm1hbHNcblxuXHRcdFx0aWYgKCBtb3JwaFRhcmdldHNbIGkgXS5ub3JtYWxzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0bW9ycGhUYXJnZXQubm9ybWFscyA9IFtdO1xuXG5cdFx0XHRcdGZvciAoIGogPSAwLCBqbCA9IG1vcnBoVGFyZ2V0c1sgaSBdLm5vcm1hbHMubGVuZ3RoOyBqIDwgamw7IGogKysgKSB7XG5cblx0XHRcdFx0XHRtb3JwaFRhcmdldC5ub3JtYWxzLnB1c2goIG1vcnBoVGFyZ2V0c1sgaSBdLm5vcm1hbHNbIGogXS5jbG9uZSgpICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdHRoaXMubW9ycGhUYXJnZXRzLnB1c2goIG1vcnBoVGFyZ2V0ICk7XG5cblx0XHR9XG5cblx0XHQvLyBtb3JwaCBub3JtYWxzXG5cblx0XHR2YXIgbW9ycGhOb3JtYWxzID0gc291cmNlLm1vcnBoTm9ybWFscztcblxuXHRcdGZvciAoIGkgPSAwLCBpbCA9IG1vcnBoTm9ybWFscy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIG1vcnBoTm9ybWFsID0ge307XG5cblx0XHRcdC8vIHZlcnRleCBub3JtYWxzXG5cblx0XHRcdGlmICggbW9ycGhOb3JtYWxzWyBpIF0udmVydGV4Tm9ybWFscyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdG1vcnBoTm9ybWFsLnZlcnRleE5vcm1hbHMgPSBbXTtcblxuXHRcdFx0XHRmb3IgKCBqID0gMCwgamwgPSBtb3JwaE5vcm1hbHNbIGkgXS52ZXJ0ZXhOb3JtYWxzLmxlbmd0aDsgaiA8IGpsOyBqICsrICkge1xuXG5cdFx0XHRcdFx0dmFyIHNyY1ZlcnRleE5vcm1hbCA9IG1vcnBoTm9ybWFsc1sgaSBdLnZlcnRleE5vcm1hbHNbIGogXTtcblx0XHRcdFx0XHR2YXIgZGVzdFZlcnRleE5vcm1hbCA9IHt9O1xuXG5cdFx0XHRcdFx0ZGVzdFZlcnRleE5vcm1hbC5hID0gc3JjVmVydGV4Tm9ybWFsLmEuY2xvbmUoKTtcblx0XHRcdFx0XHRkZXN0VmVydGV4Tm9ybWFsLmIgPSBzcmNWZXJ0ZXhOb3JtYWwuYi5jbG9uZSgpO1xuXHRcdFx0XHRcdGRlc3RWZXJ0ZXhOb3JtYWwuYyA9IHNyY1ZlcnRleE5vcm1hbC5jLmNsb25lKCk7XG5cblx0XHRcdFx0XHRtb3JwaE5vcm1hbC52ZXJ0ZXhOb3JtYWxzLnB1c2goIGRlc3RWZXJ0ZXhOb3JtYWwgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gZmFjZSBub3JtYWxzXG5cblx0XHRcdGlmICggbW9ycGhOb3JtYWxzWyBpIF0uZmFjZU5vcm1hbHMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRtb3JwaE5vcm1hbC5mYWNlTm9ybWFscyA9IFtdO1xuXG5cdFx0XHRcdGZvciAoIGogPSAwLCBqbCA9IG1vcnBoTm9ybWFsc1sgaSBdLmZhY2VOb3JtYWxzLmxlbmd0aDsgaiA8IGpsOyBqICsrICkge1xuXG5cdFx0XHRcdFx0bW9ycGhOb3JtYWwuZmFjZU5vcm1hbHMucHVzaCggbW9ycGhOb3JtYWxzWyBpIF0uZmFjZU5vcm1hbHNbIGogXS5jbG9uZSgpICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdHRoaXMubW9ycGhOb3JtYWxzLnB1c2goIG1vcnBoTm9ybWFsICk7XG5cblx0XHR9XG5cblx0XHQvLyBza2luIHdlaWdodHNcblxuXHRcdHZhciBza2luV2VpZ2h0cyA9IHNvdXJjZS5za2luV2VpZ2h0cztcblxuXHRcdGZvciAoIGkgPSAwLCBpbCA9IHNraW5XZWlnaHRzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR0aGlzLnNraW5XZWlnaHRzLnB1c2goIHNraW5XZWlnaHRzWyBpIF0uY2xvbmUoKSApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gc2tpbiBpbmRpY2VzXG5cblx0XHR2YXIgc2tpbkluZGljZXMgPSBzb3VyY2Uuc2tpbkluZGljZXM7XG5cblx0XHRmb3IgKCBpID0gMCwgaWwgPSBza2luSW5kaWNlcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0dGhpcy5za2luSW5kaWNlcy5wdXNoKCBza2luSW5kaWNlc1sgaSBdLmNsb25lKCkgKTtcblxuXHRcdH1cblxuXHRcdC8vIGxpbmUgZGlzdGFuY2VzXG5cblx0XHR2YXIgbGluZURpc3RhbmNlcyA9IHNvdXJjZS5saW5lRGlzdGFuY2VzO1xuXG5cdFx0Zm9yICggaSA9IDAsIGlsID0gbGluZURpc3RhbmNlcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0dGhpcy5saW5lRGlzdGFuY2VzLnB1c2goIGxpbmVEaXN0YW5jZXNbIGkgXSApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gYm91bmRpbmcgYm94XG5cblx0XHR2YXIgYm91bmRpbmdCb3ggPSBzb3VyY2UuYm91bmRpbmdCb3g7XG5cblx0XHRpZiAoIGJvdW5kaW5nQm94ICE9PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLmJvdW5kaW5nQm94ID0gYm91bmRpbmdCb3guY2xvbmUoKTtcblxuXHRcdH1cblxuXHRcdC8vIGJvdW5kaW5nIHNwaGVyZVxuXG5cdFx0dmFyIGJvdW5kaW5nU3BoZXJlID0gc291cmNlLmJvdW5kaW5nU3BoZXJlO1xuXG5cdFx0aWYgKCBib3VuZGluZ1NwaGVyZSAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5ib3VuZGluZ1NwaGVyZSA9IGJvdW5kaW5nU3BoZXJlLmNsb25lKCk7XG5cblx0XHR9XG5cblx0XHQvLyB1cGRhdGUgZmxhZ3NcblxuXHRcdHRoaXMuZWxlbWVudHNOZWVkVXBkYXRlID0gc291cmNlLmVsZW1lbnRzTmVlZFVwZGF0ZTtcblx0XHR0aGlzLnZlcnRpY2VzTmVlZFVwZGF0ZSA9IHNvdXJjZS52ZXJ0aWNlc05lZWRVcGRhdGU7XG5cdFx0dGhpcy51dnNOZWVkVXBkYXRlID0gc291cmNlLnV2c05lZWRVcGRhdGU7XG5cdFx0dGhpcy5ub3JtYWxzTmVlZFVwZGF0ZSA9IHNvdXJjZS5ub3JtYWxzTmVlZFVwZGF0ZTtcblx0XHR0aGlzLmNvbG9yc05lZWRVcGRhdGUgPSBzb3VyY2UuY29sb3JzTmVlZFVwZGF0ZTtcblx0XHR0aGlzLmxpbmVEaXN0YW5jZXNOZWVkVXBkYXRlID0gc291cmNlLmxpbmVEaXN0YW5jZXNOZWVkVXBkYXRlO1xuXHRcdHRoaXMuZ3JvdXBzTmVlZFVwZGF0ZSA9IHNvdXJjZS5ncm91cHNOZWVkVXBkYXRlO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRkaXNwb3NlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLmRpc3BhdGNoRXZlbnQoIHsgdHlwZTogJ2Rpc3Bvc2UnIH0gKTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIEJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplLCBub3JtYWxpemVkICkge1xuXG5cdGlmICggQXJyYXkuaXNBcnJheSggYXJyYXkgKSApIHtcblxuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoICdUSFJFRS5CdWZmZXJBdHRyaWJ1dGU6IGFycmF5IHNob3VsZCBiZSBhIFR5cGVkIEFycmF5LicgKTtcblxuXHR9XG5cblx0dGhpcy5uYW1lID0gJyc7XG5cblx0dGhpcy5hcnJheSA9IGFycmF5O1xuXHR0aGlzLml0ZW1TaXplID0gaXRlbVNpemU7XG5cdHRoaXMuY291bnQgPSBhcnJheSAhPT0gdW5kZWZpbmVkID8gYXJyYXkubGVuZ3RoIC8gaXRlbVNpemUgOiAwO1xuXHR0aGlzLm5vcm1hbGl6ZWQgPSBub3JtYWxpemVkID09PSB0cnVlO1xuXG5cdHRoaXMuZHluYW1pYyA9IGZhbHNlO1xuXHR0aGlzLnVwZGF0ZVJhbmdlID0geyBvZmZzZXQ6IDAsIGNvdW50OiAtIDEgfTtcblxuXHR0aGlzLnZlcnNpb24gPSAwO1xuXG59XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eSggQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSwgJ25lZWRzVXBkYXRlJywge1xuXG5cdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdGlmICggdmFsdWUgPT09IHRydWUgKSB0aGlzLnZlcnNpb24gKys7XG5cblx0fVxuXG59ICk7XG5cbk9iamVjdC5hc3NpZ24oIEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUsIHtcblxuXHRpc0J1ZmZlckF0dHJpYnV0ZTogdHJ1ZSxcblxuXHRvblVwbG9hZENhbGxiYWNrOiBmdW5jdGlvbiAoKSB7fSxcblxuXHRzZXRBcnJheTogZnVuY3Rpb24gKCBhcnJheSApIHtcblxuXHRcdGlmICggQXJyYXkuaXNBcnJheSggYXJyYXkgKSApIHtcblxuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvciggJ1RIUkVFLkJ1ZmZlckF0dHJpYnV0ZTogYXJyYXkgc2hvdWxkIGJlIGEgVHlwZWQgQXJyYXkuJyApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5jb3VudCA9IGFycmF5ICE9PSB1bmRlZmluZWQgPyBhcnJheS5sZW5ndGggLyB0aGlzLml0ZW1TaXplIDogMDtcblx0XHR0aGlzLmFycmF5ID0gYXJyYXk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldER5bmFtaWM6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLmR5bmFtaWMgPSB2YWx1ZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHR0aGlzLm5hbWUgPSBzb3VyY2UubmFtZTtcblx0XHR0aGlzLmFycmF5ID0gbmV3IHNvdXJjZS5hcnJheS5jb25zdHJ1Y3Rvciggc291cmNlLmFycmF5ICk7XG5cdFx0dGhpcy5pdGVtU2l6ZSA9IHNvdXJjZS5pdGVtU2l6ZTtcblx0XHR0aGlzLmNvdW50ID0gc291cmNlLmNvdW50O1xuXHRcdHRoaXMubm9ybWFsaXplZCA9IHNvdXJjZS5ub3JtYWxpemVkO1xuXG5cdFx0dGhpcy5keW5hbWljID0gc291cmNlLmR5bmFtaWM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvcHlBdDogZnVuY3Rpb24gKCBpbmRleDEsIGF0dHJpYnV0ZSwgaW5kZXgyICkge1xuXG5cdFx0aW5kZXgxICo9IHRoaXMuaXRlbVNpemU7XG5cdFx0aW5kZXgyICo9IGF0dHJpYnV0ZS5pdGVtU2l6ZTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHRoaXMuaXRlbVNpemU7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR0aGlzLmFycmF5WyBpbmRleDEgKyBpIF0gPSBhdHRyaWJ1dGUuYXJyYXlbIGluZGV4MiArIGkgXTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y29weUFycmF5OiBmdW5jdGlvbiAoIGFycmF5ICkge1xuXG5cdFx0dGhpcy5hcnJheS5zZXQoIGFycmF5ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvcHlDb2xvcnNBcnJheTogZnVuY3Rpb24gKCBjb2xvcnMgKSB7XG5cblx0XHR2YXIgYXJyYXkgPSB0aGlzLmFycmF5LCBvZmZzZXQgPSAwO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gY29sb3JzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBjb2xvciA9IGNvbG9yc1sgaSBdO1xuXG5cdFx0XHRpZiAoIGNvbG9yID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQnVmZmVyQXR0cmlidXRlLmNvcHlDb2xvcnNBcnJheSgpOiBjb2xvciBpcyB1bmRlZmluZWQnLCBpICk7XG5cdFx0XHRcdGNvbG9yID0gbmV3IENvbG9yKCk7XG5cblx0XHRcdH1cblxuXHRcdFx0YXJyYXlbIG9mZnNldCArKyBdID0gY29sb3Iucjtcblx0XHRcdGFycmF5WyBvZmZzZXQgKysgXSA9IGNvbG9yLmc7XG5cdFx0XHRhcnJheVsgb2Zmc2V0ICsrIF0gPSBjb2xvci5iO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjb3B5VmVjdG9yMnNBcnJheTogZnVuY3Rpb24gKCB2ZWN0b3JzICkge1xuXG5cdFx0dmFyIGFycmF5ID0gdGhpcy5hcnJheSwgb2Zmc2V0ID0gMDtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHZlY3RvcnMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIHZlY3RvciA9IHZlY3RvcnNbIGkgXTtcblxuXHRcdFx0aWYgKCB2ZWN0b3IgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJBdHRyaWJ1dGUuY29weVZlY3RvcjJzQXJyYXkoKTogdmVjdG9yIGlzIHVuZGVmaW5lZCcsIGkgKTtcblx0XHRcdFx0dmVjdG9yID0gbmV3IFZlY3RvcjIoKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRhcnJheVsgb2Zmc2V0ICsrIF0gPSB2ZWN0b3IueDtcblx0XHRcdGFycmF5WyBvZmZzZXQgKysgXSA9IHZlY3Rvci55O1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjb3B5VmVjdG9yM3NBcnJheTogZnVuY3Rpb24gKCB2ZWN0b3JzICkge1xuXG5cdFx0dmFyIGFycmF5ID0gdGhpcy5hcnJheSwgb2Zmc2V0ID0gMDtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHZlY3RvcnMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIHZlY3RvciA9IHZlY3RvcnNbIGkgXTtcblxuXHRcdFx0aWYgKCB2ZWN0b3IgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJBdHRyaWJ1dGUuY29weVZlY3RvcjNzQXJyYXkoKTogdmVjdG9yIGlzIHVuZGVmaW5lZCcsIGkgKTtcblx0XHRcdFx0dmVjdG9yID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRhcnJheVsgb2Zmc2V0ICsrIF0gPSB2ZWN0b3IueDtcblx0XHRcdGFycmF5WyBvZmZzZXQgKysgXSA9IHZlY3Rvci55O1xuXHRcdFx0YXJyYXlbIG9mZnNldCArKyBdID0gdmVjdG9yLno7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvcHlWZWN0b3I0c0FycmF5OiBmdW5jdGlvbiAoIHZlY3RvcnMgKSB7XG5cblx0XHR2YXIgYXJyYXkgPSB0aGlzLmFycmF5LCBvZmZzZXQgPSAwO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gdmVjdG9ycy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgdmVjdG9yID0gdmVjdG9yc1sgaSBdO1xuXG5cdFx0XHRpZiAoIHZlY3RvciA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckF0dHJpYnV0ZS5jb3B5VmVjdG9yNHNBcnJheSgpOiB2ZWN0b3IgaXMgdW5kZWZpbmVkJywgaSApO1xuXHRcdFx0XHR2ZWN0b3IgPSBuZXcgVmVjdG9yNCgpO1xuXG5cdFx0XHR9XG5cblx0XHRcdGFycmF5WyBvZmZzZXQgKysgXSA9IHZlY3Rvci54O1xuXHRcdFx0YXJyYXlbIG9mZnNldCArKyBdID0gdmVjdG9yLnk7XG5cdFx0XHRhcnJheVsgb2Zmc2V0ICsrIF0gPSB2ZWN0b3Iuejtcblx0XHRcdGFycmF5WyBvZmZzZXQgKysgXSA9IHZlY3Rvci53O1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUsIG9mZnNldCApIHtcblxuXHRcdGlmICggb2Zmc2V0ID09PSB1bmRlZmluZWQgKSBvZmZzZXQgPSAwO1xuXG5cdFx0dGhpcy5hcnJheS5zZXQoIHZhbHVlLCBvZmZzZXQgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Z2V0WDogZnVuY3Rpb24gKCBpbmRleCApIHtcblxuXHRcdHJldHVybiB0aGlzLmFycmF5WyBpbmRleCAqIHRoaXMuaXRlbVNpemUgXTtcblxuXHR9LFxuXG5cdHNldFg6IGZ1bmN0aW9uICggaW5kZXgsIHggKSB7XG5cblx0XHR0aGlzLmFycmF5WyBpbmRleCAqIHRoaXMuaXRlbVNpemUgXSA9IHg7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGdldFk6IGZ1bmN0aW9uICggaW5kZXggKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5hcnJheVsgaW5kZXggKiB0aGlzLml0ZW1TaXplICsgMSBdO1xuXG5cdH0sXG5cblx0c2V0WTogZnVuY3Rpb24gKCBpbmRleCwgeSApIHtcblxuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICogdGhpcy5pdGVtU2l6ZSArIDEgXSA9IHk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGdldFo6IGZ1bmN0aW9uICggaW5kZXggKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5hcnJheVsgaW5kZXggKiB0aGlzLml0ZW1TaXplICsgMiBdO1xuXG5cdH0sXG5cblx0c2V0WjogZnVuY3Rpb24gKCBpbmRleCwgeiApIHtcblxuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICogdGhpcy5pdGVtU2l6ZSArIDIgXSA9IHo7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGdldFc6IGZ1bmN0aW9uICggaW5kZXggKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5hcnJheVsgaW5kZXggKiB0aGlzLml0ZW1TaXplICsgMyBdO1xuXG5cdH0sXG5cblx0c2V0VzogZnVuY3Rpb24gKCBpbmRleCwgdyApIHtcblxuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICogdGhpcy5pdGVtU2l6ZSArIDMgXSA9IHc7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFhZOiBmdW5jdGlvbiAoIGluZGV4LCB4LCB5ICkge1xuXG5cdFx0aW5kZXggKj0gdGhpcy5pdGVtU2l6ZTtcblxuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICsgMCBdID0geDtcblx0XHR0aGlzLmFycmF5WyBpbmRleCArIDEgXSA9IHk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFhZWjogZnVuY3Rpb24gKCBpbmRleCwgeCwgeSwgeiApIHtcblxuXHRcdGluZGV4ICo9IHRoaXMuaXRlbVNpemU7XG5cblx0XHR0aGlzLmFycmF5WyBpbmRleCArIDAgXSA9IHg7XG5cdFx0dGhpcy5hcnJheVsgaW5kZXggKyAxIF0gPSB5O1xuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICsgMiBdID0gejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0WFlaVzogZnVuY3Rpb24gKCBpbmRleCwgeCwgeSwgeiwgdyApIHtcblxuXHRcdGluZGV4ICo9IHRoaXMuaXRlbVNpemU7XG5cblx0XHR0aGlzLmFycmF5WyBpbmRleCArIDAgXSA9IHg7XG5cdFx0dGhpcy5hcnJheVsgaW5kZXggKyAxIF0gPSB5O1xuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICsgMiBdID0gejtcblx0XHR0aGlzLmFycmF5WyBpbmRleCArIDMgXSA9IHc7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG9uVXBsb2FkOiBmdW5jdGlvbiAoIGNhbGxiYWNrICkge1xuXG5cdFx0dGhpcy5vblVwbG9hZENhbGxiYWNrID0gY2FsbGJhY2s7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoIHRoaXMuYXJyYXksIHRoaXMuaXRlbVNpemUgKS5jb3B5KCB0aGlzICk7XG5cblx0fVxuXG59ICk7XG5cbi8vXG5cbmZ1bmN0aW9uIEludDhCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApIHtcblxuXHRCdWZmZXJBdHRyaWJ1dGUuY2FsbCggdGhpcywgbmV3IEludDhBcnJheSggYXJyYXkgKSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKTtcblxufVxuXG5JbnQ4QnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgKTtcbkludDhCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gSW50OEJ1ZmZlckF0dHJpYnV0ZTtcblxuXG5mdW5jdGlvbiBVaW50OEJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplLCBub3JtYWxpemVkICkge1xuXG5cdEJ1ZmZlckF0dHJpYnV0ZS5jYWxsKCB0aGlzLCBuZXcgVWludDhBcnJheSggYXJyYXkgKSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKTtcblxufVxuXG5VaW50OEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlICk7XG5VaW50OEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBVaW50OEJ1ZmZlckF0dHJpYnV0ZTtcblxuXG5mdW5jdGlvbiBVaW50OENsYW1wZWRCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApIHtcblxuXHRCdWZmZXJBdHRyaWJ1dGUuY2FsbCggdGhpcywgbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KCBhcnJheSApLCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApO1xuXG59XG5cblVpbnQ4Q2xhbXBlZEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlICk7XG5VaW50OENsYW1wZWRCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVWludDhDbGFtcGVkQnVmZmVyQXR0cmlidXRlO1xuXG5cbmZ1bmN0aW9uIEludDE2QnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKSB7XG5cblx0QnVmZmVyQXR0cmlidXRlLmNhbGwoIHRoaXMsIG5ldyBJbnQxNkFycmF5KCBhcnJheSApLCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApO1xuXG59XG5cbkludDE2QnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgKTtcbkludDE2QnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEludDE2QnVmZmVyQXR0cmlidXRlO1xuXG5cbmZ1bmN0aW9uIFVpbnQxNkJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplLCBub3JtYWxpemVkICkge1xuXG5cdEJ1ZmZlckF0dHJpYnV0ZS5jYWxsKCB0aGlzLCBuZXcgVWludDE2QXJyYXkoIGFycmF5ICksIGl0ZW1TaXplLCBub3JtYWxpemVkICk7XG5cbn1cblxuVWludDE2QnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgKTtcblVpbnQxNkJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBVaW50MTZCdWZmZXJBdHRyaWJ1dGU7XG5cblxuZnVuY3Rpb24gSW50MzJCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApIHtcblxuXHRCdWZmZXJBdHRyaWJ1dGUuY2FsbCggdGhpcywgbmV3IEludDMyQXJyYXkoIGFycmF5ICksIGl0ZW1TaXplLCBub3JtYWxpemVkICk7XG5cbn1cblxuSW50MzJCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSApO1xuSW50MzJCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gSW50MzJCdWZmZXJBdHRyaWJ1dGU7XG5cblxuZnVuY3Rpb24gVWludDMyQnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKSB7XG5cblx0QnVmZmVyQXR0cmlidXRlLmNhbGwoIHRoaXMsIG5ldyBVaW50MzJBcnJheSggYXJyYXkgKSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKTtcblxufVxuXG5VaW50MzJCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSApO1xuVWludDMyQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFVpbnQzMkJ1ZmZlckF0dHJpYnV0ZTtcblxuXG5mdW5jdGlvbiBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKSB7XG5cblx0QnVmZmVyQXR0cmlidXRlLmNhbGwoIHRoaXMsIG5ldyBGbG9hdDMyQXJyYXkoIGFycmF5ICksIGl0ZW1TaXplLCBub3JtYWxpemVkICk7XG5cbn1cblxuRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlICk7XG5GbG9hdDMyQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGU7XG5cblxuZnVuY3Rpb24gRmxvYXQ2NEJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplLCBub3JtYWxpemVkICkge1xuXG5cdEJ1ZmZlckF0dHJpYnV0ZS5jYWxsKCB0aGlzLCBuZXcgRmxvYXQ2NEFycmF5KCBhcnJheSApLCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApO1xuXG59XG5cbkZsb2F0NjRCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSApO1xuRmxvYXQ2NEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBGbG9hdDY0QnVmZmVyQXR0cmlidXRlO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gRGlyZWN0R2VvbWV0cnkoKSB7XG5cblx0dGhpcy52ZXJ0aWNlcyA9IFtdO1xuXHR0aGlzLm5vcm1hbHMgPSBbXTtcblx0dGhpcy5jb2xvcnMgPSBbXTtcblx0dGhpcy51dnMgPSBbXTtcblx0dGhpcy51dnMyID0gW107XG5cblx0dGhpcy5ncm91cHMgPSBbXTtcblxuXHR0aGlzLm1vcnBoVGFyZ2V0cyA9IHt9O1xuXG5cdHRoaXMuc2tpbldlaWdodHMgPSBbXTtcblx0dGhpcy5za2luSW5kaWNlcyA9IFtdO1xuXG5cdC8vIHRoaXMubGluZURpc3RhbmNlcyA9IFtdO1xuXG5cdHRoaXMuYm91bmRpbmdCb3ggPSBudWxsO1xuXHR0aGlzLmJvdW5kaW5nU3BoZXJlID0gbnVsbDtcblxuXHQvLyB1cGRhdGUgZmxhZ3NcblxuXHR0aGlzLnZlcnRpY2VzTmVlZFVwZGF0ZSA9IGZhbHNlO1xuXHR0aGlzLm5vcm1hbHNOZWVkVXBkYXRlID0gZmFsc2U7XG5cdHRoaXMuY29sb3JzTmVlZFVwZGF0ZSA9IGZhbHNlO1xuXHR0aGlzLnV2c05lZWRVcGRhdGUgPSBmYWxzZTtcblx0dGhpcy5ncm91cHNOZWVkVXBkYXRlID0gZmFsc2U7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggRGlyZWN0R2VvbWV0cnkucHJvdG90eXBlLCB7XG5cblx0Y29tcHV0ZUdyb3VwczogZnVuY3Rpb24gKCBnZW9tZXRyeSApIHtcblxuXHRcdHZhciBncm91cDtcblx0XHR2YXIgZ3JvdXBzID0gW107XG5cdFx0dmFyIG1hdGVyaWFsSW5kZXggPSB1bmRlZmluZWQ7XG5cblx0XHR2YXIgZmFjZXMgPSBnZW9tZXRyeS5mYWNlcztcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGZhY2VzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGZhY2UgPSBmYWNlc1sgaSBdO1xuXG5cdFx0XHQvLyBtYXRlcmlhbHNcblxuXHRcdFx0aWYgKCBmYWNlLm1hdGVyaWFsSW5kZXggIT09IG1hdGVyaWFsSW5kZXggKSB7XG5cblx0XHRcdFx0bWF0ZXJpYWxJbmRleCA9IGZhY2UubWF0ZXJpYWxJbmRleDtcblxuXHRcdFx0XHRpZiAoIGdyb3VwICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRncm91cC5jb3VudCA9ICggaSAqIDMgKSAtIGdyb3VwLnN0YXJ0O1xuXHRcdFx0XHRcdGdyb3Vwcy5wdXNoKCBncm91cCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRncm91cCA9IHtcblx0XHRcdFx0XHRzdGFydDogaSAqIDMsXG5cdFx0XHRcdFx0bWF0ZXJpYWxJbmRleDogbWF0ZXJpYWxJbmRleFxuXHRcdFx0XHR9O1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIGdyb3VwICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGdyb3VwLmNvdW50ID0gKCBpICogMyApIC0gZ3JvdXAuc3RhcnQ7XG5cdFx0XHRncm91cHMucHVzaCggZ3JvdXAgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMuZ3JvdXBzID0gZ3JvdXBzO1xuXG5cdH0sXG5cblx0ZnJvbUdlb21ldHJ5OiBmdW5jdGlvbiAoIGdlb21ldHJ5ICkge1xuXG5cdFx0dmFyIGZhY2VzID0gZ2VvbWV0cnkuZmFjZXM7XG5cdFx0dmFyIHZlcnRpY2VzID0gZ2VvbWV0cnkudmVydGljZXM7XG5cdFx0dmFyIGZhY2VWZXJ0ZXhVdnMgPSBnZW9tZXRyeS5mYWNlVmVydGV4VXZzO1xuXG5cdFx0dmFyIGhhc0ZhY2VWZXJ0ZXhVdiA9IGZhY2VWZXJ0ZXhVdnNbIDAgXSAmJiBmYWNlVmVydGV4VXZzWyAwIF0ubGVuZ3RoID4gMDtcblx0XHR2YXIgaGFzRmFjZVZlcnRleFV2MiA9IGZhY2VWZXJ0ZXhVdnNbIDEgXSAmJiBmYWNlVmVydGV4VXZzWyAxIF0ubGVuZ3RoID4gMDtcblxuXHRcdC8vIG1vcnBoc1xuXG5cdFx0dmFyIG1vcnBoVGFyZ2V0cyA9IGdlb21ldHJ5Lm1vcnBoVGFyZ2V0cztcblx0XHR2YXIgbW9ycGhUYXJnZXRzTGVuZ3RoID0gbW9ycGhUYXJnZXRzLmxlbmd0aDtcblxuXHRcdHZhciBtb3JwaFRhcmdldHNQb3NpdGlvbjtcblxuXHRcdGlmICggbW9ycGhUYXJnZXRzTGVuZ3RoID4gMCApIHtcblxuXHRcdFx0bW9ycGhUYXJnZXRzUG9zaXRpb24gPSBbXTtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgbW9ycGhUYXJnZXRzTGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRcdG1vcnBoVGFyZ2V0c1Bvc2l0aW9uWyBpIF0gPSBbXTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLm1vcnBoVGFyZ2V0cy5wb3NpdGlvbiA9IG1vcnBoVGFyZ2V0c1Bvc2l0aW9uO1xuXG5cdFx0fVxuXG5cdFx0dmFyIG1vcnBoTm9ybWFscyA9IGdlb21ldHJ5Lm1vcnBoTm9ybWFscztcblx0XHR2YXIgbW9ycGhOb3JtYWxzTGVuZ3RoID0gbW9ycGhOb3JtYWxzLmxlbmd0aDtcblxuXHRcdHZhciBtb3JwaFRhcmdldHNOb3JtYWw7XG5cblx0XHRpZiAoIG1vcnBoTm9ybWFsc0xlbmd0aCA+IDAgKSB7XG5cblx0XHRcdG1vcnBoVGFyZ2V0c05vcm1hbCA9IFtdO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBtb3JwaE5vcm1hbHNMZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdFx0bW9ycGhUYXJnZXRzTm9ybWFsWyBpIF0gPSBbXTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLm1vcnBoVGFyZ2V0cy5ub3JtYWwgPSBtb3JwaFRhcmdldHNOb3JtYWw7XG5cblx0XHR9XG5cblx0XHQvLyBza2luc1xuXG5cdFx0dmFyIHNraW5JbmRpY2VzID0gZ2VvbWV0cnkuc2tpbkluZGljZXM7XG5cdFx0dmFyIHNraW5XZWlnaHRzID0gZ2VvbWV0cnkuc2tpbldlaWdodHM7XG5cblx0XHR2YXIgaGFzU2tpbkluZGljZXMgPSBza2luSW5kaWNlcy5sZW5ndGggPT09IHZlcnRpY2VzLmxlbmd0aDtcblx0XHR2YXIgaGFzU2tpbldlaWdodHMgPSBza2luV2VpZ2h0cy5sZW5ndGggPT09IHZlcnRpY2VzLmxlbmd0aDtcblxuXHRcdC8vXG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBmYWNlcy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdHZhciBmYWNlID0gZmFjZXNbIGkgXTtcblxuXHRcdFx0dGhpcy52ZXJ0aWNlcy5wdXNoKCB2ZXJ0aWNlc1sgZmFjZS5hIF0sIHZlcnRpY2VzWyBmYWNlLmIgXSwgdmVydGljZXNbIGZhY2UuYyBdICk7XG5cblx0XHRcdHZhciB2ZXJ0ZXhOb3JtYWxzID0gZmFjZS52ZXJ0ZXhOb3JtYWxzO1xuXG5cdFx0XHRpZiAoIHZlcnRleE5vcm1hbHMubGVuZ3RoID09PSAzICkge1xuXG5cdFx0XHRcdHRoaXMubm9ybWFscy5wdXNoKCB2ZXJ0ZXhOb3JtYWxzWyAwIF0sIHZlcnRleE5vcm1hbHNbIDEgXSwgdmVydGV4Tm9ybWFsc1sgMiBdICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0dmFyIG5vcm1hbCA9IGZhY2Uubm9ybWFsO1xuXG5cdFx0XHRcdHRoaXMubm9ybWFscy5wdXNoKCBub3JtYWwsIG5vcm1hbCwgbm9ybWFsICk7XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIHZlcnRleENvbG9ycyA9IGZhY2UudmVydGV4Q29sb3JzO1xuXG5cdFx0XHRpZiAoIHZlcnRleENvbG9ycy5sZW5ndGggPT09IDMgKSB7XG5cblx0XHRcdFx0dGhpcy5jb2xvcnMucHVzaCggdmVydGV4Q29sb3JzWyAwIF0sIHZlcnRleENvbG9yc1sgMSBdLCB2ZXJ0ZXhDb2xvcnNbIDIgXSApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHZhciBjb2xvciA9IGZhY2UuY29sb3I7XG5cblx0XHRcdFx0dGhpcy5jb2xvcnMucHVzaCggY29sb3IsIGNvbG9yLCBjb2xvciApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggaGFzRmFjZVZlcnRleFV2ID09PSB0cnVlICkge1xuXG5cdFx0XHRcdHZhciB2ZXJ0ZXhVdnMgPSBmYWNlVmVydGV4VXZzWyAwIF1bIGkgXTtcblxuXHRcdFx0XHRpZiAoIHZlcnRleFV2cyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0dGhpcy51dnMucHVzaCggdmVydGV4VXZzWyAwIF0sIHZlcnRleFV2c1sgMSBdLCB2ZXJ0ZXhVdnNbIDIgXSApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5EaXJlY3RHZW9tZXRyeS5mcm9tR2VvbWV0cnkoKTogVW5kZWZpbmVkIHZlcnRleFV2ICcsIGkgKTtcblxuXHRcdFx0XHRcdHRoaXMudXZzLnB1c2goIG5ldyBWZWN0b3IyKCksIG5ldyBWZWN0b3IyKCksIG5ldyBWZWN0b3IyKCkgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBoYXNGYWNlVmVydGV4VXYyID09PSB0cnVlICkge1xuXG5cdFx0XHRcdHZhciB2ZXJ0ZXhVdnMgPSBmYWNlVmVydGV4VXZzWyAxIF1bIGkgXTtcblxuXHRcdFx0XHRpZiAoIHZlcnRleFV2cyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0dGhpcy51dnMyLnB1c2goIHZlcnRleFV2c1sgMCBdLCB2ZXJ0ZXhVdnNbIDEgXSwgdmVydGV4VXZzWyAyIF0gKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuRGlyZWN0R2VvbWV0cnkuZnJvbUdlb21ldHJ5KCk6IFVuZGVmaW5lZCB2ZXJ0ZXhVdjIgJywgaSApO1xuXG5cdFx0XHRcdFx0dGhpcy51dnMyLnB1c2goIG5ldyBWZWN0b3IyKCksIG5ldyBWZWN0b3IyKCksIG5ldyBWZWN0b3IyKCkgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gbW9ycGhzXG5cblx0XHRcdGZvciAoIHZhciBqID0gMDsgaiA8IG1vcnBoVGFyZ2V0c0xlbmd0aDsgaiArKyApIHtcblxuXHRcdFx0XHR2YXIgbW9ycGhUYXJnZXQgPSBtb3JwaFRhcmdldHNbIGogXS52ZXJ0aWNlcztcblxuXHRcdFx0XHRtb3JwaFRhcmdldHNQb3NpdGlvblsgaiBdLnB1c2goIG1vcnBoVGFyZ2V0WyBmYWNlLmEgXSwgbW9ycGhUYXJnZXRbIGZhY2UuYiBdLCBtb3JwaFRhcmdldFsgZmFjZS5jIF0gKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRmb3IgKCB2YXIgaiA9IDA7IGogPCBtb3JwaE5vcm1hbHNMZW5ndGg7IGogKysgKSB7XG5cblx0XHRcdFx0dmFyIG1vcnBoTm9ybWFsID0gbW9ycGhOb3JtYWxzWyBqIF0udmVydGV4Tm9ybWFsc1sgaSBdO1xuXG5cdFx0XHRcdG1vcnBoVGFyZ2V0c05vcm1hbFsgaiBdLnB1c2goIG1vcnBoTm9ybWFsLmEsIG1vcnBoTm9ybWFsLmIsIG1vcnBoTm9ybWFsLmMgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBza2luc1xuXG5cdFx0XHRpZiAoIGhhc1NraW5JbmRpY2VzICkge1xuXG5cdFx0XHRcdHRoaXMuc2tpbkluZGljZXMucHVzaCggc2tpbkluZGljZXNbIGZhY2UuYSBdLCBza2luSW5kaWNlc1sgZmFjZS5iIF0sIHNraW5JbmRpY2VzWyBmYWNlLmMgXSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggaGFzU2tpbldlaWdodHMgKSB7XG5cblx0XHRcdFx0dGhpcy5za2luV2VpZ2h0cy5wdXNoKCBza2luV2VpZ2h0c1sgZmFjZS5hIF0sIHNraW5XZWlnaHRzWyBmYWNlLmIgXSwgc2tpbldlaWdodHNbIGZhY2UuYyBdICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHRoaXMuY29tcHV0ZUdyb3VwcyggZ2VvbWV0cnkgKTtcblxuXHRcdHRoaXMudmVydGljZXNOZWVkVXBkYXRlID0gZ2VvbWV0cnkudmVydGljZXNOZWVkVXBkYXRlO1xuXHRcdHRoaXMubm9ybWFsc05lZWRVcGRhdGUgPSBnZW9tZXRyeS5ub3JtYWxzTmVlZFVwZGF0ZTtcblx0XHR0aGlzLmNvbG9yc05lZWRVcGRhdGUgPSBnZW9tZXRyeS5jb2xvcnNOZWVkVXBkYXRlO1xuXHRcdHRoaXMudXZzTmVlZFVwZGF0ZSA9IGdlb21ldHJ5LnV2c05lZWRVcGRhdGU7XG5cdFx0dGhpcy5ncm91cHNOZWVkVXBkYXRlID0gZ2VvbWV0cnkuZ3JvdXBzTmVlZFVwZGF0ZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gYXJyYXlNYXgoIGFycmF5ICkge1xuXG5cdGlmICggYXJyYXkubGVuZ3RoID09PSAwICkgcmV0dXJuIC0gSW5maW5pdHk7XG5cblx0dmFyIG1heCA9IGFycmF5WyAwIF07XG5cblx0Zm9yICggdmFyIGkgPSAxLCBsID0gYXJyYXkubGVuZ3RoOyBpIDwgbDsgKysgaSApIHtcblxuXHRcdGlmICggYXJyYXlbIGkgXSA+IG1heCApIG1heCA9IGFycmF5WyBpIF07XG5cblx0fVxuXG5cdHJldHVybiBtYXg7XG5cbn1cblxuLyoqXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG52YXIgYnVmZmVyR2VvbWV0cnlJZCA9IDE7IC8vIEJ1ZmZlckdlb21ldHJ5IHVzZXMgb2RkIG51bWJlcnMgYXMgSWRcblxuZnVuY3Rpb24gQnVmZmVyR2VvbWV0cnkoKSB7XG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KCB0aGlzLCAnaWQnLCB7IHZhbHVlOiBidWZmZXJHZW9tZXRyeUlkICs9IDIgfSApO1xuXG5cdHRoaXMudXVpZCA9IF9NYXRoLmdlbmVyYXRlVVVJRCgpO1xuXG5cdHRoaXMubmFtZSA9ICcnO1xuXHR0aGlzLnR5cGUgPSAnQnVmZmVyR2VvbWV0cnknO1xuXG5cdHRoaXMuaW5kZXggPSBudWxsO1xuXHR0aGlzLmF0dHJpYnV0ZXMgPSB7fTtcblxuXHR0aGlzLm1vcnBoQXR0cmlidXRlcyA9IHt9O1xuXG5cdHRoaXMuZ3JvdXBzID0gW107XG5cblx0dGhpcy5ib3VuZGluZ0JveCA9IG51bGw7XG5cdHRoaXMuYm91bmRpbmdTcGhlcmUgPSBudWxsO1xuXG5cdHRoaXMuZHJhd1JhbmdlID0geyBzdGFydDogMCwgY291bnQ6IEluZmluaXR5IH07XG5cbn1cblxuQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggRXZlbnREaXNwYXRjaGVyLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IEJ1ZmZlckdlb21ldHJ5LFxuXG5cdGlzQnVmZmVyR2VvbWV0cnk6IHRydWUsXG5cblx0Z2V0SW5kZXg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLmluZGV4O1xuXG5cdH0sXG5cblx0c2V0SW5kZXg6IGZ1bmN0aW9uICggaW5kZXggKSB7XG5cblx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIGluZGV4ICkgKSB7XG5cblx0XHRcdHRoaXMuaW5kZXggPSBuZXcgKCBhcnJheU1heCggaW5kZXggKSA+IDY1NTM1ID8gVWludDMyQnVmZmVyQXR0cmlidXRlIDogVWludDE2QnVmZmVyQXR0cmlidXRlICkoIGluZGV4LCAxICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR0aGlzLmluZGV4ID0gaW5kZXg7XG5cblx0XHR9XG5cblx0fSxcblxuXHRhZGRBdHRyaWJ1dGU6IGZ1bmN0aW9uICggbmFtZSwgYXR0cmlidXRlICkge1xuXG5cdFx0aWYgKCAhICggYXR0cmlidXRlICYmIGF0dHJpYnV0ZS5pc0J1ZmZlckF0dHJpYnV0ZSApICYmICEgKCBhdHRyaWJ1dGUgJiYgYXR0cmlidXRlLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUgKSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5hZGRBdHRyaWJ1dGUoKSBub3cgZXhwZWN0cyAoIG5hbWUsIGF0dHJpYnV0ZSApLicgKTtcblxuXHRcdFx0dGhpcy5hZGRBdHRyaWJ1dGUoIG5hbWUsIG5ldyBCdWZmZXJBdHRyaWJ1dGUoIGFyZ3VtZW50c1sgMSBdLCBhcmd1bWVudHNbIDIgXSApICk7XG5cblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdGlmICggbmFtZSA9PT0gJ2luZGV4JyApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnkuYWRkQXR0cmlidXRlOiBVc2UgLnNldEluZGV4KCkgZm9yIGluZGV4IGF0dHJpYnV0ZS4nICk7XG5cdFx0XHR0aGlzLnNldEluZGV4KCBhdHRyaWJ1dGUgKTtcblxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5hdHRyaWJ1dGVzWyBuYW1lIF0gPSBhdHRyaWJ1dGU7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGdldEF0dHJpYnV0ZTogZnVuY3Rpb24gKCBuYW1lICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuYXR0cmlidXRlc1sgbmFtZSBdO1xuXG5cdH0sXG5cblx0cmVtb3ZlQXR0cmlidXRlOiBmdW5jdGlvbiAoIG5hbWUgKSB7XG5cblx0XHRkZWxldGUgdGhpcy5hdHRyaWJ1dGVzWyBuYW1lIF07XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGFkZEdyb3VwOiBmdW5jdGlvbiAoIHN0YXJ0LCBjb3VudCwgbWF0ZXJpYWxJbmRleCApIHtcblxuXHRcdHRoaXMuZ3JvdXBzLnB1c2goIHtcblxuXHRcdFx0c3RhcnQ6IHN0YXJ0LFxuXHRcdFx0Y291bnQ6IGNvdW50LFxuXHRcdFx0bWF0ZXJpYWxJbmRleDogbWF0ZXJpYWxJbmRleCAhPT0gdW5kZWZpbmVkID8gbWF0ZXJpYWxJbmRleCA6IDBcblxuXHRcdH0gKTtcblxuXHR9LFxuXG5cdGNsZWFyR3JvdXBzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLmdyb3VwcyA9IFtdO1xuXG5cdH0sXG5cblx0c2V0RHJhd1JhbmdlOiBmdW5jdGlvbiAoIHN0YXJ0LCBjb3VudCApIHtcblxuXHRcdHRoaXMuZHJhd1JhbmdlLnN0YXJ0ID0gc3RhcnQ7XG5cdFx0dGhpcy5kcmF3UmFuZ2UuY291bnQgPSBjb3VudDtcblxuXHR9LFxuXG5cdGFwcGx5TWF0cml4OiBmdW5jdGlvbiAoIG1hdHJpeCApIHtcblxuXHRcdHZhciBwb3NpdGlvbiA9IHRoaXMuYXR0cmlidXRlcy5wb3NpdGlvbjtcblxuXHRcdGlmICggcG9zaXRpb24gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0bWF0cml4LmFwcGx5VG9CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uICk7XG5cdFx0XHRwb3NpdGlvbi5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHR9XG5cblx0XHR2YXIgbm9ybWFsID0gdGhpcy5hdHRyaWJ1dGVzLm5vcm1hbDtcblxuXHRcdGlmICggbm9ybWFsICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHZhciBub3JtYWxNYXRyaXggPSBuZXcgTWF0cml4MygpLmdldE5vcm1hbE1hdHJpeCggbWF0cml4ICk7XG5cblx0XHRcdG5vcm1hbE1hdHJpeC5hcHBseVRvQnVmZmVyQXR0cmlidXRlKCBub3JtYWwgKTtcblx0XHRcdG5vcm1hbC5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHR9XG5cblx0XHRpZiAoIHRoaXMuYm91bmRpbmdCb3ggIT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuY29tcHV0ZUJvdW5kaW5nQm94KCk7XG5cblx0XHR9XG5cblx0XHRpZiAoIHRoaXMuYm91bmRpbmdTcGhlcmUgIT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHJvdGF0ZVg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIHJvdGF0ZSBnZW9tZXRyeSBhcm91bmQgd29ybGQgeC1heGlzXG5cblx0XHR2YXIgbTEgPSBuZXcgTWF0cml4NCgpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHJvdGF0ZVgoIGFuZ2xlICkge1xuXG5cdFx0XHRtMS5tYWtlUm90YXRpb25YKCBhbmdsZSApO1xuXG5cdFx0XHR0aGlzLmFwcGx5TWF0cml4KCBtMSApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHJvdGF0ZVk6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIHJvdGF0ZSBnZW9tZXRyeSBhcm91bmQgd29ybGQgeS1heGlzXG5cblx0XHR2YXIgbTEgPSBuZXcgTWF0cml4NCgpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHJvdGF0ZVkoIGFuZ2xlICkge1xuXG5cdFx0XHRtMS5tYWtlUm90YXRpb25ZKCBhbmdsZSApO1xuXG5cdFx0XHR0aGlzLmFwcGx5TWF0cml4KCBtMSApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHJvdGF0ZVo6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIHJvdGF0ZSBnZW9tZXRyeSBhcm91bmQgd29ybGQgei1heGlzXG5cblx0XHR2YXIgbTEgPSBuZXcgTWF0cml4NCgpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHJvdGF0ZVooIGFuZ2xlICkge1xuXG5cdFx0XHRtMS5tYWtlUm90YXRpb25aKCBhbmdsZSApO1xuXG5cdFx0XHR0aGlzLmFwcGx5TWF0cml4KCBtMSApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHRyYW5zbGF0ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gdHJhbnNsYXRlIGdlb21ldHJ5XG5cblx0XHR2YXIgbTEgPSBuZXcgTWF0cml4NCgpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHRyYW5zbGF0ZSggeCwgeSwgeiApIHtcblxuXHRcdFx0bTEubWFrZVRyYW5zbGF0aW9uKCB4LCB5LCB6ICk7XG5cblx0XHRcdHRoaXMuYXBwbHlNYXRyaXgoIG0xICk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0c2NhbGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIHNjYWxlIGdlb21ldHJ5XG5cblx0XHR2YXIgbTEgPSBuZXcgTWF0cml4NCgpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHNjYWxlKCB4LCB5LCB6ICkge1xuXG5cdFx0XHRtMS5tYWtlU2NhbGUoIHgsIHksIHogKTtcblxuXHRcdFx0dGhpcy5hcHBseU1hdHJpeCggbTEgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRsb29rQXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBvYmogPSBuZXcgT2JqZWN0M0QoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBsb29rQXQoIHZlY3RvciApIHtcblxuXHRcdFx0b2JqLmxvb2tBdCggdmVjdG9yICk7XG5cblx0XHRcdG9iai51cGRhdGVNYXRyaXgoKTtcblxuXHRcdFx0dGhpcy5hcHBseU1hdHJpeCggb2JqLm1hdHJpeCApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0Y2VudGVyOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgb2Zmc2V0ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBjZW50ZXIoKSB7XG5cblx0XHRcdHRoaXMuY29tcHV0ZUJvdW5kaW5nQm94KCk7XG5cblx0XHRcdHRoaXMuYm91bmRpbmdCb3guZ2V0Q2VudGVyKCBvZmZzZXQgKS5uZWdhdGUoKTtcblxuXHRcdFx0dGhpcy50cmFuc2xhdGUoIG9mZnNldC54LCBvZmZzZXQueSwgb2Zmc2V0LnogKTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRzZXRGcm9tT2JqZWN0OiBmdW5jdGlvbiAoIG9iamVjdCApIHtcblxuXHRcdC8vIGNvbnNvbGUubG9nKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnkuc2V0RnJvbU9iamVjdCgpLiBDb252ZXJ0aW5nJywgb2JqZWN0LCB0aGlzICk7XG5cblx0XHR2YXIgZ2VvbWV0cnkgPSBvYmplY3QuZ2VvbWV0cnk7XG5cblx0XHRpZiAoIG9iamVjdC5pc1BvaW50cyB8fCBvYmplY3QuaXNMaW5lICkge1xuXG5cdFx0XHR2YXIgcG9zaXRpb25zID0gbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIGdlb21ldHJ5LnZlcnRpY2VzLmxlbmd0aCAqIDMsIDMgKTtcblx0XHRcdHZhciBjb2xvcnMgPSBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggZ2VvbWV0cnkuY29sb3JzLmxlbmd0aCAqIDMsIDMgKTtcblxuXHRcdFx0dGhpcy5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIHBvc2l0aW9ucy5jb3B5VmVjdG9yM3NBcnJheSggZ2VvbWV0cnkudmVydGljZXMgKSApO1xuXHRcdFx0dGhpcy5hZGRBdHRyaWJ1dGUoICdjb2xvcicsIGNvbG9ycy5jb3B5Q29sb3JzQXJyYXkoIGdlb21ldHJ5LmNvbG9ycyApICk7XG5cblx0XHRcdGlmICggZ2VvbWV0cnkubGluZURpc3RhbmNlcyAmJiBnZW9tZXRyeS5saW5lRGlzdGFuY2VzLmxlbmd0aCA9PT0gZ2VvbWV0cnkudmVydGljZXMubGVuZ3RoICkge1xuXG5cdFx0XHRcdHZhciBsaW5lRGlzdGFuY2VzID0gbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIGdlb21ldHJ5LmxpbmVEaXN0YW5jZXMubGVuZ3RoLCAxICk7XG5cblx0XHRcdFx0dGhpcy5hZGRBdHRyaWJ1dGUoICdsaW5lRGlzdGFuY2UnLCBsaW5lRGlzdGFuY2VzLmNvcHlBcnJheSggZ2VvbWV0cnkubGluZURpc3RhbmNlcyApICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSAhPT0gbnVsbCApIHtcblxuXHRcdFx0XHR0aGlzLmJvdW5kaW5nU3BoZXJlID0gZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUuY2xvbmUoKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGdlb21ldHJ5LmJvdW5kaW5nQm94ICE9PSBudWxsICkge1xuXG5cdFx0XHRcdHRoaXMuYm91bmRpbmdCb3ggPSBnZW9tZXRyeS5ib3VuZGluZ0JveC5jbG9uZSgpO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2UgaWYgKCBvYmplY3QuaXNNZXNoICkge1xuXG5cdFx0XHRpZiAoIGdlb21ldHJ5ICYmIGdlb21ldHJ5LmlzR2VvbWV0cnkgKSB7XG5cblx0XHRcdFx0dGhpcy5mcm9tR2VvbWV0cnkoIGdlb21ldHJ5ICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbVBvaW50czogZnVuY3Rpb24gKCBwb2ludHMgKSB7XG5cblx0XHR2YXIgcG9zaXRpb24gPSBbXTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHBvaW50cy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgcG9pbnQgPSBwb2ludHNbIGkgXTtcblx0XHRcdHBvc2l0aW9uLnB1c2goIHBvaW50LngsIHBvaW50LnksIHBvaW50LnogfHwgMCApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbiwgMyApICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHVwZGF0ZUZyb21PYmplY3Q6IGZ1bmN0aW9uICggb2JqZWN0ICkge1xuXG5cdFx0dmFyIGdlb21ldHJ5ID0gb2JqZWN0Lmdlb21ldHJ5O1xuXG5cdFx0aWYgKCBvYmplY3QuaXNNZXNoICkge1xuXG5cdFx0XHR2YXIgZGlyZWN0ID0gZ2VvbWV0cnkuX19kaXJlY3RHZW9tZXRyeTtcblxuXHRcdFx0aWYgKCBnZW9tZXRyeS5lbGVtZW50c05lZWRVcGRhdGUgPT09IHRydWUgKSB7XG5cblx0XHRcdFx0ZGlyZWN0ID0gdW5kZWZpbmVkO1xuXHRcdFx0XHRnZW9tZXRyeS5lbGVtZW50c05lZWRVcGRhdGUgPSBmYWxzZTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGRpcmVjdCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHJldHVybiB0aGlzLmZyb21HZW9tZXRyeSggZ2VvbWV0cnkgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRkaXJlY3QudmVydGljZXNOZWVkVXBkYXRlID0gZ2VvbWV0cnkudmVydGljZXNOZWVkVXBkYXRlO1xuXHRcdFx0ZGlyZWN0Lm5vcm1hbHNOZWVkVXBkYXRlID0gZ2VvbWV0cnkubm9ybWFsc05lZWRVcGRhdGU7XG5cdFx0XHRkaXJlY3QuY29sb3JzTmVlZFVwZGF0ZSA9IGdlb21ldHJ5LmNvbG9yc05lZWRVcGRhdGU7XG5cdFx0XHRkaXJlY3QudXZzTmVlZFVwZGF0ZSA9IGdlb21ldHJ5LnV2c05lZWRVcGRhdGU7XG5cdFx0XHRkaXJlY3QuZ3JvdXBzTmVlZFVwZGF0ZSA9IGdlb21ldHJ5Lmdyb3Vwc05lZWRVcGRhdGU7XG5cblx0XHRcdGdlb21ldHJ5LnZlcnRpY2VzTmVlZFVwZGF0ZSA9IGZhbHNlO1xuXHRcdFx0Z2VvbWV0cnkubm9ybWFsc05lZWRVcGRhdGUgPSBmYWxzZTtcblx0XHRcdGdlb21ldHJ5LmNvbG9yc05lZWRVcGRhdGUgPSBmYWxzZTtcblx0XHRcdGdlb21ldHJ5LnV2c05lZWRVcGRhdGUgPSBmYWxzZTtcblx0XHRcdGdlb21ldHJ5Lmdyb3Vwc05lZWRVcGRhdGUgPSBmYWxzZTtcblxuXHRcdFx0Z2VvbWV0cnkgPSBkaXJlY3Q7XG5cblx0XHR9XG5cblx0XHR2YXIgYXR0cmlidXRlO1xuXG5cdFx0aWYgKCBnZW9tZXRyeS52ZXJ0aWNlc05lZWRVcGRhdGUgPT09IHRydWUgKSB7XG5cblx0XHRcdGF0dHJpYnV0ZSA9IHRoaXMuYXR0cmlidXRlcy5wb3NpdGlvbjtcblxuXHRcdFx0aWYgKCBhdHRyaWJ1dGUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRhdHRyaWJ1dGUuY29weVZlY3RvcjNzQXJyYXkoIGdlb21ldHJ5LnZlcnRpY2VzICk7XG5cdFx0XHRcdGF0dHJpYnV0ZS5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdH1cblxuXHRcdFx0Z2VvbWV0cnkudmVydGljZXNOZWVkVXBkYXRlID0gZmFsc2U7XG5cblx0XHR9XG5cblx0XHRpZiAoIGdlb21ldHJ5Lm5vcm1hbHNOZWVkVXBkYXRlID09PSB0cnVlICkge1xuXG5cdFx0XHRhdHRyaWJ1dGUgPSB0aGlzLmF0dHJpYnV0ZXMubm9ybWFsO1xuXG5cdFx0XHRpZiAoIGF0dHJpYnV0ZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGF0dHJpYnV0ZS5jb3B5VmVjdG9yM3NBcnJheSggZ2VvbWV0cnkubm9ybWFscyApO1xuXHRcdFx0XHRhdHRyaWJ1dGUubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHR9XG5cblx0XHRcdGdlb21ldHJ5Lm5vcm1hbHNOZWVkVXBkYXRlID0gZmFsc2U7XG5cblx0XHR9XG5cblx0XHRpZiAoIGdlb21ldHJ5LmNvbG9yc05lZWRVcGRhdGUgPT09IHRydWUgKSB7XG5cblx0XHRcdGF0dHJpYnV0ZSA9IHRoaXMuYXR0cmlidXRlcy5jb2xvcjtcblxuXHRcdFx0aWYgKCBhdHRyaWJ1dGUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRhdHRyaWJ1dGUuY29weUNvbG9yc0FycmF5KCBnZW9tZXRyeS5jb2xvcnMgKTtcblx0XHRcdFx0YXR0cmlidXRlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0fVxuXG5cdFx0XHRnZW9tZXRyeS5jb2xvcnNOZWVkVXBkYXRlID0gZmFsc2U7XG5cblx0XHR9XG5cblx0XHRpZiAoIGdlb21ldHJ5LnV2c05lZWRVcGRhdGUgKSB7XG5cblx0XHRcdGF0dHJpYnV0ZSA9IHRoaXMuYXR0cmlidXRlcy51djtcblxuXHRcdFx0aWYgKCBhdHRyaWJ1dGUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRhdHRyaWJ1dGUuY29weVZlY3RvcjJzQXJyYXkoIGdlb21ldHJ5LnV2cyApO1xuXHRcdFx0XHRhdHRyaWJ1dGUubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHR9XG5cblx0XHRcdGdlb21ldHJ5LnV2c05lZWRVcGRhdGUgPSBmYWxzZTtcblxuXHRcdH1cblxuXHRcdGlmICggZ2VvbWV0cnkubGluZURpc3RhbmNlc05lZWRVcGRhdGUgKSB7XG5cblx0XHRcdGF0dHJpYnV0ZSA9IHRoaXMuYXR0cmlidXRlcy5saW5lRGlzdGFuY2U7XG5cblx0XHRcdGlmICggYXR0cmlidXRlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0YXR0cmlidXRlLmNvcHlBcnJheSggZ2VvbWV0cnkubGluZURpc3RhbmNlcyApO1xuXHRcdFx0XHRhdHRyaWJ1dGUubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHR9XG5cblx0XHRcdGdlb21ldHJ5LmxpbmVEaXN0YW5jZXNOZWVkVXBkYXRlID0gZmFsc2U7XG5cblx0XHR9XG5cblx0XHRpZiAoIGdlb21ldHJ5Lmdyb3Vwc05lZWRVcGRhdGUgKSB7XG5cblx0XHRcdGdlb21ldHJ5LmNvbXB1dGVHcm91cHMoIG9iamVjdC5nZW9tZXRyeSApO1xuXHRcdFx0dGhpcy5ncm91cHMgPSBnZW9tZXRyeS5ncm91cHM7XG5cblx0XHRcdGdlb21ldHJ5Lmdyb3Vwc05lZWRVcGRhdGUgPSBmYWxzZTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZnJvbUdlb21ldHJ5OiBmdW5jdGlvbiAoIGdlb21ldHJ5ICkge1xuXG5cdFx0Z2VvbWV0cnkuX19kaXJlY3RHZW9tZXRyeSA9IG5ldyBEaXJlY3RHZW9tZXRyeSgpLmZyb21HZW9tZXRyeSggZ2VvbWV0cnkgKTtcblxuXHRcdHJldHVybiB0aGlzLmZyb21EaXJlY3RHZW9tZXRyeSggZ2VvbWV0cnkuX19kaXJlY3RHZW9tZXRyeSApO1xuXG5cdH0sXG5cblx0ZnJvbURpcmVjdEdlb21ldHJ5OiBmdW5jdGlvbiAoIGdlb21ldHJ5ICkge1xuXG5cdFx0dmFyIHBvc2l0aW9ucyA9IG5ldyBGbG9hdDMyQXJyYXkoIGdlb21ldHJ5LnZlcnRpY2VzLmxlbmd0aCAqIDMgKTtcblx0XHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25zLCAzICkuY29weVZlY3RvcjNzQXJyYXkoIGdlb21ldHJ5LnZlcnRpY2VzICkgKTtcblxuXHRcdGlmICggZ2VvbWV0cnkubm9ybWFscy5sZW5ndGggPiAwICkge1xuXG5cdFx0XHR2YXIgbm9ybWFscyA9IG5ldyBGbG9hdDMyQXJyYXkoIGdlb21ldHJ5Lm5vcm1hbHMubGVuZ3RoICogMyApO1xuXHRcdFx0dGhpcy5hZGRBdHRyaWJ1dGUoICdub3JtYWwnLCBuZXcgQnVmZmVyQXR0cmlidXRlKCBub3JtYWxzLCAzICkuY29weVZlY3RvcjNzQXJyYXkoIGdlb21ldHJ5Lm5vcm1hbHMgKSApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBnZW9tZXRyeS5jb2xvcnMubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0dmFyIGNvbG9ycyA9IG5ldyBGbG9hdDMyQXJyYXkoIGdlb21ldHJ5LmNvbG9ycy5sZW5ndGggKiAzICk7XG5cdFx0XHR0aGlzLmFkZEF0dHJpYnV0ZSggJ2NvbG9yJywgbmV3IEJ1ZmZlckF0dHJpYnV0ZSggY29sb3JzLCAzICkuY29weUNvbG9yc0FycmF5KCBnZW9tZXRyeS5jb2xvcnMgKSApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBnZW9tZXRyeS51dnMubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0dmFyIHV2cyA9IG5ldyBGbG9hdDMyQXJyYXkoIGdlb21ldHJ5LnV2cy5sZW5ndGggKiAyICk7XG5cdFx0XHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3V2JywgbmV3IEJ1ZmZlckF0dHJpYnV0ZSggdXZzLCAyICkuY29weVZlY3RvcjJzQXJyYXkoIGdlb21ldHJ5LnV2cyApICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIGdlb21ldHJ5LnV2czIubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0dmFyIHV2czIgPSBuZXcgRmxvYXQzMkFycmF5KCBnZW9tZXRyeS51dnMyLmxlbmd0aCAqIDIgKTtcblx0XHRcdHRoaXMuYWRkQXR0cmlidXRlKCAndXYyJywgbmV3IEJ1ZmZlckF0dHJpYnV0ZSggdXZzMiwgMiApLmNvcHlWZWN0b3Iyc0FycmF5KCBnZW9tZXRyeS51dnMyICkgKTtcblxuXHRcdH1cblxuXHRcdC8vIGdyb3Vwc1xuXG5cdFx0dGhpcy5ncm91cHMgPSBnZW9tZXRyeS5ncm91cHM7XG5cblx0XHQvLyBtb3JwaHNcblxuXHRcdGZvciAoIHZhciBuYW1lIGluIGdlb21ldHJ5Lm1vcnBoVGFyZ2V0cyApIHtcblxuXHRcdFx0dmFyIGFycmF5ID0gW107XG5cdFx0XHR2YXIgbW9ycGhUYXJnZXRzID0gZ2VvbWV0cnkubW9ycGhUYXJnZXRzWyBuYW1lIF07XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IG1vcnBoVGFyZ2V0cy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdHZhciBtb3JwaFRhcmdldCA9IG1vcnBoVGFyZ2V0c1sgaSBdO1xuXG5cdFx0XHRcdHZhciBhdHRyaWJ1dGUgPSBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbW9ycGhUYXJnZXQubGVuZ3RoICogMywgMyApO1xuXG5cdFx0XHRcdGFycmF5LnB1c2goIGF0dHJpYnV0ZS5jb3B5VmVjdG9yM3NBcnJheSggbW9ycGhUYXJnZXQgKSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHRoaXMubW9ycGhBdHRyaWJ1dGVzWyBuYW1lIF0gPSBhcnJheTtcblxuXHRcdH1cblxuXHRcdC8vIHNraW5uaW5nXG5cblx0XHRpZiAoIGdlb21ldHJ5LnNraW5JbmRpY2VzLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdHZhciBza2luSW5kaWNlcyA9IG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBnZW9tZXRyeS5za2luSW5kaWNlcy5sZW5ndGggKiA0LCA0ICk7XG5cdFx0XHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3NraW5JbmRleCcsIHNraW5JbmRpY2VzLmNvcHlWZWN0b3I0c0FycmF5KCBnZW9tZXRyeS5za2luSW5kaWNlcyApICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIGdlb21ldHJ5LnNraW5XZWlnaHRzLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdHZhciBza2luV2VpZ2h0cyA9IG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBnZW9tZXRyeS5za2luV2VpZ2h0cy5sZW5ndGggKiA0LCA0ICk7XG5cdFx0XHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3NraW5XZWlnaHQnLCBza2luV2VpZ2h0cy5jb3B5VmVjdG9yNHNBcnJheSggZ2VvbWV0cnkuc2tpbldlaWdodHMgKSApO1xuXG5cdFx0fVxuXG5cdFx0Ly9cblxuXHRcdGlmICggZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgIT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuYm91bmRpbmdTcGhlcmUgPSBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZS5jbG9uZSgpO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBnZW9tZXRyeS5ib3VuZGluZ0JveCAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5ib3VuZGluZ0JveCA9IGdlb21ldHJ5LmJvdW5kaW5nQm94LmNsb25lKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvbXB1dGVCb3VuZGluZ0JveDogZnVuY3Rpb24gKCkge1xuXG5cdFx0aWYgKCB0aGlzLmJvdW5kaW5nQm94ID09PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLmJvdW5kaW5nQm94ID0gbmV3IEJveDMoKTtcblxuXHRcdH1cblxuXHRcdHZhciBwb3NpdGlvbiA9IHRoaXMuYXR0cmlidXRlcy5wb3NpdGlvbjtcblxuXHRcdGlmICggcG9zaXRpb24gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dGhpcy5ib3VuZGluZ0JveC5zZXRGcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbiApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dGhpcy5ib3VuZGluZ0JveC5tYWtlRW1wdHkoKTtcblxuXHRcdH1cblxuXHRcdGlmICggaXNOYU4oIHRoaXMuYm91bmRpbmdCb3gubWluLnggKSB8fCBpc05hTiggdGhpcy5ib3VuZGluZ0JveC5taW4ueSApIHx8IGlzTmFOKCB0aGlzLmJvdW5kaW5nQm94Lm1pbi56ICkgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5CdWZmZXJHZW9tZXRyeS5jb21wdXRlQm91bmRpbmdCb3g6IENvbXB1dGVkIG1pbi9tYXggaGF2ZSBOYU4gdmFsdWVzLiBUaGUgXCJwb3NpdGlvblwiIGF0dHJpYnV0ZSBpcyBsaWtlbHkgdG8gaGF2ZSBOYU4gdmFsdWVzLicsIHRoaXMgKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdGNvbXB1dGVCb3VuZGluZ1NwaGVyZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGJveCA9IG5ldyBCb3gzKCk7XG5cdFx0dmFyIHZlY3RvciA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCkge1xuXG5cdFx0XHRpZiAoIHRoaXMuYm91bmRpbmdTcGhlcmUgPT09IG51bGwgKSB7XG5cblx0XHRcdFx0dGhpcy5ib3VuZGluZ1NwaGVyZSA9IG5ldyBTcGhlcmUoKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgcG9zaXRpb24gPSB0aGlzLmF0dHJpYnV0ZXMucG9zaXRpb247XG5cblx0XHRcdGlmICggcG9zaXRpb24gKSB7XG5cblx0XHRcdFx0dmFyIGNlbnRlciA9IHRoaXMuYm91bmRpbmdTcGhlcmUuY2VudGVyO1xuXG5cdFx0XHRcdGJveC5zZXRGcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbiApO1xuXHRcdFx0XHRib3guZ2V0Q2VudGVyKCBjZW50ZXIgKTtcblxuXHRcdFx0XHQvLyBob3BpbmcgdG8gZmluZCBhIGJvdW5kaW5nU3BoZXJlIHdpdGggYSByYWRpdXMgc21hbGxlciB0aGFuIHRoZVxuXHRcdFx0XHQvLyBib3VuZGluZ1NwaGVyZSBvZiB0aGUgYm91bmRpbmdCb3g6IHNxcnQoMykgc21hbGxlciBpbiB0aGUgYmVzdCBjYXNlXG5cblx0XHRcdFx0dmFyIG1heFJhZGl1c1NxID0gMDtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gcG9zaXRpb24uY291bnQ7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdHZlY3Rvci54ID0gcG9zaXRpb24uZ2V0WCggaSApO1xuXHRcdFx0XHRcdHZlY3Rvci55ID0gcG9zaXRpb24uZ2V0WSggaSApO1xuXHRcdFx0XHRcdHZlY3Rvci56ID0gcG9zaXRpb24uZ2V0WiggaSApO1xuXHRcdFx0XHRcdG1heFJhZGl1c1NxID0gTWF0aC5tYXgoIG1heFJhZGl1c1NxLCBjZW50ZXIuZGlzdGFuY2VUb1NxdWFyZWQoIHZlY3RvciApICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoaXMuYm91bmRpbmdTcGhlcmUucmFkaXVzID0gTWF0aC5zcXJ0KCBtYXhSYWRpdXNTcSApO1xuXG5cdFx0XHRcdGlmICggaXNOYU4oIHRoaXMuYm91bmRpbmdTcGhlcmUucmFkaXVzICkgKSB7XG5cblx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk6IENvbXB1dGVkIHJhZGl1cyBpcyBOYU4uIFRoZSBcInBvc2l0aW9uXCIgYXR0cmlidXRlIGlzIGxpa2VseSB0byBoYXZlIE5hTiB2YWx1ZXMuJywgdGhpcyApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0Y29tcHV0ZUZhY2VOb3JtYWxzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuXG5cdH0sXG5cblx0Y29tcHV0ZVZlcnRleE5vcm1hbHM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBpbmRleCA9IHRoaXMuaW5kZXg7XG5cdFx0dmFyIGF0dHJpYnV0ZXMgPSB0aGlzLmF0dHJpYnV0ZXM7XG5cdFx0dmFyIGdyb3VwcyA9IHRoaXMuZ3JvdXBzO1xuXG5cdFx0aWYgKCBhdHRyaWJ1dGVzLnBvc2l0aW9uICkge1xuXG5cdFx0XHR2YXIgcG9zaXRpb25zID0gYXR0cmlidXRlcy5wb3NpdGlvbi5hcnJheTtcblxuXHRcdFx0aWYgKCBhdHRyaWJ1dGVzLm5vcm1hbCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHRoaXMuYWRkQXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEJ1ZmZlckF0dHJpYnV0ZSggbmV3IEZsb2F0MzJBcnJheSggcG9zaXRpb25zLmxlbmd0aCApLCAzICkgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyByZXNldCBleGlzdGluZyBub3JtYWxzIHRvIHplcm9cblxuXHRcdFx0XHR2YXIgYXJyYXkgPSBhdHRyaWJ1dGVzLm5vcm1hbC5hcnJheTtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gYXJyYXkubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRhcnJheVsgaSBdID0gMDtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIG5vcm1hbHMgPSBhdHRyaWJ1dGVzLm5vcm1hbC5hcnJheTtcblxuXHRcdFx0dmFyIHZBLCB2QiwgdkM7XG5cdFx0XHR2YXIgcEEgPSBuZXcgVmVjdG9yMygpLCBwQiA9IG5ldyBWZWN0b3IzKCksIHBDID0gbmV3IFZlY3RvcjMoKTtcblx0XHRcdHZhciBjYiA9IG5ldyBWZWN0b3IzKCksIGFiID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdFx0Ly8gaW5kZXhlZCBlbGVtZW50c1xuXG5cdFx0XHRpZiAoIGluZGV4ICkge1xuXG5cdFx0XHRcdHZhciBpbmRpY2VzID0gaW5kZXguYXJyYXk7XG5cblx0XHRcdFx0aWYgKCBncm91cHMubGVuZ3RoID09PSAwICkge1xuXG5cdFx0XHRcdFx0dGhpcy5hZGRHcm91cCggMCwgaW5kaWNlcy5sZW5ndGggKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Zm9yICggdmFyIGogPSAwLCBqbCA9IGdyb3Vwcy5sZW5ndGg7IGogPCBqbDsgKysgaiApIHtcblxuXHRcdFx0XHRcdHZhciBncm91cCA9IGdyb3Vwc1sgaiBdO1xuXG5cdFx0XHRcdFx0dmFyIHN0YXJ0ID0gZ3JvdXAuc3RhcnQ7XG5cdFx0XHRcdFx0dmFyIGNvdW50ID0gZ3JvdXAuY291bnQ7XG5cblx0XHRcdFx0XHRmb3IgKCB2YXIgaSA9IHN0YXJ0LCBpbCA9IHN0YXJ0ICsgY291bnQ7IGkgPCBpbDsgaSArPSAzICkge1xuXG5cdFx0XHRcdFx0XHR2QSA9IGluZGljZXNbIGkgKyAwIF0gKiAzO1xuXHRcdFx0XHRcdFx0dkIgPSBpbmRpY2VzWyBpICsgMSBdICogMztcblx0XHRcdFx0XHRcdHZDID0gaW5kaWNlc1sgaSArIDIgXSAqIDM7XG5cblx0XHRcdFx0XHRcdHBBLmZyb21BcnJheSggcG9zaXRpb25zLCB2QSApO1xuXHRcdFx0XHRcdFx0cEIuZnJvbUFycmF5KCBwb3NpdGlvbnMsIHZCICk7XG5cdFx0XHRcdFx0XHRwQy5mcm9tQXJyYXkoIHBvc2l0aW9ucywgdkMgKTtcblxuXHRcdFx0XHRcdFx0Y2Iuc3ViVmVjdG9ycyggcEMsIHBCICk7XG5cdFx0XHRcdFx0XHRhYi5zdWJWZWN0b3JzKCBwQSwgcEIgKTtcblx0XHRcdFx0XHRcdGNiLmNyb3NzKCBhYiApO1xuXG5cdFx0XHRcdFx0XHRub3JtYWxzWyB2QSBdICs9IGNiLng7XG5cdFx0XHRcdFx0XHRub3JtYWxzWyB2QSArIDEgXSArPSBjYi55O1xuXHRcdFx0XHRcdFx0bm9ybWFsc1sgdkEgKyAyIF0gKz0gY2IuejtcblxuXHRcdFx0XHRcdFx0bm9ybWFsc1sgdkIgXSArPSBjYi54O1xuXHRcdFx0XHRcdFx0bm9ybWFsc1sgdkIgKyAxIF0gKz0gY2IueTtcblx0XHRcdFx0XHRcdG5vcm1hbHNbIHZCICsgMiBdICs9IGNiLno7XG5cblx0XHRcdFx0XHRcdG5vcm1hbHNbIHZDIF0gKz0gY2IueDtcblx0XHRcdFx0XHRcdG5vcm1hbHNbIHZDICsgMSBdICs9IGNiLnk7XG5cdFx0XHRcdFx0XHRub3JtYWxzWyB2QyArIDIgXSArPSBjYi56O1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyBub24taW5kZXhlZCBlbGVtZW50cyAodW5jb25uZWN0ZWQgdHJpYW5nbGUgc291cClcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gcG9zaXRpb25zLmxlbmd0aDsgaSA8IGlsOyBpICs9IDkgKSB7XG5cblx0XHRcdFx0XHRwQS5mcm9tQXJyYXkoIHBvc2l0aW9ucywgaSApO1xuXHRcdFx0XHRcdHBCLmZyb21BcnJheSggcG9zaXRpb25zLCBpICsgMyApO1xuXHRcdFx0XHRcdHBDLmZyb21BcnJheSggcG9zaXRpb25zLCBpICsgNiApO1xuXG5cdFx0XHRcdFx0Y2Iuc3ViVmVjdG9ycyggcEMsIHBCICk7XG5cdFx0XHRcdFx0YWIuc3ViVmVjdG9ycyggcEEsIHBCICk7XG5cdFx0XHRcdFx0Y2IuY3Jvc3MoIGFiICk7XG5cblx0XHRcdFx0XHRub3JtYWxzWyBpIF0gPSBjYi54O1xuXHRcdFx0XHRcdG5vcm1hbHNbIGkgKyAxIF0gPSBjYi55O1xuXHRcdFx0XHRcdG5vcm1hbHNbIGkgKyAyIF0gPSBjYi56O1xuXG5cdFx0XHRcdFx0bm9ybWFsc1sgaSArIDMgXSA9IGNiLng7XG5cdFx0XHRcdFx0bm9ybWFsc1sgaSArIDQgXSA9IGNiLnk7XG5cdFx0XHRcdFx0bm9ybWFsc1sgaSArIDUgXSA9IGNiLno7XG5cblx0XHRcdFx0XHRub3JtYWxzWyBpICsgNiBdID0gY2IueDtcblx0XHRcdFx0XHRub3JtYWxzWyBpICsgNyBdID0gY2IueTtcblx0XHRcdFx0XHRub3JtYWxzWyBpICsgOCBdID0gY2IuejtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5ub3JtYWxpemVOb3JtYWxzKCk7XG5cblx0XHRcdGF0dHJpYnV0ZXMubm9ybWFsLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdG1lcmdlOiBmdW5jdGlvbiAoIGdlb21ldHJ5LCBvZmZzZXQgKSB7XG5cblx0XHRpZiAoICEgKCBnZW9tZXRyeSAmJiBnZW9tZXRyeS5pc0J1ZmZlckdlb21ldHJ5ICkgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5CdWZmZXJHZW9tZXRyeS5tZXJnZSgpOiBnZW9tZXRyeSBub3QgYW4gaW5zdGFuY2Ugb2YgVEhSRUUuQnVmZmVyR2VvbWV0cnkuJywgZ2VvbWV0cnkgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdGlmICggb2Zmc2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdG9mZnNldCA9IDA7XG5cblx0XHRcdGNvbnNvbGUud2Fybihcblx0XHRcdFx0J1RIUkVFLkJ1ZmZlckdlb21ldHJ5Lm1lcmdlKCk6IE92ZXJ3cml0aW5nIG9yaWdpbmFsIGdlb21ldHJ5LCBzdGFydGluZyBhdCBvZmZzZXQ9MC4gJ1xuXHRcdFx0XHQrICdVc2UgQnVmZmVyR2VvbWV0cnlVdGlscy5tZXJnZUJ1ZmZlckdlb21ldHJpZXMoKSBmb3IgbG9zc2xlc3MgbWVyZ2UuJ1xuXHRcdFx0KTtcblxuXHRcdH1cblxuXHRcdHZhciBhdHRyaWJ1dGVzID0gdGhpcy5hdHRyaWJ1dGVzO1xuXG5cdFx0Zm9yICggdmFyIGtleSBpbiBhdHRyaWJ1dGVzICkge1xuXG5cdFx0XHRpZiAoIGdlb21ldHJ5LmF0dHJpYnV0ZXNbIGtleSBdID09PSB1bmRlZmluZWQgKSBjb250aW51ZTtcblxuXHRcdFx0dmFyIGF0dHJpYnV0ZTEgPSBhdHRyaWJ1dGVzWyBrZXkgXTtcblx0XHRcdHZhciBhdHRyaWJ1dGVBcnJheTEgPSBhdHRyaWJ1dGUxLmFycmF5O1xuXG5cdFx0XHR2YXIgYXR0cmlidXRlMiA9IGdlb21ldHJ5LmF0dHJpYnV0ZXNbIGtleSBdO1xuXHRcdFx0dmFyIGF0dHJpYnV0ZUFycmF5MiA9IGF0dHJpYnV0ZTIuYXJyYXk7XG5cblx0XHRcdHZhciBhdHRyaWJ1dGVTaXplID0gYXR0cmlidXRlMi5pdGVtU2l6ZTtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBqID0gYXR0cmlidXRlU2l6ZSAqIG9mZnNldDsgaSA8IGF0dHJpYnV0ZUFycmF5Mi5sZW5ndGg7IGkgKyssIGogKysgKSB7XG5cblx0XHRcdFx0YXR0cmlidXRlQXJyYXkxWyBqIF0gPSBhdHRyaWJ1dGVBcnJheTJbIGkgXTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRub3JtYWxpemVOb3JtYWxzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdmVjdG9yID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBub3JtYWxpemVOb3JtYWxzKCkge1xuXG5cdFx0XHR2YXIgbm9ybWFscyA9IHRoaXMuYXR0cmlidXRlcy5ub3JtYWw7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBub3JtYWxzLmNvdW50OyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdFx0dmVjdG9yLnggPSBub3JtYWxzLmdldFgoIGkgKTtcblx0XHRcdFx0dmVjdG9yLnkgPSBub3JtYWxzLmdldFkoIGkgKTtcblx0XHRcdFx0dmVjdG9yLnogPSBub3JtYWxzLmdldFooIGkgKTtcblxuXHRcdFx0XHR2ZWN0b3Iubm9ybWFsaXplKCk7XG5cblx0XHRcdFx0bm9ybWFscy5zZXRYWVooIGksIHZlY3Rvci54LCB2ZWN0b3IueSwgdmVjdG9yLnogKTtcblxuXHRcdFx0fVxuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0dG9Ob25JbmRleGVkOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRpZiAoIHRoaXMuaW5kZXggPT09IG51bGwgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5LnRvTm9uSW5kZXhlZCgpOiBHZW9tZXRyeSBpcyBhbHJlYWR5IG5vbi1pbmRleGVkLicgKTtcblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fVxuXG5cdFx0dmFyIGdlb21ldHJ5MiA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXG5cdFx0dmFyIGluZGljZXMgPSB0aGlzLmluZGV4LmFycmF5O1xuXHRcdHZhciBhdHRyaWJ1dGVzID0gdGhpcy5hdHRyaWJ1dGVzO1xuXG5cdFx0Zm9yICggdmFyIG5hbWUgaW4gYXR0cmlidXRlcyApIHtcblxuXHRcdFx0dmFyIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXNbIG5hbWUgXTtcblxuXHRcdFx0dmFyIGFycmF5ID0gYXR0cmlidXRlLmFycmF5O1xuXHRcdFx0dmFyIGl0ZW1TaXplID0gYXR0cmlidXRlLml0ZW1TaXplO1xuXG5cdFx0XHR2YXIgYXJyYXkyID0gbmV3IGFycmF5LmNvbnN0cnVjdG9yKCBpbmRpY2VzLmxlbmd0aCAqIGl0ZW1TaXplICk7XG5cblx0XHRcdHZhciBpbmRleCA9IDAsIGluZGV4MiA9IDA7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGluZGljZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRpbmRleCA9IGluZGljZXNbIGkgXSAqIGl0ZW1TaXplO1xuXG5cdFx0XHRcdGZvciAoIHZhciBqID0gMDsgaiA8IGl0ZW1TaXplOyBqICsrICkge1xuXG5cdFx0XHRcdFx0YXJyYXkyWyBpbmRleDIgKysgXSA9IGFycmF5WyBpbmRleCArKyBdO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRnZW9tZXRyeTIuYWRkQXR0cmlidXRlKCBuYW1lLCBuZXcgQnVmZmVyQXR0cmlidXRlKCBhcnJheTIsIGl0ZW1TaXplICkgKTtcblxuXHRcdH1cblxuXHRcdHZhciBncm91cHMgPSB0aGlzLmdyb3VwcztcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGdyb3Vwcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgZ3JvdXAgPSBncm91cHNbIGkgXTtcblx0XHRcdGdlb21ldHJ5Mi5hZGRHcm91cCggZ3JvdXAuc3RhcnQsIGdyb3VwLmNvdW50LCBncm91cC5tYXRlcmlhbEluZGV4ICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gZ2VvbWV0cnkyO1xuXG5cdH0sXG5cblx0dG9KU09OOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgZGF0YSA9IHtcblx0XHRcdG1ldGFkYXRhOiB7XG5cdFx0XHRcdHZlcnNpb246IDQuNSxcblx0XHRcdFx0dHlwZTogJ0J1ZmZlckdlb21ldHJ5Jyxcblx0XHRcdFx0Z2VuZXJhdG9yOiAnQnVmZmVyR2VvbWV0cnkudG9KU09OJ1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHQvLyBzdGFuZGFyZCBCdWZmZXJHZW9tZXRyeSBzZXJpYWxpemF0aW9uXG5cblx0XHRkYXRhLnV1aWQgPSB0aGlzLnV1aWQ7XG5cdFx0ZGF0YS50eXBlID0gdGhpcy50eXBlO1xuXHRcdGlmICggdGhpcy5uYW1lICE9PSAnJyApIGRhdGEubmFtZSA9IHRoaXMubmFtZTtcblxuXHRcdGlmICggdGhpcy5wYXJhbWV0ZXJzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHZhciBwYXJhbWV0ZXJzID0gdGhpcy5wYXJhbWV0ZXJzO1xuXG5cdFx0XHRmb3IgKCB2YXIga2V5IGluIHBhcmFtZXRlcnMgKSB7XG5cblx0XHRcdFx0aWYgKCBwYXJhbWV0ZXJzWyBrZXkgXSAhPT0gdW5kZWZpbmVkICkgZGF0YVsga2V5IF0gPSBwYXJhbWV0ZXJzWyBrZXkgXTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZGF0YTtcblxuXHRcdH1cblxuXHRcdGRhdGEuZGF0YSA9IHsgYXR0cmlidXRlczoge30gfTtcblxuXHRcdHZhciBpbmRleCA9IHRoaXMuaW5kZXg7XG5cblx0XHRpZiAoIGluZGV4ICE9PSBudWxsICkge1xuXG5cdFx0XHR2YXIgYXJyYXkgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCggaW5kZXguYXJyYXkgKTtcblxuXHRcdFx0ZGF0YS5kYXRhLmluZGV4ID0ge1xuXHRcdFx0XHR0eXBlOiBpbmRleC5hcnJheS5jb25zdHJ1Y3Rvci5uYW1lLFxuXHRcdFx0XHRhcnJheTogYXJyYXlcblx0XHRcdH07XG5cblx0XHR9XG5cblx0XHR2YXIgYXR0cmlidXRlcyA9IHRoaXMuYXR0cmlidXRlcztcblxuXHRcdGZvciAoIHZhciBrZXkgaW4gYXR0cmlidXRlcyApIHtcblxuXHRcdFx0dmFyIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXNbIGtleSBdO1xuXG5cdFx0XHR2YXIgYXJyYXkgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCggYXR0cmlidXRlLmFycmF5ICk7XG5cblx0XHRcdGRhdGEuZGF0YS5hdHRyaWJ1dGVzWyBrZXkgXSA9IHtcblx0XHRcdFx0aXRlbVNpemU6IGF0dHJpYnV0ZS5pdGVtU2l6ZSxcblx0XHRcdFx0dHlwZTogYXR0cmlidXRlLmFycmF5LmNvbnN0cnVjdG9yLm5hbWUsXG5cdFx0XHRcdGFycmF5OiBhcnJheSxcblx0XHRcdFx0bm9ybWFsaXplZDogYXR0cmlidXRlLm5vcm1hbGl6ZWRcblx0XHRcdH07XG5cblx0XHR9XG5cblx0XHR2YXIgZ3JvdXBzID0gdGhpcy5ncm91cHM7XG5cblx0XHRpZiAoIGdyb3Vwcy5sZW5ndGggPiAwICkge1xuXG5cdFx0XHRkYXRhLmRhdGEuZ3JvdXBzID0gSlNPTi5wYXJzZSggSlNPTi5zdHJpbmdpZnkoIGdyb3VwcyApICk7XG5cblx0XHR9XG5cblx0XHR2YXIgYm91bmRpbmdTcGhlcmUgPSB0aGlzLmJvdW5kaW5nU3BoZXJlO1xuXG5cdFx0aWYgKCBib3VuZGluZ1NwaGVyZSAhPT0gbnVsbCApIHtcblxuXHRcdFx0ZGF0YS5kYXRhLmJvdW5kaW5nU3BoZXJlID0ge1xuXHRcdFx0XHRjZW50ZXI6IGJvdW5kaW5nU3BoZXJlLmNlbnRlci50b0FycmF5KCksXG5cdFx0XHRcdHJhZGl1czogYm91bmRpbmdTcGhlcmUucmFkaXVzXG5cdFx0XHR9O1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGRhdGE7XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Lypcblx0XHQgLy8gSGFuZGxlIHByaW1pdGl2ZXNcblxuXHRcdCB2YXIgcGFyYW1ldGVycyA9IHRoaXMucGFyYW1ldGVycztcblxuXHRcdCBpZiAoIHBhcmFtZXRlcnMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdCB2YXIgdmFsdWVzID0gW107XG5cblx0XHQgZm9yICggdmFyIGtleSBpbiBwYXJhbWV0ZXJzICkge1xuXG5cdFx0IHZhbHVlcy5wdXNoKCBwYXJhbWV0ZXJzWyBrZXkgXSApO1xuXG5cdFx0IH1cblxuXHRcdCB2YXIgZ2VvbWV0cnkgPSBPYmplY3QuY3JlYXRlKCB0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZSApO1xuXHRcdCB0aGlzLmNvbnN0cnVjdG9yLmFwcGx5KCBnZW9tZXRyeSwgdmFsdWVzICk7XG5cdFx0IHJldHVybiBnZW9tZXRyeTtcblxuXHRcdCB9XG5cblx0XHQgcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xuXHRcdCAqL1xuXG5cdFx0cmV0dXJuIG5ldyBCdWZmZXJHZW9tZXRyeSgpLmNvcHkoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0dmFyIG5hbWUsIGksIGw7XG5cblx0XHQvLyByZXNldFxuXG5cdFx0dGhpcy5pbmRleCA9IG51bGw7XG5cdFx0dGhpcy5hdHRyaWJ1dGVzID0ge307XG5cdFx0dGhpcy5tb3JwaEF0dHJpYnV0ZXMgPSB7fTtcblx0XHR0aGlzLmdyb3VwcyA9IFtdO1xuXHRcdHRoaXMuYm91bmRpbmdCb3ggPSBudWxsO1xuXHRcdHRoaXMuYm91bmRpbmdTcGhlcmUgPSBudWxsO1xuXG5cdFx0Ly8gbmFtZVxuXG5cdFx0dGhpcy5uYW1lID0gc291cmNlLm5hbWU7XG5cblx0XHQvLyBpbmRleFxuXG5cdFx0dmFyIGluZGV4ID0gc291cmNlLmluZGV4O1xuXG5cdFx0aWYgKCBpbmRleCAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5zZXRJbmRleCggaW5kZXguY2xvbmUoKSApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gYXR0cmlidXRlc1xuXG5cdFx0dmFyIGF0dHJpYnV0ZXMgPSBzb3VyY2UuYXR0cmlidXRlcztcblxuXHRcdGZvciAoIG5hbWUgaW4gYXR0cmlidXRlcyApIHtcblxuXHRcdFx0dmFyIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXNbIG5hbWUgXTtcblx0XHRcdHRoaXMuYWRkQXR0cmlidXRlKCBuYW1lLCBhdHRyaWJ1dGUuY2xvbmUoKSApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gbW9ycGggYXR0cmlidXRlc1xuXG5cdFx0dmFyIG1vcnBoQXR0cmlidXRlcyA9IHNvdXJjZS5tb3JwaEF0dHJpYnV0ZXM7XG5cblx0XHRmb3IgKCBuYW1lIGluIG1vcnBoQXR0cmlidXRlcyApIHtcblxuXHRcdFx0dmFyIGFycmF5ID0gW107XG5cdFx0XHR2YXIgbW9ycGhBdHRyaWJ1dGUgPSBtb3JwaEF0dHJpYnV0ZXNbIG5hbWUgXTsgLy8gbW9ycGhBdHRyaWJ1dGU6IGFycmF5IG9mIEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGVzXG5cblx0XHRcdGZvciAoIGkgPSAwLCBsID0gbW9ycGhBdHRyaWJ1dGUubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRhcnJheS5wdXNoKCBtb3JwaEF0dHJpYnV0ZVsgaSBdLmNsb25lKCkgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLm1vcnBoQXR0cmlidXRlc1sgbmFtZSBdID0gYXJyYXk7XG5cblx0XHR9XG5cblx0XHQvLyBncm91cHNcblxuXHRcdHZhciBncm91cHMgPSBzb3VyY2UuZ3JvdXBzO1xuXG5cdFx0Zm9yICggaSA9IDAsIGwgPSBncm91cHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGdyb3VwID0gZ3JvdXBzWyBpIF07XG5cdFx0XHR0aGlzLmFkZEdyb3VwKCBncm91cC5zdGFydCwgZ3JvdXAuY291bnQsIGdyb3VwLm1hdGVyaWFsSW5kZXggKTtcblxuXHRcdH1cblxuXHRcdC8vIGJvdW5kaW5nIGJveFxuXG5cdFx0dmFyIGJvdW5kaW5nQm94ID0gc291cmNlLmJvdW5kaW5nQm94O1xuXG5cdFx0aWYgKCBib3VuZGluZ0JveCAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5ib3VuZGluZ0JveCA9IGJvdW5kaW5nQm94LmNsb25lKCk7XG5cblx0XHR9XG5cblx0XHQvLyBib3VuZGluZyBzcGhlcmVcblxuXHRcdHZhciBib3VuZGluZ1NwaGVyZSA9IHNvdXJjZS5ib3VuZGluZ1NwaGVyZTtcblxuXHRcdGlmICggYm91bmRpbmdTcGhlcmUgIT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuYm91bmRpbmdTcGhlcmUgPSBib3VuZGluZ1NwaGVyZS5jbG9uZSgpO1xuXG5cdFx0fVxuXG5cdFx0Ly8gZHJhdyByYW5nZVxuXG5cdFx0dGhpcy5kcmF3UmFuZ2Uuc3RhcnQgPSBzb3VyY2UuZHJhd1JhbmdlLnN0YXJ0O1xuXHRcdHRoaXMuZHJhd1JhbmdlLmNvdW50ID0gc291cmNlLmRyYXdSYW5nZS5jb3VudDtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZGlzcG9zZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5kaXNwYXRjaEV2ZW50KCB7IHR5cGU6ICdkaXNwb3NlJyB9ICk7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKi9cblxuLy8gQm94R2VvbWV0cnlcblxuZnVuY3Rpb24gQm94R2VvbWV0cnkoIHdpZHRoLCBoZWlnaHQsIGRlcHRoLCB3aWR0aFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgZGVwdGhTZWdtZW50cyApIHtcblxuXHRHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0JveEdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0d2lkdGg6IHdpZHRoLFxuXHRcdGhlaWdodDogaGVpZ2h0LFxuXHRcdGRlcHRoOiBkZXB0aCxcblx0XHR3aWR0aFNlZ21lbnRzOiB3aWR0aFNlZ21lbnRzLFxuXHRcdGhlaWdodFNlZ21lbnRzOiBoZWlnaHRTZWdtZW50cyxcblx0XHRkZXB0aFNlZ21lbnRzOiBkZXB0aFNlZ21lbnRzXG5cdH07XG5cblx0dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIG5ldyBCb3hCdWZmZXJHZW9tZXRyeSggd2lkdGgsIGhlaWdodCwgZGVwdGgsIHdpZHRoU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzLCBkZXB0aFNlZ21lbnRzICkgKTtcblx0dGhpcy5tZXJnZVZlcnRpY2VzKCk7XG5cbn1cblxuQm94R2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7XG5Cb3hHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBCb3hHZW9tZXRyeTtcblxuLy8gQm94QnVmZmVyR2VvbWV0cnlcblxuZnVuY3Rpb24gQm94QnVmZmVyR2VvbWV0cnkoIHdpZHRoLCBoZWlnaHQsIGRlcHRoLCB3aWR0aFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgZGVwdGhTZWdtZW50cyApIHtcblxuXHRCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0JveEJ1ZmZlckdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0d2lkdGg6IHdpZHRoLFxuXHRcdGhlaWdodDogaGVpZ2h0LFxuXHRcdGRlcHRoOiBkZXB0aCxcblx0XHR3aWR0aFNlZ21lbnRzOiB3aWR0aFNlZ21lbnRzLFxuXHRcdGhlaWdodFNlZ21lbnRzOiBoZWlnaHRTZWdtZW50cyxcblx0XHRkZXB0aFNlZ21lbnRzOiBkZXB0aFNlZ21lbnRzXG5cdH07XG5cblx0dmFyIHNjb3BlID0gdGhpcztcblxuXHR3aWR0aCA9IHdpZHRoIHx8IDE7XG5cdGhlaWdodCA9IGhlaWdodCB8fCAxO1xuXHRkZXB0aCA9IGRlcHRoIHx8IDE7XG5cblx0Ly8gc2VnbWVudHNcblxuXHR3aWR0aFNlZ21lbnRzID0gTWF0aC5mbG9vciggd2lkdGhTZWdtZW50cyApIHx8IDE7XG5cdGhlaWdodFNlZ21lbnRzID0gTWF0aC5mbG9vciggaGVpZ2h0U2VnbWVudHMgKSB8fCAxO1xuXHRkZXB0aFNlZ21lbnRzID0gTWF0aC5mbG9vciggZGVwdGhTZWdtZW50cyApIHx8IDE7XG5cblx0Ly8gYnVmZmVyc1xuXG5cdHZhciBpbmRpY2VzID0gW107XG5cdHZhciB2ZXJ0aWNlcyA9IFtdO1xuXHR2YXIgbm9ybWFscyA9IFtdO1xuXHR2YXIgdXZzID0gW107XG5cblx0Ly8gaGVscGVyIHZhcmlhYmxlc1xuXG5cdHZhciBudW1iZXJPZlZlcnRpY2VzID0gMDtcblx0dmFyIGdyb3VwU3RhcnQgPSAwO1xuXG5cdC8vIGJ1aWxkIGVhY2ggc2lkZSBvZiB0aGUgYm94IGdlb21ldHJ5XG5cblx0YnVpbGRQbGFuZSggJ3onLCAneScsICd4JywgLSAxLCAtIDEsIGRlcHRoLCBoZWlnaHQsIHdpZHRoLCBkZXB0aFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgMCApOyAvLyBweFxuXHRidWlsZFBsYW5lKCAneicsICd5JywgJ3gnLCAxLCAtIDEsIGRlcHRoLCBoZWlnaHQsIC0gd2lkdGgsIGRlcHRoU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzLCAxICk7IC8vIG54XG5cdGJ1aWxkUGxhbmUoICd4JywgJ3onLCAneScsIDEsIDEsIHdpZHRoLCBkZXB0aCwgaGVpZ2h0LCB3aWR0aFNlZ21lbnRzLCBkZXB0aFNlZ21lbnRzLCAyICk7IC8vIHB5XG5cdGJ1aWxkUGxhbmUoICd4JywgJ3onLCAneScsIDEsIC0gMSwgd2lkdGgsIGRlcHRoLCAtIGhlaWdodCwgd2lkdGhTZWdtZW50cywgZGVwdGhTZWdtZW50cywgMyApOyAvLyBueVxuXHRidWlsZFBsYW5lKCAneCcsICd5JywgJ3onLCAxLCAtIDEsIHdpZHRoLCBoZWlnaHQsIGRlcHRoLCB3aWR0aFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgNCApOyAvLyBwelxuXHRidWlsZFBsYW5lKCAneCcsICd5JywgJ3onLCAtIDEsIC0gMSwgd2lkdGgsIGhlaWdodCwgLSBkZXB0aCwgd2lkdGhTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIDUgKTsgLy8gbnpcblxuXHQvLyBidWlsZCBnZW9tZXRyeVxuXG5cdHRoaXMuc2V0SW5kZXgoIGluZGljZXMgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIG5vcm1hbHMsIDMgKSApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2cywgMiApICk7XG5cblx0ZnVuY3Rpb24gYnVpbGRQbGFuZSggdSwgdiwgdywgdWRpciwgdmRpciwgd2lkdGgsIGhlaWdodCwgZGVwdGgsIGdyaWRYLCBncmlkWSwgbWF0ZXJpYWxJbmRleCApIHtcblxuXHRcdHZhciBzZWdtZW50V2lkdGggPSB3aWR0aCAvIGdyaWRYO1xuXHRcdHZhciBzZWdtZW50SGVpZ2h0ID0gaGVpZ2h0IC8gZ3JpZFk7XG5cblx0XHR2YXIgd2lkdGhIYWxmID0gd2lkdGggLyAyO1xuXHRcdHZhciBoZWlnaHRIYWxmID0gaGVpZ2h0IC8gMjtcblx0XHR2YXIgZGVwdGhIYWxmID0gZGVwdGggLyAyO1xuXG5cdFx0dmFyIGdyaWRYMSA9IGdyaWRYICsgMTtcblx0XHR2YXIgZ3JpZFkxID0gZ3JpZFkgKyAxO1xuXG5cdFx0dmFyIHZlcnRleENvdW50ZXIgPSAwO1xuXHRcdHZhciBncm91cENvdW50ID0gMDtcblxuXHRcdHZhciBpeCwgaXk7XG5cblx0XHR2YXIgdmVjdG9yID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdC8vIGdlbmVyYXRlIHZlcnRpY2VzLCBub3JtYWxzIGFuZCB1dnNcblxuXHRcdGZvciAoIGl5ID0gMDsgaXkgPCBncmlkWTE7IGl5ICsrICkge1xuXG5cdFx0XHR2YXIgeSA9IGl5ICogc2VnbWVudEhlaWdodCAtIGhlaWdodEhhbGY7XG5cblx0XHRcdGZvciAoIGl4ID0gMDsgaXggPCBncmlkWDE7IGl4ICsrICkge1xuXG5cdFx0XHRcdHZhciB4ID0gaXggKiBzZWdtZW50V2lkdGggLSB3aWR0aEhhbGY7XG5cblx0XHRcdFx0Ly8gc2V0IHZhbHVlcyB0byBjb3JyZWN0IHZlY3RvciBjb21wb25lbnRcblxuXHRcdFx0XHR2ZWN0b3JbIHUgXSA9IHggKiB1ZGlyO1xuXHRcdFx0XHR2ZWN0b3JbIHYgXSA9IHkgKiB2ZGlyO1xuXHRcdFx0XHR2ZWN0b3JbIHcgXSA9IGRlcHRoSGFsZjtcblxuXHRcdFx0XHQvLyBub3cgYXBwbHkgdmVjdG9yIHRvIHZlcnRleCBidWZmZXJcblxuXHRcdFx0XHR2ZXJ0aWNlcy5wdXNoKCB2ZWN0b3IueCwgdmVjdG9yLnksIHZlY3Rvci56ICk7XG5cblx0XHRcdFx0Ly8gc2V0IHZhbHVlcyB0byBjb3JyZWN0IHZlY3RvciBjb21wb25lbnRcblxuXHRcdFx0XHR2ZWN0b3JbIHUgXSA9IDA7XG5cdFx0XHRcdHZlY3RvclsgdiBdID0gMDtcblx0XHRcdFx0dmVjdG9yWyB3IF0gPSBkZXB0aCA+IDAgPyAxIDogLSAxO1xuXG5cdFx0XHRcdC8vIG5vdyBhcHBseSB2ZWN0b3IgdG8gbm9ybWFsIGJ1ZmZlclxuXG5cdFx0XHRcdG5vcm1hbHMucHVzaCggdmVjdG9yLngsIHZlY3Rvci55LCB2ZWN0b3IueiApO1xuXG5cdFx0XHRcdC8vIHV2c1xuXG5cdFx0XHRcdHV2cy5wdXNoKCBpeCAvIGdyaWRYICk7XG5cdFx0XHRcdHV2cy5wdXNoKCAxIC0gKCBpeSAvIGdyaWRZICkgKTtcblxuXHRcdFx0XHQvLyBjb3VudGVyc1xuXG5cdFx0XHRcdHZlcnRleENvdW50ZXIgKz0gMTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gaW5kaWNlc1xuXG5cdFx0Ly8gMS4geW91IG5lZWQgdGhyZWUgaW5kaWNlcyB0byBkcmF3IGEgc2luZ2xlIGZhY2Vcblx0XHQvLyAyLiBhIHNpbmdsZSBzZWdtZW50IGNvbnNpc3RzIG9mIHR3byBmYWNlc1xuXHRcdC8vIDMuIHNvIHdlIG5lZWQgdG8gZ2VuZXJhdGUgc2l4ICgyKjMpIGluZGljZXMgcGVyIHNlZ21lbnRcblxuXHRcdGZvciAoIGl5ID0gMDsgaXkgPCBncmlkWTsgaXkgKysgKSB7XG5cblx0XHRcdGZvciAoIGl4ID0gMDsgaXggPCBncmlkWDsgaXggKysgKSB7XG5cblx0XHRcdFx0dmFyIGEgPSBudW1iZXJPZlZlcnRpY2VzICsgaXggKyBncmlkWDEgKiBpeTtcblx0XHRcdFx0dmFyIGIgPSBudW1iZXJPZlZlcnRpY2VzICsgaXggKyBncmlkWDEgKiAoIGl5ICsgMSApO1xuXHRcdFx0XHR2YXIgYyA9IG51bWJlck9mVmVydGljZXMgKyAoIGl4ICsgMSApICsgZ3JpZFgxICogKCBpeSArIDEgKTtcblx0XHRcdFx0dmFyIGQgPSBudW1iZXJPZlZlcnRpY2VzICsgKCBpeCArIDEgKSArIGdyaWRYMSAqIGl5O1xuXG5cdFx0XHRcdC8vIGZhY2VzXG5cblx0XHRcdFx0aW5kaWNlcy5wdXNoKCBhLCBiLCBkICk7XG5cdFx0XHRcdGluZGljZXMucHVzaCggYiwgYywgZCApO1xuXG5cdFx0XHRcdC8vIGluY3JlYXNlIGNvdW50ZXJcblxuXHRcdFx0XHRncm91cENvdW50ICs9IDY7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIGFkZCBhIGdyb3VwIHRvIHRoZSBnZW9tZXRyeS4gdGhpcyB3aWxsIGVuc3VyZSBtdWx0aSBtYXRlcmlhbCBzdXBwb3J0XG5cblx0XHRzY29wZS5hZGRHcm91cCggZ3JvdXBTdGFydCwgZ3JvdXBDb3VudCwgbWF0ZXJpYWxJbmRleCApO1xuXG5cdFx0Ly8gY2FsY3VsYXRlIG5ldyBzdGFydCB2YWx1ZSBmb3IgZ3JvdXBzXG5cblx0XHRncm91cFN0YXJ0ICs9IGdyb3VwQ291bnQ7XG5cblx0XHQvLyB1cGRhdGUgdG90YWwgbnVtYmVyIG9mIHZlcnRpY2VzXG5cblx0XHRudW1iZXJPZlZlcnRpY2VzICs9IHZlcnRleENvdW50ZXI7XG5cblx0fVxuXG59XG5cbkJveEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApO1xuQm94QnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQm94QnVmZmVyR2VvbWV0cnk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKi9cblxuLy8gUGxhbmVHZW9tZXRyeVxuXG5mdW5jdGlvbiBQbGFuZUdlb21ldHJ5KCB3aWR0aCwgaGVpZ2h0LCB3aWR0aFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cyApIHtcblxuXHRHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1BsYW5lR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHR3aWR0aDogd2lkdGgsXG5cdFx0aGVpZ2h0OiBoZWlnaHQsXG5cdFx0d2lkdGhTZWdtZW50czogd2lkdGhTZWdtZW50cyxcblx0XHRoZWlnaHRTZWdtZW50czogaGVpZ2h0U2VnbWVudHNcblx0fTtcblxuXHR0aGlzLmZyb21CdWZmZXJHZW9tZXRyeSggbmV3IFBsYW5lQnVmZmVyR2VvbWV0cnkoIHdpZHRoLCBoZWlnaHQsIHdpZHRoU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzICkgKTtcblx0dGhpcy5tZXJnZVZlcnRpY2VzKCk7XG5cbn1cblxuUGxhbmVHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBHZW9tZXRyeS5wcm90b3R5cGUgKTtcblBsYW5lR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUGxhbmVHZW9tZXRyeTtcblxuLy8gUGxhbmVCdWZmZXJHZW9tZXRyeVxuXG5mdW5jdGlvbiBQbGFuZUJ1ZmZlckdlb21ldHJ5KCB3aWR0aCwgaGVpZ2h0LCB3aWR0aFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cyApIHtcblxuXHRCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1BsYW5lQnVmZmVyR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHR3aWR0aDogd2lkdGgsXG5cdFx0aGVpZ2h0OiBoZWlnaHQsXG5cdFx0d2lkdGhTZWdtZW50czogd2lkdGhTZWdtZW50cyxcblx0XHRoZWlnaHRTZWdtZW50czogaGVpZ2h0U2VnbWVudHNcblx0fTtcblxuXHR3aWR0aCA9IHdpZHRoIHx8IDE7XG5cdGhlaWdodCA9IGhlaWdodCB8fCAxO1xuXG5cdHZhciB3aWR0aF9oYWxmID0gd2lkdGggLyAyO1xuXHR2YXIgaGVpZ2h0X2hhbGYgPSBoZWlnaHQgLyAyO1xuXG5cdHZhciBncmlkWCA9IE1hdGguZmxvb3IoIHdpZHRoU2VnbWVudHMgKSB8fCAxO1xuXHR2YXIgZ3JpZFkgPSBNYXRoLmZsb29yKCBoZWlnaHRTZWdtZW50cyApIHx8IDE7XG5cblx0dmFyIGdyaWRYMSA9IGdyaWRYICsgMTtcblx0dmFyIGdyaWRZMSA9IGdyaWRZICsgMTtcblxuXHR2YXIgc2VnbWVudF93aWR0aCA9IHdpZHRoIC8gZ3JpZFg7XG5cdHZhciBzZWdtZW50X2hlaWdodCA9IGhlaWdodCAvIGdyaWRZO1xuXG5cdHZhciBpeCwgaXk7XG5cblx0Ly8gYnVmZmVyc1xuXG5cdHZhciBpbmRpY2VzID0gW107XG5cdHZhciB2ZXJ0aWNlcyA9IFtdO1xuXHR2YXIgbm9ybWFscyA9IFtdO1xuXHR2YXIgdXZzID0gW107XG5cblx0Ly8gZ2VuZXJhdGUgdmVydGljZXMsIG5vcm1hbHMgYW5kIHV2c1xuXG5cdGZvciAoIGl5ID0gMDsgaXkgPCBncmlkWTE7IGl5ICsrICkge1xuXG5cdFx0dmFyIHkgPSBpeSAqIHNlZ21lbnRfaGVpZ2h0IC0gaGVpZ2h0X2hhbGY7XG5cblx0XHRmb3IgKCBpeCA9IDA7IGl4IDwgZ3JpZFgxOyBpeCArKyApIHtcblxuXHRcdFx0dmFyIHggPSBpeCAqIHNlZ21lbnRfd2lkdGggLSB3aWR0aF9oYWxmO1xuXG5cdFx0XHR2ZXJ0aWNlcy5wdXNoKCB4LCAtIHksIDAgKTtcblxuXHRcdFx0bm9ybWFscy5wdXNoKCAwLCAwLCAxICk7XG5cblx0XHRcdHV2cy5wdXNoKCBpeCAvIGdyaWRYICk7XG5cdFx0XHR1dnMucHVzaCggMSAtICggaXkgLyBncmlkWSApICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vIGluZGljZXNcblxuXHRmb3IgKCBpeSA9IDA7IGl5IDwgZ3JpZFk7IGl5ICsrICkge1xuXG5cdFx0Zm9yICggaXggPSAwOyBpeCA8IGdyaWRYOyBpeCArKyApIHtcblxuXHRcdFx0dmFyIGEgPSBpeCArIGdyaWRYMSAqIGl5O1xuXHRcdFx0dmFyIGIgPSBpeCArIGdyaWRYMSAqICggaXkgKyAxICk7XG5cdFx0XHR2YXIgYyA9ICggaXggKyAxICkgKyBncmlkWDEgKiAoIGl5ICsgMSApO1xuXHRcdFx0dmFyIGQgPSAoIGl4ICsgMSApICsgZ3JpZFgxICogaXk7XG5cblx0XHRcdC8vIGZhY2VzXG5cblx0XHRcdGluZGljZXMucHVzaCggYSwgYiwgZCApO1xuXHRcdFx0aW5kaWNlcy5wdXNoKCBiLCBjLCBkICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vIGJ1aWxkIGdlb21ldHJ5XG5cblx0dGhpcy5zZXRJbmRleCggaW5kaWNlcyApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICdub3JtYWwnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbm9ybWFscywgMyApICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZzLCAyICkgKTtcblxufVxuXG5QbGFuZUJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApO1xuUGxhbmVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBQbGFuZUJ1ZmZlckdlb21ldHJ5O1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICovXG5cbnZhciBtYXRlcmlhbElkID0gMDtcblxuZnVuY3Rpb24gTWF0ZXJpYWwoKSB7XG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KCB0aGlzLCAnaWQnLCB7IHZhbHVlOiBtYXRlcmlhbElkICsrIH0gKTtcblxuXHR0aGlzLnV1aWQgPSBfTWF0aC5nZW5lcmF0ZVVVSUQoKTtcblxuXHR0aGlzLm5hbWUgPSAnJztcblx0dGhpcy50eXBlID0gJ01hdGVyaWFsJztcblxuXHR0aGlzLmZvZyA9IHRydWU7XG5cdHRoaXMubGlnaHRzID0gdHJ1ZTtcblxuXHR0aGlzLmJsZW5kaW5nID0gTm9ybWFsQmxlbmRpbmc7XG5cdHRoaXMuc2lkZSA9IEZyb250U2lkZTtcblx0dGhpcy5mbGF0U2hhZGluZyA9IGZhbHNlO1xuXHR0aGlzLnZlcnRleENvbG9ycyA9IE5vQ29sb3JzOyAvLyBUSFJFRS5Ob0NvbG9ycywgVEhSRUUuVmVydGV4Q29sb3JzLCBUSFJFRS5GYWNlQ29sb3JzXG5cblx0dGhpcy5vcGFjaXR5ID0gMTtcblx0dGhpcy50cmFuc3BhcmVudCA9IGZhbHNlO1xuXG5cdHRoaXMuYmxlbmRTcmMgPSBTcmNBbHBoYUZhY3Rvcjtcblx0dGhpcy5ibGVuZERzdCA9IE9uZU1pbnVzU3JjQWxwaGFGYWN0b3I7XG5cdHRoaXMuYmxlbmRFcXVhdGlvbiA9IEFkZEVxdWF0aW9uO1xuXHR0aGlzLmJsZW5kU3JjQWxwaGEgPSBudWxsO1xuXHR0aGlzLmJsZW5kRHN0QWxwaGEgPSBudWxsO1xuXHR0aGlzLmJsZW5kRXF1YXRpb25BbHBoYSA9IG51bGw7XG5cblx0dGhpcy5kZXB0aEZ1bmMgPSBMZXNzRXF1YWxEZXB0aDtcblx0dGhpcy5kZXB0aFRlc3QgPSB0cnVlO1xuXHR0aGlzLmRlcHRoV3JpdGUgPSB0cnVlO1xuXG5cdHRoaXMuY2xpcHBpbmdQbGFuZXMgPSBudWxsO1xuXHR0aGlzLmNsaXBJbnRlcnNlY3Rpb24gPSBmYWxzZTtcblx0dGhpcy5jbGlwU2hhZG93cyA9IGZhbHNlO1xuXG5cdHRoaXMuc2hhZG93U2lkZSA9IG51bGw7XG5cblx0dGhpcy5jb2xvcldyaXRlID0gdHJ1ZTtcblxuXHR0aGlzLnByZWNpc2lvbiA9IG51bGw7IC8vIG92ZXJyaWRlIHRoZSByZW5kZXJlcidzIGRlZmF1bHQgcHJlY2lzaW9uIGZvciB0aGlzIG1hdGVyaWFsXG5cblx0dGhpcy5wb2x5Z29uT2Zmc2V0ID0gZmFsc2U7XG5cdHRoaXMucG9seWdvbk9mZnNldEZhY3RvciA9IDA7XG5cdHRoaXMucG9seWdvbk9mZnNldFVuaXRzID0gMDtcblxuXHR0aGlzLmRpdGhlcmluZyA9IGZhbHNlO1xuXG5cdHRoaXMuYWxwaGFUZXN0ID0gMDtcblx0dGhpcy5wcmVtdWx0aXBsaWVkQWxwaGEgPSBmYWxzZTtcblxuXHR0aGlzLm92ZXJkcmF3ID0gMDsgLy8gT3ZlcmRyYXduIHBpeGVscyAodHlwaWNhbGx5IGJldHdlZW4gMCBhbmQgMSkgZm9yIGZpeGluZyBhbnRpYWxpYXNpbmcgZ2FwcyBpbiBDYW52YXNSZW5kZXJlclxuXG5cdHRoaXMudmlzaWJsZSA9IHRydWU7XG5cblx0dGhpcy51c2VyRGF0YSA9IHt9O1xuXG5cdHRoaXMubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG59XG5cbk1hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEV2ZW50RGlzcGF0Y2hlci5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBNYXRlcmlhbCxcblxuXHRpc01hdGVyaWFsOiB0cnVlLFxuXG5cdG9uQmVmb3JlQ29tcGlsZTogZnVuY3Rpb24gKCkge30sXG5cblx0c2V0VmFsdWVzOiBmdW5jdGlvbiAoIHZhbHVlcyApIHtcblxuXHRcdGlmICggdmFsdWVzID09PSB1bmRlZmluZWQgKSByZXR1cm47XG5cblx0XHRmb3IgKCB2YXIga2V5IGluIHZhbHVlcyApIHtcblxuXHRcdFx0dmFyIG5ld1ZhbHVlID0gdmFsdWVzWyBrZXkgXTtcblxuXHRcdFx0aWYgKCBuZXdWYWx1ZSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggXCJUSFJFRS5NYXRlcmlhbDogJ1wiICsga2V5ICsgXCInIHBhcmFtZXRlciBpcyB1bmRlZmluZWQuXCIgKTtcblx0XHRcdFx0Y29udGludWU7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gZm9yIGJhY2t3YXJkIGNvbXBhdGFiaWxpdHkgaWYgc2hhZGluZyBpcyBzZXQgaW4gdGhlIGNvbnN0cnVjdG9yXG5cdFx0XHRpZiAoIGtleSA9PT0gJ3NoYWRpbmcnICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLicgKyB0aGlzLnR5cGUgKyAnOiAuc2hhZGluZyBoYXMgYmVlbiByZW1vdmVkLiBVc2UgdGhlIGJvb2xlYW4gLmZsYXRTaGFkaW5nIGluc3RlYWQuJyApO1xuXHRcdFx0XHR0aGlzLmZsYXRTaGFkaW5nID0gKCBuZXdWYWx1ZSA9PT0gRmxhdFNoYWRpbmcgKSA/IHRydWUgOiBmYWxzZTtcblx0XHRcdFx0Y29udGludWU7XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIGN1cnJlbnRWYWx1ZSA9IHRoaXNbIGtleSBdO1xuXG5cdFx0XHRpZiAoIGN1cnJlbnRWYWx1ZSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggXCJUSFJFRS5cIiArIHRoaXMudHlwZSArIFwiOiAnXCIgKyBrZXkgKyBcIicgaXMgbm90IGEgcHJvcGVydHkgb2YgdGhpcyBtYXRlcmlhbC5cIiApO1xuXHRcdFx0XHRjb250aW51ZTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGN1cnJlbnRWYWx1ZSAmJiBjdXJyZW50VmFsdWUuaXNDb2xvciApIHtcblxuXHRcdFx0XHRjdXJyZW50VmFsdWUuc2V0KCBuZXdWYWx1ZSApO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCAoIGN1cnJlbnRWYWx1ZSAmJiBjdXJyZW50VmFsdWUuaXNWZWN0b3IzICkgJiYgKCBuZXdWYWx1ZSAmJiBuZXdWYWx1ZS5pc1ZlY3RvcjMgKSApIHtcblxuXHRcdFx0XHRjdXJyZW50VmFsdWUuY29weSggbmV3VmFsdWUgKTtcblxuXHRcdFx0fSBlbHNlIGlmICgga2V5ID09PSAnb3ZlcmRyYXcnICkge1xuXG5cdFx0XHRcdC8vIGVuc3VyZSBvdmVyZHJhdyBpcyBiYWNrd2FyZHMtY29tcGF0aWJsZSB3aXRoIGxlZ2FjeSBib29sZWFuIHR5cGVcblx0XHRcdFx0dGhpc1sga2V5IF0gPSBOdW1iZXIoIG5ld1ZhbHVlICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0dGhpc1sga2V5IF0gPSBuZXdWYWx1ZTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH0sXG5cblx0dG9KU09OOiBmdW5jdGlvbiAoIG1ldGEgKSB7XG5cblx0XHR2YXIgaXNSb290ID0gKCBtZXRhID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIG1ldGEgPT09ICdzdHJpbmcnICk7XG5cblx0XHRpZiAoIGlzUm9vdCApIHtcblxuXHRcdFx0bWV0YSA9IHtcblx0XHRcdFx0dGV4dHVyZXM6IHt9LFxuXHRcdFx0XHRpbWFnZXM6IHt9XG5cdFx0XHR9O1xuXG5cdFx0fVxuXG5cdFx0dmFyIGRhdGEgPSB7XG5cdFx0XHRtZXRhZGF0YToge1xuXHRcdFx0XHR2ZXJzaW9uOiA0LjUsXG5cdFx0XHRcdHR5cGU6ICdNYXRlcmlhbCcsXG5cdFx0XHRcdGdlbmVyYXRvcjogJ01hdGVyaWFsLnRvSlNPTidcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0Ly8gc3RhbmRhcmQgTWF0ZXJpYWwgc2VyaWFsaXphdGlvblxuXHRcdGRhdGEudXVpZCA9IHRoaXMudXVpZDtcblx0XHRkYXRhLnR5cGUgPSB0aGlzLnR5cGU7XG5cblx0XHRpZiAoIHRoaXMubmFtZSAhPT0gJycgKSBkYXRhLm5hbWUgPSB0aGlzLm5hbWU7XG5cblx0XHRpZiAoIHRoaXMuY29sb3IgJiYgdGhpcy5jb2xvci5pc0NvbG9yICkgZGF0YS5jb2xvciA9IHRoaXMuY29sb3IuZ2V0SGV4KCk7XG5cblx0XHRpZiAoIHRoaXMucm91Z2huZXNzICE9PSB1bmRlZmluZWQgKSBkYXRhLnJvdWdobmVzcyA9IHRoaXMucm91Z2huZXNzO1xuXHRcdGlmICggdGhpcy5tZXRhbG5lc3MgIT09IHVuZGVmaW5lZCApIGRhdGEubWV0YWxuZXNzID0gdGhpcy5tZXRhbG5lc3M7XG5cblx0XHRpZiAoIHRoaXMuZW1pc3NpdmUgJiYgdGhpcy5lbWlzc2l2ZS5pc0NvbG9yICkgZGF0YS5lbWlzc2l2ZSA9IHRoaXMuZW1pc3NpdmUuZ2V0SGV4KCk7XG5cdFx0aWYgKCB0aGlzLmVtaXNzaXZlSW50ZW5zaXR5ICE9PSAxICkgZGF0YS5lbWlzc2l2ZUludGVuc2l0eSA9IHRoaXMuZW1pc3NpdmVJbnRlbnNpdHk7XG5cblx0XHRpZiAoIHRoaXMuc3BlY3VsYXIgJiYgdGhpcy5zcGVjdWxhci5pc0NvbG9yICkgZGF0YS5zcGVjdWxhciA9IHRoaXMuc3BlY3VsYXIuZ2V0SGV4KCk7XG5cdFx0aWYgKCB0aGlzLnNoaW5pbmVzcyAhPT0gdW5kZWZpbmVkICkgZGF0YS5zaGluaW5lc3MgPSB0aGlzLnNoaW5pbmVzcztcblx0XHRpZiAoIHRoaXMuY2xlYXJDb2F0ICE9PSB1bmRlZmluZWQgKSBkYXRhLmNsZWFyQ29hdCA9IHRoaXMuY2xlYXJDb2F0O1xuXHRcdGlmICggdGhpcy5jbGVhckNvYXRSb3VnaG5lc3MgIT09IHVuZGVmaW5lZCApIGRhdGEuY2xlYXJDb2F0Um91Z2huZXNzID0gdGhpcy5jbGVhckNvYXRSb3VnaG5lc3M7XG5cblx0XHRpZiAoIHRoaXMubWFwICYmIHRoaXMubWFwLmlzVGV4dHVyZSApIGRhdGEubWFwID0gdGhpcy5tYXAudG9KU09OKCBtZXRhICkudXVpZDtcblx0XHRpZiAoIHRoaXMuYWxwaGFNYXAgJiYgdGhpcy5hbHBoYU1hcC5pc1RleHR1cmUgKSBkYXRhLmFscGhhTWFwID0gdGhpcy5hbHBoYU1hcC50b0pTT04oIG1ldGEgKS51dWlkO1xuXHRcdGlmICggdGhpcy5saWdodE1hcCAmJiB0aGlzLmxpZ2h0TWFwLmlzVGV4dHVyZSApIGRhdGEubGlnaHRNYXAgPSB0aGlzLmxpZ2h0TWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7XG5cdFx0aWYgKCB0aGlzLmJ1bXBNYXAgJiYgdGhpcy5idW1wTWFwLmlzVGV4dHVyZSApIHtcblxuXHRcdFx0ZGF0YS5idW1wTWFwID0gdGhpcy5idW1wTWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7XG5cdFx0XHRkYXRhLmJ1bXBTY2FsZSA9IHRoaXMuYnVtcFNjYWxlO1xuXG5cdFx0fVxuXHRcdGlmICggdGhpcy5ub3JtYWxNYXAgJiYgdGhpcy5ub3JtYWxNYXAuaXNUZXh0dXJlICkge1xuXG5cdFx0XHRkYXRhLm5vcm1hbE1hcCA9IHRoaXMubm9ybWFsTWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7XG5cdFx0XHRkYXRhLm5vcm1hbFNjYWxlID0gdGhpcy5ub3JtYWxTY2FsZS50b0FycmF5KCk7XG5cblx0XHR9XG5cdFx0aWYgKCB0aGlzLmRpc3BsYWNlbWVudE1hcCAmJiB0aGlzLmRpc3BsYWNlbWVudE1hcC5pc1RleHR1cmUgKSB7XG5cblx0XHRcdGRhdGEuZGlzcGxhY2VtZW50TWFwID0gdGhpcy5kaXNwbGFjZW1lbnRNYXAudG9KU09OKCBtZXRhICkudXVpZDtcblx0XHRcdGRhdGEuZGlzcGxhY2VtZW50U2NhbGUgPSB0aGlzLmRpc3BsYWNlbWVudFNjYWxlO1xuXHRcdFx0ZGF0YS5kaXNwbGFjZW1lbnRCaWFzID0gdGhpcy5kaXNwbGFjZW1lbnRCaWFzO1xuXG5cdFx0fVxuXHRcdGlmICggdGhpcy5yb3VnaG5lc3NNYXAgJiYgdGhpcy5yb3VnaG5lc3NNYXAuaXNUZXh0dXJlICkgZGF0YS5yb3VnaG5lc3NNYXAgPSB0aGlzLnJvdWdobmVzc01hcC50b0pTT04oIG1ldGEgKS51dWlkO1xuXHRcdGlmICggdGhpcy5tZXRhbG5lc3NNYXAgJiYgdGhpcy5tZXRhbG5lc3NNYXAuaXNUZXh0dXJlICkgZGF0YS5tZXRhbG5lc3NNYXAgPSB0aGlzLm1ldGFsbmVzc01hcC50b0pTT04oIG1ldGEgKS51dWlkO1xuXG5cdFx0aWYgKCB0aGlzLmVtaXNzaXZlTWFwICYmIHRoaXMuZW1pc3NpdmVNYXAuaXNUZXh0dXJlICkgZGF0YS5lbWlzc2l2ZU1hcCA9IHRoaXMuZW1pc3NpdmVNYXAudG9KU09OKCBtZXRhICkudXVpZDtcblx0XHRpZiAoIHRoaXMuc3BlY3VsYXJNYXAgJiYgdGhpcy5zcGVjdWxhck1hcC5pc1RleHR1cmUgKSBkYXRhLnNwZWN1bGFyTWFwID0gdGhpcy5zcGVjdWxhck1hcC50b0pTT04oIG1ldGEgKS51dWlkO1xuXG5cdFx0aWYgKCB0aGlzLmVudk1hcCAmJiB0aGlzLmVudk1hcC5pc1RleHR1cmUgKSB7XG5cblx0XHRcdGRhdGEuZW52TWFwID0gdGhpcy5lbnZNYXAudG9KU09OKCBtZXRhICkudXVpZDtcblx0XHRcdGRhdGEucmVmbGVjdGl2aXR5ID0gdGhpcy5yZWZsZWN0aXZpdHk7IC8vIFNjYWxlIGJlaGluZCBlbnZNYXBcblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5ncmFkaWVudE1hcCAmJiB0aGlzLmdyYWRpZW50TWFwLmlzVGV4dHVyZSApIHtcblxuXHRcdFx0ZGF0YS5ncmFkaWVudE1hcCA9IHRoaXMuZ3JhZGllbnRNYXAudG9KU09OKCBtZXRhICkudXVpZDtcblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5zaXplICE9PSB1bmRlZmluZWQgKSBkYXRhLnNpemUgPSB0aGlzLnNpemU7XG5cdFx0aWYgKCB0aGlzLnNpemVBdHRlbnVhdGlvbiAhPT0gdW5kZWZpbmVkICkgZGF0YS5zaXplQXR0ZW51YXRpb24gPSB0aGlzLnNpemVBdHRlbnVhdGlvbjtcblxuXHRcdGlmICggdGhpcy5ibGVuZGluZyAhPT0gTm9ybWFsQmxlbmRpbmcgKSBkYXRhLmJsZW5kaW5nID0gdGhpcy5ibGVuZGluZztcblx0XHRpZiAoIHRoaXMuZmxhdFNoYWRpbmcgPT09IHRydWUgKSBkYXRhLmZsYXRTaGFkaW5nID0gdGhpcy5mbGF0U2hhZGluZztcblx0XHRpZiAoIHRoaXMuc2lkZSAhPT0gRnJvbnRTaWRlICkgZGF0YS5zaWRlID0gdGhpcy5zaWRlO1xuXHRcdGlmICggdGhpcy52ZXJ0ZXhDb2xvcnMgIT09IE5vQ29sb3JzICkgZGF0YS52ZXJ0ZXhDb2xvcnMgPSB0aGlzLnZlcnRleENvbG9ycztcblxuXHRcdGlmICggdGhpcy5vcGFjaXR5IDwgMSApIGRhdGEub3BhY2l0eSA9IHRoaXMub3BhY2l0eTtcblx0XHRpZiAoIHRoaXMudHJhbnNwYXJlbnQgPT09IHRydWUgKSBkYXRhLnRyYW5zcGFyZW50ID0gdGhpcy50cmFuc3BhcmVudDtcblxuXHRcdGRhdGEuZGVwdGhGdW5jID0gdGhpcy5kZXB0aEZ1bmM7XG5cdFx0ZGF0YS5kZXB0aFRlc3QgPSB0aGlzLmRlcHRoVGVzdDtcblx0XHRkYXRhLmRlcHRoV3JpdGUgPSB0aGlzLmRlcHRoV3JpdGU7XG5cblx0XHQvLyByb3RhdGlvbiAoU3ByaXRlTWF0ZXJpYWwpXG5cdFx0aWYgKCB0aGlzLnJvdGF0aW9uICE9PSAwICkgZGF0YS5yb3RhdGlvbiA9IHRoaXMucm90YXRpb247XG5cblx0XHRpZiAoIHRoaXMubGluZXdpZHRoICE9PSAxICkgZGF0YS5saW5ld2lkdGggPSB0aGlzLmxpbmV3aWR0aDtcblx0XHRpZiAoIHRoaXMuZGFzaFNpemUgIT09IHVuZGVmaW5lZCApIGRhdGEuZGFzaFNpemUgPSB0aGlzLmRhc2hTaXplO1xuXHRcdGlmICggdGhpcy5nYXBTaXplICE9PSB1bmRlZmluZWQgKSBkYXRhLmdhcFNpemUgPSB0aGlzLmdhcFNpemU7XG5cdFx0aWYgKCB0aGlzLnNjYWxlICE9PSB1bmRlZmluZWQgKSBkYXRhLnNjYWxlID0gdGhpcy5zY2FsZTtcblxuXHRcdGlmICggdGhpcy5kaXRoZXJpbmcgPT09IHRydWUgKSBkYXRhLmRpdGhlcmluZyA9IHRydWU7XG5cblx0XHRpZiAoIHRoaXMuYWxwaGFUZXN0ID4gMCApIGRhdGEuYWxwaGFUZXN0ID0gdGhpcy5hbHBoYVRlc3Q7XG5cdFx0aWYgKCB0aGlzLnByZW11bHRpcGxpZWRBbHBoYSA9PT0gdHJ1ZSApIGRhdGEucHJlbXVsdGlwbGllZEFscGhhID0gdGhpcy5wcmVtdWx0aXBsaWVkQWxwaGE7XG5cblx0XHRpZiAoIHRoaXMud2lyZWZyYW1lID09PSB0cnVlICkgZGF0YS53aXJlZnJhbWUgPSB0aGlzLndpcmVmcmFtZTtcblx0XHRpZiAoIHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID4gMSApIGRhdGEud2lyZWZyYW1lTGluZXdpZHRoID0gdGhpcy53aXJlZnJhbWVMaW5ld2lkdGg7XG5cdFx0aWYgKCB0aGlzLndpcmVmcmFtZUxpbmVjYXAgIT09ICdyb3VuZCcgKSBkYXRhLndpcmVmcmFtZUxpbmVjYXAgPSB0aGlzLndpcmVmcmFtZUxpbmVjYXA7XG5cdFx0aWYgKCB0aGlzLndpcmVmcmFtZUxpbmVqb2luICE9PSAncm91bmQnICkgZGF0YS53aXJlZnJhbWVMaW5lam9pbiA9IHRoaXMud2lyZWZyYW1lTGluZWpvaW47XG5cblx0XHRpZiAoIHRoaXMubW9ycGhUYXJnZXRzID09PSB0cnVlICkgZGF0YS5tb3JwaFRhcmdldHMgPSB0cnVlO1xuXHRcdGlmICggdGhpcy5za2lubmluZyA9PT0gdHJ1ZSApIGRhdGEuc2tpbm5pbmcgPSB0cnVlO1xuXG5cdFx0aWYgKCB0aGlzLnZpc2libGUgPT09IGZhbHNlICkgZGF0YS52aXNpYmxlID0gZmFsc2U7XG5cdFx0aWYgKCBKU09OLnN0cmluZ2lmeSggdGhpcy51c2VyRGF0YSApICE9PSAne30nICkgZGF0YS51c2VyRGF0YSA9IHRoaXMudXNlckRhdGE7XG5cblx0XHQvLyBUT0RPOiBDb3BpZWQgZnJvbSBPYmplY3QzRC50b0pTT05cblxuXHRcdGZ1bmN0aW9uIGV4dHJhY3RGcm9tQ2FjaGUoIGNhY2hlICkge1xuXG5cdFx0XHR2YXIgdmFsdWVzID0gW107XG5cblx0XHRcdGZvciAoIHZhciBrZXkgaW4gY2FjaGUgKSB7XG5cblx0XHRcdFx0dmFyIGRhdGEgPSBjYWNoZVsga2V5IF07XG5cdFx0XHRcdGRlbGV0ZSBkYXRhLm1ldGFkYXRhO1xuXHRcdFx0XHR2YWx1ZXMucHVzaCggZGF0YSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB2YWx1ZXM7XG5cblx0XHR9XG5cblx0XHRpZiAoIGlzUm9vdCApIHtcblxuXHRcdFx0dmFyIHRleHR1cmVzID0gZXh0cmFjdEZyb21DYWNoZSggbWV0YS50ZXh0dXJlcyApO1xuXHRcdFx0dmFyIGltYWdlcyA9IGV4dHJhY3RGcm9tQ2FjaGUoIG1ldGEuaW1hZ2VzICk7XG5cblx0XHRcdGlmICggdGV4dHVyZXMubGVuZ3RoID4gMCApIGRhdGEudGV4dHVyZXMgPSB0ZXh0dXJlcztcblx0XHRcdGlmICggaW1hZ2VzLmxlbmd0aCA+IDAgKSBkYXRhLmltYWdlcyA9IGltYWdlcztcblxuXHRcdH1cblxuXHRcdHJldHVybiBkYXRhO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0dGhpcy5uYW1lID0gc291cmNlLm5hbWU7XG5cblx0XHR0aGlzLmZvZyA9IHNvdXJjZS5mb2c7XG5cdFx0dGhpcy5saWdodHMgPSBzb3VyY2UubGlnaHRzO1xuXG5cdFx0dGhpcy5ibGVuZGluZyA9IHNvdXJjZS5ibGVuZGluZztcblx0XHR0aGlzLnNpZGUgPSBzb3VyY2Uuc2lkZTtcblx0XHR0aGlzLmZsYXRTaGFkaW5nID0gc291cmNlLmZsYXRTaGFkaW5nO1xuXHRcdHRoaXMudmVydGV4Q29sb3JzID0gc291cmNlLnZlcnRleENvbG9ycztcblxuXHRcdHRoaXMub3BhY2l0eSA9IHNvdXJjZS5vcGFjaXR5O1xuXHRcdHRoaXMudHJhbnNwYXJlbnQgPSBzb3VyY2UudHJhbnNwYXJlbnQ7XG5cblx0XHR0aGlzLmJsZW5kU3JjID0gc291cmNlLmJsZW5kU3JjO1xuXHRcdHRoaXMuYmxlbmREc3QgPSBzb3VyY2UuYmxlbmREc3Q7XG5cdFx0dGhpcy5ibGVuZEVxdWF0aW9uID0gc291cmNlLmJsZW5kRXF1YXRpb247XG5cdFx0dGhpcy5ibGVuZFNyY0FscGhhID0gc291cmNlLmJsZW5kU3JjQWxwaGE7XG5cdFx0dGhpcy5ibGVuZERzdEFscGhhID0gc291cmNlLmJsZW5kRHN0QWxwaGE7XG5cdFx0dGhpcy5ibGVuZEVxdWF0aW9uQWxwaGEgPSBzb3VyY2UuYmxlbmRFcXVhdGlvbkFscGhhO1xuXG5cdFx0dGhpcy5kZXB0aEZ1bmMgPSBzb3VyY2UuZGVwdGhGdW5jO1xuXHRcdHRoaXMuZGVwdGhUZXN0ID0gc291cmNlLmRlcHRoVGVzdDtcblx0XHR0aGlzLmRlcHRoV3JpdGUgPSBzb3VyY2UuZGVwdGhXcml0ZTtcblxuXHRcdHRoaXMuY29sb3JXcml0ZSA9IHNvdXJjZS5jb2xvcldyaXRlO1xuXG5cdFx0dGhpcy5wcmVjaXNpb24gPSBzb3VyY2UucHJlY2lzaW9uO1xuXG5cdFx0dGhpcy5wb2x5Z29uT2Zmc2V0ID0gc291cmNlLnBvbHlnb25PZmZzZXQ7XG5cdFx0dGhpcy5wb2x5Z29uT2Zmc2V0RmFjdG9yID0gc291cmNlLnBvbHlnb25PZmZzZXRGYWN0b3I7XG5cdFx0dGhpcy5wb2x5Z29uT2Zmc2V0VW5pdHMgPSBzb3VyY2UucG9seWdvbk9mZnNldFVuaXRzO1xuXG5cdFx0dGhpcy5kaXRoZXJpbmcgPSBzb3VyY2UuZGl0aGVyaW5nO1xuXG5cdFx0dGhpcy5hbHBoYVRlc3QgPSBzb3VyY2UuYWxwaGFUZXN0O1xuXHRcdHRoaXMucHJlbXVsdGlwbGllZEFscGhhID0gc291cmNlLnByZW11bHRpcGxpZWRBbHBoYTtcblxuXHRcdHRoaXMub3ZlcmRyYXcgPSBzb3VyY2Uub3ZlcmRyYXc7XG5cblx0XHR0aGlzLnZpc2libGUgPSBzb3VyY2UudmlzaWJsZTtcblx0XHR0aGlzLnVzZXJEYXRhID0gSlNPTi5wYXJzZSggSlNPTi5zdHJpbmdpZnkoIHNvdXJjZS51c2VyRGF0YSApICk7XG5cblx0XHR0aGlzLmNsaXBTaGFkb3dzID0gc291cmNlLmNsaXBTaGFkb3dzO1xuXHRcdHRoaXMuY2xpcEludGVyc2VjdGlvbiA9IHNvdXJjZS5jbGlwSW50ZXJzZWN0aW9uO1xuXG5cdFx0dmFyIHNyY1BsYW5lcyA9IHNvdXJjZS5jbGlwcGluZ1BsYW5lcyxcblx0XHRcdGRzdFBsYW5lcyA9IG51bGw7XG5cblx0XHRpZiAoIHNyY1BsYW5lcyAhPT0gbnVsbCApIHtcblxuXHRcdFx0dmFyIG4gPSBzcmNQbGFuZXMubGVuZ3RoO1xuXHRcdFx0ZHN0UGxhbmVzID0gbmV3IEFycmF5KCBuICk7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMDsgaSAhPT0gbjsgKysgaSApXG5cdFx0XHRcdGRzdFBsYW5lc1sgaSBdID0gc3JjUGxhbmVzWyBpIF0uY2xvbmUoKTtcblxuXHRcdH1cblxuXHRcdHRoaXMuY2xpcHBpbmdQbGFuZXMgPSBkc3RQbGFuZXM7XG5cblx0XHR0aGlzLnNoYWRvd1NpZGUgPSBzb3VyY2Uuc2hhZG93U2lkZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZGlzcG9zZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5kaXNwYXRjaEV2ZW50KCB7IHR5cGU6ICdkaXNwb3NlJyB9ICk7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKlxuICogcGFyYW1ldGVycyA9IHtcbiAqICBjb2xvcjogPGhleD4sXG4gKiAgb3BhY2l0eTogPGZsb2F0PixcbiAqICBtYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIGxpZ2h0TWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGxpZ2h0TWFwSW50ZW5zaXR5OiA8ZmxvYXQ+XG4gKlxuICogIGFvTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGFvTWFwSW50ZW5zaXR5OiA8ZmxvYXQ+XG4gKlxuICogIHNwZWN1bGFyTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBhbHBoYU1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgZW52TWFwOiBuZXcgVEhSRUUuQ3ViZVRleHR1cmUoIFtwb3N4LCBuZWd4LCBwb3N5LCBuZWd5LCBwb3N6LCBuZWd6XSApLFxuICogIGNvbWJpbmU6IFRIUkVFLk11bHRpcGx5LFxuICogIHJlZmxlY3Rpdml0eTogPGZsb2F0PixcbiAqICByZWZyYWN0aW9uUmF0aW86IDxmbG9hdD4sXG4gKlxuICogIGRlcHRoVGVzdDogPGJvb2w+LFxuICogIGRlcHRoV3JpdGU6IDxib29sPixcbiAqXG4gKiAgd2lyZWZyYW1lOiA8Ym9vbGVhbj4sXG4gKiAgd2lyZWZyYW1lTGluZXdpZHRoOiA8ZmxvYXQ+LFxuICpcbiAqICBza2lubmluZzogPGJvb2w+LFxuICogIG1vcnBoVGFyZ2V0czogPGJvb2w+XG4gKiB9XG4gKi9cblxuZnVuY3Rpb24gTWVzaEJhc2ljTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKSB7XG5cblx0TWF0ZXJpYWwuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdNZXNoQmFzaWNNYXRlcmlhbCc7XG5cblx0dGhpcy5jb2xvciA9IG5ldyBDb2xvciggMHhmZmZmZmYgKTsgLy8gZW1pc3NpdmVcblxuXHR0aGlzLm1hcCA9IG51bGw7XG5cblx0dGhpcy5saWdodE1hcCA9IG51bGw7XG5cdHRoaXMubGlnaHRNYXBJbnRlbnNpdHkgPSAxLjA7XG5cblx0dGhpcy5hb01hcCA9IG51bGw7XG5cdHRoaXMuYW9NYXBJbnRlbnNpdHkgPSAxLjA7XG5cblx0dGhpcy5zcGVjdWxhck1hcCA9IG51bGw7XG5cblx0dGhpcy5hbHBoYU1hcCA9IG51bGw7XG5cblx0dGhpcy5lbnZNYXAgPSBudWxsO1xuXHR0aGlzLmNvbWJpbmUgPSBNdWx0aXBseU9wZXJhdGlvbjtcblx0dGhpcy5yZWZsZWN0aXZpdHkgPSAxO1xuXHR0aGlzLnJlZnJhY3Rpb25SYXRpbyA9IDAuOTg7XG5cblx0dGhpcy53aXJlZnJhbWUgPSBmYWxzZTtcblx0dGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSAxO1xuXHR0aGlzLndpcmVmcmFtZUxpbmVjYXAgPSAncm91bmQnO1xuXHR0aGlzLndpcmVmcmFtZUxpbmVqb2luID0gJ3JvdW5kJztcblxuXHR0aGlzLnNraW5uaW5nID0gZmFsc2U7XG5cdHRoaXMubW9ycGhUYXJnZXRzID0gZmFsc2U7XG5cblx0dGhpcy5saWdodHMgPSBmYWxzZTtcblxuXHR0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApO1xuXG59XG5cbk1lc2hCYXNpY01hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE1hdGVyaWFsLnByb3RvdHlwZSApO1xuTWVzaEJhc2ljTWF0ZXJpYWwucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTWVzaEJhc2ljTWF0ZXJpYWw7XG5cbk1lc2hCYXNpY01hdGVyaWFsLnByb3RvdHlwZS5pc01lc2hCYXNpY01hdGVyaWFsID0gdHJ1ZTtcblxuTWVzaEJhc2ljTWF0ZXJpYWwucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRNYXRlcmlhbC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHR0aGlzLmNvbG9yLmNvcHkoIHNvdXJjZS5jb2xvciApO1xuXG5cdHRoaXMubWFwID0gc291cmNlLm1hcDtcblxuXHR0aGlzLmxpZ2h0TWFwID0gc291cmNlLmxpZ2h0TWFwO1xuXHR0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5ID0gc291cmNlLmxpZ2h0TWFwSW50ZW5zaXR5O1xuXG5cdHRoaXMuYW9NYXAgPSBzb3VyY2UuYW9NYXA7XG5cdHRoaXMuYW9NYXBJbnRlbnNpdHkgPSBzb3VyY2UuYW9NYXBJbnRlbnNpdHk7XG5cblx0dGhpcy5zcGVjdWxhck1hcCA9IHNvdXJjZS5zcGVjdWxhck1hcDtcblxuXHR0aGlzLmFscGhhTWFwID0gc291cmNlLmFscGhhTWFwO1xuXG5cdHRoaXMuZW52TWFwID0gc291cmNlLmVudk1hcDtcblx0dGhpcy5jb21iaW5lID0gc291cmNlLmNvbWJpbmU7XG5cdHRoaXMucmVmbGVjdGl2aXR5ID0gc291cmNlLnJlZmxlY3Rpdml0eTtcblx0dGhpcy5yZWZyYWN0aW9uUmF0aW8gPSBzb3VyY2UucmVmcmFjdGlvblJhdGlvO1xuXG5cdHRoaXMud2lyZWZyYW1lID0gc291cmNlLndpcmVmcmFtZTtcblx0dGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSBzb3VyY2Uud2lyZWZyYW1lTGluZXdpZHRoO1xuXHR0aGlzLndpcmVmcmFtZUxpbmVjYXAgPSBzb3VyY2Uud2lyZWZyYW1lTGluZWNhcDtcblx0dGhpcy53aXJlZnJhbWVMaW5lam9pbiA9IHNvdXJjZS53aXJlZnJhbWVMaW5lam9pbjtcblxuXHR0aGlzLnNraW5uaW5nID0gc291cmNlLnNraW5uaW5nO1xuXHR0aGlzLm1vcnBoVGFyZ2V0cyA9IHNvdXJjZS5tb3JwaFRhcmdldHM7XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqXG4gKiBwYXJhbWV0ZXJzID0ge1xuICogIGRlZmluZXM6IHsgXCJsYWJlbFwiIDogXCJ2YWx1ZVwiIH0sXG4gKiAgdW5pZm9ybXM6IHsgXCJwYXJhbWV0ZXIxXCI6IHsgdmFsdWU6IDEuMCB9LCBcInBhcmFtZXRlcjJcIjogeyB2YWx1ZTI6IDIgfSB9LFxuICpcbiAqICBmcmFnbWVudFNoYWRlcjogPHN0cmluZz4sXG4gKiAgdmVydGV4U2hhZGVyOiA8c3RyaW5nPixcbiAqXG4gKiAgd2lyZWZyYW1lOiA8Ym9vbGVhbj4sXG4gKiAgd2lyZWZyYW1lTGluZXdpZHRoOiA8ZmxvYXQ+LFxuICpcbiAqICBsaWdodHM6IDxib29sPixcbiAqXG4gKiAgc2tpbm5pbmc6IDxib29sPixcbiAqICBtb3JwaFRhcmdldHM6IDxib29sPixcbiAqICBtb3JwaE5vcm1hbHM6IDxib29sPlxuICogfVxuICovXG5cbmZ1bmN0aW9uIFNoYWRlck1hdGVyaWFsKCBwYXJhbWV0ZXJzICkge1xuXG5cdE1hdGVyaWFsLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnU2hhZGVyTWF0ZXJpYWwnO1xuXG5cdHRoaXMuZGVmaW5lcyA9IHt9O1xuXHR0aGlzLnVuaWZvcm1zID0ge307XG5cblx0dGhpcy52ZXJ0ZXhTaGFkZXIgPSAndm9pZCBtYWluKCkge1xcblxcdGdsX1Bvc2l0aW9uID0gcHJvamVjdGlvbk1hdHJpeCAqIG1vZGVsVmlld01hdHJpeCAqIHZlYzQoIHBvc2l0aW9uLCAxLjAgKTtcXG59Jztcblx0dGhpcy5mcmFnbWVudFNoYWRlciA9ICd2b2lkIG1haW4oKSB7XFxuXFx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggMS4wLCAwLjAsIDAuMCwgMS4wICk7XFxufSc7XG5cblx0dGhpcy5saW5ld2lkdGggPSAxO1xuXG5cdHRoaXMud2lyZWZyYW1lID0gZmFsc2U7XG5cdHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gMTtcblxuXHR0aGlzLmZvZyA9IGZhbHNlOyAvLyBzZXQgdG8gdXNlIHNjZW5lIGZvZ1xuXHR0aGlzLmxpZ2h0cyA9IGZhbHNlOyAvLyBzZXQgdG8gdXNlIHNjZW5lIGxpZ2h0c1xuXHR0aGlzLmNsaXBwaW5nID0gZmFsc2U7IC8vIHNldCB0byB1c2UgdXNlci1kZWZpbmVkIGNsaXBwaW5nIHBsYW5lc1xuXG5cdHRoaXMuc2tpbm5pbmcgPSBmYWxzZTsgLy8gc2V0IHRvIHVzZSBza2lubmluZyBhdHRyaWJ1dGUgc3RyZWFtc1xuXHR0aGlzLm1vcnBoVGFyZ2V0cyA9IGZhbHNlOyAvLyBzZXQgdG8gdXNlIG1vcnBoIHRhcmdldHNcblx0dGhpcy5tb3JwaE5vcm1hbHMgPSBmYWxzZTsgLy8gc2V0IHRvIHVzZSBtb3JwaCBub3JtYWxzXG5cblx0dGhpcy5leHRlbnNpb25zID0ge1xuXHRcdGRlcml2YXRpdmVzOiBmYWxzZSwgLy8gc2V0IHRvIHVzZSBkZXJpdmF0aXZlc1xuXHRcdGZyYWdEZXB0aDogZmFsc2UsIC8vIHNldCB0byB1c2UgZnJhZ21lbnQgZGVwdGggdmFsdWVzXG5cdFx0ZHJhd0J1ZmZlcnM6IGZhbHNlLCAvLyBzZXQgdG8gdXNlIGRyYXcgYnVmZmVyc1xuXHRcdHNoYWRlclRleHR1cmVMT0Q6IGZhbHNlIC8vIHNldCB0byB1c2Ugc2hhZGVyIHRleHR1cmUgTE9EXG5cdH07XG5cblx0Ly8gV2hlbiByZW5kZXJlZCBnZW9tZXRyeSBkb2Vzbid0IGluY2x1ZGUgdGhlc2UgYXR0cmlidXRlcyBidXQgdGhlIG1hdGVyaWFsIGRvZXMsXG5cdC8vIHVzZSB0aGVzZSBkZWZhdWx0IHZhbHVlcyBpbiBXZWJHTC4gVGhpcyBhdm9pZHMgZXJyb3JzIHdoZW4gYnVmZmVyIGRhdGEgaXMgbWlzc2luZy5cblx0dGhpcy5kZWZhdWx0QXR0cmlidXRlVmFsdWVzID0ge1xuXHRcdCdjb2xvcic6IFsgMSwgMSwgMSBdLFxuXHRcdCd1dic6IFsgMCwgMCBdLFxuXHRcdCd1djInOiBbIDAsIDAgXVxuXHR9O1xuXG5cdHRoaXMuaW5kZXgwQXR0cmlidXRlTmFtZSA9IHVuZGVmaW5lZDtcblx0dGhpcy51bmlmb3Jtc05lZWRVcGRhdGUgPSBmYWxzZTtcblxuXHRpZiAoIHBhcmFtZXRlcnMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdGlmICggcGFyYW1ldGVycy5hdHRyaWJ1dGVzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5TaGFkZXJNYXRlcmlhbDogYXR0cmlidXRlcyBzaG91bGQgbm93IGJlIGRlZmluZWQgaW4gVEhSRUUuQnVmZmVyR2VvbWV0cnkgaW5zdGVhZC4nICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApO1xuXG5cdH1cblxufVxuXG5TaGFkZXJNYXRlcmlhbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBNYXRlcmlhbC5wcm90b3R5cGUgKTtcblNoYWRlck1hdGVyaWFsLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFNoYWRlck1hdGVyaWFsO1xuXG5TaGFkZXJNYXRlcmlhbC5wcm90b3R5cGUuaXNTaGFkZXJNYXRlcmlhbCA9IHRydWU7XG5cblNoYWRlck1hdGVyaWFsLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0TWF0ZXJpYWwucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0dGhpcy5mcmFnbWVudFNoYWRlciA9IHNvdXJjZS5mcmFnbWVudFNoYWRlcjtcblx0dGhpcy52ZXJ0ZXhTaGFkZXIgPSBzb3VyY2UudmVydGV4U2hhZGVyO1xuXG5cdHRoaXMudW5pZm9ybXMgPSBVbmlmb3Jtc1V0aWxzLmNsb25lKCBzb3VyY2UudW5pZm9ybXMgKTtcblxuXHR0aGlzLmRlZmluZXMgPSBPYmplY3QuYXNzaWduKCB7fSwgc291cmNlLmRlZmluZXMgKTtcblxuXHR0aGlzLndpcmVmcmFtZSA9IHNvdXJjZS53aXJlZnJhbWU7XG5cdHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gc291cmNlLndpcmVmcmFtZUxpbmV3aWR0aDtcblxuXHR0aGlzLmxpZ2h0cyA9IHNvdXJjZS5saWdodHM7XG5cdHRoaXMuY2xpcHBpbmcgPSBzb3VyY2UuY2xpcHBpbmc7XG5cblx0dGhpcy5za2lubmluZyA9IHNvdXJjZS5za2lubmluZztcblxuXHR0aGlzLm1vcnBoVGFyZ2V0cyA9IHNvdXJjZS5tb3JwaFRhcmdldHM7XG5cdHRoaXMubW9ycGhOb3JtYWxzID0gc291cmNlLm1vcnBoTm9ybWFscztcblxuXHR0aGlzLmV4dGVuc2lvbnMgPSBzb3VyY2UuZXh0ZW5zaW9ucztcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuU2hhZGVyTWF0ZXJpYWwucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uICggbWV0YSApIHtcblxuXHR2YXIgZGF0YSA9IE1hdGVyaWFsLnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcywgbWV0YSApO1xuXG5cdGRhdGEudW5pZm9ybXMgPSB0aGlzLnVuaWZvcm1zO1xuXHRkYXRhLnZlcnRleFNoYWRlciA9IHRoaXMudmVydGV4U2hhZGVyO1xuXHRkYXRhLmZyYWdtZW50U2hhZGVyID0gdGhpcy5mcmFnbWVudFNoYWRlcjtcblxuXHRyZXR1cm4gZGF0YTtcblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvXG4gKi9cblxuZnVuY3Rpb24gUmF5KCBvcmlnaW4sIGRpcmVjdGlvbiApIHtcblxuXHR0aGlzLm9yaWdpbiA9ICggb3JpZ2luICE9PSB1bmRlZmluZWQgKSA/IG9yaWdpbiA6IG5ldyBWZWN0b3IzKCk7XG5cdHRoaXMuZGlyZWN0aW9uID0gKCBkaXJlY3Rpb24gIT09IHVuZGVmaW5lZCApID8gZGlyZWN0aW9uIDogbmV3IFZlY3RvcjMoKTtcblxufVxuXG5PYmplY3QuYXNzaWduKCBSYXkucHJvdG90eXBlLCB7XG5cblx0c2V0OiBmdW5jdGlvbiAoIG9yaWdpbiwgZGlyZWN0aW9uICkge1xuXG5cdFx0dGhpcy5vcmlnaW4uY29weSggb3JpZ2luICk7XG5cdFx0dGhpcy5kaXJlY3Rpb24uY29weSggZGlyZWN0aW9uICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHJheSApIHtcblxuXHRcdHRoaXMub3JpZ2luLmNvcHkoIHJheS5vcmlnaW4gKTtcblx0XHR0aGlzLmRpcmVjdGlvbi5jb3B5KCByYXkuZGlyZWN0aW9uICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGF0OiBmdW5jdGlvbiAoIHQsIHRhcmdldCApIHtcblxuXHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlJheTogLmF0KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGFyZ2V0LmNvcHkoIHRoaXMuZGlyZWN0aW9uICkubXVsdGlwbHlTY2FsYXIoIHQgKS5hZGQoIHRoaXMub3JpZ2luICk7XG5cblx0fSxcblxuXHRsb29rQXQ6IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHRoaXMuZGlyZWN0aW9uLmNvcHkoIHYgKS5zdWIoIHRoaXMub3JpZ2luICkubm9ybWFsaXplKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHJlY2FzdDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiByZWNhc3QoIHQgKSB7XG5cblx0XHRcdHRoaXMub3JpZ2luLmNvcHkoIHRoaXMuYXQoIHQsIHYxICkgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRjbG9zZXN0UG9pbnRUb1BvaW50OiBmdW5jdGlvbiAoIHBvaW50LCB0YXJnZXQgKSB7XG5cblx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5SYXk6IC5jbG9zZXN0UG9pbnRUb1BvaW50KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR9XG5cblx0XHR0YXJnZXQuc3ViVmVjdG9ycyggcG9pbnQsIHRoaXMub3JpZ2luICk7XG5cblx0XHR2YXIgZGlyZWN0aW9uRGlzdGFuY2UgPSB0YXJnZXQuZG90KCB0aGlzLmRpcmVjdGlvbiApO1xuXG5cdFx0aWYgKCBkaXJlY3Rpb25EaXN0YW5jZSA8IDAgKSB7XG5cblx0XHRcdHJldHVybiB0YXJnZXQuY29weSggdGhpcy5vcmlnaW4gKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0YXJnZXQuY29weSggdGhpcy5kaXJlY3Rpb24gKS5tdWx0aXBseVNjYWxhciggZGlyZWN0aW9uRGlzdGFuY2UgKS5hZGQoIHRoaXMub3JpZ2luICk7XG5cblx0fSxcblxuXHRkaXN0YW5jZVRvUG9pbnQ6IGZ1bmN0aW9uICggcG9pbnQgKSB7XG5cblx0XHRyZXR1cm4gTWF0aC5zcXJ0KCB0aGlzLmRpc3RhbmNlU3FUb1BvaW50KCBwb2ludCApICk7XG5cblx0fSxcblxuXHRkaXN0YW5jZVNxVG9Qb2ludDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBkaXN0YW5jZVNxVG9Qb2ludCggcG9pbnQgKSB7XG5cblx0XHRcdHZhciBkaXJlY3Rpb25EaXN0YW5jZSA9IHYxLnN1YlZlY3RvcnMoIHBvaW50LCB0aGlzLm9yaWdpbiApLmRvdCggdGhpcy5kaXJlY3Rpb24gKTtcblxuXHRcdFx0Ly8gcG9pbnQgYmVoaW5kIHRoZSByYXlcblxuXHRcdFx0aWYgKCBkaXJlY3Rpb25EaXN0YW5jZSA8IDAgKSB7XG5cblx0XHRcdFx0cmV0dXJuIHRoaXMub3JpZ2luLmRpc3RhbmNlVG9TcXVhcmVkKCBwb2ludCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHYxLmNvcHkoIHRoaXMuZGlyZWN0aW9uICkubXVsdGlwbHlTY2FsYXIoIGRpcmVjdGlvbkRpc3RhbmNlICkuYWRkKCB0aGlzLm9yaWdpbiApO1xuXG5cdFx0XHRyZXR1cm4gdjEuZGlzdGFuY2VUb1NxdWFyZWQoIHBvaW50ICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRkaXN0YW5jZVNxVG9TZWdtZW50OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgc2VnQ2VudGVyID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgc2VnRGlyID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgZGlmZiA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gZGlzdGFuY2VTcVRvU2VnbWVudCggdjAsIHYxLCBvcHRpb25hbFBvaW50T25SYXksIG9wdGlvbmFsUG9pbnRPblNlZ21lbnQgKSB7XG5cblx0XHRcdC8vIGZyb20gaHR0cDovL3d3dy5nZW9tZXRyaWN0b29scy5jb20vR1RFbmdpbmUvSW5jbHVkZS9NYXRoZW1hdGljcy9HdGVEaXN0UmF5U2VnbWVudC5oXG5cdFx0XHQvLyBJdCByZXR1cm5zIHRoZSBtaW4gZGlzdGFuY2UgYmV0d2VlbiB0aGUgcmF5IGFuZCB0aGUgc2VnbWVudFxuXHRcdFx0Ly8gZGVmaW5lZCBieSB2MCBhbmQgdjFcblx0XHRcdC8vIEl0IGNhbiBhbHNvIHNldCB0d28gb3B0aW9uYWwgdGFyZ2V0cyA6XG5cdFx0XHQvLyAtIFRoZSBjbG9zZXN0IHBvaW50IG9uIHRoZSByYXlcblx0XHRcdC8vIC0gVGhlIGNsb3Nlc3QgcG9pbnQgb24gdGhlIHNlZ21lbnRcblxuXHRcdFx0c2VnQ2VudGVyLmNvcHkoIHYwICkuYWRkKCB2MSApLm11bHRpcGx5U2NhbGFyKCAwLjUgKTtcblx0XHRcdHNlZ0Rpci5jb3B5KCB2MSApLnN1YiggdjAgKS5ub3JtYWxpemUoKTtcblx0XHRcdGRpZmYuY29weSggdGhpcy5vcmlnaW4gKS5zdWIoIHNlZ0NlbnRlciApO1xuXG5cdFx0XHR2YXIgc2VnRXh0ZW50ID0gdjAuZGlzdGFuY2VUbyggdjEgKSAqIDAuNTtcblx0XHRcdHZhciBhMDEgPSAtIHRoaXMuZGlyZWN0aW9uLmRvdCggc2VnRGlyICk7XG5cdFx0XHR2YXIgYjAgPSBkaWZmLmRvdCggdGhpcy5kaXJlY3Rpb24gKTtcblx0XHRcdHZhciBiMSA9IC0gZGlmZi5kb3QoIHNlZ0RpciApO1xuXHRcdFx0dmFyIGMgPSBkaWZmLmxlbmd0aFNxKCk7XG5cdFx0XHR2YXIgZGV0ID0gTWF0aC5hYnMoIDEgLSBhMDEgKiBhMDEgKTtcblx0XHRcdHZhciBzMCwgczEsIHNxckRpc3QsIGV4dERldDtcblxuXHRcdFx0aWYgKCBkZXQgPiAwICkge1xuXG5cdFx0XHRcdC8vIFRoZSByYXkgYW5kIHNlZ21lbnQgYXJlIG5vdCBwYXJhbGxlbC5cblxuXHRcdFx0XHRzMCA9IGEwMSAqIGIxIC0gYjA7XG5cdFx0XHRcdHMxID0gYTAxICogYjAgLSBiMTtcblx0XHRcdFx0ZXh0RGV0ID0gc2VnRXh0ZW50ICogZGV0O1xuXG5cdFx0XHRcdGlmICggczAgPj0gMCApIHtcblxuXHRcdFx0XHRcdGlmICggczEgPj0gLSBleHREZXQgKSB7XG5cblx0XHRcdFx0XHRcdGlmICggczEgPD0gZXh0RGV0ICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIHJlZ2lvbiAwXG5cdFx0XHRcdFx0XHRcdC8vIE1pbmltdW0gYXQgaW50ZXJpb3IgcG9pbnRzIG9mIHJheSBhbmQgc2VnbWVudC5cblxuXHRcdFx0XHRcdFx0XHR2YXIgaW52RGV0ID0gMSAvIGRldDtcblx0XHRcdFx0XHRcdFx0czAgKj0gaW52RGV0O1xuXHRcdFx0XHRcdFx0XHRzMSAqPSBpbnZEZXQ7XG5cdFx0XHRcdFx0XHRcdHNxckRpc3QgPSBzMCAqICggczAgKyBhMDEgKiBzMSArIDIgKiBiMCApICsgczEgKiAoIGEwMSAqIHMwICsgczEgKyAyICogYjEgKSArIGM7XG5cblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gcmVnaW9uIDFcblxuXHRcdFx0XHRcdFx0XHRzMSA9IHNlZ0V4dGVudDtcblx0XHRcdFx0XHRcdFx0czAgPSBNYXRoLm1heCggMCwgLSAoIGEwMSAqIHMxICsgYjAgKSApO1xuXHRcdFx0XHRcdFx0XHRzcXJEaXN0ID0gLSBzMCAqIHMwICsgczEgKiAoIHMxICsgMiAqIGIxICkgKyBjO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHQvLyByZWdpb24gNVxuXG5cdFx0XHRcdFx0XHRzMSA9IC0gc2VnRXh0ZW50O1xuXHRcdFx0XHRcdFx0czAgPSBNYXRoLm1heCggMCwgLSAoIGEwMSAqIHMxICsgYjAgKSApO1xuXHRcdFx0XHRcdFx0c3FyRGlzdCA9IC0gczAgKiBzMCArIHMxICogKCBzMSArIDIgKiBiMSApICsgYztcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0aWYgKCBzMSA8PSAtIGV4dERldCApIHtcblxuXHRcdFx0XHRcdFx0Ly8gcmVnaW9uIDRcblxuXHRcdFx0XHRcdFx0czAgPSBNYXRoLm1heCggMCwgLSAoIC0gYTAxICogc2VnRXh0ZW50ICsgYjAgKSApO1xuXHRcdFx0XHRcdFx0czEgPSAoIHMwID4gMCApID8gLSBzZWdFeHRlbnQgOiBNYXRoLm1pbiggTWF0aC5tYXgoIC0gc2VnRXh0ZW50LCAtIGIxICksIHNlZ0V4dGVudCApO1xuXHRcdFx0XHRcdFx0c3FyRGlzdCA9IC0gczAgKiBzMCArIHMxICogKCBzMSArIDIgKiBiMSApICsgYztcblxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoIHMxIDw9IGV4dERldCApIHtcblxuXHRcdFx0XHRcdFx0Ly8gcmVnaW9uIDNcblxuXHRcdFx0XHRcdFx0czAgPSAwO1xuXHRcdFx0XHRcdFx0czEgPSBNYXRoLm1pbiggTWF0aC5tYXgoIC0gc2VnRXh0ZW50LCAtIGIxICksIHNlZ0V4dGVudCApO1xuXHRcdFx0XHRcdFx0c3FyRGlzdCA9IHMxICogKCBzMSArIDIgKiBiMSApICsgYztcblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdC8vIHJlZ2lvbiAyXG5cblx0XHRcdFx0XHRcdHMwID0gTWF0aC5tYXgoIDAsIC0gKCBhMDEgKiBzZWdFeHRlbnQgKyBiMCApICk7XG5cdFx0XHRcdFx0XHRzMSA9ICggczAgPiAwICkgPyBzZWdFeHRlbnQgOiBNYXRoLm1pbiggTWF0aC5tYXgoIC0gc2VnRXh0ZW50LCAtIGIxICksIHNlZ0V4dGVudCApO1xuXHRcdFx0XHRcdFx0c3FyRGlzdCA9IC0gczAgKiBzMCArIHMxICogKCBzMSArIDIgKiBiMSApICsgYztcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Ly8gUmF5IGFuZCBzZWdtZW50IGFyZSBwYXJhbGxlbC5cblxuXHRcdFx0XHRzMSA9ICggYTAxID4gMCApID8gLSBzZWdFeHRlbnQgOiBzZWdFeHRlbnQ7XG5cdFx0XHRcdHMwID0gTWF0aC5tYXgoIDAsIC0gKCBhMDEgKiBzMSArIGIwICkgKTtcblx0XHRcdFx0c3FyRGlzdCA9IC0gczAgKiBzMCArIHMxICogKCBzMSArIDIgKiBiMSApICsgYztcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIG9wdGlvbmFsUG9pbnRPblJheSApIHtcblxuXHRcdFx0XHRvcHRpb25hbFBvaW50T25SYXkuY29weSggdGhpcy5kaXJlY3Rpb24gKS5tdWx0aXBseVNjYWxhciggczAgKS5hZGQoIHRoaXMub3JpZ2luICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBvcHRpb25hbFBvaW50T25TZWdtZW50ICkge1xuXG5cdFx0XHRcdG9wdGlvbmFsUG9pbnRPblNlZ21lbnQuY29weSggc2VnRGlyICkubXVsdGlwbHlTY2FsYXIoIHMxICkuYWRkKCBzZWdDZW50ZXIgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gc3FyRGlzdDtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGludGVyc2VjdFNwaGVyZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBpbnRlcnNlY3RTcGhlcmUoIHNwaGVyZSwgdGFyZ2V0ICkge1xuXG5cdFx0XHR2MS5zdWJWZWN0b3JzKCBzcGhlcmUuY2VudGVyLCB0aGlzLm9yaWdpbiApO1xuXHRcdFx0dmFyIHRjYSA9IHYxLmRvdCggdGhpcy5kaXJlY3Rpb24gKTtcblx0XHRcdHZhciBkMiA9IHYxLmRvdCggdjEgKSAtIHRjYSAqIHRjYTtcblx0XHRcdHZhciByYWRpdXMyID0gc3BoZXJlLnJhZGl1cyAqIHNwaGVyZS5yYWRpdXM7XG5cblx0XHRcdGlmICggZDIgPiByYWRpdXMyICkgcmV0dXJuIG51bGw7XG5cblx0XHRcdHZhciB0aGMgPSBNYXRoLnNxcnQoIHJhZGl1czIgLSBkMiApO1xuXG5cdFx0XHQvLyB0MCA9IGZpcnN0IGludGVyc2VjdCBwb2ludCAtIGVudHJhbmNlIG9uIGZyb250IG9mIHNwaGVyZVxuXHRcdFx0dmFyIHQwID0gdGNhIC0gdGhjO1xuXG5cdFx0XHQvLyB0MSA9IHNlY29uZCBpbnRlcnNlY3QgcG9pbnQgLSBleGl0IHBvaW50IG9uIGJhY2sgb2Ygc3BoZXJlXG5cdFx0XHR2YXIgdDEgPSB0Y2EgKyB0aGM7XG5cblx0XHRcdC8vIHRlc3QgdG8gc2VlIGlmIGJvdGggdDAgYW5kIHQxIGFyZSBiZWhpbmQgdGhlIHJheSAtIGlmIHNvLCByZXR1cm4gbnVsbFxuXHRcdFx0aWYgKCB0MCA8IDAgJiYgdDEgPCAwICkgcmV0dXJuIG51bGw7XG5cblx0XHRcdC8vIHRlc3QgdG8gc2VlIGlmIHQwIGlzIGJlaGluZCB0aGUgcmF5OlxuXHRcdFx0Ly8gaWYgaXQgaXMsIHRoZSByYXkgaXMgaW5zaWRlIHRoZSBzcGhlcmUsIHNvIHJldHVybiB0aGUgc2Vjb25kIGV4aXQgcG9pbnQgc2NhbGVkIGJ5IHQxLFxuXHRcdFx0Ly8gaW4gb3JkZXIgdG8gYWx3YXlzIHJldHVybiBhbiBpbnRlcnNlY3QgcG9pbnQgdGhhdCBpcyBpbiBmcm9udCBvZiB0aGUgcmF5LlxuXHRcdFx0aWYgKCB0MCA8IDAgKSByZXR1cm4gdGhpcy5hdCggdDEsIHRhcmdldCApO1xuXG5cdFx0XHQvLyBlbHNlIHQwIGlzIGluIGZyb250IG9mIHRoZSByYXksIHNvIHJldHVybiB0aGUgZmlyc3QgY29sbGlzaW9uIHBvaW50IHNjYWxlZCBieSB0MFxuXHRcdFx0cmV0dXJuIHRoaXMuYXQoIHQwLCB0YXJnZXQgKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGludGVyc2VjdHNTcGhlcmU6IGZ1bmN0aW9uICggc3BoZXJlICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZGlzdGFuY2VUb1BvaW50KCBzcGhlcmUuY2VudGVyICkgPD0gc3BoZXJlLnJhZGl1cztcblxuXHR9LFxuXG5cdGRpc3RhbmNlVG9QbGFuZTogZnVuY3Rpb24gKCBwbGFuZSApIHtcblxuXHRcdHZhciBkZW5vbWluYXRvciA9IHBsYW5lLm5vcm1hbC5kb3QoIHRoaXMuZGlyZWN0aW9uICk7XG5cblx0XHRpZiAoIGRlbm9taW5hdG9yID09PSAwICkge1xuXG5cdFx0XHQvLyBsaW5lIGlzIGNvcGxhbmFyLCByZXR1cm4gb3JpZ2luXG5cdFx0XHRpZiAoIHBsYW5lLmRpc3RhbmNlVG9Qb2ludCggdGhpcy5vcmlnaW4gKSA9PT0gMCApIHtcblxuXHRcdFx0XHRyZXR1cm4gMDtcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBOdWxsIGlzIHByZWZlcmFibGUgdG8gdW5kZWZpbmVkIHNpbmNlIHVuZGVmaW5lZCBtZWFucy4uLi4gaXQgaXMgdW5kZWZpbmVkXG5cblx0XHRcdHJldHVybiBudWxsO1xuXG5cdFx0fVxuXG5cdFx0dmFyIHQgPSAtICggdGhpcy5vcmlnaW4uZG90KCBwbGFuZS5ub3JtYWwgKSArIHBsYW5lLmNvbnN0YW50ICkgLyBkZW5vbWluYXRvcjtcblxuXHRcdC8vIFJldHVybiBpZiB0aGUgcmF5IG5ldmVyIGludGVyc2VjdHMgdGhlIHBsYW5lXG5cblx0XHRyZXR1cm4gdCA+PSAwID8gdCA6IG51bGw7XG5cblx0fSxcblxuXHRpbnRlcnNlY3RQbGFuZTogZnVuY3Rpb24gKCBwbGFuZSwgdGFyZ2V0ICkge1xuXG5cdFx0dmFyIHQgPSB0aGlzLmRpc3RhbmNlVG9QbGFuZSggcGxhbmUgKTtcblxuXHRcdGlmICggdCA9PT0gbnVsbCApIHtcblxuXHRcdFx0cmV0dXJuIG51bGw7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5hdCggdCwgdGFyZ2V0ICk7XG5cblx0fSxcblxuXHRpbnRlcnNlY3RzUGxhbmU6IGZ1bmN0aW9uICggcGxhbmUgKSB7XG5cblx0XHQvLyBjaGVjayBpZiB0aGUgcmF5IGxpZXMgb24gdGhlIHBsYW5lIGZpcnN0XG5cblx0XHR2YXIgZGlzdFRvUG9pbnQgPSBwbGFuZS5kaXN0YW5jZVRvUG9pbnQoIHRoaXMub3JpZ2luICk7XG5cblx0XHRpZiAoIGRpc3RUb1BvaW50ID09PSAwICkge1xuXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblxuXHRcdH1cblxuXHRcdHZhciBkZW5vbWluYXRvciA9IHBsYW5lLm5vcm1hbC5kb3QoIHRoaXMuZGlyZWN0aW9uICk7XG5cblx0XHRpZiAoIGRlbm9taW5hdG9yICogZGlzdFRvUG9pbnQgPCAwICkge1xuXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblxuXHRcdH1cblxuXHRcdC8vIHJheSBvcmlnaW4gaXMgYmVoaW5kIHRoZSBwbGFuZSAoYW5kIGlzIHBvaW50aW5nIGJlaGluZCBpdClcblxuXHRcdHJldHVybiBmYWxzZTtcblxuXHR9LFxuXG5cdGludGVyc2VjdEJveDogZnVuY3Rpb24gKCBib3gsIHRhcmdldCApIHtcblxuXHRcdHZhciB0bWluLCB0bWF4LCB0eW1pbiwgdHltYXgsIHR6bWluLCB0em1heDtcblxuXHRcdHZhciBpbnZkaXJ4ID0gMSAvIHRoaXMuZGlyZWN0aW9uLngsXG5cdFx0XHRpbnZkaXJ5ID0gMSAvIHRoaXMuZGlyZWN0aW9uLnksXG5cdFx0XHRpbnZkaXJ6ID0gMSAvIHRoaXMuZGlyZWN0aW9uLno7XG5cblx0XHR2YXIgb3JpZ2luID0gdGhpcy5vcmlnaW47XG5cblx0XHRpZiAoIGludmRpcnggPj0gMCApIHtcblxuXHRcdFx0dG1pbiA9ICggYm94Lm1pbi54IC0gb3JpZ2luLnggKSAqIGludmRpcng7XG5cdFx0XHR0bWF4ID0gKCBib3gubWF4LnggLSBvcmlnaW4ueCApICogaW52ZGlyeDtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHRtaW4gPSAoIGJveC5tYXgueCAtIG9yaWdpbi54ICkgKiBpbnZkaXJ4O1xuXHRcdFx0dG1heCA9ICggYm94Lm1pbi54IC0gb3JpZ2luLnggKSAqIGludmRpcng7XG5cblx0XHR9XG5cblx0XHRpZiAoIGludmRpcnkgPj0gMCApIHtcblxuXHRcdFx0dHltaW4gPSAoIGJveC5taW4ueSAtIG9yaWdpbi55ICkgKiBpbnZkaXJ5O1xuXHRcdFx0dHltYXggPSAoIGJveC5tYXgueSAtIG9yaWdpbi55ICkgKiBpbnZkaXJ5O1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dHltaW4gPSAoIGJveC5tYXgueSAtIG9yaWdpbi55ICkgKiBpbnZkaXJ5O1xuXHRcdFx0dHltYXggPSAoIGJveC5taW4ueSAtIG9yaWdpbi55ICkgKiBpbnZkaXJ5O1xuXG5cdFx0fVxuXG5cdFx0aWYgKCAoIHRtaW4gPiB0eW1heCApIHx8ICggdHltaW4gPiB0bWF4ICkgKSByZXR1cm4gbnVsbDtcblxuXHRcdC8vIFRoZXNlIGxpbmVzIGFsc28gaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHRtaW4gb3IgdG1heCBpcyBOYU5cblx0XHQvLyAocmVzdWx0IG9mIDAgKiBJbmZpbml0eSkuIHggIT09IHggcmV0dXJucyB0cnVlIGlmIHggaXMgTmFOXG5cblx0XHRpZiAoIHR5bWluID4gdG1pbiB8fCB0bWluICE9PSB0bWluICkgdG1pbiA9IHR5bWluO1xuXG5cdFx0aWYgKCB0eW1heCA8IHRtYXggfHwgdG1heCAhPT0gdG1heCApIHRtYXggPSB0eW1heDtcblxuXHRcdGlmICggaW52ZGlyeiA+PSAwICkge1xuXG5cdFx0XHR0em1pbiA9ICggYm94Lm1pbi56IC0gb3JpZ2luLnogKSAqIGludmRpcno7XG5cdFx0XHR0em1heCA9ICggYm94Lm1heC56IC0gb3JpZ2luLnogKSAqIGludmRpcno7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR0em1pbiA9ICggYm94Lm1heC56IC0gb3JpZ2luLnogKSAqIGludmRpcno7XG5cdFx0XHR0em1heCA9ICggYm94Lm1pbi56IC0gb3JpZ2luLnogKSAqIGludmRpcno7XG5cblx0XHR9XG5cblx0XHRpZiAoICggdG1pbiA+IHR6bWF4ICkgfHwgKCB0em1pbiA+IHRtYXggKSApIHJldHVybiBudWxsO1xuXG5cdFx0aWYgKCB0em1pbiA+IHRtaW4gfHwgdG1pbiAhPT0gdG1pbiApIHRtaW4gPSB0em1pbjtcblxuXHRcdGlmICggdHptYXggPCB0bWF4IHx8IHRtYXggIT09IHRtYXggKSB0bWF4ID0gdHptYXg7XG5cblx0XHQvL3JldHVybiBwb2ludCBjbG9zZXN0IHRvIHRoZSByYXkgKHBvc2l0aXZlIHNpZGUpXG5cblx0XHRpZiAoIHRtYXggPCAwICkgcmV0dXJuIG51bGw7XG5cblx0XHRyZXR1cm4gdGhpcy5hdCggdG1pbiA+PSAwID8gdG1pbiA6IHRtYXgsIHRhcmdldCApO1xuXG5cdH0sXG5cblx0aW50ZXJzZWN0c0JveDogKCBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdiA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gaW50ZXJzZWN0c0JveCggYm94ICkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5pbnRlcnNlY3RCb3goIGJveCwgdiApICE9PSBudWxsO1xuXG5cdFx0fTtcblxuXHR9ICkoKSxcblxuXHRpbnRlcnNlY3RUcmlhbmdsZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gQ29tcHV0ZSB0aGUgb2Zmc2V0IG9yaWdpbiwgZWRnZXMsIGFuZCBub3JtYWwuXG5cdFx0dmFyIGRpZmYgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciBlZGdlMSA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIGVkZ2UyID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgbm9ybWFsID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBpbnRlcnNlY3RUcmlhbmdsZSggYSwgYiwgYywgYmFja2ZhY2VDdWxsaW5nLCB0YXJnZXQgKSB7XG5cblx0XHRcdC8vIGZyb20gaHR0cDovL3d3dy5nZW9tZXRyaWN0b29scy5jb20vR1RFbmdpbmUvSW5jbHVkZS9NYXRoZW1hdGljcy9HdGVJbnRyUmF5M1RyaWFuZ2xlMy5oXG5cblx0XHRcdGVkZ2UxLnN1YlZlY3RvcnMoIGIsIGEgKTtcblx0XHRcdGVkZ2UyLnN1YlZlY3RvcnMoIGMsIGEgKTtcblx0XHRcdG5vcm1hbC5jcm9zc1ZlY3RvcnMoIGVkZ2UxLCBlZGdlMiApO1xuXG5cdFx0XHQvLyBTb2x2ZSBRICsgdCpEID0gYjEqRTEgKyBiMipFMiAoUSA9IGtEaWZmLCBEID0gcmF5IGRpcmVjdGlvbixcblx0XHRcdC8vIEUxID0ga0VkZ2UxLCBFMiA9IGtFZGdlMiwgTiA9IENyb3NzKEUxLEUyKSkgYnlcblx0XHRcdC8vICAgfERvdChELE4pfCpiMSA9IHNpZ24oRG90KEQsTikpKkRvdChELENyb3NzKFEsRTIpKVxuXHRcdFx0Ly8gICB8RG90KEQsTil8KmIyID0gc2lnbihEb3QoRCxOKSkqRG90KEQsQ3Jvc3MoRTEsUSkpXG5cdFx0XHQvLyAgIHxEb3QoRCxOKXwqdCA9IC1zaWduKERvdChELE4pKSpEb3QoUSxOKVxuXHRcdFx0dmFyIERkTiA9IHRoaXMuZGlyZWN0aW9uLmRvdCggbm9ybWFsICk7XG5cdFx0XHR2YXIgc2lnbjtcblxuXHRcdFx0aWYgKCBEZE4gPiAwICkge1xuXG5cdFx0XHRcdGlmICggYmFja2ZhY2VDdWxsaW5nICkgcmV0dXJuIG51bGw7XG5cdFx0XHRcdHNpZ24gPSAxO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBEZE4gPCAwICkge1xuXG5cdFx0XHRcdHNpZ24gPSAtIDE7XG5cdFx0XHRcdERkTiA9IC0gRGROO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHJldHVybiBudWxsO1xuXG5cdFx0XHR9XG5cblx0XHRcdGRpZmYuc3ViVmVjdG9ycyggdGhpcy5vcmlnaW4sIGEgKTtcblx0XHRcdHZhciBEZFF4RTIgPSBzaWduICogdGhpcy5kaXJlY3Rpb24uZG90KCBlZGdlMi5jcm9zc1ZlY3RvcnMoIGRpZmYsIGVkZ2UyICkgKTtcblxuXHRcdFx0Ly8gYjEgPCAwLCBubyBpbnRlcnNlY3Rpb25cblx0XHRcdGlmICggRGRReEUyIDwgMCApIHtcblxuXHRcdFx0XHRyZXR1cm4gbnVsbDtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgRGRFMXhRID0gc2lnbiAqIHRoaXMuZGlyZWN0aW9uLmRvdCggZWRnZTEuY3Jvc3MoIGRpZmYgKSApO1xuXG5cdFx0XHQvLyBiMiA8IDAsIG5vIGludGVyc2VjdGlvblxuXHRcdFx0aWYgKCBEZEUxeFEgPCAwICkge1xuXG5cdFx0XHRcdHJldHVybiBudWxsO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIGIxK2IyID4gMSwgbm8gaW50ZXJzZWN0aW9uXG5cdFx0XHRpZiAoIERkUXhFMiArIERkRTF4USA+IERkTiApIHtcblxuXHRcdFx0XHRyZXR1cm4gbnVsbDtcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBMaW5lIGludGVyc2VjdHMgdHJpYW5nbGUsIGNoZWNrIGlmIHJheSBkb2VzLlxuXHRcdFx0dmFyIFFkTiA9IC0gc2lnbiAqIGRpZmYuZG90KCBub3JtYWwgKTtcblxuXHRcdFx0Ly8gdCA8IDAsIG5vIGludGVyc2VjdGlvblxuXHRcdFx0aWYgKCBRZE4gPCAwICkge1xuXG5cdFx0XHRcdHJldHVybiBudWxsO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIFJheSBpbnRlcnNlY3RzIHRyaWFuZ2xlLlxuXHRcdFx0cmV0dXJuIHRoaXMuYXQoIFFkTiAvIERkTiwgdGFyZ2V0ICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRhcHBseU1hdHJpeDQ6IGZ1bmN0aW9uICggbWF0cml4NCApIHtcblxuXHRcdHRoaXMub3JpZ2luLmFwcGx5TWF0cml4NCggbWF0cml4NCApO1xuXHRcdHRoaXMuZGlyZWN0aW9uLnRyYW5zZm9ybURpcmVjdGlvbiggbWF0cml4NCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRlcXVhbHM6IGZ1bmN0aW9uICggcmF5ICkge1xuXG5cdFx0cmV0dXJuIHJheS5vcmlnaW4uZXF1YWxzKCB0aGlzLm9yaWdpbiApICYmIHJheS5kaXJlY3Rpb24uZXF1YWxzKCB0aGlzLmRpcmVjdGlvbiApO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgYmhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW9cbiAqL1xuXG5mdW5jdGlvbiBMaW5lMyggc3RhcnQsIGVuZCApIHtcblxuXHR0aGlzLnN0YXJ0ID0gKCBzdGFydCAhPT0gdW5kZWZpbmVkICkgPyBzdGFydCA6IG5ldyBWZWN0b3IzKCk7XG5cdHRoaXMuZW5kID0gKCBlbmQgIT09IHVuZGVmaW5lZCApID8gZW5kIDogbmV3IFZlY3RvcjMoKTtcblxufVxuXG5PYmplY3QuYXNzaWduKCBMaW5lMy5wcm90b3R5cGUsIHtcblxuXHRzZXQ6IGZ1bmN0aW9uICggc3RhcnQsIGVuZCApIHtcblxuXHRcdHRoaXMuc3RhcnQuY29weSggc3RhcnQgKTtcblx0XHR0aGlzLmVuZC5jb3B5KCBlbmQgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggbGluZSApIHtcblxuXHRcdHRoaXMuc3RhcnQuY29weSggbGluZS5zdGFydCApO1xuXHRcdHRoaXMuZW5kLmNvcHkoIGxpbmUuZW5kICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGdldENlbnRlcjogZnVuY3Rpb24gKCB0YXJnZXQgKSB7XG5cblx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5MaW5lMzogLmdldENlbnRlcigpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHR0YXJnZXQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRhcmdldC5hZGRWZWN0b3JzKCB0aGlzLnN0YXJ0LCB0aGlzLmVuZCApLm11bHRpcGx5U2NhbGFyKCAwLjUgKTtcblxuXHR9LFxuXG5cdGRlbHRhOiBmdW5jdGlvbiAoIHRhcmdldCApIHtcblxuXHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxpbmUzOiAuZGVsdGEoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApO1xuXHRcdFx0dGFyZ2V0ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0YXJnZXQuc3ViVmVjdG9ycyggdGhpcy5lbmQsIHRoaXMuc3RhcnQgKTtcblxuXHR9LFxuXG5cdGRpc3RhbmNlU3E6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLnN0YXJ0LmRpc3RhbmNlVG9TcXVhcmVkKCB0aGlzLmVuZCApO1xuXG5cdH0sXG5cblx0ZGlzdGFuY2U6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLnN0YXJ0LmRpc3RhbmNlVG8oIHRoaXMuZW5kICk7XG5cblx0fSxcblxuXHRhdDogZnVuY3Rpb24gKCB0LCB0YXJnZXQgKSB7XG5cblx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5MaW5lMzogLmF0KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5kZWx0YSggdGFyZ2V0ICkubXVsdGlwbHlTY2FsYXIoIHQgKS5hZGQoIHRoaXMuc3RhcnQgKTtcblxuXHR9LFxuXG5cdGNsb3Nlc3RQb2ludFRvUG9pbnRQYXJhbWV0ZXI6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBzdGFydFAgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciBzdGFydEVuZCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gY2xvc2VzdFBvaW50VG9Qb2ludFBhcmFtZXRlciggcG9pbnQsIGNsYW1wVG9MaW5lICkge1xuXG5cdFx0XHRzdGFydFAuc3ViVmVjdG9ycyggcG9pbnQsIHRoaXMuc3RhcnQgKTtcblx0XHRcdHN0YXJ0RW5kLnN1YlZlY3RvcnMoIHRoaXMuZW5kLCB0aGlzLnN0YXJ0ICk7XG5cblx0XHRcdHZhciBzdGFydEVuZDIgPSBzdGFydEVuZC5kb3QoIHN0YXJ0RW5kICk7XG5cdFx0XHR2YXIgc3RhcnRFbmRfc3RhcnRQID0gc3RhcnRFbmQuZG90KCBzdGFydFAgKTtcblxuXHRcdFx0dmFyIHQgPSBzdGFydEVuZF9zdGFydFAgLyBzdGFydEVuZDI7XG5cblx0XHRcdGlmICggY2xhbXBUb0xpbmUgKSB7XG5cblx0XHRcdFx0dCA9IF9NYXRoLmNsYW1wKCB0LCAwLCAxICk7XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHQ7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRjbG9zZXN0UG9pbnRUb1BvaW50OiBmdW5jdGlvbiAoIHBvaW50LCBjbGFtcFRvTGluZSwgdGFyZ2V0ICkge1xuXG5cdFx0dmFyIHQgPSB0aGlzLmNsb3Nlc3RQb2ludFRvUG9pbnRQYXJhbWV0ZXIoIHBvaW50LCBjbGFtcFRvTGluZSApO1xuXG5cdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTGluZTM6IC5jbG9zZXN0UG9pbnRUb1BvaW50KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5kZWx0YSggdGFyZ2V0ICkubXVsdGlwbHlTY2FsYXIoIHQgKS5hZGQoIHRoaXMuc3RhcnQgKTtcblxuXHR9LFxuXG5cdGFwcGx5TWF0cml4NDogZnVuY3Rpb24gKCBtYXRyaXggKSB7XG5cblx0XHR0aGlzLnN0YXJ0LmFwcGx5TWF0cml4NCggbWF0cml4ICk7XG5cdFx0dGhpcy5lbmQuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZXF1YWxzOiBmdW5jdGlvbiAoIGxpbmUgKSB7XG5cblx0XHRyZXR1cm4gbGluZS5zdGFydC5lcXVhbHMoIHRoaXMuc3RhcnQgKSAmJiBsaW5lLmVuZC5lcXVhbHMoIHRoaXMuZW5kICk7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBiaG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pb1xuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBUcmlhbmdsZSggYSwgYiwgYyApIHtcblxuXHR0aGlzLmEgPSAoIGEgIT09IHVuZGVmaW5lZCApID8gYSA6IG5ldyBWZWN0b3IzKCk7XG5cdHRoaXMuYiA9ICggYiAhPT0gdW5kZWZpbmVkICkgPyBiIDogbmV3IFZlY3RvcjMoKTtcblx0dGhpcy5jID0gKCBjICE9PSB1bmRlZmluZWQgKSA/IGMgOiBuZXcgVmVjdG9yMygpO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIFRyaWFuZ2xlLCB7XG5cblx0Z2V0Tm9ybWFsOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjAgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGdldE5vcm1hbCggYSwgYiwgYywgdGFyZ2V0ICkge1xuXG5cdFx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlRyaWFuZ2xlOiAuZ2V0Tm9ybWFsKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdFx0dGFyZ2V0ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0YXJnZXQuc3ViVmVjdG9ycyggYywgYiApO1xuXHRcdFx0djAuc3ViVmVjdG9ycyggYSwgYiApO1xuXHRcdFx0dGFyZ2V0LmNyb3NzKCB2MCApO1xuXG5cdFx0XHR2YXIgdGFyZ2V0TGVuZ3RoU3EgPSB0YXJnZXQubGVuZ3RoU3EoKTtcblx0XHRcdGlmICggdGFyZ2V0TGVuZ3RoU3EgPiAwICkge1xuXG5cdFx0XHRcdHJldHVybiB0YXJnZXQubXVsdGlwbHlTY2FsYXIoIDEgLyBNYXRoLnNxcnQoIHRhcmdldExlbmd0aFNxICkgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdGFyZ2V0LnNldCggMCwgMCwgMCApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0Ly8gc3RhdGljL2luc3RhbmNlIG1ldGhvZCB0byBjYWxjdWxhdGUgYmFyeWNlbnRyaWMgY29vcmRpbmF0ZXNcblx0Ly8gYmFzZWQgb246IGh0dHA6Ly93d3cuYmxhY2twYXduLmNvbS90ZXh0cy9wb2ludGlucG9seS9kZWZhdWx0Lmh0bWxcblx0Z2V0QmFyeWNvb3JkOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjAgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIHYyID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBnZXRCYXJ5Y29vcmQoIHBvaW50LCBhLCBiLCBjLCB0YXJnZXQgKSB7XG5cblx0XHRcdHYwLnN1YlZlY3RvcnMoIGMsIGEgKTtcblx0XHRcdHYxLnN1YlZlY3RvcnMoIGIsIGEgKTtcblx0XHRcdHYyLnN1YlZlY3RvcnMoIHBvaW50LCBhICk7XG5cblx0XHRcdHZhciBkb3QwMCA9IHYwLmRvdCggdjAgKTtcblx0XHRcdHZhciBkb3QwMSA9IHYwLmRvdCggdjEgKTtcblx0XHRcdHZhciBkb3QwMiA9IHYwLmRvdCggdjIgKTtcblx0XHRcdHZhciBkb3QxMSA9IHYxLmRvdCggdjEgKTtcblx0XHRcdHZhciBkb3QxMiA9IHYxLmRvdCggdjIgKTtcblxuXHRcdFx0dmFyIGRlbm9tID0gKCBkb3QwMCAqIGRvdDExIC0gZG90MDEgKiBkb3QwMSApO1xuXG5cdFx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlRyaWFuZ2xlOiAuZ2V0QmFyeWNvb3JkKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdFx0dGFyZ2V0ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBjb2xsaW5lYXIgb3Igc2luZ3VsYXIgdHJpYW5nbGVcblx0XHRcdGlmICggZGVub20gPT09IDAgKSB7XG5cblx0XHRcdFx0Ly8gYXJiaXRyYXJ5IGxvY2F0aW9uIG91dHNpZGUgb2YgdHJpYW5nbGU/XG5cdFx0XHRcdC8vIG5vdCBzdXJlIGlmIHRoaXMgaXMgdGhlIGJlc3QgaWRlYSwgbWF5YmUgc2hvdWxkIGJlIHJldHVybmluZyB1bmRlZmluZWRcblx0XHRcdFx0cmV0dXJuIHRhcmdldC5zZXQoIC0gMiwgLSAxLCAtIDEgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgaW52RGVub20gPSAxIC8gZGVub207XG5cdFx0XHR2YXIgdSA9ICggZG90MTEgKiBkb3QwMiAtIGRvdDAxICogZG90MTIgKSAqIGludkRlbm9tO1xuXHRcdFx0dmFyIHYgPSAoIGRvdDAwICogZG90MTIgLSBkb3QwMSAqIGRvdDAyICkgKiBpbnZEZW5vbTtcblxuXHRcdFx0Ly8gYmFyeWNlbnRyaWMgY29vcmRpbmF0ZXMgbXVzdCBhbHdheXMgc3VtIHRvIDFcblx0XHRcdHJldHVybiB0YXJnZXQuc2V0KCAxIC0gdSAtIHYsIHYsIHUgKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGNvbnRhaW5zUG9pbnQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gY29udGFpbnNQb2ludCggcG9pbnQsIGEsIGIsIGMgKSB7XG5cblx0XHRcdFRyaWFuZ2xlLmdldEJhcnljb29yZCggcG9pbnQsIGEsIGIsIGMsIHYxICk7XG5cblx0XHRcdHJldHVybiAoIHYxLnggPj0gMCApICYmICggdjEueSA+PSAwICkgJiYgKCAoIHYxLnggKyB2MS55ICkgPD0gMSApO1xuXG5cdFx0fTtcblxuXHR9KClcblxufSApO1xuXG5PYmplY3QuYXNzaWduKCBUcmlhbmdsZS5wcm90b3R5cGUsIHtcblxuXHRzZXQ6IGZ1bmN0aW9uICggYSwgYiwgYyApIHtcblxuXHRcdHRoaXMuYS5jb3B5KCBhICk7XG5cdFx0dGhpcy5iLmNvcHkoIGIgKTtcblx0XHR0aGlzLmMuY29weSggYyApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRGcm9tUG9pbnRzQW5kSW5kaWNlczogZnVuY3Rpb24gKCBwb2ludHMsIGkwLCBpMSwgaTIgKSB7XG5cblx0XHR0aGlzLmEuY29weSggcG9pbnRzWyBpMCBdICk7XG5cdFx0dGhpcy5iLmNvcHkoIHBvaW50c1sgaTEgXSApO1xuXHRcdHRoaXMuYy5jb3B5KCBwb2ludHNbIGkyIF0gKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggdHJpYW5nbGUgKSB7XG5cblx0XHR0aGlzLmEuY29weSggdHJpYW5nbGUuYSApO1xuXHRcdHRoaXMuYi5jb3B5KCB0cmlhbmdsZS5iICk7XG5cdFx0dGhpcy5jLmNvcHkoIHRyaWFuZ2xlLmMgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Z2V0QXJlYTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYwID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGdldEFyZWEoKSB7XG5cblx0XHRcdHYwLnN1YlZlY3RvcnMoIHRoaXMuYywgdGhpcy5iICk7XG5cdFx0XHR2MS5zdWJWZWN0b3JzKCB0aGlzLmEsIHRoaXMuYiApO1xuXG5cdFx0XHRyZXR1cm4gdjAuY3Jvc3MoIHYxICkubGVuZ3RoKCkgKiAwLjU7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRnZXRNaWRwb2ludDogZnVuY3Rpb24gKCB0YXJnZXQgKSB7XG5cblx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5UcmlhbmdsZTogLmdldE1pZHBvaW50KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGFyZ2V0LmFkZFZlY3RvcnMoIHRoaXMuYSwgdGhpcy5iICkuYWRkKCB0aGlzLmMgKS5tdWx0aXBseVNjYWxhciggMSAvIDMgKTtcblxuXHR9LFxuXG5cdGdldE5vcm1hbDogZnVuY3Rpb24gKCB0YXJnZXQgKSB7XG5cblx0XHRyZXR1cm4gVHJpYW5nbGUuZ2V0Tm9ybWFsKCB0aGlzLmEsIHRoaXMuYiwgdGhpcy5jLCB0YXJnZXQgKTtcblxuXHR9LFxuXG5cdGdldFBsYW5lOiBmdW5jdGlvbiAoIHRhcmdldCApIHtcblxuXHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlRyaWFuZ2xlOiAuZ2V0UGxhbmUoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApO1xuXHRcdFx0dGFyZ2V0ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0YXJnZXQuc2V0RnJvbUNvcGxhbmFyUG9pbnRzKCB0aGlzLmEsIHRoaXMuYiwgdGhpcy5jICk7XG5cblx0fSxcblxuXHRnZXRCYXJ5Y29vcmQ6IGZ1bmN0aW9uICggcG9pbnQsIHRhcmdldCApIHtcblxuXHRcdHJldHVybiBUcmlhbmdsZS5nZXRCYXJ5Y29vcmQoIHBvaW50LCB0aGlzLmEsIHRoaXMuYiwgdGhpcy5jLCB0YXJnZXQgKTtcblxuXHR9LFxuXG5cdGNvbnRhaW5zUG9pbnQ6IGZ1bmN0aW9uICggcG9pbnQgKSB7XG5cblx0XHRyZXR1cm4gVHJpYW5nbGUuY29udGFpbnNQb2ludCggcG9pbnQsIHRoaXMuYSwgdGhpcy5iLCB0aGlzLmMgKTtcblxuXHR9LFxuXG5cdGludGVyc2VjdHNCb3g6IGZ1bmN0aW9uICggYm94ICkge1xuXG5cdFx0cmV0dXJuIGJveC5pbnRlcnNlY3RzVHJpYW5nbGUoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNsb3Nlc3RQb2ludFRvUG9pbnQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBwbGFuZSA9IG5ldyBQbGFuZSgpO1xuXHRcdHZhciBlZGdlTGlzdCA9IFsgbmV3IExpbmUzKCksIG5ldyBMaW5lMygpLCBuZXcgTGluZTMoKSBdO1xuXHRcdHZhciBwcm9qZWN0ZWRQb2ludCA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIGNsb3Nlc3RQb2ludCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gY2xvc2VzdFBvaW50VG9Qb2ludCggcG9pbnQsIHRhcmdldCApIHtcblxuXHRcdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5UcmlhbmdsZTogLmNsb3Nlc3RQb2ludFRvUG9pbnQoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApO1xuXHRcdFx0XHR0YXJnZXQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0XHR9XG5cblx0XHRcdHZhciBtaW5EaXN0YW5jZSA9IEluZmluaXR5O1xuXG5cdFx0XHQvLyBwcm9qZWN0IHRoZSBwb2ludCBvbnRvIHRoZSBwbGFuZSBvZiB0aGUgdHJpYW5nbGVcblxuXHRcdFx0cGxhbmUuc2V0RnJvbUNvcGxhbmFyUG9pbnRzKCB0aGlzLmEsIHRoaXMuYiwgdGhpcy5jICk7XG5cdFx0XHRwbGFuZS5wcm9qZWN0UG9pbnQoIHBvaW50LCBwcm9qZWN0ZWRQb2ludCApO1xuXG5cdFx0XHQvLyBjaGVjayBpZiB0aGUgcHJvamVjdGlvbiBsaWVzIHdpdGhpbiB0aGUgdHJpYW5nbGVcblxuXHRcdFx0aWYgKCB0aGlzLmNvbnRhaW5zUG9pbnQoIHByb2plY3RlZFBvaW50ICkgPT09IHRydWUgKSB7XG5cblx0XHRcdFx0Ly8gaWYgc28sIHRoaXMgaXMgdGhlIGNsb3Nlc3QgcG9pbnRcblxuXHRcdFx0XHR0YXJnZXQuY29weSggcHJvamVjdGVkUG9pbnQgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyBpZiBub3QsIHRoZSBwb2ludCBmYWxscyBvdXRzaWRlIHRoZSB0cmlhbmdsZS4gdGhlIHRhcmdldCBpcyB0aGUgY2xvc2VzdCBwb2ludCB0byB0aGUgdHJpYW5nbGUncyBlZGdlcyBvciB2ZXJ0aWNlc1xuXG5cdFx0XHRcdGVkZ2VMaXN0WyAwIF0uc2V0KCB0aGlzLmEsIHRoaXMuYiApO1xuXHRcdFx0XHRlZGdlTGlzdFsgMSBdLnNldCggdGhpcy5iLCB0aGlzLmMgKTtcblx0XHRcdFx0ZWRnZUxpc3RbIDIgXS5zZXQoIHRoaXMuYywgdGhpcy5hICk7XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgZWRnZUxpc3QubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRcdFx0ZWRnZUxpc3RbIGkgXS5jbG9zZXN0UG9pbnRUb1BvaW50KCBwcm9qZWN0ZWRQb2ludCwgdHJ1ZSwgY2xvc2VzdFBvaW50ICk7XG5cblx0XHRcdFx0XHR2YXIgZGlzdGFuY2UgPSBwcm9qZWN0ZWRQb2ludC5kaXN0YW5jZVRvU3F1YXJlZCggY2xvc2VzdFBvaW50ICk7XG5cblx0XHRcdFx0XHRpZiAoIGRpc3RhbmNlIDwgbWluRGlzdGFuY2UgKSB7XG5cblx0XHRcdFx0XHRcdG1pbkRpc3RhbmNlID0gZGlzdGFuY2U7XG5cblx0XHRcdFx0XHRcdHRhcmdldC5jb3B5KCBjbG9zZXN0UG9pbnQgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRhcmdldDtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGVxdWFsczogZnVuY3Rpb24gKCB0cmlhbmdsZSApIHtcblxuXHRcdHJldHVybiB0cmlhbmdsZS5hLmVxdWFscyggdGhpcy5hICkgJiYgdHJpYW5nbGUuYi5lcXVhbHMoIHRoaXMuYiApICYmIHRyaWFuZ2xlLmMuZXF1YWxzKCB0aGlzLmMgKTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3IgbWlrYWVsIGVtdGluZ2VyIC8gaHR0cDovL2dvbW8uc2UvXG4gKiBAYXV0aG9yIGpvbm9icjEgLyBodHRwOi8vam9ub2JyMS5jb20vXG4gKi9cblxuZnVuY3Rpb24gTWVzaCggZ2VvbWV0cnksIG1hdGVyaWFsICkge1xuXG5cdE9iamVjdDNELmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnTWVzaCc7XG5cblx0dGhpcy5nZW9tZXRyeSA9IGdlb21ldHJ5ICE9PSB1bmRlZmluZWQgPyBnZW9tZXRyeSA6IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXHR0aGlzLm1hdGVyaWFsID0gbWF0ZXJpYWwgIT09IHVuZGVmaW5lZCA/IG1hdGVyaWFsIDogbmV3IE1lc2hCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiBNYXRoLnJhbmRvbSgpICogMHhmZmZmZmYgfSApO1xuXG5cdHRoaXMuZHJhd01vZGUgPSBUcmlhbmdsZXNEcmF3TW9kZTtcblxuXHR0aGlzLnVwZGF0ZU1vcnBoVGFyZ2V0cygpO1xuXG59XG5cbk1lc2gucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogTWVzaCxcblxuXHRpc01lc2g6IHRydWUsXG5cblx0c2V0RHJhd01vZGU6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLmRyYXdNb2RlID0gdmFsdWU7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRcdE9iamVjdDNELnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdFx0dGhpcy5kcmF3TW9kZSA9IHNvdXJjZS5kcmF3TW9kZTtcblxuXHRcdGlmICggc291cmNlLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyA9IHNvdXJjZS5tb3JwaFRhcmdldEluZmx1ZW5jZXMuc2xpY2UoKTtcblxuXHRcdH1cblxuXHRcdGlmICggc291cmNlLm1vcnBoVGFyZ2V0RGljdGlvbmFyeSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR0aGlzLm1vcnBoVGFyZ2V0RGljdGlvbmFyeSA9IE9iamVjdC5hc3NpZ24oIHt9LCBzb3VyY2UubW9ycGhUYXJnZXREaWN0aW9uYXJ5ICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHVwZGF0ZU1vcnBoVGFyZ2V0czogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGdlb21ldHJ5ID0gdGhpcy5nZW9tZXRyeTtcblx0XHR2YXIgbSwgbWwsIG5hbWU7XG5cblx0XHRpZiAoIGdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkgKSB7XG5cblx0XHRcdHZhciBtb3JwaEF0dHJpYnV0ZXMgPSBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXM7XG5cdFx0XHR2YXIga2V5cyA9IE9iamVjdC5rZXlzKCBtb3JwaEF0dHJpYnV0ZXMgKTtcblxuXHRcdFx0aWYgKCBrZXlzLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdFx0dmFyIG1vcnBoQXR0cmlidXRlID0gbW9ycGhBdHRyaWJ1dGVzWyBrZXlzWyAwIF0gXTtcblxuXHRcdFx0XHRpZiAoIG1vcnBoQXR0cmlidXRlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHR0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyA9IFtdO1xuXHRcdFx0XHRcdHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5ID0ge307XG5cblx0XHRcdFx0XHRmb3IgKCBtID0gMCwgbWwgPSBtb3JwaEF0dHJpYnV0ZS5sZW5ndGg7IG0gPCBtbDsgbSArKyApIHtcblxuXHRcdFx0XHRcdFx0bmFtZSA9IG1vcnBoQXR0cmlidXRlWyBtIF0ubmFtZSB8fCBTdHJpbmcoIG0gKTtcblxuXHRcdFx0XHRcdFx0dGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXMucHVzaCggMCApO1xuXHRcdFx0XHRcdFx0dGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnlbIG5hbWUgXSA9IG07XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR2YXIgbW9ycGhUYXJnZXRzID0gZ2VvbWV0cnkubW9ycGhUYXJnZXRzO1xuXG5cdFx0XHRpZiAoIG1vcnBoVGFyZ2V0cyAhPT0gdW5kZWZpbmVkICYmIG1vcnBoVGFyZ2V0cy5sZW5ndGggPiAwICkge1xuXG5cdFx0XHRcdHRoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzID0gW107XG5cdFx0XHRcdHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5ID0ge307XG5cblx0XHRcdFx0Zm9yICggbSA9IDAsIG1sID0gbW9ycGhUYXJnZXRzLmxlbmd0aDsgbSA8IG1sOyBtICsrICkge1xuXG5cdFx0XHRcdFx0bmFtZSA9IG1vcnBoVGFyZ2V0c1sgbSBdLm5hbWUgfHwgU3RyaW5nKCBtICk7XG5cblx0XHRcdFx0XHR0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcy5wdXNoKCAwICk7XG5cdFx0XHRcdFx0dGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnlbIG5hbWUgXSA9IG07XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fSxcblxuXHRyYXljYXN0OiAoIGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBpbnZlcnNlTWF0cml4ID0gbmV3IE1hdHJpeDQoKTtcblx0XHR2YXIgcmF5ID0gbmV3IFJheSgpO1xuXHRcdHZhciBzcGhlcmUgPSBuZXcgU3BoZXJlKCk7XG5cblx0XHR2YXIgdkEgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciB2QiA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIHZDID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHZhciB0ZW1wQSA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIHRlbXBCID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgdGVtcEMgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0dmFyIHV2QSA9IG5ldyBWZWN0b3IyKCk7XG5cdFx0dmFyIHV2QiA9IG5ldyBWZWN0b3IyKCk7XG5cdFx0dmFyIHV2QyA9IG5ldyBWZWN0b3IyKCk7XG5cblx0XHR2YXIgYmFyeWNvb3JkID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHZhciBpbnRlcnNlY3Rpb25Qb2ludCA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIGludGVyc2VjdGlvblBvaW50V29ybGQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0ZnVuY3Rpb24gdXZJbnRlcnNlY3Rpb24oIHBvaW50LCBwMSwgcDIsIHAzLCB1djEsIHV2MiwgdXYzICkge1xuXG5cdFx0XHRUcmlhbmdsZS5nZXRCYXJ5Y29vcmQoIHBvaW50LCBwMSwgcDIsIHAzLCBiYXJ5Y29vcmQgKTtcblxuXHRcdFx0dXYxLm11bHRpcGx5U2NhbGFyKCBiYXJ5Y29vcmQueCApO1xuXHRcdFx0dXYyLm11bHRpcGx5U2NhbGFyKCBiYXJ5Y29vcmQueSApO1xuXHRcdFx0dXYzLm11bHRpcGx5U2NhbGFyKCBiYXJ5Y29vcmQueiApO1xuXG5cdFx0XHR1djEuYWRkKCB1djIgKS5hZGQoIHV2MyApO1xuXG5cdFx0XHRyZXR1cm4gdXYxLmNsb25lKCk7XG5cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBjaGVja0ludGVyc2VjdGlvbiggb2JqZWN0LCBtYXRlcmlhbCwgcmF5Y2FzdGVyLCByYXksIHBBLCBwQiwgcEMsIHBvaW50ICkge1xuXG5cdFx0XHR2YXIgaW50ZXJzZWN0O1xuXG5cdFx0XHRpZiAoIG1hdGVyaWFsLnNpZGUgPT09IEJhY2tTaWRlICkge1xuXG5cdFx0XHRcdGludGVyc2VjdCA9IHJheS5pbnRlcnNlY3RUcmlhbmdsZSggcEMsIHBCLCBwQSwgdHJ1ZSwgcG9pbnQgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRpbnRlcnNlY3QgPSByYXkuaW50ZXJzZWN0VHJpYW5nbGUoIHBBLCBwQiwgcEMsIG1hdGVyaWFsLnNpZGUgIT09IERvdWJsZVNpZGUsIHBvaW50ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBpbnRlcnNlY3QgPT09IG51bGwgKSByZXR1cm4gbnVsbDtcblxuXHRcdFx0aW50ZXJzZWN0aW9uUG9pbnRXb3JsZC5jb3B5KCBwb2ludCApO1xuXHRcdFx0aW50ZXJzZWN0aW9uUG9pbnRXb3JsZC5hcHBseU1hdHJpeDQoIG9iamVjdC5tYXRyaXhXb3JsZCApO1xuXG5cdFx0XHR2YXIgZGlzdGFuY2UgPSByYXljYXN0ZXIucmF5Lm9yaWdpbi5kaXN0YW5jZVRvKCBpbnRlcnNlY3Rpb25Qb2ludFdvcmxkICk7XG5cblx0XHRcdGlmICggZGlzdGFuY2UgPCByYXljYXN0ZXIubmVhciB8fCBkaXN0YW5jZSA+IHJheWNhc3Rlci5mYXIgKSByZXR1cm4gbnVsbDtcblxuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0ZGlzdGFuY2U6IGRpc3RhbmNlLFxuXHRcdFx0XHRwb2ludDogaW50ZXJzZWN0aW9uUG9pbnRXb3JsZC5jbG9uZSgpLFxuXHRcdFx0XHRvYmplY3Q6IG9iamVjdFxuXHRcdFx0fTtcblxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIGNoZWNrQnVmZmVyR2VvbWV0cnlJbnRlcnNlY3Rpb24oIG9iamVjdCwgcmF5Y2FzdGVyLCByYXksIHBvc2l0aW9uLCB1diwgYSwgYiwgYyApIHtcblxuXHRcdFx0dkEuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb24sIGEgKTtcblx0XHRcdHZCLmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uLCBiICk7XG5cdFx0XHR2Qy5mcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbiwgYyApO1xuXG5cdFx0XHR2YXIgaW50ZXJzZWN0aW9uID0gY2hlY2tJbnRlcnNlY3Rpb24oIG9iamVjdCwgb2JqZWN0Lm1hdGVyaWFsLCByYXljYXN0ZXIsIHJheSwgdkEsIHZCLCB2QywgaW50ZXJzZWN0aW9uUG9pbnQgKTtcblxuXHRcdFx0aWYgKCBpbnRlcnNlY3Rpb24gKSB7XG5cblx0XHRcdFx0aWYgKCB1diApIHtcblxuXHRcdFx0XHRcdHV2QS5mcm9tQnVmZmVyQXR0cmlidXRlKCB1diwgYSApO1xuXHRcdFx0XHRcdHV2Qi5mcm9tQnVmZmVyQXR0cmlidXRlKCB1diwgYiApO1xuXHRcdFx0XHRcdHV2Qy5mcm9tQnVmZmVyQXR0cmlidXRlKCB1diwgYyApO1xuXG5cdFx0XHRcdFx0aW50ZXJzZWN0aW9uLnV2ID0gdXZJbnRlcnNlY3Rpb24oIGludGVyc2VjdGlvblBvaW50LCB2QSwgdkIsIHZDLCB1dkEsIHV2QiwgdXZDICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHZhciBmYWNlID0gbmV3IEZhY2UzKCBhLCBiLCBjICk7XG5cdFx0XHRcdFRyaWFuZ2xlLmdldE5vcm1hbCggdkEsIHZCLCB2QywgZmFjZS5ub3JtYWwgKTtcblxuXHRcdFx0XHRpbnRlcnNlY3Rpb24uZmFjZSA9IGZhY2U7XG5cdFx0XHRcdGludGVyc2VjdGlvbi5mYWNlSW5kZXggPSBhO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBpbnRlcnNlY3Rpb247XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gcmF5Y2FzdCggcmF5Y2FzdGVyLCBpbnRlcnNlY3RzICkge1xuXG5cdFx0XHR2YXIgZ2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5O1xuXHRcdFx0dmFyIG1hdGVyaWFsID0gdGhpcy5tYXRlcmlhbDtcblx0XHRcdHZhciBtYXRyaXhXb3JsZCA9IHRoaXMubWF0cml4V29ybGQ7XG5cblx0XHRcdGlmICggbWF0ZXJpYWwgPT09IHVuZGVmaW5lZCApIHJldHVybjtcblxuXHRcdFx0Ly8gQ2hlY2tpbmcgYm91bmRpbmdTcGhlcmUgZGlzdGFuY2UgdG8gcmF5XG5cblx0XHRcdGlmICggZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgPT09IG51bGwgKSBnZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtcblxuXHRcdFx0c3BoZXJlLmNvcHkoIGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlICk7XG5cdFx0XHRzcGhlcmUuYXBwbHlNYXRyaXg0KCBtYXRyaXhXb3JsZCApO1xuXG5cdFx0XHRpZiAoIHJheWNhc3Rlci5yYXkuaW50ZXJzZWN0c1NwaGVyZSggc3BoZXJlICkgPT09IGZhbHNlICkgcmV0dXJuO1xuXG5cdFx0XHQvL1xuXG5cdFx0XHRpbnZlcnNlTWF0cml4LmdldEludmVyc2UoIG1hdHJpeFdvcmxkICk7XG5cdFx0XHRyYXkuY29weSggcmF5Y2FzdGVyLnJheSApLmFwcGx5TWF0cml4NCggaW52ZXJzZU1hdHJpeCApO1xuXG5cdFx0XHQvLyBDaGVjayBib3VuZGluZ0JveCBiZWZvcmUgY29udGludWluZ1xuXG5cdFx0XHRpZiAoIGdlb21ldHJ5LmJvdW5kaW5nQm94ICE9PSBudWxsICkge1xuXG5cdFx0XHRcdGlmICggcmF5LmludGVyc2VjdHNCb3goIGdlb21ldHJ5LmJvdW5kaW5nQm94ICkgPT09IGZhbHNlICkgcmV0dXJuO1xuXG5cdFx0XHR9XG5cblx0XHRcdHZhciBpbnRlcnNlY3Rpb247XG5cblx0XHRcdGlmICggZ2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSApIHtcblxuXHRcdFx0XHR2YXIgYSwgYiwgYztcblx0XHRcdFx0dmFyIGluZGV4ID0gZ2VvbWV0cnkuaW5kZXg7XG5cdFx0XHRcdHZhciBwb3NpdGlvbiA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247XG5cdFx0XHRcdHZhciB1diA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMudXY7XG5cdFx0XHRcdHZhciBpLCBsO1xuXG5cdFx0XHRcdGlmICggaW5kZXggIT09IG51bGwgKSB7XG5cblx0XHRcdFx0XHQvLyBpbmRleGVkIGJ1ZmZlciBnZW9tZXRyeVxuXG5cdFx0XHRcdFx0Zm9yICggaSA9IDAsIGwgPSBpbmRleC5jb3VudDsgaSA8IGw7IGkgKz0gMyApIHtcblxuXHRcdFx0XHRcdFx0YSA9IGluZGV4LmdldFgoIGkgKTtcblx0XHRcdFx0XHRcdGIgPSBpbmRleC5nZXRYKCBpICsgMSApO1xuXHRcdFx0XHRcdFx0YyA9IGluZGV4LmdldFgoIGkgKyAyICk7XG5cblx0XHRcdFx0XHRcdGludGVyc2VjdGlvbiA9IGNoZWNrQnVmZmVyR2VvbWV0cnlJbnRlcnNlY3Rpb24oIHRoaXMsIHJheWNhc3RlciwgcmF5LCBwb3NpdGlvbiwgdXYsIGEsIGIsIGMgKTtcblxuXHRcdFx0XHRcdFx0aWYgKCBpbnRlcnNlY3Rpb24gKSB7XG5cblx0XHRcdFx0XHRcdFx0aW50ZXJzZWN0aW9uLmZhY2VJbmRleCA9IE1hdGguZmxvb3IoIGkgLyAzICk7IC8vIHRyaWFuZ2xlIG51bWJlciBpbiBpbmRpY2VzIGJ1ZmZlciBzZW1hbnRpY3Ncblx0XHRcdFx0XHRcdFx0aW50ZXJzZWN0cy5wdXNoKCBpbnRlcnNlY3Rpb24gKTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gZWxzZSBpZiAoIHBvc2l0aW9uICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHQvLyBub24taW5kZXhlZCBidWZmZXIgZ2VvbWV0cnlcblxuXHRcdFx0XHRcdGZvciAoIGkgPSAwLCBsID0gcG9zaXRpb24uY291bnQ7IGkgPCBsOyBpICs9IDMgKSB7XG5cblx0XHRcdFx0XHRcdGEgPSBpO1xuXHRcdFx0XHRcdFx0YiA9IGkgKyAxO1xuXHRcdFx0XHRcdFx0YyA9IGkgKyAyO1xuXG5cdFx0XHRcdFx0XHRpbnRlcnNlY3Rpb24gPSBjaGVja0J1ZmZlckdlb21ldHJ5SW50ZXJzZWN0aW9uKCB0aGlzLCByYXljYXN0ZXIsIHJheSwgcG9zaXRpb24sIHV2LCBhLCBiLCBjICk7XG5cblx0XHRcdFx0XHRcdGlmICggaW50ZXJzZWN0aW9uICkgaW50ZXJzZWN0cy5wdXNoKCBpbnRlcnNlY3Rpb24gKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSBpZiAoIGdlb21ldHJ5LmlzR2VvbWV0cnkgKSB7XG5cblx0XHRcdFx0dmFyIGZ2QSwgZnZCLCBmdkM7XG5cdFx0XHRcdHZhciBpc011bHRpTWF0ZXJpYWwgPSBBcnJheS5pc0FycmF5KCBtYXRlcmlhbCApO1xuXG5cdFx0XHRcdHZhciB2ZXJ0aWNlcyA9IGdlb21ldHJ5LnZlcnRpY2VzO1xuXHRcdFx0XHR2YXIgZmFjZXMgPSBnZW9tZXRyeS5mYWNlcztcblx0XHRcdFx0dmFyIHV2cztcblxuXHRcdFx0XHR2YXIgZmFjZVZlcnRleFV2cyA9IGdlb21ldHJ5LmZhY2VWZXJ0ZXhVdnNbIDAgXTtcblx0XHRcdFx0aWYgKCBmYWNlVmVydGV4VXZzLmxlbmd0aCA+IDAgKSB1dnMgPSBmYWNlVmVydGV4VXZzO1xuXG5cdFx0XHRcdGZvciAoIHZhciBmID0gMCwgZmwgPSBmYWNlcy5sZW5ndGg7IGYgPCBmbDsgZiArKyApIHtcblxuXHRcdFx0XHRcdHZhciBmYWNlID0gZmFjZXNbIGYgXTtcblx0XHRcdFx0XHR2YXIgZmFjZU1hdGVyaWFsID0gaXNNdWx0aU1hdGVyaWFsID8gbWF0ZXJpYWxbIGZhY2UubWF0ZXJpYWxJbmRleCBdIDogbWF0ZXJpYWw7XG5cblx0XHRcdFx0XHRpZiAoIGZhY2VNYXRlcmlhbCA9PT0gdW5kZWZpbmVkICkgY29udGludWU7XG5cblx0XHRcdFx0XHRmdkEgPSB2ZXJ0aWNlc1sgZmFjZS5hIF07XG5cdFx0XHRcdFx0ZnZCID0gdmVydGljZXNbIGZhY2UuYiBdO1xuXHRcdFx0XHRcdGZ2QyA9IHZlcnRpY2VzWyBmYWNlLmMgXTtcblxuXHRcdFx0XHRcdGlmICggZmFjZU1hdGVyaWFsLm1vcnBoVGFyZ2V0cyA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0XHRcdFx0dmFyIG1vcnBoVGFyZ2V0cyA9IGdlb21ldHJ5Lm1vcnBoVGFyZ2V0cztcblx0XHRcdFx0XHRcdHZhciBtb3JwaEluZmx1ZW5jZXMgPSB0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcztcblxuXHRcdFx0XHRcdFx0dkEuc2V0KCAwLCAwLCAwICk7XG5cdFx0XHRcdFx0XHR2Qi5zZXQoIDAsIDAsIDAgKTtcblx0XHRcdFx0XHRcdHZDLnNldCggMCwgMCwgMCApO1xuXG5cdFx0XHRcdFx0XHRmb3IgKCB2YXIgdCA9IDAsIHRsID0gbW9ycGhUYXJnZXRzLmxlbmd0aDsgdCA8IHRsOyB0ICsrICkge1xuXG5cdFx0XHRcdFx0XHRcdHZhciBpbmZsdWVuY2UgPSBtb3JwaEluZmx1ZW5jZXNbIHQgXTtcblxuXHRcdFx0XHRcdFx0XHRpZiAoIGluZmx1ZW5jZSA9PT0gMCApIGNvbnRpbnVlO1xuXG5cdFx0XHRcdFx0XHRcdHZhciB0YXJnZXRzID0gbW9ycGhUYXJnZXRzWyB0IF0udmVydGljZXM7XG5cblx0XHRcdFx0XHRcdFx0dkEuYWRkU2NhbGVkVmVjdG9yKCB0ZW1wQS5zdWJWZWN0b3JzKCB0YXJnZXRzWyBmYWNlLmEgXSwgZnZBICksIGluZmx1ZW5jZSApO1xuXHRcdFx0XHRcdFx0XHR2Qi5hZGRTY2FsZWRWZWN0b3IoIHRlbXBCLnN1YlZlY3RvcnMoIHRhcmdldHNbIGZhY2UuYiBdLCBmdkIgKSwgaW5mbHVlbmNlICk7XG5cdFx0XHRcdFx0XHRcdHZDLmFkZFNjYWxlZFZlY3RvciggdGVtcEMuc3ViVmVjdG9ycyggdGFyZ2V0c1sgZmFjZS5jIF0sIGZ2QyApLCBpbmZsdWVuY2UgKTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHR2QS5hZGQoIGZ2QSApO1xuXHRcdFx0XHRcdFx0dkIuYWRkKCBmdkIgKTtcblx0XHRcdFx0XHRcdHZDLmFkZCggZnZDICk7XG5cblx0XHRcdFx0XHRcdGZ2QSA9IHZBO1xuXHRcdFx0XHRcdFx0ZnZCID0gdkI7XG5cdFx0XHRcdFx0XHRmdkMgPSB2QztcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGludGVyc2VjdGlvbiA9IGNoZWNrSW50ZXJzZWN0aW9uKCB0aGlzLCBmYWNlTWF0ZXJpYWwsIHJheWNhc3RlciwgcmF5LCBmdkEsIGZ2QiwgZnZDLCBpbnRlcnNlY3Rpb25Qb2ludCApO1xuXG5cdFx0XHRcdFx0aWYgKCBpbnRlcnNlY3Rpb24gKSB7XG5cblx0XHRcdFx0XHRcdGlmICggdXZzICYmIHV2c1sgZiBdICkge1xuXG5cdFx0XHRcdFx0XHRcdHZhciB1dnNfZiA9IHV2c1sgZiBdO1xuXHRcdFx0XHRcdFx0XHR1dkEuY29weSggdXZzX2ZbIDAgXSApO1xuXHRcdFx0XHRcdFx0XHR1dkIuY29weSggdXZzX2ZbIDEgXSApO1xuXHRcdFx0XHRcdFx0XHR1dkMuY29weSggdXZzX2ZbIDIgXSApO1xuXG5cdFx0XHRcdFx0XHRcdGludGVyc2VjdGlvbi51diA9IHV2SW50ZXJzZWN0aW9uKCBpbnRlcnNlY3Rpb25Qb2ludCwgZnZBLCBmdkIsIGZ2QywgdXZBLCB1dkIsIHV2QyApO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGludGVyc2VjdGlvbi5mYWNlID0gZmFjZTtcblx0XHRcdFx0XHRcdGludGVyc2VjdGlvbi5mYWNlSW5kZXggPSBmO1xuXHRcdFx0XHRcdFx0aW50ZXJzZWN0cy5wdXNoKCBpbnRlcnNlY3Rpb24gKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH07XG5cblx0fSgpICksXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvciggdGhpcy5nZW9tZXRyeSwgdGhpcy5tYXRlcmlhbCApLmNvcHkoIHRoaXMgKTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIFdlYkdMQmFja2dyb3VuZCggcmVuZGVyZXIsIHN0YXRlLCBnZW9tZXRyaWVzLCBwcmVtdWx0aXBsaWVkQWxwaGEgKSB7XG5cblx0dmFyIGNsZWFyQ29sb3IgPSBuZXcgQ29sb3IoIDB4MDAwMDAwICk7XG5cdHZhciBjbGVhckFscGhhID0gMDtcblxuXHR2YXIgcGxhbmVDYW1lcmEsIHBsYW5lTWVzaDtcblx0dmFyIGJveE1lc2g7XG5cblx0ZnVuY3Rpb24gcmVuZGVyKCByZW5kZXJMaXN0LCBzY2VuZSwgY2FtZXJhLCBmb3JjZUNsZWFyICkge1xuXG5cdFx0dmFyIGJhY2tncm91bmQgPSBzY2VuZS5iYWNrZ3JvdW5kO1xuXG5cdFx0aWYgKCBiYWNrZ3JvdW5kID09PSBudWxsICkge1xuXG5cdFx0XHRzZXRDbGVhciggY2xlYXJDb2xvciwgY2xlYXJBbHBoYSApO1xuXG5cdFx0fSBlbHNlIGlmICggYmFja2dyb3VuZCAmJiBiYWNrZ3JvdW5kLmlzQ29sb3IgKSB7XG5cblx0XHRcdHNldENsZWFyKCBiYWNrZ3JvdW5kLCAxICk7XG5cdFx0XHRmb3JjZUNsZWFyID0gdHJ1ZTtcblxuXHRcdH1cblxuXHRcdGlmICggcmVuZGVyZXIuYXV0b0NsZWFyIHx8IGZvcmNlQ2xlYXIgKSB7XG5cblx0XHRcdHJlbmRlcmVyLmNsZWFyKCByZW5kZXJlci5hdXRvQ2xlYXJDb2xvciwgcmVuZGVyZXIuYXV0b0NsZWFyRGVwdGgsIHJlbmRlcmVyLmF1dG9DbGVhclN0ZW5jaWwgKTtcblxuXHRcdH1cblxuXHRcdGlmICggYmFja2dyb3VuZCAmJiBiYWNrZ3JvdW5kLmlzQ3ViZVRleHR1cmUgKSB7XG5cblx0XHRcdGlmICggYm94TWVzaCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGJveE1lc2ggPSBuZXcgTWVzaChcblx0XHRcdFx0XHRuZXcgQm94QnVmZmVyR2VvbWV0cnkoIDEsIDEsIDEgKSxcblx0XHRcdFx0XHRuZXcgU2hhZGVyTWF0ZXJpYWwoIHtcblx0XHRcdFx0XHRcdHVuaWZvcm1zOiBTaGFkZXJMaWIuY3ViZS51bmlmb3Jtcyxcblx0XHRcdFx0XHRcdHZlcnRleFNoYWRlcjogU2hhZGVyTGliLmN1YmUudmVydGV4U2hhZGVyLFxuXHRcdFx0XHRcdFx0ZnJhZ21lbnRTaGFkZXI6IFNoYWRlckxpYi5jdWJlLmZyYWdtZW50U2hhZGVyLFxuXHRcdFx0XHRcdFx0c2lkZTogQmFja1NpZGUsXG5cdFx0XHRcdFx0XHRkZXB0aFRlc3Q6IHRydWUsXG5cdFx0XHRcdFx0XHRkZXB0aFdyaXRlOiBmYWxzZSxcblx0XHRcdFx0XHRcdGZvZzogZmFsc2Vcblx0XHRcdFx0XHR9IClcblx0XHRcdFx0KTtcblxuXHRcdFx0XHRib3hNZXNoLmdlb21ldHJ5LnJlbW92ZUF0dHJpYnV0ZSggJ25vcm1hbCcgKTtcblx0XHRcdFx0Ym94TWVzaC5nZW9tZXRyeS5yZW1vdmVBdHRyaWJ1dGUoICd1dicgKTtcblxuXHRcdFx0XHRib3hNZXNoLm9uQmVmb3JlUmVuZGVyID0gZnVuY3Rpb24gKCByZW5kZXJlciwgc2NlbmUsIGNhbWVyYSApIHtcblxuXHRcdFx0XHRcdHRoaXMubWF0cml4V29ybGQuY29weVBvc2l0aW9uKCBjYW1lcmEubWF0cml4V29ybGQgKTtcblxuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdGdlb21ldHJpZXMudXBkYXRlKCBib3hNZXNoLmdlb21ldHJ5ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Ym94TWVzaC5tYXRlcmlhbC51bmlmb3Jtcy50Q3ViZS52YWx1ZSA9IGJhY2tncm91bmQ7XG5cblx0XHRcdHJlbmRlckxpc3QucHVzaCggYm94TWVzaCwgYm94TWVzaC5nZW9tZXRyeSwgYm94TWVzaC5tYXRlcmlhbCwgMCwgbnVsbCApO1xuXG5cdFx0fSBlbHNlIGlmICggYmFja2dyb3VuZCAmJiBiYWNrZ3JvdW5kLmlzVGV4dHVyZSApIHtcblxuXHRcdFx0aWYgKCBwbGFuZUNhbWVyYSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHBsYW5lQ2FtZXJhID0gbmV3IE9ydGhvZ3JhcGhpY0NhbWVyYSggLSAxLCAxLCAxLCAtIDEsIDAsIDEgKTtcblxuXHRcdFx0XHRwbGFuZU1lc2ggPSBuZXcgTWVzaChcblx0XHRcdFx0XHRuZXcgUGxhbmVCdWZmZXJHZW9tZXRyeSggMiwgMiApLFxuXHRcdFx0XHRcdG5ldyBNZXNoQmFzaWNNYXRlcmlhbCggeyBkZXB0aFRlc3Q6IGZhbHNlLCBkZXB0aFdyaXRlOiBmYWxzZSwgZm9nOiBmYWxzZSB9IClcblx0XHRcdFx0KTtcblxuXHRcdFx0XHRnZW9tZXRyaWVzLnVwZGF0ZSggcGxhbmVNZXNoLmdlb21ldHJ5ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0cGxhbmVNZXNoLm1hdGVyaWFsLm1hcCA9IGJhY2tncm91bmQ7XG5cblx0XHRcdC8vIFRPRE8gUHVzaCB0aGlzIHRvIHJlbmRlckxpc3RcblxuXHRcdFx0cmVuZGVyZXIucmVuZGVyQnVmZmVyRGlyZWN0KCBwbGFuZUNhbWVyYSwgbnVsbCwgcGxhbmVNZXNoLmdlb21ldHJ5LCBwbGFuZU1lc2gubWF0ZXJpYWwsIHBsYW5lTWVzaCwgbnVsbCApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBzZXRDbGVhciggY29sb3IsIGFscGhhICkge1xuXG5cdFx0c3RhdGUuYnVmZmVycy5jb2xvci5zZXRDbGVhciggY29sb3IuciwgY29sb3IuZywgY29sb3IuYiwgYWxwaGEsIHByZW11bHRpcGxpZWRBbHBoYSApO1xuXG5cdH1cblxuXHRyZXR1cm4ge1xuXG5cdFx0Z2V0Q2xlYXJDb2xvcjogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRyZXR1cm4gY2xlYXJDb2xvcjtcblxuXHRcdH0sXG5cdFx0c2V0Q2xlYXJDb2xvcjogZnVuY3Rpb24gKCBjb2xvciwgYWxwaGEgKSB7XG5cblx0XHRcdGNsZWFyQ29sb3Iuc2V0KCBjb2xvciApO1xuXHRcdFx0Y2xlYXJBbHBoYSA9IGFscGhhICE9PSB1bmRlZmluZWQgPyBhbHBoYSA6IDE7XG5cdFx0XHRzZXRDbGVhciggY2xlYXJDb2xvciwgY2xlYXJBbHBoYSApO1xuXG5cdFx0fSxcblx0XHRnZXRDbGVhckFscGhhOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdHJldHVybiBjbGVhckFscGhhO1xuXG5cdFx0fSxcblx0XHRzZXRDbGVhckFscGhhOiBmdW5jdGlvbiAoIGFscGhhICkge1xuXG5cdFx0XHRjbGVhckFscGhhID0gYWxwaGE7XG5cdFx0XHRzZXRDbGVhciggY2xlYXJDb2xvciwgY2xlYXJBbHBoYSApO1xuXG5cdFx0fSxcblx0XHRyZW5kZXI6IHJlbmRlclxuXG5cdH07XG5cbn1cblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIFdlYkdMQnVmZmVyUmVuZGVyZXIoIGdsLCBleHRlbnNpb25zLCBpbmZvICkge1xuXG5cdHZhciBtb2RlO1xuXG5cdGZ1bmN0aW9uIHNldE1vZGUoIHZhbHVlICkge1xuXG5cdFx0bW9kZSA9IHZhbHVlO1xuXG5cdH1cblxuXHRmdW5jdGlvbiByZW5kZXIoIHN0YXJ0LCBjb3VudCApIHtcblxuXHRcdGdsLmRyYXdBcnJheXMoIG1vZGUsIHN0YXJ0LCBjb3VudCApO1xuXG5cdFx0aW5mby51cGRhdGUoIGNvdW50LCBtb2RlICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlbmRlckluc3RhbmNlcyggZ2VvbWV0cnksIHN0YXJ0LCBjb3VudCApIHtcblxuXHRcdHZhciBleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ0FOR0xFX2luc3RhbmNlZF9hcnJheXMnICk7XG5cblx0XHRpZiAoIGV4dGVuc2lvbiA9PT0gbnVsbCApIHtcblxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdMQnVmZmVyUmVuZGVyZXI6IHVzaW5nIFRIUkVFLkluc3RhbmNlZEJ1ZmZlckdlb21ldHJ5IGJ1dCBoYXJkd2FyZSBkb2VzIG5vdCBzdXBwb3J0IGV4dGVuc2lvbiBBTkdMRV9pbnN0YW5jZWRfYXJyYXlzLicgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdHZhciBwb3NpdGlvbiA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247XG5cblx0XHRpZiAoIHBvc2l0aW9uLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUgKSB7XG5cblx0XHRcdGNvdW50ID0gcG9zaXRpb24uZGF0YS5jb3VudDtcblxuXHRcdFx0ZXh0ZW5zaW9uLmRyYXdBcnJheXNJbnN0YW5jZWRBTkdMRSggbW9kZSwgMCwgY291bnQsIGdlb21ldHJ5Lm1heEluc3RhbmNlZENvdW50ICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRleHRlbnNpb24uZHJhd0FycmF5c0luc3RhbmNlZEFOR0xFKCBtb2RlLCBzdGFydCwgY291bnQsIGdlb21ldHJ5Lm1heEluc3RhbmNlZENvdW50ICk7XG5cblx0XHR9XG5cblx0XHRpbmZvLnVwZGF0ZSggY291bnQsIG1vZGUsIGdlb21ldHJ5Lm1heEluc3RhbmNlZENvdW50ICk7XG5cblx0fVxuXG5cdC8vXG5cblx0dGhpcy5zZXRNb2RlID0gc2V0TW9kZTtcblx0dGhpcy5yZW5kZXIgPSByZW5kZXI7XG5cdHRoaXMucmVuZGVySW5zdGFuY2VzID0gcmVuZGVySW5zdGFuY2VzO1xuXG59XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBXZWJHTENhcGFiaWxpdGllcyggZ2wsIGV4dGVuc2lvbnMsIHBhcmFtZXRlcnMgKSB7XG5cblx0dmFyIG1heEFuaXNvdHJvcHk7XG5cblx0ZnVuY3Rpb24gZ2V0TWF4QW5pc290cm9weSgpIHtcblxuXHRcdGlmICggbWF4QW5pc290cm9weSAhPT0gdW5kZWZpbmVkICkgcmV0dXJuIG1heEFuaXNvdHJvcHk7XG5cblx0XHR2YXIgZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdFWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMnICk7XG5cblx0XHRpZiAoIGV4dGVuc2lvbiAhPT0gbnVsbCApIHtcblxuXHRcdFx0bWF4QW5pc290cm9weSA9IGdsLmdldFBhcmFtZXRlciggZXh0ZW5zaW9uLk1BWF9URVhUVVJFX01BWF9BTklTT1RST1BZX0VYVCApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0bWF4QW5pc290cm9weSA9IDA7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gbWF4QW5pc290cm9weTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gZ2V0TWF4UHJlY2lzaW9uKCBwcmVjaXNpb24gKSB7XG5cblx0XHRpZiAoIHByZWNpc2lvbiA9PT0gJ2hpZ2hwJyApIHtcblxuXHRcdFx0aWYgKCBnbC5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQoIGdsLlZFUlRFWF9TSEFERVIsIGdsLkhJR0hfRkxPQVQgKS5wcmVjaXNpb24gPiAwICYmXG5cdFx0XHQgICAgIGdsLmdldFNoYWRlclByZWNpc2lvbkZvcm1hdCggZ2wuRlJBR01FTlRfU0hBREVSLCBnbC5ISUdIX0ZMT0FUICkucHJlY2lzaW9uID4gMCApIHtcblxuXHRcdFx0XHRyZXR1cm4gJ2hpZ2hwJztcblxuXHRcdFx0fVxuXG5cdFx0XHRwcmVjaXNpb24gPSAnbWVkaXVtcCc7XG5cblx0XHR9XG5cblx0XHRpZiAoIHByZWNpc2lvbiA9PT0gJ21lZGl1bXAnICkge1xuXG5cdFx0XHRpZiAoIGdsLmdldFNoYWRlclByZWNpc2lvbkZvcm1hdCggZ2wuVkVSVEVYX1NIQURFUiwgZ2wuTUVESVVNX0ZMT0FUICkucHJlY2lzaW9uID4gMCAmJlxuXHRcdFx0ICAgICBnbC5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQoIGdsLkZSQUdNRU5UX1NIQURFUiwgZ2wuTUVESVVNX0ZMT0FUICkucHJlY2lzaW9uID4gMCApIHtcblxuXHRcdFx0XHRyZXR1cm4gJ21lZGl1bXAnO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gJ2xvd3AnO1xuXG5cdH1cblxuXHR2YXIgcHJlY2lzaW9uID0gcGFyYW1ldGVycy5wcmVjaXNpb24gIT09IHVuZGVmaW5lZCA/IHBhcmFtZXRlcnMucHJlY2lzaW9uIDogJ2hpZ2hwJztcblx0dmFyIG1heFByZWNpc2lvbiA9IGdldE1heFByZWNpc2lvbiggcHJlY2lzaW9uICk7XG5cblx0aWYgKCBtYXhQcmVjaXNpb24gIT09IHByZWNpc2lvbiApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6JywgcHJlY2lzaW9uLCAnbm90IHN1cHBvcnRlZCwgdXNpbmcnLCBtYXhQcmVjaXNpb24sICdpbnN0ZWFkLicgKTtcblx0XHRwcmVjaXNpb24gPSBtYXhQcmVjaXNpb247XG5cblx0fVxuXG5cdHZhciBsb2dhcml0aG1pY0RlcHRoQnVmZmVyID0gcGFyYW1ldGVycy5sb2dhcml0aG1pY0RlcHRoQnVmZmVyID09PSB0cnVlO1xuXG5cdHZhciBtYXhUZXh0dXJlcyA9IGdsLmdldFBhcmFtZXRlciggZ2wuTUFYX1RFWFRVUkVfSU1BR0VfVU5JVFMgKTtcblx0dmFyIG1heFZlcnRleFRleHR1cmVzID0gZ2wuZ2V0UGFyYW1ldGVyKCBnbC5NQVhfVkVSVEVYX1RFWFRVUkVfSU1BR0VfVU5JVFMgKTtcblx0dmFyIG1heFRleHR1cmVTaXplID0gZ2wuZ2V0UGFyYW1ldGVyKCBnbC5NQVhfVEVYVFVSRV9TSVpFICk7XG5cdHZhciBtYXhDdWJlbWFwU2l6ZSA9IGdsLmdldFBhcmFtZXRlciggZ2wuTUFYX0NVQkVfTUFQX1RFWFRVUkVfU0laRSApO1xuXG5cdHZhciBtYXhBdHRyaWJ1dGVzID0gZ2wuZ2V0UGFyYW1ldGVyKCBnbC5NQVhfVkVSVEVYX0FUVFJJQlMgKTtcblx0dmFyIG1heFZlcnRleFVuaWZvcm1zID0gZ2wuZ2V0UGFyYW1ldGVyKCBnbC5NQVhfVkVSVEVYX1VOSUZPUk1fVkVDVE9SUyApO1xuXHR2YXIgbWF4VmFyeWluZ3MgPSBnbC5nZXRQYXJhbWV0ZXIoIGdsLk1BWF9WQVJZSU5HX1ZFQ1RPUlMgKTtcblx0dmFyIG1heEZyYWdtZW50VW5pZm9ybXMgPSBnbC5nZXRQYXJhbWV0ZXIoIGdsLk1BWF9GUkFHTUVOVF9VTklGT1JNX1ZFQ1RPUlMgKTtcblxuXHR2YXIgdmVydGV4VGV4dHVyZXMgPSBtYXhWZXJ0ZXhUZXh0dXJlcyA+IDA7XG5cdHZhciBmbG9hdEZyYWdtZW50VGV4dHVyZXMgPSAhISBleHRlbnNpb25zLmdldCggJ09FU190ZXh0dXJlX2Zsb2F0JyApO1xuXHR2YXIgZmxvYXRWZXJ0ZXhUZXh0dXJlcyA9IHZlcnRleFRleHR1cmVzICYmIGZsb2F0RnJhZ21lbnRUZXh0dXJlcztcblxuXHRyZXR1cm4ge1xuXG5cdFx0Z2V0TWF4QW5pc290cm9weTogZ2V0TWF4QW5pc290cm9weSxcblx0XHRnZXRNYXhQcmVjaXNpb246IGdldE1heFByZWNpc2lvbixcblxuXHRcdHByZWNpc2lvbjogcHJlY2lzaW9uLFxuXHRcdGxvZ2FyaXRobWljRGVwdGhCdWZmZXI6IGxvZ2FyaXRobWljRGVwdGhCdWZmZXIsXG5cblx0XHRtYXhUZXh0dXJlczogbWF4VGV4dHVyZXMsXG5cdFx0bWF4VmVydGV4VGV4dHVyZXM6IG1heFZlcnRleFRleHR1cmVzLFxuXHRcdG1heFRleHR1cmVTaXplOiBtYXhUZXh0dXJlU2l6ZSxcblx0XHRtYXhDdWJlbWFwU2l6ZTogbWF4Q3ViZW1hcFNpemUsXG5cblx0XHRtYXhBdHRyaWJ1dGVzOiBtYXhBdHRyaWJ1dGVzLFxuXHRcdG1heFZlcnRleFVuaWZvcm1zOiBtYXhWZXJ0ZXhVbmlmb3Jtcyxcblx0XHRtYXhWYXJ5aW5nczogbWF4VmFyeWluZ3MsXG5cdFx0bWF4RnJhZ21lbnRVbmlmb3JtczogbWF4RnJhZ21lbnRVbmlmb3JtcyxcblxuXHRcdHZlcnRleFRleHR1cmVzOiB2ZXJ0ZXhUZXh0dXJlcyxcblx0XHRmbG9hdEZyYWdtZW50VGV4dHVyZXM6IGZsb2F0RnJhZ21lbnRUZXh0dXJlcyxcblx0XHRmbG9hdFZlcnRleFRleHR1cmVzOiBmbG9hdFZlcnRleFRleHR1cmVzXG5cblx0fTtcblxufVxuXG4vKipcbiAqIEBhdXRob3IgdHNjaHdcbiAqL1xuXG5mdW5jdGlvbiBXZWJHTENsaXBwaW5nKCkge1xuXG5cdHZhciBzY29wZSA9IHRoaXMsXG5cblx0XHRnbG9iYWxTdGF0ZSA9IG51bGwsXG5cdFx0bnVtR2xvYmFsUGxhbmVzID0gMCxcblx0XHRsb2NhbENsaXBwaW5nRW5hYmxlZCA9IGZhbHNlLFxuXHRcdHJlbmRlcmluZ1NoYWRvd3MgPSBmYWxzZSxcblxuXHRcdHBsYW5lID0gbmV3IFBsYW5lKCksXG5cdFx0dmlld05vcm1hbE1hdHJpeCA9IG5ldyBNYXRyaXgzKCksXG5cblx0XHR1bmlmb3JtID0geyB2YWx1ZTogbnVsbCwgbmVlZHNVcGRhdGU6IGZhbHNlIH07XG5cblx0dGhpcy51bmlmb3JtID0gdW5pZm9ybTtcblx0dGhpcy5udW1QbGFuZXMgPSAwO1xuXHR0aGlzLm51bUludGVyc2VjdGlvbiA9IDA7XG5cblx0dGhpcy5pbml0ID0gZnVuY3Rpb24gKCBwbGFuZXMsIGVuYWJsZUxvY2FsQ2xpcHBpbmcsIGNhbWVyYSApIHtcblxuXHRcdHZhciBlbmFibGVkID1cblx0XHRcdHBsYW5lcy5sZW5ndGggIT09IDAgfHxcblx0XHRcdGVuYWJsZUxvY2FsQ2xpcHBpbmcgfHxcblx0XHRcdC8vIGVuYWJsZSBzdGF0ZSBvZiBwcmV2aW91cyBmcmFtZSAtIHRoZSBjbGlwcGluZyBjb2RlIGhhcyB0b1xuXHRcdFx0Ly8gcnVuIGFub3RoZXIgZnJhbWUgaW4gb3JkZXIgdG8gcmVzZXQgdGhlIHN0YXRlOlxuXHRcdFx0bnVtR2xvYmFsUGxhbmVzICE9PSAwIHx8XG5cdFx0XHRsb2NhbENsaXBwaW5nRW5hYmxlZDtcblxuXHRcdGxvY2FsQ2xpcHBpbmdFbmFibGVkID0gZW5hYmxlTG9jYWxDbGlwcGluZztcblxuXHRcdGdsb2JhbFN0YXRlID0gcHJvamVjdFBsYW5lcyggcGxhbmVzLCBjYW1lcmEsIDAgKTtcblx0XHRudW1HbG9iYWxQbGFuZXMgPSBwbGFuZXMubGVuZ3RoO1xuXG5cdFx0cmV0dXJuIGVuYWJsZWQ7XG5cblx0fTtcblxuXHR0aGlzLmJlZ2luU2hhZG93cyA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJlbmRlcmluZ1NoYWRvd3MgPSB0cnVlO1xuXHRcdHByb2plY3RQbGFuZXMoIG51bGwgKTtcblxuXHR9O1xuXG5cdHRoaXMuZW5kU2hhZG93cyA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJlbmRlcmluZ1NoYWRvd3MgPSBmYWxzZTtcblx0XHRyZXNldEdsb2JhbFN0YXRlKCk7XG5cblx0fTtcblxuXHR0aGlzLnNldFN0YXRlID0gZnVuY3Rpb24gKCBwbGFuZXMsIGNsaXBJbnRlcnNlY3Rpb24sIGNsaXBTaGFkb3dzLCBjYW1lcmEsIGNhY2hlLCBmcm9tQ2FjaGUgKSB7XG5cblx0XHRpZiAoICEgbG9jYWxDbGlwcGluZ0VuYWJsZWQgfHwgcGxhbmVzID09PSBudWxsIHx8IHBsYW5lcy5sZW5ndGggPT09IDAgfHwgcmVuZGVyaW5nU2hhZG93cyAmJiAhIGNsaXBTaGFkb3dzICkge1xuXG5cdFx0XHQvLyB0aGVyZSdzIG5vIGxvY2FsIGNsaXBwaW5nXG5cblx0XHRcdGlmICggcmVuZGVyaW5nU2hhZG93cyApIHtcblxuXHRcdFx0XHQvLyB0aGVyZSdzIG5vIGdsb2JhbCBjbGlwcGluZ1xuXG5cdFx0XHRcdHByb2plY3RQbGFuZXMoIG51bGwgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRyZXNldEdsb2JhbFN0YXRlKCk7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHZhciBuR2xvYmFsID0gcmVuZGVyaW5nU2hhZG93cyA/IDAgOiBudW1HbG9iYWxQbGFuZXMsXG5cdFx0XHRcdGxHbG9iYWwgPSBuR2xvYmFsICogNCxcblxuXHRcdFx0XHRkc3RBcnJheSA9IGNhY2hlLmNsaXBwaW5nU3RhdGUgfHwgbnVsbDtcblxuXHRcdFx0dW5pZm9ybS52YWx1ZSA9IGRzdEFycmF5OyAvLyBlbnN1cmUgdW5pcXVlIHN0YXRlXG5cblx0XHRcdGRzdEFycmF5ID0gcHJvamVjdFBsYW5lcyggcGxhbmVzLCBjYW1lcmEsIGxHbG9iYWwsIGZyb21DYWNoZSApO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgIT09IGxHbG9iYWw7ICsrIGkgKSB7XG5cblx0XHRcdFx0ZHN0QXJyYXlbIGkgXSA9IGdsb2JhbFN0YXRlWyBpIF07XG5cblx0XHRcdH1cblxuXHRcdFx0Y2FjaGUuY2xpcHBpbmdTdGF0ZSA9IGRzdEFycmF5O1xuXHRcdFx0dGhpcy5udW1JbnRlcnNlY3Rpb24gPSBjbGlwSW50ZXJzZWN0aW9uID8gdGhpcy5udW1QbGFuZXMgOiAwO1xuXHRcdFx0dGhpcy5udW1QbGFuZXMgKz0gbkdsb2JhbDtcblxuXHRcdH1cblxuXG5cdH07XG5cblx0ZnVuY3Rpb24gcmVzZXRHbG9iYWxTdGF0ZSgpIHtcblxuXHRcdGlmICggdW5pZm9ybS52YWx1ZSAhPT0gZ2xvYmFsU3RhdGUgKSB7XG5cblx0XHRcdHVuaWZvcm0udmFsdWUgPSBnbG9iYWxTdGF0ZTtcblx0XHRcdHVuaWZvcm0ubmVlZHNVcGRhdGUgPSBudW1HbG9iYWxQbGFuZXMgPiAwO1xuXG5cdFx0fVxuXG5cdFx0c2NvcGUubnVtUGxhbmVzID0gbnVtR2xvYmFsUGxhbmVzO1xuXHRcdHNjb3BlLm51bUludGVyc2VjdGlvbiA9IDA7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHByb2plY3RQbGFuZXMoIHBsYW5lcywgY2FtZXJhLCBkc3RPZmZzZXQsIHNraXBUcmFuc2Zvcm0gKSB7XG5cblx0XHR2YXIgblBsYW5lcyA9IHBsYW5lcyAhPT0gbnVsbCA/IHBsYW5lcy5sZW5ndGggOiAwLFxuXHRcdFx0ZHN0QXJyYXkgPSBudWxsO1xuXG5cdFx0aWYgKCBuUGxhbmVzICE9PSAwICkge1xuXG5cdFx0XHRkc3RBcnJheSA9IHVuaWZvcm0udmFsdWU7XG5cblx0XHRcdGlmICggc2tpcFRyYW5zZm9ybSAhPT0gdHJ1ZSB8fCBkc3RBcnJheSA9PT0gbnVsbCApIHtcblxuXHRcdFx0XHR2YXIgZmxhdFNpemUgPSBkc3RPZmZzZXQgKyBuUGxhbmVzICogNCxcblx0XHRcdFx0XHR2aWV3TWF0cml4ID0gY2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZTtcblxuXHRcdFx0XHR2aWV3Tm9ybWFsTWF0cml4LmdldE5vcm1hbE1hdHJpeCggdmlld01hdHJpeCApO1xuXG5cdFx0XHRcdGlmICggZHN0QXJyYXkgPT09IG51bGwgfHwgZHN0QXJyYXkubGVuZ3RoIDwgZmxhdFNpemUgKSB7XG5cblx0XHRcdFx0XHRkc3RBcnJheSA9IG5ldyBGbG9hdDMyQXJyYXkoIGZsYXRTaXplICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMCwgaTQgPSBkc3RPZmZzZXQ7IGkgIT09IG5QbGFuZXM7ICsrIGksIGk0ICs9IDQgKSB7XG5cblx0XHRcdFx0XHRwbGFuZS5jb3B5KCBwbGFuZXNbIGkgXSApLmFwcGx5TWF0cml4NCggdmlld01hdHJpeCwgdmlld05vcm1hbE1hdHJpeCApO1xuXG5cdFx0XHRcdFx0cGxhbmUubm9ybWFsLnRvQXJyYXkoIGRzdEFycmF5LCBpNCApO1xuXHRcdFx0XHRcdGRzdEFycmF5WyBpNCArIDMgXSA9IHBsYW5lLmNvbnN0YW50O1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHR1bmlmb3JtLnZhbHVlID0gZHN0QXJyYXk7XG5cdFx0XHR1bmlmb3JtLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdH1cblxuXHRcdHNjb3BlLm51bVBsYW5lcyA9IG5QbGFuZXM7XG5cblx0XHRyZXR1cm4gZHN0QXJyYXk7XG5cblx0fVxuXG59XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBXZWJHTEV4dGVuc2lvbnMoIGdsICkge1xuXG5cdHZhciBleHRlbnNpb25zID0ge307XG5cblx0cmV0dXJuIHtcblxuXHRcdGdldDogZnVuY3Rpb24gKCBuYW1lICkge1xuXG5cdFx0XHRpZiAoIGV4dGVuc2lvbnNbIG5hbWUgXSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHJldHVybiBleHRlbnNpb25zWyBuYW1lIF07XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIGV4dGVuc2lvbjtcblxuXHRcdFx0c3dpdGNoICggbmFtZSApIHtcblxuXHRcdFx0XHRjYXNlICdXRUJHTF9kZXB0aF90ZXh0dXJlJzpcblx0XHRcdFx0XHRleHRlbnNpb24gPSBnbC5nZXRFeHRlbnNpb24oICdXRUJHTF9kZXB0aF90ZXh0dXJlJyApIHx8IGdsLmdldEV4dGVuc2lvbiggJ01PWl9XRUJHTF9kZXB0aF90ZXh0dXJlJyApIHx8IGdsLmdldEV4dGVuc2lvbiggJ1dFQktJVF9XRUJHTF9kZXB0aF90ZXh0dXJlJyApO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgJ0VYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYyc6XG5cdFx0XHRcdFx0ZXh0ZW5zaW9uID0gZ2wuZ2V0RXh0ZW5zaW9uKCAnRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljJyApIHx8IGdsLmdldEV4dGVuc2lvbiggJ01PWl9FWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMnICkgfHwgZ2wuZ2V0RXh0ZW5zaW9uKCAnV0VCS0lUX0VYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYycgKTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlICdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0Yyc6XG5cdFx0XHRcdFx0ZXh0ZW5zaW9uID0gZ2wuZ2V0RXh0ZW5zaW9uKCAnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGMnICkgfHwgZ2wuZ2V0RXh0ZW5zaW9uKCAnTU9aX1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjJyApIHx8IGdsLmdldEV4dGVuc2lvbiggJ1dFQktJVF9XRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0YycgKTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlICdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfcHZydGMnOlxuXHRcdFx0XHRcdGV4dGVuc2lvbiA9IGdsLmdldEV4dGVuc2lvbiggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0YycgKSB8fCBnbC5nZXRFeHRlbnNpb24oICdXRUJLSVRfV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjJyApO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0ZXh0ZW5zaW9uID0gZ2wuZ2V0RXh0ZW5zaW9uKCBuYW1lICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBleHRlbnNpb24gPT09IG51bGwgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogJyArIG5hbWUgKyAnIGV4dGVuc2lvbiBub3Qgc3VwcG9ydGVkLicgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRleHRlbnNpb25zWyBuYW1lIF0gPSBleHRlbnNpb247XG5cblx0XHRcdHJldHVybiBleHRlbnNpb247XG5cblx0XHR9XG5cblx0fTtcblxufVxuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gV2ViR0xHZW9tZXRyaWVzKCBnbCwgYXR0cmlidXRlcywgaW5mbyApIHtcblxuXHR2YXIgZ2VvbWV0cmllcyA9IHt9O1xuXHR2YXIgd2lyZWZyYW1lQXR0cmlidXRlcyA9IHt9O1xuXG5cdGZ1bmN0aW9uIG9uR2VvbWV0cnlEaXNwb3NlKCBldmVudCApIHtcblxuXHRcdHZhciBnZW9tZXRyeSA9IGV2ZW50LnRhcmdldDtcblx0XHR2YXIgYnVmZmVyZ2VvbWV0cnkgPSBnZW9tZXRyaWVzWyBnZW9tZXRyeS5pZCBdO1xuXG5cdFx0aWYgKCBidWZmZXJnZW9tZXRyeS5pbmRleCAhPT0gbnVsbCApIHtcblxuXHRcdFx0YXR0cmlidXRlcy5yZW1vdmUoIGJ1ZmZlcmdlb21ldHJ5LmluZGV4ICk7XG5cblx0XHR9XG5cblx0XHRmb3IgKCB2YXIgbmFtZSBpbiBidWZmZXJnZW9tZXRyeS5hdHRyaWJ1dGVzICkge1xuXG5cdFx0XHRhdHRyaWJ1dGVzLnJlbW92ZSggYnVmZmVyZ2VvbWV0cnkuYXR0cmlidXRlc1sgbmFtZSBdICk7XG5cblx0XHR9XG5cblx0XHRnZW9tZXRyeS5yZW1vdmVFdmVudExpc3RlbmVyKCAnZGlzcG9zZScsIG9uR2VvbWV0cnlEaXNwb3NlICk7XG5cblx0XHRkZWxldGUgZ2VvbWV0cmllc1sgZ2VvbWV0cnkuaWQgXTtcblxuXHRcdC8vIFRPRE8gUmVtb3ZlIGR1cGxpY2F0ZSBjb2RlXG5cblx0XHR2YXIgYXR0cmlidXRlID0gd2lyZWZyYW1lQXR0cmlidXRlc1sgZ2VvbWV0cnkuaWQgXTtcblxuXHRcdGlmICggYXR0cmlidXRlICkge1xuXG5cdFx0XHRhdHRyaWJ1dGVzLnJlbW92ZSggYXR0cmlidXRlICk7XG5cdFx0XHRkZWxldGUgd2lyZWZyYW1lQXR0cmlidXRlc1sgZ2VvbWV0cnkuaWQgXTtcblxuXHRcdH1cblxuXHRcdGF0dHJpYnV0ZSA9IHdpcmVmcmFtZUF0dHJpYnV0ZXNbIGJ1ZmZlcmdlb21ldHJ5LmlkIF07XG5cblx0XHRpZiAoIGF0dHJpYnV0ZSApIHtcblxuXHRcdFx0YXR0cmlidXRlcy5yZW1vdmUoIGF0dHJpYnV0ZSApO1xuXHRcdFx0ZGVsZXRlIHdpcmVmcmFtZUF0dHJpYnV0ZXNbIGJ1ZmZlcmdlb21ldHJ5LmlkIF07XG5cblx0XHR9XG5cblx0XHQvL1xuXG5cdFx0aW5mby5tZW1vcnkuZ2VvbWV0cmllcyAtLTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gZ2V0KCBvYmplY3QsIGdlb21ldHJ5ICkge1xuXG5cdFx0dmFyIGJ1ZmZlcmdlb21ldHJ5ID0gZ2VvbWV0cmllc1sgZ2VvbWV0cnkuaWQgXTtcblxuXHRcdGlmICggYnVmZmVyZ2VvbWV0cnkgKSByZXR1cm4gYnVmZmVyZ2VvbWV0cnk7XG5cblx0XHRnZW9tZXRyeS5hZGRFdmVudExpc3RlbmVyKCAnZGlzcG9zZScsIG9uR2VvbWV0cnlEaXNwb3NlICk7XG5cblx0XHRpZiAoIGdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkgKSB7XG5cblx0XHRcdGJ1ZmZlcmdlb21ldHJ5ID0gZ2VvbWV0cnk7XG5cblx0XHR9IGVsc2UgaWYgKCBnZW9tZXRyeS5pc0dlb21ldHJ5ICkge1xuXG5cdFx0XHRpZiAoIGdlb21ldHJ5Ll9idWZmZXJHZW9tZXRyeSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGdlb21ldHJ5Ll9idWZmZXJHZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpLnNldEZyb21PYmplY3QoIG9iamVjdCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGJ1ZmZlcmdlb21ldHJ5ID0gZ2VvbWV0cnkuX2J1ZmZlckdlb21ldHJ5O1xuXG5cdFx0fVxuXG5cdFx0Z2VvbWV0cmllc1sgZ2VvbWV0cnkuaWQgXSA9IGJ1ZmZlcmdlb21ldHJ5O1xuXG5cdFx0aW5mby5tZW1vcnkuZ2VvbWV0cmllcyArKztcblxuXHRcdHJldHVybiBidWZmZXJnZW9tZXRyeTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gdXBkYXRlKCBnZW9tZXRyeSApIHtcblxuXHRcdHZhciBpbmRleCA9IGdlb21ldHJ5LmluZGV4O1xuXHRcdHZhciBnZW9tZXRyeUF0dHJpYnV0ZXMgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzO1xuXG5cdFx0aWYgKCBpbmRleCAhPT0gbnVsbCApIHtcblxuXHRcdFx0YXR0cmlidXRlcy51cGRhdGUoIGluZGV4LCBnbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiApO1xuXG5cdFx0fVxuXG5cdFx0Zm9yICggdmFyIG5hbWUgaW4gZ2VvbWV0cnlBdHRyaWJ1dGVzICkge1xuXG5cdFx0XHRhdHRyaWJ1dGVzLnVwZGF0ZSggZ2VvbWV0cnlBdHRyaWJ1dGVzWyBuYW1lIF0sIGdsLkFSUkFZX0JVRkZFUiApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gbW9ycGggdGFyZ2V0c1xuXG5cdFx0dmFyIG1vcnBoQXR0cmlidXRlcyA9IGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcztcblxuXHRcdGZvciAoIHZhciBuYW1lIGluIG1vcnBoQXR0cmlidXRlcyApIHtcblxuXHRcdFx0dmFyIGFycmF5ID0gbW9ycGhBdHRyaWJ1dGVzWyBuYW1lIF07XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGFycmF5Lmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0YXR0cmlidXRlcy51cGRhdGUoIGFycmF5WyBpIF0sIGdsLkFSUkFZX0JVRkZFUiApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGdldFdpcmVmcmFtZUF0dHJpYnV0ZSggZ2VvbWV0cnkgKSB7XG5cblx0XHR2YXIgYXR0cmlidXRlID0gd2lyZWZyYW1lQXR0cmlidXRlc1sgZ2VvbWV0cnkuaWQgXTtcblxuXHRcdGlmICggYXR0cmlidXRlICkgcmV0dXJuIGF0dHJpYnV0ZTtcblxuXHRcdHZhciBpbmRpY2VzID0gW107XG5cblx0XHR2YXIgZ2VvbWV0cnlJbmRleCA9IGdlb21ldHJ5LmluZGV4O1xuXHRcdHZhciBnZW9tZXRyeUF0dHJpYnV0ZXMgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzO1xuXG5cdFx0Ly8gY29uc29sZS50aW1lKCAnd2lyZWZyYW1lJyApO1xuXG5cdFx0aWYgKCBnZW9tZXRyeUluZGV4ICE9PSBudWxsICkge1xuXG5cdFx0XHR2YXIgYXJyYXkgPSBnZW9tZXRyeUluZGV4LmFycmF5O1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBhcnJheS5sZW5ndGg7IGkgPCBsOyBpICs9IDMgKSB7XG5cblx0XHRcdFx0dmFyIGEgPSBhcnJheVsgaSArIDAgXTtcblx0XHRcdFx0dmFyIGIgPSBhcnJheVsgaSArIDEgXTtcblx0XHRcdFx0dmFyIGMgPSBhcnJheVsgaSArIDIgXTtcblxuXHRcdFx0XHRpbmRpY2VzLnB1c2goIGEsIGIsIGIsIGMsIGMsIGEgKTtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dmFyIGFycmF5ID0gZ2VvbWV0cnlBdHRyaWJ1dGVzLnBvc2l0aW9uLmFycmF5O1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSAoIGFycmF5Lmxlbmd0aCAvIDMgKSAtIDE7IGkgPCBsOyBpICs9IDMgKSB7XG5cblx0XHRcdFx0dmFyIGEgPSBpICsgMDtcblx0XHRcdFx0dmFyIGIgPSBpICsgMTtcblx0XHRcdFx0dmFyIGMgPSBpICsgMjtcblxuXHRcdFx0XHRpbmRpY2VzLnB1c2goIGEsIGIsIGIsIGMsIGMsIGEgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gY29uc29sZS50aW1lRW5kKCAnd2lyZWZyYW1lJyApO1xuXG5cdFx0YXR0cmlidXRlID0gbmV3ICggYXJyYXlNYXgoIGluZGljZXMgKSA+IDY1NTM1ID8gVWludDMyQnVmZmVyQXR0cmlidXRlIDogVWludDE2QnVmZmVyQXR0cmlidXRlICkoIGluZGljZXMsIDEgKTtcblxuXHRcdGF0dHJpYnV0ZXMudXBkYXRlKCBhdHRyaWJ1dGUsIGdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSICk7XG5cblx0XHR3aXJlZnJhbWVBdHRyaWJ1dGVzWyBnZW9tZXRyeS5pZCBdID0gYXR0cmlidXRlO1xuXG5cdFx0cmV0dXJuIGF0dHJpYnV0ZTtcblxuXHR9XG5cblx0cmV0dXJuIHtcblxuXHRcdGdldDogZ2V0LFxuXHRcdHVwZGF0ZTogdXBkYXRlLFxuXG5cdFx0Z2V0V2lyZWZyYW1lQXR0cmlidXRlOiBnZXRXaXJlZnJhbWVBdHRyaWJ1dGVcblxuXHR9O1xuXG59XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBXZWJHTEluZGV4ZWRCdWZmZXJSZW5kZXJlciggZ2wsIGV4dGVuc2lvbnMsIGluZm8gKSB7XG5cblx0dmFyIG1vZGU7XG5cblx0ZnVuY3Rpb24gc2V0TW9kZSggdmFsdWUgKSB7XG5cblx0XHRtb2RlID0gdmFsdWU7XG5cblx0fVxuXG5cdHZhciB0eXBlLCBieXRlc1BlckVsZW1lbnQ7XG5cblx0ZnVuY3Rpb24gc2V0SW5kZXgoIHZhbHVlICkge1xuXG5cdFx0dHlwZSA9IHZhbHVlLnR5cGU7XG5cdFx0Ynl0ZXNQZXJFbGVtZW50ID0gdmFsdWUuYnl0ZXNQZXJFbGVtZW50O1xuXG5cdH1cblxuXHRmdW5jdGlvbiByZW5kZXIoIHN0YXJ0LCBjb3VudCApIHtcblxuXHRcdGdsLmRyYXdFbGVtZW50cyggbW9kZSwgY291bnQsIHR5cGUsIHN0YXJ0ICogYnl0ZXNQZXJFbGVtZW50ICk7XG5cblx0XHRpbmZvLnVwZGF0ZSggY291bnQsIG1vZGUgKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVuZGVySW5zdGFuY2VzKCBnZW9tZXRyeSwgc3RhcnQsIGNvdW50ICkge1xuXG5cdFx0dmFyIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCAnQU5HTEVfaW5zdGFuY2VkX2FycmF5cycgKTtcblxuXHRcdGlmICggZXh0ZW5zaW9uID09PSBudWxsICkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuV2ViR0xJbmRleGVkQnVmZmVyUmVuZGVyZXI6IHVzaW5nIFRIUkVFLkluc3RhbmNlZEJ1ZmZlckdlb21ldHJ5IGJ1dCBoYXJkd2FyZSBkb2VzIG5vdCBzdXBwb3J0IGV4dGVuc2lvbiBBTkdMRV9pbnN0YW5jZWRfYXJyYXlzLicgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdGV4dGVuc2lvbi5kcmF3RWxlbWVudHNJbnN0YW5jZWRBTkdMRSggbW9kZSwgY291bnQsIHR5cGUsIHN0YXJ0ICogYnl0ZXNQZXJFbGVtZW50LCBnZW9tZXRyeS5tYXhJbnN0YW5jZWRDb3VudCApO1xuXG5cdFx0aW5mby51cGRhdGUoIGNvdW50LCBtb2RlLCBnZW9tZXRyeS5tYXhJbnN0YW5jZWRDb3VudCApO1xuXG5cdH1cblxuXHQvL1xuXG5cdHRoaXMuc2V0TW9kZSA9IHNldE1vZGU7XG5cdHRoaXMuc2V0SW5kZXggPSBzZXRJbmRleDtcblx0dGhpcy5yZW5kZXIgPSByZW5kZXI7XG5cdHRoaXMucmVuZGVySW5zdGFuY2VzID0gcmVuZGVySW5zdGFuY2VzO1xuXG59XG5cbi8qKlxuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqL1xuXG5mdW5jdGlvbiBXZWJHTEluZm8oIGdsICkge1xuXG5cdHZhciBtZW1vcnkgPSB7XG5cdFx0Z2VvbWV0cmllczogMCxcblx0XHR0ZXh0dXJlczogMFxuXHR9O1xuXG5cdHZhciByZW5kZXIgPSB7XG5cdFx0ZnJhbWU6IDAsXG5cdFx0Y2FsbHM6IDAsXG5cdFx0dHJpYW5nbGVzOiAwLFxuXHRcdHBvaW50czogMCxcblx0XHRsaW5lczogMFxuXHR9O1xuXG5cdGZ1bmN0aW9uIHVwZGF0ZSggY291bnQsIG1vZGUsIGluc3RhbmNlQ291bnQgKSB7XG5cblx0XHRpbnN0YW5jZUNvdW50ID0gaW5zdGFuY2VDb3VudCB8fCAxO1xuXG5cdFx0cmVuZGVyLmNhbGxzICsrO1xuXG5cdFx0c3dpdGNoICggbW9kZSApIHtcblxuXHRcdFx0Y2FzZSBnbC5UUklBTkdMRVM6XG5cdFx0XHRcdHJlbmRlci50cmlhbmdsZXMgKz0gaW5zdGFuY2VDb3VudCAqICggY291bnQgLyAzICk7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIGdsLlRSSUFOR0xFX1NUUklQOlxuXHRcdFx0Y2FzZSBnbC5UUklBTkdMRV9GQU46XG5cdFx0XHRcdHJlbmRlci50cmlhbmdsZXMgKz0gaW5zdGFuY2VDb3VudCAqICggY291bnQgLSAyICk7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIGdsLkxJTkVTOlxuXHRcdFx0XHRyZW5kZXIubGluZXMgKz0gaW5zdGFuY2VDb3VudCAqICggY291bnQgLyAyICk7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIGdsLkxJTkVfU1RSSVA6XG5cdFx0XHRcdHJlbmRlci5saW5lcyArPSBpbnN0YW5jZUNvdW50ICogKCBjb3VudCAtIDEgKTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgZ2wuTElORV9MT09QOlxuXHRcdFx0XHRyZW5kZXIubGluZXMgKz0gaW5zdGFuY2VDb3VudCAqIGNvdW50O1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBnbC5QT0lOVFM6XG5cdFx0XHRcdHJlbmRlci5wb2ludHMgKz0gaW5zdGFuY2VDb3VudCAqIGNvdW50O1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdMSW5mbzogVW5rbm93biBkcmF3IG1vZGU6JywgbW9kZSApO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVzZXQoKSB7XG5cblx0XHRyZW5kZXIuZnJhbWUgKys7XG5cdFx0cmVuZGVyLmNhbGxzID0gMDtcblx0XHRyZW5kZXIudHJpYW5nbGVzID0gMDtcblx0XHRyZW5kZXIucG9pbnRzID0gMDtcblx0XHRyZW5kZXIubGluZXMgPSAwO1xuXG5cdH1cblxuXHRyZXR1cm4ge1xuXHRcdG1lbW9yeTogbWVtb3J5LFxuXHRcdHJlbmRlcjogcmVuZGVyLFxuXHRcdHByb2dyYW1zOiBudWxsLFxuXHRcdGF1dG9SZXNldDogdHJ1ZSxcblx0XHRyZXNldDogcmVzZXQsXG5cdFx0dXBkYXRlOiB1cGRhdGVcblx0fTtcblxufVxuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gYWJzTnVtZXJpY2FsU29ydCggYSwgYiApIHtcblxuXHRyZXR1cm4gTWF0aC5hYnMoIGJbIDEgXSApIC0gTWF0aC5hYnMoIGFbIDEgXSApO1xuXG59XG5cbmZ1bmN0aW9uIFdlYkdMTW9ycGh0YXJnZXRzKCBnbCApIHtcblxuXHR2YXIgaW5mbHVlbmNlc0xpc3QgPSB7fTtcblx0dmFyIG1vcnBoSW5mbHVlbmNlcyA9IG5ldyBGbG9hdDMyQXJyYXkoIDggKTtcblxuXHRmdW5jdGlvbiB1cGRhdGUoIG9iamVjdCwgZ2VvbWV0cnksIG1hdGVyaWFsLCBwcm9ncmFtICkge1xuXG5cdFx0dmFyIG9iamVjdEluZmx1ZW5jZXMgPSBvYmplY3QubW9ycGhUYXJnZXRJbmZsdWVuY2VzO1xuXG5cdFx0dmFyIGxlbmd0aCA9IG9iamVjdEluZmx1ZW5jZXMubGVuZ3RoO1xuXG5cdFx0dmFyIGluZmx1ZW5jZXMgPSBpbmZsdWVuY2VzTGlzdFsgZ2VvbWV0cnkuaWQgXTtcblxuXHRcdGlmICggaW5mbHVlbmNlcyA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHQvLyBpbml0aWFsaXNlIGxpc3RcblxuXHRcdFx0aW5mbHVlbmNlcyA9IFtdO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdFx0aW5mbHVlbmNlc1sgaSBdID0gWyBpLCAwIF07XG5cblx0XHRcdH1cblxuXHRcdFx0aW5mbHVlbmNlc0xpc3RbIGdlb21ldHJ5LmlkIF0gPSBpbmZsdWVuY2VzO1xuXG5cdFx0fVxuXG5cdFx0dmFyIG1vcnBoVGFyZ2V0cyA9IG1hdGVyaWFsLm1vcnBoVGFyZ2V0cyAmJiBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb247XG5cdFx0dmFyIG1vcnBoTm9ybWFscyA9IG1hdGVyaWFsLm1vcnBoTm9ybWFscyAmJiBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMubm9ybWFsO1xuXG5cdFx0Ly8gUmVtb3ZlIGN1cnJlbnQgbW9ycGhBdHRyaWJ1dGVzXG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdHZhciBpbmZsdWVuY2UgPSBpbmZsdWVuY2VzWyBpIF07XG5cblx0XHRcdGlmICggaW5mbHVlbmNlWyAxIF0gIT09IDAgKSB7XG5cblx0XHRcdFx0aWYgKCBtb3JwaFRhcmdldHMgKSBnZW9tZXRyeS5yZW1vdmVBdHRyaWJ1dGUoICdtb3JwaFRhcmdldCcgKyBpICk7XG5cdFx0XHRcdGlmICggbW9ycGhOb3JtYWxzICkgZ2VvbWV0cnkucmVtb3ZlQXR0cmlidXRlKCAnbW9ycGhOb3JtYWwnICsgaSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvLyBDb2xsZWN0IGluZmx1ZW5jZXNcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGluZmx1ZW5jZSA9IGluZmx1ZW5jZXNbIGkgXTtcblxuXHRcdFx0aW5mbHVlbmNlWyAwIF0gPSBpO1xuXHRcdFx0aW5mbHVlbmNlWyAxIF0gPSBvYmplY3RJbmZsdWVuY2VzWyBpIF07XG5cblx0XHR9XG5cblx0XHRpbmZsdWVuY2VzLnNvcnQoIGFic051bWVyaWNhbFNvcnQgKTtcblxuXHRcdC8vIEFkZCBtb3JwaEF0dHJpYnV0ZXNcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IDg7IGkgKysgKSB7XG5cblx0XHRcdHZhciBpbmZsdWVuY2UgPSBpbmZsdWVuY2VzWyBpIF07XG5cblx0XHRcdGlmICggaW5mbHVlbmNlICkge1xuXG5cdFx0XHRcdHZhciBpbmRleCA9IGluZmx1ZW5jZVsgMCBdO1xuXHRcdFx0XHR2YXIgdmFsdWUgPSBpbmZsdWVuY2VbIDEgXTtcblxuXHRcdFx0XHRpZiAoIHZhbHVlICkge1xuXG5cdFx0XHRcdFx0aWYgKCBtb3JwaFRhcmdldHMgKSBnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdtb3JwaFRhcmdldCcgKyBpLCBtb3JwaFRhcmdldHNbIGluZGV4IF0gKTtcblx0XHRcdFx0XHRpZiAoIG1vcnBoTm9ybWFscyApIGdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ21vcnBoTm9ybWFsJyArIGksIG1vcnBoTm9ybWFsc1sgaW5kZXggXSApO1xuXG5cdFx0XHRcdFx0bW9ycGhJbmZsdWVuY2VzWyBpIF0gPSB2YWx1ZTtcblx0XHRcdFx0XHRjb250aW51ZTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0bW9ycGhJbmZsdWVuY2VzWyBpIF0gPSAwO1xuXG5cdFx0fVxuXG5cdFx0cHJvZ3JhbS5nZXRVbmlmb3JtcygpLnNldFZhbHVlKCBnbCwgJ21vcnBoVGFyZ2V0SW5mbHVlbmNlcycsIG1vcnBoSW5mbHVlbmNlcyApO1xuXG5cdH1cblxuXHRyZXR1cm4ge1xuXG5cdFx0dXBkYXRlOiB1cGRhdGVcblxuXHR9O1xuXG59XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBXZWJHTE9iamVjdHMoIGdlb21ldHJpZXMsIGluZm8gKSB7XG5cblx0dmFyIHVwZGF0ZUxpc3QgPSB7fTtcblxuXHRmdW5jdGlvbiB1cGRhdGUoIG9iamVjdCApIHtcblxuXHRcdHZhciBmcmFtZSA9IGluZm8ucmVuZGVyLmZyYW1lO1xuXG5cdFx0dmFyIGdlb21ldHJ5ID0gb2JqZWN0Lmdlb21ldHJ5O1xuXHRcdHZhciBidWZmZXJnZW9tZXRyeSA9IGdlb21ldHJpZXMuZ2V0KCBvYmplY3QsIGdlb21ldHJ5ICk7XG5cblx0XHQvLyBVcGRhdGUgb25jZSBwZXIgZnJhbWVcblxuXHRcdGlmICggdXBkYXRlTGlzdFsgYnVmZmVyZ2VvbWV0cnkuaWQgXSAhPT0gZnJhbWUgKSB7XG5cblx0XHRcdGlmICggZ2VvbWV0cnkuaXNHZW9tZXRyeSApIHtcblxuXHRcdFx0XHRidWZmZXJnZW9tZXRyeS51cGRhdGVGcm9tT2JqZWN0KCBvYmplY3QgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRnZW9tZXRyaWVzLnVwZGF0ZSggYnVmZmVyZ2VvbWV0cnkgKTtcblxuXHRcdFx0dXBkYXRlTGlzdFsgYnVmZmVyZ2VvbWV0cnkuaWQgXSA9IGZyYW1lO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGJ1ZmZlcmdlb21ldHJ5O1xuXG5cdH1cblxuXHRmdW5jdGlvbiBkaXNwb3NlKCkge1xuXG5cdFx0dXBkYXRlTGlzdCA9IHt9O1xuXG5cdH1cblxuXHRyZXR1cm4ge1xuXG5cdFx0dXBkYXRlOiB1cGRhdGUsXG5cdFx0ZGlzcG9zZTogZGlzcG9zZVxuXG5cdH07XG5cbn1cblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIEN1YmVUZXh0dXJlKCBpbWFnZXMsIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmlsdGVyLCBtaW5GaWx0ZXIsIGZvcm1hdCwgdHlwZSwgYW5pc290cm9weSwgZW5jb2RpbmcgKSB7XG5cblx0aW1hZ2VzID0gaW1hZ2VzICE9PSB1bmRlZmluZWQgPyBpbWFnZXMgOiBbXTtcblx0bWFwcGluZyA9IG1hcHBpbmcgIT09IHVuZGVmaW5lZCA/IG1hcHBpbmcgOiBDdWJlUmVmbGVjdGlvbk1hcHBpbmc7XG5cblx0VGV4dHVyZS5jYWxsKCB0aGlzLCBpbWFnZXMsIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmlsdGVyLCBtaW5GaWx0ZXIsIGZvcm1hdCwgdHlwZSwgYW5pc290cm9weSwgZW5jb2RpbmcgKTtcblxuXHR0aGlzLmZsaXBZID0gZmFsc2U7XG5cbn1cblxuQ3ViZVRleHR1cmUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggVGV4dHVyZS5wcm90b3R5cGUgKTtcbkN1YmVUZXh0dXJlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEN1YmVUZXh0dXJlO1xuXG5DdWJlVGV4dHVyZS5wcm90b3R5cGUuaXNDdWJlVGV4dHVyZSA9IHRydWU7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eSggQ3ViZVRleHR1cmUucHJvdG90eXBlLCAnaW1hZ2VzJywge1xuXG5cdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuaW1hZ2U7XG5cblx0fSxcblxuXHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLmltYWdlID0gdmFsdWU7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciB0c2Nod1xuICpcbiAqIFVuaWZvcm1zIG9mIGEgcHJvZ3JhbS5cbiAqIFRob3NlIGZvcm0gYSB0cmVlIHN0cnVjdHVyZSB3aXRoIGEgc3BlY2lhbCB0b3AtbGV2ZWwgY29udGFpbmVyIGZvciB0aGUgcm9vdCxcbiAqIHdoaWNoIHlvdSBnZXQgYnkgY2FsbGluZyAnbmV3IFdlYkdMVW5pZm9ybXMoIGdsLCBwcm9ncmFtLCByZW5kZXJlciApJy5cbiAqXG4gKlxuICogUHJvcGVydGllcyBvZiBpbm5lciBub2RlcyBpbmNsdWRpbmcgdGhlIHRvcC1sZXZlbCBjb250YWluZXI6XG4gKlxuICogLnNlcSAtIGFycmF5IG9mIG5lc3RlZCB1bmlmb3Jtc1xuICogLm1hcCAtIG5lc3RlZCB1bmlmb3JtcyBieSBuYW1lXG4gKlxuICpcbiAqIE1ldGhvZHMgb2YgYWxsIG5vZGVzIGV4Y2VwdCB0aGUgdG9wLWxldmVsIGNvbnRhaW5lcjpcbiAqXG4gKiAuc2V0VmFsdWUoIGdsLCB2YWx1ZSwgW3JlbmRlcmVyXSApXG4gKlxuICogXHRcdHVwbG9hZHMgYSB1bmlmb3JtIHZhbHVlKHMpXG4gKiAgXHR0aGUgJ3JlbmRlcmVyJyBwYXJhbWV0ZXIgaXMgbmVlZGVkIGZvciBzYW1wbGVyIHVuaWZvcm1zXG4gKlxuICpcbiAqIFN0YXRpYyBtZXRob2RzIG9mIHRoZSB0b3AtbGV2ZWwgY29udGFpbmVyIChyZW5kZXJlciBmYWN0b3JpemF0aW9ucyk6XG4gKlxuICogLnVwbG9hZCggZ2wsIHNlcSwgdmFsdWVzLCByZW5kZXJlciApXG4gKlxuICogXHRcdHNldHMgdW5pZm9ybXMgaW4gJ3NlcScgdG8gJ3ZhbHVlc1tpZF0udmFsdWUnXG4gKlxuICogLnNlcVdpdGhWYWx1ZSggc2VxLCB2YWx1ZXMgKSA6IGZpbHRlcmVkU2VxXG4gKlxuICogXHRcdGZpbHRlcnMgJ3NlcScgZW50cmllcyB3aXRoIGNvcnJlc3BvbmRpbmcgZW50cnkgaW4gdmFsdWVzXG4gKlxuICpcbiAqIE1ldGhvZHMgb2YgdGhlIHRvcC1sZXZlbCBjb250YWluZXIgKHJlbmRlcmVyIGZhY3Rvcml6YXRpb25zKTpcbiAqXG4gKiAuc2V0VmFsdWUoIGdsLCBuYW1lLCB2YWx1ZSApXG4gKlxuICogXHRcdHNldHMgdW5pZm9ybSB3aXRoICBuYW1lICduYW1lJyB0byAndmFsdWUnXG4gKlxuICogLnNldCggZ2wsIG9iaiwgcHJvcCApXG4gKlxuICogXHRcdHNldHMgdW5pZm9ybSBmcm9tIG9iamVjdCBhbmQgcHJvcGVydHkgd2l0aCBzYW1lIG5hbWUgdGhhbiB1bmlmb3JtXG4gKlxuICogLnNldE9wdGlvbmFsKCBnbCwgb2JqLCBwcm9wIClcbiAqXG4gKiBcdFx0bGlrZSAuc2V0IGZvciBhbiBvcHRpb25hbCBwcm9wZXJ0eSBvZiB0aGUgb2JqZWN0XG4gKlxuICovXG5cbnZhciBlbXB0eVRleHR1cmUgPSBuZXcgVGV4dHVyZSgpO1xudmFyIGVtcHR5Q3ViZVRleHR1cmUgPSBuZXcgQ3ViZVRleHR1cmUoKTtcblxuLy8gLS0tIEJhc2UgZm9yIGlubmVyIG5vZGVzIChpbmNsdWRpbmcgdGhlIHJvb3QpIC0tLVxuXG5mdW5jdGlvbiBVbmlmb3JtQ29udGFpbmVyKCkge1xuXG5cdHRoaXMuc2VxID0gW107XG5cdHRoaXMubWFwID0ge307XG5cbn1cblxuLy8gLS0tIFV0aWxpdGllcyAtLS1cblxuLy8gQXJyYXkgQ2FjaGVzIChwcm92aWRlIHR5cGVkIGFycmF5cyBmb3IgdGVtcG9yYXJ5IGJ5IHNpemUpXG5cbnZhciBhcnJheUNhY2hlRjMyID0gW107XG52YXIgYXJyYXlDYWNoZUkzMiA9IFtdO1xuXG4vLyBGbG9hdDMyQXJyYXkgY2FjaGVzIHVzZWQgZm9yIHVwbG9hZGluZyBNYXRyaXggdW5pZm9ybXNcblxudmFyIG1hdDRhcnJheSA9IG5ldyBGbG9hdDMyQXJyYXkoIDE2ICk7XG52YXIgbWF0M2FycmF5ID0gbmV3IEZsb2F0MzJBcnJheSggOSApO1xuXG4vLyBGbGF0dGVuaW5nIGZvciBhcnJheXMgb2YgdmVjdG9ycyBhbmQgbWF0cmljZXNcblxuZnVuY3Rpb24gZmxhdHRlbiggYXJyYXksIG5CbG9ja3MsIGJsb2NrU2l6ZSApIHtcblxuXHR2YXIgZmlyc3RFbGVtID0gYXJyYXlbIDAgXTtcblxuXHRpZiAoIGZpcnN0RWxlbSA8PSAwIHx8IGZpcnN0RWxlbSA+IDAgKSByZXR1cm4gYXJyYXk7XG5cdC8vIHVub3B0aW1pemVkOiAhIGlzTmFOKCBmaXJzdEVsZW0gKVxuXHQvLyBzZWUgaHR0cDovL2phY2tzb25kdW5zdGFuLmNvbS9hcnRpY2xlcy85ODNcblxuXHR2YXIgbiA9IG5CbG9ja3MgKiBibG9ja1NpemUsXG5cdFx0ciA9IGFycmF5Q2FjaGVGMzJbIG4gXTtcblxuXHRpZiAoIHIgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdHIgPSBuZXcgRmxvYXQzMkFycmF5KCBuICk7XG5cdFx0YXJyYXlDYWNoZUYzMlsgbiBdID0gcjtcblxuXHR9XG5cblx0aWYgKCBuQmxvY2tzICE9PSAwICkge1xuXG5cdFx0Zmlyc3RFbGVtLnRvQXJyYXkoIHIsIDAgKTtcblxuXHRcdGZvciAoIHZhciBpID0gMSwgb2Zmc2V0ID0gMDsgaSAhPT0gbkJsb2NrczsgKysgaSApIHtcblxuXHRcdFx0b2Zmc2V0ICs9IGJsb2NrU2l6ZTtcblx0XHRcdGFycmF5WyBpIF0udG9BcnJheSggciwgb2Zmc2V0ICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdHJldHVybiByO1xuXG59XG5cbi8vIFRleHR1cmUgdW5pdCBhbGxvY2F0aW9uXG5cbmZ1bmN0aW9uIGFsbG9jVGV4VW5pdHMoIHJlbmRlcmVyLCBuICkge1xuXG5cdHZhciByID0gYXJyYXlDYWNoZUkzMlsgbiBdO1xuXG5cdGlmICggciA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0ciA9IG5ldyBJbnQzMkFycmF5KCBuICk7XG5cdFx0YXJyYXlDYWNoZUkzMlsgbiBdID0gcjtcblxuXHR9XG5cblx0Zm9yICggdmFyIGkgPSAwOyBpICE9PSBuOyArKyBpIClcblx0XHRyWyBpIF0gPSByZW5kZXJlci5hbGxvY1RleHR1cmVVbml0KCk7XG5cblx0cmV0dXJuIHI7XG5cbn1cblxuLy8gLS0tIFNldHRlcnMgLS0tXG5cbi8vIE5vdGU6IERlZmluaW5nIHRoZXNlIG1ldGhvZHMgZXh0ZXJuYWxseSwgYmVjYXVzZSB0aGV5IGNvbWUgaW4gYSBidW5jaFxuLy8gYW5kIHRoaXMgd2F5IHRoZWlyIG5hbWVzIG1pbmlmeS5cblxuLy8gU2luZ2xlIHNjYWxhclxuXG5mdW5jdGlvbiBzZXRWYWx1ZTFmKCBnbCwgdiApIHtcblxuXHRnbC51bmlmb3JtMWYoIHRoaXMuYWRkciwgdiApO1xuXG59XG5cbmZ1bmN0aW9uIHNldFZhbHVlMWkoIGdsLCB2ICkge1xuXG5cdGdsLnVuaWZvcm0xaSggdGhpcy5hZGRyLCB2ICk7XG5cbn1cblxuLy8gU2luZ2xlIGZsb2F0IHZlY3RvciAoZnJvbSBmbGF0IGFycmF5IG9yIFRIUkVFLlZlY3Rvck4pXG5cbmZ1bmN0aW9uIHNldFZhbHVlMmZ2KCBnbCwgdiApIHtcblxuXHRpZiAoIHYueCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0Z2wudW5pZm9ybTJmdiggdGhpcy5hZGRyLCB2ICk7XG5cblx0fSBlbHNlIHtcblxuXHRcdGdsLnVuaWZvcm0yZiggdGhpcy5hZGRyLCB2LngsIHYueSApO1xuXG5cdH1cblxufVxuXG5mdW5jdGlvbiBzZXRWYWx1ZTNmdiggZ2wsIHYgKSB7XG5cblx0aWYgKCB2LnggIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdGdsLnVuaWZvcm0zZiggdGhpcy5hZGRyLCB2LngsIHYueSwgdi56ICk7XG5cblx0fSBlbHNlIGlmICggdi5yICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRnbC51bmlmb3JtM2YoIHRoaXMuYWRkciwgdi5yLCB2LmcsIHYuYiApO1xuXG5cdH0gZWxzZSB7XG5cblx0XHRnbC51bmlmb3JtM2Z2KCB0aGlzLmFkZHIsIHYgKTtcblxuXHR9XG5cbn1cblxuZnVuY3Rpb24gc2V0VmFsdWU0ZnYoIGdsLCB2ICkge1xuXG5cdGlmICggdi54ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRnbC51bmlmb3JtNGZ2KCB0aGlzLmFkZHIsIHYgKTtcblxuXHR9IGVsc2Uge1xuXG5cdFx0IGdsLnVuaWZvcm00ZiggdGhpcy5hZGRyLCB2LngsIHYueSwgdi56LCB2LncgKTtcblxuXHR9XG5cbn1cblxuLy8gU2luZ2xlIG1hdHJpeCAoZnJvbSBmbGF0IGFycmF5IG9yIE1hdHJpeE4pXG5cbmZ1bmN0aW9uIHNldFZhbHVlMmZtKCBnbCwgdiApIHtcblxuXHRnbC51bmlmb3JtTWF0cml4MmZ2KCB0aGlzLmFkZHIsIGZhbHNlLCB2LmVsZW1lbnRzIHx8IHYgKTtcblxufVxuXG5mdW5jdGlvbiBzZXRWYWx1ZTNmbSggZ2wsIHYgKSB7XG5cblx0aWYgKCB2LmVsZW1lbnRzID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRnbC51bmlmb3JtTWF0cml4M2Z2KCB0aGlzLmFkZHIsIGZhbHNlLCB2ICk7XG5cblx0fSBlbHNlIHtcblxuXHRcdG1hdDNhcnJheS5zZXQoIHYuZWxlbWVudHMgKTtcblx0XHRnbC51bmlmb3JtTWF0cml4M2Z2KCB0aGlzLmFkZHIsIGZhbHNlLCBtYXQzYXJyYXkgKTtcblxuXHR9XG5cbn1cblxuZnVuY3Rpb24gc2V0VmFsdWU0Zm0oIGdsLCB2ICkge1xuXG5cdGlmICggdi5lbGVtZW50cyA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0Z2wudW5pZm9ybU1hdHJpeDRmdiggdGhpcy5hZGRyLCBmYWxzZSwgdiApO1xuXG5cdH0gZWxzZSB7XG5cblx0XHRtYXQ0YXJyYXkuc2V0KCB2LmVsZW1lbnRzICk7XG5cdFx0Z2wudW5pZm9ybU1hdHJpeDRmdiggdGhpcy5hZGRyLCBmYWxzZSwgbWF0NGFycmF5ICk7XG5cblx0fVxuXG59XG5cbi8vIFNpbmdsZSB0ZXh0dXJlICgyRCAvIEN1YmUpXG5cbmZ1bmN0aW9uIHNldFZhbHVlVDEoIGdsLCB2LCByZW5kZXJlciApIHtcblxuXHR2YXIgdW5pdCA9IHJlbmRlcmVyLmFsbG9jVGV4dHVyZVVuaXQoKTtcblx0Z2wudW5pZm9ybTFpKCB0aGlzLmFkZHIsIHVuaXQgKTtcblx0cmVuZGVyZXIuc2V0VGV4dHVyZTJEKCB2IHx8IGVtcHR5VGV4dHVyZSwgdW5pdCApO1xuXG59XG5cbmZ1bmN0aW9uIHNldFZhbHVlVDYoIGdsLCB2LCByZW5kZXJlciApIHtcblxuXHR2YXIgdW5pdCA9IHJlbmRlcmVyLmFsbG9jVGV4dHVyZVVuaXQoKTtcblx0Z2wudW5pZm9ybTFpKCB0aGlzLmFkZHIsIHVuaXQgKTtcblx0cmVuZGVyZXIuc2V0VGV4dHVyZUN1YmUoIHYgfHwgZW1wdHlDdWJlVGV4dHVyZSwgdW5pdCApO1xuXG59XG5cbi8vIEludGVnZXIgLyBCb29sZWFuIHZlY3RvcnMgb3IgYXJyYXlzIHRoZXJlb2YgKGFsd2F5cyBmbGF0IGFycmF5cylcblxuZnVuY3Rpb24gc2V0VmFsdWUyaXYoIGdsLCB2ICkge1xuXG5cdGdsLnVuaWZvcm0yaXYoIHRoaXMuYWRkciwgdiApO1xuXG59XG5cbmZ1bmN0aW9uIHNldFZhbHVlM2l2KCBnbCwgdiApIHtcblxuXHRnbC51bmlmb3JtM2l2KCB0aGlzLmFkZHIsIHYgKTtcblxufVxuXG5mdW5jdGlvbiBzZXRWYWx1ZTRpdiggZ2wsIHYgKSB7XG5cblx0Z2wudW5pZm9ybTRpdiggdGhpcy5hZGRyLCB2ICk7XG5cbn1cblxuLy8gSGVscGVyIHRvIHBpY2sgdGhlIHJpZ2h0IHNldHRlciBmb3IgdGhlIHNpbmd1bGFyIGNhc2VcblxuZnVuY3Rpb24gZ2V0U2luZ3VsYXJTZXR0ZXIoIHR5cGUgKSB7XG5cblx0c3dpdGNoICggdHlwZSApIHtcblxuXHRcdGNhc2UgMHgxNDA2OiByZXR1cm4gc2V0VmFsdWUxZjsgLy8gRkxPQVRcblx0XHRjYXNlIDB4OGI1MDogcmV0dXJuIHNldFZhbHVlMmZ2OyAvLyBfVkVDMlxuXHRcdGNhc2UgMHg4YjUxOiByZXR1cm4gc2V0VmFsdWUzZnY7IC8vIF9WRUMzXG5cdFx0Y2FzZSAweDhiNTI6IHJldHVybiBzZXRWYWx1ZTRmdjsgLy8gX1ZFQzRcblxuXHRcdGNhc2UgMHg4YjVhOiByZXR1cm4gc2V0VmFsdWUyZm07IC8vIF9NQVQyXG5cdFx0Y2FzZSAweDhiNWI6IHJldHVybiBzZXRWYWx1ZTNmbTsgLy8gX01BVDNcblx0XHRjYXNlIDB4OGI1YzogcmV0dXJuIHNldFZhbHVlNGZtOyAvLyBfTUFUNFxuXG5cdFx0Y2FzZSAweDhiNWU6IGNhc2UgMHg4ZDY2OiByZXR1cm4gc2V0VmFsdWVUMTsgLy8gU0FNUExFUl8yRCwgU0FNUExFUl9FWFRFUk5BTF9PRVNcblx0XHRjYXNlIDB4OGI2MDogcmV0dXJuIHNldFZhbHVlVDY7IC8vIFNBTVBMRVJfQ1VCRVxuXG5cdFx0Y2FzZSAweDE0MDQ6IGNhc2UgMHg4YjU2OiByZXR1cm4gc2V0VmFsdWUxaTsgLy8gSU5ULCBCT09MXG5cdFx0Y2FzZSAweDhiNTM6IGNhc2UgMHg4YjU3OiByZXR1cm4gc2V0VmFsdWUyaXY7IC8vIF9WRUMyXG5cdFx0Y2FzZSAweDhiNTQ6IGNhc2UgMHg4YjU4OiByZXR1cm4gc2V0VmFsdWUzaXY7IC8vIF9WRUMzXG5cdFx0Y2FzZSAweDhiNTU6IGNhc2UgMHg4YjU5OiByZXR1cm4gc2V0VmFsdWU0aXY7IC8vIF9WRUM0XG5cblx0fVxuXG59XG5cbi8vIEFycmF5IG9mIHNjYWxhcnNcblxuZnVuY3Rpb24gc2V0VmFsdWUxZnYoIGdsLCB2ICkge1xuXG5cdGdsLnVuaWZvcm0xZnYoIHRoaXMuYWRkciwgdiApO1xuXG59XG5mdW5jdGlvbiBzZXRWYWx1ZTFpdiggZ2wsIHYgKSB7XG5cblx0Z2wudW5pZm9ybTFpdiggdGhpcy5hZGRyLCB2ICk7XG5cbn1cblxuLy8gQXJyYXkgb2YgdmVjdG9ycyAoZmxhdCBvciBmcm9tIFRIUkVFIGNsYXNzZXMpXG5cbmZ1bmN0aW9uIHNldFZhbHVlVjJhKCBnbCwgdiApIHtcblxuXHRnbC51bmlmb3JtMmZ2KCB0aGlzLmFkZHIsIGZsYXR0ZW4oIHYsIHRoaXMuc2l6ZSwgMiApICk7XG5cbn1cblxuZnVuY3Rpb24gc2V0VmFsdWVWM2EoIGdsLCB2ICkge1xuXG5cdGdsLnVuaWZvcm0zZnYoIHRoaXMuYWRkciwgZmxhdHRlbiggdiwgdGhpcy5zaXplLCAzICkgKTtcblxufVxuXG5mdW5jdGlvbiBzZXRWYWx1ZVY0YSggZ2wsIHYgKSB7XG5cblx0Z2wudW5pZm9ybTRmdiggdGhpcy5hZGRyLCBmbGF0dGVuKCB2LCB0aGlzLnNpemUsIDQgKSApO1xuXG59XG5cbi8vIEFycmF5IG9mIG1hdHJpY2VzIChmbGF0IG9yIGZyb20gVEhSRUUgY2xhc2VzKVxuXG5mdW5jdGlvbiBzZXRWYWx1ZU0yYSggZ2wsIHYgKSB7XG5cblx0Z2wudW5pZm9ybU1hdHJpeDJmdiggdGhpcy5hZGRyLCBmYWxzZSwgZmxhdHRlbiggdiwgdGhpcy5zaXplLCA0ICkgKTtcblxufVxuXG5mdW5jdGlvbiBzZXRWYWx1ZU0zYSggZ2wsIHYgKSB7XG5cblx0Z2wudW5pZm9ybU1hdHJpeDNmdiggdGhpcy5hZGRyLCBmYWxzZSwgZmxhdHRlbiggdiwgdGhpcy5zaXplLCA5ICkgKTtcblxufVxuXG5mdW5jdGlvbiBzZXRWYWx1ZU00YSggZ2wsIHYgKSB7XG5cblx0Z2wudW5pZm9ybU1hdHJpeDRmdiggdGhpcy5hZGRyLCBmYWxzZSwgZmxhdHRlbiggdiwgdGhpcy5zaXplLCAxNiApICk7XG5cbn1cblxuLy8gQXJyYXkgb2YgdGV4dHVyZXMgKDJEIC8gQ3ViZSlcblxuZnVuY3Rpb24gc2V0VmFsdWVUMWEoIGdsLCB2LCByZW5kZXJlciApIHtcblxuXHR2YXIgbiA9IHYubGVuZ3RoLFxuXHRcdHVuaXRzID0gYWxsb2NUZXhVbml0cyggcmVuZGVyZXIsIG4gKTtcblxuXHRnbC51bmlmb3JtMWl2KCB0aGlzLmFkZHIsIHVuaXRzICk7XG5cblx0Zm9yICggdmFyIGkgPSAwOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0cmVuZGVyZXIuc2V0VGV4dHVyZTJEKCB2WyBpIF0gfHwgZW1wdHlUZXh0dXJlLCB1bml0c1sgaSBdICk7XG5cblx0fVxuXG59XG5cbmZ1bmN0aW9uIHNldFZhbHVlVDZhKCBnbCwgdiwgcmVuZGVyZXIgKSB7XG5cblx0dmFyIG4gPSB2Lmxlbmd0aCxcblx0XHR1bml0cyA9IGFsbG9jVGV4VW5pdHMoIHJlbmRlcmVyLCBuICk7XG5cblx0Z2wudW5pZm9ybTFpdiggdGhpcy5hZGRyLCB1bml0cyApO1xuXG5cdGZvciAoIHZhciBpID0gMDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdHJlbmRlcmVyLnNldFRleHR1cmVDdWJlKCB2WyBpIF0gfHwgZW1wdHlDdWJlVGV4dHVyZSwgdW5pdHNbIGkgXSApO1xuXG5cdH1cblxufVxuXG4vLyBIZWxwZXIgdG8gcGljayB0aGUgcmlnaHQgc2V0dGVyIGZvciBhIHB1cmUgKGJvdHRvbS1sZXZlbCkgYXJyYXlcblxuZnVuY3Rpb24gZ2V0UHVyZUFycmF5U2V0dGVyKCB0eXBlICkge1xuXG5cdHN3aXRjaCAoIHR5cGUgKSB7XG5cblx0XHRjYXNlIDB4MTQwNjogcmV0dXJuIHNldFZhbHVlMWZ2OyAvLyBGTE9BVFxuXHRcdGNhc2UgMHg4YjUwOiByZXR1cm4gc2V0VmFsdWVWMmE7IC8vIF9WRUMyXG5cdFx0Y2FzZSAweDhiNTE6IHJldHVybiBzZXRWYWx1ZVYzYTsgLy8gX1ZFQzNcblx0XHRjYXNlIDB4OGI1MjogcmV0dXJuIHNldFZhbHVlVjRhOyAvLyBfVkVDNFxuXG5cdFx0Y2FzZSAweDhiNWE6IHJldHVybiBzZXRWYWx1ZU0yYTsgLy8gX01BVDJcblx0XHRjYXNlIDB4OGI1YjogcmV0dXJuIHNldFZhbHVlTTNhOyAvLyBfTUFUM1xuXHRcdGNhc2UgMHg4YjVjOiByZXR1cm4gc2V0VmFsdWVNNGE7IC8vIF9NQVQ0XG5cblx0XHRjYXNlIDB4OGI1ZTogcmV0dXJuIHNldFZhbHVlVDFhOyAvLyBTQU1QTEVSXzJEXG5cdFx0Y2FzZSAweDhiNjA6IHJldHVybiBzZXRWYWx1ZVQ2YTsgLy8gU0FNUExFUl9DVUJFXG5cblx0XHRjYXNlIDB4MTQwNDogY2FzZSAweDhiNTY6IHJldHVybiBzZXRWYWx1ZTFpdjsgLy8gSU5ULCBCT09MXG5cdFx0Y2FzZSAweDhiNTM6IGNhc2UgMHg4YjU3OiByZXR1cm4gc2V0VmFsdWUyaXY7IC8vIF9WRUMyXG5cdFx0Y2FzZSAweDhiNTQ6IGNhc2UgMHg4YjU4OiByZXR1cm4gc2V0VmFsdWUzaXY7IC8vIF9WRUMzXG5cdFx0Y2FzZSAweDhiNTU6IGNhc2UgMHg4YjU5OiByZXR1cm4gc2V0VmFsdWU0aXY7IC8vIF9WRUM0XG5cblx0fVxuXG59XG5cbi8vIC0tLSBVbmlmb3JtIENsYXNzZXMgLS0tXG5cbmZ1bmN0aW9uIFNpbmdsZVVuaWZvcm0oIGlkLCBhY3RpdmVJbmZvLCBhZGRyICkge1xuXG5cdHRoaXMuaWQgPSBpZDtcblx0dGhpcy5hZGRyID0gYWRkcjtcblx0dGhpcy5zZXRWYWx1ZSA9IGdldFNpbmd1bGFyU2V0dGVyKCBhY3RpdmVJbmZvLnR5cGUgKTtcblxuXHQvLyB0aGlzLnBhdGggPSBhY3RpdmVJbmZvLm5hbWU7IC8vIERFQlVHXG5cbn1cblxuZnVuY3Rpb24gUHVyZUFycmF5VW5pZm9ybSggaWQsIGFjdGl2ZUluZm8sIGFkZHIgKSB7XG5cblx0dGhpcy5pZCA9IGlkO1xuXHR0aGlzLmFkZHIgPSBhZGRyO1xuXHR0aGlzLnNpemUgPSBhY3RpdmVJbmZvLnNpemU7XG5cdHRoaXMuc2V0VmFsdWUgPSBnZXRQdXJlQXJyYXlTZXR0ZXIoIGFjdGl2ZUluZm8udHlwZSApO1xuXG5cdC8vIHRoaXMucGF0aCA9IGFjdGl2ZUluZm8ubmFtZTsgLy8gREVCVUdcblxufVxuXG5mdW5jdGlvbiBTdHJ1Y3R1cmVkVW5pZm9ybSggaWQgKSB7XG5cblx0dGhpcy5pZCA9IGlkO1xuXG5cdFVuaWZvcm1Db250YWluZXIuY2FsbCggdGhpcyApOyAvLyBtaXgtaW5cblxufVxuXG5TdHJ1Y3R1cmVkVW5pZm9ybS5wcm90b3R5cGUuc2V0VmFsdWUgPSBmdW5jdGlvbiAoIGdsLCB2YWx1ZSApIHtcblxuXHQvLyBOb3RlOiBEb24ndCBuZWVkIGFuIGV4dHJhICdyZW5kZXJlcicgcGFyYW1ldGVyLCBzaW5jZSBzYW1wbGVyc1xuXHQvLyBhcmUgbm90IGFsbG93ZWQgaW4gc3RydWN0dXJlZCB1bmlmb3Jtcy5cblxuXHR2YXIgc2VxID0gdGhpcy5zZXE7XG5cblx0Zm9yICggdmFyIGkgPSAwLCBuID0gc2VxLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdHZhciB1ID0gc2VxWyBpIF07XG5cdFx0dS5zZXRWYWx1ZSggZ2wsIHZhbHVlWyB1LmlkIF0gKTtcblxuXHR9XG5cbn07XG5cbi8vIC0tLSBUb3AtbGV2ZWwgLS0tXG5cbi8vIFBhcnNlciAtIGJ1aWxkcyB1cCB0aGUgcHJvcGVydHkgdHJlZSBmcm9tIHRoZSBwYXRoIHN0cmluZ3NcblxudmFyIFJlUGF0aFBhcnQgPSAvKFtcXHdcXGRfXSspKFxcXSk/KFxcW3xcXC4pPy9nO1xuXG4vLyBleHRyYWN0c1xuLy8gXHQtIHRoZSBpZGVudGlmaWVyIChtZW1iZXIgbmFtZSBvciBhcnJheSBpbmRleClcbi8vICAtIGZvbGxvd2VkIGJ5IGFuIG9wdGlvbmFsIHJpZ2h0IGJyYWNrZXQgKGZvdW5kIHdoZW4gYXJyYXkgaW5kZXgpXG4vLyAgLSBmb2xsb3dlZCBieSBhbiBvcHRpb25hbCBsZWZ0IGJyYWNrZXQgb3IgZG90ICh0eXBlIG9mIHN1YnNjcmlwdClcbi8vXG4vLyBOb3RlOiBUaGVzZSBwb3J0aW9ucyBjYW4gYmUgcmVhZCBpbiBhIG5vbi1vdmVybGFwcGluZyBmYXNoaW9uIGFuZFxuLy8gYWxsb3cgc3RyYWlnaHRmb3J3YXJkIHBhcnNpbmcgb2YgdGhlIGhpZXJhcmNoeSB0aGF0IFdlYkdMIGVuY29kZXNcbi8vIGluIHRoZSB1bmlmb3JtIG5hbWVzLlxuXG5mdW5jdGlvbiBhZGRVbmlmb3JtKCBjb250YWluZXIsIHVuaWZvcm1PYmplY3QgKSB7XG5cblx0Y29udGFpbmVyLnNlcS5wdXNoKCB1bmlmb3JtT2JqZWN0ICk7XG5cdGNvbnRhaW5lci5tYXBbIHVuaWZvcm1PYmplY3QuaWQgXSA9IHVuaWZvcm1PYmplY3Q7XG5cbn1cblxuZnVuY3Rpb24gcGFyc2VVbmlmb3JtKCBhY3RpdmVJbmZvLCBhZGRyLCBjb250YWluZXIgKSB7XG5cblx0dmFyIHBhdGggPSBhY3RpdmVJbmZvLm5hbWUsXG5cdFx0cGF0aExlbmd0aCA9IHBhdGgubGVuZ3RoO1xuXG5cdC8vIHJlc2V0IFJlZ0V4cCBvYmplY3QsIGJlY2F1c2Ugb2YgdGhlIGVhcmx5IGV4aXQgb2YgYSBwcmV2aW91cyBydW5cblx0UmVQYXRoUGFydC5sYXN0SW5kZXggPSAwO1xuXG5cdGZvciAoIDsgOyApIHtcblxuXHRcdHZhciBtYXRjaCA9IFJlUGF0aFBhcnQuZXhlYyggcGF0aCApLFxuXHRcdFx0bWF0Y2hFbmQgPSBSZVBhdGhQYXJ0Lmxhc3RJbmRleCxcblxuXHRcdFx0aWQgPSBtYXRjaFsgMSBdLFxuXHRcdFx0aWRJc0luZGV4ID0gbWF0Y2hbIDIgXSA9PT0gJ10nLFxuXHRcdFx0c3Vic2NyaXB0ID0gbWF0Y2hbIDMgXTtcblxuXHRcdGlmICggaWRJc0luZGV4ICkgaWQgPSBpZCB8IDA7IC8vIGNvbnZlcnQgdG8gaW50ZWdlclxuXG5cdFx0aWYgKCBzdWJzY3JpcHQgPT09IHVuZGVmaW5lZCB8fCBzdWJzY3JpcHQgPT09ICdbJyAmJiBtYXRjaEVuZCArIDIgPT09IHBhdGhMZW5ndGggKSB7XG5cblx0XHRcdC8vIGJhcmUgbmFtZSBvciBcInB1cmVcIiBib3R0b20tbGV2ZWwgYXJyYXkgXCJbMF1cIiBzdWZmaXhcblxuXHRcdFx0YWRkVW5pZm9ybSggY29udGFpbmVyLCBzdWJzY3JpcHQgPT09IHVuZGVmaW5lZCA/XG5cdFx0XHRcdG5ldyBTaW5nbGVVbmlmb3JtKCBpZCwgYWN0aXZlSW5mbywgYWRkciApIDpcblx0XHRcdFx0bmV3IFB1cmVBcnJheVVuaWZvcm0oIGlkLCBhY3RpdmVJbmZvLCBhZGRyICkgKTtcblxuXHRcdFx0YnJlYWs7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBzdGVwIGludG8gaW5uZXIgbm9kZSAvIGNyZWF0ZSBpdCBpbiBjYXNlIGl0IGRvZXNuJ3QgZXhpc3RcblxuXHRcdFx0dmFyIG1hcCA9IGNvbnRhaW5lci5tYXAsIG5leHQgPSBtYXBbIGlkIF07XG5cblx0XHRcdGlmICggbmV4dCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdG5leHQgPSBuZXcgU3RydWN0dXJlZFVuaWZvcm0oIGlkICk7XG5cdFx0XHRcdGFkZFVuaWZvcm0oIGNvbnRhaW5lciwgbmV4dCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGNvbnRhaW5lciA9IG5leHQ7XG5cblx0XHR9XG5cblx0fVxuXG59XG5cbi8vIFJvb3QgQ29udGFpbmVyXG5cbmZ1bmN0aW9uIFdlYkdMVW5pZm9ybXMoIGdsLCBwcm9ncmFtLCByZW5kZXJlciApIHtcblxuXHRVbmlmb3JtQ29udGFpbmVyLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnJlbmRlcmVyID0gcmVuZGVyZXI7XG5cblx0dmFyIG4gPSBnbC5nZXRQcm9ncmFtUGFyYW1ldGVyKCBwcm9ncmFtLCBnbC5BQ1RJVkVfVU5JRk9STVMgKTtcblxuXHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBuOyArKyBpICkge1xuXG5cdFx0dmFyIGluZm8gPSBnbC5nZXRBY3RpdmVVbmlmb3JtKCBwcm9ncmFtLCBpICksXG5cdFx0XHRhZGRyID0gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCBpbmZvLm5hbWUgKTtcblxuXHRcdHBhcnNlVW5pZm9ybSggaW5mbywgYWRkciwgdGhpcyApO1xuXG5cdH1cblxufVxuXG5XZWJHTFVuaWZvcm1zLnByb3RvdHlwZS5zZXRWYWx1ZSA9IGZ1bmN0aW9uICggZ2wsIG5hbWUsIHZhbHVlICkge1xuXG5cdHZhciB1ID0gdGhpcy5tYXBbIG5hbWUgXTtcblxuXHRpZiAoIHUgIT09IHVuZGVmaW5lZCApIHUuc2V0VmFsdWUoIGdsLCB2YWx1ZSwgdGhpcy5yZW5kZXJlciApO1xuXG59O1xuXG5XZWJHTFVuaWZvcm1zLnByb3RvdHlwZS5zZXRPcHRpb25hbCA9IGZ1bmN0aW9uICggZ2wsIG9iamVjdCwgbmFtZSApIHtcblxuXHR2YXIgdiA9IG9iamVjdFsgbmFtZSBdO1xuXG5cdGlmICggdiAhPT0gdW5kZWZpbmVkICkgdGhpcy5zZXRWYWx1ZSggZ2wsIG5hbWUsIHYgKTtcblxufTtcblxuXG4vLyBTdGF0aWMgaW50ZXJmYWNlXG5cbldlYkdMVW5pZm9ybXMudXBsb2FkID0gZnVuY3Rpb24gKCBnbCwgc2VxLCB2YWx1ZXMsIHJlbmRlcmVyICkge1xuXG5cdGZvciAoIHZhciBpID0gMCwgbiA9IHNlcS5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHR2YXIgdSA9IHNlcVsgaSBdLFxuXHRcdFx0diA9IHZhbHVlc1sgdS5pZCBdO1xuXG5cdFx0aWYgKCB2Lm5lZWRzVXBkYXRlICE9PSBmYWxzZSApIHtcblxuXHRcdFx0Ly8gbm90ZTogYWx3YXlzIHVwZGF0aW5nIHdoZW4gLm5lZWRzVXBkYXRlIGlzIHVuZGVmaW5lZFxuXHRcdFx0dS5zZXRWYWx1ZSggZ2wsIHYudmFsdWUsIHJlbmRlcmVyICk7XG5cblx0XHR9XG5cblx0fVxuXG59O1xuXG5XZWJHTFVuaWZvcm1zLnNlcVdpdGhWYWx1ZSA9IGZ1bmN0aW9uICggc2VxLCB2YWx1ZXMgKSB7XG5cblx0dmFyIHIgPSBbXTtcblxuXHRmb3IgKCB2YXIgaSA9IDAsIG4gPSBzZXEubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0dmFyIHUgPSBzZXFbIGkgXTtcblx0XHRpZiAoIHUuaWQgaW4gdmFsdWVzICkgci5wdXNoKCB1ICk7XG5cblx0fVxuXG5cdHJldHVybiByO1xuXG59O1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gYWRkTGluZU51bWJlcnMoIHN0cmluZyApIHtcblxuXHR2YXIgbGluZXMgPSBzdHJpbmcuc3BsaXQoICdcXG4nICk7XG5cblx0Zm9yICggdmFyIGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0bGluZXNbIGkgXSA9ICggaSArIDEgKSArICc6ICcgKyBsaW5lc1sgaSBdO1xuXG5cdH1cblxuXHRyZXR1cm4gbGluZXMuam9pbiggJ1xcbicgKTtcblxufVxuXG5mdW5jdGlvbiBXZWJHTFNoYWRlciggZ2wsIHR5cGUsIHN0cmluZyApIHtcblxuXHR2YXIgc2hhZGVyID0gZ2wuY3JlYXRlU2hhZGVyKCB0eXBlICk7XG5cblx0Z2wuc2hhZGVyU291cmNlKCBzaGFkZXIsIHN0cmluZyApO1xuXHRnbC5jb21waWxlU2hhZGVyKCBzaGFkZXIgKTtcblxuXHRpZiAoIGdsLmdldFNoYWRlclBhcmFtZXRlciggc2hhZGVyLCBnbC5DT01QSUxFX1NUQVRVUyApID09PSBmYWxzZSApIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTFNoYWRlcjogU2hhZGVyIGNvdWxkblxcJ3QgY29tcGlsZS4nICk7XG5cblx0fVxuXG5cdGlmICggZ2wuZ2V0U2hhZGVySW5mb0xvZyggc2hhZGVyICkgIT09ICcnICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xTaGFkZXI6IGdsLmdldFNoYWRlckluZm9Mb2coKScsIHR5cGUgPT09IGdsLlZFUlRFWF9TSEFERVIgPyAndmVydGV4JyA6ICdmcmFnbWVudCcsIGdsLmdldFNoYWRlckluZm9Mb2coIHNoYWRlciApLCBhZGRMaW5lTnVtYmVycyggc3RyaW5nICkgKTtcblxuXHR9XG5cblx0Ly8gLS1lbmFibGUtcHJpdmlsZWdlZC13ZWJnbC1leHRlbnNpb25cblx0Ly8gY29uc29sZS5sb2coIHR5cGUsIGdsLmdldEV4dGVuc2lvbiggJ1dFQkdMX2RlYnVnX3NoYWRlcnMnICkuZ2V0VHJhbnNsYXRlZFNoYWRlclNvdXJjZSggc2hhZGVyICkgKTtcblxuXHRyZXR1cm4gc2hhZGVyO1xuXG59XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG52YXIgcHJvZ3JhbUlkQ291bnQgPSAwO1xuXG5mdW5jdGlvbiBnZXRFbmNvZGluZ0NvbXBvbmVudHMoIGVuY29kaW5nICkge1xuXG5cdHN3aXRjaCAoIGVuY29kaW5nICkge1xuXG5cdFx0Y2FzZSBMaW5lYXJFbmNvZGluZzpcblx0XHRcdHJldHVybiBbICdMaW5lYXInLCAnKCB2YWx1ZSApJyBdO1xuXHRcdGNhc2Ugc1JHQkVuY29kaW5nOlxuXHRcdFx0cmV0dXJuIFsgJ3NSR0InLCAnKCB2YWx1ZSApJyBdO1xuXHRcdGNhc2UgUkdCRUVuY29kaW5nOlxuXHRcdFx0cmV0dXJuIFsgJ1JHQkUnLCAnKCB2YWx1ZSApJyBdO1xuXHRcdGNhc2UgUkdCTTdFbmNvZGluZzpcblx0XHRcdHJldHVybiBbICdSR0JNJywgJyggdmFsdWUsIDcuMCApJyBdO1xuXHRcdGNhc2UgUkdCTTE2RW5jb2Rpbmc6XG5cdFx0XHRyZXR1cm4gWyAnUkdCTScsICcoIHZhbHVlLCAxNi4wICknIF07XG5cdFx0Y2FzZSBSR0JERW5jb2Rpbmc6XG5cdFx0XHRyZXR1cm4gWyAnUkdCRCcsICcoIHZhbHVlLCAyNTYuMCApJyBdO1xuXHRcdGNhc2UgR2FtbWFFbmNvZGluZzpcblx0XHRcdHJldHVybiBbICdHYW1tYScsICcoIHZhbHVlLCBmbG9hdCggR0FNTUFfRkFDVE9SICkgKScgXTtcblx0XHRkZWZhdWx0OlxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCAndW5zdXBwb3J0ZWQgZW5jb2Rpbmc6ICcgKyBlbmNvZGluZyApO1xuXG5cdH1cblxufVxuXG5mdW5jdGlvbiBnZXRUZXhlbERlY29kaW5nRnVuY3Rpb24oIGZ1bmN0aW9uTmFtZSwgZW5jb2RpbmcgKSB7XG5cblx0dmFyIGNvbXBvbmVudHMgPSBnZXRFbmNvZGluZ0NvbXBvbmVudHMoIGVuY29kaW5nICk7XG5cdHJldHVybiAndmVjNCAnICsgZnVuY3Rpb25OYW1lICsgJyggdmVjNCB2YWx1ZSApIHsgcmV0dXJuICcgKyBjb21wb25lbnRzWyAwIF0gKyAnVG9MaW5lYXInICsgY29tcG9uZW50c1sgMSBdICsgJzsgfSc7XG5cbn1cblxuZnVuY3Rpb24gZ2V0VGV4ZWxFbmNvZGluZ0Z1bmN0aW9uKCBmdW5jdGlvbk5hbWUsIGVuY29kaW5nICkge1xuXG5cdHZhciBjb21wb25lbnRzID0gZ2V0RW5jb2RpbmdDb21wb25lbnRzKCBlbmNvZGluZyApO1xuXHRyZXR1cm4gJ3ZlYzQgJyArIGZ1bmN0aW9uTmFtZSArICcoIHZlYzQgdmFsdWUgKSB7IHJldHVybiBMaW5lYXJUbycgKyBjb21wb25lbnRzWyAwIF0gKyBjb21wb25lbnRzWyAxIF0gKyAnOyB9JztcblxufVxuXG5mdW5jdGlvbiBnZXRUb25lTWFwcGluZ0Z1bmN0aW9uKCBmdW5jdGlvbk5hbWUsIHRvbmVNYXBwaW5nICkge1xuXG5cdHZhciB0b25lTWFwcGluZ05hbWU7XG5cblx0c3dpdGNoICggdG9uZU1hcHBpbmcgKSB7XG5cblx0XHRjYXNlIExpbmVhclRvbmVNYXBwaW5nOlxuXHRcdFx0dG9uZU1hcHBpbmdOYW1lID0gJ0xpbmVhcic7XG5cdFx0XHRicmVhaztcblxuXHRcdGNhc2UgUmVpbmhhcmRUb25lTWFwcGluZzpcblx0XHRcdHRvbmVNYXBwaW5nTmFtZSA9ICdSZWluaGFyZCc7XG5cdFx0XHRicmVhaztcblxuXHRcdGNhc2UgVW5jaGFydGVkMlRvbmVNYXBwaW5nOlxuXHRcdFx0dG9uZU1hcHBpbmdOYW1lID0gJ1VuY2hhcnRlZDInO1xuXHRcdFx0YnJlYWs7XG5cblx0XHRjYXNlIENpbmVvblRvbmVNYXBwaW5nOlxuXHRcdFx0dG9uZU1hcHBpbmdOYW1lID0gJ09wdGltaXplZENpbmVvbic7XG5cdFx0XHRicmVhaztcblxuXHRcdGRlZmF1bHQ6XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoICd1bnN1cHBvcnRlZCB0b25lTWFwcGluZzogJyArIHRvbmVNYXBwaW5nICk7XG5cblx0fVxuXG5cdHJldHVybiAndmVjMyAnICsgZnVuY3Rpb25OYW1lICsgJyggdmVjMyBjb2xvciApIHsgcmV0dXJuICcgKyB0b25lTWFwcGluZ05hbWUgKyAnVG9uZU1hcHBpbmcoIGNvbG9yICk7IH0nO1xuXG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlRXh0ZW5zaW9ucyggZXh0ZW5zaW9ucywgcGFyYW1ldGVycywgcmVuZGVyZXJFeHRlbnNpb25zICkge1xuXG5cdGV4dGVuc2lvbnMgPSBleHRlbnNpb25zIHx8IHt9O1xuXG5cdHZhciBjaHVua3MgPSBbXG5cdFx0KCBleHRlbnNpb25zLmRlcml2YXRpdmVzIHx8IHBhcmFtZXRlcnMuZW52TWFwQ3ViZVVWIHx8IHBhcmFtZXRlcnMuYnVtcE1hcCB8fCBwYXJhbWV0ZXJzLm5vcm1hbE1hcCB8fCBwYXJhbWV0ZXJzLmZsYXRTaGFkaW5nICkgPyAnI2V4dGVuc2lvbiBHTF9PRVNfc3RhbmRhcmRfZGVyaXZhdGl2ZXMgOiBlbmFibGUnIDogJycsXG5cdFx0KCBleHRlbnNpb25zLmZyYWdEZXB0aCB8fCBwYXJhbWV0ZXJzLmxvZ2FyaXRobWljRGVwdGhCdWZmZXIgKSAmJiByZW5kZXJlckV4dGVuc2lvbnMuZ2V0KCAnRVhUX2ZyYWdfZGVwdGgnICkgPyAnI2V4dGVuc2lvbiBHTF9FWFRfZnJhZ19kZXB0aCA6IGVuYWJsZScgOiAnJyxcblx0XHQoIGV4dGVuc2lvbnMuZHJhd0J1ZmZlcnMgKSAmJiByZW5kZXJlckV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfZHJhd19idWZmZXJzJyApID8gJyNleHRlbnNpb24gR0xfRVhUX2RyYXdfYnVmZmVycyA6IHJlcXVpcmUnIDogJycsXG5cdFx0KCBleHRlbnNpb25zLnNoYWRlclRleHR1cmVMT0QgfHwgcGFyYW1ldGVycy5lbnZNYXAgKSAmJiByZW5kZXJlckV4dGVuc2lvbnMuZ2V0KCAnRVhUX3NoYWRlcl90ZXh0dXJlX2xvZCcgKSA/ICcjZXh0ZW5zaW9uIEdMX0VYVF9zaGFkZXJfdGV4dHVyZV9sb2QgOiBlbmFibGUnIDogJydcblx0XTtcblxuXHRyZXR1cm4gY2h1bmtzLmZpbHRlciggZmlsdGVyRW1wdHlMaW5lICkuam9pbiggJ1xcbicgKTtcblxufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZURlZmluZXMoIGRlZmluZXMgKSB7XG5cblx0dmFyIGNodW5rcyA9IFtdO1xuXG5cdGZvciAoIHZhciBuYW1lIGluIGRlZmluZXMgKSB7XG5cblx0XHR2YXIgdmFsdWUgPSBkZWZpbmVzWyBuYW1lIF07XG5cblx0XHRpZiAoIHZhbHVlID09PSBmYWxzZSApIGNvbnRpbnVlO1xuXG5cdFx0Y2h1bmtzLnB1c2goICcjZGVmaW5lICcgKyBuYW1lICsgJyAnICsgdmFsdWUgKTtcblxuXHR9XG5cblx0cmV0dXJuIGNodW5rcy5qb2luKCAnXFxuJyApO1xuXG59XG5cbmZ1bmN0aW9uIGZldGNoQXR0cmlidXRlTG9jYXRpb25zKCBnbCwgcHJvZ3JhbSApIHtcblxuXHR2YXIgYXR0cmlidXRlcyA9IHt9O1xuXG5cdHZhciBuID0gZ2wuZ2V0UHJvZ3JhbVBhcmFtZXRlciggcHJvZ3JhbSwgZ2wuQUNUSVZFX0FUVFJJQlVURVMgKTtcblxuXHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBuOyBpICsrICkge1xuXG5cdFx0dmFyIGluZm8gPSBnbC5nZXRBY3RpdmVBdHRyaWIoIHByb2dyYW0sIGkgKTtcblx0XHR2YXIgbmFtZSA9IGluZm8ubmFtZTtcblxuXHRcdC8vIGNvbnNvbGUubG9nKCAnVEhSRUUuV2ViR0xQcm9ncmFtOiBBQ1RJVkUgVkVSVEVYIEFUVFJJQlVURTonLCBuYW1lLCBpICk7XG5cblx0XHRhdHRyaWJ1dGVzWyBuYW1lIF0gPSBnbC5nZXRBdHRyaWJMb2NhdGlvbiggcHJvZ3JhbSwgbmFtZSApO1xuXG5cdH1cblxuXHRyZXR1cm4gYXR0cmlidXRlcztcblxufVxuXG5mdW5jdGlvbiBmaWx0ZXJFbXB0eUxpbmUoIHN0cmluZyApIHtcblxuXHRyZXR1cm4gc3RyaW5nICE9PSAnJztcblxufVxuXG5mdW5jdGlvbiByZXBsYWNlTGlnaHROdW1zKCBzdHJpbmcsIHBhcmFtZXRlcnMgKSB7XG5cblx0cmV0dXJuIHN0cmluZ1xuXHRcdC5yZXBsYWNlKCAvTlVNX0RJUl9MSUdIVFMvZywgcGFyYW1ldGVycy5udW1EaXJMaWdodHMgKVxuXHRcdC5yZXBsYWNlKCAvTlVNX1NQT1RfTElHSFRTL2csIHBhcmFtZXRlcnMubnVtU3BvdExpZ2h0cyApXG5cdFx0LnJlcGxhY2UoIC9OVU1fUkVDVF9BUkVBX0xJR0hUUy9nLCBwYXJhbWV0ZXJzLm51bVJlY3RBcmVhTGlnaHRzIClcblx0XHQucmVwbGFjZSggL05VTV9QT0lOVF9MSUdIVFMvZywgcGFyYW1ldGVycy5udW1Qb2ludExpZ2h0cyApXG5cdFx0LnJlcGxhY2UoIC9OVU1fSEVNSV9MSUdIVFMvZywgcGFyYW1ldGVycy5udW1IZW1pTGlnaHRzICk7XG5cbn1cblxuZnVuY3Rpb24gcmVwbGFjZUNsaXBwaW5nUGxhbmVOdW1zKCBzdHJpbmcsIHBhcmFtZXRlcnMgKSB7XG5cblx0cmV0dXJuIHN0cmluZ1xuXHRcdC5yZXBsYWNlKCAvTlVNX0NMSVBQSU5HX1BMQU5FUy9nLCBwYXJhbWV0ZXJzLm51bUNsaXBwaW5nUGxhbmVzIClcblx0XHQucmVwbGFjZSggL1VOSU9OX0NMSVBQSU5HX1BMQU5FUy9nLCAoIHBhcmFtZXRlcnMubnVtQ2xpcHBpbmdQbGFuZXMgLSBwYXJhbWV0ZXJzLm51bUNsaXBJbnRlcnNlY3Rpb24gKSApO1xuXG59XG5cbmZ1bmN0aW9uIHBhcnNlSW5jbHVkZXMoIHN0cmluZyApIHtcblxuXHR2YXIgcGF0dGVybiA9IC9eWyBcXHRdKiNpbmNsdWRlICs8KFtcXHdcXGQuXSspPi9nbTtcblxuXHRmdW5jdGlvbiByZXBsYWNlKCBtYXRjaCwgaW5jbHVkZSApIHtcblxuXHRcdHZhciByZXBsYWNlID0gU2hhZGVyQ2h1bmtbIGluY2x1ZGUgXTtcblxuXHRcdGlmICggcmVwbGFjZSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoICdDYW4gbm90IHJlc29sdmUgI2luY2x1ZGUgPCcgKyBpbmNsdWRlICsgJz4nICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gcGFyc2VJbmNsdWRlcyggcmVwbGFjZSApO1xuXG5cdH1cblxuXHRyZXR1cm4gc3RyaW5nLnJlcGxhY2UoIHBhdHRlcm4sIHJlcGxhY2UgKTtcblxufVxuXG5mdW5jdGlvbiB1bnJvbGxMb29wcyggc3RyaW5nICkge1xuXG5cdHZhciBwYXR0ZXJuID0gLyNwcmFnbWEgdW5yb2xsX2xvb3BbXFxzXSs/Zm9yIFxcKCBpbnQgaSBcXD0gKFxcZCspXFw7IGkgPCAoXFxkKylcXDsgaSBcXCtcXCsgXFwpIFxceyhbXFxzXFxTXSs/KSg/PVxcfSlcXH0vZztcblxuXHRmdW5jdGlvbiByZXBsYWNlKCBtYXRjaCwgc3RhcnQsIGVuZCwgc25pcHBldCApIHtcblxuXHRcdHZhciB1bnJvbGwgPSAnJztcblxuXHRcdGZvciAoIHZhciBpID0gcGFyc2VJbnQoIHN0YXJ0ICk7IGkgPCBwYXJzZUludCggZW5kICk7IGkgKysgKSB7XG5cblx0XHRcdHVucm9sbCArPSBzbmlwcGV0LnJlcGxhY2UoIC9cXFsgaSBcXF0vZywgJ1sgJyArIGkgKyAnIF0nICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdW5yb2xsO1xuXG5cdH1cblxuXHRyZXR1cm4gc3RyaW5nLnJlcGxhY2UoIHBhdHRlcm4sIHJlcGxhY2UgKTtcblxufVxuXG5mdW5jdGlvbiBXZWJHTFByb2dyYW0oIHJlbmRlcmVyLCBleHRlbnNpb25zLCBjb2RlLCBtYXRlcmlhbCwgc2hhZGVyLCBwYXJhbWV0ZXJzICkge1xuXG5cdHZhciBnbCA9IHJlbmRlcmVyLmNvbnRleHQ7XG5cblx0dmFyIGRlZmluZXMgPSBtYXRlcmlhbC5kZWZpbmVzO1xuXG5cdHZhciB2ZXJ0ZXhTaGFkZXIgPSBzaGFkZXIudmVydGV4U2hhZGVyO1xuXHR2YXIgZnJhZ21lbnRTaGFkZXIgPSBzaGFkZXIuZnJhZ21lbnRTaGFkZXI7XG5cblx0dmFyIHNoYWRvd01hcFR5cGVEZWZpbmUgPSAnU0hBRE9XTUFQX1RZUEVfQkFTSUMnO1xuXG5cdGlmICggcGFyYW1ldGVycy5zaGFkb3dNYXBUeXBlID09PSBQQ0ZTaGFkb3dNYXAgKSB7XG5cblx0XHRzaGFkb3dNYXBUeXBlRGVmaW5lID0gJ1NIQURPV01BUF9UWVBFX1BDRic7XG5cblx0fSBlbHNlIGlmICggcGFyYW1ldGVycy5zaGFkb3dNYXBUeXBlID09PSBQQ0ZTb2Z0U2hhZG93TWFwICkge1xuXG5cdFx0c2hhZG93TWFwVHlwZURlZmluZSA9ICdTSEFET1dNQVBfVFlQRV9QQ0ZfU09GVCc7XG5cblx0fVxuXG5cdHZhciBlbnZNYXBUeXBlRGVmaW5lID0gJ0VOVk1BUF9UWVBFX0NVQkUnO1xuXHR2YXIgZW52TWFwTW9kZURlZmluZSA9ICdFTlZNQVBfTU9ERV9SRUZMRUNUSU9OJztcblx0dmFyIGVudk1hcEJsZW5kaW5nRGVmaW5lID0gJ0VOVk1BUF9CTEVORElOR19NVUxUSVBMWSc7XG5cblx0aWYgKCBwYXJhbWV0ZXJzLmVudk1hcCApIHtcblxuXHRcdHN3aXRjaCAoIG1hdGVyaWFsLmVudk1hcC5tYXBwaW5nICkge1xuXG5cdFx0XHRjYXNlIEN1YmVSZWZsZWN0aW9uTWFwcGluZzpcblx0XHRcdGNhc2UgQ3ViZVJlZnJhY3Rpb25NYXBwaW5nOlxuXHRcdFx0XHRlbnZNYXBUeXBlRGVmaW5lID0gJ0VOVk1BUF9UWVBFX0NVQkUnO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBDdWJlVVZSZWZsZWN0aW9uTWFwcGluZzpcblx0XHRcdGNhc2UgQ3ViZVVWUmVmcmFjdGlvbk1hcHBpbmc6XG5cdFx0XHRcdGVudk1hcFR5cGVEZWZpbmUgPSAnRU5WTUFQX1RZUEVfQ1VCRV9VVic7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIEVxdWlyZWN0YW5ndWxhclJlZmxlY3Rpb25NYXBwaW5nOlxuXHRcdFx0Y2FzZSBFcXVpcmVjdGFuZ3VsYXJSZWZyYWN0aW9uTWFwcGluZzpcblx0XHRcdFx0ZW52TWFwVHlwZURlZmluZSA9ICdFTlZNQVBfVFlQRV9FUVVJUkVDJztcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgU3BoZXJpY2FsUmVmbGVjdGlvbk1hcHBpbmc6XG5cdFx0XHRcdGVudk1hcFR5cGVEZWZpbmUgPSAnRU5WTUFQX1RZUEVfU1BIRVJFJztcblx0XHRcdFx0YnJlYWs7XG5cblx0XHR9XG5cblx0XHRzd2l0Y2ggKCBtYXRlcmlhbC5lbnZNYXAubWFwcGluZyApIHtcblxuXHRcdFx0Y2FzZSBDdWJlUmVmcmFjdGlvbk1hcHBpbmc6XG5cdFx0XHRjYXNlIEVxdWlyZWN0YW5ndWxhclJlZnJhY3Rpb25NYXBwaW5nOlxuXHRcdFx0XHRlbnZNYXBNb2RlRGVmaW5lID0gJ0VOVk1BUF9NT0RFX1JFRlJBQ1RJT04nO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdH1cblxuXHRcdHN3aXRjaCAoIG1hdGVyaWFsLmNvbWJpbmUgKSB7XG5cblx0XHRcdGNhc2UgTXVsdGlwbHlPcGVyYXRpb246XG5cdFx0XHRcdGVudk1hcEJsZW5kaW5nRGVmaW5lID0gJ0VOVk1BUF9CTEVORElOR19NVUxUSVBMWSc7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIE1peE9wZXJhdGlvbjpcblx0XHRcdFx0ZW52TWFwQmxlbmRpbmdEZWZpbmUgPSAnRU5WTUFQX0JMRU5ESU5HX01JWCc7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIEFkZE9wZXJhdGlvbjpcblx0XHRcdFx0ZW52TWFwQmxlbmRpbmdEZWZpbmUgPSAnRU5WTUFQX0JMRU5ESU5HX0FERCc7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0fVxuXG5cdH1cblxuXHR2YXIgZ2FtbWFGYWN0b3JEZWZpbmUgPSAoIHJlbmRlcmVyLmdhbW1hRmFjdG9yID4gMCApID8gcmVuZGVyZXIuZ2FtbWFGYWN0b3IgOiAxLjA7XG5cblx0Ly8gY29uc29sZS5sb2coICdidWlsZGluZyBuZXcgcHJvZ3JhbSAnICk7XG5cblx0Ly9cblxuXHR2YXIgY3VzdG9tRXh0ZW5zaW9ucyA9IGdlbmVyYXRlRXh0ZW5zaW9ucyggbWF0ZXJpYWwuZXh0ZW5zaW9ucywgcGFyYW1ldGVycywgZXh0ZW5zaW9ucyApO1xuXG5cdHZhciBjdXN0b21EZWZpbmVzID0gZ2VuZXJhdGVEZWZpbmVzKCBkZWZpbmVzICk7XG5cblx0Ly9cblxuXHR2YXIgcHJvZ3JhbSA9IGdsLmNyZWF0ZVByb2dyYW0oKTtcblxuXHR2YXIgcHJlZml4VmVydGV4LCBwcmVmaXhGcmFnbWVudDtcblxuXHRpZiAoIG1hdGVyaWFsLmlzUmF3U2hhZGVyTWF0ZXJpYWwgKSB7XG5cblx0XHRwcmVmaXhWZXJ0ZXggPSBbXG5cblx0XHRcdGN1c3RvbURlZmluZXNcblxuXHRcdF0uZmlsdGVyKCBmaWx0ZXJFbXB0eUxpbmUgKS5qb2luKCAnXFxuJyApO1xuXG5cdFx0aWYgKCBwcmVmaXhWZXJ0ZXgubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0cHJlZml4VmVydGV4ICs9ICdcXG4nO1xuXG5cdFx0fVxuXG5cdFx0cHJlZml4RnJhZ21lbnQgPSBbXG5cblx0XHRcdGN1c3RvbUV4dGVuc2lvbnMsXG5cdFx0XHRjdXN0b21EZWZpbmVzXG5cblx0XHRdLmZpbHRlciggZmlsdGVyRW1wdHlMaW5lICkuam9pbiggJ1xcbicgKTtcblxuXHRcdGlmICggcHJlZml4RnJhZ21lbnQubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0cHJlZml4RnJhZ21lbnQgKz0gJ1xcbic7XG5cblx0XHR9XG5cblx0fSBlbHNlIHtcblxuXHRcdHByZWZpeFZlcnRleCA9IFtcblxuXHRcdFx0J3ByZWNpc2lvbiAnICsgcGFyYW1ldGVycy5wcmVjaXNpb24gKyAnIGZsb2F0OycsXG5cdFx0XHQncHJlY2lzaW9uICcgKyBwYXJhbWV0ZXJzLnByZWNpc2lvbiArICcgaW50OycsXG5cblx0XHRcdCcjZGVmaW5lIFNIQURFUl9OQU1FICcgKyBzaGFkZXIubmFtZSxcblxuXHRcdFx0Y3VzdG9tRGVmaW5lcyxcblxuXHRcdFx0cGFyYW1ldGVycy5zdXBwb3J0c1ZlcnRleFRleHR1cmVzID8gJyNkZWZpbmUgVkVSVEVYX1RFWFRVUkVTJyA6ICcnLFxuXG5cdFx0XHQnI2RlZmluZSBHQU1NQV9GQUNUT1IgJyArIGdhbW1hRmFjdG9yRGVmaW5lLFxuXG5cdFx0XHQnI2RlZmluZSBNQVhfQk9ORVMgJyArIHBhcmFtZXRlcnMubWF4Qm9uZXMsXG5cdFx0XHQoIHBhcmFtZXRlcnMudXNlRm9nICYmIHBhcmFtZXRlcnMuZm9nICkgPyAnI2RlZmluZSBVU0VfRk9HJyA6ICcnLFxuXHRcdFx0KCBwYXJhbWV0ZXJzLnVzZUZvZyAmJiBwYXJhbWV0ZXJzLmZvZ0V4cCApID8gJyNkZWZpbmUgRk9HX0VYUDInIDogJycsXG5cblx0XHRcdHBhcmFtZXRlcnMubWFwID8gJyNkZWZpbmUgVVNFX01BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuZW52TWFwID8gJyNkZWZpbmUgVVNFX0VOVk1BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuZW52TWFwID8gJyNkZWZpbmUgJyArIGVudk1hcE1vZGVEZWZpbmUgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMubGlnaHRNYXAgPyAnI2RlZmluZSBVU0VfTElHSFRNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmFvTWFwID8gJyNkZWZpbmUgVVNFX0FPTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5lbWlzc2l2ZU1hcCA/ICcjZGVmaW5lIFVTRV9FTUlTU0lWRU1BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuYnVtcE1hcCA/ICcjZGVmaW5lIFVTRV9CVU1QTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5ub3JtYWxNYXAgPyAnI2RlZmluZSBVU0VfTk9STUFMTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5kaXNwbGFjZW1lbnRNYXAgJiYgcGFyYW1ldGVycy5zdXBwb3J0c1ZlcnRleFRleHR1cmVzID8gJyNkZWZpbmUgVVNFX0RJU1BMQUNFTUVOVE1BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuc3BlY3VsYXJNYXAgPyAnI2RlZmluZSBVU0VfU1BFQ1VMQVJNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLnJvdWdobmVzc01hcCA/ICcjZGVmaW5lIFVTRV9ST1VHSE5FU1NNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLm1ldGFsbmVzc01hcCA/ICcjZGVmaW5lIFVTRV9NRVRBTE5FU1NNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmFscGhhTWFwID8gJyNkZWZpbmUgVVNFX0FMUEhBTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy52ZXJ0ZXhDb2xvcnMgPyAnI2RlZmluZSBVU0VfQ09MT1InIDogJycsXG5cblx0XHRcdHBhcmFtZXRlcnMuZmxhdFNoYWRpbmcgPyAnI2RlZmluZSBGTEFUX1NIQURFRCcgOiAnJyxcblxuXHRcdFx0cGFyYW1ldGVycy5za2lubmluZyA/ICcjZGVmaW5lIFVTRV9TS0lOTklORycgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMudXNlVmVydGV4VGV4dHVyZSA/ICcjZGVmaW5lIEJPTkVfVEVYVFVSRScgOiAnJyxcblxuXHRcdFx0cGFyYW1ldGVycy5tb3JwaFRhcmdldHMgPyAnI2RlZmluZSBVU0VfTU9SUEhUQVJHRVRTJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5tb3JwaE5vcm1hbHMgJiYgcGFyYW1ldGVycy5mbGF0U2hhZGluZyA9PT0gZmFsc2UgPyAnI2RlZmluZSBVU0VfTU9SUEhOT1JNQUxTJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5kb3VibGVTaWRlZCA/ICcjZGVmaW5lIERPVUJMRV9TSURFRCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuZmxpcFNpZGVkID8gJyNkZWZpbmUgRkxJUF9TSURFRCcgOiAnJyxcblxuXHRcdFx0cGFyYW1ldGVycy5zaGFkb3dNYXBFbmFibGVkID8gJyNkZWZpbmUgVVNFX1NIQURPV01BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuc2hhZG93TWFwRW5hYmxlZCA/ICcjZGVmaW5lICcgKyBzaGFkb3dNYXBUeXBlRGVmaW5lIDogJycsXG5cblx0XHRcdHBhcmFtZXRlcnMuc2l6ZUF0dGVudWF0aW9uID8gJyNkZWZpbmUgVVNFX1NJWkVBVFRFTlVBVElPTicgOiAnJyxcblxuXHRcdFx0cGFyYW1ldGVycy5sb2dhcml0aG1pY0RlcHRoQnVmZmVyID8gJyNkZWZpbmUgVVNFX0xPR0RFUFRIQlVGJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5sb2dhcml0aG1pY0RlcHRoQnVmZmVyICYmIGV4dGVuc2lvbnMuZ2V0KCAnRVhUX2ZyYWdfZGVwdGgnICkgPyAnI2RlZmluZSBVU0VfTE9HREVQVEhCVUZfRVhUJyA6ICcnLFxuXG5cdFx0XHQndW5pZm9ybSBtYXQ0IG1vZGVsTWF0cml4OycsXG5cdFx0XHQndW5pZm9ybSBtYXQ0IG1vZGVsVmlld01hdHJpeDsnLFxuXHRcdFx0J3VuaWZvcm0gbWF0NCBwcm9qZWN0aW9uTWF0cml4OycsXG5cdFx0XHQndW5pZm9ybSBtYXQ0IHZpZXdNYXRyaXg7Jyxcblx0XHRcdCd1bmlmb3JtIG1hdDMgbm9ybWFsTWF0cml4OycsXG5cdFx0XHQndW5pZm9ybSB2ZWMzIGNhbWVyYVBvc2l0aW9uOycsXG5cblx0XHRcdCdhdHRyaWJ1dGUgdmVjMyBwb3NpdGlvbjsnLFxuXHRcdFx0J2F0dHJpYnV0ZSB2ZWMzIG5vcm1hbDsnLFxuXHRcdFx0J2F0dHJpYnV0ZSB2ZWMyIHV2OycsXG5cblx0XHRcdCcjaWZkZWYgVVNFX0NPTE9SJyxcblxuXHRcdFx0J1x0YXR0cmlidXRlIHZlYzMgY29sb3I7JyxcblxuXHRcdFx0JyNlbmRpZicsXG5cblx0XHRcdCcjaWZkZWYgVVNFX01PUlBIVEFSR0VUUycsXG5cblx0XHRcdCdcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0MDsnLFxuXHRcdFx0J1x0YXR0cmlidXRlIHZlYzMgbW9ycGhUYXJnZXQxOycsXG5cdFx0XHQnXHRhdHRyaWJ1dGUgdmVjMyBtb3JwaFRhcmdldDI7Jyxcblx0XHRcdCdcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0MzsnLFxuXG5cdFx0XHQnXHQjaWZkZWYgVVNFX01PUlBITk9STUFMUycsXG5cblx0XHRcdCdcdFx0YXR0cmlidXRlIHZlYzMgbW9ycGhOb3JtYWwwOycsXG5cdFx0XHQnXHRcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoTm9ybWFsMTsnLFxuXHRcdFx0J1x0XHRhdHRyaWJ1dGUgdmVjMyBtb3JwaE5vcm1hbDI7Jyxcblx0XHRcdCdcdFx0YXR0cmlidXRlIHZlYzMgbW9ycGhOb3JtYWwzOycsXG5cblx0XHRcdCdcdCNlbHNlJyxcblxuXHRcdFx0J1x0XHRhdHRyaWJ1dGUgdmVjMyBtb3JwaFRhcmdldDQ7Jyxcblx0XHRcdCdcdFx0YXR0cmlidXRlIHZlYzMgbW9ycGhUYXJnZXQ1OycsXG5cdFx0XHQnXHRcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0NjsnLFxuXHRcdFx0J1x0XHRhdHRyaWJ1dGUgdmVjMyBtb3JwaFRhcmdldDc7JyxcblxuXHRcdFx0J1x0I2VuZGlmJyxcblxuXHRcdFx0JyNlbmRpZicsXG5cblx0XHRcdCcjaWZkZWYgVVNFX1NLSU5OSU5HJyxcblxuXHRcdFx0J1x0YXR0cmlidXRlIHZlYzQgc2tpbkluZGV4OycsXG5cdFx0XHQnXHRhdHRyaWJ1dGUgdmVjNCBza2luV2VpZ2h0OycsXG5cblx0XHRcdCcjZW5kaWYnLFxuXG5cdFx0XHQnXFxuJ1xuXG5cdFx0XS5maWx0ZXIoIGZpbHRlckVtcHR5TGluZSApLmpvaW4oICdcXG4nICk7XG5cblx0XHRwcmVmaXhGcmFnbWVudCA9IFtcblxuXHRcdFx0Y3VzdG9tRXh0ZW5zaW9ucyxcblxuXHRcdFx0J3ByZWNpc2lvbiAnICsgcGFyYW1ldGVycy5wcmVjaXNpb24gKyAnIGZsb2F0OycsXG5cdFx0XHQncHJlY2lzaW9uICcgKyBwYXJhbWV0ZXJzLnByZWNpc2lvbiArICcgaW50OycsXG5cblx0XHRcdCcjZGVmaW5lIFNIQURFUl9OQU1FICcgKyBzaGFkZXIubmFtZSxcblxuXHRcdFx0Y3VzdG9tRGVmaW5lcyxcblxuXHRcdFx0cGFyYW1ldGVycy5hbHBoYVRlc3QgPyAnI2RlZmluZSBBTFBIQVRFU1QgJyArIHBhcmFtZXRlcnMuYWxwaGFUZXN0IDogJycsXG5cblx0XHRcdCcjZGVmaW5lIEdBTU1BX0ZBQ1RPUiAnICsgZ2FtbWFGYWN0b3JEZWZpbmUsXG5cblx0XHRcdCggcGFyYW1ldGVycy51c2VGb2cgJiYgcGFyYW1ldGVycy5mb2cgKSA/ICcjZGVmaW5lIFVTRV9GT0cnIDogJycsXG5cdFx0XHQoIHBhcmFtZXRlcnMudXNlRm9nICYmIHBhcmFtZXRlcnMuZm9nRXhwICkgPyAnI2RlZmluZSBGT0dfRVhQMicgOiAnJyxcblxuXHRcdFx0cGFyYW1ldGVycy5tYXAgPyAnI2RlZmluZSBVU0VfTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5lbnZNYXAgPyAnI2RlZmluZSBVU0VfRU5WTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5lbnZNYXAgPyAnI2RlZmluZSAnICsgZW52TWFwVHlwZURlZmluZSA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5lbnZNYXAgPyAnI2RlZmluZSAnICsgZW52TWFwTW9kZURlZmluZSA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5lbnZNYXAgPyAnI2RlZmluZSAnICsgZW52TWFwQmxlbmRpbmdEZWZpbmUgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMubGlnaHRNYXAgPyAnI2RlZmluZSBVU0VfTElHSFRNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmFvTWFwID8gJyNkZWZpbmUgVVNFX0FPTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5lbWlzc2l2ZU1hcCA/ICcjZGVmaW5lIFVTRV9FTUlTU0lWRU1BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuYnVtcE1hcCA/ICcjZGVmaW5lIFVTRV9CVU1QTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5ub3JtYWxNYXAgPyAnI2RlZmluZSBVU0VfTk9STUFMTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5zcGVjdWxhck1hcCA/ICcjZGVmaW5lIFVTRV9TUEVDVUxBUk1BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMucm91Z2huZXNzTWFwID8gJyNkZWZpbmUgVVNFX1JPVUdITkVTU01BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMubWV0YWxuZXNzTWFwID8gJyNkZWZpbmUgVVNFX01FVEFMTkVTU01BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuYWxwaGFNYXAgPyAnI2RlZmluZSBVU0VfQUxQSEFNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLnZlcnRleENvbG9ycyA/ICcjZGVmaW5lIFVTRV9DT0xPUicgOiAnJyxcblxuXHRcdFx0cGFyYW1ldGVycy5ncmFkaWVudE1hcCA/ICcjZGVmaW5lIFVTRV9HUkFESUVOVE1BUCcgOiAnJyxcblxuXHRcdFx0cGFyYW1ldGVycy5mbGF0U2hhZGluZyA/ICcjZGVmaW5lIEZMQVRfU0hBREVEJyA6ICcnLFxuXG5cdFx0XHRwYXJhbWV0ZXJzLmRvdWJsZVNpZGVkID8gJyNkZWZpbmUgRE9VQkxFX1NJREVEJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5mbGlwU2lkZWQgPyAnI2RlZmluZSBGTElQX1NJREVEJyA6ICcnLFxuXG5cdFx0XHRwYXJhbWV0ZXJzLnNoYWRvd01hcEVuYWJsZWQgPyAnI2RlZmluZSBVU0VfU0hBRE9XTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5zaGFkb3dNYXBFbmFibGVkID8gJyNkZWZpbmUgJyArIHNoYWRvd01hcFR5cGVEZWZpbmUgOiAnJyxcblxuXHRcdFx0cGFyYW1ldGVycy5wcmVtdWx0aXBsaWVkQWxwaGEgPyAnI2RlZmluZSBQUkVNVUxUSVBMSUVEX0FMUEhBJyA6ICcnLFxuXG5cdFx0XHRwYXJhbWV0ZXJzLnBoeXNpY2FsbHlDb3JyZWN0TGlnaHRzID8gJyNkZWZpbmUgUEhZU0lDQUxMWV9DT1JSRUNUX0xJR0hUUycgOiAnJyxcblxuXHRcdFx0cGFyYW1ldGVycy5sb2dhcml0aG1pY0RlcHRoQnVmZmVyID8gJyNkZWZpbmUgVVNFX0xPR0RFUFRIQlVGJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5sb2dhcml0aG1pY0RlcHRoQnVmZmVyICYmIGV4dGVuc2lvbnMuZ2V0KCAnRVhUX2ZyYWdfZGVwdGgnICkgPyAnI2RlZmluZSBVU0VfTE9HREVQVEhCVUZfRVhUJyA6ICcnLFxuXG5cdFx0XHRwYXJhbWV0ZXJzLmVudk1hcCAmJiBleHRlbnNpb25zLmdldCggJ0VYVF9zaGFkZXJfdGV4dHVyZV9sb2QnICkgPyAnI2RlZmluZSBURVhUVVJFX0xPRF9FWFQnIDogJycsXG5cblx0XHRcdCd1bmlmb3JtIG1hdDQgdmlld01hdHJpeDsnLFxuXHRcdFx0J3VuaWZvcm0gdmVjMyBjYW1lcmFQb3NpdGlvbjsnLFxuXG5cdFx0XHQoIHBhcmFtZXRlcnMudG9uZU1hcHBpbmcgIT09IE5vVG9uZU1hcHBpbmcgKSA/ICcjZGVmaW5lIFRPTkVfTUFQUElORycgOiAnJyxcblx0XHRcdCggcGFyYW1ldGVycy50b25lTWFwcGluZyAhPT0gTm9Ub25lTWFwcGluZyApID8gU2hhZGVyQ2h1bmtbICd0b25lbWFwcGluZ19wYXJzX2ZyYWdtZW50JyBdIDogJycsIC8vIHRoaXMgY29kZSBpcyByZXF1aXJlZCBoZXJlIGJlY2F1c2UgaXQgaXMgdXNlZCBieSB0aGUgdG9uZU1hcHBpbmcoKSBmdW5jdGlvbiBkZWZpbmVkIGJlbG93XG5cdFx0XHQoIHBhcmFtZXRlcnMudG9uZU1hcHBpbmcgIT09IE5vVG9uZU1hcHBpbmcgKSA/IGdldFRvbmVNYXBwaW5nRnVuY3Rpb24oICd0b25lTWFwcGluZycsIHBhcmFtZXRlcnMudG9uZU1hcHBpbmcgKSA6ICcnLFxuXG5cdFx0XHRwYXJhbWV0ZXJzLmRpdGhlcmluZyA/ICcjZGVmaW5lIERJVEhFUklORycgOiAnJyxcblxuXHRcdFx0KCBwYXJhbWV0ZXJzLm91dHB1dEVuY29kaW5nIHx8IHBhcmFtZXRlcnMubWFwRW5jb2RpbmcgfHwgcGFyYW1ldGVycy5lbnZNYXBFbmNvZGluZyB8fCBwYXJhbWV0ZXJzLmVtaXNzaXZlTWFwRW5jb2RpbmcgKSA/IFNoYWRlckNodW5rWyAnZW5jb2RpbmdzX3BhcnNfZnJhZ21lbnQnIF0gOiAnJywgLy8gdGhpcyBjb2RlIGlzIHJlcXVpcmVkIGhlcmUgYmVjYXVzZSBpdCBpcyB1c2VkIGJ5IHRoZSB2YXJpb3VzIGVuY29kaW5nL2RlY29kaW5nIGZ1bmN0aW9uIGRlZmluZWQgYmVsb3dcblx0XHRcdHBhcmFtZXRlcnMubWFwRW5jb2RpbmcgPyBnZXRUZXhlbERlY29kaW5nRnVuY3Rpb24oICdtYXBUZXhlbFRvTGluZWFyJywgcGFyYW1ldGVycy5tYXBFbmNvZGluZyApIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmVudk1hcEVuY29kaW5nID8gZ2V0VGV4ZWxEZWNvZGluZ0Z1bmN0aW9uKCAnZW52TWFwVGV4ZWxUb0xpbmVhcicsIHBhcmFtZXRlcnMuZW52TWFwRW5jb2RpbmcgKSA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5lbWlzc2l2ZU1hcEVuY29kaW5nID8gZ2V0VGV4ZWxEZWNvZGluZ0Z1bmN0aW9uKCAnZW1pc3NpdmVNYXBUZXhlbFRvTGluZWFyJywgcGFyYW1ldGVycy5lbWlzc2l2ZU1hcEVuY29kaW5nICkgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMub3V0cHV0RW5jb2RpbmcgPyBnZXRUZXhlbEVuY29kaW5nRnVuY3Rpb24oICdsaW5lYXJUb091dHB1dFRleGVsJywgcGFyYW1ldGVycy5vdXRwdXRFbmNvZGluZyApIDogJycsXG5cblx0XHRcdHBhcmFtZXRlcnMuZGVwdGhQYWNraW5nID8gJyNkZWZpbmUgREVQVEhfUEFDS0lORyAnICsgbWF0ZXJpYWwuZGVwdGhQYWNraW5nIDogJycsXG5cblx0XHRcdCdcXG4nXG5cblx0XHRdLmZpbHRlciggZmlsdGVyRW1wdHlMaW5lICkuam9pbiggJ1xcbicgKTtcblxuXHR9XG5cblx0dmVydGV4U2hhZGVyID0gcGFyc2VJbmNsdWRlcyggdmVydGV4U2hhZGVyICk7XG5cdHZlcnRleFNoYWRlciA9IHJlcGxhY2VMaWdodE51bXMoIHZlcnRleFNoYWRlciwgcGFyYW1ldGVycyApO1xuXHR2ZXJ0ZXhTaGFkZXIgPSByZXBsYWNlQ2xpcHBpbmdQbGFuZU51bXMoIHZlcnRleFNoYWRlciwgcGFyYW1ldGVycyApO1xuXG5cdGZyYWdtZW50U2hhZGVyID0gcGFyc2VJbmNsdWRlcyggZnJhZ21lbnRTaGFkZXIgKTtcblx0ZnJhZ21lbnRTaGFkZXIgPSByZXBsYWNlTGlnaHROdW1zKCBmcmFnbWVudFNoYWRlciwgcGFyYW1ldGVycyApO1xuXHRmcmFnbWVudFNoYWRlciA9IHJlcGxhY2VDbGlwcGluZ1BsYW5lTnVtcyggZnJhZ21lbnRTaGFkZXIsIHBhcmFtZXRlcnMgKTtcblxuXHR2ZXJ0ZXhTaGFkZXIgPSB1bnJvbGxMb29wcyggdmVydGV4U2hhZGVyICk7XG5cdGZyYWdtZW50U2hhZGVyID0gdW5yb2xsTG9vcHMoIGZyYWdtZW50U2hhZGVyICk7XG5cblx0dmFyIHZlcnRleEdsc2wgPSBwcmVmaXhWZXJ0ZXggKyB2ZXJ0ZXhTaGFkZXI7XG5cdHZhciBmcmFnbWVudEdsc2wgPSBwcmVmaXhGcmFnbWVudCArIGZyYWdtZW50U2hhZGVyO1xuXG5cdC8vIGNvbnNvbGUubG9nKCAnKlZFUlRFWConLCB2ZXJ0ZXhHbHNsICk7XG5cdC8vIGNvbnNvbGUubG9nKCAnKkZSQUdNRU5UKicsIGZyYWdtZW50R2xzbCApO1xuXG5cdHZhciBnbFZlcnRleFNoYWRlciA9IFdlYkdMU2hhZGVyKCBnbCwgZ2wuVkVSVEVYX1NIQURFUiwgdmVydGV4R2xzbCApO1xuXHR2YXIgZ2xGcmFnbWVudFNoYWRlciA9IFdlYkdMU2hhZGVyKCBnbCwgZ2wuRlJBR01FTlRfU0hBREVSLCBmcmFnbWVudEdsc2wgKTtcblxuXHRnbC5hdHRhY2hTaGFkZXIoIHByb2dyYW0sIGdsVmVydGV4U2hhZGVyICk7XG5cdGdsLmF0dGFjaFNoYWRlciggcHJvZ3JhbSwgZ2xGcmFnbWVudFNoYWRlciApO1xuXG5cdC8vIEZvcmNlIGEgcGFydGljdWxhciBhdHRyaWJ1dGUgdG8gaW5kZXggMC5cblxuXHRpZiAoIG1hdGVyaWFsLmluZGV4MEF0dHJpYnV0ZU5hbWUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdGdsLmJpbmRBdHRyaWJMb2NhdGlvbiggcHJvZ3JhbSwgMCwgbWF0ZXJpYWwuaW5kZXgwQXR0cmlidXRlTmFtZSApO1xuXG5cdH0gZWxzZSBpZiAoIHBhcmFtZXRlcnMubW9ycGhUYXJnZXRzID09PSB0cnVlICkge1xuXG5cdFx0Ly8gcHJvZ3JhbXMgd2l0aCBtb3JwaFRhcmdldHMgZGlzcGxhY2UgcG9zaXRpb24gb3V0IG9mIGF0dHJpYnV0ZSAwXG5cdFx0Z2wuYmluZEF0dHJpYkxvY2F0aW9uKCBwcm9ncmFtLCAwLCAncG9zaXRpb24nICk7XG5cblx0fVxuXG5cdGdsLmxpbmtQcm9ncmFtKCBwcm9ncmFtICk7XG5cblx0dmFyIHByb2dyYW1Mb2cgPSBnbC5nZXRQcm9ncmFtSW5mb0xvZyggcHJvZ3JhbSApLnRyaW0oKTtcblx0dmFyIHZlcnRleExvZyA9IGdsLmdldFNoYWRlckluZm9Mb2coIGdsVmVydGV4U2hhZGVyICkudHJpbSgpO1xuXHR2YXIgZnJhZ21lbnRMb2cgPSBnbC5nZXRTaGFkZXJJbmZvTG9nKCBnbEZyYWdtZW50U2hhZGVyICkudHJpbSgpO1xuXG5cdHZhciBydW5uYWJsZSA9IHRydWU7XG5cdHZhciBoYXZlRGlhZ25vc3RpY3MgPSB0cnVlO1xuXG5cdC8vIGNvbnNvbGUubG9nKCAnKipWRVJURVgqKicsIGdsLmdldEV4dGVuc2lvbiggJ1dFQkdMX2RlYnVnX3NoYWRlcnMnICkuZ2V0VHJhbnNsYXRlZFNoYWRlclNvdXJjZSggZ2xWZXJ0ZXhTaGFkZXIgKSApO1xuXHQvLyBjb25zb2xlLmxvZyggJyoqRlJBR01FTlQqKicsIGdsLmdldEV4dGVuc2lvbiggJ1dFQkdMX2RlYnVnX3NoYWRlcnMnICkuZ2V0VHJhbnNsYXRlZFNoYWRlclNvdXJjZSggZ2xGcmFnbWVudFNoYWRlciApICk7XG5cblx0aWYgKCBnbC5nZXRQcm9ncmFtUGFyYW1ldGVyKCBwcm9ncmFtLCBnbC5MSU5LX1NUQVRVUyApID09PSBmYWxzZSApIHtcblxuXHRcdHJ1bm5hYmxlID0gZmFsc2U7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuV2ViR0xQcm9ncmFtOiBzaGFkZXIgZXJyb3I6ICcsIGdsLmdldEVycm9yKCksICdnbC5WQUxJREFURV9TVEFUVVMnLCBnbC5nZXRQcm9ncmFtUGFyYW1ldGVyKCBwcm9ncmFtLCBnbC5WQUxJREFURV9TVEFUVVMgKSwgJ2dsLmdldFByb2dyYW1JbmZvTG9nJywgcHJvZ3JhbUxvZywgdmVydGV4TG9nLCBmcmFnbWVudExvZyApO1xuXG5cdH0gZWxzZSBpZiAoIHByb2dyYW1Mb2cgIT09ICcnICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xQcm9ncmFtOiBnbC5nZXRQcm9ncmFtSW5mb0xvZygpJywgcHJvZ3JhbUxvZyApO1xuXG5cdH0gZWxzZSBpZiAoIHZlcnRleExvZyA9PT0gJycgfHwgZnJhZ21lbnRMb2cgPT09ICcnICkge1xuXG5cdFx0aGF2ZURpYWdub3N0aWNzID0gZmFsc2U7XG5cblx0fVxuXG5cdGlmICggaGF2ZURpYWdub3N0aWNzICkge1xuXG5cdFx0dGhpcy5kaWFnbm9zdGljcyA9IHtcblxuXHRcdFx0cnVubmFibGU6IHJ1bm5hYmxlLFxuXHRcdFx0bWF0ZXJpYWw6IG1hdGVyaWFsLFxuXG5cdFx0XHRwcm9ncmFtTG9nOiBwcm9ncmFtTG9nLFxuXG5cdFx0XHR2ZXJ0ZXhTaGFkZXI6IHtcblxuXHRcdFx0XHRsb2c6IHZlcnRleExvZyxcblx0XHRcdFx0cHJlZml4OiBwcmVmaXhWZXJ0ZXhcblxuXHRcdFx0fSxcblxuXHRcdFx0ZnJhZ21lbnRTaGFkZXI6IHtcblxuXHRcdFx0XHRsb2c6IGZyYWdtZW50TG9nLFxuXHRcdFx0XHRwcmVmaXg6IHByZWZpeEZyYWdtZW50XG5cblx0XHRcdH1cblxuXHRcdH07XG5cblx0fVxuXG5cdC8vIGNsZWFuIHVwXG5cblx0Z2wuZGVsZXRlU2hhZGVyKCBnbFZlcnRleFNoYWRlciApO1xuXHRnbC5kZWxldGVTaGFkZXIoIGdsRnJhZ21lbnRTaGFkZXIgKTtcblxuXHQvLyBzZXQgdXAgY2FjaGluZyBmb3IgdW5pZm9ybSBsb2NhdGlvbnNcblxuXHR2YXIgY2FjaGVkVW5pZm9ybXM7XG5cblx0dGhpcy5nZXRVbmlmb3JtcyA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdGlmICggY2FjaGVkVW5pZm9ybXMgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y2FjaGVkVW5pZm9ybXMgPSBuZXcgV2ViR0xVbmlmb3JtcyggZ2wsIHByb2dyYW0sIHJlbmRlcmVyICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gY2FjaGVkVW5pZm9ybXM7XG5cblx0fTtcblxuXHQvLyBzZXQgdXAgY2FjaGluZyBmb3IgYXR0cmlidXRlIGxvY2F0aW9uc1xuXG5cdHZhciBjYWNoZWRBdHRyaWJ1dGVzO1xuXG5cdHRoaXMuZ2V0QXR0cmlidXRlcyA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdGlmICggY2FjaGVkQXR0cmlidXRlcyA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjYWNoZWRBdHRyaWJ1dGVzID0gZmV0Y2hBdHRyaWJ1dGVMb2NhdGlvbnMoIGdsLCBwcm9ncmFtICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gY2FjaGVkQXR0cmlidXRlcztcblxuXHR9O1xuXG5cdC8vIGZyZWUgcmVzb3VyY2VcblxuXHR0aGlzLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRnbC5kZWxldGVQcm9ncmFtKCBwcm9ncmFtICk7XG5cdFx0dGhpcy5wcm9ncmFtID0gdW5kZWZpbmVkO1xuXG5cdH07XG5cblx0Ly8gREVQUkVDQVRFRFxuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCB0aGlzLCB7XG5cblx0XHR1bmlmb3Jtczoge1xuXHRcdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xQcm9ncmFtOiAudW5pZm9ybXMgaXMgbm93IC5nZXRVbmlmb3JtcygpLicgKTtcblx0XHRcdFx0cmV0dXJuIHRoaXMuZ2V0VW5pZm9ybXMoKTtcblxuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHRhdHRyaWJ1dGVzOiB7XG5cdFx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFByb2dyYW06IC5hdHRyaWJ1dGVzIGlzIG5vdyAuZ2V0QXR0cmlidXRlcygpLicgKTtcblx0XHRcdFx0cmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlcygpO1xuXG5cdFx0XHR9XG5cdFx0fVxuXG5cdH0gKTtcblxuXG5cdC8vXG5cblx0dGhpcy5uYW1lID0gc2hhZGVyLm5hbWU7XG5cdHRoaXMuaWQgPSBwcm9ncmFtSWRDb3VudCArKztcblx0dGhpcy5jb2RlID0gY29kZTtcblx0dGhpcy51c2VkVGltZXMgPSAxO1xuXHR0aGlzLnByb2dyYW0gPSBwcm9ncmFtO1xuXHR0aGlzLnZlcnRleFNoYWRlciA9IGdsVmVydGV4U2hhZGVyO1xuXHR0aGlzLmZyYWdtZW50U2hhZGVyID0gZ2xGcmFnbWVudFNoYWRlcjtcblxuXHRyZXR1cm4gdGhpcztcblxufVxuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gV2ViR0xQcm9ncmFtcyggcmVuZGVyZXIsIGV4dGVuc2lvbnMsIGNhcGFiaWxpdGllcyApIHtcblxuXHR2YXIgcHJvZ3JhbXMgPSBbXTtcblxuXHR2YXIgc2hhZGVySURzID0ge1xuXHRcdE1lc2hEZXB0aE1hdGVyaWFsOiAnZGVwdGgnLFxuXHRcdE1lc2hEaXN0YW5jZU1hdGVyaWFsOiAnZGlzdGFuY2VSR0JBJyxcblx0XHRNZXNoTm9ybWFsTWF0ZXJpYWw6ICdub3JtYWwnLFxuXHRcdE1lc2hCYXNpY01hdGVyaWFsOiAnYmFzaWMnLFxuXHRcdE1lc2hMYW1iZXJ0TWF0ZXJpYWw6ICdsYW1iZXJ0Jyxcblx0XHRNZXNoUGhvbmdNYXRlcmlhbDogJ3Bob25nJyxcblx0XHRNZXNoVG9vbk1hdGVyaWFsOiAncGhvbmcnLFxuXHRcdE1lc2hTdGFuZGFyZE1hdGVyaWFsOiAncGh5c2ljYWwnLFxuXHRcdE1lc2hQaHlzaWNhbE1hdGVyaWFsOiAncGh5c2ljYWwnLFxuXHRcdExpbmVCYXNpY01hdGVyaWFsOiAnYmFzaWMnLFxuXHRcdExpbmVEYXNoZWRNYXRlcmlhbDogJ2Rhc2hlZCcsXG5cdFx0UG9pbnRzTWF0ZXJpYWw6ICdwb2ludHMnLFxuXHRcdFNoYWRvd01hdGVyaWFsOiAnc2hhZG93J1xuXHR9O1xuXG5cdHZhciBwYXJhbWV0ZXJOYW1lcyA9IFtcblx0XHRcInByZWNpc2lvblwiLCBcInN1cHBvcnRzVmVydGV4VGV4dHVyZXNcIiwgXCJtYXBcIiwgXCJtYXBFbmNvZGluZ1wiLCBcImVudk1hcFwiLCBcImVudk1hcE1vZGVcIiwgXCJlbnZNYXBFbmNvZGluZ1wiLFxuXHRcdFwibGlnaHRNYXBcIiwgXCJhb01hcFwiLCBcImVtaXNzaXZlTWFwXCIsIFwiZW1pc3NpdmVNYXBFbmNvZGluZ1wiLCBcImJ1bXBNYXBcIiwgXCJub3JtYWxNYXBcIiwgXCJkaXNwbGFjZW1lbnRNYXBcIiwgXCJzcGVjdWxhck1hcFwiLFxuXHRcdFwicm91Z2huZXNzTWFwXCIsIFwibWV0YWxuZXNzTWFwXCIsIFwiZ3JhZGllbnRNYXBcIixcblx0XHRcImFscGhhTWFwXCIsIFwiY29tYmluZVwiLCBcInZlcnRleENvbG9yc1wiLCBcImZvZ1wiLCBcInVzZUZvZ1wiLCBcImZvZ0V4cFwiLFxuXHRcdFwiZmxhdFNoYWRpbmdcIiwgXCJzaXplQXR0ZW51YXRpb25cIiwgXCJsb2dhcml0aG1pY0RlcHRoQnVmZmVyXCIsIFwic2tpbm5pbmdcIixcblx0XHRcIm1heEJvbmVzXCIsIFwidXNlVmVydGV4VGV4dHVyZVwiLCBcIm1vcnBoVGFyZ2V0c1wiLCBcIm1vcnBoTm9ybWFsc1wiLFxuXHRcdFwibWF4TW9ycGhUYXJnZXRzXCIsIFwibWF4TW9ycGhOb3JtYWxzXCIsIFwicHJlbXVsdGlwbGllZEFscGhhXCIsXG5cdFx0XCJudW1EaXJMaWdodHNcIiwgXCJudW1Qb2ludExpZ2h0c1wiLCBcIm51bVNwb3RMaWdodHNcIiwgXCJudW1IZW1pTGlnaHRzXCIsIFwibnVtUmVjdEFyZWFMaWdodHNcIixcblx0XHRcInNoYWRvd01hcEVuYWJsZWRcIiwgXCJzaGFkb3dNYXBUeXBlXCIsIFwidG9uZU1hcHBpbmdcIiwgJ3BoeXNpY2FsbHlDb3JyZWN0TGlnaHRzJyxcblx0XHRcImFscGhhVGVzdFwiLCBcImRvdWJsZVNpZGVkXCIsIFwiZmxpcFNpZGVkXCIsIFwibnVtQ2xpcHBpbmdQbGFuZXNcIiwgXCJudW1DbGlwSW50ZXJzZWN0aW9uXCIsIFwiZGVwdGhQYWNraW5nXCIsIFwiZGl0aGVyaW5nXCJcblx0XTtcblxuXG5cdGZ1bmN0aW9uIGFsbG9jYXRlQm9uZXMoIG9iamVjdCApIHtcblxuXHRcdHZhciBza2VsZXRvbiA9IG9iamVjdC5za2VsZXRvbjtcblx0XHR2YXIgYm9uZXMgPSBza2VsZXRvbi5ib25lcztcblxuXHRcdGlmICggY2FwYWJpbGl0aWVzLmZsb2F0VmVydGV4VGV4dHVyZXMgKSB7XG5cblx0XHRcdHJldHVybiAxMDI0O1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gZGVmYXVsdCBmb3Igd2hlbiBvYmplY3QgaXMgbm90IHNwZWNpZmllZFxuXHRcdFx0Ly8gKCBmb3IgZXhhbXBsZSB3aGVuIHByZWJ1aWxkaW5nIHNoYWRlciB0byBiZSB1c2VkIHdpdGggbXVsdGlwbGUgb2JqZWN0cyApXG5cdFx0XHQvL1xuXHRcdFx0Ly8gIC0gbGVhdmUgc29tZSBleHRyYSBzcGFjZSBmb3Igb3RoZXIgdW5pZm9ybXNcblx0XHRcdC8vICAtIGxpbWl0IGhlcmUgaXMgQU5HTEUncyAyNTQgbWF4IHVuaWZvcm0gdmVjdG9yc1xuXHRcdFx0Ly8gICAgKHVwIHRvIDU0IHNob3VsZCBiZSBzYWZlKVxuXG5cdFx0XHR2YXIgblZlcnRleFVuaWZvcm1zID0gY2FwYWJpbGl0aWVzLm1heFZlcnRleFVuaWZvcm1zO1xuXHRcdFx0dmFyIG5WZXJ0ZXhNYXRyaWNlcyA9IE1hdGguZmxvb3IoICggblZlcnRleFVuaWZvcm1zIC0gMjAgKSAvIDQgKTtcblxuXHRcdFx0dmFyIG1heEJvbmVzID0gTWF0aC5taW4oIG5WZXJ0ZXhNYXRyaWNlcywgYm9uZXMubGVuZ3RoICk7XG5cblx0XHRcdGlmICggbWF4Qm9uZXMgPCBib25lcy5sZW5ndGggKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogU2tlbGV0b24gaGFzICcgKyBib25lcy5sZW5ndGggKyAnIGJvbmVzLiBUaGlzIEdQVSBzdXBwb3J0cyAnICsgbWF4Qm9uZXMgKyAnLicgKTtcblx0XHRcdFx0cmV0dXJuIDA7XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIG1heEJvbmVzO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBnZXRUZXh0dXJlRW5jb2RpbmdGcm9tTWFwKCBtYXAsIGdhbW1hT3ZlcnJpZGVMaW5lYXIgKSB7XG5cblx0XHR2YXIgZW5jb2Rpbmc7XG5cblx0XHRpZiAoICEgbWFwICkge1xuXG5cdFx0XHRlbmNvZGluZyA9IExpbmVhckVuY29kaW5nO1xuXG5cdFx0fSBlbHNlIGlmICggbWFwLmlzVGV4dHVyZSApIHtcblxuXHRcdFx0ZW5jb2RpbmcgPSBtYXAuZW5jb2Rpbmc7XG5cblx0XHR9IGVsc2UgaWYgKCBtYXAuaXNXZWJHTFJlbmRlclRhcmdldCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCBcIlRIUkVFLldlYkdMUHJvZ3JhbXMuZ2V0VGV4dHVyZUVuY29kaW5nRnJvbU1hcDogZG9uJ3QgdXNlIHJlbmRlciB0YXJnZXRzIGFzIHRleHR1cmVzLiBVc2UgdGhlaXIgLnRleHR1cmUgcHJvcGVydHkgaW5zdGVhZC5cIiApO1xuXHRcdFx0ZW5jb2RpbmcgPSBtYXAudGV4dHVyZS5lbmNvZGluZztcblxuXHRcdH1cblxuXHRcdC8vIGFkZCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBmb3IgV2ViR0xSZW5kZXJlci5nYW1tYUlucHV0L2dhbW1hT3V0cHV0IHBhcmFtZXRlciwgc2hvdWxkIHByb2JhYmx5IGJlIHJlbW92ZWQgYXQgc29tZSBwb2ludC5cblx0XHRpZiAoIGVuY29kaW5nID09PSBMaW5lYXJFbmNvZGluZyAmJiBnYW1tYU92ZXJyaWRlTGluZWFyICkge1xuXG5cdFx0XHRlbmNvZGluZyA9IEdhbW1hRW5jb2Rpbmc7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gZW5jb2Rpbmc7XG5cblx0fVxuXG5cdHRoaXMuZ2V0UGFyYW1ldGVycyA9IGZ1bmN0aW9uICggbWF0ZXJpYWwsIGxpZ2h0cywgc2hhZG93cywgZm9nLCBuQ2xpcFBsYW5lcywgbkNsaXBJbnRlcnNlY3Rpb24sIG9iamVjdCApIHtcblxuXHRcdHZhciBzaGFkZXJJRCA9IHNoYWRlcklEc1sgbWF0ZXJpYWwudHlwZSBdO1xuXG5cdFx0Ly8gaGV1cmlzdGljcyB0byBjcmVhdGUgc2hhZGVyIHBhcmFtZXRlcnMgYWNjb3JkaW5nIHRvIGxpZ2h0cyBpbiB0aGUgc2NlbmVcblx0XHQvLyAobm90IHRvIGJsb3cgb3ZlciBtYXhMaWdodHMgYnVkZ2V0KVxuXG5cdFx0dmFyIG1heEJvbmVzID0gb2JqZWN0LmlzU2tpbm5lZE1lc2ggPyBhbGxvY2F0ZUJvbmVzKCBvYmplY3QgKSA6IDA7XG5cdFx0dmFyIHByZWNpc2lvbiA9IGNhcGFiaWxpdGllcy5wcmVjaXNpb247XG5cblx0XHRpZiAoIG1hdGVyaWFsLnByZWNpc2lvbiAhPT0gbnVsbCApIHtcblxuXHRcdFx0cHJlY2lzaW9uID0gY2FwYWJpbGl0aWVzLmdldE1heFByZWNpc2lvbiggbWF0ZXJpYWwucHJlY2lzaW9uICk7XG5cblx0XHRcdGlmICggcHJlY2lzaW9uICE9PSBtYXRlcmlhbC5wcmVjaXNpb24gKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xQcm9ncmFtLmdldFBhcmFtZXRlcnM6JywgbWF0ZXJpYWwucHJlY2lzaW9uLCAnbm90IHN1cHBvcnRlZCwgdXNpbmcnLCBwcmVjaXNpb24sICdpbnN0ZWFkLicgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0dmFyIGN1cnJlbnRSZW5kZXJUYXJnZXQgPSByZW5kZXJlci5nZXRSZW5kZXJUYXJnZXQoKTtcblxuXHRcdHZhciBwYXJhbWV0ZXJzID0ge1xuXG5cdFx0XHRzaGFkZXJJRDogc2hhZGVySUQsXG5cblx0XHRcdHByZWNpc2lvbjogcHJlY2lzaW9uLFxuXHRcdFx0c3VwcG9ydHNWZXJ0ZXhUZXh0dXJlczogY2FwYWJpbGl0aWVzLnZlcnRleFRleHR1cmVzLFxuXHRcdFx0b3V0cHV0RW5jb2Rpbmc6IGdldFRleHR1cmVFbmNvZGluZ0Zyb21NYXAoICggISBjdXJyZW50UmVuZGVyVGFyZ2V0ICkgPyBudWxsIDogY3VycmVudFJlbmRlclRhcmdldC50ZXh0dXJlLCByZW5kZXJlci5nYW1tYU91dHB1dCApLFxuXHRcdFx0bWFwOiAhISBtYXRlcmlhbC5tYXAsXG5cdFx0XHRtYXBFbmNvZGluZzogZ2V0VGV4dHVyZUVuY29kaW5nRnJvbU1hcCggbWF0ZXJpYWwubWFwLCByZW5kZXJlci5nYW1tYUlucHV0ICksXG5cdFx0XHRlbnZNYXA6ICEhIG1hdGVyaWFsLmVudk1hcCxcblx0XHRcdGVudk1hcE1vZGU6IG1hdGVyaWFsLmVudk1hcCAmJiBtYXRlcmlhbC5lbnZNYXAubWFwcGluZyxcblx0XHRcdGVudk1hcEVuY29kaW5nOiBnZXRUZXh0dXJlRW5jb2RpbmdGcm9tTWFwKCBtYXRlcmlhbC5lbnZNYXAsIHJlbmRlcmVyLmdhbW1hSW5wdXQgKSxcblx0XHRcdGVudk1hcEN1YmVVVjogKCAhISBtYXRlcmlhbC5lbnZNYXAgKSAmJiAoICggbWF0ZXJpYWwuZW52TWFwLm1hcHBpbmcgPT09IEN1YmVVVlJlZmxlY3Rpb25NYXBwaW5nICkgfHwgKCBtYXRlcmlhbC5lbnZNYXAubWFwcGluZyA9PT0gQ3ViZVVWUmVmcmFjdGlvbk1hcHBpbmcgKSApLFxuXHRcdFx0bGlnaHRNYXA6ICEhIG1hdGVyaWFsLmxpZ2h0TWFwLFxuXHRcdFx0YW9NYXA6ICEhIG1hdGVyaWFsLmFvTWFwLFxuXHRcdFx0ZW1pc3NpdmVNYXA6ICEhIG1hdGVyaWFsLmVtaXNzaXZlTWFwLFxuXHRcdFx0ZW1pc3NpdmVNYXBFbmNvZGluZzogZ2V0VGV4dHVyZUVuY29kaW5nRnJvbU1hcCggbWF0ZXJpYWwuZW1pc3NpdmVNYXAsIHJlbmRlcmVyLmdhbW1hSW5wdXQgKSxcblx0XHRcdGJ1bXBNYXA6ICEhIG1hdGVyaWFsLmJ1bXBNYXAsXG5cdFx0XHRub3JtYWxNYXA6ICEhIG1hdGVyaWFsLm5vcm1hbE1hcCxcblx0XHRcdGRpc3BsYWNlbWVudE1hcDogISEgbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwLFxuXHRcdFx0cm91Z2huZXNzTWFwOiAhISBtYXRlcmlhbC5yb3VnaG5lc3NNYXAsXG5cdFx0XHRtZXRhbG5lc3NNYXA6ICEhIG1hdGVyaWFsLm1ldGFsbmVzc01hcCxcblx0XHRcdHNwZWN1bGFyTWFwOiAhISBtYXRlcmlhbC5zcGVjdWxhck1hcCxcblx0XHRcdGFscGhhTWFwOiAhISBtYXRlcmlhbC5hbHBoYU1hcCxcblxuXHRcdFx0Z3JhZGllbnRNYXA6ICEhIG1hdGVyaWFsLmdyYWRpZW50TWFwLFxuXG5cdFx0XHRjb21iaW5lOiBtYXRlcmlhbC5jb21iaW5lLFxuXG5cdFx0XHR2ZXJ0ZXhDb2xvcnM6IG1hdGVyaWFsLnZlcnRleENvbG9ycyxcblxuXHRcdFx0Zm9nOiAhISBmb2csXG5cdFx0XHR1c2VGb2c6IG1hdGVyaWFsLmZvZyxcblx0XHRcdGZvZ0V4cDogKCBmb2cgJiYgZm9nLmlzRm9nRXhwMiApLFxuXG5cdFx0XHRmbGF0U2hhZGluZzogbWF0ZXJpYWwuZmxhdFNoYWRpbmcsXG5cblx0XHRcdHNpemVBdHRlbnVhdGlvbjogbWF0ZXJpYWwuc2l6ZUF0dGVudWF0aW9uLFxuXHRcdFx0bG9nYXJpdGhtaWNEZXB0aEJ1ZmZlcjogY2FwYWJpbGl0aWVzLmxvZ2FyaXRobWljRGVwdGhCdWZmZXIsXG5cblx0XHRcdHNraW5uaW5nOiBtYXRlcmlhbC5za2lubmluZyAmJiBtYXhCb25lcyA+IDAsXG5cdFx0XHRtYXhCb25lczogbWF4Qm9uZXMsXG5cdFx0XHR1c2VWZXJ0ZXhUZXh0dXJlOiBjYXBhYmlsaXRpZXMuZmxvYXRWZXJ0ZXhUZXh0dXJlcyxcblxuXHRcdFx0bW9ycGhUYXJnZXRzOiBtYXRlcmlhbC5tb3JwaFRhcmdldHMsXG5cdFx0XHRtb3JwaE5vcm1hbHM6IG1hdGVyaWFsLm1vcnBoTm9ybWFscyxcblx0XHRcdG1heE1vcnBoVGFyZ2V0czogcmVuZGVyZXIubWF4TW9ycGhUYXJnZXRzLFxuXHRcdFx0bWF4TW9ycGhOb3JtYWxzOiByZW5kZXJlci5tYXhNb3JwaE5vcm1hbHMsXG5cblx0XHRcdG51bURpckxpZ2h0czogbGlnaHRzLmRpcmVjdGlvbmFsLmxlbmd0aCxcblx0XHRcdG51bVBvaW50TGlnaHRzOiBsaWdodHMucG9pbnQubGVuZ3RoLFxuXHRcdFx0bnVtU3BvdExpZ2h0czogbGlnaHRzLnNwb3QubGVuZ3RoLFxuXHRcdFx0bnVtUmVjdEFyZWFMaWdodHM6IGxpZ2h0cy5yZWN0QXJlYS5sZW5ndGgsXG5cdFx0XHRudW1IZW1pTGlnaHRzOiBsaWdodHMuaGVtaS5sZW5ndGgsXG5cblx0XHRcdG51bUNsaXBwaW5nUGxhbmVzOiBuQ2xpcFBsYW5lcyxcblx0XHRcdG51bUNsaXBJbnRlcnNlY3Rpb246IG5DbGlwSW50ZXJzZWN0aW9uLFxuXG5cdFx0XHRkaXRoZXJpbmc6IG1hdGVyaWFsLmRpdGhlcmluZyxcblxuXHRcdFx0c2hhZG93TWFwRW5hYmxlZDogcmVuZGVyZXIuc2hhZG93TWFwLmVuYWJsZWQgJiYgb2JqZWN0LnJlY2VpdmVTaGFkb3cgJiYgc2hhZG93cy5sZW5ndGggPiAwLFxuXHRcdFx0c2hhZG93TWFwVHlwZTogcmVuZGVyZXIuc2hhZG93TWFwLnR5cGUsXG5cblx0XHRcdHRvbmVNYXBwaW5nOiByZW5kZXJlci50b25lTWFwcGluZyxcblx0XHRcdHBoeXNpY2FsbHlDb3JyZWN0TGlnaHRzOiByZW5kZXJlci5waHlzaWNhbGx5Q29ycmVjdExpZ2h0cyxcblxuXHRcdFx0cHJlbXVsdGlwbGllZEFscGhhOiBtYXRlcmlhbC5wcmVtdWx0aXBsaWVkQWxwaGEsXG5cblx0XHRcdGFscGhhVGVzdDogbWF0ZXJpYWwuYWxwaGFUZXN0LFxuXHRcdFx0ZG91YmxlU2lkZWQ6IG1hdGVyaWFsLnNpZGUgPT09IERvdWJsZVNpZGUsXG5cdFx0XHRmbGlwU2lkZWQ6IG1hdGVyaWFsLnNpZGUgPT09IEJhY2tTaWRlLFxuXG5cdFx0XHRkZXB0aFBhY2tpbmc6ICggbWF0ZXJpYWwuZGVwdGhQYWNraW5nICE9PSB1bmRlZmluZWQgKSA/IG1hdGVyaWFsLmRlcHRoUGFja2luZyA6IGZhbHNlXG5cblx0XHR9O1xuXG5cdFx0cmV0dXJuIHBhcmFtZXRlcnM7XG5cblx0fTtcblxuXHR0aGlzLmdldFByb2dyYW1Db2RlID0gZnVuY3Rpb24gKCBtYXRlcmlhbCwgcGFyYW1ldGVycyApIHtcblxuXHRcdHZhciBhcnJheSA9IFtdO1xuXG5cdFx0aWYgKCBwYXJhbWV0ZXJzLnNoYWRlcklEICkge1xuXG5cdFx0XHRhcnJheS5wdXNoKCBwYXJhbWV0ZXJzLnNoYWRlcklEICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRhcnJheS5wdXNoKCBtYXRlcmlhbC5mcmFnbWVudFNoYWRlciApO1xuXHRcdFx0YXJyYXkucHVzaCggbWF0ZXJpYWwudmVydGV4U2hhZGVyICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLmRlZmluZXMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Zm9yICggdmFyIG5hbWUgaW4gbWF0ZXJpYWwuZGVmaW5lcyApIHtcblxuXHRcdFx0XHRhcnJheS5wdXNoKCBuYW1lICk7XG5cdFx0XHRcdGFycmF5LnB1c2goIG1hdGVyaWFsLmRlZmluZXNbIG5hbWUgXSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBwYXJhbWV0ZXJOYW1lcy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdGFycmF5LnB1c2goIHBhcmFtZXRlcnNbIHBhcmFtZXRlck5hbWVzWyBpIF0gXSApO1xuXG5cdFx0fVxuXG5cdFx0YXJyYXkucHVzaCggbWF0ZXJpYWwub25CZWZvcmVDb21waWxlLnRvU3RyaW5nKCkgKTtcblxuXHRcdGFycmF5LnB1c2goIHJlbmRlcmVyLmdhbW1hT3V0cHV0ICk7XG5cblx0XHRyZXR1cm4gYXJyYXkuam9pbigpO1xuXG5cdH07XG5cblx0dGhpcy5hY3F1aXJlUHJvZ3JhbSA9IGZ1bmN0aW9uICggbWF0ZXJpYWwsIHNoYWRlciwgcGFyYW1ldGVycywgY29kZSApIHtcblxuXHRcdHZhciBwcm9ncmFtO1xuXG5cdFx0Ly8gQ2hlY2sgaWYgY29kZSBoYXMgYmVlbiBhbHJlYWR5IGNvbXBpbGVkXG5cdFx0Zm9yICggdmFyIHAgPSAwLCBwbCA9IHByb2dyYW1zLmxlbmd0aDsgcCA8IHBsOyBwICsrICkge1xuXG5cdFx0XHR2YXIgcHJvZ3JhbUluZm8gPSBwcm9ncmFtc1sgcCBdO1xuXG5cdFx0XHRpZiAoIHByb2dyYW1JbmZvLmNvZGUgPT09IGNvZGUgKSB7XG5cblx0XHRcdFx0cHJvZ3JhbSA9IHByb2dyYW1JbmZvO1xuXHRcdFx0XHQrKyBwcm9ncmFtLnVzZWRUaW1lcztcblxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCBwcm9ncmFtID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHByb2dyYW0gPSBuZXcgV2ViR0xQcm9ncmFtKCByZW5kZXJlciwgZXh0ZW5zaW9ucywgY29kZSwgbWF0ZXJpYWwsIHNoYWRlciwgcGFyYW1ldGVycyApO1xuXHRcdFx0cHJvZ3JhbXMucHVzaCggcHJvZ3JhbSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHByb2dyYW07XG5cblx0fTtcblxuXHR0aGlzLnJlbGVhc2VQcm9ncmFtID0gZnVuY3Rpb24gKCBwcm9ncmFtICkge1xuXG5cdFx0aWYgKCAtLSBwcm9ncmFtLnVzZWRUaW1lcyA9PT0gMCApIHtcblxuXHRcdFx0Ly8gUmVtb3ZlIGZyb20gdW5vcmRlcmVkIHNldFxuXHRcdFx0dmFyIGkgPSBwcm9ncmFtcy5pbmRleE9mKCBwcm9ncmFtICk7XG5cdFx0XHRwcm9ncmFtc1sgaSBdID0gcHJvZ3JhbXNbIHByb2dyYW1zLmxlbmd0aCAtIDEgXTtcblx0XHRcdHByb2dyYW1zLnBvcCgpO1xuXG5cdFx0XHQvLyBGcmVlIFdlYkdMIHJlc291cmNlc1xuXHRcdFx0cHJvZ3JhbS5kZXN0cm95KCk7XG5cblx0XHR9XG5cblx0fTtcblxuXHQvLyBFeHBvc2VkIGZvciByZXNvdXJjZSBtb25pdG9yaW5nICYgZXJyb3IgZmVlZGJhY2sgdmlhIHJlbmRlcmVyLmluZm86XG5cdHRoaXMucHJvZ3JhbXMgPSBwcm9ncmFtcztcblxufVxuXG4vKipcbiAqIEBhdXRob3IgZm9yZGFjaW91cyAvIGZvcmRhY2lvdXMuZ2l0aHViLmlvXG4gKi9cblxuZnVuY3Rpb24gV2ViR0xQcm9wZXJ0aWVzKCkge1xuXG5cdHZhciBwcm9wZXJ0aWVzID0gbmV3IFdlYWtNYXAoKTtcblxuXHRmdW5jdGlvbiBnZXQoIG9iamVjdCApIHtcblxuXHRcdHZhciBtYXAgPSBwcm9wZXJ0aWVzLmdldCggb2JqZWN0ICk7XG5cblx0XHRpZiAoIG1hcCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRtYXAgPSB7fTtcblx0XHRcdHByb3BlcnRpZXMuc2V0KCBvYmplY3QsIG1hcCApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIG1hcDtcblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVtb3ZlKCBvYmplY3QgKSB7XG5cblx0XHRwcm9wZXJ0aWVzLmRlbGV0ZSggb2JqZWN0ICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHVwZGF0ZSggb2JqZWN0LCBrZXksIHZhbHVlICkge1xuXG5cdFx0cHJvcGVydGllcy5nZXQoIG9iamVjdCApWyBrZXkgXSA9IHZhbHVlO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBkaXNwb3NlKCkge1xuXG5cdFx0cHJvcGVydGllcyA9IG5ldyBXZWFrTWFwKCk7XG5cblx0fVxuXG5cdHJldHVybiB7XG5cdFx0Z2V0OiBnZXQsXG5cdFx0cmVtb3ZlOiByZW1vdmUsXG5cdFx0dXBkYXRlOiB1cGRhdGUsXG5cdFx0ZGlzcG9zZTogZGlzcG9zZVxuXHR9O1xuXG59XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBwYWludGVyU29ydFN0YWJsZSggYSwgYiApIHtcblxuXHRpZiAoIGEucmVuZGVyT3JkZXIgIT09IGIucmVuZGVyT3JkZXIgKSB7XG5cblx0XHRyZXR1cm4gYS5yZW5kZXJPcmRlciAtIGIucmVuZGVyT3JkZXI7XG5cblx0fSBlbHNlIGlmICggYS5wcm9ncmFtICYmIGIucHJvZ3JhbSAmJiBhLnByb2dyYW0gIT09IGIucHJvZ3JhbSApIHtcblxuXHRcdHJldHVybiBhLnByb2dyYW0uaWQgLSBiLnByb2dyYW0uaWQ7XG5cblx0fSBlbHNlIGlmICggYS5tYXRlcmlhbC5pZCAhPT0gYi5tYXRlcmlhbC5pZCApIHtcblxuXHRcdHJldHVybiBhLm1hdGVyaWFsLmlkIC0gYi5tYXRlcmlhbC5pZDtcblxuXHR9IGVsc2UgaWYgKCBhLnogIT09IGIueiApIHtcblxuXHRcdHJldHVybiBhLnogLSBiLno7XG5cblx0fSBlbHNlIHtcblxuXHRcdHJldHVybiBhLmlkIC0gYi5pZDtcblxuXHR9XG5cbn1cblxuZnVuY3Rpb24gcmV2ZXJzZVBhaW50ZXJTb3J0U3RhYmxlKCBhLCBiICkge1xuXG5cdGlmICggYS5yZW5kZXJPcmRlciAhPT0gYi5yZW5kZXJPcmRlciApIHtcblxuXHRcdHJldHVybiBhLnJlbmRlck9yZGVyIC0gYi5yZW5kZXJPcmRlcjtcblxuXHR9IGlmICggYS56ICE9PSBiLnogKSB7XG5cblx0XHRyZXR1cm4gYi56IC0gYS56O1xuXG5cdH0gZWxzZSB7XG5cblx0XHRyZXR1cm4gYS5pZCAtIGIuaWQ7XG5cblx0fVxuXG59XG5cbmZ1bmN0aW9uIFdlYkdMUmVuZGVyTGlzdCgpIHtcblxuXHR2YXIgcmVuZGVySXRlbXMgPSBbXTtcblx0dmFyIHJlbmRlckl0ZW1zSW5kZXggPSAwO1xuXG5cdHZhciBvcGFxdWUgPSBbXTtcblx0dmFyIHRyYW5zcGFyZW50ID0gW107XG5cblx0ZnVuY3Rpb24gaW5pdCgpIHtcblxuXHRcdHJlbmRlckl0ZW1zSW5kZXggPSAwO1xuXG5cdFx0b3BhcXVlLmxlbmd0aCA9IDA7XG5cdFx0dHJhbnNwYXJlbnQubGVuZ3RoID0gMDtcblxuXHR9XG5cblx0ZnVuY3Rpb24gcHVzaCggb2JqZWN0LCBnZW9tZXRyeSwgbWF0ZXJpYWwsIHosIGdyb3VwICkge1xuXG5cdFx0dmFyIHJlbmRlckl0ZW0gPSByZW5kZXJJdGVtc1sgcmVuZGVySXRlbXNJbmRleCBdO1xuXG5cdFx0aWYgKCByZW5kZXJJdGVtID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHJlbmRlckl0ZW0gPSB7XG5cdFx0XHRcdGlkOiBvYmplY3QuaWQsXG5cdFx0XHRcdG9iamVjdDogb2JqZWN0LFxuXHRcdFx0XHRnZW9tZXRyeTogZ2VvbWV0cnksXG5cdFx0XHRcdG1hdGVyaWFsOiBtYXRlcmlhbCxcblx0XHRcdFx0cHJvZ3JhbTogbWF0ZXJpYWwucHJvZ3JhbSxcblx0XHRcdFx0cmVuZGVyT3JkZXI6IG9iamVjdC5yZW5kZXJPcmRlcixcblx0XHRcdFx0ejogeixcblx0XHRcdFx0Z3JvdXA6IGdyb3VwXG5cdFx0XHR9O1xuXG5cdFx0XHRyZW5kZXJJdGVtc1sgcmVuZGVySXRlbXNJbmRleCBdID0gcmVuZGVySXRlbTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHJlbmRlckl0ZW0uaWQgPSBvYmplY3QuaWQ7XG5cdFx0XHRyZW5kZXJJdGVtLm9iamVjdCA9IG9iamVjdDtcblx0XHRcdHJlbmRlckl0ZW0uZ2VvbWV0cnkgPSBnZW9tZXRyeTtcblx0XHRcdHJlbmRlckl0ZW0ubWF0ZXJpYWwgPSBtYXRlcmlhbDtcblx0XHRcdHJlbmRlckl0ZW0ucHJvZ3JhbSA9IG1hdGVyaWFsLnByb2dyYW07XG5cdFx0XHRyZW5kZXJJdGVtLnJlbmRlck9yZGVyID0gb2JqZWN0LnJlbmRlck9yZGVyO1xuXHRcdFx0cmVuZGVySXRlbS56ID0gejtcblx0XHRcdHJlbmRlckl0ZW0uZ3JvdXAgPSBncm91cDtcblxuXHRcdH1cblxuXHRcdCggbWF0ZXJpYWwudHJhbnNwYXJlbnQgPT09IHRydWUgPyB0cmFuc3BhcmVudCA6IG9wYXF1ZSApLnB1c2goIHJlbmRlckl0ZW0gKTtcblxuXHRcdHJlbmRlckl0ZW1zSW5kZXggKys7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHNvcnQoKSB7XG5cblx0XHRpZiAoIG9wYXF1ZS5sZW5ndGggPiAxICkgb3BhcXVlLnNvcnQoIHBhaW50ZXJTb3J0U3RhYmxlICk7XG5cdFx0aWYgKCB0cmFuc3BhcmVudC5sZW5ndGggPiAxICkgdHJhbnNwYXJlbnQuc29ydCggcmV2ZXJzZVBhaW50ZXJTb3J0U3RhYmxlICk7XG5cblx0fVxuXG5cdHJldHVybiB7XG5cdFx0b3BhcXVlOiBvcGFxdWUsXG5cdFx0dHJhbnNwYXJlbnQ6IHRyYW5zcGFyZW50LFxuXG5cdFx0aW5pdDogaW5pdCxcblx0XHRwdXNoOiBwdXNoLFxuXG5cdFx0c29ydDogc29ydFxuXHR9O1xuXG59XG5cbmZ1bmN0aW9uIFdlYkdMUmVuZGVyTGlzdHMoKSB7XG5cblx0dmFyIGxpc3RzID0ge307XG5cblx0ZnVuY3Rpb24gZ2V0KCBzY2VuZSwgY2FtZXJhICkge1xuXG5cdFx0dmFyIGhhc2ggPSBzY2VuZS5pZCArICcsJyArIGNhbWVyYS5pZDtcblx0XHR2YXIgbGlzdCA9IGxpc3RzWyBoYXNoIF07XG5cblx0XHRpZiAoIGxpc3QgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Ly8gY29uc29sZS5sb2coICdUSFJFRS5XZWJHTFJlbmRlckxpc3RzOicsIGhhc2ggKTtcblxuXHRcdFx0bGlzdCA9IG5ldyBXZWJHTFJlbmRlckxpc3QoKTtcblx0XHRcdGxpc3RzWyBoYXNoIF0gPSBsaXN0O1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGxpc3Q7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGRpc3Bvc2UoKSB7XG5cblx0XHRsaXN0cyA9IHt9O1xuXG5cdH1cblxuXHRyZXR1cm4ge1xuXHRcdGdldDogZ2V0LFxuXHRcdGRpc3Bvc2U6IGRpc3Bvc2Vcblx0fTtcblxufVxuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gVW5pZm9ybXNDYWNoZSgpIHtcblxuXHR2YXIgbGlnaHRzID0ge307XG5cblx0cmV0dXJuIHtcblxuXHRcdGdldDogZnVuY3Rpb24gKCBsaWdodCApIHtcblxuXHRcdFx0aWYgKCBsaWdodHNbIGxpZ2h0LmlkIF0gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRyZXR1cm4gbGlnaHRzWyBsaWdodC5pZCBdO1xuXG5cdFx0XHR9XG5cblx0XHRcdHZhciB1bmlmb3JtcztcblxuXHRcdFx0c3dpdGNoICggbGlnaHQudHlwZSApIHtcblxuXHRcdFx0XHRjYXNlICdEaXJlY3Rpb25hbExpZ2h0Jzpcblx0XHRcdFx0XHR1bmlmb3JtcyA9IHtcblx0XHRcdFx0XHRcdGRpcmVjdGlvbjogbmV3IFZlY3RvcjMoKSxcblx0XHRcdFx0XHRcdGNvbG9yOiBuZXcgQ29sb3IoKSxcblxuXHRcdFx0XHRcdFx0c2hhZG93OiBmYWxzZSxcblx0XHRcdFx0XHRcdHNoYWRvd0JpYXM6IDAsXG5cdFx0XHRcdFx0XHRzaGFkb3dSYWRpdXM6IDEsXG5cdFx0XHRcdFx0XHRzaGFkb3dNYXBTaXplOiBuZXcgVmVjdG9yMigpXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlICdTcG90TGlnaHQnOlxuXHRcdFx0XHRcdHVuaWZvcm1zID0ge1xuXHRcdFx0XHRcdFx0cG9zaXRpb246IG5ldyBWZWN0b3IzKCksXG5cdFx0XHRcdFx0XHRkaXJlY3Rpb246IG5ldyBWZWN0b3IzKCksXG5cdFx0XHRcdFx0XHRjb2xvcjogbmV3IENvbG9yKCksXG5cdFx0XHRcdFx0XHRkaXN0YW5jZTogMCxcblx0XHRcdFx0XHRcdGNvbmVDb3M6IDAsXG5cdFx0XHRcdFx0XHRwZW51bWJyYUNvczogMCxcblx0XHRcdFx0XHRcdGRlY2F5OiAwLFxuXG5cdFx0XHRcdFx0XHRzaGFkb3c6IGZhbHNlLFxuXHRcdFx0XHRcdFx0c2hhZG93QmlhczogMCxcblx0XHRcdFx0XHRcdHNoYWRvd1JhZGl1czogMSxcblx0XHRcdFx0XHRcdHNoYWRvd01hcFNpemU6IG5ldyBWZWN0b3IyKClcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgJ1BvaW50TGlnaHQnOlxuXHRcdFx0XHRcdHVuaWZvcm1zID0ge1xuXHRcdFx0XHRcdFx0cG9zaXRpb246IG5ldyBWZWN0b3IzKCksXG5cdFx0XHRcdFx0XHRjb2xvcjogbmV3IENvbG9yKCksXG5cdFx0XHRcdFx0XHRkaXN0YW5jZTogMCxcblx0XHRcdFx0XHRcdGRlY2F5OiAwLFxuXG5cdFx0XHRcdFx0XHRzaGFkb3c6IGZhbHNlLFxuXHRcdFx0XHRcdFx0c2hhZG93QmlhczogMCxcblx0XHRcdFx0XHRcdHNoYWRvd1JhZGl1czogMSxcblx0XHRcdFx0XHRcdHNoYWRvd01hcFNpemU6IG5ldyBWZWN0b3IyKCksXG5cdFx0XHRcdFx0XHRzaGFkb3dDYW1lcmFOZWFyOiAxLFxuXHRcdFx0XHRcdFx0c2hhZG93Q2FtZXJhRmFyOiAxMDAwXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlICdIZW1pc3BoZXJlTGlnaHQnOlxuXHRcdFx0XHRcdHVuaWZvcm1zID0ge1xuXHRcdFx0XHRcdFx0ZGlyZWN0aW9uOiBuZXcgVmVjdG9yMygpLFxuXHRcdFx0XHRcdFx0c2t5Q29sb3I6IG5ldyBDb2xvcigpLFxuXHRcdFx0XHRcdFx0Z3JvdW5kQ29sb3I6IG5ldyBDb2xvcigpXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlICdSZWN0QXJlYUxpZ2h0Jzpcblx0XHRcdFx0XHR1bmlmb3JtcyA9IHtcblx0XHRcdFx0XHRcdGNvbG9yOiBuZXcgQ29sb3IoKSxcblx0XHRcdFx0XHRcdHBvc2l0aW9uOiBuZXcgVmVjdG9yMygpLFxuXHRcdFx0XHRcdFx0aGFsZldpZHRoOiBuZXcgVmVjdG9yMygpLFxuXHRcdFx0XHRcdFx0aGFsZkhlaWdodDogbmV3IFZlY3RvcjMoKVxuXHRcdFx0XHRcdFx0Ly8gVE9ETyAoYWJlbG5hdGlvbik6IHNldCBSZWN0QXJlYUxpZ2h0IHNoYWRvdyB1bmlmb3Jtc1xuXHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdH1cblxuXHRcdFx0bGlnaHRzWyBsaWdodC5pZCBdID0gdW5pZm9ybXM7XG5cblx0XHRcdHJldHVybiB1bmlmb3JtcztcblxuXHRcdH1cblxuXHR9O1xuXG59XG5cbnZhciBjb3VudCA9IDA7XG5cbmZ1bmN0aW9uIFdlYkdMTGlnaHRzKCkge1xuXG5cdHZhciBjYWNoZSA9IG5ldyBVbmlmb3Jtc0NhY2hlKCk7XG5cblx0dmFyIHN0YXRlID0ge1xuXG5cdFx0aWQ6IGNvdW50ICsrLFxuXG5cdFx0aGFzaDogJycsXG5cblx0XHRhbWJpZW50OiBbIDAsIDAsIDAgXSxcblx0XHRkaXJlY3Rpb25hbDogW10sXG5cdFx0ZGlyZWN0aW9uYWxTaGFkb3dNYXA6IFtdLFxuXHRcdGRpcmVjdGlvbmFsU2hhZG93TWF0cml4OiBbXSxcblx0XHRzcG90OiBbXSxcblx0XHRzcG90U2hhZG93TWFwOiBbXSxcblx0XHRzcG90U2hhZG93TWF0cml4OiBbXSxcblx0XHRyZWN0QXJlYTogW10sXG5cdFx0cG9pbnQ6IFtdLFxuXHRcdHBvaW50U2hhZG93TWFwOiBbXSxcblx0XHRwb2ludFNoYWRvd01hdHJpeDogW10sXG5cdFx0aGVtaTogW11cblxuXHR9O1xuXG5cdHZhciB2ZWN0b3IzID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIG1hdHJpeDQgPSBuZXcgTWF0cml4NCgpO1xuXHR2YXIgbWF0cml4NDIgPSBuZXcgTWF0cml4NCgpO1xuXG5cdGZ1bmN0aW9uIHNldHVwKCBsaWdodHMsIHNoYWRvd3MsIGNhbWVyYSApIHtcblxuXHRcdHZhciByID0gMCwgZyA9IDAsIGIgPSAwO1xuXG5cdFx0dmFyIGRpcmVjdGlvbmFsTGVuZ3RoID0gMDtcblx0XHR2YXIgcG9pbnRMZW5ndGggPSAwO1xuXHRcdHZhciBzcG90TGVuZ3RoID0gMDtcblx0XHR2YXIgcmVjdEFyZWFMZW5ndGggPSAwO1xuXHRcdHZhciBoZW1pTGVuZ3RoID0gMDtcblxuXHRcdHZhciB2aWV3TWF0cml4ID0gY2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGxpZ2h0cy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgbGlnaHQgPSBsaWdodHNbIGkgXTtcblxuXHRcdFx0dmFyIGNvbG9yID0gbGlnaHQuY29sb3I7XG5cdFx0XHR2YXIgaW50ZW5zaXR5ID0gbGlnaHQuaW50ZW5zaXR5O1xuXHRcdFx0dmFyIGRpc3RhbmNlID0gbGlnaHQuZGlzdGFuY2U7XG5cblx0XHRcdHZhciBzaGFkb3dNYXAgPSAoIGxpZ2h0LnNoYWRvdyAmJiBsaWdodC5zaGFkb3cubWFwICkgPyBsaWdodC5zaGFkb3cubWFwLnRleHR1cmUgOiBudWxsO1xuXG5cdFx0XHRpZiAoIGxpZ2h0LmlzQW1iaWVudExpZ2h0ICkge1xuXG5cdFx0XHRcdHIgKz0gY29sb3IuciAqIGludGVuc2l0eTtcblx0XHRcdFx0ZyArPSBjb2xvci5nICogaW50ZW5zaXR5O1xuXHRcdFx0XHRiICs9IGNvbG9yLmIgKiBpbnRlbnNpdHk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIGxpZ2h0LmlzRGlyZWN0aW9uYWxMaWdodCApIHtcblxuXHRcdFx0XHR2YXIgdW5pZm9ybXMgPSBjYWNoZS5nZXQoIGxpZ2h0ICk7XG5cblx0XHRcdFx0dW5pZm9ybXMuY29sb3IuY29weSggbGlnaHQuY29sb3IgKS5tdWx0aXBseVNjYWxhciggbGlnaHQuaW50ZW5zaXR5ICk7XG5cdFx0XHRcdHVuaWZvcm1zLmRpcmVjdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGxpZ2h0Lm1hdHJpeFdvcmxkICk7XG5cdFx0XHRcdHZlY3RvcjMuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBsaWdodC50YXJnZXQubWF0cml4V29ybGQgKTtcblx0XHRcdFx0dW5pZm9ybXMuZGlyZWN0aW9uLnN1YiggdmVjdG9yMyApO1xuXHRcdFx0XHR1bmlmb3Jtcy5kaXJlY3Rpb24udHJhbnNmb3JtRGlyZWN0aW9uKCB2aWV3TWF0cml4ICk7XG5cblx0XHRcdFx0dW5pZm9ybXMuc2hhZG93ID0gbGlnaHQuY2FzdFNoYWRvdztcblxuXHRcdFx0XHRpZiAoIGxpZ2h0LmNhc3RTaGFkb3cgKSB7XG5cblx0XHRcdFx0XHR2YXIgc2hhZG93ID0gbGlnaHQuc2hhZG93O1xuXG5cdFx0XHRcdFx0dW5pZm9ybXMuc2hhZG93QmlhcyA9IHNoYWRvdy5iaWFzO1xuXHRcdFx0XHRcdHVuaWZvcm1zLnNoYWRvd1JhZGl1cyA9IHNoYWRvdy5yYWRpdXM7XG5cdFx0XHRcdFx0dW5pZm9ybXMuc2hhZG93TWFwU2l6ZSA9IHNoYWRvdy5tYXBTaXplO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRzdGF0ZS5kaXJlY3Rpb25hbFNoYWRvd01hcFsgZGlyZWN0aW9uYWxMZW5ndGggXSA9IHNoYWRvd01hcDtcblx0XHRcdFx0c3RhdGUuZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXhbIGRpcmVjdGlvbmFsTGVuZ3RoIF0gPSBsaWdodC5zaGFkb3cubWF0cml4O1xuXHRcdFx0XHRzdGF0ZS5kaXJlY3Rpb25hbFsgZGlyZWN0aW9uYWxMZW5ndGggXSA9IHVuaWZvcm1zO1xuXG5cdFx0XHRcdGRpcmVjdGlvbmFsTGVuZ3RoICsrO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBsaWdodC5pc1Nwb3RMaWdodCApIHtcblxuXHRcdFx0XHR2YXIgdW5pZm9ybXMgPSBjYWNoZS5nZXQoIGxpZ2h0ICk7XG5cblx0XHRcdFx0dW5pZm9ybXMucG9zaXRpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBsaWdodC5tYXRyaXhXb3JsZCApO1xuXHRcdFx0XHR1bmlmb3Jtcy5wb3NpdGlvbi5hcHBseU1hdHJpeDQoIHZpZXdNYXRyaXggKTtcblxuXHRcdFx0XHR1bmlmb3Jtcy5jb2xvci5jb3B5KCBjb2xvciApLm11bHRpcGx5U2NhbGFyKCBpbnRlbnNpdHkgKTtcblx0XHRcdFx0dW5pZm9ybXMuZGlzdGFuY2UgPSBkaXN0YW5jZTtcblxuXHRcdFx0XHR1bmlmb3Jtcy5kaXJlY3Rpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBsaWdodC5tYXRyaXhXb3JsZCApO1xuXHRcdFx0XHR2ZWN0b3IzLnNldEZyb21NYXRyaXhQb3NpdGlvbiggbGlnaHQudGFyZ2V0Lm1hdHJpeFdvcmxkICk7XG5cdFx0XHRcdHVuaWZvcm1zLmRpcmVjdGlvbi5zdWIoIHZlY3RvcjMgKTtcblx0XHRcdFx0dW5pZm9ybXMuZGlyZWN0aW9uLnRyYW5zZm9ybURpcmVjdGlvbiggdmlld01hdHJpeCApO1xuXG5cdFx0XHRcdHVuaWZvcm1zLmNvbmVDb3MgPSBNYXRoLmNvcyggbGlnaHQuYW5nbGUgKTtcblx0XHRcdFx0dW5pZm9ybXMucGVudW1icmFDb3MgPSBNYXRoLmNvcyggbGlnaHQuYW5nbGUgKiAoIDEgLSBsaWdodC5wZW51bWJyYSApICk7XG5cdFx0XHRcdHVuaWZvcm1zLmRlY2F5ID0gKCBsaWdodC5kaXN0YW5jZSA9PT0gMCApID8gMC4wIDogbGlnaHQuZGVjYXk7XG5cblx0XHRcdFx0dW5pZm9ybXMuc2hhZG93ID0gbGlnaHQuY2FzdFNoYWRvdztcblxuXHRcdFx0XHRpZiAoIGxpZ2h0LmNhc3RTaGFkb3cgKSB7XG5cblx0XHRcdFx0XHR2YXIgc2hhZG93ID0gbGlnaHQuc2hhZG93O1xuXG5cdFx0XHRcdFx0dW5pZm9ybXMuc2hhZG93QmlhcyA9IHNoYWRvdy5iaWFzO1xuXHRcdFx0XHRcdHVuaWZvcm1zLnNoYWRvd1JhZGl1cyA9IHNoYWRvdy5yYWRpdXM7XG5cdFx0XHRcdFx0dW5pZm9ybXMuc2hhZG93TWFwU2l6ZSA9IHNoYWRvdy5tYXBTaXplO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRzdGF0ZS5zcG90U2hhZG93TWFwWyBzcG90TGVuZ3RoIF0gPSBzaGFkb3dNYXA7XG5cdFx0XHRcdHN0YXRlLnNwb3RTaGFkb3dNYXRyaXhbIHNwb3RMZW5ndGggXSA9IGxpZ2h0LnNoYWRvdy5tYXRyaXg7XG5cdFx0XHRcdHN0YXRlLnNwb3RbIHNwb3RMZW5ndGggXSA9IHVuaWZvcm1zO1xuXG5cdFx0XHRcdHNwb3RMZW5ndGggKys7XG5cblx0XHRcdH0gZWxzZSBpZiAoIGxpZ2h0LmlzUmVjdEFyZWFMaWdodCApIHtcblxuXHRcdFx0XHR2YXIgdW5pZm9ybXMgPSBjYWNoZS5nZXQoIGxpZ2h0ICk7XG5cblx0XHRcdFx0Ly8gKGEpIGludGVuc2l0eSBpcyB0aGUgdG90YWwgdmlzaWJsZSBsaWdodCBlbWl0dGVkXG5cdFx0XHRcdC8vdW5pZm9ybXMuY29sb3IuY29weSggY29sb3IgKS5tdWx0aXBseVNjYWxhciggaW50ZW5zaXR5IC8gKCBsaWdodC53aWR0aCAqIGxpZ2h0LmhlaWdodCAqIE1hdGguUEkgKSApO1xuXG5cdFx0XHRcdC8vIChiKSBpbnRlbnNpdHkgaXMgdGhlIGJyaWdodG5lc3Mgb2YgdGhlIGxpZ2h0XG5cdFx0XHRcdHVuaWZvcm1zLmNvbG9yLmNvcHkoIGNvbG9yICkubXVsdGlwbHlTY2FsYXIoIGludGVuc2l0eSApO1xuXG5cdFx0XHRcdHVuaWZvcm1zLnBvc2l0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbiggbGlnaHQubWF0cml4V29ybGQgKTtcblx0XHRcdFx0dW5pZm9ybXMucG9zaXRpb24uYXBwbHlNYXRyaXg0KCB2aWV3TWF0cml4ICk7XG5cblx0XHRcdFx0Ly8gZXh0cmFjdCBsb2NhbCByb3RhdGlvbiBvZiBsaWdodCB0byBkZXJpdmUgd2lkdGgvaGVpZ2h0IGhhbGYgdmVjdG9yc1xuXHRcdFx0XHRtYXRyaXg0Mi5pZGVudGl0eSgpO1xuXHRcdFx0XHRtYXRyaXg0LmNvcHkoIGxpZ2h0Lm1hdHJpeFdvcmxkICk7XG5cdFx0XHRcdG1hdHJpeDQucHJlbXVsdGlwbHkoIHZpZXdNYXRyaXggKTtcblx0XHRcdFx0bWF0cml4NDIuZXh0cmFjdFJvdGF0aW9uKCBtYXRyaXg0ICk7XG5cblx0XHRcdFx0dW5pZm9ybXMuaGFsZldpZHRoLnNldCggbGlnaHQud2lkdGggKiAwLjUsIDAuMCwgMC4wICk7XG5cdFx0XHRcdHVuaWZvcm1zLmhhbGZIZWlnaHQuc2V0KCAwLjAsIGxpZ2h0LmhlaWdodCAqIDAuNSwgMC4wICk7XG5cblx0XHRcdFx0dW5pZm9ybXMuaGFsZldpZHRoLmFwcGx5TWF0cml4NCggbWF0cml4NDIgKTtcblx0XHRcdFx0dW5pZm9ybXMuaGFsZkhlaWdodC5hcHBseU1hdHJpeDQoIG1hdHJpeDQyICk7XG5cblx0XHRcdFx0Ly8gVE9ETyAoYWJlbG5hdGlvbik6IFJlY3RBcmVhTGlnaHQgZGlzdGFuY2U/XG5cdFx0XHRcdC8vIHVuaWZvcm1zLmRpc3RhbmNlID0gZGlzdGFuY2U7XG5cblx0XHRcdFx0c3RhdGUucmVjdEFyZWFbIHJlY3RBcmVhTGVuZ3RoIF0gPSB1bmlmb3JtcztcblxuXHRcdFx0XHRyZWN0QXJlYUxlbmd0aCArKztcblxuXHRcdFx0fSBlbHNlIGlmICggbGlnaHQuaXNQb2ludExpZ2h0ICkge1xuXG5cdFx0XHRcdHZhciB1bmlmb3JtcyA9IGNhY2hlLmdldCggbGlnaHQgKTtcblxuXHRcdFx0XHR1bmlmb3Jtcy5wb3NpdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGxpZ2h0Lm1hdHJpeFdvcmxkICk7XG5cdFx0XHRcdHVuaWZvcm1zLnBvc2l0aW9uLmFwcGx5TWF0cml4NCggdmlld01hdHJpeCApO1xuXG5cdFx0XHRcdHVuaWZvcm1zLmNvbG9yLmNvcHkoIGxpZ2h0LmNvbG9yICkubXVsdGlwbHlTY2FsYXIoIGxpZ2h0LmludGVuc2l0eSApO1xuXHRcdFx0XHR1bmlmb3Jtcy5kaXN0YW5jZSA9IGxpZ2h0LmRpc3RhbmNlO1xuXHRcdFx0XHR1bmlmb3Jtcy5kZWNheSA9ICggbGlnaHQuZGlzdGFuY2UgPT09IDAgKSA/IDAuMCA6IGxpZ2h0LmRlY2F5O1xuXG5cdFx0XHRcdHVuaWZvcm1zLnNoYWRvdyA9IGxpZ2h0LmNhc3RTaGFkb3c7XG5cblx0XHRcdFx0aWYgKCBsaWdodC5jYXN0U2hhZG93ICkge1xuXG5cdFx0XHRcdFx0dmFyIHNoYWRvdyA9IGxpZ2h0LnNoYWRvdztcblxuXHRcdFx0XHRcdHVuaWZvcm1zLnNoYWRvd0JpYXMgPSBzaGFkb3cuYmlhcztcblx0XHRcdFx0XHR1bmlmb3Jtcy5zaGFkb3dSYWRpdXMgPSBzaGFkb3cucmFkaXVzO1xuXHRcdFx0XHRcdHVuaWZvcm1zLnNoYWRvd01hcFNpemUgPSBzaGFkb3cubWFwU2l6ZTtcblx0XHRcdFx0XHR1bmlmb3Jtcy5zaGFkb3dDYW1lcmFOZWFyID0gc2hhZG93LmNhbWVyYS5uZWFyO1xuXHRcdFx0XHRcdHVuaWZvcm1zLnNoYWRvd0NhbWVyYUZhciA9IHNoYWRvdy5jYW1lcmEuZmFyO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRzdGF0ZS5wb2ludFNoYWRvd01hcFsgcG9pbnRMZW5ndGggXSA9IHNoYWRvd01hcDtcblx0XHRcdFx0c3RhdGUucG9pbnRTaGFkb3dNYXRyaXhbIHBvaW50TGVuZ3RoIF0gPSBsaWdodC5zaGFkb3cubWF0cml4O1xuXHRcdFx0XHRzdGF0ZS5wb2ludFsgcG9pbnRMZW5ndGggXSA9IHVuaWZvcm1zO1xuXG5cdFx0XHRcdHBvaW50TGVuZ3RoICsrO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBsaWdodC5pc0hlbWlzcGhlcmVMaWdodCApIHtcblxuXHRcdFx0XHR2YXIgdW5pZm9ybXMgPSBjYWNoZS5nZXQoIGxpZ2h0ICk7XG5cblx0XHRcdFx0dW5pZm9ybXMuZGlyZWN0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbiggbGlnaHQubWF0cml4V29ybGQgKTtcblx0XHRcdFx0dW5pZm9ybXMuZGlyZWN0aW9uLnRyYW5zZm9ybURpcmVjdGlvbiggdmlld01hdHJpeCApO1xuXHRcdFx0XHR1bmlmb3Jtcy5kaXJlY3Rpb24ubm9ybWFsaXplKCk7XG5cblx0XHRcdFx0dW5pZm9ybXMuc2t5Q29sb3IuY29weSggbGlnaHQuY29sb3IgKS5tdWx0aXBseVNjYWxhciggaW50ZW5zaXR5ICk7XG5cdFx0XHRcdHVuaWZvcm1zLmdyb3VuZENvbG9yLmNvcHkoIGxpZ2h0Lmdyb3VuZENvbG9yICkubXVsdGlwbHlTY2FsYXIoIGludGVuc2l0eSApO1xuXG5cdFx0XHRcdHN0YXRlLmhlbWlbIGhlbWlMZW5ndGggXSA9IHVuaWZvcm1zO1xuXG5cdFx0XHRcdGhlbWlMZW5ndGggKys7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHN0YXRlLmFtYmllbnRbIDAgXSA9IHI7XG5cdFx0c3RhdGUuYW1iaWVudFsgMSBdID0gZztcblx0XHRzdGF0ZS5hbWJpZW50WyAyIF0gPSBiO1xuXG5cdFx0c3RhdGUuZGlyZWN0aW9uYWwubGVuZ3RoID0gZGlyZWN0aW9uYWxMZW5ndGg7XG5cdFx0c3RhdGUuc3BvdC5sZW5ndGggPSBzcG90TGVuZ3RoO1xuXHRcdHN0YXRlLnJlY3RBcmVhLmxlbmd0aCA9IHJlY3RBcmVhTGVuZ3RoO1xuXHRcdHN0YXRlLnBvaW50Lmxlbmd0aCA9IHBvaW50TGVuZ3RoO1xuXHRcdHN0YXRlLmhlbWkubGVuZ3RoID0gaGVtaUxlbmd0aDtcblxuXHRcdHN0YXRlLmhhc2ggPSBzdGF0ZS5pZCArICcsJyArIGRpcmVjdGlvbmFsTGVuZ3RoICsgJywnICsgcG9pbnRMZW5ndGggKyAnLCcgKyBzcG90TGVuZ3RoICsgJywnICsgcmVjdEFyZWFMZW5ndGggKyAnLCcgKyBoZW1pTGVuZ3RoICsgJywnICsgc2hhZG93cy5sZW5ndGg7XG5cblx0fVxuXG5cdHJldHVybiB7XG5cdFx0c2V0dXA6IHNldHVwLFxuXHRcdHN0YXRlOiBzdGF0ZVxuXHR9O1xuXG59XG5cbi8qKlxuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqL1xuXG5mdW5jdGlvbiBXZWJHTFJlbmRlclN0YXRlKCkge1xuXG5cdHZhciBsaWdodHMgPSBuZXcgV2ViR0xMaWdodHMoKTtcblxuXHR2YXIgbGlnaHRzQXJyYXkgPSBbXTtcblx0dmFyIHNoYWRvd3NBcnJheSA9IFtdO1xuXHR2YXIgc3ByaXRlc0FycmF5ID0gW107XG5cblx0ZnVuY3Rpb24gaW5pdCgpIHtcblxuXHRcdGxpZ2h0c0FycmF5Lmxlbmd0aCA9IDA7XG5cdFx0c2hhZG93c0FycmF5Lmxlbmd0aCA9IDA7XG5cdFx0c3ByaXRlc0FycmF5Lmxlbmd0aCA9IDA7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHB1c2hMaWdodCggbGlnaHQgKSB7XG5cblx0XHRsaWdodHNBcnJheS5wdXNoKCBsaWdodCApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBwdXNoU2hhZG93KCBzaGFkb3dMaWdodCApIHtcblxuXHRcdHNoYWRvd3NBcnJheS5wdXNoKCBzaGFkb3dMaWdodCApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBwdXNoU3ByaXRlKCBzaGFkb3dMaWdodCApIHtcblxuXHRcdHNwcml0ZXNBcnJheS5wdXNoKCBzaGFkb3dMaWdodCApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBzZXR1cExpZ2h0cyggY2FtZXJhICkge1xuXG5cdFx0bGlnaHRzLnNldHVwKCBsaWdodHNBcnJheSwgc2hhZG93c0FycmF5LCBjYW1lcmEgKTtcblxuXHR9XG5cblx0dmFyIHN0YXRlID0ge1xuXHRcdGxpZ2h0c0FycmF5OiBsaWdodHNBcnJheSxcblx0XHRzaGFkb3dzQXJyYXk6IHNoYWRvd3NBcnJheSxcblx0XHRzcHJpdGVzQXJyYXk6IHNwcml0ZXNBcnJheSxcblxuXHRcdGxpZ2h0czogbGlnaHRzXG5cdH07XG5cblx0cmV0dXJuIHtcblx0XHRpbml0OiBpbml0LFxuXHRcdHN0YXRlOiBzdGF0ZSxcblx0XHRzZXR1cExpZ2h0czogc2V0dXBMaWdodHMsXG5cblx0XHRwdXNoTGlnaHQ6IHB1c2hMaWdodCxcblx0XHRwdXNoU2hhZG93OiBwdXNoU2hhZG93LFxuXHRcdHB1c2hTcHJpdGU6IHB1c2hTcHJpdGVcblx0fTtcblxufVxuXG5mdW5jdGlvbiBXZWJHTFJlbmRlclN0YXRlcygpIHtcblxuXHR2YXIgcmVuZGVyU3RhdGVzID0ge307XG5cblx0ZnVuY3Rpb24gZ2V0KCBzY2VuZSwgY2FtZXJhICkge1xuXG5cdFx0dmFyIGhhc2ggPSBzY2VuZS5pZCArICcsJyArIGNhbWVyYS5pZDtcblxuXHRcdHZhciByZW5kZXJTdGF0ZSA9IHJlbmRlclN0YXRlc1sgaGFzaCBdO1xuXG5cdFx0aWYgKCByZW5kZXJTdGF0ZSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRyZW5kZXJTdGF0ZSA9IG5ldyBXZWJHTFJlbmRlclN0YXRlKCk7XG5cdFx0XHRyZW5kZXJTdGF0ZXNbIGhhc2ggXSA9IHJlbmRlclN0YXRlO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlbmRlclN0YXRlO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBkaXNwb3NlKCkge1xuXG5cdFx0cmVuZGVyU3RhdGVzID0ge307XG5cblx0fVxuXG5cdHJldHVybiB7XG5cdFx0Z2V0OiBnZXQsXG5cdFx0ZGlzcG9zZTogZGlzcG9zZVxuXHR9O1xuXG59XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0cHM6Ly9jbGFyYS5pb1xuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKlxuICogcGFyYW1ldGVycyA9IHtcbiAqXG4gKiAgb3BhY2l0eTogPGZsb2F0PixcbiAqXG4gKiAgbWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBhbHBoYU1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgZGlzcGxhY2VtZW50TWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGRpc3BsYWNlbWVudFNjYWxlOiA8ZmxvYXQ+LFxuICogIGRpc3BsYWNlbWVudEJpYXM6IDxmbG9hdD4sXG4gKlxuICogIHdpcmVmcmFtZTogPGJvb2xlYW4+LFxuICogIHdpcmVmcmFtZUxpbmV3aWR0aDogPGZsb2F0PlxuICogfVxuICovXG5cbmZ1bmN0aW9uIE1lc2hEZXB0aE1hdGVyaWFsKCBwYXJhbWV0ZXJzICkge1xuXG5cdE1hdGVyaWFsLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnTWVzaERlcHRoTWF0ZXJpYWwnO1xuXG5cdHRoaXMuZGVwdGhQYWNraW5nID0gQmFzaWNEZXB0aFBhY2tpbmc7XG5cblx0dGhpcy5za2lubmluZyA9IGZhbHNlO1xuXHR0aGlzLm1vcnBoVGFyZ2V0cyA9IGZhbHNlO1xuXG5cdHRoaXMubWFwID0gbnVsbDtcblxuXHR0aGlzLmFscGhhTWFwID0gbnVsbDtcblxuXHR0aGlzLmRpc3BsYWNlbWVudE1hcCA9IG51bGw7XG5cdHRoaXMuZGlzcGxhY2VtZW50U2NhbGUgPSAxO1xuXHR0aGlzLmRpc3BsYWNlbWVudEJpYXMgPSAwO1xuXG5cdHRoaXMud2lyZWZyYW1lID0gZmFsc2U7XG5cdHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gMTtcblxuXHR0aGlzLmZvZyA9IGZhbHNlO1xuXHR0aGlzLmxpZ2h0cyA9IGZhbHNlO1xuXG5cdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XG5cbn1cblxuTWVzaERlcHRoTWF0ZXJpYWwucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTWF0ZXJpYWwucHJvdG90eXBlICk7XG5NZXNoRGVwdGhNYXRlcmlhbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNZXNoRGVwdGhNYXRlcmlhbDtcblxuTWVzaERlcHRoTWF0ZXJpYWwucHJvdG90eXBlLmlzTWVzaERlcHRoTWF0ZXJpYWwgPSB0cnVlO1xuXG5NZXNoRGVwdGhNYXRlcmlhbC5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdHRoaXMuZGVwdGhQYWNraW5nID0gc291cmNlLmRlcHRoUGFja2luZztcblxuXHR0aGlzLnNraW5uaW5nID0gc291cmNlLnNraW5uaW5nO1xuXHR0aGlzLm1vcnBoVGFyZ2V0cyA9IHNvdXJjZS5tb3JwaFRhcmdldHM7XG5cblx0dGhpcy5tYXAgPSBzb3VyY2UubWFwO1xuXG5cdHRoaXMuYWxwaGFNYXAgPSBzb3VyY2UuYWxwaGFNYXA7XG5cblx0dGhpcy5kaXNwbGFjZW1lbnRNYXAgPSBzb3VyY2UuZGlzcGxhY2VtZW50TWFwO1xuXHR0aGlzLmRpc3BsYWNlbWVudFNjYWxlID0gc291cmNlLmRpc3BsYWNlbWVudFNjYWxlO1xuXHR0aGlzLmRpc3BsYWNlbWVudEJpYXMgPSBzb3VyY2UuZGlzcGxhY2VtZW50QmlhcztcblxuXHR0aGlzLndpcmVmcmFtZSA9IHNvdXJjZS53aXJlZnJhbWU7XG5cdHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gc291cmNlLndpcmVmcmFtZUxpbmV3aWR0aDtcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqXG4gKiBwYXJhbWV0ZXJzID0ge1xuICpcbiAqICByZWZlcmVuY2VQb3NpdGlvbjogPGZsb2F0PixcbiAqICBuZWFyRGlzdGFuY2U6IDxmbG9hdD4sXG4gKiAgZmFyRGlzdGFuY2U6IDxmbG9hdD4sXG4gKlxuICogIHNraW5uaW5nOiA8Ym9vbD4sXG4gKiAgbW9ycGhUYXJnZXRzOiA8Ym9vbD4sXG4gKlxuICogIG1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgYWxwaGFNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIGRpc3BsYWNlbWVudE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBkaXNwbGFjZW1lbnRTY2FsZTogPGZsb2F0PixcbiAqICBkaXNwbGFjZW1lbnRCaWFzOiA8ZmxvYXQ+XG4gKlxuICogfVxuICovXG5cbmZ1bmN0aW9uIE1lc2hEaXN0YW5jZU1hdGVyaWFsKCBwYXJhbWV0ZXJzICkge1xuXG5cdE1hdGVyaWFsLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnTWVzaERpc3RhbmNlTWF0ZXJpYWwnO1xuXG5cdHRoaXMucmVmZXJlbmNlUG9zaXRpb24gPSBuZXcgVmVjdG9yMygpO1xuXHR0aGlzLm5lYXJEaXN0YW5jZSA9IDE7XG5cdHRoaXMuZmFyRGlzdGFuY2UgPSAxMDAwO1xuXG5cdHRoaXMuc2tpbm5pbmcgPSBmYWxzZTtcblx0dGhpcy5tb3JwaFRhcmdldHMgPSBmYWxzZTtcblxuXHR0aGlzLm1hcCA9IG51bGw7XG5cblx0dGhpcy5hbHBoYU1hcCA9IG51bGw7XG5cblx0dGhpcy5kaXNwbGFjZW1lbnRNYXAgPSBudWxsO1xuXHR0aGlzLmRpc3BsYWNlbWVudFNjYWxlID0gMTtcblx0dGhpcy5kaXNwbGFjZW1lbnRCaWFzID0gMDtcblxuXHR0aGlzLmZvZyA9IGZhbHNlO1xuXHR0aGlzLmxpZ2h0cyA9IGZhbHNlO1xuXG5cdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XG5cbn1cblxuTWVzaERpc3RhbmNlTWF0ZXJpYWwucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTWF0ZXJpYWwucHJvdG90eXBlICk7XG5NZXNoRGlzdGFuY2VNYXRlcmlhbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNZXNoRGlzdGFuY2VNYXRlcmlhbDtcblxuTWVzaERpc3RhbmNlTWF0ZXJpYWwucHJvdG90eXBlLmlzTWVzaERpc3RhbmNlTWF0ZXJpYWwgPSB0cnVlO1xuXG5NZXNoRGlzdGFuY2VNYXRlcmlhbC5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdHRoaXMucmVmZXJlbmNlUG9zaXRpb24uY29weSggc291cmNlLnJlZmVyZW5jZVBvc2l0aW9uICk7XG5cdHRoaXMubmVhckRpc3RhbmNlID0gc291cmNlLm5lYXJEaXN0YW5jZTtcblx0dGhpcy5mYXJEaXN0YW5jZSA9IHNvdXJjZS5mYXJEaXN0YW5jZTtcblxuXHR0aGlzLnNraW5uaW5nID0gc291cmNlLnNraW5uaW5nO1xuXHR0aGlzLm1vcnBoVGFyZ2V0cyA9IHNvdXJjZS5tb3JwaFRhcmdldHM7XG5cblx0dGhpcy5tYXAgPSBzb3VyY2UubWFwO1xuXG5cdHRoaXMuYWxwaGFNYXAgPSBzb3VyY2UuYWxwaGFNYXA7XG5cblx0dGhpcy5kaXNwbGFjZW1lbnRNYXAgPSBzb3VyY2UuZGlzcGxhY2VtZW50TWFwO1xuXHR0aGlzLmRpc3BsYWNlbWVudFNjYWxlID0gc291cmNlLmRpc3BsYWNlbWVudFNjYWxlO1xuXHR0aGlzLmRpc3BsYWNlbWVudEJpYXMgPSBzb3VyY2UuZGlzcGxhY2VtZW50QmlhcztcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBXZWJHTFNoYWRvd01hcCggX3JlbmRlcmVyLCBfb2JqZWN0cywgbWF4VGV4dHVyZVNpemUgKSB7XG5cblx0dmFyIF9mcnVzdHVtID0gbmV3IEZydXN0dW0oKSxcblx0XHRfcHJvalNjcmVlbk1hdHJpeCA9IG5ldyBNYXRyaXg0KCksXG5cblx0XHRfc2hhZG93TWFwU2l6ZSA9IG5ldyBWZWN0b3IyKCksXG5cdFx0X21heFNoYWRvd01hcFNpemUgPSBuZXcgVmVjdG9yMiggbWF4VGV4dHVyZVNpemUsIG1heFRleHR1cmVTaXplICksXG5cblx0XHRfbG9va1RhcmdldCA9IG5ldyBWZWN0b3IzKCksXG5cdFx0X2xpZ2h0UG9zaXRpb25Xb3JsZCA9IG5ldyBWZWN0b3IzKCksXG5cblx0XHRfTW9ycGhpbmdGbGFnID0gMSxcblx0XHRfU2tpbm5pbmdGbGFnID0gMixcblxuXHRcdF9OdW1iZXJPZk1hdGVyaWFsVmFyaWFudHMgPSAoIF9Nb3JwaGluZ0ZsYWcgfCBfU2tpbm5pbmdGbGFnICkgKyAxLFxuXG5cdFx0X2RlcHRoTWF0ZXJpYWxzID0gbmV3IEFycmF5KCBfTnVtYmVyT2ZNYXRlcmlhbFZhcmlhbnRzICksXG5cdFx0X2Rpc3RhbmNlTWF0ZXJpYWxzID0gbmV3IEFycmF5KCBfTnVtYmVyT2ZNYXRlcmlhbFZhcmlhbnRzICksXG5cblx0XHRfbWF0ZXJpYWxDYWNoZSA9IHt9O1xuXG5cdHZhciBzaGFkb3dTaWRlID0geyAwOiBCYWNrU2lkZSwgMTogRnJvbnRTaWRlLCAyOiBEb3VibGVTaWRlIH07XG5cblx0dmFyIGN1YmVEaXJlY3Rpb25zID0gW1xuXHRcdG5ldyBWZWN0b3IzKCAxLCAwLCAwICksIG5ldyBWZWN0b3IzKCAtIDEsIDAsIDAgKSwgbmV3IFZlY3RvcjMoIDAsIDAsIDEgKSxcblx0XHRuZXcgVmVjdG9yMyggMCwgMCwgLSAxICksIG5ldyBWZWN0b3IzKCAwLCAxLCAwICksIG5ldyBWZWN0b3IzKCAwLCAtIDEsIDAgKVxuXHRdO1xuXG5cdHZhciBjdWJlVXBzID0gW1xuXHRcdG5ldyBWZWN0b3IzKCAwLCAxLCAwICksIG5ldyBWZWN0b3IzKCAwLCAxLCAwICksIG5ldyBWZWN0b3IzKCAwLCAxLCAwICksXG5cdFx0bmV3IFZlY3RvcjMoIDAsIDEsIDAgKSwgbmV3IFZlY3RvcjMoIDAsIDAsIDEgKSxcdG5ldyBWZWN0b3IzKCAwLCAwLCAtIDEgKVxuXHRdO1xuXG5cdHZhciBjdWJlMkRWaWV3UG9ydHMgPSBbXG5cdFx0bmV3IFZlY3RvcjQoKSwgbmV3IFZlY3RvcjQoKSwgbmV3IFZlY3RvcjQoKSxcblx0XHRuZXcgVmVjdG9yNCgpLCBuZXcgVmVjdG9yNCgpLCBuZXcgVmVjdG9yNCgpXG5cdF07XG5cblx0Ly8gaW5pdFxuXG5cdGZvciAoIHZhciBpID0gMDsgaSAhPT0gX051bWJlck9mTWF0ZXJpYWxWYXJpYW50czsgKysgaSApIHtcblxuXHRcdHZhciB1c2VNb3JwaGluZyA9ICggaSAmIF9Nb3JwaGluZ0ZsYWcgKSAhPT0gMDtcblx0XHR2YXIgdXNlU2tpbm5pbmcgPSAoIGkgJiBfU2tpbm5pbmdGbGFnICkgIT09IDA7XG5cblx0XHR2YXIgZGVwdGhNYXRlcmlhbCA9IG5ldyBNZXNoRGVwdGhNYXRlcmlhbCgge1xuXG5cdFx0XHRkZXB0aFBhY2tpbmc6IFJHQkFEZXB0aFBhY2tpbmcsXG5cblx0XHRcdG1vcnBoVGFyZ2V0czogdXNlTW9ycGhpbmcsXG5cdFx0XHRza2lubmluZzogdXNlU2tpbm5pbmdcblxuXHRcdH0gKTtcblxuXHRcdF9kZXB0aE1hdGVyaWFsc1sgaSBdID0gZGVwdGhNYXRlcmlhbDtcblxuXHRcdC8vXG5cblx0XHR2YXIgZGlzdGFuY2VNYXRlcmlhbCA9IG5ldyBNZXNoRGlzdGFuY2VNYXRlcmlhbCgge1xuXG5cdFx0XHRtb3JwaFRhcmdldHM6IHVzZU1vcnBoaW5nLFxuXHRcdFx0c2tpbm5pbmc6IHVzZVNraW5uaW5nXG5cblx0XHR9ICk7XG5cblx0XHRfZGlzdGFuY2VNYXRlcmlhbHNbIGkgXSA9IGRpc3RhbmNlTWF0ZXJpYWw7XG5cblx0fVxuXG5cdC8vXG5cblx0dmFyIHNjb3BlID0gdGhpcztcblxuXHR0aGlzLmVuYWJsZWQgPSBmYWxzZTtcblxuXHR0aGlzLmF1dG9VcGRhdGUgPSB0cnVlO1xuXHR0aGlzLm5lZWRzVXBkYXRlID0gZmFsc2U7XG5cblx0dGhpcy50eXBlID0gUENGU2hhZG93TWFwO1xuXG5cdHRoaXMucmVuZGVyID0gZnVuY3Rpb24gKCBsaWdodHMsIHNjZW5lLCBjYW1lcmEgKSB7XG5cblx0XHRpZiAoIHNjb3BlLmVuYWJsZWQgPT09IGZhbHNlICkgcmV0dXJuO1xuXHRcdGlmICggc2NvcGUuYXV0b1VwZGF0ZSA9PT0gZmFsc2UgJiYgc2NvcGUubmVlZHNVcGRhdGUgPT09IGZhbHNlICkgcmV0dXJuO1xuXG5cdFx0aWYgKCBsaWdodHMubGVuZ3RoID09PSAwICkgcmV0dXJuO1xuXG5cdFx0Ly8gVE9ETyBDbGVhbiB1cCAobmVlZGVkIGluIGNhc2Ugb2YgY29udGV4dGxvc3QpXG5cdFx0dmFyIF9nbCA9IF9yZW5kZXJlci5jb250ZXh0O1xuXHRcdHZhciBfc3RhdGUgPSBfcmVuZGVyZXIuc3RhdGU7XG5cblx0XHQvLyBTZXQgR0wgc3RhdGUgZm9yIGRlcHRoIG1hcC5cblx0XHRfc3RhdGUuZGlzYWJsZSggX2dsLkJMRU5EICk7XG5cdFx0X3N0YXRlLmJ1ZmZlcnMuY29sb3Iuc2V0Q2xlYXIoIDEsIDEsIDEsIDEgKTtcblx0XHRfc3RhdGUuYnVmZmVycy5kZXB0aC5zZXRUZXN0KCB0cnVlICk7XG5cdFx0X3N0YXRlLnNldFNjaXNzb3JUZXN0KCBmYWxzZSApO1xuXG5cdFx0Ly8gcmVuZGVyIGRlcHRoIG1hcFxuXG5cdFx0dmFyIGZhY2VDb3VudDtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBsaWdodHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBsaWdodCA9IGxpZ2h0c1sgaSBdO1xuXHRcdFx0dmFyIHNoYWRvdyA9IGxpZ2h0LnNoYWRvdztcblx0XHRcdHZhciBpc1BvaW50TGlnaHQgPSBsaWdodCAmJiBsaWdodC5pc1BvaW50TGlnaHQ7XG5cblx0XHRcdGlmICggc2hhZG93ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xTaGFkb3dNYXA6JywgbGlnaHQsICdoYXMgbm8gc2hhZG93LicgKTtcblx0XHRcdFx0Y29udGludWU7XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIHNoYWRvd0NhbWVyYSA9IHNoYWRvdy5jYW1lcmE7XG5cblx0XHRcdF9zaGFkb3dNYXBTaXplLmNvcHkoIHNoYWRvdy5tYXBTaXplICk7XG5cdFx0XHRfc2hhZG93TWFwU2l6ZS5taW4oIF9tYXhTaGFkb3dNYXBTaXplICk7XG5cblx0XHRcdGlmICggaXNQb2ludExpZ2h0ICkge1xuXG5cdFx0XHRcdHZhciB2cFdpZHRoID0gX3NoYWRvd01hcFNpemUueDtcblx0XHRcdFx0dmFyIHZwSGVpZ2h0ID0gX3NoYWRvd01hcFNpemUueTtcblxuXHRcdFx0XHQvLyBUaGVzZSB2aWV3cG9ydHMgbWFwIGEgY3ViZS1tYXAgb250byBhIDJEIHRleHR1cmUgd2l0aCB0aGVcblx0XHRcdFx0Ly8gZm9sbG93aW5nIG9yaWVudGF0aW9uOlxuXHRcdFx0XHQvL1xuXHRcdFx0XHQvLyAgeHpYWlxuXHRcdFx0XHQvLyAgIHkgWVxuXHRcdFx0XHQvL1xuXHRcdFx0XHQvLyBYIC0gUG9zaXRpdmUgeCBkaXJlY3Rpb25cblx0XHRcdFx0Ly8geCAtIE5lZ2F0aXZlIHggZGlyZWN0aW9uXG5cdFx0XHRcdC8vIFkgLSBQb3NpdGl2ZSB5IGRpcmVjdGlvblxuXHRcdFx0XHQvLyB5IC0gTmVnYXRpdmUgeSBkaXJlY3Rpb25cblx0XHRcdFx0Ly8gWiAtIFBvc2l0aXZlIHogZGlyZWN0aW9uXG5cdFx0XHRcdC8vIHogLSBOZWdhdGl2ZSB6IGRpcmVjdGlvblxuXG5cdFx0XHRcdC8vIHBvc2l0aXZlIFhcblx0XHRcdFx0Y3ViZTJEVmlld1BvcnRzWyAwIF0uc2V0KCB2cFdpZHRoICogMiwgdnBIZWlnaHQsIHZwV2lkdGgsIHZwSGVpZ2h0ICk7XG5cdFx0XHRcdC8vIG5lZ2F0aXZlIFhcblx0XHRcdFx0Y3ViZTJEVmlld1BvcnRzWyAxIF0uc2V0KCAwLCB2cEhlaWdodCwgdnBXaWR0aCwgdnBIZWlnaHQgKTtcblx0XHRcdFx0Ly8gcG9zaXRpdmUgWlxuXHRcdFx0XHRjdWJlMkRWaWV3UG9ydHNbIDIgXS5zZXQoIHZwV2lkdGggKiAzLCB2cEhlaWdodCwgdnBXaWR0aCwgdnBIZWlnaHQgKTtcblx0XHRcdFx0Ly8gbmVnYXRpdmUgWlxuXHRcdFx0XHRjdWJlMkRWaWV3UG9ydHNbIDMgXS5zZXQoIHZwV2lkdGgsIHZwSGVpZ2h0LCB2cFdpZHRoLCB2cEhlaWdodCApO1xuXHRcdFx0XHQvLyBwb3NpdGl2ZSBZXG5cdFx0XHRcdGN1YmUyRFZpZXdQb3J0c1sgNCBdLnNldCggdnBXaWR0aCAqIDMsIDAsIHZwV2lkdGgsIHZwSGVpZ2h0ICk7XG5cdFx0XHRcdC8vIG5lZ2F0aXZlIFlcblx0XHRcdFx0Y3ViZTJEVmlld1BvcnRzWyA1IF0uc2V0KCB2cFdpZHRoLCAwLCB2cFdpZHRoLCB2cEhlaWdodCApO1xuXG5cdFx0XHRcdF9zaGFkb3dNYXBTaXplLnggKj0gNC4wO1xuXHRcdFx0XHRfc2hhZG93TWFwU2l6ZS55ICo9IDIuMDtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHNoYWRvdy5tYXAgPT09IG51bGwgKSB7XG5cblx0XHRcdFx0dmFyIHBhcnMgPSB7IG1pbkZpbHRlcjogTmVhcmVzdEZpbHRlciwgbWFnRmlsdGVyOiBOZWFyZXN0RmlsdGVyLCBmb3JtYXQ6IFJHQkFGb3JtYXQgfTtcblxuXHRcdFx0XHRzaGFkb3cubWFwID0gbmV3IFdlYkdMUmVuZGVyVGFyZ2V0KCBfc2hhZG93TWFwU2l6ZS54LCBfc2hhZG93TWFwU2l6ZS55LCBwYXJzICk7XG5cdFx0XHRcdHNoYWRvdy5tYXAudGV4dHVyZS5uYW1lID0gbGlnaHQubmFtZSArIFwiLnNoYWRvd01hcFwiO1xuXG5cdFx0XHRcdHNoYWRvd0NhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBzaGFkb3cuaXNTcG90TGlnaHRTaGFkb3cgKSB7XG5cblx0XHRcdFx0c2hhZG93LnVwZGF0ZSggbGlnaHQgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgc2hhZG93TWFwID0gc2hhZG93Lm1hcDtcblx0XHRcdHZhciBzaGFkb3dNYXRyaXggPSBzaGFkb3cubWF0cml4O1xuXG5cdFx0XHRfbGlnaHRQb3NpdGlvbldvcmxkLnNldEZyb21NYXRyaXhQb3NpdGlvbiggbGlnaHQubWF0cml4V29ybGQgKTtcblx0XHRcdHNoYWRvd0NhbWVyYS5wb3NpdGlvbi5jb3B5KCBfbGlnaHRQb3NpdGlvbldvcmxkICk7XG5cblx0XHRcdGlmICggaXNQb2ludExpZ2h0ICkge1xuXG5cdFx0XHRcdGZhY2VDb3VudCA9IDY7XG5cblx0XHRcdFx0Ly8gZm9yIHBvaW50IGxpZ2h0cyB3ZSBzZXQgdGhlIHNoYWRvdyBtYXRyaXggdG8gYmUgYSB0cmFuc2xhdGlvbi1vbmx5IG1hdHJpeFxuXHRcdFx0XHQvLyBlcXVhbCB0byBpbnZlcnNlIG9mIHRoZSBsaWdodCdzIHBvc2l0aW9uXG5cblx0XHRcdFx0c2hhZG93TWF0cml4Lm1ha2VUcmFuc2xhdGlvbiggLSBfbGlnaHRQb3NpdGlvbldvcmxkLngsIC0gX2xpZ2h0UG9zaXRpb25Xb3JsZC55LCAtIF9saWdodFBvc2l0aW9uV29ybGQueiApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGZhY2VDb3VudCA9IDE7XG5cblx0XHRcdFx0X2xvb2tUYXJnZXQuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBsaWdodC50YXJnZXQubWF0cml4V29ybGQgKTtcblx0XHRcdFx0c2hhZG93Q2FtZXJhLmxvb2tBdCggX2xvb2tUYXJnZXQgKTtcblx0XHRcdFx0c2hhZG93Q2FtZXJhLnVwZGF0ZU1hdHJpeFdvcmxkKCk7XG5cblx0XHRcdFx0Ly8gY29tcHV0ZSBzaGFkb3cgbWF0cml4XG5cblx0XHRcdFx0c2hhZG93TWF0cml4LnNldChcblx0XHRcdFx0XHQwLjUsIDAuMCwgMC4wLCAwLjUsXG5cdFx0XHRcdFx0MC4wLCAwLjUsIDAuMCwgMC41LFxuXHRcdFx0XHRcdDAuMCwgMC4wLCAwLjUsIDAuNSxcblx0XHRcdFx0XHQwLjAsIDAuMCwgMC4wLCAxLjBcblx0XHRcdFx0KTtcblxuXHRcdFx0XHRzaGFkb3dNYXRyaXgubXVsdGlwbHkoIHNoYWRvd0NhbWVyYS5wcm9qZWN0aW9uTWF0cml4ICk7XG5cdFx0XHRcdHNoYWRvd01hdHJpeC5tdWx0aXBseSggc2hhZG93Q2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdF9yZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoIHNoYWRvd01hcCApO1xuXHRcdFx0X3JlbmRlcmVyLmNsZWFyKCk7XG5cblx0XHRcdC8vIHJlbmRlciBzaGFkb3cgbWFwIGZvciBlYWNoIGN1YmUgZmFjZSAoaWYgb21uaS1kaXJlY3Rpb25hbCkgb3Jcblx0XHRcdC8vIHJ1biBhIHNpbmdsZSBwYXNzIGlmIG5vdFxuXG5cdFx0XHRmb3IgKCB2YXIgZmFjZSA9IDA7IGZhY2UgPCBmYWNlQ291bnQ7IGZhY2UgKysgKSB7XG5cblx0XHRcdFx0aWYgKCBpc1BvaW50TGlnaHQgKSB7XG5cblx0XHRcdFx0XHRfbG9va1RhcmdldC5jb3B5KCBzaGFkb3dDYW1lcmEucG9zaXRpb24gKTtcblx0XHRcdFx0XHRfbG9va1RhcmdldC5hZGQoIGN1YmVEaXJlY3Rpb25zWyBmYWNlIF0gKTtcblx0XHRcdFx0XHRzaGFkb3dDYW1lcmEudXAuY29weSggY3ViZVVwc1sgZmFjZSBdICk7XG5cdFx0XHRcdFx0c2hhZG93Q2FtZXJhLmxvb2tBdCggX2xvb2tUYXJnZXQgKTtcblx0XHRcdFx0XHRzaGFkb3dDYW1lcmEudXBkYXRlTWF0cml4V29ybGQoKTtcblxuXHRcdFx0XHRcdHZhciB2cERpbWVuc2lvbnMgPSBjdWJlMkRWaWV3UG9ydHNbIGZhY2UgXTtcblx0XHRcdFx0XHRfc3RhdGUudmlld3BvcnQoIHZwRGltZW5zaW9ucyApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyB1cGRhdGUgY2FtZXJhIG1hdHJpY2VzIGFuZCBmcnVzdHVtXG5cblx0XHRcdFx0X3Byb2pTY3JlZW5NYXRyaXgubXVsdGlwbHlNYXRyaWNlcyggc2hhZG93Q2FtZXJhLnByb2plY3Rpb25NYXRyaXgsIHNoYWRvd0NhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UgKTtcblx0XHRcdFx0X2ZydXN0dW0uc2V0RnJvbU1hdHJpeCggX3Byb2pTY3JlZW5NYXRyaXggKTtcblxuXHRcdFx0XHQvLyBzZXQgb2JqZWN0IG1hdHJpY2VzICYgZnJ1c3R1bSBjdWxsaW5nXG5cblx0XHRcdFx0cmVuZGVyT2JqZWN0KCBzY2VuZSwgY2FtZXJhLCBzaGFkb3dDYW1lcmEsIGlzUG9pbnRMaWdodCApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRzY29wZS5uZWVkc1VwZGF0ZSA9IGZhbHNlO1xuXG5cdH07XG5cblx0ZnVuY3Rpb24gZ2V0RGVwdGhNYXRlcmlhbCggb2JqZWN0LCBtYXRlcmlhbCwgaXNQb2ludExpZ2h0LCBsaWdodFBvc2l0aW9uV29ybGQsIHNoYWRvd0NhbWVyYU5lYXIsIHNoYWRvd0NhbWVyYUZhciApIHtcblxuXHRcdHZhciBnZW9tZXRyeSA9IG9iamVjdC5nZW9tZXRyeTtcblxuXHRcdHZhciByZXN1bHQgPSBudWxsO1xuXG5cdFx0dmFyIG1hdGVyaWFsVmFyaWFudHMgPSBfZGVwdGhNYXRlcmlhbHM7XG5cdFx0dmFyIGN1c3RvbU1hdGVyaWFsID0gb2JqZWN0LmN1c3RvbURlcHRoTWF0ZXJpYWw7XG5cblx0XHRpZiAoIGlzUG9pbnRMaWdodCApIHtcblxuXHRcdFx0bWF0ZXJpYWxWYXJpYW50cyA9IF9kaXN0YW5jZU1hdGVyaWFscztcblx0XHRcdGN1c3RvbU1hdGVyaWFsID0gb2JqZWN0LmN1c3RvbURpc3RhbmNlTWF0ZXJpYWw7XG5cblx0XHR9XG5cblx0XHRpZiAoICEgY3VzdG9tTWF0ZXJpYWwgKSB7XG5cblx0XHRcdHZhciB1c2VNb3JwaGluZyA9IGZhbHNlO1xuXG5cdFx0XHRpZiAoIG1hdGVyaWFsLm1vcnBoVGFyZ2V0cyApIHtcblxuXHRcdFx0XHRpZiAoIGdlb21ldHJ5ICYmIGdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkgKSB7XG5cblx0XHRcdFx0XHR1c2VNb3JwaGluZyA9IGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcyAmJiBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb24gJiYgZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uLmxlbmd0aCA+IDA7XG5cblx0XHRcdFx0fSBlbHNlIGlmICggZ2VvbWV0cnkgJiYgZ2VvbWV0cnkuaXNHZW9tZXRyeSApIHtcblxuXHRcdFx0XHRcdHVzZU1vcnBoaW5nID0gZ2VvbWV0cnkubW9ycGhUYXJnZXRzICYmIGdlb21ldHJ5Lm1vcnBoVGFyZ2V0cy5sZW5ndGggPiAwO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIG9iamVjdC5pc1NraW5uZWRNZXNoICYmIG1hdGVyaWFsLnNraW5uaW5nID09PSBmYWxzZSApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFNoYWRvd01hcDogVEhSRUUuU2tpbm5lZE1lc2ggd2l0aCBtYXRlcmlhbC5za2lubmluZyBzZXQgdG8gZmFsc2U6Jywgb2JqZWN0ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIHVzZVNraW5uaW5nID0gb2JqZWN0LmlzU2tpbm5lZE1lc2ggJiYgbWF0ZXJpYWwuc2tpbm5pbmc7XG5cblx0XHRcdHZhciB2YXJpYW50SW5kZXggPSAwO1xuXG5cdFx0XHRpZiAoIHVzZU1vcnBoaW5nICkgdmFyaWFudEluZGV4IHw9IF9Nb3JwaGluZ0ZsYWc7XG5cdFx0XHRpZiAoIHVzZVNraW5uaW5nICkgdmFyaWFudEluZGV4IHw9IF9Ta2lubmluZ0ZsYWc7XG5cblx0XHRcdHJlc3VsdCA9IG1hdGVyaWFsVmFyaWFudHNbIHZhcmlhbnRJbmRleCBdO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0cmVzdWx0ID0gY3VzdG9tTWF0ZXJpYWw7XG5cblx0XHR9XG5cblx0XHRpZiAoIF9yZW5kZXJlci5sb2NhbENsaXBwaW5nRW5hYmxlZCAmJlxuXHRcdFx0XHRtYXRlcmlhbC5jbGlwU2hhZG93cyA9PT0gdHJ1ZSAmJlxuXHRcdFx0XHRtYXRlcmlhbC5jbGlwcGluZ1BsYW5lcy5sZW5ndGggIT09IDAgKSB7XG5cblx0XHRcdC8vIGluIHRoaXMgY2FzZSB3ZSBuZWVkIGEgdW5pcXVlIG1hdGVyaWFsIGluc3RhbmNlIHJlZmxlY3RpbmcgdGhlXG5cdFx0XHQvLyBhcHByb3ByaWF0ZSBzdGF0ZVxuXG5cdFx0XHR2YXIga2V5QSA9IHJlc3VsdC51dWlkLCBrZXlCID0gbWF0ZXJpYWwudXVpZDtcblxuXHRcdFx0dmFyIG1hdGVyaWFsc0ZvclZhcmlhbnQgPSBfbWF0ZXJpYWxDYWNoZVsga2V5QSBdO1xuXG5cdFx0XHRpZiAoIG1hdGVyaWFsc0ZvclZhcmlhbnQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRtYXRlcmlhbHNGb3JWYXJpYW50ID0ge307XG5cdFx0XHRcdF9tYXRlcmlhbENhY2hlWyBrZXlBIF0gPSBtYXRlcmlhbHNGb3JWYXJpYW50O1xuXG5cdFx0XHR9XG5cblx0XHRcdHZhciBjYWNoZWRNYXRlcmlhbCA9IG1hdGVyaWFsc0ZvclZhcmlhbnRbIGtleUIgXTtcblxuXHRcdFx0aWYgKCBjYWNoZWRNYXRlcmlhbCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNhY2hlZE1hdGVyaWFsID0gcmVzdWx0LmNsb25lKCk7XG5cdFx0XHRcdG1hdGVyaWFsc0ZvclZhcmlhbnRbIGtleUIgXSA9IGNhY2hlZE1hdGVyaWFsO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJlc3VsdCA9IGNhY2hlZE1hdGVyaWFsO1xuXG5cdFx0fVxuXG5cdFx0cmVzdWx0LnZpc2libGUgPSBtYXRlcmlhbC52aXNpYmxlO1xuXHRcdHJlc3VsdC53aXJlZnJhbWUgPSBtYXRlcmlhbC53aXJlZnJhbWU7XG5cblx0XHRyZXN1bHQuc2lkZSA9ICggbWF0ZXJpYWwuc2hhZG93U2lkZSAhPSBudWxsICkgPyBtYXRlcmlhbC5zaGFkb3dTaWRlIDogc2hhZG93U2lkZVsgbWF0ZXJpYWwuc2lkZSBdO1xuXG5cdFx0cmVzdWx0LmNsaXBTaGFkb3dzID0gbWF0ZXJpYWwuY2xpcFNoYWRvd3M7XG5cdFx0cmVzdWx0LmNsaXBwaW5nUGxhbmVzID0gbWF0ZXJpYWwuY2xpcHBpbmdQbGFuZXM7XG5cdFx0cmVzdWx0LmNsaXBJbnRlcnNlY3Rpb24gPSBtYXRlcmlhbC5jbGlwSW50ZXJzZWN0aW9uO1xuXG5cdFx0cmVzdWx0LndpcmVmcmFtZUxpbmV3aWR0aCA9IG1hdGVyaWFsLndpcmVmcmFtZUxpbmV3aWR0aDtcblx0XHRyZXN1bHQubGluZXdpZHRoID0gbWF0ZXJpYWwubGluZXdpZHRoO1xuXG5cdFx0aWYgKCBpc1BvaW50TGlnaHQgJiYgcmVzdWx0LmlzTWVzaERpc3RhbmNlTWF0ZXJpYWwgKSB7XG5cblx0XHRcdHJlc3VsdC5yZWZlcmVuY2VQb3NpdGlvbi5jb3B5KCBsaWdodFBvc2l0aW9uV29ybGQgKTtcblx0XHRcdHJlc3VsdC5uZWFyRGlzdGFuY2UgPSBzaGFkb3dDYW1lcmFOZWFyO1xuXHRcdFx0cmVzdWx0LmZhckRpc3RhbmNlID0gc2hhZG93Q2FtZXJhRmFyO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVuZGVyT2JqZWN0KCBvYmplY3QsIGNhbWVyYSwgc2hhZG93Q2FtZXJhLCBpc1BvaW50TGlnaHQgKSB7XG5cblx0XHRpZiAoIG9iamVjdC52aXNpYmxlID09PSBmYWxzZSApIHJldHVybjtcblxuXHRcdHZhciB2aXNpYmxlID0gb2JqZWN0LmxheWVycy50ZXN0KCBjYW1lcmEubGF5ZXJzICk7XG5cblx0XHRpZiAoIHZpc2libGUgJiYgKCBvYmplY3QuaXNNZXNoIHx8IG9iamVjdC5pc0xpbmUgfHwgb2JqZWN0LmlzUG9pbnRzICkgKSB7XG5cblx0XHRcdGlmICggb2JqZWN0LmNhc3RTaGFkb3cgJiYgKCAhIG9iamVjdC5mcnVzdHVtQ3VsbGVkIHx8IF9mcnVzdHVtLmludGVyc2VjdHNPYmplY3QoIG9iamVjdCApICkgKSB7XG5cblx0XHRcdFx0b2JqZWN0Lm1vZGVsVmlld01hdHJpeC5tdWx0aXBseU1hdHJpY2VzKCBzaGFkb3dDYW1lcmEubWF0cml4V29ybGRJbnZlcnNlLCBvYmplY3QubWF0cml4V29ybGQgKTtcblxuXHRcdFx0XHR2YXIgZ2VvbWV0cnkgPSBfb2JqZWN0cy51cGRhdGUoIG9iamVjdCApO1xuXHRcdFx0XHR2YXIgbWF0ZXJpYWwgPSBvYmplY3QubWF0ZXJpYWw7XG5cblx0XHRcdFx0aWYgKCBBcnJheS5pc0FycmF5KCBtYXRlcmlhbCApICkge1xuXG5cdFx0XHRcdFx0dmFyIGdyb3VwcyA9IGdlb21ldHJ5Lmdyb3VwcztcblxuXHRcdFx0XHRcdGZvciAoIHZhciBrID0gMCwga2wgPSBncm91cHMubGVuZ3RoOyBrIDwga2w7IGsgKysgKSB7XG5cblx0XHRcdFx0XHRcdHZhciBncm91cCA9IGdyb3Vwc1sgayBdO1xuXHRcdFx0XHRcdFx0dmFyIGdyb3VwTWF0ZXJpYWwgPSBtYXRlcmlhbFsgZ3JvdXAubWF0ZXJpYWxJbmRleCBdO1xuXG5cdFx0XHRcdFx0XHRpZiAoIGdyb3VwTWF0ZXJpYWwgJiYgZ3JvdXBNYXRlcmlhbC52aXNpYmxlICkge1xuXG5cdFx0XHRcdFx0XHRcdHZhciBkZXB0aE1hdGVyaWFsID0gZ2V0RGVwdGhNYXRlcmlhbCggb2JqZWN0LCBncm91cE1hdGVyaWFsLCBpc1BvaW50TGlnaHQsIF9saWdodFBvc2l0aW9uV29ybGQsIHNoYWRvd0NhbWVyYS5uZWFyLCBzaGFkb3dDYW1lcmEuZmFyICk7XG5cdFx0XHRcdFx0XHRcdF9yZW5kZXJlci5yZW5kZXJCdWZmZXJEaXJlY3QoIHNoYWRvd0NhbWVyYSwgbnVsbCwgZ2VvbWV0cnksIGRlcHRoTWF0ZXJpYWwsIG9iamVjdCwgZ3JvdXAgKTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLnZpc2libGUgKSB7XG5cblx0XHRcdFx0XHR2YXIgZGVwdGhNYXRlcmlhbCA9IGdldERlcHRoTWF0ZXJpYWwoIG9iamVjdCwgbWF0ZXJpYWwsIGlzUG9pbnRMaWdodCwgX2xpZ2h0UG9zaXRpb25Xb3JsZCwgc2hhZG93Q2FtZXJhLm5lYXIsIHNoYWRvd0NhbWVyYS5mYXIgKTtcblx0XHRcdFx0XHRfcmVuZGVyZXIucmVuZGVyQnVmZmVyRGlyZWN0KCBzaGFkb3dDYW1lcmEsIG51bGwsIGdlb21ldHJ5LCBkZXB0aE1hdGVyaWFsLCBvYmplY3QsIG51bGwgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHZhciBjaGlsZHJlbiA9IG9iamVjdC5jaGlsZHJlbjtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHJlbmRlck9iamVjdCggY2hpbGRyZW5bIGkgXSwgY2FtZXJhLCBzaGFkb3dDYW1lcmEsIGlzUG9pbnRMaWdodCApO1xuXG5cdFx0fVxuXG5cdH1cblxufVxuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gQ2FudmFzVGV4dHVyZSggY2FudmFzLCBtYXBwaW5nLCB3cmFwUywgd3JhcFQsIG1hZ0ZpbHRlciwgbWluRmlsdGVyLCBmb3JtYXQsIHR5cGUsIGFuaXNvdHJvcHkgKSB7XG5cblx0VGV4dHVyZS5jYWxsKCB0aGlzLCBjYW52YXMsIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmlsdGVyLCBtaW5GaWx0ZXIsIGZvcm1hdCwgdHlwZSwgYW5pc290cm9weSApO1xuXG5cdHRoaXMubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG59XG5cbkNhbnZhc1RleHR1cmUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggVGV4dHVyZS5wcm90b3R5cGUgKTtcbkNhbnZhc1RleHR1cmUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ2FudmFzVGV4dHVyZTtcblxuLyoqXG4gKiBAYXV0aG9yIG1pa2FlbCBlbXRpbmdlciAvIGh0dHA6Ly9nb21vLnNlL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBXZWJHTFNwcml0ZVJlbmRlcmVyKCByZW5kZXJlciwgZ2wsIHN0YXRlLCB0ZXh0dXJlcywgY2FwYWJpbGl0aWVzICkge1xuXG5cdHZhciB2ZXJ0ZXhCdWZmZXIsIGVsZW1lbnRCdWZmZXI7XG5cdHZhciBwcm9ncmFtLCBhdHRyaWJ1dGVzLCB1bmlmb3JtcztcblxuXHR2YXIgdGV4dHVyZTtcblxuXHQvLyBkZWNvbXBvc2UgbWF0cml4V29ybGRcblxuXHR2YXIgc3ByaXRlUG9zaXRpb24gPSBuZXcgVmVjdG9yMygpO1xuXHR2YXIgc3ByaXRlUm90YXRpb24gPSBuZXcgUXVhdGVybmlvbigpO1xuXHR2YXIgc3ByaXRlU2NhbGUgPSBuZXcgVmVjdG9yMygpO1xuXG5cdGZ1bmN0aW9uIGluaXQoKSB7XG5cblx0XHR2YXIgdmVydGljZXMgPSBuZXcgRmxvYXQzMkFycmF5KCBbXG5cdFx0XHQtIDAuNSwgLSAwLjUsIDAsIDAsXG5cdFx0XHQgIDAuNSwgLSAwLjUsIDEsIDAsXG5cdFx0XHQgIDAuNSwgMC41LCAxLCAxLFxuXHRcdFx0LSAwLjUsIDAuNSwgMCwgMVxuXHRcdF0gKTtcblxuXHRcdHZhciBmYWNlcyA9IG5ldyBVaW50MTZBcnJheSggW1xuXHRcdFx0MCwgMSwgMixcblx0XHRcdDAsIDIsIDNcblx0XHRdICk7XG5cblx0XHR2ZXJ0ZXhCdWZmZXIgPSBnbC5jcmVhdGVCdWZmZXIoKTtcblx0XHRlbGVtZW50QnVmZmVyID0gZ2wuY3JlYXRlQnVmZmVyKCk7XG5cblx0XHRnbC5iaW5kQnVmZmVyKCBnbC5BUlJBWV9CVUZGRVIsIHZlcnRleEJ1ZmZlciApO1xuXHRcdGdsLmJ1ZmZlckRhdGEoIGdsLkFSUkFZX0JVRkZFUiwgdmVydGljZXMsIGdsLlNUQVRJQ19EUkFXICk7XG5cblx0XHRnbC5iaW5kQnVmZmVyKCBnbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgZWxlbWVudEJ1ZmZlciApO1xuXHRcdGdsLmJ1ZmZlckRhdGEoIGdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCBmYWNlcywgZ2wuU1RBVElDX0RSQVcgKTtcblxuXHRcdHByb2dyYW0gPSBjcmVhdGVQcm9ncmFtKCk7XG5cblx0XHRhdHRyaWJ1dGVzID0ge1xuXHRcdFx0cG9zaXRpb246IGdsLmdldEF0dHJpYkxvY2F0aW9uKCBwcm9ncmFtLCAncG9zaXRpb24nICksXG5cdFx0XHR1djogZ2wuZ2V0QXR0cmliTG9jYXRpb24oIHByb2dyYW0sICd1dicgKVxuXHRcdH07XG5cblx0XHR1bmlmb3JtcyA9IHtcblx0XHRcdHV2T2Zmc2V0OiBnbC5nZXRVbmlmb3JtTG9jYXRpb24oIHByb2dyYW0sICd1dk9mZnNldCcgKSxcblx0XHRcdHV2U2NhbGU6IGdsLmdldFVuaWZvcm1Mb2NhdGlvbiggcHJvZ3JhbSwgJ3V2U2NhbGUnICksXG5cblx0XHRcdHJvdGF0aW9uOiBnbC5nZXRVbmlmb3JtTG9jYXRpb24oIHByb2dyYW0sICdyb3RhdGlvbicgKSxcblx0XHRcdGNlbnRlcjogZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCAnY2VudGVyJyApLFxuXHRcdFx0c2NhbGU6IGdsLmdldFVuaWZvcm1Mb2NhdGlvbiggcHJvZ3JhbSwgJ3NjYWxlJyApLFxuXG5cdFx0XHRjb2xvcjogZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCAnY29sb3InICksXG5cdFx0XHRtYXA6IGdsLmdldFVuaWZvcm1Mb2NhdGlvbiggcHJvZ3JhbSwgJ21hcCcgKSxcblx0XHRcdG9wYWNpdHk6IGdsLmdldFVuaWZvcm1Mb2NhdGlvbiggcHJvZ3JhbSwgJ29wYWNpdHknICksXG5cblx0XHRcdG1vZGVsVmlld01hdHJpeDogZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCAnbW9kZWxWaWV3TWF0cml4JyApLFxuXHRcdFx0cHJvamVjdGlvbk1hdHJpeDogZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCAncHJvamVjdGlvbk1hdHJpeCcgKSxcblxuXHRcdFx0Zm9nVHlwZTogZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCAnZm9nVHlwZScgKSxcblx0XHRcdGZvZ0RlbnNpdHk6IGdsLmdldFVuaWZvcm1Mb2NhdGlvbiggcHJvZ3JhbSwgJ2ZvZ0RlbnNpdHknICksXG5cdFx0XHRmb2dOZWFyOiBnbC5nZXRVbmlmb3JtTG9jYXRpb24oIHByb2dyYW0sICdmb2dOZWFyJyApLFxuXHRcdFx0Zm9nRmFyOiBnbC5nZXRVbmlmb3JtTG9jYXRpb24oIHByb2dyYW0sICdmb2dGYXInICksXG5cdFx0XHRmb2dDb2xvcjogZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCAnZm9nQ29sb3InICksXG5cdFx0XHRmb2dEZXB0aDogZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCAnZm9nRGVwdGgnICksXG5cblx0XHRcdGFscGhhVGVzdDogZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCAnYWxwaGFUZXN0JyApXG5cdFx0fTtcblxuXHRcdHZhciBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJywgJ2NhbnZhcycgKTtcblx0XHRjYW52YXMud2lkdGggPSA4O1xuXHRcdGNhbnZhcy5oZWlnaHQgPSA4O1xuXG5cdFx0dmFyIGNvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dCggJzJkJyApO1xuXHRcdGNvbnRleHQuZmlsbFN0eWxlID0gJ3doaXRlJztcblx0XHRjb250ZXh0LmZpbGxSZWN0KCAwLCAwLCA4LCA4ICk7XG5cblx0XHR0ZXh0dXJlID0gbmV3IENhbnZhc1RleHR1cmUoIGNhbnZhcyApO1xuXG5cdH1cblxuXHR0aGlzLnJlbmRlciA9IGZ1bmN0aW9uICggc3ByaXRlcywgc2NlbmUsIGNhbWVyYSApIHtcblxuXHRcdGlmICggc3ByaXRlcy5sZW5ndGggPT09IDAgKSByZXR1cm47XG5cblx0XHQvLyBzZXR1cCBnbFxuXG5cdFx0aWYgKCBwcm9ncmFtID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGluaXQoKTtcblxuXHRcdH1cblxuXHRcdHN0YXRlLnVzZVByb2dyYW0oIHByb2dyYW0gKTtcblxuXHRcdHN0YXRlLmluaXRBdHRyaWJ1dGVzKCk7XG5cdFx0c3RhdGUuZW5hYmxlQXR0cmlidXRlKCBhdHRyaWJ1dGVzLnBvc2l0aW9uICk7XG5cdFx0c3RhdGUuZW5hYmxlQXR0cmlidXRlKCBhdHRyaWJ1dGVzLnV2ICk7XG5cdFx0c3RhdGUuZGlzYWJsZVVudXNlZEF0dHJpYnV0ZXMoKTtcblxuXHRcdHN0YXRlLmRpc2FibGUoIGdsLkNVTExfRkFDRSApO1xuXHRcdHN0YXRlLmVuYWJsZSggZ2wuQkxFTkQgKTtcblxuXHRcdGdsLmJpbmRCdWZmZXIoIGdsLkFSUkFZX0JVRkZFUiwgdmVydGV4QnVmZmVyICk7XG5cdFx0Z2wudmVydGV4QXR0cmliUG9pbnRlciggYXR0cmlidXRlcy5wb3NpdGlvbiwgMiwgZ2wuRkxPQVQsIGZhbHNlLCAyICogOCwgMCApO1xuXHRcdGdsLnZlcnRleEF0dHJpYlBvaW50ZXIoIGF0dHJpYnV0ZXMudXYsIDIsIGdsLkZMT0FULCBmYWxzZSwgMiAqIDgsIDggKTtcblxuXHRcdGdsLmJpbmRCdWZmZXIoIGdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCBlbGVtZW50QnVmZmVyICk7XG5cblx0XHRnbC51bmlmb3JtTWF0cml4NGZ2KCB1bmlmb3Jtcy5wcm9qZWN0aW9uTWF0cml4LCBmYWxzZSwgY2FtZXJhLnByb2plY3Rpb25NYXRyaXguZWxlbWVudHMgKTtcblxuXHRcdHN0YXRlLmFjdGl2ZVRleHR1cmUoIGdsLlRFWFRVUkUwICk7XG5cdFx0Z2wudW5pZm9ybTFpKCB1bmlmb3Jtcy5tYXAsIDAgKTtcblxuXHRcdHZhciBvbGRGb2dUeXBlID0gMDtcblx0XHR2YXIgc2NlbmVGb2dUeXBlID0gMDtcblx0XHR2YXIgZm9nID0gc2NlbmUuZm9nO1xuXG5cdFx0aWYgKCBmb2cgKSB7XG5cblx0XHRcdGdsLnVuaWZvcm0zZiggdW5pZm9ybXMuZm9nQ29sb3IsIGZvZy5jb2xvci5yLCBmb2cuY29sb3IuZywgZm9nLmNvbG9yLmIgKTtcblxuXHRcdFx0aWYgKCBmb2cuaXNGb2cgKSB7XG5cblx0XHRcdFx0Z2wudW5pZm9ybTFmKCB1bmlmb3Jtcy5mb2dOZWFyLCBmb2cubmVhciApO1xuXHRcdFx0XHRnbC51bmlmb3JtMWYoIHVuaWZvcm1zLmZvZ0ZhciwgZm9nLmZhciApO1xuXG5cdFx0XHRcdGdsLnVuaWZvcm0xaSggdW5pZm9ybXMuZm9nVHlwZSwgMSApO1xuXHRcdFx0XHRvbGRGb2dUeXBlID0gMTtcblx0XHRcdFx0c2NlbmVGb2dUeXBlID0gMTtcblxuXHRcdFx0fSBlbHNlIGlmICggZm9nLmlzRm9nRXhwMiApIHtcblxuXHRcdFx0XHRnbC51bmlmb3JtMWYoIHVuaWZvcm1zLmZvZ0RlbnNpdHksIGZvZy5kZW5zaXR5ICk7XG5cblx0XHRcdFx0Z2wudW5pZm9ybTFpKCB1bmlmb3Jtcy5mb2dUeXBlLCAyICk7XG5cdFx0XHRcdG9sZEZvZ1R5cGUgPSAyO1xuXHRcdFx0XHRzY2VuZUZvZ1R5cGUgPSAyO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRnbC51bmlmb3JtMWkoIHVuaWZvcm1zLmZvZ1R5cGUsIDAgKTtcblx0XHRcdG9sZEZvZ1R5cGUgPSAwO1xuXHRcdFx0c2NlbmVGb2dUeXBlID0gMDtcblxuXHRcdH1cblxuXG5cdFx0Ly8gdXBkYXRlIHBvc2l0aW9ucyBhbmQgc29ydFxuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gc3ByaXRlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgc3ByaXRlID0gc3ByaXRlc1sgaSBdO1xuXG5cdFx0XHRzcHJpdGUubW9kZWxWaWV3TWF0cml4Lm11bHRpcGx5TWF0cmljZXMoIGNhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UsIHNwcml0ZS5tYXRyaXhXb3JsZCApO1xuXHRcdFx0c3ByaXRlLnogPSAtIHNwcml0ZS5tb2RlbFZpZXdNYXRyaXguZWxlbWVudHNbIDE0IF07XG5cblx0XHR9XG5cblx0XHRzcHJpdGVzLnNvcnQoIHBhaW50ZXJTb3J0U3RhYmxlICk7XG5cblx0XHQvLyByZW5kZXIgYWxsIHNwcml0ZXNcblxuXHRcdHZhciBzY2FsZSA9IFtdO1xuXHRcdHZhciBjZW50ZXIgPSBbXTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHNwcml0ZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIHNwcml0ZSA9IHNwcml0ZXNbIGkgXTtcblx0XHRcdHZhciBtYXRlcmlhbCA9IHNwcml0ZS5tYXRlcmlhbDtcblxuXHRcdFx0aWYgKCBtYXRlcmlhbC52aXNpYmxlID09PSBmYWxzZSApIGNvbnRpbnVlO1xuXG5cdFx0XHRzcHJpdGUub25CZWZvcmVSZW5kZXIoIHJlbmRlcmVyLCBzY2VuZSwgY2FtZXJhLCB1bmRlZmluZWQsIG1hdGVyaWFsLCB1bmRlZmluZWQgKTtcblxuXHRcdFx0Z2wudW5pZm9ybTFmKCB1bmlmb3Jtcy5hbHBoYVRlc3QsIG1hdGVyaWFsLmFscGhhVGVzdCApO1xuXHRcdFx0Z2wudW5pZm9ybU1hdHJpeDRmdiggdW5pZm9ybXMubW9kZWxWaWV3TWF0cml4LCBmYWxzZSwgc3ByaXRlLm1vZGVsVmlld01hdHJpeC5lbGVtZW50cyApO1xuXG5cdFx0XHRzcHJpdGUubWF0cml4V29ybGQuZGVjb21wb3NlKCBzcHJpdGVQb3NpdGlvbiwgc3ByaXRlUm90YXRpb24sIHNwcml0ZVNjYWxlICk7XG5cblx0XHRcdHNjYWxlWyAwIF0gPSBzcHJpdGVTY2FsZS54O1xuXHRcdFx0c2NhbGVbIDEgXSA9IHNwcml0ZVNjYWxlLnk7XG5cblx0XHRcdGNlbnRlclsgMCBdID0gc3ByaXRlLmNlbnRlci54IC0gMC41O1xuXHRcdFx0Y2VudGVyWyAxIF0gPSBzcHJpdGUuY2VudGVyLnkgLSAwLjU7XG5cblx0XHRcdHZhciBmb2dUeXBlID0gMDtcblxuXHRcdFx0aWYgKCBzY2VuZS5mb2cgJiYgbWF0ZXJpYWwuZm9nICkge1xuXG5cdFx0XHRcdGZvZ1R5cGUgPSBzY2VuZUZvZ1R5cGU7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBvbGRGb2dUeXBlICE9PSBmb2dUeXBlICkge1xuXG5cdFx0XHRcdGdsLnVuaWZvcm0xaSggdW5pZm9ybXMuZm9nVHlwZSwgZm9nVHlwZSApO1xuXHRcdFx0XHRvbGRGb2dUeXBlID0gZm9nVHlwZTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIG1hdGVyaWFsLm1hcCAhPT0gbnVsbCApIHtcblxuXHRcdFx0XHRnbC51bmlmb3JtMmYoIHVuaWZvcm1zLnV2T2Zmc2V0LCBtYXRlcmlhbC5tYXAub2Zmc2V0LngsIG1hdGVyaWFsLm1hcC5vZmZzZXQueSApO1xuXHRcdFx0XHRnbC51bmlmb3JtMmYoIHVuaWZvcm1zLnV2U2NhbGUsIG1hdGVyaWFsLm1hcC5yZXBlYXQueCwgbWF0ZXJpYWwubWFwLnJlcGVhdC55ICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Z2wudW5pZm9ybTJmKCB1bmlmb3Jtcy51dk9mZnNldCwgMCwgMCApO1xuXHRcdFx0XHRnbC51bmlmb3JtMmYoIHVuaWZvcm1zLnV2U2NhbGUsIDEsIDEgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRnbC51bmlmb3JtMWYoIHVuaWZvcm1zLm9wYWNpdHksIG1hdGVyaWFsLm9wYWNpdHkgKTtcblx0XHRcdGdsLnVuaWZvcm0zZiggdW5pZm9ybXMuY29sb3IsIG1hdGVyaWFsLmNvbG9yLnIsIG1hdGVyaWFsLmNvbG9yLmcsIG1hdGVyaWFsLmNvbG9yLmIgKTtcblxuXHRcdFx0Z2wudW5pZm9ybTFmKCB1bmlmb3Jtcy5yb3RhdGlvbiwgbWF0ZXJpYWwucm90YXRpb24gKTtcblx0XHRcdGdsLnVuaWZvcm0yZnYoIHVuaWZvcm1zLmNlbnRlciwgY2VudGVyICk7XG5cdFx0XHRnbC51bmlmb3JtMmZ2KCB1bmlmb3Jtcy5zY2FsZSwgc2NhbGUgKTtcblxuXHRcdFx0c3RhdGUuc2V0QmxlbmRpbmcoIG1hdGVyaWFsLmJsZW5kaW5nLCBtYXRlcmlhbC5ibGVuZEVxdWF0aW9uLCBtYXRlcmlhbC5ibGVuZFNyYywgbWF0ZXJpYWwuYmxlbmREc3QsIG1hdGVyaWFsLmJsZW5kRXF1YXRpb25BbHBoYSwgbWF0ZXJpYWwuYmxlbmRTcmNBbHBoYSwgbWF0ZXJpYWwuYmxlbmREc3RBbHBoYSwgbWF0ZXJpYWwucHJlbXVsdGlwbGllZEFscGhhICk7XG5cdFx0XHRzdGF0ZS5idWZmZXJzLmRlcHRoLnNldFRlc3QoIG1hdGVyaWFsLmRlcHRoVGVzdCApO1xuXHRcdFx0c3RhdGUuYnVmZmVycy5kZXB0aC5zZXRNYXNrKCBtYXRlcmlhbC5kZXB0aFdyaXRlICk7XG5cdFx0XHRzdGF0ZS5idWZmZXJzLmNvbG9yLnNldE1hc2soIG1hdGVyaWFsLmNvbG9yV3JpdGUgKTtcblxuXHRcdFx0dGV4dHVyZXMuc2V0VGV4dHVyZTJEKCBtYXRlcmlhbC5tYXAgfHwgdGV4dHVyZSwgMCApO1xuXG5cdFx0XHRnbC5kcmF3RWxlbWVudHMoIGdsLlRSSUFOR0xFUywgNiwgZ2wuVU5TSUdORURfU0hPUlQsIDAgKTtcblxuXHRcdFx0c3ByaXRlLm9uQWZ0ZXJSZW5kZXIoIHJlbmRlcmVyLCBzY2VuZSwgY2FtZXJhLCB1bmRlZmluZWQsIG1hdGVyaWFsLCB1bmRlZmluZWQgKTtcblxuXHRcdH1cblxuXHRcdC8vIHJlc3RvcmUgZ2xcblxuXHRcdHN0YXRlLmVuYWJsZSggZ2wuQ1VMTF9GQUNFICk7XG5cblx0XHRzdGF0ZS5yZXNldCgpO1xuXG5cdH07XG5cblx0ZnVuY3Rpb24gY3JlYXRlUHJvZ3JhbSgpIHtcblxuXHRcdHZhciBwcm9ncmFtID0gZ2wuY3JlYXRlUHJvZ3JhbSgpO1xuXG5cdFx0dmFyIHZlcnRleFNoYWRlciA9IGdsLmNyZWF0ZVNoYWRlciggZ2wuVkVSVEVYX1NIQURFUiApO1xuXHRcdHZhciBmcmFnbWVudFNoYWRlciA9IGdsLmNyZWF0ZVNoYWRlciggZ2wuRlJBR01FTlRfU0hBREVSICk7XG5cblx0XHRnbC5zaGFkZXJTb3VyY2UoIHZlcnRleFNoYWRlciwgW1xuXG5cdFx0XHQncHJlY2lzaW9uICcgKyBjYXBhYmlsaXRpZXMucHJlY2lzaW9uICsgJyBmbG9hdDsnLFxuXG5cdFx0XHQnI2RlZmluZSBTSEFERVJfTkFNRSAnICsgJ1Nwcml0ZU1hdGVyaWFsJyxcblxuXHRcdFx0J3VuaWZvcm0gbWF0NCBtb2RlbFZpZXdNYXRyaXg7Jyxcblx0XHRcdCd1bmlmb3JtIG1hdDQgcHJvamVjdGlvbk1hdHJpeDsnLFxuXHRcdFx0J3VuaWZvcm0gZmxvYXQgcm90YXRpb247Jyxcblx0XHRcdCd1bmlmb3JtIHZlYzIgY2VudGVyOycsXG5cdFx0XHQndW5pZm9ybSB2ZWMyIHNjYWxlOycsXG5cdFx0XHQndW5pZm9ybSB2ZWMyIHV2T2Zmc2V0OycsXG5cdFx0XHQndW5pZm9ybSB2ZWMyIHV2U2NhbGU7JyxcblxuXHRcdFx0J2F0dHJpYnV0ZSB2ZWMyIHBvc2l0aW9uOycsXG5cdFx0XHQnYXR0cmlidXRlIHZlYzIgdXY7JyxcblxuXHRcdFx0J3ZhcnlpbmcgdmVjMiB2VVY7Jyxcblx0XHRcdCd2YXJ5aW5nIGZsb2F0IGZvZ0RlcHRoOycsXG5cblx0XHRcdCd2b2lkIG1haW4oKSB7JyxcblxuXHRcdFx0J1x0dlVWID0gdXZPZmZzZXQgKyB1diAqIHV2U2NhbGU7JyxcblxuXHRcdFx0J1x0dmVjMiBhbGlnbmVkUG9zaXRpb24gPSAoIHBvc2l0aW9uIC0gY2VudGVyICkgKiBzY2FsZTsnLFxuXG5cdFx0XHQnXHR2ZWMyIHJvdGF0ZWRQb3NpdGlvbjsnLFxuXHRcdFx0J1x0cm90YXRlZFBvc2l0aW9uLnggPSBjb3MoIHJvdGF0aW9uICkgKiBhbGlnbmVkUG9zaXRpb24ueCAtIHNpbiggcm90YXRpb24gKSAqIGFsaWduZWRQb3NpdGlvbi55OycsXG5cdFx0XHQnXHRyb3RhdGVkUG9zaXRpb24ueSA9IHNpbiggcm90YXRpb24gKSAqIGFsaWduZWRQb3NpdGlvbi54ICsgY29zKCByb3RhdGlvbiApICogYWxpZ25lZFBvc2l0aW9uLnk7JyxcblxuXHRcdFx0J1x0dmVjNCBtdlBvc2l0aW9uOycsXG5cblx0XHRcdCdcdG12UG9zaXRpb24gPSBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KCAwLjAsIDAuMCwgMC4wLCAxLjAgKTsnLFxuXHRcdFx0J1x0bXZQb3NpdGlvbi54eSArPSByb3RhdGVkUG9zaXRpb247JyxcblxuXHRcdFx0J1x0Z2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbXZQb3NpdGlvbjsnLFxuXG5cdFx0XHQnXHRmb2dEZXB0aCA9IC0gbXZQb3NpdGlvbi56OycsXG5cblx0XHRcdCd9J1xuXG5cdFx0XS5qb2luKCAnXFxuJyApICk7XG5cblx0XHRnbC5zaGFkZXJTb3VyY2UoIGZyYWdtZW50U2hhZGVyLCBbXG5cblx0XHRcdCdwcmVjaXNpb24gJyArIGNhcGFiaWxpdGllcy5wcmVjaXNpb24gKyAnIGZsb2F0OycsXG5cblx0XHRcdCcjZGVmaW5lIFNIQURFUl9OQU1FICcgKyAnU3ByaXRlTWF0ZXJpYWwnLFxuXG5cdFx0XHQndW5pZm9ybSB2ZWMzIGNvbG9yOycsXG5cdFx0XHQndW5pZm9ybSBzYW1wbGVyMkQgbWFwOycsXG5cdFx0XHQndW5pZm9ybSBmbG9hdCBvcGFjaXR5OycsXG5cblx0XHRcdCd1bmlmb3JtIGludCBmb2dUeXBlOycsXG5cdFx0XHQndW5pZm9ybSB2ZWMzIGZvZ0NvbG9yOycsXG5cdFx0XHQndW5pZm9ybSBmbG9hdCBmb2dEZW5zaXR5OycsXG5cdFx0XHQndW5pZm9ybSBmbG9hdCBmb2dOZWFyOycsXG5cdFx0XHQndW5pZm9ybSBmbG9hdCBmb2dGYXI7Jyxcblx0XHRcdCd1bmlmb3JtIGZsb2F0IGFscGhhVGVzdDsnLFxuXG5cdFx0XHQndmFyeWluZyB2ZWMyIHZVVjsnLFxuXHRcdFx0J3ZhcnlpbmcgZmxvYXQgZm9nRGVwdGg7JyxcblxuXHRcdFx0J3ZvaWQgbWFpbigpIHsnLFxuXG5cdFx0XHQnXHR2ZWM0IHRleHR1cmUgPSB0ZXh0dXJlMkQoIG1hcCwgdlVWICk7JyxcblxuXHRcdFx0J1x0Z2xfRnJhZ0NvbG9yID0gdmVjNCggY29sb3IgKiB0ZXh0dXJlLnh5eiwgdGV4dHVyZS5hICogb3BhY2l0eSApOycsXG5cblx0XHRcdCdcdGlmICggZ2xfRnJhZ0NvbG9yLmEgPCBhbHBoYVRlc3QgKSBkaXNjYXJkOycsXG5cblx0XHRcdCdcdGlmICggZm9nVHlwZSA+IDAgKSB7JyxcblxuXHRcdFx0J1x0XHRmbG9hdCBmb2dGYWN0b3IgPSAwLjA7JyxcblxuXHRcdFx0J1x0XHRpZiAoIGZvZ1R5cGUgPT0gMSApIHsnLFxuXG5cdFx0XHQnXHRcdFx0Zm9nRmFjdG9yID0gc21vb3Roc3RlcCggZm9nTmVhciwgZm9nRmFyLCBmb2dEZXB0aCApOycsXG5cblx0XHRcdCdcdFx0fSBlbHNlIHsnLFxuXG5cdFx0XHQnXHRcdFx0Y29uc3QgZmxvYXQgTE9HMiA9IDEuNDQyNjk1OycsXG5cdFx0XHQnXHRcdFx0Zm9nRmFjdG9yID0gZXhwMiggLSBmb2dEZW5zaXR5ICogZm9nRGVuc2l0eSAqIGZvZ0RlcHRoICogZm9nRGVwdGggKiBMT0cyICk7Jyxcblx0XHRcdCdcdFx0XHRmb2dGYWN0b3IgPSAxLjAgLSBjbGFtcCggZm9nRmFjdG9yLCAwLjAsIDEuMCApOycsXG5cblx0XHRcdCdcdFx0fScsXG5cblx0XHRcdCdcdFx0Z2xfRnJhZ0NvbG9yLnJnYiA9IG1peCggZ2xfRnJhZ0NvbG9yLnJnYiwgZm9nQ29sb3IsIGZvZ0ZhY3RvciApOycsXG5cblx0XHRcdCdcdH0nLFxuXG5cdFx0XHQnfSdcblxuXHRcdF0uam9pbiggJ1xcbicgKSApO1xuXG5cdFx0Z2wuY29tcGlsZVNoYWRlciggdmVydGV4U2hhZGVyICk7XG5cdFx0Z2wuY29tcGlsZVNoYWRlciggZnJhZ21lbnRTaGFkZXIgKTtcblxuXHRcdGdsLmF0dGFjaFNoYWRlciggcHJvZ3JhbSwgdmVydGV4U2hhZGVyICk7XG5cdFx0Z2wuYXR0YWNoU2hhZGVyKCBwcm9ncmFtLCBmcmFnbWVudFNoYWRlciApO1xuXG5cdFx0Z2wubGlua1Byb2dyYW0oIHByb2dyYW0gKTtcblxuXHRcdHJldHVybiBwcm9ncmFtO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBwYWludGVyU29ydFN0YWJsZSggYSwgYiApIHtcblxuXHRcdGlmICggYS5yZW5kZXJPcmRlciAhPT0gYi5yZW5kZXJPcmRlciApIHtcblxuXHRcdFx0cmV0dXJuIGEucmVuZGVyT3JkZXIgLSBiLnJlbmRlck9yZGVyO1xuXG5cdFx0fSBlbHNlIGlmICggYS56ICE9PSBiLnogKSB7XG5cblx0XHRcdHJldHVybiBiLnogLSBhLno7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRyZXR1cm4gYi5pZCAtIGEuaWQ7XG5cblx0XHR9XG5cblx0fVxuXG59XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBXZWJHTFN0YXRlKCBnbCwgZXh0ZW5zaW9ucywgdXRpbHMgKSB7XG5cblx0ZnVuY3Rpb24gQ29sb3JCdWZmZXIoKSB7XG5cblx0XHR2YXIgbG9ja2VkID0gZmFsc2U7XG5cblx0XHR2YXIgY29sb3IgPSBuZXcgVmVjdG9yNCgpO1xuXHRcdHZhciBjdXJyZW50Q29sb3JNYXNrID0gbnVsbDtcblx0XHR2YXIgY3VycmVudENvbG9yQ2xlYXIgPSBuZXcgVmVjdG9yNCggMCwgMCwgMCwgMCApO1xuXG5cdFx0cmV0dXJuIHtcblxuXHRcdFx0c2V0TWFzazogZnVuY3Rpb24gKCBjb2xvck1hc2sgKSB7XG5cblx0XHRcdFx0aWYgKCBjdXJyZW50Q29sb3JNYXNrICE9PSBjb2xvck1hc2sgJiYgISBsb2NrZWQgKSB7XG5cblx0XHRcdFx0XHRnbC5jb2xvck1hc2soIGNvbG9yTWFzaywgY29sb3JNYXNrLCBjb2xvck1hc2ssIGNvbG9yTWFzayApO1xuXHRcdFx0XHRcdGN1cnJlbnRDb2xvck1hc2sgPSBjb2xvck1hc2s7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9LFxuXG5cdFx0XHRzZXRMb2NrZWQ6IGZ1bmN0aW9uICggbG9jayApIHtcblxuXHRcdFx0XHRsb2NrZWQgPSBsb2NrO1xuXG5cdFx0XHR9LFxuXG5cdFx0XHRzZXRDbGVhcjogZnVuY3Rpb24gKCByLCBnLCBiLCBhLCBwcmVtdWx0aXBsaWVkQWxwaGEgKSB7XG5cblx0XHRcdFx0aWYgKCBwcmVtdWx0aXBsaWVkQWxwaGEgPT09IHRydWUgKSB7XG5cblx0XHRcdFx0XHRyICo9IGE7IGcgKj0gYTsgYiAqPSBhO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb2xvci5zZXQoIHIsIGcsIGIsIGEgKTtcblxuXHRcdFx0XHRpZiAoIGN1cnJlbnRDb2xvckNsZWFyLmVxdWFscyggY29sb3IgKSA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdFx0XHRnbC5jbGVhckNvbG9yKCByLCBnLCBiLCBhICk7XG5cdFx0XHRcdFx0Y3VycmVudENvbG9yQ2xlYXIuY29weSggY29sb3IgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0sXG5cblx0XHRcdHJlc2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdFx0bG9ja2VkID0gZmFsc2U7XG5cblx0XHRcdFx0Y3VycmVudENvbG9yTWFzayA9IG51bGw7XG5cdFx0XHRcdGN1cnJlbnRDb2xvckNsZWFyLnNldCggLSAxLCAwLCAwLCAwICk7IC8vIHNldCB0byBpbnZhbGlkIHN0YXRlXG5cblx0XHRcdH1cblxuXHRcdH07XG5cblx0fVxuXG5cdGZ1bmN0aW9uIERlcHRoQnVmZmVyKCkge1xuXG5cdFx0dmFyIGxvY2tlZCA9IGZhbHNlO1xuXG5cdFx0dmFyIGN1cnJlbnREZXB0aE1hc2sgPSBudWxsO1xuXHRcdHZhciBjdXJyZW50RGVwdGhGdW5jID0gbnVsbDtcblx0XHR2YXIgY3VycmVudERlcHRoQ2xlYXIgPSBudWxsO1xuXG5cdFx0cmV0dXJuIHtcblxuXHRcdFx0c2V0VGVzdDogZnVuY3Rpb24gKCBkZXB0aFRlc3QgKSB7XG5cblx0XHRcdFx0aWYgKCBkZXB0aFRlc3QgKSB7XG5cblx0XHRcdFx0XHRlbmFibGUoIGdsLkRFUFRIX1RFU1QgKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0ZGlzYWJsZSggZ2wuREVQVEhfVEVTVCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSxcblxuXHRcdFx0c2V0TWFzazogZnVuY3Rpb24gKCBkZXB0aE1hc2sgKSB7XG5cblx0XHRcdFx0aWYgKCBjdXJyZW50RGVwdGhNYXNrICE9PSBkZXB0aE1hc2sgJiYgISBsb2NrZWQgKSB7XG5cblx0XHRcdFx0XHRnbC5kZXB0aE1hc2soIGRlcHRoTWFzayApO1xuXHRcdFx0XHRcdGN1cnJlbnREZXB0aE1hc2sgPSBkZXB0aE1hc2s7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9LFxuXG5cdFx0XHRzZXRGdW5jOiBmdW5jdGlvbiAoIGRlcHRoRnVuYyApIHtcblxuXHRcdFx0XHRpZiAoIGN1cnJlbnREZXB0aEZ1bmMgIT09IGRlcHRoRnVuYyApIHtcblxuXHRcdFx0XHRcdGlmICggZGVwdGhGdW5jICkge1xuXG5cdFx0XHRcdFx0XHRzd2l0Y2ggKCBkZXB0aEZ1bmMgKSB7XG5cblx0XHRcdFx0XHRcdFx0Y2FzZSBOZXZlckRlcHRoOlxuXG5cdFx0XHRcdFx0XHRcdFx0Z2wuZGVwdGhGdW5jKCBnbC5ORVZFUiApO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHRcdGNhc2UgQWx3YXlzRGVwdGg6XG5cblx0XHRcdFx0XHRcdFx0XHRnbC5kZXB0aEZ1bmMoIGdsLkFMV0FZUyApO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHRcdGNhc2UgTGVzc0RlcHRoOlxuXG5cdFx0XHRcdFx0XHRcdFx0Z2wuZGVwdGhGdW5jKCBnbC5MRVNTICk7XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRcdFx0Y2FzZSBMZXNzRXF1YWxEZXB0aDpcblxuXHRcdFx0XHRcdFx0XHRcdGdsLmRlcHRoRnVuYyggZ2wuTEVRVUFMICk7XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRcdFx0Y2FzZSBFcXVhbERlcHRoOlxuXG5cdFx0XHRcdFx0XHRcdFx0Z2wuZGVwdGhGdW5jKCBnbC5FUVVBTCApO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHRcdGNhc2UgR3JlYXRlckVxdWFsRGVwdGg6XG5cblx0XHRcdFx0XHRcdFx0XHRnbC5kZXB0aEZ1bmMoIGdsLkdFUVVBTCApO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHRcdGNhc2UgR3JlYXRlckRlcHRoOlxuXG5cdFx0XHRcdFx0XHRcdFx0Z2wuZGVwdGhGdW5jKCBnbC5HUkVBVEVSICk7XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRcdFx0Y2FzZSBOb3RFcXVhbERlcHRoOlxuXG5cdFx0XHRcdFx0XHRcdFx0Z2wuZGVwdGhGdW5jKCBnbC5OT1RFUVVBTCApO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHRcdGRlZmF1bHQ6XG5cblx0XHRcdFx0XHRcdFx0XHRnbC5kZXB0aEZ1bmMoIGdsLkxFUVVBTCApO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRnbC5kZXB0aEZ1bmMoIGdsLkxFUVVBTCApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Y3VycmVudERlcHRoRnVuYyA9IGRlcHRoRnVuYztcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0sXG5cblx0XHRcdHNldExvY2tlZDogZnVuY3Rpb24gKCBsb2NrICkge1xuXG5cdFx0XHRcdGxvY2tlZCA9IGxvY2s7XG5cblx0XHRcdH0sXG5cblx0XHRcdHNldENsZWFyOiBmdW5jdGlvbiAoIGRlcHRoICkge1xuXG5cdFx0XHRcdGlmICggY3VycmVudERlcHRoQ2xlYXIgIT09IGRlcHRoICkge1xuXG5cdFx0XHRcdFx0Z2wuY2xlYXJEZXB0aCggZGVwdGggKTtcblx0XHRcdFx0XHRjdXJyZW50RGVwdGhDbGVhciA9IGRlcHRoO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSxcblxuXHRcdFx0cmVzZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0XHRsb2NrZWQgPSBmYWxzZTtcblxuXHRcdFx0XHRjdXJyZW50RGVwdGhNYXNrID0gbnVsbDtcblx0XHRcdFx0Y3VycmVudERlcHRoRnVuYyA9IG51bGw7XG5cdFx0XHRcdGN1cnJlbnREZXB0aENsZWFyID0gbnVsbDtcblxuXHRcdFx0fVxuXG5cdFx0fTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gU3RlbmNpbEJ1ZmZlcigpIHtcblxuXHRcdHZhciBsb2NrZWQgPSBmYWxzZTtcblxuXHRcdHZhciBjdXJyZW50U3RlbmNpbE1hc2sgPSBudWxsO1xuXHRcdHZhciBjdXJyZW50U3RlbmNpbEZ1bmMgPSBudWxsO1xuXHRcdHZhciBjdXJyZW50U3RlbmNpbFJlZiA9IG51bGw7XG5cdFx0dmFyIGN1cnJlbnRTdGVuY2lsRnVuY01hc2sgPSBudWxsO1xuXHRcdHZhciBjdXJyZW50U3RlbmNpbEZhaWwgPSBudWxsO1xuXHRcdHZhciBjdXJyZW50U3RlbmNpbFpGYWlsID0gbnVsbDtcblx0XHR2YXIgY3VycmVudFN0ZW5jaWxaUGFzcyA9IG51bGw7XG5cdFx0dmFyIGN1cnJlbnRTdGVuY2lsQ2xlYXIgPSBudWxsO1xuXG5cdFx0cmV0dXJuIHtcblxuXHRcdFx0c2V0VGVzdDogZnVuY3Rpb24gKCBzdGVuY2lsVGVzdCApIHtcblxuXHRcdFx0XHRpZiAoIHN0ZW5jaWxUZXN0ICkge1xuXG5cdFx0XHRcdFx0ZW5hYmxlKCBnbC5TVEVOQ0lMX1RFU1QgKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0ZGlzYWJsZSggZ2wuU1RFTkNJTF9URVNUICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9LFxuXG5cdFx0XHRzZXRNYXNrOiBmdW5jdGlvbiAoIHN0ZW5jaWxNYXNrICkge1xuXG5cdFx0XHRcdGlmICggY3VycmVudFN0ZW5jaWxNYXNrICE9PSBzdGVuY2lsTWFzayAmJiAhIGxvY2tlZCApIHtcblxuXHRcdFx0XHRcdGdsLnN0ZW5jaWxNYXNrKCBzdGVuY2lsTWFzayApO1xuXHRcdFx0XHRcdGN1cnJlbnRTdGVuY2lsTWFzayA9IHN0ZW5jaWxNYXNrO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSxcblxuXHRcdFx0c2V0RnVuYzogZnVuY3Rpb24gKCBzdGVuY2lsRnVuYywgc3RlbmNpbFJlZiwgc3RlbmNpbE1hc2sgKSB7XG5cblx0XHRcdFx0aWYgKCBjdXJyZW50U3RlbmNpbEZ1bmMgIT09IHN0ZW5jaWxGdW5jIHx8XG5cdFx0XHRcdCAgICAgY3VycmVudFN0ZW5jaWxSZWYgXHQhPT0gc3RlbmNpbFJlZiBcdHx8XG5cdFx0XHRcdCAgICAgY3VycmVudFN0ZW5jaWxGdW5jTWFzayAhPT0gc3RlbmNpbE1hc2sgKSB7XG5cblx0XHRcdFx0XHRnbC5zdGVuY2lsRnVuYyggc3RlbmNpbEZ1bmMsIHN0ZW5jaWxSZWYsIHN0ZW5jaWxNYXNrICk7XG5cblx0XHRcdFx0XHRjdXJyZW50U3RlbmNpbEZ1bmMgPSBzdGVuY2lsRnVuYztcblx0XHRcdFx0XHRjdXJyZW50U3RlbmNpbFJlZiA9IHN0ZW5jaWxSZWY7XG5cdFx0XHRcdFx0Y3VycmVudFN0ZW5jaWxGdW5jTWFzayA9IHN0ZW5jaWxNYXNrO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSxcblxuXHRcdFx0c2V0T3A6IGZ1bmN0aW9uICggc3RlbmNpbEZhaWwsIHN0ZW5jaWxaRmFpbCwgc3RlbmNpbFpQYXNzICkge1xuXG5cdFx0XHRcdGlmICggY3VycmVudFN0ZW5jaWxGYWlsXHQgIT09IHN0ZW5jaWxGYWlsIFx0fHxcblx0XHRcdFx0ICAgICBjdXJyZW50U3RlbmNpbFpGYWlsICE9PSBzdGVuY2lsWkZhaWwgfHxcblx0XHRcdFx0ICAgICBjdXJyZW50U3RlbmNpbFpQYXNzICE9PSBzdGVuY2lsWlBhc3MgKSB7XG5cblx0XHRcdFx0XHRnbC5zdGVuY2lsT3AoIHN0ZW5jaWxGYWlsLCBzdGVuY2lsWkZhaWwsIHN0ZW5jaWxaUGFzcyApO1xuXG5cdFx0XHRcdFx0Y3VycmVudFN0ZW5jaWxGYWlsID0gc3RlbmNpbEZhaWw7XG5cdFx0XHRcdFx0Y3VycmVudFN0ZW5jaWxaRmFpbCA9IHN0ZW5jaWxaRmFpbDtcblx0XHRcdFx0XHRjdXJyZW50U3RlbmNpbFpQYXNzID0gc3RlbmNpbFpQYXNzO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSxcblxuXHRcdFx0c2V0TG9ja2VkOiBmdW5jdGlvbiAoIGxvY2sgKSB7XG5cblx0XHRcdFx0bG9ja2VkID0gbG9jaztcblxuXHRcdFx0fSxcblxuXHRcdFx0c2V0Q2xlYXI6IGZ1bmN0aW9uICggc3RlbmNpbCApIHtcblxuXHRcdFx0XHRpZiAoIGN1cnJlbnRTdGVuY2lsQ2xlYXIgIT09IHN0ZW5jaWwgKSB7XG5cblx0XHRcdFx0XHRnbC5jbGVhclN0ZW5jaWwoIHN0ZW5jaWwgKTtcblx0XHRcdFx0XHRjdXJyZW50U3RlbmNpbENsZWFyID0gc3RlbmNpbDtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0sXG5cblx0XHRcdHJlc2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdFx0bG9ja2VkID0gZmFsc2U7XG5cblx0XHRcdFx0Y3VycmVudFN0ZW5jaWxNYXNrID0gbnVsbDtcblx0XHRcdFx0Y3VycmVudFN0ZW5jaWxGdW5jID0gbnVsbDtcblx0XHRcdFx0Y3VycmVudFN0ZW5jaWxSZWYgPSBudWxsO1xuXHRcdFx0XHRjdXJyZW50U3RlbmNpbEZ1bmNNYXNrID0gbnVsbDtcblx0XHRcdFx0Y3VycmVudFN0ZW5jaWxGYWlsID0gbnVsbDtcblx0XHRcdFx0Y3VycmVudFN0ZW5jaWxaRmFpbCA9IG51bGw7XG5cdFx0XHRcdGN1cnJlbnRTdGVuY2lsWlBhc3MgPSBudWxsO1xuXHRcdFx0XHRjdXJyZW50U3RlbmNpbENsZWFyID0gbnVsbDtcblxuXHRcdFx0fVxuXG5cdFx0fTtcblxuXHR9XG5cblx0Ly9cblxuXHR2YXIgY29sb3JCdWZmZXIgPSBuZXcgQ29sb3JCdWZmZXIoKTtcblx0dmFyIGRlcHRoQnVmZmVyID0gbmV3IERlcHRoQnVmZmVyKCk7XG5cdHZhciBzdGVuY2lsQnVmZmVyID0gbmV3IFN0ZW5jaWxCdWZmZXIoKTtcblxuXHR2YXIgbWF4VmVydGV4QXR0cmlidXRlcyA9IGdsLmdldFBhcmFtZXRlciggZ2wuTUFYX1ZFUlRFWF9BVFRSSUJTICk7XG5cdHZhciBuZXdBdHRyaWJ1dGVzID0gbmV3IFVpbnQ4QXJyYXkoIG1heFZlcnRleEF0dHJpYnV0ZXMgKTtcblx0dmFyIGVuYWJsZWRBdHRyaWJ1dGVzID0gbmV3IFVpbnQ4QXJyYXkoIG1heFZlcnRleEF0dHJpYnV0ZXMgKTtcblx0dmFyIGF0dHJpYnV0ZURpdmlzb3JzID0gbmV3IFVpbnQ4QXJyYXkoIG1heFZlcnRleEF0dHJpYnV0ZXMgKTtcblxuXHR2YXIgY2FwYWJpbGl0aWVzID0ge307XG5cblx0dmFyIGNvbXByZXNzZWRUZXh0dXJlRm9ybWF0cyA9IG51bGw7XG5cblx0dmFyIGN1cnJlbnRQcm9ncmFtID0gbnVsbDtcblxuXHR2YXIgY3VycmVudEJsZW5kaW5nID0gbnVsbDtcblx0dmFyIGN1cnJlbnRCbGVuZEVxdWF0aW9uID0gbnVsbDtcblx0dmFyIGN1cnJlbnRCbGVuZFNyYyA9IG51bGw7XG5cdHZhciBjdXJyZW50QmxlbmREc3QgPSBudWxsO1xuXHR2YXIgY3VycmVudEJsZW5kRXF1YXRpb25BbHBoYSA9IG51bGw7XG5cdHZhciBjdXJyZW50QmxlbmRTcmNBbHBoYSA9IG51bGw7XG5cdHZhciBjdXJyZW50QmxlbmREc3RBbHBoYSA9IG51bGw7XG5cdHZhciBjdXJyZW50UHJlbXVsdGlwbGVkQWxwaGEgPSBmYWxzZTtcblxuXHR2YXIgY3VycmVudEZsaXBTaWRlZCA9IG51bGw7XG5cdHZhciBjdXJyZW50Q3VsbEZhY2UgPSBudWxsO1xuXG5cdHZhciBjdXJyZW50TGluZVdpZHRoID0gbnVsbDtcblxuXHR2YXIgY3VycmVudFBvbHlnb25PZmZzZXRGYWN0b3IgPSBudWxsO1xuXHR2YXIgY3VycmVudFBvbHlnb25PZmZzZXRVbml0cyA9IG51bGw7XG5cblx0dmFyIG1heFRleHR1cmVzID0gZ2wuZ2V0UGFyYW1ldGVyKCBnbC5NQVhfQ09NQklORURfVEVYVFVSRV9JTUFHRV9VTklUUyApO1xuXG5cdHZhciBsaW5lV2lkdGhBdmFpbGFibGUgPSBmYWxzZTtcblx0dmFyIHZlcnNpb24gPSAwO1xuXHR2YXIgZ2xWZXJzaW9uID0gZ2wuZ2V0UGFyYW1ldGVyKCBnbC5WRVJTSU9OICk7XG5cblx0aWYgKCBnbFZlcnNpb24uaW5kZXhPZiggJ1dlYkdMJyApICE9PSAtIDEgKSB7XG5cblx0XHR2ZXJzaW9uID0gcGFyc2VGbG9hdCggL15XZWJHTFxcIChbMC05XSkvLmV4ZWMoIGdsVmVyc2lvbiApWyAxIF0gKTtcblx0XHRsaW5lV2lkdGhBdmFpbGFibGUgPSAoIHZlcnNpb24gPj0gMS4wICk7XG5cblx0fSBlbHNlIGlmICggZ2xWZXJzaW9uLmluZGV4T2YoICdPcGVuR0wgRVMnICkgIT09IC0gMSApIHtcblxuXHRcdHZlcnNpb24gPSBwYXJzZUZsb2F0KCAvXk9wZW5HTFxcIEVTXFwgKFswLTldKS8uZXhlYyggZ2xWZXJzaW9uIClbIDEgXSApO1xuXHRcdGxpbmVXaWR0aEF2YWlsYWJsZSA9ICggdmVyc2lvbiA+PSAyLjAgKTtcblxuXHR9XG5cblx0dmFyIGN1cnJlbnRUZXh0dXJlU2xvdCA9IG51bGw7XG5cdHZhciBjdXJyZW50Qm91bmRUZXh0dXJlcyA9IHt9O1xuXG5cdHZhciBjdXJyZW50U2Npc3NvciA9IG5ldyBWZWN0b3I0KCk7XG5cdHZhciBjdXJyZW50Vmlld3BvcnQgPSBuZXcgVmVjdG9yNCgpO1xuXG5cdGZ1bmN0aW9uIGNyZWF0ZVRleHR1cmUoIHR5cGUsIHRhcmdldCwgY291bnQgKSB7XG5cblx0XHR2YXIgZGF0YSA9IG5ldyBVaW50OEFycmF5KCA0ICk7IC8vIDQgaXMgcmVxdWlyZWQgdG8gbWF0Y2ggZGVmYXVsdCB1bnBhY2sgYWxpZ25tZW50IG9mIDQuXG5cdFx0dmFyIHRleHR1cmUgPSBnbC5jcmVhdGVUZXh0dXJlKCk7XG5cblx0XHRnbC5iaW5kVGV4dHVyZSggdHlwZSwgdGV4dHVyZSApO1xuXHRcdGdsLnRleFBhcmFtZXRlcmkoIHR5cGUsIGdsLlRFWFRVUkVfTUlOX0ZJTFRFUiwgZ2wuTkVBUkVTVCApO1xuXHRcdGdsLnRleFBhcmFtZXRlcmkoIHR5cGUsIGdsLlRFWFRVUkVfTUFHX0ZJTFRFUiwgZ2wuTkVBUkVTVCApO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgY291bnQ7IGkgKysgKSB7XG5cblx0XHRcdGdsLnRleEltYWdlMkQoIHRhcmdldCArIGksIDAsIGdsLlJHQkEsIDEsIDEsIDAsIGdsLlJHQkEsIGdsLlVOU0lHTkVEX0JZVEUsIGRhdGEgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0ZXh0dXJlO1xuXG5cdH1cblxuXHR2YXIgZW1wdHlUZXh0dXJlcyA9IHt9O1xuXHRlbXB0eVRleHR1cmVzWyBnbC5URVhUVVJFXzJEIF0gPSBjcmVhdGVUZXh0dXJlKCBnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFXzJELCAxICk7XG5cdGVtcHR5VGV4dHVyZXNbIGdsLlRFWFRVUkVfQ1VCRV9NQVAgXSA9IGNyZWF0ZVRleHR1cmUoIGdsLlRFWFRVUkVfQ1VCRV9NQVAsIGdsLlRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCwgNiApO1xuXG5cdC8vIGluaXRcblxuXHRjb2xvckJ1ZmZlci5zZXRDbGVhciggMCwgMCwgMCwgMSApO1xuXHRkZXB0aEJ1ZmZlci5zZXRDbGVhciggMSApO1xuXHRzdGVuY2lsQnVmZmVyLnNldENsZWFyKCAwICk7XG5cblx0ZW5hYmxlKCBnbC5ERVBUSF9URVNUICk7XG5cdGRlcHRoQnVmZmVyLnNldEZ1bmMoIExlc3NFcXVhbERlcHRoICk7XG5cblx0c2V0RmxpcFNpZGVkKCBmYWxzZSApO1xuXHRzZXRDdWxsRmFjZSggQ3VsbEZhY2VCYWNrICk7XG5cdGVuYWJsZSggZ2wuQ1VMTF9GQUNFICk7XG5cblx0ZW5hYmxlKCBnbC5CTEVORCApO1xuXHRzZXRCbGVuZGluZyggTm9ybWFsQmxlbmRpbmcgKTtcblxuXHQvL1xuXG5cdGZ1bmN0aW9uIGluaXRBdHRyaWJ1dGVzKCkge1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gbmV3QXR0cmlidXRlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRuZXdBdHRyaWJ1dGVzWyBpIF0gPSAwO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBlbmFibGVBdHRyaWJ1dGUoIGF0dHJpYnV0ZSApIHtcblxuXHRcdG5ld0F0dHJpYnV0ZXNbIGF0dHJpYnV0ZSBdID0gMTtcblxuXHRcdGlmICggZW5hYmxlZEF0dHJpYnV0ZXNbIGF0dHJpYnV0ZSBdID09PSAwICkge1xuXG5cdFx0XHRnbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSggYXR0cmlidXRlICk7XG5cdFx0XHRlbmFibGVkQXR0cmlidXRlc1sgYXR0cmlidXRlIF0gPSAxO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBhdHRyaWJ1dGVEaXZpc29yc1sgYXR0cmlidXRlIF0gIT09IDAgKSB7XG5cblx0XHRcdHZhciBleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ0FOR0xFX2luc3RhbmNlZF9hcnJheXMnICk7XG5cblx0XHRcdGV4dGVuc2lvbi52ZXJ0ZXhBdHRyaWJEaXZpc29yQU5HTEUoIGF0dHJpYnV0ZSwgMCApO1xuXHRcdFx0YXR0cmlidXRlRGl2aXNvcnNbIGF0dHJpYnV0ZSBdID0gMDtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gZW5hYmxlQXR0cmlidXRlQW5kRGl2aXNvciggYXR0cmlidXRlLCBtZXNoUGVyQXR0cmlidXRlICkge1xuXG5cdFx0bmV3QXR0cmlidXRlc1sgYXR0cmlidXRlIF0gPSAxO1xuXG5cdFx0aWYgKCBlbmFibGVkQXR0cmlidXRlc1sgYXR0cmlidXRlIF0gPT09IDAgKSB7XG5cblx0XHRcdGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KCBhdHRyaWJ1dGUgKTtcblx0XHRcdGVuYWJsZWRBdHRyaWJ1dGVzWyBhdHRyaWJ1dGUgXSA9IDE7XG5cblx0XHR9XG5cblx0XHRpZiAoIGF0dHJpYnV0ZURpdmlzb3JzWyBhdHRyaWJ1dGUgXSAhPT0gbWVzaFBlckF0dHJpYnV0ZSApIHtcblxuXHRcdFx0dmFyIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCAnQU5HTEVfaW5zdGFuY2VkX2FycmF5cycgKTtcblxuXHRcdFx0ZXh0ZW5zaW9uLnZlcnRleEF0dHJpYkRpdmlzb3JBTkdMRSggYXR0cmlidXRlLCBtZXNoUGVyQXR0cmlidXRlICk7XG5cdFx0XHRhdHRyaWJ1dGVEaXZpc29yc1sgYXR0cmlidXRlIF0gPSBtZXNoUGVyQXR0cmlidXRlO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBkaXNhYmxlVW51c2VkQXR0cmlidXRlcygpIHtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGVuYWJsZWRBdHRyaWJ1dGVzLmxlbmd0aDsgaSAhPT0gbDsgKysgaSApIHtcblxuXHRcdFx0aWYgKCBlbmFibGVkQXR0cmlidXRlc1sgaSBdICE9PSBuZXdBdHRyaWJ1dGVzWyBpIF0gKSB7XG5cblx0XHRcdFx0Z2wuZGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KCBpICk7XG5cdFx0XHRcdGVuYWJsZWRBdHRyaWJ1dGVzWyBpIF0gPSAwO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGVuYWJsZSggaWQgKSB7XG5cblx0XHRpZiAoIGNhcGFiaWxpdGllc1sgaWQgXSAhPT0gdHJ1ZSApIHtcblxuXHRcdFx0Z2wuZW5hYmxlKCBpZCApO1xuXHRcdFx0Y2FwYWJpbGl0aWVzWyBpZCBdID0gdHJ1ZTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gZGlzYWJsZSggaWQgKSB7XG5cblx0XHRpZiAoIGNhcGFiaWxpdGllc1sgaWQgXSAhPT0gZmFsc2UgKSB7XG5cblx0XHRcdGdsLmRpc2FibGUoIGlkICk7XG5cdFx0XHRjYXBhYmlsaXRpZXNbIGlkIF0gPSBmYWxzZTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gZ2V0Q29tcHJlc3NlZFRleHR1cmVGb3JtYXRzKCkge1xuXG5cdFx0aWYgKCBjb21wcmVzc2VkVGV4dHVyZUZvcm1hdHMgPT09IG51bGwgKSB7XG5cblx0XHRcdGNvbXByZXNzZWRUZXh0dXJlRm9ybWF0cyA9IFtdO1xuXG5cdFx0XHRpZiAoIGV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjJyApIHx8XG5cdFx0XHQgICAgIGV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGMnICkgfHxcblx0XHRcdCAgICAgZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfZXRjMScgKSB8fFxuXHRcdFx0ICAgICBleHRlbnNpb25zLmdldCggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9hc3RjJyApICkge1xuXG5cdFx0XHRcdHZhciBmb3JtYXRzID0gZ2wuZ2V0UGFyYW1ldGVyKCBnbC5DT01QUkVTU0VEX1RFWFRVUkVfRk9STUFUUyApO1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGZvcm1hdHMubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRcdFx0Y29tcHJlc3NlZFRleHR1cmVGb3JtYXRzLnB1c2goIGZvcm1hdHNbIGkgXSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNvbXByZXNzZWRUZXh0dXJlRm9ybWF0cztcblxuXHR9XG5cblx0ZnVuY3Rpb24gdXNlUHJvZ3JhbSggcHJvZ3JhbSApIHtcblxuXHRcdGlmICggY3VycmVudFByb2dyYW0gIT09IHByb2dyYW0gKSB7XG5cblx0XHRcdGdsLnVzZVByb2dyYW0oIHByb2dyYW0gKTtcblxuXHRcdFx0Y3VycmVudFByb2dyYW0gPSBwcm9ncmFtO1xuXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBmYWxzZTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gc2V0QmxlbmRpbmcoIGJsZW5kaW5nLCBibGVuZEVxdWF0aW9uLCBibGVuZFNyYywgYmxlbmREc3QsIGJsZW5kRXF1YXRpb25BbHBoYSwgYmxlbmRTcmNBbHBoYSwgYmxlbmREc3RBbHBoYSwgcHJlbXVsdGlwbGllZEFscGhhICkge1xuXG5cdFx0aWYgKCBibGVuZGluZyAhPT0gTm9CbGVuZGluZyApIHtcblxuXHRcdFx0ZW5hYmxlKCBnbC5CTEVORCApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0ZGlzYWJsZSggZ2wuQkxFTkQgKTtcblxuXHRcdH1cblxuXHRcdGlmICggYmxlbmRpbmcgIT09IEN1c3RvbUJsZW5kaW5nICkge1xuXG5cdFx0XHRpZiAoIGJsZW5kaW5nICE9PSBjdXJyZW50QmxlbmRpbmcgfHwgcHJlbXVsdGlwbGllZEFscGhhICE9PSBjdXJyZW50UHJlbXVsdGlwbGVkQWxwaGEgKSB7XG5cblx0XHRcdFx0c3dpdGNoICggYmxlbmRpbmcgKSB7XG5cblx0XHRcdFx0XHRjYXNlIEFkZGl0aXZlQmxlbmRpbmc6XG5cblx0XHRcdFx0XHRcdGlmICggcHJlbXVsdGlwbGllZEFscGhhICkge1xuXG5cdFx0XHRcdFx0XHRcdGdsLmJsZW5kRXF1YXRpb25TZXBhcmF0ZSggZ2wuRlVOQ19BREQsIGdsLkZVTkNfQUREICk7XG5cdFx0XHRcdFx0XHRcdGdsLmJsZW5kRnVuY1NlcGFyYXRlKCBnbC5PTkUsIGdsLk9ORSwgZ2wuT05FLCBnbC5PTkUgKTtcblxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0XHRnbC5ibGVuZEVxdWF0aW9uKCBnbC5GVU5DX0FERCApO1xuXHRcdFx0XHRcdFx0XHRnbC5ibGVuZEZ1bmMoIGdsLlNSQ19BTFBIQSwgZ2wuT05FICk7XG5cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSBTdWJ0cmFjdGl2ZUJsZW5kaW5nOlxuXG5cdFx0XHRcdFx0XHRpZiAoIHByZW11bHRpcGxpZWRBbHBoYSApIHtcblxuXHRcdFx0XHRcdFx0XHRnbC5ibGVuZEVxdWF0aW9uU2VwYXJhdGUoIGdsLkZVTkNfQURELCBnbC5GVU5DX0FERCApO1xuXHRcdFx0XHRcdFx0XHRnbC5ibGVuZEZ1bmNTZXBhcmF0ZSggZ2wuWkVSTywgZ2wuWkVSTywgZ2wuT05FX01JTlVTX1NSQ19DT0xPUiwgZ2wuT05FX01JTlVTX1NSQ19BTFBIQSApO1xuXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdGdsLmJsZW5kRXF1YXRpb24oIGdsLkZVTkNfQUREICk7XG5cdFx0XHRcdFx0XHRcdGdsLmJsZW5kRnVuYyggZ2wuWkVSTywgZ2wuT05FX01JTlVTX1NSQ19DT0xPUiApO1xuXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgTXVsdGlwbHlCbGVuZGluZzpcblxuXHRcdFx0XHRcdFx0aWYgKCBwcmVtdWx0aXBsaWVkQWxwaGEgKSB7XG5cblx0XHRcdFx0XHRcdFx0Z2wuYmxlbmRFcXVhdGlvblNlcGFyYXRlKCBnbC5GVU5DX0FERCwgZ2wuRlVOQ19BREQgKTtcblx0XHRcdFx0XHRcdFx0Z2wuYmxlbmRGdW5jU2VwYXJhdGUoIGdsLlpFUk8sIGdsLlNSQ19DT0xPUiwgZ2wuWkVSTywgZ2wuU1JDX0FMUEhBICk7XG5cblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdFx0Z2wuYmxlbmRFcXVhdGlvbiggZ2wuRlVOQ19BREQgKTtcblx0XHRcdFx0XHRcdFx0Z2wuYmxlbmRGdW5jKCBnbC5aRVJPLCBnbC5TUkNfQ09MT1IgKTtcblxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRkZWZhdWx0OlxuXG5cdFx0XHRcdFx0XHRpZiAoIHByZW11bHRpcGxpZWRBbHBoYSApIHtcblxuXHRcdFx0XHRcdFx0XHRnbC5ibGVuZEVxdWF0aW9uU2VwYXJhdGUoIGdsLkZVTkNfQURELCBnbC5GVU5DX0FERCApO1xuXHRcdFx0XHRcdFx0XHRnbC5ibGVuZEZ1bmNTZXBhcmF0ZSggZ2wuT05FLCBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBLCBnbC5PTkUsIGdsLk9ORV9NSU5VU19TUkNfQUxQSEEgKTtcblxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0XHRnbC5ibGVuZEVxdWF0aW9uU2VwYXJhdGUoIGdsLkZVTkNfQURELCBnbC5GVU5DX0FERCApO1xuXHRcdFx0XHRcdFx0XHRnbC5ibGVuZEZ1bmNTZXBhcmF0ZSggZ2wuU1JDX0FMUEhBLCBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBLCBnbC5PTkUsIGdsLk9ORV9NSU5VU19TUkNfQUxQSEEgKTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRjdXJyZW50QmxlbmRFcXVhdGlvbiA9IG51bGw7XG5cdFx0XHRjdXJyZW50QmxlbmRTcmMgPSBudWxsO1xuXHRcdFx0Y3VycmVudEJsZW5kRHN0ID0gbnVsbDtcblx0XHRcdGN1cnJlbnRCbGVuZEVxdWF0aW9uQWxwaGEgPSBudWxsO1xuXHRcdFx0Y3VycmVudEJsZW5kU3JjQWxwaGEgPSBudWxsO1xuXHRcdFx0Y3VycmVudEJsZW5kRHN0QWxwaGEgPSBudWxsO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0YmxlbmRFcXVhdGlvbkFscGhhID0gYmxlbmRFcXVhdGlvbkFscGhhIHx8IGJsZW5kRXF1YXRpb247XG5cdFx0XHRibGVuZFNyY0FscGhhID0gYmxlbmRTcmNBbHBoYSB8fCBibGVuZFNyYztcblx0XHRcdGJsZW5kRHN0QWxwaGEgPSBibGVuZERzdEFscGhhIHx8IGJsZW5kRHN0O1xuXG5cdFx0XHRpZiAoIGJsZW5kRXF1YXRpb24gIT09IGN1cnJlbnRCbGVuZEVxdWF0aW9uIHx8IGJsZW5kRXF1YXRpb25BbHBoYSAhPT0gY3VycmVudEJsZW5kRXF1YXRpb25BbHBoYSApIHtcblxuXHRcdFx0XHRnbC5ibGVuZEVxdWF0aW9uU2VwYXJhdGUoIHV0aWxzLmNvbnZlcnQoIGJsZW5kRXF1YXRpb24gKSwgdXRpbHMuY29udmVydCggYmxlbmRFcXVhdGlvbkFscGhhICkgKTtcblxuXHRcdFx0XHRjdXJyZW50QmxlbmRFcXVhdGlvbiA9IGJsZW5kRXF1YXRpb247XG5cdFx0XHRcdGN1cnJlbnRCbGVuZEVxdWF0aW9uQWxwaGEgPSBibGVuZEVxdWF0aW9uQWxwaGE7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBibGVuZFNyYyAhPT0gY3VycmVudEJsZW5kU3JjIHx8IGJsZW5kRHN0ICE9PSBjdXJyZW50QmxlbmREc3QgfHwgYmxlbmRTcmNBbHBoYSAhPT0gY3VycmVudEJsZW5kU3JjQWxwaGEgfHwgYmxlbmREc3RBbHBoYSAhPT0gY3VycmVudEJsZW5kRHN0QWxwaGEgKSB7XG5cblx0XHRcdFx0Z2wuYmxlbmRGdW5jU2VwYXJhdGUoIHV0aWxzLmNvbnZlcnQoIGJsZW5kU3JjICksIHV0aWxzLmNvbnZlcnQoIGJsZW5kRHN0ICksIHV0aWxzLmNvbnZlcnQoIGJsZW5kU3JjQWxwaGEgKSwgdXRpbHMuY29udmVydCggYmxlbmREc3RBbHBoYSApICk7XG5cblx0XHRcdFx0Y3VycmVudEJsZW5kU3JjID0gYmxlbmRTcmM7XG5cdFx0XHRcdGN1cnJlbnRCbGVuZERzdCA9IGJsZW5kRHN0O1xuXHRcdFx0XHRjdXJyZW50QmxlbmRTcmNBbHBoYSA9IGJsZW5kU3JjQWxwaGE7XG5cdFx0XHRcdGN1cnJlbnRCbGVuZERzdEFscGhhID0gYmxlbmREc3RBbHBoYTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Y3VycmVudEJsZW5kaW5nID0gYmxlbmRpbmc7XG5cdFx0Y3VycmVudFByZW11bHRpcGxlZEFscGhhID0gcHJlbXVsdGlwbGllZEFscGhhO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBzZXRNYXRlcmlhbCggbWF0ZXJpYWwsIGZyb250RmFjZUNXICkge1xuXG5cdFx0bWF0ZXJpYWwuc2lkZSA9PT0gRG91YmxlU2lkZVxuXHRcdFx0PyBkaXNhYmxlKCBnbC5DVUxMX0ZBQ0UgKVxuXHRcdFx0OiBlbmFibGUoIGdsLkNVTExfRkFDRSApO1xuXG5cdFx0dmFyIGZsaXBTaWRlZCA9ICggbWF0ZXJpYWwuc2lkZSA9PT0gQmFja1NpZGUgKTtcblx0XHRpZiAoIGZyb250RmFjZUNXICkgZmxpcFNpZGVkID0gISBmbGlwU2lkZWQ7XG5cblx0XHRzZXRGbGlwU2lkZWQoIGZsaXBTaWRlZCApO1xuXG5cdFx0bWF0ZXJpYWwudHJhbnNwYXJlbnQgPT09IHRydWVcblx0XHRcdD8gc2V0QmxlbmRpbmcoIG1hdGVyaWFsLmJsZW5kaW5nLCBtYXRlcmlhbC5ibGVuZEVxdWF0aW9uLCBtYXRlcmlhbC5ibGVuZFNyYywgbWF0ZXJpYWwuYmxlbmREc3QsIG1hdGVyaWFsLmJsZW5kRXF1YXRpb25BbHBoYSwgbWF0ZXJpYWwuYmxlbmRTcmNBbHBoYSwgbWF0ZXJpYWwuYmxlbmREc3RBbHBoYSwgbWF0ZXJpYWwucHJlbXVsdGlwbGllZEFscGhhIClcblx0XHRcdDogc2V0QmxlbmRpbmcoIE5vQmxlbmRpbmcgKTtcblxuXHRcdGRlcHRoQnVmZmVyLnNldEZ1bmMoIG1hdGVyaWFsLmRlcHRoRnVuYyApO1xuXHRcdGRlcHRoQnVmZmVyLnNldFRlc3QoIG1hdGVyaWFsLmRlcHRoVGVzdCApO1xuXHRcdGRlcHRoQnVmZmVyLnNldE1hc2soIG1hdGVyaWFsLmRlcHRoV3JpdGUgKTtcblx0XHRjb2xvckJ1ZmZlci5zZXRNYXNrKCBtYXRlcmlhbC5jb2xvcldyaXRlICk7XG5cblx0XHRzZXRQb2x5Z29uT2Zmc2V0KCBtYXRlcmlhbC5wb2x5Z29uT2Zmc2V0LCBtYXRlcmlhbC5wb2x5Z29uT2Zmc2V0RmFjdG9yLCBtYXRlcmlhbC5wb2x5Z29uT2Zmc2V0VW5pdHMgKTtcblxuXHR9XG5cblx0Ly9cblxuXHRmdW5jdGlvbiBzZXRGbGlwU2lkZWQoIGZsaXBTaWRlZCApIHtcblxuXHRcdGlmICggY3VycmVudEZsaXBTaWRlZCAhPT0gZmxpcFNpZGVkICkge1xuXG5cdFx0XHRpZiAoIGZsaXBTaWRlZCApIHtcblxuXHRcdFx0XHRnbC5mcm9udEZhY2UoIGdsLkNXICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Z2wuZnJvbnRGYWNlKCBnbC5DQ1cgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRjdXJyZW50RmxpcFNpZGVkID0gZmxpcFNpZGVkO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBzZXRDdWxsRmFjZSggY3VsbEZhY2UgKSB7XG5cblx0XHRpZiAoIGN1bGxGYWNlICE9PSBDdWxsRmFjZU5vbmUgKSB7XG5cblx0XHRcdGVuYWJsZSggZ2wuQ1VMTF9GQUNFICk7XG5cblx0XHRcdGlmICggY3VsbEZhY2UgIT09IGN1cnJlbnRDdWxsRmFjZSApIHtcblxuXHRcdFx0XHRpZiAoIGN1bGxGYWNlID09PSBDdWxsRmFjZUJhY2sgKSB7XG5cblx0XHRcdFx0XHRnbC5jdWxsRmFjZSggZ2wuQkFDSyApO1xuXG5cdFx0XHRcdH0gZWxzZSBpZiAoIGN1bGxGYWNlID09PSBDdWxsRmFjZUZyb250ICkge1xuXG5cdFx0XHRcdFx0Z2wuY3VsbEZhY2UoIGdsLkZST05UICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGdsLmN1bGxGYWNlKCBnbC5GUk9OVF9BTkRfQkFDSyApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0ZGlzYWJsZSggZ2wuQ1VMTF9GQUNFICk7XG5cblx0XHR9XG5cblx0XHRjdXJyZW50Q3VsbEZhY2UgPSBjdWxsRmFjZTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gc2V0TGluZVdpZHRoKCB3aWR0aCApIHtcblxuXHRcdGlmICggd2lkdGggIT09IGN1cnJlbnRMaW5lV2lkdGggKSB7XG5cblx0XHRcdGlmICggbGluZVdpZHRoQXZhaWxhYmxlICkgZ2wubGluZVdpZHRoKCB3aWR0aCApO1xuXG5cdFx0XHRjdXJyZW50TGluZVdpZHRoID0gd2lkdGg7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHNldFBvbHlnb25PZmZzZXQoIHBvbHlnb25PZmZzZXQsIGZhY3RvciwgdW5pdHMgKSB7XG5cblx0XHRpZiAoIHBvbHlnb25PZmZzZXQgKSB7XG5cblx0XHRcdGVuYWJsZSggZ2wuUE9MWUdPTl9PRkZTRVRfRklMTCApO1xuXG5cdFx0XHRpZiAoIGN1cnJlbnRQb2x5Z29uT2Zmc2V0RmFjdG9yICE9PSBmYWN0b3IgfHwgY3VycmVudFBvbHlnb25PZmZzZXRVbml0cyAhPT0gdW5pdHMgKSB7XG5cblx0XHRcdFx0Z2wucG9seWdvbk9mZnNldCggZmFjdG9yLCB1bml0cyApO1xuXG5cdFx0XHRcdGN1cnJlbnRQb2x5Z29uT2Zmc2V0RmFjdG9yID0gZmFjdG9yO1xuXHRcdFx0XHRjdXJyZW50UG9seWdvbk9mZnNldFVuaXRzID0gdW5pdHM7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGRpc2FibGUoIGdsLlBPTFlHT05fT0ZGU0VUX0ZJTEwgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gc2V0U2Npc3NvclRlc3QoIHNjaXNzb3JUZXN0ICkge1xuXG5cdFx0aWYgKCBzY2lzc29yVGVzdCApIHtcblxuXHRcdFx0ZW5hYmxlKCBnbC5TQ0lTU09SX1RFU1QgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGRpc2FibGUoIGdsLlNDSVNTT1JfVEVTVCApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHQvLyB0ZXh0dXJlXG5cblx0ZnVuY3Rpb24gYWN0aXZlVGV4dHVyZSggd2ViZ2xTbG90ICkge1xuXG5cdFx0aWYgKCB3ZWJnbFNsb3QgPT09IHVuZGVmaW5lZCApIHdlYmdsU2xvdCA9IGdsLlRFWFRVUkUwICsgbWF4VGV4dHVyZXMgLSAxO1xuXG5cdFx0aWYgKCBjdXJyZW50VGV4dHVyZVNsb3QgIT09IHdlYmdsU2xvdCApIHtcblxuXHRcdFx0Z2wuYWN0aXZlVGV4dHVyZSggd2ViZ2xTbG90ICk7XG5cdFx0XHRjdXJyZW50VGV4dHVyZVNsb3QgPSB3ZWJnbFNsb3Q7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGJpbmRUZXh0dXJlKCB3ZWJnbFR5cGUsIHdlYmdsVGV4dHVyZSApIHtcblxuXHRcdGlmICggY3VycmVudFRleHR1cmVTbG90ID09PSBudWxsICkge1xuXG5cdFx0XHRhY3RpdmVUZXh0dXJlKCk7XG5cblx0XHR9XG5cblx0XHR2YXIgYm91bmRUZXh0dXJlID0gY3VycmVudEJvdW5kVGV4dHVyZXNbIGN1cnJlbnRUZXh0dXJlU2xvdCBdO1xuXG5cdFx0aWYgKCBib3VuZFRleHR1cmUgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Ym91bmRUZXh0dXJlID0geyB0eXBlOiB1bmRlZmluZWQsIHRleHR1cmU6IHVuZGVmaW5lZCB9O1xuXHRcdFx0Y3VycmVudEJvdW5kVGV4dHVyZXNbIGN1cnJlbnRUZXh0dXJlU2xvdCBdID0gYm91bmRUZXh0dXJlO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBib3VuZFRleHR1cmUudHlwZSAhPT0gd2ViZ2xUeXBlIHx8IGJvdW5kVGV4dHVyZS50ZXh0dXJlICE9PSB3ZWJnbFRleHR1cmUgKSB7XG5cblx0XHRcdGdsLmJpbmRUZXh0dXJlKCB3ZWJnbFR5cGUsIHdlYmdsVGV4dHVyZSB8fCBlbXB0eVRleHR1cmVzWyB3ZWJnbFR5cGUgXSApO1xuXG5cdFx0XHRib3VuZFRleHR1cmUudHlwZSA9IHdlYmdsVHlwZTtcblx0XHRcdGJvdW5kVGV4dHVyZS50ZXh0dXJlID0gd2ViZ2xUZXh0dXJlO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBjb21wcmVzc2VkVGV4SW1hZ2UyRCgpIHtcblxuXHRcdHRyeSB7XG5cblx0XHRcdGdsLmNvbXByZXNzZWRUZXhJbWFnZTJELmFwcGx5KCBnbCwgYXJndW1lbnRzICk7XG5cblx0XHR9IGNhdGNoICggZXJyb3IgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTFN0YXRlOicsIGVycm9yICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHRleEltYWdlMkQoKSB7XG5cblx0XHR0cnkge1xuXG5cdFx0XHRnbC50ZXhJbWFnZTJELmFwcGx5KCBnbCwgYXJndW1lbnRzICk7XG5cblx0XHR9IGNhdGNoICggZXJyb3IgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTFN0YXRlOicsIGVycm9yICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vXG5cblx0ZnVuY3Rpb24gc2Npc3Nvciggc2Npc3NvciApIHtcblxuXHRcdGlmICggY3VycmVudFNjaXNzb3IuZXF1YWxzKCBzY2lzc29yICkgPT09IGZhbHNlICkge1xuXG5cdFx0XHRnbC5zY2lzc29yKCBzY2lzc29yLngsIHNjaXNzb3IueSwgc2Npc3Nvci56LCBzY2lzc29yLncgKTtcblx0XHRcdGN1cnJlbnRTY2lzc29yLmNvcHkoIHNjaXNzb3IgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gdmlld3BvcnQoIHZpZXdwb3J0ICkge1xuXG5cdFx0aWYgKCBjdXJyZW50Vmlld3BvcnQuZXF1YWxzKCB2aWV3cG9ydCApID09PSBmYWxzZSApIHtcblxuXHRcdFx0Z2wudmlld3BvcnQoIHZpZXdwb3J0LngsIHZpZXdwb3J0LnksIHZpZXdwb3J0LnosIHZpZXdwb3J0LncgKTtcblx0XHRcdGN1cnJlbnRWaWV3cG9ydC5jb3B5KCB2aWV3cG9ydCApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHQvL1xuXG5cdGZ1bmN0aW9uIHJlc2V0KCkge1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgZW5hYmxlZEF0dHJpYnV0ZXMubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRpZiAoIGVuYWJsZWRBdHRyaWJ1dGVzWyBpIF0gPT09IDEgKSB7XG5cblx0XHRcdFx0Z2wuZGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KCBpICk7XG5cdFx0XHRcdGVuYWJsZWRBdHRyaWJ1dGVzWyBpIF0gPSAwO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRjYXBhYmlsaXRpZXMgPSB7fTtcblxuXHRcdGNvbXByZXNzZWRUZXh0dXJlRm9ybWF0cyA9IG51bGw7XG5cblx0XHRjdXJyZW50VGV4dHVyZVNsb3QgPSBudWxsO1xuXHRcdGN1cnJlbnRCb3VuZFRleHR1cmVzID0ge307XG5cblx0XHRjdXJyZW50UHJvZ3JhbSA9IG51bGw7XG5cblx0XHRjdXJyZW50QmxlbmRpbmcgPSBudWxsO1xuXG5cdFx0Y3VycmVudEZsaXBTaWRlZCA9IG51bGw7XG5cdFx0Y3VycmVudEN1bGxGYWNlID0gbnVsbDtcblxuXHRcdGNvbG9yQnVmZmVyLnJlc2V0KCk7XG5cdFx0ZGVwdGhCdWZmZXIucmVzZXQoKTtcblx0XHRzdGVuY2lsQnVmZmVyLnJlc2V0KCk7XG5cblx0fVxuXG5cdHJldHVybiB7XG5cblx0XHRidWZmZXJzOiB7XG5cdFx0XHRjb2xvcjogY29sb3JCdWZmZXIsXG5cdFx0XHRkZXB0aDogZGVwdGhCdWZmZXIsXG5cdFx0XHRzdGVuY2lsOiBzdGVuY2lsQnVmZmVyXG5cdFx0fSxcblxuXHRcdGluaXRBdHRyaWJ1dGVzOiBpbml0QXR0cmlidXRlcyxcblx0XHRlbmFibGVBdHRyaWJ1dGU6IGVuYWJsZUF0dHJpYnV0ZSxcblx0XHRlbmFibGVBdHRyaWJ1dGVBbmREaXZpc29yOiBlbmFibGVBdHRyaWJ1dGVBbmREaXZpc29yLFxuXHRcdGRpc2FibGVVbnVzZWRBdHRyaWJ1dGVzOiBkaXNhYmxlVW51c2VkQXR0cmlidXRlcyxcblx0XHRlbmFibGU6IGVuYWJsZSxcblx0XHRkaXNhYmxlOiBkaXNhYmxlLFxuXHRcdGdldENvbXByZXNzZWRUZXh0dXJlRm9ybWF0czogZ2V0Q29tcHJlc3NlZFRleHR1cmVGb3JtYXRzLFxuXG5cdFx0dXNlUHJvZ3JhbTogdXNlUHJvZ3JhbSxcblxuXHRcdHNldEJsZW5kaW5nOiBzZXRCbGVuZGluZyxcblx0XHRzZXRNYXRlcmlhbDogc2V0TWF0ZXJpYWwsXG5cblx0XHRzZXRGbGlwU2lkZWQ6IHNldEZsaXBTaWRlZCxcblx0XHRzZXRDdWxsRmFjZTogc2V0Q3VsbEZhY2UsXG5cblx0XHRzZXRMaW5lV2lkdGg6IHNldExpbmVXaWR0aCxcblx0XHRzZXRQb2x5Z29uT2Zmc2V0OiBzZXRQb2x5Z29uT2Zmc2V0LFxuXG5cdFx0c2V0U2Npc3NvclRlc3Q6IHNldFNjaXNzb3JUZXN0LFxuXG5cdFx0YWN0aXZlVGV4dHVyZTogYWN0aXZlVGV4dHVyZSxcblx0XHRiaW5kVGV4dHVyZTogYmluZFRleHR1cmUsXG5cdFx0Y29tcHJlc3NlZFRleEltYWdlMkQ6IGNvbXByZXNzZWRUZXhJbWFnZTJELFxuXHRcdHRleEltYWdlMkQ6IHRleEltYWdlMkQsXG5cblx0XHRzY2lzc29yOiBzY2lzc29yLFxuXHRcdHZpZXdwb3J0OiB2aWV3cG9ydCxcblxuXHRcdHJlc2V0OiByZXNldFxuXG5cdH07XG5cbn1cblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIFdlYkdMVGV4dHVyZXMoIF9nbCwgZXh0ZW5zaW9ucywgc3RhdGUsIHByb3BlcnRpZXMsIGNhcGFiaWxpdGllcywgdXRpbHMsIGluZm8gKSB7XG5cblx0dmFyIF9pc1dlYkdMMiA9ICggdHlwZW9mIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQgIT09ICd1bmRlZmluZWQnICYmIF9nbCBpbnN0YW5jZW9mIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQgKTsgLyogZ2xvYmFsIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQgKi9cblx0dmFyIF92aWRlb1RleHR1cmVzID0ge307XG5cdHZhciBfY2FudmFzO1xuXG5cdC8vXG5cblx0ZnVuY3Rpb24gY2xhbXBUb01heFNpemUoIGltYWdlLCBtYXhTaXplICkge1xuXG5cdFx0aWYgKCBpbWFnZS53aWR0aCA+IG1heFNpemUgfHwgaW1hZ2UuaGVpZ2h0ID4gbWF4U2l6ZSApIHtcblxuXHRcdFx0aWYgKCAnZGF0YScgaW4gaW1hZ2UgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogaW1hZ2UgaW4gRGF0YVRleHR1cmUgaXMgdG9vIGJpZyAoJyArIGltYWdlLndpZHRoICsgJ3gnICsgaW1hZ2UuaGVpZ2h0ICsgJykuJyApO1xuXHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gV2FybmluZzogU2NhbGluZyB0aHJvdWdoIHRoZSBjYW52YXMgd2lsbCBvbmx5IHdvcmsgd2l0aCBpbWFnZXMgdGhhdCB1c2Vcblx0XHRcdC8vIHByZW11bHRpcGxpZWQgYWxwaGEuXG5cblx0XHRcdHZhciBzY2FsZSA9IG1heFNpemUgLyBNYXRoLm1heCggaW1hZ2Uud2lkdGgsIGltYWdlLmhlaWdodCApO1xuXG5cdFx0XHR2YXIgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCcsICdjYW52YXMnICk7XG5cdFx0XHRjYW52YXMud2lkdGggPSBNYXRoLmZsb29yKCBpbWFnZS53aWR0aCAqIHNjYWxlICk7XG5cdFx0XHRjYW52YXMuaGVpZ2h0ID0gTWF0aC5mbG9vciggaW1hZ2UuaGVpZ2h0ICogc2NhbGUgKTtcblxuXHRcdFx0dmFyIGNvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dCggJzJkJyApO1xuXHRcdFx0Y29udGV4dC5kcmF3SW1hZ2UoIGltYWdlLCAwLCAwLCBpbWFnZS53aWR0aCwgaW1hZ2UuaGVpZ2h0LCAwLCAwLCBjYW52YXMud2lkdGgsIGNhbnZhcy5oZWlnaHQgKTtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogaW1hZ2UgaXMgdG9vIGJpZyAoJyArIGltYWdlLndpZHRoICsgJ3gnICsgaW1hZ2UuaGVpZ2h0ICsgJykuIFJlc2l6ZWQgdG8gJyArIGNhbnZhcy53aWR0aCArICd4JyArIGNhbnZhcy5oZWlnaHQsIGltYWdlICk7XG5cblx0XHRcdHJldHVybiBjYW52YXM7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gaW1hZ2U7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGlzUG93ZXJPZlR3byggaW1hZ2UgKSB7XG5cblx0XHRyZXR1cm4gX01hdGguaXNQb3dlck9mVHdvKCBpbWFnZS53aWR0aCApICYmIF9NYXRoLmlzUG93ZXJPZlR3byggaW1hZ2UuaGVpZ2h0ICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIG1ha2VQb3dlck9mVHdvKCBpbWFnZSApIHtcblxuXHRcdGlmICggaW1hZ2UgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50IHx8IGltYWdlIGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnQgfHwgaW1hZ2UgaW5zdGFuY2VvZiBJbWFnZUJpdG1hcCApIHtcblxuXHRcdFx0aWYgKCBfY2FudmFzID09PSB1bmRlZmluZWQgKSBfY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCcsICdjYW52YXMnICk7XG5cblx0XHRcdF9jYW52YXMud2lkdGggPSBfTWF0aC5mbG9vclBvd2VyT2ZUd28oIGltYWdlLndpZHRoICk7XG5cdFx0XHRfY2FudmFzLmhlaWdodCA9IF9NYXRoLmZsb29yUG93ZXJPZlR3byggaW1hZ2UuaGVpZ2h0ICk7XG5cblx0XHRcdHZhciBjb250ZXh0ID0gX2NhbnZhcy5nZXRDb250ZXh0KCAnMmQnICk7XG5cdFx0XHRjb250ZXh0LmRyYXdJbWFnZSggaW1hZ2UsIDAsIDAsIF9jYW52YXMud2lkdGgsIF9jYW52YXMuaGVpZ2h0ICk7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IGltYWdlIGlzIG5vdCBwb3dlciBvZiB0d28gKCcgKyBpbWFnZS53aWR0aCArICd4JyArIGltYWdlLmhlaWdodCArICcpLiBSZXNpemVkIHRvICcgKyBfY2FudmFzLndpZHRoICsgJ3gnICsgX2NhbnZhcy5oZWlnaHQsIGltYWdlICk7XG5cblx0XHRcdHJldHVybiBfY2FudmFzO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGltYWdlO1xuXG5cdH1cblxuXHRmdW5jdGlvbiB0ZXh0dXJlTmVlZHNQb3dlck9mVHdvKCB0ZXh0dXJlICkge1xuXG5cdFx0cmV0dXJuICggdGV4dHVyZS53cmFwUyAhPT0gQ2xhbXBUb0VkZ2VXcmFwcGluZyB8fCB0ZXh0dXJlLndyYXBUICE9PSBDbGFtcFRvRWRnZVdyYXBwaW5nICkgfHxcblx0XHRcdCggdGV4dHVyZS5taW5GaWx0ZXIgIT09IE5lYXJlc3RGaWx0ZXIgJiYgdGV4dHVyZS5taW5GaWx0ZXIgIT09IExpbmVhckZpbHRlciApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiB0ZXh0dXJlTmVlZHNHZW5lcmF0ZU1pcG1hcHMoIHRleHR1cmUsIGlzUG93ZXJPZlR3byApIHtcblxuXHRcdHJldHVybiB0ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyAmJiBpc1Bvd2VyT2ZUd28gJiZcblx0XHRcdHRleHR1cmUubWluRmlsdGVyICE9PSBOZWFyZXN0RmlsdGVyICYmIHRleHR1cmUubWluRmlsdGVyICE9PSBMaW5lYXJGaWx0ZXI7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGdlbmVyYXRlTWlwbWFwKCB0YXJnZXQsIHRleHR1cmUsIHdpZHRoLCBoZWlnaHQgKSB7XG5cblx0XHRfZ2wuZ2VuZXJhdGVNaXBtYXAoIHRhcmdldCApO1xuXG5cdFx0dmFyIHRleHR1cmVQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIHRleHR1cmUgKTtcblxuXHRcdC8vIE5vdGU6IE1hdGgubG9nKCB4ICkgKiBNYXRoLkxPRzJFIHVzZWQgaW5zdGVhZCBvZiBNYXRoLmxvZzIoIHggKSB3aGljaCBpcyBub3Qgc3VwcG9ydGVkIGJ5IElFMTFcblx0XHR0ZXh0dXJlUHJvcGVydGllcy5fX21heE1pcExldmVsID0gTWF0aC5sb2coIE1hdGgubWF4KCB3aWR0aCwgaGVpZ2h0ICkgKSAqIE1hdGguTE9HMkU7XG5cblx0fVxuXG5cdC8vIEZhbGxiYWNrIGZpbHRlcnMgZm9yIG5vbi1wb3dlci1vZi0yIHRleHR1cmVzXG5cblx0ZnVuY3Rpb24gZmlsdGVyRmFsbGJhY2soIGYgKSB7XG5cblx0XHRpZiAoIGYgPT09IE5lYXJlc3RGaWx0ZXIgfHwgZiA9PT0gTmVhcmVzdE1pcE1hcE5lYXJlc3RGaWx0ZXIgfHwgZiA9PT0gTmVhcmVzdE1pcE1hcExpbmVhckZpbHRlciApIHtcblxuXHRcdFx0cmV0dXJuIF9nbC5ORUFSRVNUO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIF9nbC5MSU5FQVI7XG5cblx0fVxuXG5cdC8vXG5cblx0ZnVuY3Rpb24gb25UZXh0dXJlRGlzcG9zZSggZXZlbnQgKSB7XG5cblx0XHR2YXIgdGV4dHVyZSA9IGV2ZW50LnRhcmdldDtcblxuXHRcdHRleHR1cmUucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ2Rpc3Bvc2UnLCBvblRleHR1cmVEaXNwb3NlICk7XG5cblx0XHRkZWFsbG9jYXRlVGV4dHVyZSggdGV4dHVyZSApO1xuXG5cdFx0aWYgKCB0ZXh0dXJlLmlzVmlkZW9UZXh0dXJlICkge1xuXG5cdFx0XHRkZWxldGUgX3ZpZGVvVGV4dHVyZXNbIHRleHR1cmUuaWQgXTtcblxuXHRcdH1cblxuXHRcdGluZm8ubWVtb3J5LnRleHR1cmVzIC0tO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBvblJlbmRlclRhcmdldERpc3Bvc2UoIGV2ZW50ICkge1xuXG5cdFx0dmFyIHJlbmRlclRhcmdldCA9IGV2ZW50LnRhcmdldDtcblxuXHRcdHJlbmRlclRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKCAnZGlzcG9zZScsIG9uUmVuZGVyVGFyZ2V0RGlzcG9zZSApO1xuXG5cdFx0ZGVhbGxvY2F0ZVJlbmRlclRhcmdldCggcmVuZGVyVGFyZ2V0ICk7XG5cblx0XHRpbmZvLm1lbW9yeS50ZXh0dXJlcyAtLTtcblxuXHR9XG5cblx0Ly9cblxuXHRmdW5jdGlvbiBkZWFsbG9jYXRlVGV4dHVyZSggdGV4dHVyZSApIHtcblxuXHRcdHZhciB0ZXh0dXJlUHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCB0ZXh0dXJlICk7XG5cblx0XHRpZiAoIHRleHR1cmUuaW1hZ2UgJiYgdGV4dHVyZVByb3BlcnRpZXMuX19pbWFnZV9fd2ViZ2xUZXh0dXJlQ3ViZSApIHtcblxuXHRcdFx0Ly8gY3ViZSB0ZXh0dXJlXG5cblx0XHRcdF9nbC5kZWxldGVUZXh0dXJlKCB0ZXh0dXJlUHJvcGVydGllcy5fX2ltYWdlX193ZWJnbFRleHR1cmVDdWJlICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyAyRCB0ZXh0dXJlXG5cblx0XHRcdGlmICggdGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbEluaXQgPT09IHVuZGVmaW5lZCApIHJldHVybjtcblxuXHRcdFx0X2dsLmRlbGV0ZVRleHR1cmUoIHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlICk7XG5cblx0XHR9XG5cblx0XHQvLyByZW1vdmUgYWxsIHdlYmdsIHByb3BlcnRpZXNcblx0XHRwcm9wZXJ0aWVzLnJlbW92ZSggdGV4dHVyZSApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBkZWFsbG9jYXRlUmVuZGVyVGFyZ2V0KCByZW5kZXJUYXJnZXQgKSB7XG5cblx0XHR2YXIgcmVuZGVyVGFyZ2V0UHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCByZW5kZXJUYXJnZXQgKTtcblx0XHR2YXIgdGV4dHVyZVByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0LnRleHR1cmUgKTtcblxuXHRcdGlmICggISByZW5kZXJUYXJnZXQgKSByZXR1cm47XG5cblx0XHRpZiAoIHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdF9nbC5kZWxldGVUZXh0dXJlKCB0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCByZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlICkge1xuXG5cdFx0XHRyZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlLmRpc3Bvc2UoKTtcblxuXHRcdH1cblxuXHRcdGlmICggcmVuZGVyVGFyZ2V0LmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlICkge1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCA2OyBpICsrICkge1xuXG5cdFx0XHRcdF9nbC5kZWxldGVGcmFtZWJ1ZmZlciggcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRnJhbWVidWZmZXJbIGkgXSApO1xuXHRcdFx0XHRpZiAoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbERlcHRoYnVmZmVyICkgX2dsLmRlbGV0ZVJlbmRlcmJ1ZmZlciggcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRGVwdGhidWZmZXJbIGkgXSApO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRfZ2wuZGVsZXRlRnJhbWVidWZmZXIoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVyICk7XG5cdFx0XHRpZiAoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbERlcHRoYnVmZmVyICkgX2dsLmRlbGV0ZVJlbmRlcmJ1ZmZlciggcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRGVwdGhidWZmZXIgKTtcblxuXHRcdH1cblxuXHRcdHByb3BlcnRpZXMucmVtb3ZlKCByZW5kZXJUYXJnZXQudGV4dHVyZSApO1xuXHRcdHByb3BlcnRpZXMucmVtb3ZlKCByZW5kZXJUYXJnZXQgKTtcblxuXHR9XG5cblx0Ly9cblxuXG5cblx0ZnVuY3Rpb24gc2V0VGV4dHVyZTJEKCB0ZXh0dXJlLCBzbG90ICkge1xuXG5cdFx0dmFyIHRleHR1cmVQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIHRleHR1cmUgKTtcblxuXHRcdGlmICggdGV4dHVyZS5pc1ZpZGVvVGV4dHVyZSApIHVwZGF0ZVZpZGVvVGV4dHVyZSggdGV4dHVyZSApO1xuXG5cdFx0aWYgKCB0ZXh0dXJlLnZlcnNpb24gPiAwICYmIHRleHR1cmVQcm9wZXJ0aWVzLl9fdmVyc2lvbiAhPT0gdGV4dHVyZS52ZXJzaW9uICkge1xuXG5cdFx0XHR2YXIgaW1hZ2UgPSB0ZXh0dXJlLmltYWdlO1xuXG5cdFx0XHRpZiAoIGltYWdlID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogVGV4dHVyZSBtYXJrZWQgZm9yIHVwZGF0ZSBidXQgaW1hZ2UgaXMgdW5kZWZpbmVkJywgdGV4dHVyZSApO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBpbWFnZS5jb21wbGV0ZSA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogVGV4dHVyZSBtYXJrZWQgZm9yIHVwZGF0ZSBidXQgaW1hZ2UgaXMgaW5jb21wbGV0ZScsIHRleHR1cmUgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHR1cGxvYWRUZXh0dXJlKCB0ZXh0dXJlUHJvcGVydGllcywgdGV4dHVyZSwgc2xvdCApO1xuXHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHN0YXRlLmFjdGl2ZVRleHR1cmUoIF9nbC5URVhUVVJFMCArIHNsb3QgKTtcblx0XHRzdGF0ZS5iaW5kVGV4dHVyZSggX2dsLlRFWFRVUkVfMkQsIHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHNldFRleHR1cmVDdWJlKCB0ZXh0dXJlLCBzbG90ICkge1xuXG5cdFx0dmFyIHRleHR1cmVQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIHRleHR1cmUgKTtcblxuXHRcdGlmICggdGV4dHVyZS5pbWFnZS5sZW5ndGggPT09IDYgKSB7XG5cblx0XHRcdGlmICggdGV4dHVyZS52ZXJzaW9uID4gMCAmJiB0ZXh0dXJlUHJvcGVydGllcy5fX3ZlcnNpb24gIT09IHRleHR1cmUudmVyc2lvbiApIHtcblxuXHRcdFx0XHRpZiAoICEgdGV4dHVyZVByb3BlcnRpZXMuX19pbWFnZV9fd2ViZ2xUZXh0dXJlQ3ViZSApIHtcblxuXHRcdFx0XHRcdHRleHR1cmUuYWRkRXZlbnRMaXN0ZW5lciggJ2Rpc3Bvc2UnLCBvblRleHR1cmVEaXNwb3NlICk7XG5cblx0XHRcdFx0XHR0ZXh0dXJlUHJvcGVydGllcy5fX2ltYWdlX193ZWJnbFRleHR1cmVDdWJlID0gX2dsLmNyZWF0ZVRleHR1cmUoKTtcblxuXHRcdFx0XHRcdGluZm8ubWVtb3J5LnRleHR1cmVzICsrO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRzdGF0ZS5hY3RpdmVUZXh0dXJlKCBfZ2wuVEVYVFVSRTAgKyBzbG90ICk7XG5cdFx0XHRcdHN0YXRlLmJpbmRUZXh0dXJlKCBfZ2wuVEVYVFVSRV9DVUJFX01BUCwgdGV4dHVyZVByb3BlcnRpZXMuX19pbWFnZV9fd2ViZ2xUZXh0dXJlQ3ViZSApO1xuXG5cdFx0XHRcdF9nbC5waXhlbFN0b3JlaSggX2dsLlVOUEFDS19GTElQX1lfV0VCR0wsIHRleHR1cmUuZmxpcFkgKTtcblxuXHRcdFx0XHR2YXIgaXNDb21wcmVzc2VkID0gKCB0ZXh0dXJlICYmIHRleHR1cmUuaXNDb21wcmVzc2VkVGV4dHVyZSApO1xuXHRcdFx0XHR2YXIgaXNEYXRhVGV4dHVyZSA9ICggdGV4dHVyZS5pbWFnZVsgMCBdICYmIHRleHR1cmUuaW1hZ2VbIDAgXS5pc0RhdGFUZXh0dXJlICk7XG5cblx0XHRcdFx0dmFyIGN1YmVJbWFnZSA9IFtdO1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IDY7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRpZiAoICEgaXNDb21wcmVzc2VkICYmICEgaXNEYXRhVGV4dHVyZSApIHtcblxuXHRcdFx0XHRcdFx0Y3ViZUltYWdlWyBpIF0gPSBjbGFtcFRvTWF4U2l6ZSggdGV4dHVyZS5pbWFnZVsgaSBdLCBjYXBhYmlsaXRpZXMubWF4Q3ViZW1hcFNpemUgKTtcblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdGN1YmVJbWFnZVsgaSBdID0gaXNEYXRhVGV4dHVyZSA/IHRleHR1cmUuaW1hZ2VbIGkgXS5pbWFnZSA6IHRleHR1cmUuaW1hZ2VbIGkgXTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dmFyIGltYWdlID0gY3ViZUltYWdlWyAwIF0sXG5cdFx0XHRcdFx0aXNQb3dlck9mVHdvSW1hZ2UgPSBpc1Bvd2VyT2ZUd28oIGltYWdlICksXG5cdFx0XHRcdFx0Z2xGb3JtYXQgPSB1dGlscy5jb252ZXJ0KCB0ZXh0dXJlLmZvcm1hdCApLFxuXHRcdFx0XHRcdGdsVHlwZSA9IHV0aWxzLmNvbnZlcnQoIHRleHR1cmUudHlwZSApO1xuXG5cdFx0XHRcdHNldFRleHR1cmVQYXJhbWV0ZXJzKCBfZ2wuVEVYVFVSRV9DVUJFX01BUCwgdGV4dHVyZSwgaXNQb3dlck9mVHdvSW1hZ2UgKTtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCA2OyBpICsrICkge1xuXG5cdFx0XHRcdFx0aWYgKCAhIGlzQ29tcHJlc3NlZCApIHtcblxuXHRcdFx0XHRcdFx0aWYgKCBpc0RhdGFUZXh0dXJlICkge1xuXG5cdFx0XHRcdFx0XHRcdHN0YXRlLnRleEltYWdlMkQoIF9nbC5URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1ggKyBpLCAwLCBnbEZvcm1hdCwgY3ViZUltYWdlWyBpIF0ud2lkdGgsIGN1YmVJbWFnZVsgaSBdLmhlaWdodCwgMCwgZ2xGb3JtYXQsIGdsVHlwZSwgY3ViZUltYWdlWyBpIF0uZGF0YSApO1xuXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdHN0YXRlLnRleEltYWdlMkQoIF9nbC5URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1ggKyBpLCAwLCBnbEZvcm1hdCwgZ2xGb3JtYXQsIGdsVHlwZSwgY3ViZUltYWdlWyBpIF0gKTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0dmFyIG1pcG1hcCwgbWlwbWFwcyA9IGN1YmVJbWFnZVsgaSBdLm1pcG1hcHM7XG5cblx0XHRcdFx0XHRcdGZvciAoIHZhciBqID0gMCwgamwgPSBtaXBtYXBzLmxlbmd0aDsgaiA8IGpsOyBqICsrICkge1xuXG5cdFx0XHRcdFx0XHRcdG1pcG1hcCA9IG1pcG1hcHNbIGogXTtcblxuXHRcdFx0XHRcdFx0XHRpZiAoIHRleHR1cmUuZm9ybWF0ICE9PSBSR0JBRm9ybWF0ICYmIHRleHR1cmUuZm9ybWF0ICE9PSBSR0JGb3JtYXQgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRpZiAoIHN0YXRlLmdldENvbXByZXNzZWRUZXh0dXJlRm9ybWF0cygpLmluZGV4T2YoIGdsRm9ybWF0ICkgPiAtIDEgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRcdHN0YXRlLmNvbXByZXNzZWRUZXhJbWFnZTJEKCBfZ2wuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YICsgaSwgaiwgZ2xGb3JtYXQsIG1pcG1hcC53aWR0aCwgbWlwbWFwLmhlaWdodCwgMCwgbWlwbWFwLmRhdGEgKTtcblxuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IEF0dGVtcHQgdG8gbG9hZCB1bnN1cHBvcnRlZCBjb21wcmVzc2VkIHRleHR1cmUgZm9ybWF0IGluIC5zZXRUZXh0dXJlQ3ViZSgpJyApO1xuXG5cdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdFx0XHRzdGF0ZS50ZXhJbWFnZTJEKCBfZ2wuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YICsgaSwgaiwgZ2xGb3JtYXQsIG1pcG1hcC53aWR0aCwgbWlwbWFwLmhlaWdodCwgMCwgZ2xGb3JtYXQsIGdsVHlwZSwgbWlwbWFwLmRhdGEgKTtcblxuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCAhIGlzQ29tcHJlc3NlZCApIHtcblxuXHRcdFx0XHRcdHRleHR1cmVQcm9wZXJ0aWVzLl9fbWF4TWlwTGV2ZWwgPSAwO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHR0ZXh0dXJlUHJvcGVydGllcy5fX21heE1pcExldmVsID0gbWlwbWFwcy5sZW5ndGggLSAxO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIHRleHR1cmVOZWVkc0dlbmVyYXRlTWlwbWFwcyggdGV4dHVyZSwgaXNQb3dlck9mVHdvSW1hZ2UgKSApIHtcblxuXHRcdFx0XHRcdC8vIFdlIGFzc3VtZSBpbWFnZXMgZm9yIGN1YmUgbWFwIGhhdmUgdGhlIHNhbWUgc2l6ZS5cblx0XHRcdFx0XHRnZW5lcmF0ZU1pcG1hcCggX2dsLlRFWFRVUkVfQ1VCRV9NQVAsIHRleHR1cmUsIGltYWdlLndpZHRoLCBpbWFnZS5oZWlnaHQgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGV4dHVyZVByb3BlcnRpZXMuX192ZXJzaW9uID0gdGV4dHVyZS52ZXJzaW9uO1xuXG5cdFx0XHRcdGlmICggdGV4dHVyZS5vblVwZGF0ZSApIHRleHR1cmUub25VcGRhdGUoIHRleHR1cmUgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRzdGF0ZS5hY3RpdmVUZXh0dXJlKCBfZ2wuVEVYVFVSRTAgKyBzbG90ICk7XG5cdFx0XHRcdHN0YXRlLmJpbmRUZXh0dXJlKCBfZ2wuVEVYVFVSRV9DVUJFX01BUCwgdGV4dHVyZVByb3BlcnRpZXMuX19pbWFnZV9fd2ViZ2xUZXh0dXJlQ3ViZSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHNldFRleHR1cmVDdWJlRHluYW1pYyggdGV4dHVyZSwgc2xvdCApIHtcblxuXHRcdHN0YXRlLmFjdGl2ZVRleHR1cmUoIF9nbC5URVhUVVJFMCArIHNsb3QgKTtcblx0XHRzdGF0ZS5iaW5kVGV4dHVyZSggX2dsLlRFWFRVUkVfQ1VCRV9NQVAsIHByb3BlcnRpZXMuZ2V0KCB0ZXh0dXJlICkuX193ZWJnbFRleHR1cmUgKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gc2V0VGV4dHVyZVBhcmFtZXRlcnMoIHRleHR1cmVUeXBlLCB0ZXh0dXJlLCBpc1Bvd2VyT2ZUd29JbWFnZSApIHtcblxuXHRcdHZhciBleHRlbnNpb247XG5cblx0XHRpZiAoIGlzUG93ZXJPZlR3b0ltYWdlICkge1xuXG5cdFx0XHRfZ2wudGV4UGFyYW1ldGVyaSggdGV4dHVyZVR5cGUsIF9nbC5URVhUVVJFX1dSQVBfUywgdXRpbHMuY29udmVydCggdGV4dHVyZS53cmFwUyApICk7XG5cdFx0XHRfZ2wudGV4UGFyYW1ldGVyaSggdGV4dHVyZVR5cGUsIF9nbC5URVhUVVJFX1dSQVBfVCwgdXRpbHMuY29udmVydCggdGV4dHVyZS53cmFwVCApICk7XG5cblx0XHRcdF9nbC50ZXhQYXJhbWV0ZXJpKCB0ZXh0dXJlVHlwZSwgX2dsLlRFWFRVUkVfTUFHX0ZJTFRFUiwgdXRpbHMuY29udmVydCggdGV4dHVyZS5tYWdGaWx0ZXIgKSApO1xuXHRcdFx0X2dsLnRleFBhcmFtZXRlcmkoIHRleHR1cmVUeXBlLCBfZ2wuVEVYVFVSRV9NSU5fRklMVEVSLCB1dGlscy5jb252ZXJ0KCB0ZXh0dXJlLm1pbkZpbHRlciApICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRfZ2wudGV4UGFyYW1ldGVyaSggdGV4dHVyZVR5cGUsIF9nbC5URVhUVVJFX1dSQVBfUywgX2dsLkNMQU1QX1RPX0VER0UgKTtcblx0XHRcdF9nbC50ZXhQYXJhbWV0ZXJpKCB0ZXh0dXJlVHlwZSwgX2dsLlRFWFRVUkVfV1JBUF9ULCBfZ2wuQ0xBTVBfVE9fRURHRSApO1xuXG5cdFx0XHRpZiAoIHRleHR1cmUud3JhcFMgIT09IENsYW1wVG9FZGdlV3JhcHBpbmcgfHwgdGV4dHVyZS53cmFwVCAhPT0gQ2xhbXBUb0VkZ2VXcmFwcGluZyApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBUZXh0dXJlIGlzIG5vdCBwb3dlciBvZiB0d28uIFRleHR1cmUud3JhcFMgYW5kIFRleHR1cmUud3JhcFQgc2hvdWxkIGJlIHNldCB0byBUSFJFRS5DbGFtcFRvRWRnZVdyYXBwaW5nLicsIHRleHR1cmUgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRfZ2wudGV4UGFyYW1ldGVyaSggdGV4dHVyZVR5cGUsIF9nbC5URVhUVVJFX01BR19GSUxURVIsIGZpbHRlckZhbGxiYWNrKCB0ZXh0dXJlLm1hZ0ZpbHRlciApICk7XG5cdFx0XHRfZ2wudGV4UGFyYW1ldGVyaSggdGV4dHVyZVR5cGUsIF9nbC5URVhUVVJFX01JTl9GSUxURVIsIGZpbHRlckZhbGxiYWNrKCB0ZXh0dXJlLm1pbkZpbHRlciApICk7XG5cblx0XHRcdGlmICggdGV4dHVyZS5taW5GaWx0ZXIgIT09IE5lYXJlc3RGaWx0ZXIgJiYgdGV4dHVyZS5taW5GaWx0ZXIgIT09IExpbmVhckZpbHRlciApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBUZXh0dXJlIGlzIG5vdCBwb3dlciBvZiB0d28uIFRleHR1cmUubWluRmlsdGVyIHNob3VsZCBiZSBzZXQgdG8gVEhSRUUuTmVhcmVzdEZpbHRlciBvciBUSFJFRS5MaW5lYXJGaWx0ZXIuJywgdGV4dHVyZSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ0VYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYycgKTtcblxuXHRcdGlmICggZXh0ZW5zaW9uICkge1xuXG5cdFx0XHRpZiAoIHRleHR1cmUudHlwZSA9PT0gRmxvYXRUeXBlICYmIGV4dGVuc2lvbnMuZ2V0KCAnT0VTX3RleHR1cmVfZmxvYXRfbGluZWFyJyApID09PSBudWxsICkgcmV0dXJuO1xuXHRcdFx0aWYgKCB0ZXh0dXJlLnR5cGUgPT09IEhhbGZGbG9hdFR5cGUgJiYgZXh0ZW5zaW9ucy5nZXQoICdPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0X2xpbmVhcicgKSA9PT0gbnVsbCApIHJldHVybjtcblxuXHRcdFx0aWYgKCB0ZXh0dXJlLmFuaXNvdHJvcHkgPiAxIHx8IHByb3BlcnRpZXMuZ2V0KCB0ZXh0dXJlICkuX19jdXJyZW50QW5pc290cm9weSApIHtcblxuXHRcdFx0XHRfZ2wudGV4UGFyYW1ldGVyZiggdGV4dHVyZVR5cGUsIGV4dGVuc2lvbi5URVhUVVJFX01BWF9BTklTT1RST1BZX0VYVCwgTWF0aC5taW4oIHRleHR1cmUuYW5pc290cm9weSwgY2FwYWJpbGl0aWVzLmdldE1heEFuaXNvdHJvcHkoKSApICk7XG5cdFx0XHRcdHByb3BlcnRpZXMuZ2V0KCB0ZXh0dXJlICkuX19jdXJyZW50QW5pc290cm9weSA9IHRleHR1cmUuYW5pc290cm9weTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiB1cGxvYWRUZXh0dXJlKCB0ZXh0dXJlUHJvcGVydGllcywgdGV4dHVyZSwgc2xvdCApIHtcblxuXHRcdGlmICggdGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbEluaXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbEluaXQgPSB0cnVlO1xuXG5cdFx0XHR0ZXh0dXJlLmFkZEV2ZW50TGlzdGVuZXIoICdkaXNwb3NlJywgb25UZXh0dXJlRGlzcG9zZSApO1xuXG5cdFx0XHR0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSA9IF9nbC5jcmVhdGVUZXh0dXJlKCk7XG5cblx0XHRcdGluZm8ubWVtb3J5LnRleHR1cmVzICsrO1xuXG5cdFx0fVxuXG5cdFx0c3RhdGUuYWN0aXZlVGV4dHVyZSggX2dsLlRFWFRVUkUwICsgc2xvdCApO1xuXHRcdHN0YXRlLmJpbmRUZXh0dXJlKCBfZ2wuVEVYVFVSRV8yRCwgdGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbFRleHR1cmUgKTtcblxuXHRcdF9nbC5waXhlbFN0b3JlaSggX2dsLlVOUEFDS19GTElQX1lfV0VCR0wsIHRleHR1cmUuZmxpcFkgKTtcblx0XHRfZ2wucGl4ZWxTdG9yZWkoIF9nbC5VTlBBQ0tfUFJFTVVMVElQTFlfQUxQSEFfV0VCR0wsIHRleHR1cmUucHJlbXVsdGlwbHlBbHBoYSApO1xuXHRcdF9nbC5waXhlbFN0b3JlaSggX2dsLlVOUEFDS19BTElHTk1FTlQsIHRleHR1cmUudW5wYWNrQWxpZ25tZW50ICk7XG5cblx0XHR2YXIgaW1hZ2UgPSBjbGFtcFRvTWF4U2l6ZSggdGV4dHVyZS5pbWFnZSwgY2FwYWJpbGl0aWVzLm1heFRleHR1cmVTaXplICk7XG5cblx0XHRpZiAoIHRleHR1cmVOZWVkc1Bvd2VyT2ZUd28oIHRleHR1cmUgKSAmJiBpc1Bvd2VyT2ZUd28oIGltYWdlICkgPT09IGZhbHNlICkge1xuXG5cdFx0XHRpbWFnZSA9IG1ha2VQb3dlck9mVHdvKCBpbWFnZSApO1xuXG5cdFx0fVxuXG5cdFx0dmFyIGlzUG93ZXJPZlR3b0ltYWdlID0gaXNQb3dlck9mVHdvKCBpbWFnZSApLFxuXHRcdFx0Z2xGb3JtYXQgPSB1dGlscy5jb252ZXJ0KCB0ZXh0dXJlLmZvcm1hdCApLFxuXHRcdFx0Z2xUeXBlID0gdXRpbHMuY29udmVydCggdGV4dHVyZS50eXBlICk7XG5cblx0XHRzZXRUZXh0dXJlUGFyYW1ldGVycyggX2dsLlRFWFRVUkVfMkQsIHRleHR1cmUsIGlzUG93ZXJPZlR3b0ltYWdlICk7XG5cblx0XHR2YXIgbWlwbWFwLCBtaXBtYXBzID0gdGV4dHVyZS5taXBtYXBzO1xuXG5cdFx0aWYgKCB0ZXh0dXJlLmlzRGVwdGhUZXh0dXJlICkge1xuXG5cdFx0XHQvLyBwb3B1bGF0ZSBkZXB0aCB0ZXh0dXJlIHdpdGggZHVtbXkgZGF0YVxuXG5cdFx0XHR2YXIgaW50ZXJuYWxGb3JtYXQgPSBfZ2wuREVQVEhfQ09NUE9ORU5UO1xuXG5cdFx0XHRpZiAoIHRleHR1cmUudHlwZSA9PT0gRmxvYXRUeXBlICkge1xuXG5cdFx0XHRcdGlmICggISBfaXNXZWJHTDIgKSB0aHJvdyBuZXcgRXJyb3IoICdGbG9hdCBEZXB0aCBUZXh0dXJlIG9ubHkgc3VwcG9ydGVkIGluIFdlYkdMMi4wJyApO1xuXHRcdFx0XHRpbnRlcm5hbEZvcm1hdCA9IF9nbC5ERVBUSF9DT01QT05FTlQzMkY7XG5cblx0XHRcdH0gZWxzZSBpZiAoIF9pc1dlYkdMMiApIHtcblxuXHRcdFx0XHQvLyBXZWJHTCAyLjAgcmVxdWlyZXMgc2lnbmVkIGludGVybmFsZm9ybWF0IGZvciBnbFRleEltYWdlMkRcblx0XHRcdFx0aW50ZXJuYWxGb3JtYXQgPSBfZ2wuREVQVEhfQ09NUE9ORU5UMTY7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCB0ZXh0dXJlLmZvcm1hdCA9PT0gRGVwdGhGb3JtYXQgJiYgaW50ZXJuYWxGb3JtYXQgPT09IF9nbC5ERVBUSF9DT01QT05FTlQgKSB7XG5cblx0XHRcdFx0Ly8gVGhlIGVycm9yIElOVkFMSURfT1BFUkFUSU9OIGlzIGdlbmVyYXRlZCBieSB0ZXhJbWFnZTJEIGlmIGZvcm1hdCBhbmQgaW50ZXJuYWxmb3JtYXQgYXJlXG5cdFx0XHRcdC8vIERFUFRIX0NPTVBPTkVOVCBhbmQgdHlwZSBpcyBub3QgVU5TSUdORURfU0hPUlQgb3IgVU5TSUdORURfSU5UXG5cdFx0XHRcdC8vIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS93ZWJnbC9leHRlbnNpb25zL1dFQkdMX2RlcHRoX3RleHR1cmUvKVxuXHRcdFx0XHRpZiAoIHRleHR1cmUudHlwZSAhPT0gVW5zaWduZWRTaG9ydFR5cGUgJiYgdGV4dHVyZS50eXBlICE9PSBVbnNpZ25lZEludFR5cGUgKSB7XG5cblx0XHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBVc2UgVW5zaWduZWRTaG9ydFR5cGUgb3IgVW5zaWduZWRJbnRUeXBlIGZvciBEZXB0aEZvcm1hdCBEZXB0aFRleHR1cmUuJyApO1xuXG5cdFx0XHRcdFx0dGV4dHVyZS50eXBlID0gVW5zaWduZWRTaG9ydFR5cGU7XG5cdFx0XHRcdFx0Z2xUeXBlID0gdXRpbHMuY29udmVydCggdGV4dHVyZS50eXBlICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdC8vIERlcHRoIHN0ZW5jaWwgdGV4dHVyZXMgbmVlZCB0aGUgREVQVEhfU1RFTkNJTCBpbnRlcm5hbCBmb3JtYXRcblx0XHRcdC8vIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS93ZWJnbC9leHRlbnNpb25zL1dFQkdMX2RlcHRoX3RleHR1cmUvKVxuXHRcdFx0aWYgKCB0ZXh0dXJlLmZvcm1hdCA9PT0gRGVwdGhTdGVuY2lsRm9ybWF0ICkge1xuXG5cdFx0XHRcdGludGVybmFsRm9ybWF0ID0gX2dsLkRFUFRIX1NURU5DSUw7XG5cblx0XHRcdFx0Ly8gVGhlIGVycm9yIElOVkFMSURfT1BFUkFUSU9OIGlzIGdlbmVyYXRlZCBieSB0ZXhJbWFnZTJEIGlmIGZvcm1hdCBhbmQgaW50ZXJuYWxmb3JtYXQgYXJlXG5cdFx0XHRcdC8vIERFUFRIX1NURU5DSUwgYW5kIHR5cGUgaXMgbm90IFVOU0lHTkVEX0lOVF8yNF84X1dFQkdMLlxuXHRcdFx0XHQvLyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvd2ViZ2wvZXh0ZW5zaW9ucy9XRUJHTF9kZXB0aF90ZXh0dXJlLylcblx0XHRcdFx0aWYgKCB0ZXh0dXJlLnR5cGUgIT09IFVuc2lnbmVkSW50MjQ4VHlwZSApIHtcblxuXHRcdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IFVzZSBVbnNpZ25lZEludDI0OFR5cGUgZm9yIERlcHRoU3RlbmNpbEZvcm1hdCBEZXB0aFRleHR1cmUuJyApO1xuXG5cdFx0XHRcdFx0dGV4dHVyZS50eXBlID0gVW5zaWduZWRJbnQyNDhUeXBlO1xuXHRcdFx0XHRcdGdsVHlwZSA9IHV0aWxzLmNvbnZlcnQoIHRleHR1cmUudHlwZSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRzdGF0ZS50ZXhJbWFnZTJEKCBfZ2wuVEVYVFVSRV8yRCwgMCwgaW50ZXJuYWxGb3JtYXQsIGltYWdlLndpZHRoLCBpbWFnZS5oZWlnaHQsIDAsIGdsRm9ybWF0LCBnbFR5cGUsIG51bGwgKTtcblxuXHRcdH0gZWxzZSBpZiAoIHRleHR1cmUuaXNEYXRhVGV4dHVyZSApIHtcblxuXHRcdFx0Ly8gdXNlIG1hbnVhbGx5IGNyZWF0ZWQgbWlwbWFwcyBpZiBhdmFpbGFibGVcblx0XHRcdC8vIGlmIHRoZXJlIGFyZSBubyBtYW51YWwgbWlwbWFwc1xuXHRcdFx0Ly8gc2V0IDAgbGV2ZWwgbWlwbWFwIGFuZCB0aGVuIHVzZSBHTCB0byBnZW5lcmF0ZSBvdGhlciBtaXBtYXAgbGV2ZWxzXG5cblx0XHRcdGlmICggbWlwbWFwcy5sZW5ndGggPiAwICYmIGlzUG93ZXJPZlR3b0ltYWdlICkge1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBtaXBtYXBzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0bWlwbWFwID0gbWlwbWFwc1sgaSBdO1xuXHRcdFx0XHRcdHN0YXRlLnRleEltYWdlMkQoIF9nbC5URVhUVVJFXzJELCBpLCBnbEZvcm1hdCwgbWlwbWFwLndpZHRoLCBtaXBtYXAuaGVpZ2h0LCAwLCBnbEZvcm1hdCwgZ2xUeXBlLCBtaXBtYXAuZGF0YSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlO1xuXHRcdFx0XHR0ZXh0dXJlUHJvcGVydGllcy5fX21heE1pcExldmVsID0gbWlwbWFwcy5sZW5ndGggLSAxO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHN0YXRlLnRleEltYWdlMkQoIF9nbC5URVhUVVJFXzJELCAwLCBnbEZvcm1hdCwgaW1hZ2Uud2lkdGgsIGltYWdlLmhlaWdodCwgMCwgZ2xGb3JtYXQsIGdsVHlwZSwgaW1hZ2UuZGF0YSApO1xuXHRcdFx0XHR0ZXh0dXJlUHJvcGVydGllcy5fX21heE1pcExldmVsID0gMDtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIGlmICggdGV4dHVyZS5pc0NvbXByZXNzZWRUZXh0dXJlICkge1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gbWlwbWFwcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHRtaXBtYXAgPSBtaXBtYXBzWyBpIF07XG5cblx0XHRcdFx0aWYgKCB0ZXh0dXJlLmZvcm1hdCAhPT0gUkdCQUZvcm1hdCAmJiB0ZXh0dXJlLmZvcm1hdCAhPT0gUkdCRm9ybWF0ICkge1xuXG5cdFx0XHRcdFx0aWYgKCBzdGF0ZS5nZXRDb21wcmVzc2VkVGV4dHVyZUZvcm1hdHMoKS5pbmRleE9mKCBnbEZvcm1hdCApID4gLSAxICkge1xuXG5cdFx0XHRcdFx0XHRzdGF0ZS5jb21wcmVzc2VkVGV4SW1hZ2UyRCggX2dsLlRFWFRVUkVfMkQsIGksIGdsRm9ybWF0LCBtaXBtYXAud2lkdGgsIG1pcG1hcC5oZWlnaHQsIDAsIG1pcG1hcC5kYXRhICk7XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBBdHRlbXB0IHRvIGxvYWQgdW5zdXBwb3J0ZWQgY29tcHJlc3NlZCB0ZXh0dXJlIGZvcm1hdCBpbiAudXBsb2FkVGV4dHVyZSgpJyApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRzdGF0ZS50ZXhJbWFnZTJEKCBfZ2wuVEVYVFVSRV8yRCwgaSwgZ2xGb3JtYXQsIG1pcG1hcC53aWR0aCwgbWlwbWFwLmhlaWdodCwgMCwgZ2xGb3JtYXQsIGdsVHlwZSwgbWlwbWFwLmRhdGEgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0dGV4dHVyZVByb3BlcnRpZXMuX19tYXhNaXBMZXZlbCA9IG1pcG1hcHMubGVuZ3RoIC0gMTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIHJlZ3VsYXIgVGV4dHVyZSAoaW1hZ2UsIHZpZGVvLCBjYW52YXMpXG5cblx0XHRcdC8vIHVzZSBtYW51YWxseSBjcmVhdGVkIG1pcG1hcHMgaWYgYXZhaWxhYmxlXG5cdFx0XHQvLyBpZiB0aGVyZSBhcmUgbm8gbWFudWFsIG1pcG1hcHNcblx0XHRcdC8vIHNldCAwIGxldmVsIG1pcG1hcCBhbmQgdGhlbiB1c2UgR0wgdG8gZ2VuZXJhdGUgb3RoZXIgbWlwbWFwIGxldmVsc1xuXG5cdFx0XHRpZiAoIG1pcG1hcHMubGVuZ3RoID4gMCAmJiBpc1Bvd2VyT2ZUd29JbWFnZSApIHtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gbWlwbWFwcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdG1pcG1hcCA9IG1pcG1hcHNbIGkgXTtcblx0XHRcdFx0XHRzdGF0ZS50ZXhJbWFnZTJEKCBfZ2wuVEVYVFVSRV8yRCwgaSwgZ2xGb3JtYXQsIGdsRm9ybWF0LCBnbFR5cGUsIG1pcG1hcCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlO1xuXHRcdFx0XHR0ZXh0dXJlUHJvcGVydGllcy5fX21heE1pcExldmVsID0gbWlwbWFwcy5sZW5ndGggLSAxO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHN0YXRlLnRleEltYWdlMkQoIF9nbC5URVhUVVJFXzJELCAwLCBnbEZvcm1hdCwgZ2xGb3JtYXQsIGdsVHlwZSwgaW1hZ2UgKTtcblx0XHRcdFx0dGV4dHVyZVByb3BlcnRpZXMuX19tYXhNaXBMZXZlbCA9IDA7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggdGV4dHVyZU5lZWRzR2VuZXJhdGVNaXBtYXBzKCB0ZXh0dXJlLCBpc1Bvd2VyT2ZUd29JbWFnZSApICkge1xuXG5cdFx0XHRnZW5lcmF0ZU1pcG1hcCggX2dsLlRFWFRVUkVfMkQsIHRleHR1cmUsIGltYWdlLndpZHRoLCBpbWFnZS5oZWlnaHQgKTtcblxuXHRcdH1cblxuXHRcdHRleHR1cmVQcm9wZXJ0aWVzLl9fdmVyc2lvbiA9IHRleHR1cmUudmVyc2lvbjtcblxuXHRcdGlmICggdGV4dHVyZS5vblVwZGF0ZSApIHRleHR1cmUub25VcGRhdGUoIHRleHR1cmUgKTtcblxuXHR9XG5cblx0Ly8gUmVuZGVyIHRhcmdldHNcblxuXHQvLyBTZXR1cCBzdG9yYWdlIGZvciB0YXJnZXQgdGV4dHVyZSBhbmQgYmluZCBpdCB0byBjb3JyZWN0IGZyYW1lYnVmZmVyXG5cdGZ1bmN0aW9uIHNldHVwRnJhbWVCdWZmZXJUZXh0dXJlKCBmcmFtZWJ1ZmZlciwgcmVuZGVyVGFyZ2V0LCBhdHRhY2htZW50LCB0ZXh0dXJlVGFyZ2V0ICkge1xuXG5cdFx0dmFyIGdsRm9ybWF0ID0gdXRpbHMuY29udmVydCggcmVuZGVyVGFyZ2V0LnRleHR1cmUuZm9ybWF0ICk7XG5cdFx0dmFyIGdsVHlwZSA9IHV0aWxzLmNvbnZlcnQoIHJlbmRlclRhcmdldC50ZXh0dXJlLnR5cGUgKTtcblx0XHRzdGF0ZS50ZXhJbWFnZTJEKCB0ZXh0dXJlVGFyZ2V0LCAwLCBnbEZvcm1hdCwgcmVuZGVyVGFyZ2V0LndpZHRoLCByZW5kZXJUYXJnZXQuaGVpZ2h0LCAwLCBnbEZvcm1hdCwgZ2xUeXBlLCBudWxsICk7XG5cdFx0X2dsLmJpbmRGcmFtZWJ1ZmZlciggX2dsLkZSQU1FQlVGRkVSLCBmcmFtZWJ1ZmZlciApO1xuXHRcdF9nbC5mcmFtZWJ1ZmZlclRleHR1cmUyRCggX2dsLkZSQU1FQlVGRkVSLCBhdHRhY2htZW50LCB0ZXh0dXJlVGFyZ2V0LCBwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0LnRleHR1cmUgKS5fX3dlYmdsVGV4dHVyZSwgMCApO1xuXHRcdF9nbC5iaW5kRnJhbWVidWZmZXIoIF9nbC5GUkFNRUJVRkZFUiwgbnVsbCApO1xuXG5cdH1cblxuXHQvLyBTZXR1cCBzdG9yYWdlIGZvciBpbnRlcm5hbCBkZXB0aC9zdGVuY2lsIGJ1ZmZlcnMgYW5kIGJpbmQgdG8gY29ycmVjdCBmcmFtZWJ1ZmZlclxuXHRmdW5jdGlvbiBzZXR1cFJlbmRlckJ1ZmZlclN0b3JhZ2UoIHJlbmRlcmJ1ZmZlciwgcmVuZGVyVGFyZ2V0ICkge1xuXG5cdFx0X2dsLmJpbmRSZW5kZXJidWZmZXIoIF9nbC5SRU5ERVJCVUZGRVIsIHJlbmRlcmJ1ZmZlciApO1xuXG5cdFx0aWYgKCByZW5kZXJUYXJnZXQuZGVwdGhCdWZmZXIgJiYgISByZW5kZXJUYXJnZXQuc3RlbmNpbEJ1ZmZlciApIHtcblxuXHRcdFx0X2dsLnJlbmRlcmJ1ZmZlclN0b3JhZ2UoIF9nbC5SRU5ERVJCVUZGRVIsIF9nbC5ERVBUSF9DT01QT05FTlQxNiwgcmVuZGVyVGFyZ2V0LndpZHRoLCByZW5kZXJUYXJnZXQuaGVpZ2h0ICk7XG5cdFx0XHRfZ2wuZnJhbWVidWZmZXJSZW5kZXJidWZmZXIoIF9nbC5GUkFNRUJVRkZFUiwgX2dsLkRFUFRIX0FUVEFDSE1FTlQsIF9nbC5SRU5ERVJCVUZGRVIsIHJlbmRlcmJ1ZmZlciApO1xuXG5cdFx0fSBlbHNlIGlmICggcmVuZGVyVGFyZ2V0LmRlcHRoQnVmZmVyICYmIHJlbmRlclRhcmdldC5zdGVuY2lsQnVmZmVyICkge1xuXG5cdFx0XHRfZ2wucmVuZGVyYnVmZmVyU3RvcmFnZSggX2dsLlJFTkRFUkJVRkZFUiwgX2dsLkRFUFRIX1NURU5DSUwsIHJlbmRlclRhcmdldC53aWR0aCwgcmVuZGVyVGFyZ2V0LmhlaWdodCApO1xuXHRcdFx0X2dsLmZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyKCBfZ2wuRlJBTUVCVUZGRVIsIF9nbC5ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlQsIF9nbC5SRU5ERVJCVUZGRVIsIHJlbmRlcmJ1ZmZlciApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gRklYTUU6IFdlIGRvbid0IHN1cHBvcnQgIWRlcHRoICFzdGVuY2lsXG5cdFx0XHRfZ2wucmVuZGVyYnVmZmVyU3RvcmFnZSggX2dsLlJFTkRFUkJVRkZFUiwgX2dsLlJHQkE0LCByZW5kZXJUYXJnZXQud2lkdGgsIHJlbmRlclRhcmdldC5oZWlnaHQgKTtcblxuXHRcdH1cblxuXHRcdF9nbC5iaW5kUmVuZGVyYnVmZmVyKCBfZ2wuUkVOREVSQlVGRkVSLCBudWxsICk7XG5cblx0fVxuXG5cdC8vIFNldHVwIHJlc291cmNlcyBmb3IgYSBEZXB0aCBUZXh0dXJlIGZvciBhIEZCTyAobmVlZHMgYW4gZXh0ZW5zaW9uKVxuXHRmdW5jdGlvbiBzZXR1cERlcHRoVGV4dHVyZSggZnJhbWVidWZmZXIsIHJlbmRlclRhcmdldCApIHtcblxuXHRcdHZhciBpc0N1YmUgPSAoIHJlbmRlclRhcmdldCAmJiByZW5kZXJUYXJnZXQuaXNXZWJHTFJlbmRlclRhcmdldEN1YmUgKTtcblx0XHRpZiAoIGlzQ3ViZSApIHRocm93IG5ldyBFcnJvciggJ0RlcHRoIFRleHR1cmUgd2l0aCBjdWJlIHJlbmRlciB0YXJnZXRzIGlzIG5vdCBzdXBwb3J0ZWQnICk7XG5cblx0XHRfZ2wuYmluZEZyYW1lYnVmZmVyKCBfZ2wuRlJBTUVCVUZGRVIsIGZyYW1lYnVmZmVyICk7XG5cblx0XHRpZiAoICEgKCByZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlICYmIHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUuaXNEZXB0aFRleHR1cmUgKSApIHtcblxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCAncmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZSBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIFRIUkVFLkRlcHRoVGV4dHVyZScgKTtcblxuXHRcdH1cblxuXHRcdC8vIHVwbG9hZCBhbiBlbXB0eSBkZXB0aCB0ZXh0dXJlIHdpdGggZnJhbWVidWZmZXIgc2l6ZVxuXHRcdGlmICggISBwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZSApLl9fd2ViZ2xUZXh0dXJlIHx8XG5cdFx0XHRcdHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUuaW1hZ2Uud2lkdGggIT09IHJlbmRlclRhcmdldC53aWR0aCB8fFxuXHRcdFx0XHRyZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlLmltYWdlLmhlaWdodCAhPT0gcmVuZGVyVGFyZ2V0LmhlaWdodCApIHtcblxuXHRcdFx0cmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZS5pbWFnZS53aWR0aCA9IHJlbmRlclRhcmdldC53aWR0aDtcblx0XHRcdHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUuaW1hZ2UuaGVpZ2h0ID0gcmVuZGVyVGFyZ2V0LmhlaWdodDtcblx0XHRcdHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0fVxuXG5cdFx0c2V0VGV4dHVyZTJEKCByZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlLCAwICk7XG5cblx0XHR2YXIgd2ViZ2xEZXB0aFRleHR1cmUgPSBwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZSApLl9fd2ViZ2xUZXh0dXJlO1xuXG5cdFx0aWYgKCByZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlLmZvcm1hdCA9PT0gRGVwdGhGb3JtYXQgKSB7XG5cblx0XHRcdF9nbC5mcmFtZWJ1ZmZlclRleHR1cmUyRCggX2dsLkZSQU1FQlVGRkVSLCBfZ2wuREVQVEhfQVRUQUNITUVOVCwgX2dsLlRFWFRVUkVfMkQsIHdlYmdsRGVwdGhUZXh0dXJlLCAwICk7XG5cblx0XHR9IGVsc2UgaWYgKCByZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlLmZvcm1hdCA9PT0gRGVwdGhTdGVuY2lsRm9ybWF0ICkge1xuXG5cdFx0XHRfZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoIF9nbC5GUkFNRUJVRkZFUiwgX2dsLkRFUFRIX1NURU5DSUxfQVRUQUNITUVOVCwgX2dsLlRFWFRVUkVfMkQsIHdlYmdsRGVwdGhUZXh0dXJlLCAwICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoICdVbmtub3duIGRlcHRoVGV4dHVyZSBmb3JtYXQnICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vIFNldHVwIEdMIHJlc291cmNlcyBmb3IgYSBub24tdGV4dHVyZSBkZXB0aCBidWZmZXJcblx0ZnVuY3Rpb24gc2V0dXBEZXB0aFJlbmRlcmJ1ZmZlciggcmVuZGVyVGFyZ2V0ICkge1xuXG5cdFx0dmFyIHJlbmRlclRhcmdldFByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0ICk7XG5cblx0XHR2YXIgaXNDdWJlID0gKCByZW5kZXJUYXJnZXQuaXNXZWJHTFJlbmRlclRhcmdldEN1YmUgPT09IHRydWUgKTtcblxuXHRcdGlmICggcmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZSApIHtcblxuXHRcdFx0aWYgKCBpc0N1YmUgKSB0aHJvdyBuZXcgRXJyb3IoICd0YXJnZXQuZGVwdGhUZXh0dXJlIG5vdCBzdXBwb3J0ZWQgaW4gQ3ViZSByZW5kZXIgdGFyZ2V0cycgKTtcblxuXHRcdFx0c2V0dXBEZXB0aFRleHR1cmUoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVyLCByZW5kZXJUYXJnZXQgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGlmICggaXNDdWJlICkge1xuXG5cdFx0XHRcdHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbERlcHRoYnVmZmVyID0gW107XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgNjsgaSArKyApIHtcblxuXHRcdFx0XHRcdF9nbC5iaW5kRnJhbWVidWZmZXIoIF9nbC5GUkFNRUJVRkZFUiwgcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRnJhbWVidWZmZXJbIGkgXSApO1xuXHRcdFx0XHRcdHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbERlcHRoYnVmZmVyWyBpIF0gPSBfZ2wuY3JlYXRlUmVuZGVyYnVmZmVyKCk7XG5cdFx0XHRcdFx0c2V0dXBSZW5kZXJCdWZmZXJTdG9yYWdlKCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xEZXB0aGJ1ZmZlclsgaSBdLCByZW5kZXJUYXJnZXQgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0X2dsLmJpbmRGcmFtZWJ1ZmZlciggX2dsLkZSQU1FQlVGRkVSLCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlciApO1xuXHRcdFx0XHRyZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xEZXB0aGJ1ZmZlciA9IF9nbC5jcmVhdGVSZW5kZXJidWZmZXIoKTtcblx0XHRcdFx0c2V0dXBSZW5kZXJCdWZmZXJTdG9yYWdlKCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xEZXB0aGJ1ZmZlciwgcmVuZGVyVGFyZ2V0ICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdF9nbC5iaW5kRnJhbWVidWZmZXIoIF9nbC5GUkFNRUJVRkZFUiwgbnVsbCApO1xuXG5cdH1cblxuXHQvLyBTZXQgdXAgR0wgcmVzb3VyY2VzIGZvciB0aGUgcmVuZGVyIHRhcmdldFxuXHRmdW5jdGlvbiBzZXR1cFJlbmRlclRhcmdldCggcmVuZGVyVGFyZ2V0ICkge1xuXG5cdFx0dmFyIHJlbmRlclRhcmdldFByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0ICk7XG5cdFx0dmFyIHRleHR1cmVQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIHJlbmRlclRhcmdldC50ZXh0dXJlICk7XG5cblx0XHRyZW5kZXJUYXJnZXQuYWRkRXZlbnRMaXN0ZW5lciggJ2Rpc3Bvc2UnLCBvblJlbmRlclRhcmdldERpc3Bvc2UgKTtcblxuXHRcdHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlID0gX2dsLmNyZWF0ZVRleHR1cmUoKTtcblxuXHRcdGluZm8ubWVtb3J5LnRleHR1cmVzICsrO1xuXG5cdFx0dmFyIGlzQ3ViZSA9ICggcmVuZGVyVGFyZ2V0LmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlID09PSB0cnVlICk7XG5cdFx0dmFyIGlzVGFyZ2V0UG93ZXJPZlR3byA9IGlzUG93ZXJPZlR3byggcmVuZGVyVGFyZ2V0ICk7XG5cblx0XHQvLyBTZXR1cCBmcmFtZWJ1ZmZlclxuXG5cdFx0aWYgKCBpc0N1YmUgKSB7XG5cblx0XHRcdHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVyID0gW107XG5cblx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IDY7IGkgKysgKSB7XG5cblx0XHRcdFx0cmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRnJhbWVidWZmZXJbIGkgXSA9IF9nbC5jcmVhdGVGcmFtZWJ1ZmZlcigpO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRyZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlciA9IF9nbC5jcmVhdGVGcmFtZWJ1ZmZlcigpO1xuXG5cdFx0fVxuXG5cdFx0Ly8gU2V0dXAgY29sb3IgYnVmZmVyXG5cblx0XHRpZiAoIGlzQ3ViZSApIHtcblxuXHRcdFx0c3RhdGUuYmluZFRleHR1cmUoIF9nbC5URVhUVVJFX0NVQkVfTUFQLCB0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSApO1xuXHRcdFx0c2V0VGV4dHVyZVBhcmFtZXRlcnMoIF9nbC5URVhUVVJFX0NVQkVfTUFQLCByZW5kZXJUYXJnZXQudGV4dHVyZSwgaXNUYXJnZXRQb3dlck9mVHdvICk7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IDY7IGkgKysgKSB7XG5cblx0XHRcdFx0c2V0dXBGcmFtZUJ1ZmZlclRleHR1cmUoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVyWyBpIF0sIHJlbmRlclRhcmdldCwgX2dsLkNPTE9SX0FUVEFDSE1FTlQwLCBfZ2wuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YICsgaSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggdGV4dHVyZU5lZWRzR2VuZXJhdGVNaXBtYXBzKCByZW5kZXJUYXJnZXQudGV4dHVyZSwgaXNUYXJnZXRQb3dlck9mVHdvICkgKSB7XG5cblx0XHRcdFx0Z2VuZXJhdGVNaXBtYXAoIF9nbC5URVhUVVJFX0NVQkVfTUFQLCByZW5kZXJUYXJnZXQudGV4dHVyZSwgcmVuZGVyVGFyZ2V0LndpZHRoLCByZW5kZXJUYXJnZXQuaGVpZ2h0ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0c3RhdGUuYmluZFRleHR1cmUoIF9nbC5URVhUVVJFX0NVQkVfTUFQLCBudWxsICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRzdGF0ZS5iaW5kVGV4dHVyZSggX2dsLlRFWFRVUkVfMkQsIHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlICk7XG5cdFx0XHRzZXRUZXh0dXJlUGFyYW1ldGVycyggX2dsLlRFWFRVUkVfMkQsIHJlbmRlclRhcmdldC50ZXh0dXJlLCBpc1RhcmdldFBvd2VyT2ZUd28gKTtcblx0XHRcdHNldHVwRnJhbWVCdWZmZXJUZXh0dXJlKCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlciwgcmVuZGVyVGFyZ2V0LCBfZ2wuQ09MT1JfQVRUQUNITUVOVDAsIF9nbC5URVhUVVJFXzJEICk7XG5cblx0XHRcdGlmICggdGV4dHVyZU5lZWRzR2VuZXJhdGVNaXBtYXBzKCByZW5kZXJUYXJnZXQudGV4dHVyZSwgaXNUYXJnZXRQb3dlck9mVHdvICkgKSB7XG5cblx0XHRcdFx0Z2VuZXJhdGVNaXBtYXAoIF9nbC5URVhUVVJFXzJELCByZW5kZXJUYXJnZXQudGV4dHVyZSwgcmVuZGVyVGFyZ2V0LndpZHRoLCByZW5kZXJUYXJnZXQuaGVpZ2h0ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0c3RhdGUuYmluZFRleHR1cmUoIF9nbC5URVhUVVJFXzJELCBudWxsICk7XG5cblx0XHR9XG5cblx0XHQvLyBTZXR1cCBkZXB0aCBhbmQgc3RlbmNpbCBidWZmZXJzXG5cblx0XHRpZiAoIHJlbmRlclRhcmdldC5kZXB0aEJ1ZmZlciApIHtcblxuXHRcdFx0c2V0dXBEZXB0aFJlbmRlcmJ1ZmZlciggcmVuZGVyVGFyZ2V0ICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHVwZGF0ZVJlbmRlclRhcmdldE1pcG1hcCggcmVuZGVyVGFyZ2V0ICkge1xuXG5cdFx0dmFyIHRleHR1cmUgPSByZW5kZXJUYXJnZXQudGV4dHVyZTtcblx0XHR2YXIgaXNUYXJnZXRQb3dlck9mVHdvID0gaXNQb3dlck9mVHdvKCByZW5kZXJUYXJnZXQgKTtcblxuXHRcdGlmICggdGV4dHVyZU5lZWRzR2VuZXJhdGVNaXBtYXBzKCB0ZXh0dXJlLCBpc1RhcmdldFBvd2VyT2ZUd28gKSApIHtcblxuXHRcdFx0dmFyIHRhcmdldCA9IHJlbmRlclRhcmdldC5pc1dlYkdMUmVuZGVyVGFyZ2V0Q3ViZSA/IF9nbC5URVhUVVJFX0NVQkVfTUFQIDogX2dsLlRFWFRVUkVfMkQ7XG5cdFx0XHR2YXIgd2ViZ2xUZXh0dXJlID0gcHJvcGVydGllcy5nZXQoIHRleHR1cmUgKS5fX3dlYmdsVGV4dHVyZTtcblxuXHRcdFx0c3RhdGUuYmluZFRleHR1cmUoIHRhcmdldCwgd2ViZ2xUZXh0dXJlICk7XG5cdFx0XHRnZW5lcmF0ZU1pcG1hcCggdGFyZ2V0LCB0ZXh0dXJlLCByZW5kZXJUYXJnZXQud2lkdGgsIHJlbmRlclRhcmdldC5oZWlnaHQgKTtcblx0XHRcdHN0YXRlLmJpbmRUZXh0dXJlKCB0YXJnZXQsIG51bGwgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gdXBkYXRlVmlkZW9UZXh0dXJlKCB0ZXh0dXJlICkge1xuXG5cdFx0dmFyIGlkID0gdGV4dHVyZS5pZDtcblx0XHR2YXIgZnJhbWUgPSBpbmZvLnJlbmRlci5mcmFtZTtcblxuXHRcdC8vIENoZWNrIHRoZSBsYXN0IGZyYW1lIHdlIHVwZGF0ZWQgdGhlIFZpZGVvVGV4dHVyZVxuXG5cdFx0aWYgKCBfdmlkZW9UZXh0dXJlc1sgaWQgXSAhPT0gZnJhbWUgKSB7XG5cblx0XHRcdF92aWRlb1RleHR1cmVzWyBpZCBdID0gZnJhbWU7XG5cdFx0XHR0ZXh0dXJlLnVwZGF0ZSgpO1xuXG5cdFx0fVxuXG5cdH1cblxuXHR0aGlzLnNldFRleHR1cmUyRCA9IHNldFRleHR1cmUyRDtcblx0dGhpcy5zZXRUZXh0dXJlQ3ViZSA9IHNldFRleHR1cmVDdWJlO1xuXHR0aGlzLnNldFRleHR1cmVDdWJlRHluYW1pYyA9IHNldFRleHR1cmVDdWJlRHluYW1pYztcblx0dGhpcy5zZXR1cFJlbmRlclRhcmdldCA9IHNldHVwUmVuZGVyVGFyZ2V0O1xuXHR0aGlzLnVwZGF0ZVJlbmRlclRhcmdldE1pcG1hcCA9IHVwZGF0ZVJlbmRlclRhcmdldE1pcG1hcDtcblxufVxuXG4vKipcbiAqIEBhdXRob3IgdGhlc3BpdGUgLyBodHRwOi8vd3d3LnR3aXR0ZXIuY29tL3RoZXNwaXRlXG4gKi9cblxuZnVuY3Rpb24gV2ViR0xVdGlscyggZ2wsIGV4dGVuc2lvbnMgKSB7XG5cblx0ZnVuY3Rpb24gY29udmVydCggcCApIHtcblxuXHRcdHZhciBleHRlbnNpb247XG5cblx0XHRpZiAoIHAgPT09IFJlcGVhdFdyYXBwaW5nICkgcmV0dXJuIGdsLlJFUEVBVDtcblx0XHRpZiAoIHAgPT09IENsYW1wVG9FZGdlV3JhcHBpbmcgKSByZXR1cm4gZ2wuQ0xBTVBfVE9fRURHRTtcblx0XHRpZiAoIHAgPT09IE1pcnJvcmVkUmVwZWF0V3JhcHBpbmcgKSByZXR1cm4gZ2wuTUlSUk9SRURfUkVQRUFUO1xuXG5cdFx0aWYgKCBwID09PSBOZWFyZXN0RmlsdGVyICkgcmV0dXJuIGdsLk5FQVJFU1Q7XG5cdFx0aWYgKCBwID09PSBOZWFyZXN0TWlwTWFwTmVhcmVzdEZpbHRlciApIHJldHVybiBnbC5ORUFSRVNUX01JUE1BUF9ORUFSRVNUO1xuXHRcdGlmICggcCA9PT0gTmVhcmVzdE1pcE1hcExpbmVhckZpbHRlciApIHJldHVybiBnbC5ORUFSRVNUX01JUE1BUF9MSU5FQVI7XG5cblx0XHRpZiAoIHAgPT09IExpbmVhckZpbHRlciApIHJldHVybiBnbC5MSU5FQVI7XG5cdFx0aWYgKCBwID09PSBMaW5lYXJNaXBNYXBOZWFyZXN0RmlsdGVyICkgcmV0dXJuIGdsLkxJTkVBUl9NSVBNQVBfTkVBUkVTVDtcblx0XHRpZiAoIHAgPT09IExpbmVhck1pcE1hcExpbmVhckZpbHRlciApIHJldHVybiBnbC5MSU5FQVJfTUlQTUFQX0xJTkVBUjtcblxuXHRcdGlmICggcCA9PT0gVW5zaWduZWRCeXRlVHlwZSApIHJldHVybiBnbC5VTlNJR05FRF9CWVRFO1xuXHRcdGlmICggcCA9PT0gVW5zaWduZWRTaG9ydDQ0NDRUeXBlICkgcmV0dXJuIGdsLlVOU0lHTkVEX1NIT1JUXzRfNF80XzQ7XG5cdFx0aWYgKCBwID09PSBVbnNpZ25lZFNob3J0NTU1MVR5cGUgKSByZXR1cm4gZ2wuVU5TSUdORURfU0hPUlRfNV81XzVfMTtcblx0XHRpZiAoIHAgPT09IFVuc2lnbmVkU2hvcnQ1NjVUeXBlICkgcmV0dXJuIGdsLlVOU0lHTkVEX1NIT1JUXzVfNl81O1xuXG5cdFx0aWYgKCBwID09PSBCeXRlVHlwZSApIHJldHVybiBnbC5CWVRFO1xuXHRcdGlmICggcCA9PT0gU2hvcnRUeXBlICkgcmV0dXJuIGdsLlNIT1JUO1xuXHRcdGlmICggcCA9PT0gVW5zaWduZWRTaG9ydFR5cGUgKSByZXR1cm4gZ2wuVU5TSUdORURfU0hPUlQ7XG5cdFx0aWYgKCBwID09PSBJbnRUeXBlICkgcmV0dXJuIGdsLklOVDtcblx0XHRpZiAoIHAgPT09IFVuc2lnbmVkSW50VHlwZSApIHJldHVybiBnbC5VTlNJR05FRF9JTlQ7XG5cdFx0aWYgKCBwID09PSBGbG9hdFR5cGUgKSByZXR1cm4gZ2wuRkxPQVQ7XG5cblx0XHRpZiAoIHAgPT09IEhhbGZGbG9hdFR5cGUgKSB7XG5cblx0XHRcdGV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCAnT0VTX3RleHR1cmVfaGFsZl9mbG9hdCcgKTtcblxuXHRcdFx0aWYgKCBleHRlbnNpb24gIT09IG51bGwgKSByZXR1cm4gZXh0ZW5zaW9uLkhBTEZfRkxPQVRfT0VTO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBwID09PSBBbHBoYUZvcm1hdCApIHJldHVybiBnbC5BTFBIQTtcblx0XHRpZiAoIHAgPT09IFJHQkZvcm1hdCApIHJldHVybiBnbC5SR0I7XG5cdFx0aWYgKCBwID09PSBSR0JBRm9ybWF0ICkgcmV0dXJuIGdsLlJHQkE7XG5cdFx0aWYgKCBwID09PSBMdW1pbmFuY2VGb3JtYXQgKSByZXR1cm4gZ2wuTFVNSU5BTkNFO1xuXHRcdGlmICggcCA9PT0gTHVtaW5hbmNlQWxwaGFGb3JtYXQgKSByZXR1cm4gZ2wuTFVNSU5BTkNFX0FMUEhBO1xuXHRcdGlmICggcCA9PT0gRGVwdGhGb3JtYXQgKSByZXR1cm4gZ2wuREVQVEhfQ09NUE9ORU5UO1xuXHRcdGlmICggcCA9PT0gRGVwdGhTdGVuY2lsRm9ybWF0ICkgcmV0dXJuIGdsLkRFUFRIX1NURU5DSUw7XG5cblx0XHRpZiAoIHAgPT09IEFkZEVxdWF0aW9uICkgcmV0dXJuIGdsLkZVTkNfQUREO1xuXHRcdGlmICggcCA9PT0gU3VidHJhY3RFcXVhdGlvbiApIHJldHVybiBnbC5GVU5DX1NVQlRSQUNUO1xuXHRcdGlmICggcCA9PT0gUmV2ZXJzZVN1YnRyYWN0RXF1YXRpb24gKSByZXR1cm4gZ2wuRlVOQ19SRVZFUlNFX1NVQlRSQUNUO1xuXG5cdFx0aWYgKCBwID09PSBaZXJvRmFjdG9yICkgcmV0dXJuIGdsLlpFUk87XG5cdFx0aWYgKCBwID09PSBPbmVGYWN0b3IgKSByZXR1cm4gZ2wuT05FO1xuXHRcdGlmICggcCA9PT0gU3JjQ29sb3JGYWN0b3IgKSByZXR1cm4gZ2wuU1JDX0NPTE9SO1xuXHRcdGlmICggcCA9PT0gT25lTWludXNTcmNDb2xvckZhY3RvciApIHJldHVybiBnbC5PTkVfTUlOVVNfU1JDX0NPTE9SO1xuXHRcdGlmICggcCA9PT0gU3JjQWxwaGFGYWN0b3IgKSByZXR1cm4gZ2wuU1JDX0FMUEhBO1xuXHRcdGlmICggcCA9PT0gT25lTWludXNTcmNBbHBoYUZhY3RvciApIHJldHVybiBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBO1xuXHRcdGlmICggcCA9PT0gRHN0QWxwaGFGYWN0b3IgKSByZXR1cm4gZ2wuRFNUX0FMUEhBO1xuXHRcdGlmICggcCA9PT0gT25lTWludXNEc3RBbHBoYUZhY3RvciApIHJldHVybiBnbC5PTkVfTUlOVVNfRFNUX0FMUEhBO1xuXG5cdFx0aWYgKCBwID09PSBEc3RDb2xvckZhY3RvciApIHJldHVybiBnbC5EU1RfQ09MT1I7XG5cdFx0aWYgKCBwID09PSBPbmVNaW51c0RzdENvbG9yRmFjdG9yICkgcmV0dXJuIGdsLk9ORV9NSU5VU19EU1RfQ09MT1I7XG5cdFx0aWYgKCBwID09PSBTcmNBbHBoYVNhdHVyYXRlRmFjdG9yICkgcmV0dXJuIGdsLlNSQ19BTFBIQV9TQVRVUkFURTtcblxuXHRcdGlmICggcCA9PT0gUkdCX1MzVENfRFhUMV9Gb3JtYXQgfHwgcCA9PT0gUkdCQV9TM1RDX0RYVDFfRm9ybWF0IHx8XG5cdFx0XHRwID09PSBSR0JBX1MzVENfRFhUM19Gb3JtYXQgfHwgcCA9PT0gUkdCQV9TM1RDX0RYVDVfRm9ybWF0ICkge1xuXG5cdFx0XHRleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjJyApO1xuXG5cdFx0XHRpZiAoIGV4dGVuc2lvbiAhPT0gbnVsbCApIHtcblxuXHRcdFx0XHRpZiAoIHAgPT09IFJHQl9TM1RDX0RYVDFfRm9ybWF0ICkgcmV0dXJuIGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQl9TM1RDX0RYVDFfRVhUO1xuXHRcdFx0XHRpZiAoIHAgPT09IFJHQkFfUzNUQ19EWFQxX0Zvcm1hdCApIHJldHVybiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUMV9FWFQ7XG5cdFx0XHRcdGlmICggcCA9PT0gUkdCQV9TM1RDX0RYVDNfRm9ybWF0ICkgcmV0dXJuIGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQzX0VYVDtcblx0XHRcdFx0aWYgKCBwID09PSBSR0JBX1MzVENfRFhUNV9Gb3JtYXQgKSByZXR1cm4gZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDVfRVhUO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIHAgPT09IFJHQl9QVlJUQ180QlBQVjFfRm9ybWF0IHx8IHAgPT09IFJHQl9QVlJUQ18yQlBQVjFfRm9ybWF0IHx8XG5cdFx0XHRwID09PSBSR0JBX1BWUlRDXzRCUFBWMV9Gb3JtYXQgfHwgcCA9PT0gUkdCQV9QVlJUQ18yQlBQVjFfRm9ybWF0ICkge1xuXG5cdFx0XHRleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0YycgKTtcblxuXHRcdFx0aWYgKCBleHRlbnNpb24gIT09IG51bGwgKSB7XG5cblx0XHRcdFx0aWYgKCBwID09PSBSR0JfUFZSVENfNEJQUFYxX0Zvcm1hdCApIHJldHVybiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JfUFZSVENfNEJQUFYxX0lNRztcblx0XHRcdFx0aWYgKCBwID09PSBSR0JfUFZSVENfMkJQUFYxX0Zvcm1hdCApIHJldHVybiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JfUFZSVENfMkJQUFYxX0lNRztcblx0XHRcdFx0aWYgKCBwID09PSBSR0JBX1BWUlRDXzRCUFBWMV9Gb3JtYXQgKSByZXR1cm4gZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCQV9QVlJUQ180QlBQVjFfSU1HO1xuXHRcdFx0XHRpZiAoIHAgPT09IFJHQkFfUFZSVENfMkJQUFYxX0Zvcm1hdCApIHJldHVybiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JBX1BWUlRDXzJCUFBWMV9JTUc7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggcCA9PT0gUkdCX0VUQzFfRm9ybWF0ICkge1xuXG5cdFx0XHRleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9ldGMxJyApO1xuXG5cdFx0XHRpZiAoIGV4dGVuc2lvbiAhPT0gbnVsbCApIHJldHVybiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JfRVRDMV9XRUJHTDtcblxuXHRcdH1cblxuXHRcdGlmICggcCA9PT0gUkdCQV9BU1RDXzR4NF9Gb3JtYXQgfHwgcCA9PT0gUkdCQV9BU1RDXzV4NF9Gb3JtYXQgfHwgcCA9PT0gUkdCQV9BU1RDXzV4NV9Gb3JtYXQgfHxcblx0XHRcdHAgPT09IFJHQkFfQVNUQ182eDVfRm9ybWF0IHx8IHAgPT09IFJHQkFfQVNUQ182eDZfRm9ybWF0IHx8IHAgPT09IFJHQkFfQVNUQ184eDVfRm9ybWF0IHx8XG5cdFx0XHRwID09PSBSR0JBX0FTVENfOHg2X0Zvcm1hdCB8fCBwID09PSBSR0JBX0FTVENfOHg4X0Zvcm1hdCB8fCBwID09PSBSR0JBX0FTVENfMTB4NV9Gb3JtYXQgfHxcblx0XHRcdHAgPT09IFJHQkFfQVNUQ18xMHg2X0Zvcm1hdCB8fCBwID09PSBSR0JBX0FTVENfMTB4OF9Gb3JtYXQgfHwgcCA9PT0gUkdCQV9BU1RDXzEweDEwX0Zvcm1hdCB8fFxuXHRcdFx0cCA9PT0gUkdCQV9BU1RDXzEyeDEwX0Zvcm1hdCB8fCBwID09PSBSR0JBX0FTVENfMTJ4MTJfRm9ybWF0ICkge1xuXG5cdFx0XHRleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9hc3RjJyApO1xuXG5cdFx0XHRpZiAoIGV4dGVuc2lvbiAhPT0gbnVsbCApIHtcblxuXHRcdFx0XHRyZXR1cm4gcDtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCBwID09PSBNaW5FcXVhdGlvbiB8fCBwID09PSBNYXhFcXVhdGlvbiApIHtcblxuXHRcdFx0ZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdFWFRfYmxlbmRfbWlubWF4JyApO1xuXG5cdFx0XHRpZiAoIGV4dGVuc2lvbiAhPT0gbnVsbCApIHtcblxuXHRcdFx0XHRpZiAoIHAgPT09IE1pbkVxdWF0aW9uICkgcmV0dXJuIGV4dGVuc2lvbi5NSU5fRVhUO1xuXHRcdFx0XHRpZiAoIHAgPT09IE1heEVxdWF0aW9uICkgcmV0dXJuIGV4dGVuc2lvbi5NQVhfRVhUO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIHAgPT09IFVuc2lnbmVkSW50MjQ4VHlwZSApIHtcblxuXHRcdFx0ZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9kZXB0aF90ZXh0dXJlJyApO1xuXG5cdFx0XHRpZiAoIGV4dGVuc2lvbiAhPT0gbnVsbCApIHJldHVybiBleHRlbnNpb24uVU5TSUdORURfSU5UXzI0XzhfV0VCR0w7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gMDtcblxuXHR9XG5cblx0cmV0dXJuIHsgY29udmVydDogY29udmVydCB9O1xuXG59XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgZ3JlZ2dtYW4gLyBodHRwOi8vZ2FtZXMuZ3JlZ2dtYW4uY29tL1xuICogQGF1dGhvciB6ejg1IC8gaHR0cDovL3d3dy5sYWI0Z2FtZXMubmV0L3p6ODUvYmxvZ1xuICogQGF1dGhvciB0c2Nod1xuICovXG5cbmZ1bmN0aW9uIFBlcnNwZWN0aXZlQ2FtZXJhKCBmb3YsIGFzcGVjdCwgbmVhciwgZmFyICkge1xuXG5cdENhbWVyYS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1BlcnNwZWN0aXZlQ2FtZXJhJztcblxuXHR0aGlzLmZvdiA9IGZvdiAhPT0gdW5kZWZpbmVkID8gZm92IDogNTA7XG5cdHRoaXMuem9vbSA9IDE7XG5cblx0dGhpcy5uZWFyID0gbmVhciAhPT0gdW5kZWZpbmVkID8gbmVhciA6IDAuMTtcblx0dGhpcy5mYXIgPSBmYXIgIT09IHVuZGVmaW5lZCA/IGZhciA6IDIwMDA7XG5cdHRoaXMuZm9jdXMgPSAxMDtcblxuXHR0aGlzLmFzcGVjdCA9IGFzcGVjdCAhPT0gdW5kZWZpbmVkID8gYXNwZWN0IDogMTtcblx0dGhpcy52aWV3ID0gbnVsbDtcblxuXHR0aGlzLmZpbG1HYXVnZSA9IDM1O1x0Ly8gd2lkdGggb2YgdGhlIGZpbG0gKGRlZmF1bHQgaW4gbWlsbGltZXRlcnMpXG5cdHRoaXMuZmlsbU9mZnNldCA9IDA7XHQvLyBob3Jpem9udGFsIGZpbG0gb2Zmc2V0IChzYW1lIHVuaXQgYXMgZ2F1Z2UpXG5cblx0dGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XG5cbn1cblxuUGVyc3BlY3RpdmVDYW1lcmEucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggQ2FtZXJhLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IFBlcnNwZWN0aXZlQ2FtZXJhLFxuXG5cdGlzUGVyc3BlY3RpdmVDYW1lcmE6IHRydWUsXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UsIHJlY3Vyc2l2ZSApIHtcblxuXHRcdENhbWVyYS5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UsIHJlY3Vyc2l2ZSApO1xuXG5cdFx0dGhpcy5mb3YgPSBzb3VyY2UuZm92O1xuXHRcdHRoaXMuem9vbSA9IHNvdXJjZS56b29tO1xuXG5cdFx0dGhpcy5uZWFyID0gc291cmNlLm5lYXI7XG5cdFx0dGhpcy5mYXIgPSBzb3VyY2UuZmFyO1xuXHRcdHRoaXMuZm9jdXMgPSBzb3VyY2UuZm9jdXM7XG5cblx0XHR0aGlzLmFzcGVjdCA9IHNvdXJjZS5hc3BlY3Q7XG5cdFx0dGhpcy52aWV3ID0gc291cmNlLnZpZXcgPT09IG51bGwgPyBudWxsIDogT2JqZWN0LmFzc2lnbigge30sIHNvdXJjZS52aWV3ICk7XG5cblx0XHR0aGlzLmZpbG1HYXVnZSA9IHNvdXJjZS5maWxtR2F1Z2U7XG5cdFx0dGhpcy5maWxtT2Zmc2V0ID0gc291cmNlLmZpbG1PZmZzZXQ7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBGT1YgYnkgZm9jYWwgbGVuZ3RoIGluIHJlc3BlY3QgdG8gdGhlIGN1cnJlbnQgLmZpbG1HYXVnZS5cblx0ICpcblx0ICogVGhlIGRlZmF1bHQgZmlsbSBnYXVnZSBpcyAzNSwgc28gdGhhdCB0aGUgZm9jYWwgbGVuZ3RoIGNhbiBiZSBzcGVjaWZpZWQgZm9yXG5cdCAqIGEgMzVtbSAoZnVsbCBmcmFtZSkgY2FtZXJhLlxuXHQgKlxuXHQgKiBWYWx1ZXMgZm9yIGZvY2FsIGxlbmd0aCBhbmQgZmlsbSBnYXVnZSBtdXN0IGhhdmUgdGhlIHNhbWUgdW5pdC5cblx0ICovXG5cdHNldEZvY2FsTGVuZ3RoOiBmdW5jdGlvbiAoIGZvY2FsTGVuZ3RoICkge1xuXG5cdFx0Ly8gc2VlIGh0dHA6Ly93d3cuYm9iYXRraW5zLmNvbS9waG90b2dyYXBoeS90ZWNobmljYWwvZmllbGRfb2Zfdmlldy5odG1sXG5cdFx0dmFyIHZFeHRlbnRTbG9wZSA9IDAuNSAqIHRoaXMuZ2V0RmlsbUhlaWdodCgpIC8gZm9jYWxMZW5ndGg7XG5cblx0XHR0aGlzLmZvdiA9IF9NYXRoLlJBRDJERUcgKiAyICogTWF0aC5hdGFuKCB2RXh0ZW50U2xvcGUgKTtcblx0XHR0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTtcblxuXHR9LFxuXG5cdC8qKlxuXHQgKiBDYWxjdWxhdGVzIHRoZSBmb2NhbCBsZW5ndGggZnJvbSB0aGUgY3VycmVudCAuZm92IGFuZCAuZmlsbUdhdWdlLlxuXHQgKi9cblx0Z2V0Rm9jYWxMZW5ndGg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2RXh0ZW50U2xvcGUgPSBNYXRoLnRhbiggX01hdGguREVHMlJBRCAqIDAuNSAqIHRoaXMuZm92ICk7XG5cblx0XHRyZXR1cm4gMC41ICogdGhpcy5nZXRGaWxtSGVpZ2h0KCkgLyB2RXh0ZW50U2xvcGU7XG5cblx0fSxcblxuXHRnZXRFZmZlY3RpdmVGT1Y6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBfTWF0aC5SQUQyREVHICogMiAqIE1hdGguYXRhbihcblx0XHRcdE1hdGgudGFuKCBfTWF0aC5ERUcyUkFEICogMC41ICogdGhpcy5mb3YgKSAvIHRoaXMuem9vbSApO1xuXG5cdH0sXG5cblx0Z2V0RmlsbVdpZHRoOiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyBmaWxtIG5vdCBjb21wbGV0ZWx5IGNvdmVyZWQgaW4gcG9ydHJhaXQgZm9ybWF0IChhc3BlY3QgPCAxKVxuXHRcdHJldHVybiB0aGlzLmZpbG1HYXVnZSAqIE1hdGgubWluKCB0aGlzLmFzcGVjdCwgMSApO1xuXG5cdH0sXG5cblx0Z2V0RmlsbUhlaWdodDogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gZmlsbSBub3QgY29tcGxldGVseSBjb3ZlcmVkIGluIGxhbmRzY2FwZSBmb3JtYXQgKGFzcGVjdCA+IDEpXG5cdFx0cmV0dXJuIHRoaXMuZmlsbUdhdWdlIC8gTWF0aC5tYXgoIHRoaXMuYXNwZWN0LCAxICk7XG5cblx0fSxcblxuXHQvKipcblx0ICogU2V0cyBhbiBvZmZzZXQgaW4gYSBsYXJnZXIgZnJ1c3R1bS4gVGhpcyBpcyB1c2VmdWwgZm9yIG11bHRpLXdpbmRvdyBvclxuXHQgKiBtdWx0aS1tb25pdG9yL211bHRpLW1hY2hpbmUgc2V0dXBzLlxuXHQgKlxuXHQgKiBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgM3gyIG1vbml0b3JzIGFuZCBlYWNoIG1vbml0b3IgaXMgMTkyMHgxMDgwIGFuZFxuXHQgKiB0aGUgbW9uaXRvcnMgYXJlIGluIGdyaWQgbGlrZSB0aGlzXG5cdCAqXG5cdCAqICAgKy0tLSstLS0rLS0tK1xuXHQgKiAgIHwgQSB8IEIgfCBDIHxcblx0ICogICArLS0tKy0tLSstLS0rXG5cdCAqICAgfCBEIHwgRSB8IEYgfFxuXHQgKiAgICstLS0rLS0tKy0tLStcblx0ICpcblx0ICogdGhlbiBmb3IgZWFjaCBtb25pdG9yIHlvdSB3b3VsZCBjYWxsIGl0IGxpa2UgdGhpc1xuXHQgKlxuXHQgKiAgIHZhciB3ID0gMTkyMDtcblx0ICogICB2YXIgaCA9IDEwODA7XG5cdCAqICAgdmFyIGZ1bGxXaWR0aCA9IHcgKiAzO1xuXHQgKiAgIHZhciBmdWxsSGVpZ2h0ID0gaCAqIDI7XG5cdCAqXG5cdCAqICAgLS1BLS1cblx0ICogICBjYW1lcmEuc2V0T2Zmc2V0KCBmdWxsV2lkdGgsIGZ1bGxIZWlnaHQsIHcgKiAwLCBoICogMCwgdywgaCApO1xuXHQgKiAgIC0tQi0tXG5cdCAqICAgY2FtZXJhLnNldE9mZnNldCggZnVsbFdpZHRoLCBmdWxsSGVpZ2h0LCB3ICogMSwgaCAqIDAsIHcsIGggKTtcblx0ICogICAtLUMtLVxuXHQgKiAgIGNhbWVyYS5zZXRPZmZzZXQoIGZ1bGxXaWR0aCwgZnVsbEhlaWdodCwgdyAqIDIsIGggKiAwLCB3LCBoICk7XG5cdCAqICAgLS1ELS1cblx0ICogICBjYW1lcmEuc2V0T2Zmc2V0KCBmdWxsV2lkdGgsIGZ1bGxIZWlnaHQsIHcgKiAwLCBoICogMSwgdywgaCApO1xuXHQgKiAgIC0tRS0tXG5cdCAqICAgY2FtZXJhLnNldE9mZnNldCggZnVsbFdpZHRoLCBmdWxsSGVpZ2h0LCB3ICogMSwgaCAqIDEsIHcsIGggKTtcblx0ICogICAtLUYtLVxuXHQgKiAgIGNhbWVyYS5zZXRPZmZzZXQoIGZ1bGxXaWR0aCwgZnVsbEhlaWdodCwgdyAqIDIsIGggKiAxLCB3LCBoICk7XG5cdCAqXG5cdCAqICAgTm90ZSB0aGVyZSBpcyBubyByZWFzb24gbW9uaXRvcnMgaGF2ZSB0byBiZSB0aGUgc2FtZSBzaXplIG9yIGluIGEgZ3JpZC5cblx0ICovXG5cdHNldFZpZXdPZmZzZXQ6IGZ1bmN0aW9uICggZnVsbFdpZHRoLCBmdWxsSGVpZ2h0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0ICkge1xuXG5cdFx0dGhpcy5hc3BlY3QgPSBmdWxsV2lkdGggLyBmdWxsSGVpZ2h0O1xuXG5cdFx0aWYgKCB0aGlzLnZpZXcgPT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMudmlldyA9IHtcblx0XHRcdFx0ZW5hYmxlZDogdHJ1ZSxcblx0XHRcdFx0ZnVsbFdpZHRoOiAxLFxuXHRcdFx0XHRmdWxsSGVpZ2h0OiAxLFxuXHRcdFx0XHRvZmZzZXRYOiAwLFxuXHRcdFx0XHRvZmZzZXRZOiAwLFxuXHRcdFx0XHR3aWR0aDogMSxcblx0XHRcdFx0aGVpZ2h0OiAxXG5cdFx0XHR9O1xuXG5cdFx0fVxuXG5cdFx0dGhpcy52aWV3LmVuYWJsZWQgPSB0cnVlO1xuXHRcdHRoaXMudmlldy5mdWxsV2lkdGggPSBmdWxsV2lkdGg7XG5cdFx0dGhpcy52aWV3LmZ1bGxIZWlnaHQgPSBmdWxsSGVpZ2h0O1xuXHRcdHRoaXMudmlldy5vZmZzZXRYID0geDtcblx0XHR0aGlzLnZpZXcub2Zmc2V0WSA9IHk7XG5cdFx0dGhpcy52aWV3LndpZHRoID0gd2lkdGg7XG5cdFx0dGhpcy52aWV3LmhlaWdodCA9IGhlaWdodDtcblxuXHRcdHRoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xuXG5cdH0sXG5cblx0Y2xlYXJWaWV3T2Zmc2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRpZiAoIHRoaXMudmlldyAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy52aWV3LmVuYWJsZWQgPSBmYWxzZTtcblxuXHRcdH1cblxuXHRcdHRoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xuXG5cdH0sXG5cblx0dXBkYXRlUHJvamVjdGlvbk1hdHJpeDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIG5lYXIgPSB0aGlzLm5lYXIsXG5cdFx0XHR0b3AgPSBuZWFyICogTWF0aC50YW4oXG5cdFx0XHRcdF9NYXRoLkRFRzJSQUQgKiAwLjUgKiB0aGlzLmZvdiApIC8gdGhpcy56b29tLFxuXHRcdFx0aGVpZ2h0ID0gMiAqIHRvcCxcblx0XHRcdHdpZHRoID0gdGhpcy5hc3BlY3QgKiBoZWlnaHQsXG5cdFx0XHRsZWZ0ID0gLSAwLjUgKiB3aWR0aCxcblx0XHRcdHZpZXcgPSB0aGlzLnZpZXc7XG5cblx0XHRpZiAoIHRoaXMudmlldyAhPT0gbnVsbCAmJiB0aGlzLnZpZXcuZW5hYmxlZCApIHtcblxuXHRcdFx0dmFyIGZ1bGxXaWR0aCA9IHZpZXcuZnVsbFdpZHRoLFxuXHRcdFx0XHRmdWxsSGVpZ2h0ID0gdmlldy5mdWxsSGVpZ2h0O1xuXG5cdFx0XHRsZWZ0ICs9IHZpZXcub2Zmc2V0WCAqIHdpZHRoIC8gZnVsbFdpZHRoO1xuXHRcdFx0dG9wIC09IHZpZXcub2Zmc2V0WSAqIGhlaWdodCAvIGZ1bGxIZWlnaHQ7XG5cdFx0XHR3aWR0aCAqPSB2aWV3LndpZHRoIC8gZnVsbFdpZHRoO1xuXHRcdFx0aGVpZ2h0ICo9IHZpZXcuaGVpZ2h0IC8gZnVsbEhlaWdodDtcblxuXHRcdH1cblxuXHRcdHZhciBza2V3ID0gdGhpcy5maWxtT2Zmc2V0O1xuXHRcdGlmICggc2tldyAhPT0gMCApIGxlZnQgKz0gbmVhciAqIHNrZXcgLyB0aGlzLmdldEZpbG1XaWR0aCgpO1xuXG5cdFx0dGhpcy5wcm9qZWN0aW9uTWF0cml4Lm1ha2VQZXJzcGVjdGl2ZSggbGVmdCwgbGVmdCArIHdpZHRoLCB0b3AsIHRvcCAtIGhlaWdodCwgbmVhciwgdGhpcy5mYXIgKTtcblxuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCBtZXRhICkge1xuXG5cdFx0dmFyIGRhdGEgPSBPYmplY3QzRC5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMsIG1ldGEgKTtcblxuXHRcdGRhdGEub2JqZWN0LmZvdiA9IHRoaXMuZm92O1xuXHRcdGRhdGEub2JqZWN0Lnpvb20gPSB0aGlzLnpvb207XG5cblx0XHRkYXRhLm9iamVjdC5uZWFyID0gdGhpcy5uZWFyO1xuXHRcdGRhdGEub2JqZWN0LmZhciA9IHRoaXMuZmFyO1xuXHRcdGRhdGEub2JqZWN0LmZvY3VzID0gdGhpcy5mb2N1cztcblxuXHRcdGRhdGEub2JqZWN0LmFzcGVjdCA9IHRoaXMuYXNwZWN0O1xuXG5cdFx0aWYgKCB0aGlzLnZpZXcgIT09IG51bGwgKSBkYXRhLm9iamVjdC52aWV3ID0gT2JqZWN0LmFzc2lnbigge30sIHRoaXMudmlldyApO1xuXG5cdFx0ZGF0YS5vYmplY3QuZmlsbUdhdWdlID0gdGhpcy5maWxtR2F1Z2U7XG5cdFx0ZGF0YS5vYmplY3QuZmlsbU9mZnNldCA9IHRoaXMuZmlsbU9mZnNldDtcblxuXHRcdHJldHVybiBkYXRhO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gQXJyYXlDYW1lcmEoIGFycmF5ICkge1xuXG5cdFBlcnNwZWN0aXZlQ2FtZXJhLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLmNhbWVyYXMgPSBhcnJheSB8fCBbXTtcblxufVxuXG5BcnJheUNhbWVyYS5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBQZXJzcGVjdGl2ZUNhbWVyYS5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBBcnJheUNhbWVyYSxcblxuXHRpc0FycmF5Q2FtZXJhOiB0cnVlXG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIFdlYlZSTWFuYWdlciggcmVuZGVyZXIgKSB7XG5cblx0dmFyIHNjb3BlID0gdGhpcztcblxuXHR2YXIgZGV2aWNlID0gbnVsbDtcblx0dmFyIGZyYW1lRGF0YSA9IG51bGw7XG5cblx0dmFyIHBvc2VUYXJnZXQgPSBudWxsO1xuXG5cdHZhciBzdGFuZGluZ01hdHJpeCA9IG5ldyBNYXRyaXg0KCk7XG5cdHZhciBzdGFuZGluZ01hdHJpeEludmVyc2UgPSBuZXcgTWF0cml4NCgpO1xuXG5cdGlmICggdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgJ1ZSRnJhbWVEYXRhJyBpbiB3aW5kb3cgKSB7XG5cblx0XHRmcmFtZURhdGEgPSBuZXcgd2luZG93LlZSRnJhbWVEYXRhKCk7XG5cdFx0d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoICd2cmRpc3BsYXlwcmVzZW50Y2hhbmdlJywgb25WUkRpc3BsYXlQcmVzZW50Q2hhbmdlLCBmYWxzZSApO1xuXG5cdH1cblxuXHR2YXIgbWF0cml4V29ybGRJbnZlcnNlID0gbmV3IE1hdHJpeDQoKTtcblx0dmFyIHRlbXBRdWF0ZXJuaW9uID0gbmV3IFF1YXRlcm5pb24oKTtcblx0dmFyIHRlbXBQb3NpdGlvbiA9IG5ldyBWZWN0b3IzKCk7XG5cblx0dmFyIGNhbWVyYUwgPSBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoKTtcblx0Y2FtZXJhTC5ib3VuZHMgPSBuZXcgVmVjdG9yNCggMC4wLCAwLjAsIDAuNSwgMS4wICk7XG5cdGNhbWVyYUwubGF5ZXJzLmVuYWJsZSggMSApO1xuXG5cdHZhciBjYW1lcmFSID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCk7XG5cdGNhbWVyYVIuYm91bmRzID0gbmV3IFZlY3RvcjQoIDAuNSwgMC4wLCAwLjUsIDEuMCApO1xuXHRjYW1lcmFSLmxheWVycy5lbmFibGUoIDIgKTtcblxuXHR2YXIgY2FtZXJhVlIgPSBuZXcgQXJyYXlDYW1lcmEoIFsgY2FtZXJhTCwgY2FtZXJhUiBdICk7XG5cdGNhbWVyYVZSLmxheWVycy5lbmFibGUoIDEgKTtcblx0Y2FtZXJhVlIubGF5ZXJzLmVuYWJsZSggMiApO1xuXG5cdC8vXG5cblx0ZnVuY3Rpb24gaXNQcmVzZW50aW5nKCkge1xuXG5cdFx0cmV0dXJuIGRldmljZSAhPT0gbnVsbCAmJiBkZXZpY2UuaXNQcmVzZW50aW5nID09PSB0cnVlO1xuXG5cdH1cblxuXHR2YXIgY3VycmVudFNpemUsIGN1cnJlbnRQaXhlbFJhdGlvO1xuXG5cdGZ1bmN0aW9uIG9uVlJEaXNwbGF5UHJlc2VudENoYW5nZSgpIHtcblxuXHRcdGlmICggaXNQcmVzZW50aW5nKCkgKSB7XG5cblx0XHRcdHZhciBleWVQYXJhbWV0ZXJzID0gZGV2aWNlLmdldEV5ZVBhcmFtZXRlcnMoICdsZWZ0JyApO1xuXHRcdFx0dmFyIHJlbmRlcldpZHRoID0gZXllUGFyYW1ldGVycy5yZW5kZXJXaWR0aDtcblx0XHRcdHZhciByZW5kZXJIZWlnaHQgPSBleWVQYXJhbWV0ZXJzLnJlbmRlckhlaWdodDtcblxuXHRcdFx0Y3VycmVudFBpeGVsUmF0aW8gPSByZW5kZXJlci5nZXRQaXhlbFJhdGlvKCk7XG5cdFx0XHRjdXJyZW50U2l6ZSA9IHJlbmRlcmVyLmdldFNpemUoKTtcblxuXHRcdFx0cmVuZGVyZXIuc2V0RHJhd2luZ0J1ZmZlclNpemUoIHJlbmRlcldpZHRoICogMiwgcmVuZGVySGVpZ2h0LCAxICk7XG5cblx0XHR9IGVsc2UgaWYgKCBzY29wZS5lbmFibGVkICkge1xuXG5cdFx0XHRyZW5kZXJlci5zZXREcmF3aW5nQnVmZmVyU2l6ZSggY3VycmVudFNpemUud2lkdGgsIGN1cnJlbnRTaXplLmhlaWdodCwgY3VycmVudFBpeGVsUmF0aW8gKTtcblxuXHRcdH1cblxuXHR9XG5cblx0Ly9cblxuXHR0aGlzLmVuYWJsZWQgPSBmYWxzZTtcblx0dGhpcy51c2VySGVpZ2h0ID0gMS42O1xuXG5cdHRoaXMuZ2V0RGV2aWNlID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIGRldmljZTtcblxuXHR9O1xuXG5cdHRoaXMuc2V0RGV2aWNlID0gZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdGlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIGRldmljZSA9IHZhbHVlO1xuXG5cdH07XG5cblx0dGhpcy5zZXRQb3NlVGFyZ2V0ID0gZnVuY3Rpb24gKCBvYmplY3QgKSB7XG5cblx0XHRpZiAoIG9iamVjdCAhPT0gdW5kZWZpbmVkICkgcG9zZVRhcmdldCA9IG9iamVjdDtcblxuXHR9O1xuXG5cdHRoaXMuZ2V0Q2FtZXJhID0gZnVuY3Rpb24gKCBjYW1lcmEgKSB7XG5cblx0XHRpZiAoIGRldmljZSA9PT0gbnVsbCApIHJldHVybiBjYW1lcmE7XG5cblx0XHRkZXZpY2UuZGVwdGhOZWFyID0gY2FtZXJhLm5lYXI7XG5cdFx0ZGV2aWNlLmRlcHRoRmFyID0gY2FtZXJhLmZhcjtcblxuXHRcdGRldmljZS5nZXRGcmFtZURhdGEoIGZyYW1lRGF0YSApO1xuXG5cdFx0Ly9cblxuXHRcdHZhciBzdGFnZVBhcmFtZXRlcnMgPSBkZXZpY2Uuc3RhZ2VQYXJhbWV0ZXJzO1xuXG5cdFx0aWYgKCBzdGFnZVBhcmFtZXRlcnMgKSB7XG5cblx0XHRcdHN0YW5kaW5nTWF0cml4LmZyb21BcnJheSggc3RhZ2VQYXJhbWV0ZXJzLnNpdHRpbmdUb1N0YW5kaW5nVHJhbnNmb3JtICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRzdGFuZGluZ01hdHJpeC5tYWtlVHJhbnNsYXRpb24oIDAsIHNjb3BlLnVzZXJIZWlnaHQsIDAgKTtcblxuXHRcdH1cblxuXG5cdFx0dmFyIHBvc2UgPSBmcmFtZURhdGEucG9zZTtcblx0XHR2YXIgcG9zZU9iamVjdCA9IHBvc2VUYXJnZXQgIT09IG51bGwgPyBwb3NlVGFyZ2V0IDogY2FtZXJhO1xuXG5cdFx0Ly8gV2Ugd2FudCB0byBtYW5pcHVsYXRlIHBvc2VPYmplY3QgYnkgaXRzIHBvc2l0aW9uIGFuZCBxdWF0ZXJuaW9uIGNvbXBvbmVudHMgc2luY2UgdXNlcnMgbWF5IHJlbHkgb24gdGhlbS5cblx0XHRwb3NlT2JqZWN0Lm1hdHJpeC5jb3B5KCBzdGFuZGluZ01hdHJpeCApO1xuXHRcdHBvc2VPYmplY3QubWF0cml4LmRlY29tcG9zZSggcG9zZU9iamVjdC5wb3NpdGlvbiwgcG9zZU9iamVjdC5xdWF0ZXJuaW9uLCBwb3NlT2JqZWN0LnNjYWxlICk7XG5cblx0XHRpZiAoIHBvc2Uub3JpZW50YXRpb24gIT09IG51bGwgKSB7XG5cblx0XHRcdHRlbXBRdWF0ZXJuaW9uLmZyb21BcnJheSggcG9zZS5vcmllbnRhdGlvbiApO1xuXHRcdFx0cG9zZU9iamVjdC5xdWF0ZXJuaW9uLm11bHRpcGx5KCB0ZW1wUXVhdGVybmlvbiApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBwb3NlLnBvc2l0aW9uICE9PSBudWxsICkge1xuXG5cdFx0XHR0ZW1wUXVhdGVybmlvbi5zZXRGcm9tUm90YXRpb25NYXRyaXgoIHN0YW5kaW5nTWF0cml4ICk7XG5cdFx0XHR0ZW1wUG9zaXRpb24uZnJvbUFycmF5KCBwb3NlLnBvc2l0aW9uICk7XG5cdFx0XHR0ZW1wUG9zaXRpb24uYXBwbHlRdWF0ZXJuaW9uKCB0ZW1wUXVhdGVybmlvbiApO1xuXHRcdFx0cG9zZU9iamVjdC5wb3NpdGlvbi5hZGQoIHRlbXBQb3NpdGlvbiApO1xuXG5cdFx0fVxuXG5cdFx0cG9zZU9iamVjdC51cGRhdGVNYXRyaXhXb3JsZCgpO1xuXG5cdFx0aWYgKCBkZXZpY2UuaXNQcmVzZW50aW5nID09PSBmYWxzZSApIHJldHVybiBjYW1lcmE7XG5cblx0XHQvL1xuXG5cdFx0Y2FtZXJhTC5uZWFyID0gY2FtZXJhLm5lYXI7XG5cdFx0Y2FtZXJhUi5uZWFyID0gY2FtZXJhLm5lYXI7XG5cblx0XHRjYW1lcmFMLmZhciA9IGNhbWVyYS5mYXI7XG5cdFx0Y2FtZXJhUi5mYXIgPSBjYW1lcmEuZmFyO1xuXG5cdFx0Y2FtZXJhVlIubWF0cml4V29ybGQuY29weSggY2FtZXJhLm1hdHJpeFdvcmxkICk7XG5cdFx0Y2FtZXJhVlIubWF0cml4V29ybGRJbnZlcnNlLmNvcHkoIGNhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UgKTtcblxuXHRcdGNhbWVyYUwubWF0cml4V29ybGRJbnZlcnNlLmZyb21BcnJheSggZnJhbWVEYXRhLmxlZnRWaWV3TWF0cml4ICk7XG5cdFx0Y2FtZXJhUi5tYXRyaXhXb3JsZEludmVyc2UuZnJvbUFycmF5KCBmcmFtZURhdGEucmlnaHRWaWV3TWF0cml4ICk7XG5cblx0XHQvLyBUT0RPIChtcmRvb2IpIERvdWJsZSBjaGVjayB0aGlzIGNvZGVcblxuXHRcdHN0YW5kaW5nTWF0cml4SW52ZXJzZS5nZXRJbnZlcnNlKCBzdGFuZGluZ01hdHJpeCApO1xuXG5cdFx0Y2FtZXJhTC5tYXRyaXhXb3JsZEludmVyc2UubXVsdGlwbHkoIHN0YW5kaW5nTWF0cml4SW52ZXJzZSApO1xuXHRcdGNhbWVyYVIubWF0cml4V29ybGRJbnZlcnNlLm11bHRpcGx5KCBzdGFuZGluZ01hdHJpeEludmVyc2UgKTtcblxuXHRcdHZhciBwYXJlbnQgPSBwb3NlT2JqZWN0LnBhcmVudDtcblxuXHRcdGlmICggcGFyZW50ICE9PSBudWxsICkge1xuXG5cdFx0XHRtYXRyaXhXb3JsZEludmVyc2UuZ2V0SW52ZXJzZSggcGFyZW50Lm1hdHJpeFdvcmxkICk7XG5cblx0XHRcdGNhbWVyYUwubWF0cml4V29ybGRJbnZlcnNlLm11bHRpcGx5KCBtYXRyaXhXb3JsZEludmVyc2UgKTtcblx0XHRcdGNhbWVyYVIubWF0cml4V29ybGRJbnZlcnNlLm11bHRpcGx5KCBtYXRyaXhXb3JsZEludmVyc2UgKTtcblxuXHRcdH1cblxuXHRcdC8vIGVudk1hcCBhbmQgTWlycm9yIG5lZWRzIGNhbWVyYS5tYXRyaXhXb3JsZFxuXG5cdFx0Y2FtZXJhTC5tYXRyaXhXb3JsZC5nZXRJbnZlcnNlKCBjYW1lcmFMLm1hdHJpeFdvcmxkSW52ZXJzZSApO1xuXHRcdGNhbWVyYVIubWF0cml4V29ybGQuZ2V0SW52ZXJzZSggY2FtZXJhUi5tYXRyaXhXb3JsZEludmVyc2UgKTtcblxuXHRcdGNhbWVyYUwucHJvamVjdGlvbk1hdHJpeC5mcm9tQXJyYXkoIGZyYW1lRGF0YS5sZWZ0UHJvamVjdGlvbk1hdHJpeCApO1xuXHRcdGNhbWVyYVIucHJvamVjdGlvbk1hdHJpeC5mcm9tQXJyYXkoIGZyYW1lRGF0YS5yaWdodFByb2plY3Rpb25NYXRyaXggKTtcblxuXHRcdC8vIEhBQ0sgKG1yZG9vYilcblx0XHQvLyBodHRwczovL2dpdGh1Yi5jb20vdzNjL3dlYnZyL2lzc3Vlcy8yMDNcblxuXHRcdGNhbWVyYVZSLnByb2plY3Rpb25NYXRyaXguY29weSggY2FtZXJhTC5wcm9qZWN0aW9uTWF0cml4ICk7XG5cblx0XHQvL1xuXG5cdFx0dmFyIGxheWVycyA9IGRldmljZS5nZXRMYXllcnMoKTtcblxuXHRcdGlmICggbGF5ZXJzLmxlbmd0aCApIHtcblxuXHRcdFx0dmFyIGxheWVyID0gbGF5ZXJzWyAwIF07XG5cblx0XHRcdGlmICggbGF5ZXIubGVmdEJvdW5kcyAhPT0gbnVsbCAmJiBsYXllci5sZWZ0Qm91bmRzLmxlbmd0aCA9PT0gNCApIHtcblxuXHRcdFx0XHRjYW1lcmFMLmJvdW5kcy5mcm9tQXJyYXkoIGxheWVyLmxlZnRCb3VuZHMgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGxheWVyLnJpZ2h0Qm91bmRzICE9PSBudWxsICYmIGxheWVyLnJpZ2h0Qm91bmRzLmxlbmd0aCA9PT0gNCApIHtcblxuXHRcdFx0XHRjYW1lcmFSLmJvdW5kcy5mcm9tQXJyYXkoIGxheWVyLnJpZ2h0Qm91bmRzICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiBjYW1lcmFWUjtcblxuXHR9O1xuXG5cdHRoaXMuZ2V0U3RhbmRpbmdNYXRyaXggPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gc3RhbmRpbmdNYXRyaXg7XG5cblx0fTtcblxuXHR0aGlzLnN1Ym1pdEZyYW1lID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0aWYgKCBpc1ByZXNlbnRpbmcoKSApIGRldmljZS5zdWJtaXRGcmFtZSgpO1xuXG5cdH07XG5cblx0dGhpcy5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0aWYgKCB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyApIHtcblxuXHRcdFx0d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoICd2cmRpc3BsYXlwcmVzZW50Y2hhbmdlJywgb25WUkRpc3BsYXlQcmVzZW50Q2hhbmdlICk7XG5cblx0XHR9XG5cblx0fTtcblxufVxuXG4vKipcbiAqIEBhdXRob3Igc3VwZXJlZ2diZXJ0IC8gaHR0cDovL3d3dy5wYXVsYnJ1bnQuY28udWsvXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3Igc3ppbWVrIC8gaHR0cHM6Ly9naXRodWIuY29tL3N6aW1lay9cbiAqIEBhdXRob3IgdHNjaHdcbiAqL1xuXG5mdW5jdGlvbiBXZWJHTFJlbmRlcmVyKCBwYXJhbWV0ZXJzICkge1xuXG5cdGNvbnNvbGUubG9nKCAnVEhSRUUuV2ViR0xSZW5kZXJlcicsIFJFVklTSU9OICk7XG5cblx0cGFyYW1ldGVycyA9IHBhcmFtZXRlcnMgfHwge307XG5cblx0dmFyIF9jYW52YXMgPSBwYXJhbWV0ZXJzLmNhbnZhcyAhPT0gdW5kZWZpbmVkID8gcGFyYW1ldGVycy5jYW52YXMgOiBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJywgJ2NhbnZhcycgKSxcblx0XHRfY29udGV4dCA9IHBhcmFtZXRlcnMuY29udGV4dCAhPT0gdW5kZWZpbmVkID8gcGFyYW1ldGVycy5jb250ZXh0IDogbnVsbCxcblxuXHRcdF9hbHBoYSA9IHBhcmFtZXRlcnMuYWxwaGEgIT09IHVuZGVmaW5lZCA/IHBhcmFtZXRlcnMuYWxwaGEgOiBmYWxzZSxcblx0XHRfZGVwdGggPSBwYXJhbWV0ZXJzLmRlcHRoICE9PSB1bmRlZmluZWQgPyBwYXJhbWV0ZXJzLmRlcHRoIDogdHJ1ZSxcblx0XHRfc3RlbmNpbCA9IHBhcmFtZXRlcnMuc3RlbmNpbCAhPT0gdW5kZWZpbmVkID8gcGFyYW1ldGVycy5zdGVuY2lsIDogdHJ1ZSxcblx0XHRfYW50aWFsaWFzID0gcGFyYW1ldGVycy5hbnRpYWxpYXMgIT09IHVuZGVmaW5lZCA/IHBhcmFtZXRlcnMuYW50aWFsaWFzIDogZmFsc2UsXG5cdFx0X3ByZW11bHRpcGxpZWRBbHBoYSA9IHBhcmFtZXRlcnMucHJlbXVsdGlwbGllZEFscGhhICE9PSB1bmRlZmluZWQgPyBwYXJhbWV0ZXJzLnByZW11bHRpcGxpZWRBbHBoYSA6IHRydWUsXG5cdFx0X3ByZXNlcnZlRHJhd2luZ0J1ZmZlciA9IHBhcmFtZXRlcnMucHJlc2VydmVEcmF3aW5nQnVmZmVyICE9PSB1bmRlZmluZWQgPyBwYXJhbWV0ZXJzLnByZXNlcnZlRHJhd2luZ0J1ZmZlciA6IGZhbHNlLFxuXHRcdF9wb3dlclByZWZlcmVuY2UgPSBwYXJhbWV0ZXJzLnBvd2VyUHJlZmVyZW5jZSAhPT0gdW5kZWZpbmVkID8gcGFyYW1ldGVycy5wb3dlclByZWZlcmVuY2UgOiAnZGVmYXVsdCc7XG5cblx0dmFyIGN1cnJlbnRSZW5kZXJMaXN0ID0gbnVsbDtcblx0dmFyIGN1cnJlbnRSZW5kZXJTdGF0ZSA9IG51bGw7XG5cblx0Ly8gcHVibGljIHByb3BlcnRpZXNcblxuXHR0aGlzLmRvbUVsZW1lbnQgPSBfY2FudmFzO1xuXHR0aGlzLmNvbnRleHQgPSBudWxsO1xuXG5cdC8vIGNsZWFyaW5nXG5cblx0dGhpcy5hdXRvQ2xlYXIgPSB0cnVlO1xuXHR0aGlzLmF1dG9DbGVhckNvbG9yID0gdHJ1ZTtcblx0dGhpcy5hdXRvQ2xlYXJEZXB0aCA9IHRydWU7XG5cdHRoaXMuYXV0b0NsZWFyU3RlbmNpbCA9IHRydWU7XG5cblx0Ly8gc2NlbmUgZ3JhcGhcblxuXHR0aGlzLnNvcnRPYmplY3RzID0gdHJ1ZTtcblxuXHQvLyB1c2VyLWRlZmluZWQgY2xpcHBpbmdcblxuXHR0aGlzLmNsaXBwaW5nUGxhbmVzID0gW107XG5cdHRoaXMubG9jYWxDbGlwcGluZ0VuYWJsZWQgPSBmYWxzZTtcblxuXHQvLyBwaHlzaWNhbGx5IGJhc2VkIHNoYWRpbmdcblxuXHR0aGlzLmdhbW1hRmFjdG9yID0gMi4wO1x0Ly8gZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG5cdHRoaXMuZ2FtbWFJbnB1dCA9IGZhbHNlO1xuXHR0aGlzLmdhbW1hT3V0cHV0ID0gZmFsc2U7XG5cblx0Ly8gcGh5c2ljYWwgbGlnaHRzXG5cblx0dGhpcy5waHlzaWNhbGx5Q29ycmVjdExpZ2h0cyA9IGZhbHNlO1xuXG5cdC8vIHRvbmUgbWFwcGluZ1xuXG5cdHRoaXMudG9uZU1hcHBpbmcgPSBMaW5lYXJUb25lTWFwcGluZztcblx0dGhpcy50b25lTWFwcGluZ0V4cG9zdXJlID0gMS4wO1xuXHR0aGlzLnRvbmVNYXBwaW5nV2hpdGVQb2ludCA9IDEuMDtcblxuXHQvLyBtb3JwaHNcblxuXHR0aGlzLm1heE1vcnBoVGFyZ2V0cyA9IDg7XG5cdHRoaXMubWF4TW9ycGhOb3JtYWxzID0gNDtcblxuXHQvLyBpbnRlcm5hbCBwcm9wZXJ0aWVzXG5cblx0dmFyIF90aGlzID0gdGhpcyxcblxuXHRcdF9pc0NvbnRleHRMb3N0ID0gZmFsc2UsXG5cblx0XHQvLyBpbnRlcm5hbCBzdGF0ZSBjYWNoZVxuXG5cdFx0X2N1cnJlbnRSZW5kZXJUYXJnZXQgPSBudWxsLFxuXHRcdF9jdXJyZW50RnJhbWVidWZmZXIgPSBudWxsLFxuXHRcdF9jdXJyZW50TWF0ZXJpYWxJZCA9IC0gMSxcblx0XHRfY3VycmVudEdlb21ldHJ5UHJvZ3JhbSA9ICcnLFxuXG5cdFx0X2N1cnJlbnRDYW1lcmEgPSBudWxsLFxuXHRcdF9jdXJyZW50QXJyYXlDYW1lcmEgPSBudWxsLFxuXG5cdFx0X2N1cnJlbnRWaWV3cG9ydCA9IG5ldyBWZWN0b3I0KCksXG5cdFx0X2N1cnJlbnRTY2lzc29yID0gbmV3IFZlY3RvcjQoKSxcblx0XHRfY3VycmVudFNjaXNzb3JUZXN0ID0gbnVsbCxcblxuXHRcdC8vXG5cblx0XHRfdXNlZFRleHR1cmVVbml0cyA9IDAsXG5cblx0XHQvL1xuXG5cdFx0X3dpZHRoID0gX2NhbnZhcy53aWR0aCxcblx0XHRfaGVpZ2h0ID0gX2NhbnZhcy5oZWlnaHQsXG5cblx0XHRfcGl4ZWxSYXRpbyA9IDEsXG5cblx0XHRfdmlld3BvcnQgPSBuZXcgVmVjdG9yNCggMCwgMCwgX3dpZHRoLCBfaGVpZ2h0ICksXG5cdFx0X3NjaXNzb3IgPSBuZXcgVmVjdG9yNCggMCwgMCwgX3dpZHRoLCBfaGVpZ2h0ICksXG5cdFx0X3NjaXNzb3JUZXN0ID0gZmFsc2UsXG5cblx0XHQvLyBmcnVzdHVtXG5cblx0XHRfZnJ1c3R1bSA9IG5ldyBGcnVzdHVtKCksXG5cblx0XHQvLyBjbGlwcGluZ1xuXG5cdFx0X2NsaXBwaW5nID0gbmV3IFdlYkdMQ2xpcHBpbmcoKSxcblx0XHRfY2xpcHBpbmdFbmFibGVkID0gZmFsc2UsXG5cdFx0X2xvY2FsQ2xpcHBpbmdFbmFibGVkID0gZmFsc2UsXG5cblx0XHQvLyBjYW1lcmEgbWF0cmljZXMgY2FjaGVcblxuXHRcdF9wcm9qU2NyZWVuTWF0cml4ID0gbmV3IE1hdHJpeDQoKSxcblxuXHRcdF92ZWN0b3IzID0gbmV3IFZlY3RvcjMoKTtcblxuXHRmdW5jdGlvbiBnZXRUYXJnZXRQaXhlbFJhdGlvKCkge1xuXG5cdFx0cmV0dXJuIF9jdXJyZW50UmVuZGVyVGFyZ2V0ID09PSBudWxsID8gX3BpeGVsUmF0aW8gOiAxO1xuXG5cdH1cblxuXHQvLyBpbml0aWFsaXplXG5cblx0dmFyIF9nbDtcblxuXHR0cnkge1xuXG5cdFx0dmFyIGNvbnRleHRBdHRyaWJ1dGVzID0ge1xuXHRcdFx0YWxwaGE6IF9hbHBoYSxcblx0XHRcdGRlcHRoOiBfZGVwdGgsXG5cdFx0XHRzdGVuY2lsOiBfc3RlbmNpbCxcblx0XHRcdGFudGlhbGlhczogX2FudGlhbGlhcyxcblx0XHRcdHByZW11bHRpcGxpZWRBbHBoYTogX3ByZW11bHRpcGxpZWRBbHBoYSxcblx0XHRcdHByZXNlcnZlRHJhd2luZ0J1ZmZlcjogX3ByZXNlcnZlRHJhd2luZ0J1ZmZlcixcblx0XHRcdHBvd2VyUHJlZmVyZW5jZTogX3Bvd2VyUHJlZmVyZW5jZVxuXHRcdH07XG5cblx0XHQvLyBldmVudCBsaXN0ZW5lcnMgbXVzdCBiZSByZWdpc3RlcmVkIGJlZm9yZSBXZWJHTCBjb250ZXh0IGlzIGNyZWF0ZWQsIHNlZSAjMTI3NTNcblxuXHRcdF9jYW52YXMuYWRkRXZlbnRMaXN0ZW5lciggJ3dlYmdsY29udGV4dGxvc3QnLCBvbkNvbnRleHRMb3N0LCBmYWxzZSApO1xuXHRcdF9jYW52YXMuYWRkRXZlbnRMaXN0ZW5lciggJ3dlYmdsY29udGV4dHJlc3RvcmVkJywgb25Db250ZXh0UmVzdG9yZSwgZmFsc2UgKTtcblxuXHRcdF9nbCA9IF9jb250ZXh0IHx8IF9jYW52YXMuZ2V0Q29udGV4dCggJ3dlYmdsJywgY29udGV4dEF0dHJpYnV0ZXMgKSB8fCBfY2FudmFzLmdldENvbnRleHQoICdleHBlcmltZW50YWwtd2ViZ2wnLCBjb250ZXh0QXR0cmlidXRlcyApO1xuXG5cdFx0aWYgKCBfZ2wgPT09IG51bGwgKSB7XG5cblx0XHRcdGlmICggX2NhbnZhcy5nZXRDb250ZXh0KCAnd2ViZ2wnICkgIT09IG51bGwgKSB7XG5cblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCAnRXJyb3IgY3JlYXRpbmcgV2ViR0wgY29udGV4dCB3aXRoIHlvdXIgc2VsZWN0ZWQgYXR0cmlidXRlcy4nICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCAnRXJyb3IgY3JlYXRpbmcgV2ViR0wgY29udGV4dC4nICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIFNvbWUgZXhwZXJpbWVudGFsLXdlYmdsIGltcGxlbWVudGF0aW9ucyBkbyBub3QgaGF2ZSBnZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXRcblxuXHRcdGlmICggX2dsLmdldFNoYWRlclByZWNpc2lvbkZvcm1hdCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRfZ2wuZ2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0ID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRcdHJldHVybiB7ICdyYW5nZU1pbic6IDEsICdyYW5nZU1heCc6IDEsICdwcmVjaXNpb24nOiAxIH07XG5cblx0XHRcdH07XG5cblx0XHR9XG5cblx0fSBjYXRjaCAoIGVycm9yICkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdMUmVuZGVyZXI6ICcgKyBlcnJvci5tZXNzYWdlICk7XG5cblx0fVxuXG5cdHZhciBleHRlbnNpb25zLCBjYXBhYmlsaXRpZXMsIHN0YXRlLCBpbmZvO1xuXHR2YXIgcHJvcGVydGllcywgdGV4dHVyZXMsIGF0dHJpYnV0ZXMsIGdlb21ldHJpZXMsIG9iamVjdHM7XG5cdHZhciBwcm9ncmFtQ2FjaGUsIHJlbmRlckxpc3RzLCByZW5kZXJTdGF0ZXM7XG5cblx0dmFyIGJhY2tncm91bmQsIG1vcnBodGFyZ2V0cywgYnVmZmVyUmVuZGVyZXIsIGluZGV4ZWRCdWZmZXJSZW5kZXJlcjtcblx0dmFyIHNwcml0ZVJlbmRlcmVyO1xuXG5cdHZhciB1dGlscztcblxuXHRmdW5jdGlvbiBpbml0R0xDb250ZXh0KCkge1xuXG5cdFx0ZXh0ZW5zaW9ucyA9IG5ldyBXZWJHTEV4dGVuc2lvbnMoIF9nbCApO1xuXHRcdGV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfZGVwdGhfdGV4dHVyZScgKTtcblx0XHRleHRlbnNpb25zLmdldCggJ09FU190ZXh0dXJlX2Zsb2F0JyApO1xuXHRcdGV4dGVuc2lvbnMuZ2V0KCAnT0VTX3RleHR1cmVfZmxvYXRfbGluZWFyJyApO1xuXHRcdGV4dGVuc2lvbnMuZ2V0KCAnT0VTX3RleHR1cmVfaGFsZl9mbG9hdCcgKTtcblx0XHRleHRlbnNpb25zLmdldCggJ09FU190ZXh0dXJlX2hhbGZfZmxvYXRfbGluZWFyJyApO1xuXHRcdGV4dGVuc2lvbnMuZ2V0KCAnT0VTX3N0YW5kYXJkX2Rlcml2YXRpdmVzJyApO1xuXHRcdGV4dGVuc2lvbnMuZ2V0KCAnT0VTX2VsZW1lbnRfaW5kZXhfdWludCcgKTtcblx0XHRleHRlbnNpb25zLmdldCggJ0FOR0xFX2luc3RhbmNlZF9hcnJheXMnICk7XG5cblx0XHR1dGlscyA9IG5ldyBXZWJHTFV0aWxzKCBfZ2wsIGV4dGVuc2lvbnMgKTtcblxuXHRcdGNhcGFiaWxpdGllcyA9IG5ldyBXZWJHTENhcGFiaWxpdGllcyggX2dsLCBleHRlbnNpb25zLCBwYXJhbWV0ZXJzICk7XG5cblx0XHRzdGF0ZSA9IG5ldyBXZWJHTFN0YXRlKCBfZ2wsIGV4dGVuc2lvbnMsIHV0aWxzICk7XG5cdFx0c3RhdGUuc2Npc3NvciggX2N1cnJlbnRTY2lzc29yLmNvcHkoIF9zY2lzc29yICkubXVsdGlwbHlTY2FsYXIoIF9waXhlbFJhdGlvICkgKTtcblx0XHRzdGF0ZS52aWV3cG9ydCggX2N1cnJlbnRWaWV3cG9ydC5jb3B5KCBfdmlld3BvcnQgKS5tdWx0aXBseVNjYWxhciggX3BpeGVsUmF0aW8gKSApO1xuXG5cdFx0aW5mbyA9IG5ldyBXZWJHTEluZm8oIF9nbCApO1xuXHRcdHByb3BlcnRpZXMgPSBuZXcgV2ViR0xQcm9wZXJ0aWVzKCk7XG5cdFx0dGV4dHVyZXMgPSBuZXcgV2ViR0xUZXh0dXJlcyggX2dsLCBleHRlbnNpb25zLCBzdGF0ZSwgcHJvcGVydGllcywgY2FwYWJpbGl0aWVzLCB1dGlscywgaW5mbyApO1xuXHRcdGF0dHJpYnV0ZXMgPSBuZXcgV2ViR0xBdHRyaWJ1dGVzKCBfZ2wgKTtcblx0XHRnZW9tZXRyaWVzID0gbmV3IFdlYkdMR2VvbWV0cmllcyggX2dsLCBhdHRyaWJ1dGVzLCBpbmZvICk7XG5cdFx0b2JqZWN0cyA9IG5ldyBXZWJHTE9iamVjdHMoIGdlb21ldHJpZXMsIGluZm8gKTtcblx0XHRtb3JwaHRhcmdldHMgPSBuZXcgV2ViR0xNb3JwaHRhcmdldHMoIF9nbCApO1xuXHRcdHByb2dyYW1DYWNoZSA9IG5ldyBXZWJHTFByb2dyYW1zKCBfdGhpcywgZXh0ZW5zaW9ucywgY2FwYWJpbGl0aWVzICk7XG5cdFx0cmVuZGVyTGlzdHMgPSBuZXcgV2ViR0xSZW5kZXJMaXN0cygpO1xuXHRcdHJlbmRlclN0YXRlcyA9IG5ldyBXZWJHTFJlbmRlclN0YXRlcygpO1xuXG5cdFx0YmFja2dyb3VuZCA9IG5ldyBXZWJHTEJhY2tncm91bmQoIF90aGlzLCBzdGF0ZSwgZ2VvbWV0cmllcywgX3ByZW11bHRpcGxpZWRBbHBoYSApO1xuXG5cdFx0YnVmZmVyUmVuZGVyZXIgPSBuZXcgV2ViR0xCdWZmZXJSZW5kZXJlciggX2dsLCBleHRlbnNpb25zLCBpbmZvICk7XG5cdFx0aW5kZXhlZEJ1ZmZlclJlbmRlcmVyID0gbmV3IFdlYkdMSW5kZXhlZEJ1ZmZlclJlbmRlcmVyKCBfZ2wsIGV4dGVuc2lvbnMsIGluZm8gKTtcblxuXHRcdHNwcml0ZVJlbmRlcmVyID0gbmV3IFdlYkdMU3ByaXRlUmVuZGVyZXIoIF90aGlzLCBfZ2wsIHN0YXRlLCB0ZXh0dXJlcywgY2FwYWJpbGl0aWVzICk7XG5cblx0XHRpbmZvLnByb2dyYW1zID0gcHJvZ3JhbUNhY2hlLnByb2dyYW1zO1xuXG5cdFx0X3RoaXMuY29udGV4dCA9IF9nbDtcblx0XHRfdGhpcy5jYXBhYmlsaXRpZXMgPSBjYXBhYmlsaXRpZXM7XG5cdFx0X3RoaXMuZXh0ZW5zaW9ucyA9IGV4dGVuc2lvbnM7XG5cdFx0X3RoaXMucHJvcGVydGllcyA9IHByb3BlcnRpZXM7XG5cdFx0X3RoaXMucmVuZGVyTGlzdHMgPSByZW5kZXJMaXN0cztcblx0XHRfdGhpcy5zdGF0ZSA9IHN0YXRlO1xuXHRcdF90aGlzLmluZm8gPSBpbmZvO1xuXG5cdH1cblxuXHRpbml0R0xDb250ZXh0KCk7XG5cblx0Ly8gdnJcblxuXHR2YXIgdnIgPSBuZXcgV2ViVlJNYW5hZ2VyKCBfdGhpcyApO1xuXG5cdHRoaXMudnIgPSB2cjtcblxuXHQvLyBzaGFkb3cgbWFwXG5cblx0dmFyIHNoYWRvd01hcCA9IG5ldyBXZWJHTFNoYWRvd01hcCggX3RoaXMsIG9iamVjdHMsIGNhcGFiaWxpdGllcy5tYXhUZXh0dXJlU2l6ZSApO1xuXG5cdHRoaXMuc2hhZG93TWFwID0gc2hhZG93TWFwO1xuXG5cdC8vIEFQSVxuXG5cdHRoaXMuZ2V0Q29udGV4dCA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBfZ2w7XG5cblx0fTtcblxuXHR0aGlzLmdldENvbnRleHRBdHRyaWJ1dGVzID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIF9nbC5nZXRDb250ZXh0QXR0cmlidXRlcygpO1xuXG5cdH07XG5cblx0dGhpcy5mb3JjZUNvbnRleHRMb3NzID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfbG9zZV9jb250ZXh0JyApO1xuXHRcdGlmICggZXh0ZW5zaW9uICkgZXh0ZW5zaW9uLmxvc2VDb250ZXh0KCk7XG5cblx0fTtcblxuXHR0aGlzLmZvcmNlQ29udGV4dFJlc3RvcmUgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9sb3NlX2NvbnRleHQnICk7XG5cdFx0aWYgKCBleHRlbnNpb24gKSBleHRlbnNpb24ucmVzdG9yZUNvbnRleHQoKTtcblxuXHR9O1xuXG5cdHRoaXMuZ2V0UGl4ZWxSYXRpbyA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBfcGl4ZWxSYXRpbztcblxuXHR9O1xuXG5cdHRoaXMuc2V0UGl4ZWxSYXRpbyA9IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRpZiAoIHZhbHVlID09PSB1bmRlZmluZWQgKSByZXR1cm47XG5cblx0XHRfcGl4ZWxSYXRpbyA9IHZhbHVlO1xuXG5cdFx0dGhpcy5zZXRTaXplKCBfd2lkdGgsIF9oZWlnaHQsIGZhbHNlICk7XG5cblx0fTtcblxuXHR0aGlzLmdldFNpemUgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0d2lkdGg6IF93aWR0aCxcblx0XHRcdGhlaWdodDogX2hlaWdodFxuXHRcdH07XG5cblx0fTtcblxuXHR0aGlzLnNldFNpemUgPSBmdW5jdGlvbiAoIHdpZHRoLCBoZWlnaHQsIHVwZGF0ZVN0eWxlICkge1xuXG5cdFx0dmFyIGRldmljZSA9IHZyLmdldERldmljZSgpO1xuXG5cdFx0aWYgKCBkZXZpY2UgJiYgZGV2aWNlLmlzUHJlc2VudGluZyApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogQ2FuXFwndCBjaGFuZ2Ugc2l6ZSB3aGlsZSBWUiBkZXZpY2UgaXMgcHJlc2VudGluZy4nICk7XG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHRfd2lkdGggPSB3aWR0aDtcblx0XHRfaGVpZ2h0ID0gaGVpZ2h0O1xuXG5cdFx0X2NhbnZhcy53aWR0aCA9IHdpZHRoICogX3BpeGVsUmF0aW87XG5cdFx0X2NhbnZhcy5oZWlnaHQgPSBoZWlnaHQgKiBfcGl4ZWxSYXRpbztcblxuXHRcdGlmICggdXBkYXRlU3R5bGUgIT09IGZhbHNlICkge1xuXG5cdFx0XHRfY2FudmFzLnN0eWxlLndpZHRoID0gd2lkdGggKyAncHgnO1xuXHRcdFx0X2NhbnZhcy5zdHlsZS5oZWlnaHQgPSBoZWlnaHQgKyAncHgnO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5zZXRWaWV3cG9ydCggMCwgMCwgd2lkdGgsIGhlaWdodCApO1xuXG5cdH07XG5cblx0dGhpcy5nZXREcmF3aW5nQnVmZmVyU2l6ZSA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB7XG5cdFx0XHR3aWR0aDogX3dpZHRoICogX3BpeGVsUmF0aW8sXG5cdFx0XHRoZWlnaHQ6IF9oZWlnaHQgKiBfcGl4ZWxSYXRpb1xuXHRcdH07XG5cblx0fTtcblxuXHR0aGlzLnNldERyYXdpbmdCdWZmZXJTaXplID0gZnVuY3Rpb24gKCB3aWR0aCwgaGVpZ2h0LCBwaXhlbFJhdGlvICkge1xuXG5cdFx0X3dpZHRoID0gd2lkdGg7XG5cdFx0X2hlaWdodCA9IGhlaWdodDtcblxuXHRcdF9waXhlbFJhdGlvID0gcGl4ZWxSYXRpbztcblxuXHRcdF9jYW52YXMud2lkdGggPSB3aWR0aCAqIHBpeGVsUmF0aW87XG5cdFx0X2NhbnZhcy5oZWlnaHQgPSBoZWlnaHQgKiBwaXhlbFJhdGlvO1xuXG5cdFx0dGhpcy5zZXRWaWV3cG9ydCggMCwgMCwgd2lkdGgsIGhlaWdodCApO1xuXG5cdH07XG5cblx0dGhpcy5nZXRDdXJyZW50Vmlld3BvcnQgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gX2N1cnJlbnRWaWV3cG9ydDtcblxuXHR9O1xuXG5cdHRoaXMuc2V0Vmlld3BvcnQgPSBmdW5jdGlvbiAoIHgsIHksIHdpZHRoLCBoZWlnaHQgKSB7XG5cblx0XHRfdmlld3BvcnQuc2V0KCB4LCBfaGVpZ2h0IC0geSAtIGhlaWdodCwgd2lkdGgsIGhlaWdodCApO1xuXHRcdHN0YXRlLnZpZXdwb3J0KCBfY3VycmVudFZpZXdwb3J0LmNvcHkoIF92aWV3cG9ydCApLm11bHRpcGx5U2NhbGFyKCBfcGl4ZWxSYXRpbyApICk7XG5cblx0fTtcblxuXHR0aGlzLnNldFNjaXNzb3IgPSBmdW5jdGlvbiAoIHgsIHksIHdpZHRoLCBoZWlnaHQgKSB7XG5cblx0XHRfc2Npc3Nvci5zZXQoIHgsIF9oZWlnaHQgLSB5IC0gaGVpZ2h0LCB3aWR0aCwgaGVpZ2h0ICk7XG5cdFx0c3RhdGUuc2Npc3NvciggX2N1cnJlbnRTY2lzc29yLmNvcHkoIF9zY2lzc29yICkubXVsdGlwbHlTY2FsYXIoIF9waXhlbFJhdGlvICkgKTtcblxuXHR9O1xuXG5cdHRoaXMuc2V0U2Npc3NvclRlc3QgPSBmdW5jdGlvbiAoIGJvb2xlYW4gKSB7XG5cblx0XHRzdGF0ZS5zZXRTY2lzc29yVGVzdCggX3NjaXNzb3JUZXN0ID0gYm9vbGVhbiApO1xuXG5cdH07XG5cblx0Ly8gQ2xlYXJpbmdcblxuXHR0aGlzLmdldENsZWFyQ29sb3IgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gYmFja2dyb3VuZC5nZXRDbGVhckNvbG9yKCk7XG5cblx0fTtcblxuXHR0aGlzLnNldENsZWFyQ29sb3IgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRiYWNrZ3JvdW5kLnNldENsZWFyQ29sb3IuYXBwbHkoIGJhY2tncm91bmQsIGFyZ3VtZW50cyApO1xuXG5cdH07XG5cblx0dGhpcy5nZXRDbGVhckFscGhhID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIGJhY2tncm91bmQuZ2V0Q2xlYXJBbHBoYSgpO1xuXG5cdH07XG5cblx0dGhpcy5zZXRDbGVhckFscGhhID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0YmFja2dyb3VuZC5zZXRDbGVhckFscGhhLmFwcGx5KCBiYWNrZ3JvdW5kLCBhcmd1bWVudHMgKTtcblxuXHR9O1xuXG5cdHRoaXMuY2xlYXIgPSBmdW5jdGlvbiAoIGNvbG9yLCBkZXB0aCwgc3RlbmNpbCApIHtcblxuXHRcdHZhciBiaXRzID0gMDtcblxuXHRcdGlmICggY29sb3IgPT09IHVuZGVmaW5lZCB8fCBjb2xvciApIGJpdHMgfD0gX2dsLkNPTE9SX0JVRkZFUl9CSVQ7XG5cdFx0aWYgKCBkZXB0aCA9PT0gdW5kZWZpbmVkIHx8IGRlcHRoICkgYml0cyB8PSBfZ2wuREVQVEhfQlVGRkVSX0JJVDtcblx0XHRpZiAoIHN0ZW5jaWwgPT09IHVuZGVmaW5lZCB8fCBzdGVuY2lsICkgYml0cyB8PSBfZ2wuU1RFTkNJTF9CVUZGRVJfQklUO1xuXG5cdFx0X2dsLmNsZWFyKCBiaXRzICk7XG5cblx0fTtcblxuXHR0aGlzLmNsZWFyQ29sb3IgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLmNsZWFyKCB0cnVlLCBmYWxzZSwgZmFsc2UgKTtcblxuXHR9O1xuXG5cdHRoaXMuY2xlYXJEZXB0aCA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuY2xlYXIoIGZhbHNlLCB0cnVlLCBmYWxzZSApO1xuXG5cdH07XG5cblx0dGhpcy5jbGVhclN0ZW5jaWwgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLmNsZWFyKCBmYWxzZSwgZmFsc2UsIHRydWUgKTtcblxuXHR9O1xuXG5cdHRoaXMuY2xlYXJUYXJnZXQgPSBmdW5jdGlvbiAoIHJlbmRlclRhcmdldCwgY29sb3IsIGRlcHRoLCBzdGVuY2lsICkge1xuXG5cdFx0dGhpcy5zZXRSZW5kZXJUYXJnZXQoIHJlbmRlclRhcmdldCApO1xuXHRcdHRoaXMuY2xlYXIoIGNvbG9yLCBkZXB0aCwgc3RlbmNpbCApO1xuXG5cdH07XG5cblx0Ly9cblxuXHR0aGlzLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRfY2FudmFzLnJlbW92ZUV2ZW50TGlzdGVuZXIoICd3ZWJnbGNvbnRleHRsb3N0Jywgb25Db250ZXh0TG9zdCwgZmFsc2UgKTtcblx0XHRfY2FudmFzLnJlbW92ZUV2ZW50TGlzdGVuZXIoICd3ZWJnbGNvbnRleHRyZXN0b3JlZCcsIG9uQ29udGV4dFJlc3RvcmUsIGZhbHNlICk7XG5cblx0XHRyZW5kZXJMaXN0cy5kaXNwb3NlKCk7XG5cdFx0cmVuZGVyU3RhdGVzLmRpc3Bvc2UoKTtcblx0XHRwcm9wZXJ0aWVzLmRpc3Bvc2UoKTtcblx0XHRvYmplY3RzLmRpc3Bvc2UoKTtcblxuXHRcdHZyLmRpc3Bvc2UoKTtcblxuXHRcdHN0b3BBbmltYXRpb24oKTtcblxuXHR9O1xuXG5cdC8vIEV2ZW50c1xuXG5cdGZ1bmN0aW9uIG9uQ29udGV4dExvc3QoIGV2ZW50ICkge1xuXG5cdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuXHRcdGNvbnNvbGUubG9nKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogQ29udGV4dCBMb3N0LicgKTtcblxuXHRcdF9pc0NvbnRleHRMb3N0ID0gdHJ1ZTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gb25Db250ZXh0UmVzdG9yZSggLyogZXZlbnQgKi8gKSB7XG5cblx0XHRjb25zb2xlLmxvZyggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IENvbnRleHQgUmVzdG9yZWQuJyApO1xuXG5cdFx0X2lzQ29udGV4dExvc3QgPSBmYWxzZTtcblxuXHRcdGluaXRHTENvbnRleHQoKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gb25NYXRlcmlhbERpc3Bvc2UoIGV2ZW50ICkge1xuXG5cdFx0dmFyIG1hdGVyaWFsID0gZXZlbnQudGFyZ2V0O1xuXG5cdFx0bWF0ZXJpYWwucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ2Rpc3Bvc2UnLCBvbk1hdGVyaWFsRGlzcG9zZSApO1xuXG5cdFx0ZGVhbGxvY2F0ZU1hdGVyaWFsKCBtYXRlcmlhbCApO1xuXG5cdH1cblxuXHQvLyBCdWZmZXIgZGVhbGxvY2F0aW9uXG5cblx0ZnVuY3Rpb24gZGVhbGxvY2F0ZU1hdGVyaWFsKCBtYXRlcmlhbCApIHtcblxuXHRcdHJlbGVhc2VNYXRlcmlhbFByb2dyYW1SZWZlcmVuY2UoIG1hdGVyaWFsICk7XG5cblx0XHRwcm9wZXJ0aWVzLnJlbW92ZSggbWF0ZXJpYWwgKTtcblxuXHR9XG5cblxuXHRmdW5jdGlvbiByZWxlYXNlTWF0ZXJpYWxQcm9ncmFtUmVmZXJlbmNlKCBtYXRlcmlhbCApIHtcblxuXHRcdHZhciBwcm9ncmFtSW5mbyA9IHByb3BlcnRpZXMuZ2V0KCBtYXRlcmlhbCApLnByb2dyYW07XG5cblx0XHRtYXRlcmlhbC5wcm9ncmFtID0gdW5kZWZpbmVkO1xuXG5cdFx0aWYgKCBwcm9ncmFtSW5mbyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRwcm9ncmFtQ2FjaGUucmVsZWFzZVByb2dyYW0oIHByb2dyYW1JbmZvICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vIEJ1ZmZlciByZW5kZXJpbmdcblxuXHRmdW5jdGlvbiByZW5kZXJPYmplY3RJbW1lZGlhdGUoIG9iamVjdCwgcHJvZ3JhbSwgbWF0ZXJpYWwgKSB7XG5cblx0XHRvYmplY3QucmVuZGVyKCBmdW5jdGlvbiAoIG9iamVjdCApIHtcblxuXHRcdFx0X3RoaXMucmVuZGVyQnVmZmVySW1tZWRpYXRlKCBvYmplY3QsIHByb2dyYW0sIG1hdGVyaWFsICk7XG5cblx0XHR9ICk7XG5cblx0fVxuXG5cdHRoaXMucmVuZGVyQnVmZmVySW1tZWRpYXRlID0gZnVuY3Rpb24gKCBvYmplY3QsIHByb2dyYW0sIG1hdGVyaWFsICkge1xuXG5cdFx0c3RhdGUuaW5pdEF0dHJpYnV0ZXMoKTtcblxuXHRcdHZhciBidWZmZXJzID0gcHJvcGVydGllcy5nZXQoIG9iamVjdCApO1xuXG5cdFx0aWYgKCBvYmplY3QuaGFzUG9zaXRpb25zICYmICEgYnVmZmVycy5wb3NpdGlvbiApIGJ1ZmZlcnMucG9zaXRpb24gPSBfZ2wuY3JlYXRlQnVmZmVyKCk7XG5cdFx0aWYgKCBvYmplY3QuaGFzTm9ybWFscyAmJiAhIGJ1ZmZlcnMubm9ybWFsICkgYnVmZmVycy5ub3JtYWwgPSBfZ2wuY3JlYXRlQnVmZmVyKCk7XG5cdFx0aWYgKCBvYmplY3QuaGFzVXZzICYmICEgYnVmZmVycy51diApIGJ1ZmZlcnMudXYgPSBfZ2wuY3JlYXRlQnVmZmVyKCk7XG5cdFx0aWYgKCBvYmplY3QuaGFzQ29sb3JzICYmICEgYnVmZmVycy5jb2xvciApIGJ1ZmZlcnMuY29sb3IgPSBfZ2wuY3JlYXRlQnVmZmVyKCk7XG5cblx0XHR2YXIgcHJvZ3JhbUF0dHJpYnV0ZXMgPSBwcm9ncmFtLmdldEF0dHJpYnV0ZXMoKTtcblxuXHRcdGlmICggb2JqZWN0Lmhhc1Bvc2l0aW9ucyApIHtcblxuXHRcdFx0X2dsLmJpbmRCdWZmZXIoIF9nbC5BUlJBWV9CVUZGRVIsIGJ1ZmZlcnMucG9zaXRpb24gKTtcblx0XHRcdF9nbC5idWZmZXJEYXRhKCBfZ2wuQVJSQVlfQlVGRkVSLCBvYmplY3QucG9zaXRpb25BcnJheSwgX2dsLkRZTkFNSUNfRFJBVyApO1xuXG5cdFx0XHRzdGF0ZS5lbmFibGVBdHRyaWJ1dGUoIHByb2dyYW1BdHRyaWJ1dGVzLnBvc2l0aW9uICk7XG5cdFx0XHRfZ2wudmVydGV4QXR0cmliUG9pbnRlciggcHJvZ3JhbUF0dHJpYnV0ZXMucG9zaXRpb24sIDMsIF9nbC5GTE9BVCwgZmFsc2UsIDAsIDAgKTtcblxuXHRcdH1cblxuXHRcdGlmICggb2JqZWN0Lmhhc05vcm1hbHMgKSB7XG5cblx0XHRcdF9nbC5iaW5kQnVmZmVyKCBfZ2wuQVJSQVlfQlVGRkVSLCBidWZmZXJzLm5vcm1hbCApO1xuXG5cdFx0XHRpZiAoICEgbWF0ZXJpYWwuaXNNZXNoUGhvbmdNYXRlcmlhbCAmJlxuXHRcdFx0XHQhIG1hdGVyaWFsLmlzTWVzaFN0YW5kYXJkTWF0ZXJpYWwgJiZcblx0XHRcdFx0ISBtYXRlcmlhbC5pc01lc2hOb3JtYWxNYXRlcmlhbCAmJlxuXHRcdFx0XHRtYXRlcmlhbC5mbGF0U2hhZGluZyA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBvYmplY3QuY291bnQgKiAzOyBpIDwgbDsgaSArPSA5ICkge1xuXG5cdFx0XHRcdFx0dmFyIGFycmF5ID0gb2JqZWN0Lm5vcm1hbEFycmF5O1xuXG5cdFx0XHRcdFx0dmFyIG54ID0gKCBhcnJheVsgaSArIDAgXSArIGFycmF5WyBpICsgMyBdICsgYXJyYXlbIGkgKyA2IF0gKSAvIDM7XG5cdFx0XHRcdFx0dmFyIG55ID0gKCBhcnJheVsgaSArIDEgXSArIGFycmF5WyBpICsgNCBdICsgYXJyYXlbIGkgKyA3IF0gKSAvIDM7XG5cdFx0XHRcdFx0dmFyIG56ID0gKCBhcnJheVsgaSArIDIgXSArIGFycmF5WyBpICsgNSBdICsgYXJyYXlbIGkgKyA4IF0gKSAvIDM7XG5cblx0XHRcdFx0XHRhcnJheVsgaSArIDAgXSA9IG54O1xuXHRcdFx0XHRcdGFycmF5WyBpICsgMSBdID0gbnk7XG5cdFx0XHRcdFx0YXJyYXlbIGkgKyAyIF0gPSBuejtcblxuXHRcdFx0XHRcdGFycmF5WyBpICsgMyBdID0gbng7XG5cdFx0XHRcdFx0YXJyYXlbIGkgKyA0IF0gPSBueTtcblx0XHRcdFx0XHRhcnJheVsgaSArIDUgXSA9IG56O1xuXG5cdFx0XHRcdFx0YXJyYXlbIGkgKyA2IF0gPSBueDtcblx0XHRcdFx0XHRhcnJheVsgaSArIDcgXSA9IG55O1xuXHRcdFx0XHRcdGFycmF5WyBpICsgOCBdID0gbno7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdF9nbC5idWZmZXJEYXRhKCBfZ2wuQVJSQVlfQlVGRkVSLCBvYmplY3Qubm9ybWFsQXJyYXksIF9nbC5EWU5BTUlDX0RSQVcgKTtcblxuXHRcdFx0c3RhdGUuZW5hYmxlQXR0cmlidXRlKCBwcm9ncmFtQXR0cmlidXRlcy5ub3JtYWwgKTtcblxuXHRcdFx0X2dsLnZlcnRleEF0dHJpYlBvaW50ZXIoIHByb2dyYW1BdHRyaWJ1dGVzLm5vcm1hbCwgMywgX2dsLkZMT0FULCBmYWxzZSwgMCwgMCApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBvYmplY3QuaGFzVXZzICYmIG1hdGVyaWFsLm1hcCApIHtcblxuXHRcdFx0X2dsLmJpbmRCdWZmZXIoIF9nbC5BUlJBWV9CVUZGRVIsIGJ1ZmZlcnMudXYgKTtcblx0XHRcdF9nbC5idWZmZXJEYXRhKCBfZ2wuQVJSQVlfQlVGRkVSLCBvYmplY3QudXZBcnJheSwgX2dsLkRZTkFNSUNfRFJBVyApO1xuXG5cdFx0XHRzdGF0ZS5lbmFibGVBdHRyaWJ1dGUoIHByb2dyYW1BdHRyaWJ1dGVzLnV2ICk7XG5cblx0XHRcdF9nbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKCBwcm9ncmFtQXR0cmlidXRlcy51diwgMiwgX2dsLkZMT0FULCBmYWxzZSwgMCwgMCApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBvYmplY3QuaGFzQ29sb3JzICYmIG1hdGVyaWFsLnZlcnRleENvbG9ycyAhPT0gTm9Db2xvcnMgKSB7XG5cblx0XHRcdF9nbC5iaW5kQnVmZmVyKCBfZ2wuQVJSQVlfQlVGRkVSLCBidWZmZXJzLmNvbG9yICk7XG5cdFx0XHRfZ2wuYnVmZmVyRGF0YSggX2dsLkFSUkFZX0JVRkZFUiwgb2JqZWN0LmNvbG9yQXJyYXksIF9nbC5EWU5BTUlDX0RSQVcgKTtcblxuXHRcdFx0c3RhdGUuZW5hYmxlQXR0cmlidXRlKCBwcm9ncmFtQXR0cmlidXRlcy5jb2xvciApO1xuXG5cdFx0XHRfZ2wudmVydGV4QXR0cmliUG9pbnRlciggcHJvZ3JhbUF0dHJpYnV0ZXMuY29sb3IsIDMsIF9nbC5GTE9BVCwgZmFsc2UsIDAsIDAgKTtcblxuXHRcdH1cblxuXHRcdHN0YXRlLmRpc2FibGVVbnVzZWRBdHRyaWJ1dGVzKCk7XG5cblx0XHRfZ2wuZHJhd0FycmF5cyggX2dsLlRSSUFOR0xFUywgMCwgb2JqZWN0LmNvdW50ICk7XG5cblx0XHRvYmplY3QuY291bnQgPSAwO1xuXG5cdH07XG5cblx0dGhpcy5yZW5kZXJCdWZmZXJEaXJlY3QgPSBmdW5jdGlvbiAoIGNhbWVyYSwgZm9nLCBnZW9tZXRyeSwgbWF0ZXJpYWwsIG9iamVjdCwgZ3JvdXAgKSB7XG5cblx0XHR2YXIgZnJvbnRGYWNlQ1cgPSAoIG9iamVjdC5pc01lc2ggJiYgb2JqZWN0Lm1hdHJpeFdvcmxkLmRldGVybWluYW50KCkgPCAwICk7XG5cblx0XHRzdGF0ZS5zZXRNYXRlcmlhbCggbWF0ZXJpYWwsIGZyb250RmFjZUNXICk7XG5cblx0XHR2YXIgcHJvZ3JhbSA9IHNldFByb2dyYW0oIGNhbWVyYSwgZm9nLCBtYXRlcmlhbCwgb2JqZWN0ICk7XG5cdFx0dmFyIGdlb21ldHJ5UHJvZ3JhbSA9IGdlb21ldHJ5LmlkICsgJ18nICsgcHJvZ3JhbS5pZCArICdfJyArICggbWF0ZXJpYWwud2lyZWZyYW1lID09PSB0cnVlICk7XG5cblx0XHR2YXIgdXBkYXRlQnVmZmVycyA9IGZhbHNlO1xuXG5cdFx0aWYgKCBnZW9tZXRyeVByb2dyYW0gIT09IF9jdXJyZW50R2VvbWV0cnlQcm9ncmFtICkge1xuXG5cdFx0XHRfY3VycmVudEdlb21ldHJ5UHJvZ3JhbSA9IGdlb21ldHJ5UHJvZ3JhbTtcblx0XHRcdHVwZGF0ZUJ1ZmZlcnMgPSB0cnVlO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBvYmplY3QubW9ycGhUYXJnZXRJbmZsdWVuY2VzICkge1xuXG5cdFx0XHRtb3JwaHRhcmdldHMudXBkYXRlKCBvYmplY3QsIGdlb21ldHJ5LCBtYXRlcmlhbCwgcHJvZ3JhbSApO1xuXG5cdFx0XHR1cGRhdGVCdWZmZXJzID0gdHJ1ZTtcblxuXHRcdH1cblxuXHRcdC8vXG5cblx0XHR2YXIgaW5kZXggPSBnZW9tZXRyeS5pbmRleDtcblx0XHR2YXIgcG9zaXRpb24gPSBnZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uO1xuXHRcdHZhciByYW5nZUZhY3RvciA9IDE7XG5cblx0XHRpZiAoIG1hdGVyaWFsLndpcmVmcmFtZSA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0aW5kZXggPSBnZW9tZXRyaWVzLmdldFdpcmVmcmFtZUF0dHJpYnV0ZSggZ2VvbWV0cnkgKTtcblx0XHRcdHJhbmdlRmFjdG9yID0gMjtcblxuXHRcdH1cblxuXHRcdHZhciBhdHRyaWJ1dGU7XG5cdFx0dmFyIHJlbmRlcmVyID0gYnVmZmVyUmVuZGVyZXI7XG5cblx0XHRpZiAoIGluZGV4ICE9PSBudWxsICkge1xuXG5cdFx0XHRhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLmdldCggaW5kZXggKTtcblxuXHRcdFx0cmVuZGVyZXIgPSBpbmRleGVkQnVmZmVyUmVuZGVyZXI7XG5cdFx0XHRyZW5kZXJlci5zZXRJbmRleCggYXR0cmlidXRlICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIHVwZGF0ZUJ1ZmZlcnMgKSB7XG5cblx0XHRcdHNldHVwVmVydGV4QXR0cmlidXRlcyggbWF0ZXJpYWwsIHByb2dyYW0sIGdlb21ldHJ5ICk7XG5cblx0XHRcdGlmICggaW5kZXggIT09IG51bGwgKSB7XG5cblx0XHRcdFx0X2dsLmJpbmRCdWZmZXIoIF9nbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgYXR0cmlidXRlLmJ1ZmZlciApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvL1xuXG5cdFx0dmFyIGRhdGFDb3VudCA9IEluZmluaXR5O1xuXG5cdFx0aWYgKCBpbmRleCAhPT0gbnVsbCApIHtcblxuXHRcdFx0ZGF0YUNvdW50ID0gaW5kZXguY291bnQ7XG5cblx0XHR9IGVsc2UgaWYgKCBwb3NpdGlvbiAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRkYXRhQ291bnQgPSBwb3NpdGlvbi5jb3VudDtcblxuXHRcdH1cblxuXHRcdHZhciByYW5nZVN0YXJ0ID0gZ2VvbWV0cnkuZHJhd1JhbmdlLnN0YXJ0ICogcmFuZ2VGYWN0b3I7XG5cdFx0dmFyIHJhbmdlQ291bnQgPSBnZW9tZXRyeS5kcmF3UmFuZ2UuY291bnQgKiByYW5nZUZhY3RvcjtcblxuXHRcdHZhciBncm91cFN0YXJ0ID0gZ3JvdXAgIT09IG51bGwgPyBncm91cC5zdGFydCAqIHJhbmdlRmFjdG9yIDogMDtcblx0XHR2YXIgZ3JvdXBDb3VudCA9IGdyb3VwICE9PSBudWxsID8gZ3JvdXAuY291bnQgKiByYW5nZUZhY3RvciA6IEluZmluaXR5O1xuXG5cdFx0dmFyIGRyYXdTdGFydCA9IE1hdGgubWF4KCByYW5nZVN0YXJ0LCBncm91cFN0YXJ0ICk7XG5cdFx0dmFyIGRyYXdFbmQgPSBNYXRoLm1pbiggZGF0YUNvdW50LCByYW5nZVN0YXJ0ICsgcmFuZ2VDb3VudCwgZ3JvdXBTdGFydCArIGdyb3VwQ291bnQgKSAtIDE7XG5cblx0XHR2YXIgZHJhd0NvdW50ID0gTWF0aC5tYXgoIDAsIGRyYXdFbmQgLSBkcmF3U3RhcnQgKyAxICk7XG5cblx0XHRpZiAoIGRyYXdDb3VudCA9PT0gMCApIHJldHVybjtcblxuXHRcdC8vXG5cblx0XHRpZiAoIG9iamVjdC5pc01lc2ggKSB7XG5cblx0XHRcdGlmICggbWF0ZXJpYWwud2lyZWZyYW1lID09PSB0cnVlICkge1xuXG5cdFx0XHRcdHN0YXRlLnNldExpbmVXaWR0aCggbWF0ZXJpYWwud2lyZWZyYW1lTGluZXdpZHRoICogZ2V0VGFyZ2V0UGl4ZWxSYXRpbygpICk7XG5cdFx0XHRcdHJlbmRlcmVyLnNldE1vZGUoIF9nbC5MSU5FUyApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHN3aXRjaCAoIG9iamVjdC5kcmF3TW9kZSApIHtcblxuXHRcdFx0XHRcdGNhc2UgVHJpYW5nbGVzRHJhd01vZGU6XG5cdFx0XHRcdFx0XHRyZW5kZXJlci5zZXRNb2RlKCBfZ2wuVFJJQU5HTEVTICk7XG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgVHJpYW5nbGVTdHJpcERyYXdNb2RlOlxuXHRcdFx0XHRcdFx0cmVuZGVyZXIuc2V0TW9kZSggX2dsLlRSSUFOR0xFX1NUUklQICk7XG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgVHJpYW5nbGVGYW5EcmF3TW9kZTpcblx0XHRcdFx0XHRcdHJlbmRlcmVyLnNldE1vZGUoIF9nbC5UUklBTkdMRV9GQU4gKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cblx0XHR9IGVsc2UgaWYgKCBvYmplY3QuaXNMaW5lICkge1xuXG5cdFx0XHR2YXIgbGluZVdpZHRoID0gbWF0ZXJpYWwubGluZXdpZHRoO1xuXG5cdFx0XHRpZiAoIGxpbmVXaWR0aCA9PT0gdW5kZWZpbmVkICkgbGluZVdpZHRoID0gMTsgLy8gTm90IHVzaW5nIExpbmUqTWF0ZXJpYWxcblxuXHRcdFx0c3RhdGUuc2V0TGluZVdpZHRoKCBsaW5lV2lkdGggKiBnZXRUYXJnZXRQaXhlbFJhdGlvKCkgKTtcblxuXHRcdFx0aWYgKCBvYmplY3QuaXNMaW5lU2VnbWVudHMgKSB7XG5cblx0XHRcdFx0cmVuZGVyZXIuc2V0TW9kZSggX2dsLkxJTkVTICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIG9iamVjdC5pc0xpbmVMb29wICkge1xuXG5cdFx0XHRcdHJlbmRlcmVyLnNldE1vZGUoIF9nbC5MSU5FX0xPT1AgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRyZW5kZXJlci5zZXRNb2RlKCBfZ2wuTElORV9TVFJJUCApO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2UgaWYgKCBvYmplY3QuaXNQb2ludHMgKSB7XG5cblx0XHRcdHJlbmRlcmVyLnNldE1vZGUoIF9nbC5QT0lOVFMgKTtcblxuXHRcdH1cblxuXHRcdGlmICggZ2VvbWV0cnkgJiYgZ2VvbWV0cnkuaXNJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSApIHtcblxuXHRcdFx0aWYgKCBnZW9tZXRyeS5tYXhJbnN0YW5jZWRDb3VudCA+IDAgKSB7XG5cblx0XHRcdFx0cmVuZGVyZXIucmVuZGVySW5zdGFuY2VzKCBnZW9tZXRyeSwgZHJhd1N0YXJ0LCBkcmF3Q291bnQgKTtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0cmVuZGVyZXIucmVuZGVyKCBkcmF3U3RhcnQsIGRyYXdDb3VudCApO1xuXG5cdFx0fVxuXG5cdH07XG5cblx0ZnVuY3Rpb24gc2V0dXBWZXJ0ZXhBdHRyaWJ1dGVzKCBtYXRlcmlhbCwgcHJvZ3JhbSwgZ2VvbWV0cnkgKSB7XG5cblx0XHRpZiAoIGdlb21ldHJ5ICYmIGdlb21ldHJ5LmlzSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkgKSB7XG5cblx0XHRcdGlmICggZXh0ZW5zaW9ucy5nZXQoICdBTkdMRV9pbnN0YW5jZWRfYXJyYXlzJyApID09PSBudWxsICkge1xuXG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTFJlbmRlcmVyLnNldHVwVmVydGV4QXR0cmlidXRlczogdXNpbmcgVEhSRUUuSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkgYnV0IGhhcmR3YXJlIGRvZXMgbm90IHN1cHBvcnQgZXh0ZW5zaW9uIEFOR0xFX2luc3RhbmNlZF9hcnJheXMuJyApO1xuXHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHN0YXRlLmluaXRBdHRyaWJ1dGVzKCk7XG5cblx0XHR2YXIgZ2VvbWV0cnlBdHRyaWJ1dGVzID0gZ2VvbWV0cnkuYXR0cmlidXRlcztcblxuXHRcdHZhciBwcm9ncmFtQXR0cmlidXRlcyA9IHByb2dyYW0uZ2V0QXR0cmlidXRlcygpO1xuXG5cdFx0dmFyIG1hdGVyaWFsRGVmYXVsdEF0dHJpYnV0ZVZhbHVlcyA9IG1hdGVyaWFsLmRlZmF1bHRBdHRyaWJ1dGVWYWx1ZXM7XG5cblx0XHRmb3IgKCB2YXIgbmFtZSBpbiBwcm9ncmFtQXR0cmlidXRlcyApIHtcblxuXHRcdFx0dmFyIHByb2dyYW1BdHRyaWJ1dGUgPSBwcm9ncmFtQXR0cmlidXRlc1sgbmFtZSBdO1xuXG5cdFx0XHRpZiAoIHByb2dyYW1BdHRyaWJ1dGUgPj0gMCApIHtcblxuXHRcdFx0XHR2YXIgZ2VvbWV0cnlBdHRyaWJ1dGUgPSBnZW9tZXRyeUF0dHJpYnV0ZXNbIG5hbWUgXTtcblxuXHRcdFx0XHRpZiAoIGdlb21ldHJ5QXR0cmlidXRlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHR2YXIgbm9ybWFsaXplZCA9IGdlb21ldHJ5QXR0cmlidXRlLm5vcm1hbGl6ZWQ7XG5cdFx0XHRcdFx0dmFyIHNpemUgPSBnZW9tZXRyeUF0dHJpYnV0ZS5pdGVtU2l6ZTtcblxuXHRcdFx0XHRcdHZhciBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLmdldCggZ2VvbWV0cnlBdHRyaWJ1dGUgKTtcblxuXHRcdFx0XHRcdC8vIFRPRE8gQXR0cmlidXRlIG1heSBub3QgYmUgYXZhaWxhYmxlIG9uIGNvbnRleHQgcmVzdG9yZVxuXG5cdFx0XHRcdFx0aWYgKCBhdHRyaWJ1dGUgPT09IHVuZGVmaW5lZCApIGNvbnRpbnVlO1xuXG5cdFx0XHRcdFx0dmFyIGJ1ZmZlciA9IGF0dHJpYnV0ZS5idWZmZXI7XG5cdFx0XHRcdFx0dmFyIHR5cGUgPSBhdHRyaWJ1dGUudHlwZTtcblx0XHRcdFx0XHR2YXIgYnl0ZXNQZXJFbGVtZW50ID0gYXR0cmlidXRlLmJ5dGVzUGVyRWxlbWVudDtcblxuXHRcdFx0XHRcdGlmICggZ2VvbWV0cnlBdHRyaWJ1dGUuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSApIHtcblxuXHRcdFx0XHRcdFx0dmFyIGRhdGEgPSBnZW9tZXRyeUF0dHJpYnV0ZS5kYXRhO1xuXHRcdFx0XHRcdFx0dmFyIHN0cmlkZSA9IGRhdGEuc3RyaWRlO1xuXHRcdFx0XHRcdFx0dmFyIG9mZnNldCA9IGdlb21ldHJ5QXR0cmlidXRlLm9mZnNldDtcblxuXHRcdFx0XHRcdFx0aWYgKCBkYXRhICYmIGRhdGEuaXNJbnN0YW5jZWRJbnRlcmxlYXZlZEJ1ZmZlciApIHtcblxuXHRcdFx0XHRcdFx0XHRzdGF0ZS5lbmFibGVBdHRyaWJ1dGVBbmREaXZpc29yKCBwcm9ncmFtQXR0cmlidXRlLCBkYXRhLm1lc2hQZXJBdHRyaWJ1dGUgKTtcblxuXHRcdFx0XHRcdFx0XHRpZiAoIGdlb21ldHJ5Lm1heEluc3RhbmNlZENvdW50ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRnZW9tZXRyeS5tYXhJbnN0YW5jZWRDb3VudCA9IGRhdGEubWVzaFBlckF0dHJpYnV0ZSAqIGRhdGEuY291bnQ7XG5cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdHN0YXRlLmVuYWJsZUF0dHJpYnV0ZSggcHJvZ3JhbUF0dHJpYnV0ZSApO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdF9nbC5iaW5kQnVmZmVyKCBfZ2wuQVJSQVlfQlVGRkVSLCBidWZmZXIgKTtcblx0XHRcdFx0XHRcdF9nbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKCBwcm9ncmFtQXR0cmlidXRlLCBzaXplLCB0eXBlLCBub3JtYWxpemVkLCBzdHJpZGUgKiBieXRlc1BlckVsZW1lbnQsIG9mZnNldCAqIGJ5dGVzUGVyRWxlbWVudCApO1xuXG5cdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0aWYgKCBnZW9tZXRyeUF0dHJpYnV0ZS5pc0luc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZSApIHtcblxuXHRcdFx0XHRcdFx0XHRzdGF0ZS5lbmFibGVBdHRyaWJ1dGVBbmREaXZpc29yKCBwcm9ncmFtQXR0cmlidXRlLCBnZW9tZXRyeUF0dHJpYnV0ZS5tZXNoUGVyQXR0cmlidXRlICk7XG5cblx0XHRcdFx0XHRcdFx0aWYgKCBnZW9tZXRyeS5tYXhJbnN0YW5jZWRDb3VudCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0Z2VvbWV0cnkubWF4SW5zdGFuY2VkQ291bnQgPSBnZW9tZXRyeUF0dHJpYnV0ZS5tZXNoUGVyQXR0cmlidXRlICogZ2VvbWV0cnlBdHRyaWJ1dGUuY291bnQ7XG5cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdHN0YXRlLmVuYWJsZUF0dHJpYnV0ZSggcHJvZ3JhbUF0dHJpYnV0ZSApO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdF9nbC5iaW5kQnVmZmVyKCBfZ2wuQVJSQVlfQlVGRkVSLCBidWZmZXIgKTtcblx0XHRcdFx0XHRcdF9nbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKCBwcm9ncmFtQXR0cmlidXRlLCBzaXplLCB0eXBlLCBub3JtYWxpemVkLCAwLCAwICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSBlbHNlIGlmICggbWF0ZXJpYWxEZWZhdWx0QXR0cmlidXRlVmFsdWVzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHR2YXIgdmFsdWUgPSBtYXRlcmlhbERlZmF1bHRBdHRyaWJ1dGVWYWx1ZXNbIG5hbWUgXTtcblxuXHRcdFx0XHRcdGlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdFx0c3dpdGNoICggdmFsdWUubGVuZ3RoICkge1xuXG5cdFx0XHRcdFx0XHRcdGNhc2UgMjpcblx0XHRcdFx0XHRcdFx0XHRfZ2wudmVydGV4QXR0cmliMmZ2KCBwcm9ncmFtQXR0cmlidXRlLCB2YWx1ZSApO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHRcdGNhc2UgMzpcblx0XHRcdFx0XHRcdFx0XHRfZ2wudmVydGV4QXR0cmliM2Z2KCBwcm9ncmFtQXR0cmlidXRlLCB2YWx1ZSApO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHRcdGNhc2UgNDpcblx0XHRcdFx0XHRcdFx0XHRfZ2wudmVydGV4QXR0cmliNGZ2KCBwcm9ncmFtQXR0cmlidXRlLCB2YWx1ZSApO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0XHRcdFx0X2dsLnZlcnRleEF0dHJpYjFmdiggcHJvZ3JhbUF0dHJpYnV0ZSwgdmFsdWUgKTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0c3RhdGUuZGlzYWJsZVVudXNlZEF0dHJpYnV0ZXMoKTtcblxuXHR9XG5cblx0Ly8gQ29tcGlsZVxuXG5cdHRoaXMuY29tcGlsZSA9IGZ1bmN0aW9uICggc2NlbmUsIGNhbWVyYSApIHtcblxuXHRcdGN1cnJlbnRSZW5kZXJTdGF0ZSA9IHJlbmRlclN0YXRlcy5nZXQoIHNjZW5lLCBjYW1lcmEgKTtcblx0XHRjdXJyZW50UmVuZGVyU3RhdGUuaW5pdCgpO1xuXG5cdFx0c2NlbmUudHJhdmVyc2UoIGZ1bmN0aW9uICggb2JqZWN0ICkge1xuXG5cdFx0XHRpZiAoIG9iamVjdC5pc0xpZ2h0ICkge1xuXG5cdFx0XHRcdGN1cnJlbnRSZW5kZXJTdGF0ZS5wdXNoTGlnaHQoIG9iamVjdCApO1xuXG5cdFx0XHRcdGlmICggb2JqZWN0LmNhc3RTaGFkb3cgKSB7XG5cblx0XHRcdFx0XHRjdXJyZW50UmVuZGVyU3RhdGUucHVzaFNoYWRvdyggb2JqZWN0ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9ICk7XG5cblx0XHRjdXJyZW50UmVuZGVyU3RhdGUuc2V0dXBMaWdodHMoIGNhbWVyYSApO1xuXG5cdFx0c2NlbmUudHJhdmVyc2UoIGZ1bmN0aW9uICggb2JqZWN0ICkge1xuXG5cdFx0XHRpZiAoIG9iamVjdC5tYXRlcmlhbCApIHtcblxuXHRcdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIG9iamVjdC5tYXRlcmlhbCApICkge1xuXG5cdFx0XHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgb2JqZWN0Lm1hdGVyaWFsLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0XHRcdFx0aW5pdE1hdGVyaWFsKCBvYmplY3QubWF0ZXJpYWxbIGkgXSwgc2NlbmUuZm9nLCBvYmplY3QgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0aW5pdE1hdGVyaWFsKCBvYmplY3QubWF0ZXJpYWwsIHNjZW5lLmZvZywgb2JqZWN0ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9ICk7XG5cblx0fTtcblxuXHQvLyBBbmltYXRpb24gTG9vcFxuXG5cdHZhciBpc0FuaW1hdGluZyA9IGZhbHNlO1xuXHR2YXIgb25BbmltYXRpb25GcmFtZSA9IG51bGw7XG5cblx0ZnVuY3Rpb24gc3RhcnRBbmltYXRpb24oKSB7XG5cblx0XHRpZiAoIGlzQW5pbWF0aW5nICkgcmV0dXJuO1xuXG5cdFx0cmVxdWVzdEFuaW1hdGlvbkxvb3BGcmFtZSgpO1xuXG5cdFx0aXNBbmltYXRpbmcgPSB0cnVlO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBzdG9wQW5pbWF0aW9uKCkge1xuXG5cdFx0aXNBbmltYXRpbmcgPSBmYWxzZTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVxdWVzdEFuaW1hdGlvbkxvb3BGcmFtZSgpIHtcblxuXHRcdHZhciBkZXZpY2UgPSB2ci5nZXREZXZpY2UoKTtcblxuXHRcdGlmICggZGV2aWNlICYmIGRldmljZS5pc1ByZXNlbnRpbmcgKSB7XG5cblx0XHRcdGRldmljZS5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoIGFuaW1hdGlvbkxvb3AgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoIGFuaW1hdGlvbkxvb3AgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gYW5pbWF0aW9uTG9vcCggdGltZSApIHtcblxuXHRcdGlmICggaXNBbmltYXRpbmcgPT09IGZhbHNlICkgcmV0dXJuO1xuXG5cdFx0b25BbmltYXRpb25GcmFtZSggdGltZSApO1xuXG5cdFx0cmVxdWVzdEFuaW1hdGlvbkxvb3BGcmFtZSgpO1xuXG5cdH1cblxuXHR0aGlzLmFuaW1hdGUgPSBmdW5jdGlvbiAoIGNhbGxiYWNrICkge1xuXG5cdFx0b25BbmltYXRpb25GcmFtZSA9IGNhbGxiYWNrO1xuXHRcdG9uQW5pbWF0aW9uRnJhbWUgIT09IG51bGwgPyBzdGFydEFuaW1hdGlvbigpIDogc3RvcEFuaW1hdGlvbigpO1xuXG5cdH07XG5cblx0Ly8gUmVuZGVyaW5nXG5cblx0dGhpcy5yZW5kZXIgPSBmdW5jdGlvbiAoIHNjZW5lLCBjYW1lcmEsIHJlbmRlclRhcmdldCwgZm9yY2VDbGVhciApIHtcblxuXHRcdGlmICggISAoIGNhbWVyYSAmJiBjYW1lcmEuaXNDYW1lcmEgKSApIHtcblxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdMUmVuZGVyZXIucmVuZGVyOiBjYW1lcmEgaXMgbm90IGFuIGluc3RhbmNlIG9mIFRIUkVFLkNhbWVyYS4nICk7XG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHRpZiAoIF9pc0NvbnRleHRMb3N0ICkgcmV0dXJuO1xuXG5cdFx0Ly8gcmVzZXQgY2FjaGluZyBmb3IgdGhpcyBmcmFtZVxuXG5cdFx0X2N1cnJlbnRHZW9tZXRyeVByb2dyYW0gPSAnJztcblx0XHRfY3VycmVudE1hdGVyaWFsSWQgPSAtIDE7XG5cdFx0X2N1cnJlbnRDYW1lcmEgPSBudWxsO1xuXG5cdFx0Ly8gdXBkYXRlIHNjZW5lIGdyYXBoXG5cblx0XHRpZiAoIHNjZW5lLmF1dG9VcGRhdGUgPT09IHRydWUgKSBzY2VuZS51cGRhdGVNYXRyaXhXb3JsZCgpO1xuXG5cdFx0Ly8gdXBkYXRlIGNhbWVyYSBtYXRyaWNlcyBhbmQgZnJ1c3R1bVxuXG5cdFx0aWYgKCBjYW1lcmEucGFyZW50ID09PSBudWxsICkgY2FtZXJhLnVwZGF0ZU1hdHJpeFdvcmxkKCk7XG5cblx0XHRpZiAoIHZyLmVuYWJsZWQgKSB7XG5cblx0XHRcdGNhbWVyYSA9IHZyLmdldENhbWVyYSggY2FtZXJhICk7XG5cblx0XHR9XG5cblx0XHQvL1xuXG5cdFx0Y3VycmVudFJlbmRlclN0YXRlID0gcmVuZGVyU3RhdGVzLmdldCggc2NlbmUsIGNhbWVyYSApO1xuXHRcdGN1cnJlbnRSZW5kZXJTdGF0ZS5pbml0KCk7XG5cblx0XHRzY2VuZS5vbkJlZm9yZVJlbmRlciggX3RoaXMsIHNjZW5lLCBjYW1lcmEsIHJlbmRlclRhcmdldCApO1xuXG5cdFx0X3Byb2pTY3JlZW5NYXRyaXgubXVsdGlwbHlNYXRyaWNlcyggY2FtZXJhLnByb2plY3Rpb25NYXRyaXgsIGNhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UgKTtcblx0XHRfZnJ1c3R1bS5zZXRGcm9tTWF0cml4KCBfcHJvalNjcmVlbk1hdHJpeCApO1xuXG5cdFx0X2xvY2FsQ2xpcHBpbmdFbmFibGVkID0gdGhpcy5sb2NhbENsaXBwaW5nRW5hYmxlZDtcblx0XHRfY2xpcHBpbmdFbmFibGVkID0gX2NsaXBwaW5nLmluaXQoIHRoaXMuY2xpcHBpbmdQbGFuZXMsIF9sb2NhbENsaXBwaW5nRW5hYmxlZCwgY2FtZXJhICk7XG5cblx0XHRjdXJyZW50UmVuZGVyTGlzdCA9IHJlbmRlckxpc3RzLmdldCggc2NlbmUsIGNhbWVyYSApO1xuXHRcdGN1cnJlbnRSZW5kZXJMaXN0LmluaXQoKTtcblxuXHRcdHByb2plY3RPYmplY3QoIHNjZW5lLCBjYW1lcmEsIF90aGlzLnNvcnRPYmplY3RzICk7XG5cblx0XHRpZiAoIF90aGlzLnNvcnRPYmplY3RzID09PSB0cnVlICkge1xuXG5cdFx0XHRjdXJyZW50UmVuZGVyTGlzdC5zb3J0KCk7XG5cblx0XHR9XG5cblx0XHQvL1xuXG5cdFx0aWYgKCBfY2xpcHBpbmdFbmFibGVkICkgX2NsaXBwaW5nLmJlZ2luU2hhZG93cygpO1xuXG5cdFx0dmFyIHNoYWRvd3NBcnJheSA9IGN1cnJlbnRSZW5kZXJTdGF0ZS5zdGF0ZS5zaGFkb3dzQXJyYXk7XG5cblx0XHRzaGFkb3dNYXAucmVuZGVyKCBzaGFkb3dzQXJyYXksIHNjZW5lLCBjYW1lcmEgKTtcblxuXHRcdGN1cnJlbnRSZW5kZXJTdGF0ZS5zZXR1cExpZ2h0cyggY2FtZXJhICk7XG5cblx0XHRpZiAoIF9jbGlwcGluZ0VuYWJsZWQgKSBfY2xpcHBpbmcuZW5kU2hhZG93cygpO1xuXG5cdFx0Ly9cblxuXHRcdGlmICggdGhpcy5pbmZvLmF1dG9SZXNldCApIHRoaXMuaW5mby5yZXNldCgpO1xuXG5cdFx0aWYgKCByZW5kZXJUYXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0cmVuZGVyVGFyZ2V0ID0gbnVsbDtcblxuXHRcdH1cblxuXHRcdHRoaXMuc2V0UmVuZGVyVGFyZ2V0KCByZW5kZXJUYXJnZXQgKTtcblxuXHRcdC8vXG5cblx0XHRiYWNrZ3JvdW5kLnJlbmRlciggY3VycmVudFJlbmRlckxpc3QsIHNjZW5lLCBjYW1lcmEsIGZvcmNlQ2xlYXIgKTtcblxuXHRcdC8vIHJlbmRlciBzY2VuZVxuXG5cdFx0dmFyIG9wYXF1ZU9iamVjdHMgPSBjdXJyZW50UmVuZGVyTGlzdC5vcGFxdWU7XG5cdFx0dmFyIHRyYW5zcGFyZW50T2JqZWN0cyA9IGN1cnJlbnRSZW5kZXJMaXN0LnRyYW5zcGFyZW50O1xuXG5cdFx0aWYgKCBzY2VuZS5vdmVycmlkZU1hdGVyaWFsICkge1xuXG5cdFx0XHR2YXIgb3ZlcnJpZGVNYXRlcmlhbCA9IHNjZW5lLm92ZXJyaWRlTWF0ZXJpYWw7XG5cblx0XHRcdGlmICggb3BhcXVlT2JqZWN0cy5sZW5ndGggKSByZW5kZXJPYmplY3RzKCBvcGFxdWVPYmplY3RzLCBzY2VuZSwgY2FtZXJhLCBvdmVycmlkZU1hdGVyaWFsICk7XG5cdFx0XHRpZiAoIHRyYW5zcGFyZW50T2JqZWN0cy5sZW5ndGggKSByZW5kZXJPYmplY3RzKCB0cmFuc3BhcmVudE9iamVjdHMsIHNjZW5lLCBjYW1lcmEsIG92ZXJyaWRlTWF0ZXJpYWwgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIG9wYXF1ZSBwYXNzIChmcm9udC10by1iYWNrIG9yZGVyKVxuXG5cdFx0XHRpZiAoIG9wYXF1ZU9iamVjdHMubGVuZ3RoICkgcmVuZGVyT2JqZWN0cyggb3BhcXVlT2JqZWN0cywgc2NlbmUsIGNhbWVyYSApO1xuXG5cdFx0XHQvLyB0cmFuc3BhcmVudCBwYXNzIChiYWNrLXRvLWZyb250IG9yZGVyKVxuXG5cdFx0XHRpZiAoIHRyYW5zcGFyZW50T2JqZWN0cy5sZW5ndGggKSByZW5kZXJPYmplY3RzKCB0cmFuc3BhcmVudE9iamVjdHMsIHNjZW5lLCBjYW1lcmEgKTtcblxuXHRcdH1cblxuXHRcdC8vIGN1c3RvbSByZW5kZXJlcnNcblxuXHRcdHZhciBzcHJpdGVzQXJyYXkgPSBjdXJyZW50UmVuZGVyU3RhdGUuc3RhdGUuc3ByaXRlc0FycmF5O1xuXG5cdFx0c3ByaXRlUmVuZGVyZXIucmVuZGVyKCBzcHJpdGVzQXJyYXksIHNjZW5lLCBjYW1lcmEgKTtcblxuXHRcdC8vIEdlbmVyYXRlIG1pcG1hcCBpZiB3ZSdyZSB1c2luZyBhbnkga2luZCBvZiBtaXBtYXAgZmlsdGVyaW5nXG5cblx0XHRpZiAoIHJlbmRlclRhcmdldCApIHtcblxuXHRcdFx0dGV4dHVyZXMudXBkYXRlUmVuZGVyVGFyZ2V0TWlwbWFwKCByZW5kZXJUYXJnZXQgKTtcblxuXHRcdH1cblxuXHRcdC8vIEVuc3VyZSBkZXB0aCBidWZmZXIgd3JpdGluZyBpcyBlbmFibGVkIHNvIGl0IGNhbiBiZSBjbGVhcmVkIG9uIG5leHQgcmVuZGVyXG5cblx0XHRzdGF0ZS5idWZmZXJzLmRlcHRoLnNldFRlc3QoIHRydWUgKTtcblx0XHRzdGF0ZS5idWZmZXJzLmRlcHRoLnNldE1hc2soIHRydWUgKTtcblx0XHRzdGF0ZS5idWZmZXJzLmNvbG9yLnNldE1hc2soIHRydWUgKTtcblxuXHRcdHN0YXRlLnNldFBvbHlnb25PZmZzZXQoIGZhbHNlICk7XG5cblx0XHRzY2VuZS5vbkFmdGVyUmVuZGVyKCBfdGhpcywgc2NlbmUsIGNhbWVyYSApO1xuXG5cdFx0aWYgKCB2ci5lbmFibGVkICkge1xuXG5cdFx0XHR2ci5zdWJtaXRGcmFtZSgpO1xuXG5cdFx0fVxuXG5cdFx0Ly8gX2dsLmZpbmlzaCgpO1xuXG5cdFx0Y3VycmVudFJlbmRlckxpc3QgPSBudWxsO1xuXHRcdGN1cnJlbnRSZW5kZXJTdGF0ZSA9IG51bGw7XG5cblx0fTtcblxuXHQvKlxuXHQvLyBUT0RPIER1cGxpY2F0ZWQgY29kZSAoRnJ1c3R1bSlcblxuXHR2YXIgX3NwaGVyZSA9IG5ldyBTcGhlcmUoKTtcblxuXHRmdW5jdGlvbiBpc09iamVjdFZpZXdhYmxlKCBvYmplY3QgKSB7XG5cblx0XHR2YXIgZ2VvbWV0cnkgPSBvYmplY3QuZ2VvbWV0cnk7XG5cblx0XHRpZiAoIGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlID09PSBudWxsIClcblx0XHRcdGdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO1xuXG5cdFx0X3NwaGVyZS5jb3B5KCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSApLlxuXHRcdGFwcGx5TWF0cml4NCggb2JqZWN0Lm1hdHJpeFdvcmxkICk7XG5cblx0XHRyZXR1cm4gaXNTcGhlcmVWaWV3YWJsZSggX3NwaGVyZSApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBpc1Nwcml0ZVZpZXdhYmxlKCBzcHJpdGUgKSB7XG5cblx0XHRfc3BoZXJlLmNlbnRlci5zZXQoIDAsIDAsIDAgKTtcblx0XHRfc3BoZXJlLnJhZGl1cyA9IDAuNzA3MTA2NzgxMTg2NTQ3Njtcblx0XHRfc3BoZXJlLmFwcGx5TWF0cml4NCggc3ByaXRlLm1hdHJpeFdvcmxkICk7XG5cblx0XHRyZXR1cm4gaXNTcGhlcmVWaWV3YWJsZSggX3NwaGVyZSApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBpc1NwaGVyZVZpZXdhYmxlKCBzcGhlcmUgKSB7XG5cblx0XHRpZiAoICEgX2ZydXN0dW0uaW50ZXJzZWN0c1NwaGVyZSggc3BoZXJlICkgKSByZXR1cm4gZmFsc2U7XG5cblx0XHR2YXIgbnVtUGxhbmVzID0gX2NsaXBwaW5nLm51bVBsYW5lcztcblxuXHRcdGlmICggbnVtUGxhbmVzID09PSAwICkgcmV0dXJuIHRydWU7XG5cblx0XHR2YXIgcGxhbmVzID0gX3RoaXMuY2xpcHBpbmdQbGFuZXMsXG5cblx0XHRcdGNlbnRlciA9IHNwaGVyZS5jZW50ZXIsXG5cdFx0XHRuZWdSYWQgPSAtIHNwaGVyZS5yYWRpdXMsXG5cdFx0XHRpID0gMDtcblxuXHRcdGRvIHtcblxuXHRcdFx0Ly8gb3V0IHdoZW4gZGVlcGVyIHRoYW4gcmFkaXVzIGluIHRoZSBuZWdhdGl2ZSBoYWxmc3BhY2Vcblx0XHRcdGlmICggcGxhbmVzWyBpIF0uZGlzdGFuY2VUb1BvaW50KCBjZW50ZXIgKSA8IG5lZ1JhZCApIHJldHVybiBmYWxzZTtcblxuXHRcdH0gd2hpbGUgKCArKyBpICE9PSBudW1QbGFuZXMgKTtcblxuXHRcdHJldHVybiB0cnVlO1xuXG5cdH1cblx0Ki9cblxuXHRmdW5jdGlvbiBwcm9qZWN0T2JqZWN0KCBvYmplY3QsIGNhbWVyYSwgc29ydE9iamVjdHMgKSB7XG5cblx0XHRpZiAoIG9iamVjdC52aXNpYmxlID09PSBmYWxzZSApIHJldHVybjtcblxuXHRcdHZhciB2aXNpYmxlID0gb2JqZWN0LmxheWVycy50ZXN0KCBjYW1lcmEubGF5ZXJzICk7XG5cblx0XHRpZiAoIHZpc2libGUgKSB7XG5cblx0XHRcdGlmICggb2JqZWN0LmlzTGlnaHQgKSB7XG5cblx0XHRcdFx0Y3VycmVudFJlbmRlclN0YXRlLnB1c2hMaWdodCggb2JqZWN0ICk7XG5cblx0XHRcdFx0aWYgKCBvYmplY3QuY2FzdFNoYWRvdyApIHtcblxuXHRcdFx0XHRcdGN1cnJlbnRSZW5kZXJTdGF0ZS5wdXNoU2hhZG93KCBvYmplY3QgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSBpZiAoIG9iamVjdC5pc1Nwcml0ZSApIHtcblxuXHRcdFx0XHRpZiAoICEgb2JqZWN0LmZydXN0dW1DdWxsZWQgfHwgX2ZydXN0dW0uaW50ZXJzZWN0c1Nwcml0ZSggb2JqZWN0ICkgKSB7XG5cblx0XHRcdFx0XHRjdXJyZW50UmVuZGVyU3RhdGUucHVzaFNwcml0ZSggb2JqZWN0ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9IGVsc2UgaWYgKCBvYmplY3QuaXNJbW1lZGlhdGVSZW5kZXJPYmplY3QgKSB7XG5cblx0XHRcdFx0aWYgKCBzb3J0T2JqZWN0cyApIHtcblxuXHRcdFx0XHRcdF92ZWN0b3IzLnNldEZyb21NYXRyaXhQb3NpdGlvbiggb2JqZWN0Lm1hdHJpeFdvcmxkIClcblx0XHRcdFx0XHRcdC5hcHBseU1hdHJpeDQoIF9wcm9qU2NyZWVuTWF0cml4ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGN1cnJlbnRSZW5kZXJMaXN0LnB1c2goIG9iamVjdCwgbnVsbCwgb2JqZWN0Lm1hdGVyaWFsLCBfdmVjdG9yMy56LCBudWxsICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIG9iamVjdC5pc01lc2ggfHwgb2JqZWN0LmlzTGluZSB8fCBvYmplY3QuaXNQb2ludHMgKSB7XG5cblx0XHRcdFx0aWYgKCBvYmplY3QuaXNTa2lubmVkTWVzaCApIHtcblxuXHRcdFx0XHRcdG9iamVjdC5za2VsZXRvbi51cGRhdGUoKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCAhIG9iamVjdC5mcnVzdHVtQ3VsbGVkIHx8IF9mcnVzdHVtLmludGVyc2VjdHNPYmplY3QoIG9iamVjdCApICkge1xuXG5cdFx0XHRcdFx0aWYgKCBzb3J0T2JqZWN0cyApIHtcblxuXHRcdFx0XHRcdFx0X3ZlY3RvcjMuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBvYmplY3QubWF0cml4V29ybGQgKVxuXHRcdFx0XHRcdFx0XHQuYXBwbHlNYXRyaXg0KCBfcHJvalNjcmVlbk1hdHJpeCApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0dmFyIGdlb21ldHJ5ID0gb2JqZWN0cy51cGRhdGUoIG9iamVjdCApO1xuXHRcdFx0XHRcdHZhciBtYXRlcmlhbCA9IG9iamVjdC5tYXRlcmlhbDtcblxuXHRcdFx0XHRcdGlmICggQXJyYXkuaXNBcnJheSggbWF0ZXJpYWwgKSApIHtcblxuXHRcdFx0XHRcdFx0dmFyIGdyb3VwcyA9IGdlb21ldHJ5Lmdyb3VwcztcblxuXHRcdFx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gZ3JvdXBzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdFx0dmFyIGdyb3VwID0gZ3JvdXBzWyBpIF07XG5cdFx0XHRcdFx0XHRcdHZhciBncm91cE1hdGVyaWFsID0gbWF0ZXJpYWxbIGdyb3VwLm1hdGVyaWFsSW5kZXggXTtcblxuXHRcdFx0XHRcdFx0XHRpZiAoIGdyb3VwTWF0ZXJpYWwgJiYgZ3JvdXBNYXRlcmlhbC52aXNpYmxlICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0Y3VycmVudFJlbmRlckxpc3QucHVzaCggb2JqZWN0LCBnZW9tZXRyeSwgZ3JvdXBNYXRlcmlhbCwgX3ZlY3RvcjMueiwgZ3JvdXAgKTtcblxuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLnZpc2libGUgKSB7XG5cblx0XHRcdFx0XHRcdGN1cnJlbnRSZW5kZXJMaXN0LnB1c2goIG9iamVjdCwgZ2VvbWV0cnksIG1hdGVyaWFsLCBfdmVjdG9yMy56LCBudWxsICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHR2YXIgY2hpbGRyZW4gPSBvYmplY3QuY2hpbGRyZW47XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRwcm9qZWN0T2JqZWN0KCBjaGlsZHJlblsgaSBdLCBjYW1lcmEsIHNvcnRPYmplY3RzICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlbmRlck9iamVjdHMoIHJlbmRlckxpc3QsIHNjZW5lLCBjYW1lcmEsIG92ZXJyaWRlTWF0ZXJpYWwgKSB7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSByZW5kZXJMaXN0Lmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciByZW5kZXJJdGVtID0gcmVuZGVyTGlzdFsgaSBdO1xuXG5cdFx0XHR2YXIgb2JqZWN0ID0gcmVuZGVySXRlbS5vYmplY3Q7XG5cdFx0XHR2YXIgZ2VvbWV0cnkgPSByZW5kZXJJdGVtLmdlb21ldHJ5O1xuXHRcdFx0dmFyIG1hdGVyaWFsID0gb3ZlcnJpZGVNYXRlcmlhbCA9PT0gdW5kZWZpbmVkID8gcmVuZGVySXRlbS5tYXRlcmlhbCA6IG92ZXJyaWRlTWF0ZXJpYWw7XG5cdFx0XHR2YXIgZ3JvdXAgPSByZW5kZXJJdGVtLmdyb3VwO1xuXG5cdFx0XHRpZiAoIGNhbWVyYS5pc0FycmF5Q2FtZXJhICkge1xuXG5cdFx0XHRcdF9jdXJyZW50QXJyYXlDYW1lcmEgPSBjYW1lcmE7XG5cblx0XHRcdFx0dmFyIGNhbWVyYXMgPSBjYW1lcmEuY2FtZXJhcztcblxuXHRcdFx0XHRmb3IgKCB2YXIgaiA9IDAsIGpsID0gY2FtZXJhcy5sZW5ndGg7IGogPCBqbDsgaiArKyApIHtcblxuXHRcdFx0XHRcdHZhciBjYW1lcmEyID0gY2FtZXJhc1sgaiBdO1xuXG5cdFx0XHRcdFx0aWYgKCBvYmplY3QubGF5ZXJzLnRlc3QoIGNhbWVyYTIubGF5ZXJzICkgKSB7XG5cblx0XHRcdFx0XHRcdHZhciBib3VuZHMgPSBjYW1lcmEyLmJvdW5kcztcblxuXHRcdFx0XHRcdFx0dmFyIHggPSBib3VuZHMueCAqIF93aWR0aDtcblx0XHRcdFx0XHRcdHZhciB5ID0gYm91bmRzLnkgKiBfaGVpZ2h0O1xuXHRcdFx0XHRcdFx0dmFyIHdpZHRoID0gYm91bmRzLnogKiBfd2lkdGg7XG5cdFx0XHRcdFx0XHR2YXIgaGVpZ2h0ID0gYm91bmRzLncgKiBfaGVpZ2h0O1xuXG5cdFx0XHRcdFx0XHRzdGF0ZS52aWV3cG9ydCggX2N1cnJlbnRWaWV3cG9ydC5zZXQoIHgsIHksIHdpZHRoLCBoZWlnaHQgKS5tdWx0aXBseVNjYWxhciggX3BpeGVsUmF0aW8gKSApO1xuXG5cdFx0XHRcdFx0XHRyZW5kZXJPYmplY3QoIG9iamVjdCwgc2NlbmUsIGNhbWVyYTIsIGdlb21ldHJ5LCBtYXRlcmlhbCwgZ3JvdXAgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0X2N1cnJlbnRBcnJheUNhbWVyYSA9IG51bGw7XG5cblx0XHRcdFx0cmVuZGVyT2JqZWN0KCBvYmplY3QsIHNjZW5lLCBjYW1lcmEsIGdlb21ldHJ5LCBtYXRlcmlhbCwgZ3JvdXAgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiByZW5kZXJPYmplY3QoIG9iamVjdCwgc2NlbmUsIGNhbWVyYSwgZ2VvbWV0cnksIG1hdGVyaWFsLCBncm91cCApIHtcblxuXHRcdG9iamVjdC5vbkJlZm9yZVJlbmRlciggX3RoaXMsIHNjZW5lLCBjYW1lcmEsIGdlb21ldHJ5LCBtYXRlcmlhbCwgZ3JvdXAgKTtcblx0XHRjdXJyZW50UmVuZGVyU3RhdGUgPSByZW5kZXJTdGF0ZXMuZ2V0KCBzY2VuZSwgX2N1cnJlbnRBcnJheUNhbWVyYSB8fCBjYW1lcmEgKTtcblxuXHRcdG9iamVjdC5tb2RlbFZpZXdNYXRyaXgubXVsdGlwbHlNYXRyaWNlcyggY2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZSwgb2JqZWN0Lm1hdHJpeFdvcmxkICk7XG5cdFx0b2JqZWN0Lm5vcm1hbE1hdHJpeC5nZXROb3JtYWxNYXRyaXgoIG9iamVjdC5tb2RlbFZpZXdNYXRyaXggKTtcblxuXHRcdGlmICggb2JqZWN0LmlzSW1tZWRpYXRlUmVuZGVyT2JqZWN0ICkge1xuXG5cdFx0XHR2YXIgZnJvbnRGYWNlQ1cgPSAoIG9iamVjdC5pc01lc2ggJiYgb2JqZWN0Lm1hdHJpeFdvcmxkLmRldGVybWluYW50KCkgPCAwICk7XG5cblx0XHRcdHN0YXRlLnNldE1hdGVyaWFsKCBtYXRlcmlhbCwgZnJvbnRGYWNlQ1cgKTtcblxuXHRcdFx0dmFyIHByb2dyYW0gPSBzZXRQcm9ncmFtKCBjYW1lcmEsIHNjZW5lLmZvZywgbWF0ZXJpYWwsIG9iamVjdCApO1xuXG5cdFx0XHRfY3VycmVudEdlb21ldHJ5UHJvZ3JhbSA9ICcnO1xuXG5cdFx0XHRyZW5kZXJPYmplY3RJbW1lZGlhdGUoIG9iamVjdCwgcHJvZ3JhbSwgbWF0ZXJpYWwgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdF90aGlzLnJlbmRlckJ1ZmZlckRpcmVjdCggY2FtZXJhLCBzY2VuZS5mb2csIGdlb21ldHJ5LCBtYXRlcmlhbCwgb2JqZWN0LCBncm91cCApO1xuXG5cdFx0fVxuXG5cdFx0b2JqZWN0Lm9uQWZ0ZXJSZW5kZXIoIF90aGlzLCBzY2VuZSwgY2FtZXJhLCBnZW9tZXRyeSwgbWF0ZXJpYWwsIGdyb3VwICk7XG5cdFx0Y3VycmVudFJlbmRlclN0YXRlID0gcmVuZGVyU3RhdGVzLmdldCggc2NlbmUsIF9jdXJyZW50QXJyYXlDYW1lcmEgfHwgY2FtZXJhICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGluaXRNYXRlcmlhbCggbWF0ZXJpYWwsIGZvZywgb2JqZWN0ICkge1xuXG5cdFx0dmFyIG1hdGVyaWFsUHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCBtYXRlcmlhbCApO1xuXG5cdFx0dmFyIGxpZ2h0cyA9IGN1cnJlbnRSZW5kZXJTdGF0ZS5zdGF0ZS5saWdodHM7XG5cdFx0dmFyIHNoYWRvd3NBcnJheSA9IGN1cnJlbnRSZW5kZXJTdGF0ZS5zdGF0ZS5zaGFkb3dzQXJyYXk7XG5cblx0XHR2YXIgcGFyYW1ldGVycyA9IHByb2dyYW1DYWNoZS5nZXRQYXJhbWV0ZXJzKFxuXHRcdFx0bWF0ZXJpYWwsIGxpZ2h0cy5zdGF0ZSwgc2hhZG93c0FycmF5LCBmb2csIF9jbGlwcGluZy5udW1QbGFuZXMsIF9jbGlwcGluZy5udW1JbnRlcnNlY3Rpb24sIG9iamVjdCApO1xuXG5cdFx0dmFyIGNvZGUgPSBwcm9ncmFtQ2FjaGUuZ2V0UHJvZ3JhbUNvZGUoIG1hdGVyaWFsLCBwYXJhbWV0ZXJzICk7XG5cblx0XHR2YXIgcHJvZ3JhbSA9IG1hdGVyaWFsUHJvcGVydGllcy5wcm9ncmFtO1xuXHRcdHZhciBwcm9ncmFtQ2hhbmdlID0gdHJ1ZTtcblxuXHRcdGlmICggcHJvZ3JhbSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHQvLyBuZXcgbWF0ZXJpYWxcblx0XHRcdG1hdGVyaWFsLmFkZEV2ZW50TGlzdGVuZXIoICdkaXNwb3NlJywgb25NYXRlcmlhbERpc3Bvc2UgKTtcblxuXHRcdH0gZWxzZSBpZiAoIHByb2dyYW0uY29kZSAhPT0gY29kZSApIHtcblxuXHRcdFx0Ly8gY2hhbmdlZCBnbHNsIG9yIHBhcmFtZXRlcnNcblx0XHRcdHJlbGVhc2VNYXRlcmlhbFByb2dyYW1SZWZlcmVuY2UoIG1hdGVyaWFsICk7XG5cblx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbFByb3BlcnRpZXMubGlnaHRzSGFzaCAhPT0gbGlnaHRzLnN0YXRlLmhhc2ggKSB7XG5cblx0XHRcdHByb3BlcnRpZXMudXBkYXRlKCBtYXRlcmlhbCwgJ2xpZ2h0c0hhc2gnLCBsaWdodHMuc3RhdGUuaGFzaCApO1xuXHRcdFx0cHJvZ3JhbUNoYW5nZSA9IGZhbHNlO1xuXG5cdFx0fSBlbHNlIGlmICggcGFyYW1ldGVycy5zaGFkZXJJRCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHQvLyBzYW1lIGdsc2wgYW5kIHVuaWZvcm0gbGlzdFxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gb25seSByZWJ1aWxkIHVuaWZvcm0gbGlzdFxuXHRcdFx0cHJvZ3JhbUNoYW5nZSA9IGZhbHNlO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBwcm9ncmFtQ2hhbmdlICkge1xuXG5cdFx0XHRpZiAoIHBhcmFtZXRlcnMuc2hhZGVySUQgKSB7XG5cblx0XHRcdFx0dmFyIHNoYWRlciA9IFNoYWRlckxpYlsgcGFyYW1ldGVycy5zaGFkZXJJRCBdO1xuXG5cdFx0XHRcdG1hdGVyaWFsUHJvcGVydGllcy5zaGFkZXIgPSB7XG5cdFx0XHRcdFx0bmFtZTogbWF0ZXJpYWwudHlwZSxcblx0XHRcdFx0XHR1bmlmb3JtczogVW5pZm9ybXNVdGlscy5jbG9uZSggc2hhZGVyLnVuaWZvcm1zICksXG5cdFx0XHRcdFx0dmVydGV4U2hhZGVyOiBzaGFkZXIudmVydGV4U2hhZGVyLFxuXHRcdFx0XHRcdGZyYWdtZW50U2hhZGVyOiBzaGFkZXIuZnJhZ21lbnRTaGFkZXJcblx0XHRcdFx0fTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRtYXRlcmlhbFByb3BlcnRpZXMuc2hhZGVyID0ge1xuXHRcdFx0XHRcdG5hbWU6IG1hdGVyaWFsLnR5cGUsXG5cdFx0XHRcdFx0dW5pZm9ybXM6IG1hdGVyaWFsLnVuaWZvcm1zLFxuXHRcdFx0XHRcdHZlcnRleFNoYWRlcjogbWF0ZXJpYWwudmVydGV4U2hhZGVyLFxuXHRcdFx0XHRcdGZyYWdtZW50U2hhZGVyOiBtYXRlcmlhbC5mcmFnbWVudFNoYWRlclxuXHRcdFx0XHR9O1xuXG5cdFx0XHR9XG5cblx0XHRcdG1hdGVyaWFsLm9uQmVmb3JlQ29tcGlsZSggbWF0ZXJpYWxQcm9wZXJ0aWVzLnNoYWRlciwgX3RoaXMgKTtcblxuXHRcdFx0cHJvZ3JhbSA9IHByb2dyYW1DYWNoZS5hY3F1aXJlUHJvZ3JhbSggbWF0ZXJpYWwsIG1hdGVyaWFsUHJvcGVydGllcy5zaGFkZXIsIHBhcmFtZXRlcnMsIGNvZGUgKTtcblxuXHRcdFx0bWF0ZXJpYWxQcm9wZXJ0aWVzLnByb2dyYW0gPSBwcm9ncmFtO1xuXHRcdFx0bWF0ZXJpYWwucHJvZ3JhbSA9IHByb2dyYW07XG5cblx0XHR9XG5cblx0XHR2YXIgcHJvZ3JhbUF0dHJpYnV0ZXMgPSBwcm9ncmFtLmdldEF0dHJpYnV0ZXMoKTtcblxuXHRcdGlmICggbWF0ZXJpYWwubW9ycGhUYXJnZXRzICkge1xuXG5cdFx0XHRtYXRlcmlhbC5udW1TdXBwb3J0ZWRNb3JwaFRhcmdldHMgPSAwO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBfdGhpcy5tYXhNb3JwaFRhcmdldHM7IGkgKysgKSB7XG5cblx0XHRcdFx0aWYgKCBwcm9ncmFtQXR0cmlidXRlc1sgJ21vcnBoVGFyZ2V0JyArIGkgXSA+PSAwICkge1xuXG5cdFx0XHRcdFx0bWF0ZXJpYWwubnVtU3VwcG9ydGVkTW9ycGhUYXJnZXRzICsrO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5tb3JwaE5vcm1hbHMgKSB7XG5cblx0XHRcdG1hdGVyaWFsLm51bVN1cHBvcnRlZE1vcnBoTm9ybWFscyA9IDA7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IF90aGlzLm1heE1vcnBoTm9ybWFsczsgaSArKyApIHtcblxuXHRcdFx0XHRpZiAoIHByb2dyYW1BdHRyaWJ1dGVzWyAnbW9ycGhOb3JtYWwnICsgaSBdID49IDAgKSB7XG5cblx0XHRcdFx0XHRtYXRlcmlhbC5udW1TdXBwb3J0ZWRNb3JwaE5vcm1hbHMgKys7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHR2YXIgdW5pZm9ybXMgPSBtYXRlcmlhbFByb3BlcnRpZXMuc2hhZGVyLnVuaWZvcm1zO1xuXG5cdFx0aWYgKCAhIG1hdGVyaWFsLmlzU2hhZGVyTWF0ZXJpYWwgJiZcblx0XHRcdCEgbWF0ZXJpYWwuaXNSYXdTaGFkZXJNYXRlcmlhbCB8fFxuXHRcdFx0bWF0ZXJpYWwuY2xpcHBpbmcgPT09IHRydWUgKSB7XG5cblx0XHRcdG1hdGVyaWFsUHJvcGVydGllcy5udW1DbGlwcGluZ1BsYW5lcyA9IF9jbGlwcGluZy5udW1QbGFuZXM7XG5cdFx0XHRtYXRlcmlhbFByb3BlcnRpZXMubnVtSW50ZXJzZWN0aW9uID0gX2NsaXBwaW5nLm51bUludGVyc2VjdGlvbjtcblx0XHRcdHVuaWZvcm1zLmNsaXBwaW5nUGxhbmVzID0gX2NsaXBwaW5nLnVuaWZvcm07XG5cblx0XHR9XG5cblx0XHRtYXRlcmlhbFByb3BlcnRpZXMuZm9nID0gZm9nO1xuXG5cdFx0Ly8gc3RvcmUgdGhlIGxpZ2h0IHNldHVwIGl0IHdhcyBjcmVhdGVkIGZvclxuXG5cdFx0bWF0ZXJpYWxQcm9wZXJ0aWVzLmxpZ2h0c0hhc2ggPSBsaWdodHMuc3RhdGUuaGFzaDtcblxuXHRcdGlmICggbWF0ZXJpYWwubGlnaHRzICkge1xuXG5cdFx0XHQvLyB3aXJlIHVwIHRoZSBtYXRlcmlhbCB0byB0aGlzIHJlbmRlcmVyJ3MgbGlnaHRpbmcgc3RhdGVcblxuXHRcdFx0dW5pZm9ybXMuYW1iaWVudExpZ2h0Q29sb3IudmFsdWUgPSBsaWdodHMuc3RhdGUuYW1iaWVudDtcblx0XHRcdHVuaWZvcm1zLmRpcmVjdGlvbmFsTGlnaHRzLnZhbHVlID0gbGlnaHRzLnN0YXRlLmRpcmVjdGlvbmFsO1xuXHRcdFx0dW5pZm9ybXMuc3BvdExpZ2h0cy52YWx1ZSA9IGxpZ2h0cy5zdGF0ZS5zcG90O1xuXHRcdFx0dW5pZm9ybXMucmVjdEFyZWFMaWdodHMudmFsdWUgPSBsaWdodHMuc3RhdGUucmVjdEFyZWE7XG5cdFx0XHR1bmlmb3Jtcy5wb2ludExpZ2h0cy52YWx1ZSA9IGxpZ2h0cy5zdGF0ZS5wb2ludDtcblx0XHRcdHVuaWZvcm1zLmhlbWlzcGhlcmVMaWdodHMudmFsdWUgPSBsaWdodHMuc3RhdGUuaGVtaTtcblxuXHRcdFx0dW5pZm9ybXMuZGlyZWN0aW9uYWxTaGFkb3dNYXAudmFsdWUgPSBsaWdodHMuc3RhdGUuZGlyZWN0aW9uYWxTaGFkb3dNYXA7XG5cdFx0XHR1bmlmb3Jtcy5kaXJlY3Rpb25hbFNoYWRvd01hdHJpeC52YWx1ZSA9IGxpZ2h0cy5zdGF0ZS5kaXJlY3Rpb25hbFNoYWRvd01hdHJpeDtcblx0XHRcdHVuaWZvcm1zLnNwb3RTaGFkb3dNYXAudmFsdWUgPSBsaWdodHMuc3RhdGUuc3BvdFNoYWRvd01hcDtcblx0XHRcdHVuaWZvcm1zLnNwb3RTaGFkb3dNYXRyaXgudmFsdWUgPSBsaWdodHMuc3RhdGUuc3BvdFNoYWRvd01hdHJpeDtcblx0XHRcdHVuaWZvcm1zLnBvaW50U2hhZG93TWFwLnZhbHVlID0gbGlnaHRzLnN0YXRlLnBvaW50U2hhZG93TWFwO1xuXHRcdFx0dW5pZm9ybXMucG9pbnRTaGFkb3dNYXRyaXgudmFsdWUgPSBsaWdodHMuc3RhdGUucG9pbnRTaGFkb3dNYXRyaXg7XG5cdFx0XHQvLyBUT0RPIChhYmVsbmF0aW9uKTogYWRkIGFyZWEgbGlnaHRzIHNoYWRvdyBpbmZvIHRvIHVuaWZvcm1zXG5cblx0XHR9XG5cblx0XHR2YXIgcHJvZ1VuaWZvcm1zID0gbWF0ZXJpYWxQcm9wZXJ0aWVzLnByb2dyYW0uZ2V0VW5pZm9ybXMoKSxcblx0XHRcdHVuaWZvcm1zTGlzdCA9XG5cdFx0XHRcdFdlYkdMVW5pZm9ybXMuc2VxV2l0aFZhbHVlKCBwcm9nVW5pZm9ybXMuc2VxLCB1bmlmb3JtcyApO1xuXG5cdFx0bWF0ZXJpYWxQcm9wZXJ0aWVzLnVuaWZvcm1zTGlzdCA9IHVuaWZvcm1zTGlzdDtcblxuXHR9XG5cblx0ZnVuY3Rpb24gc2V0UHJvZ3JhbSggY2FtZXJhLCBmb2csIG1hdGVyaWFsLCBvYmplY3QgKSB7XG5cblx0XHRfdXNlZFRleHR1cmVVbml0cyA9IDA7XG5cblx0XHR2YXIgbWF0ZXJpYWxQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIG1hdGVyaWFsICk7XG5cdFx0dmFyIGxpZ2h0cyA9IGN1cnJlbnRSZW5kZXJTdGF0ZS5zdGF0ZS5saWdodHM7XG5cblx0XHRpZiAoIF9jbGlwcGluZ0VuYWJsZWQgKSB7XG5cblx0XHRcdGlmICggX2xvY2FsQ2xpcHBpbmdFbmFibGVkIHx8IGNhbWVyYSAhPT0gX2N1cnJlbnRDYW1lcmEgKSB7XG5cblx0XHRcdFx0dmFyIHVzZUNhY2hlID1cblx0XHRcdFx0XHRjYW1lcmEgPT09IF9jdXJyZW50Q2FtZXJhICYmXG5cdFx0XHRcdFx0bWF0ZXJpYWwuaWQgPT09IF9jdXJyZW50TWF0ZXJpYWxJZDtcblxuXHRcdFx0XHQvLyB3ZSBtaWdodCB3YW50IHRvIGNhbGwgdGhpcyBmdW5jdGlvbiB3aXRoIHNvbWUgQ2xpcHBpbmdHcm91cFxuXHRcdFx0XHQvLyBvYmplY3QgaW5zdGVhZCBvZiB0aGUgbWF0ZXJpYWwsIG9uY2UgaXQgYmVjb21lcyBmZWFzaWJsZVxuXHRcdFx0XHQvLyAoIzg0NjUsICM4Mzc5KVxuXHRcdFx0XHRfY2xpcHBpbmcuc2V0U3RhdGUoXG5cdFx0XHRcdFx0bWF0ZXJpYWwuY2xpcHBpbmdQbGFuZXMsIG1hdGVyaWFsLmNsaXBJbnRlcnNlY3Rpb24sIG1hdGVyaWFsLmNsaXBTaGFkb3dzLFxuXHRcdFx0XHRcdGNhbWVyYSwgbWF0ZXJpYWxQcm9wZXJ0aWVzLCB1c2VDYWNoZSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLm5lZWRzVXBkYXRlID09PSBmYWxzZSApIHtcblxuXHRcdFx0aWYgKCBtYXRlcmlhbFByb3BlcnRpZXMucHJvZ3JhbSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdG1hdGVyaWFsLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuZm9nICYmIG1hdGVyaWFsUHJvcGVydGllcy5mb2cgIT09IGZvZyApIHtcblxuXHRcdFx0XHRtYXRlcmlhbC5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLmxpZ2h0cyAmJiBtYXRlcmlhbFByb3BlcnRpZXMubGlnaHRzSGFzaCAhPT0gbGlnaHRzLnN0YXRlLmhhc2ggKSB7XG5cblx0XHRcdFx0bWF0ZXJpYWwubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbFByb3BlcnRpZXMubnVtQ2xpcHBpbmdQbGFuZXMgIT09IHVuZGVmaW5lZCAmJlxuXHRcdFx0XHQoIG1hdGVyaWFsUHJvcGVydGllcy5udW1DbGlwcGluZ1BsYW5lcyAhPT0gX2NsaXBwaW5nLm51bVBsYW5lcyB8fFxuXHRcdFx0XHRtYXRlcmlhbFByb3BlcnRpZXMubnVtSW50ZXJzZWN0aW9uICE9PSBfY2xpcHBpbmcubnVtSW50ZXJzZWN0aW9uICkgKSB7XG5cblx0XHRcdFx0bWF0ZXJpYWwubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLm5lZWRzVXBkYXRlICkge1xuXG5cdFx0XHRpbml0TWF0ZXJpYWwoIG1hdGVyaWFsLCBmb2csIG9iamVjdCApO1xuXHRcdFx0bWF0ZXJpYWwubmVlZHNVcGRhdGUgPSBmYWxzZTtcblxuXHRcdH1cblxuXHRcdHZhciByZWZyZXNoUHJvZ3JhbSA9IGZhbHNlO1xuXHRcdHZhciByZWZyZXNoTWF0ZXJpYWwgPSBmYWxzZTtcblx0XHR2YXIgcmVmcmVzaExpZ2h0cyA9IGZhbHNlO1xuXG5cdFx0dmFyIHByb2dyYW0gPSBtYXRlcmlhbFByb3BlcnRpZXMucHJvZ3JhbSxcblx0XHRcdHBfdW5pZm9ybXMgPSBwcm9ncmFtLmdldFVuaWZvcm1zKCksXG5cdFx0XHRtX3VuaWZvcm1zID0gbWF0ZXJpYWxQcm9wZXJ0aWVzLnNoYWRlci51bmlmb3JtcztcblxuXHRcdGlmICggc3RhdGUudXNlUHJvZ3JhbSggcHJvZ3JhbS5wcm9ncmFtICkgKSB7XG5cblx0XHRcdHJlZnJlc2hQcm9ncmFtID0gdHJ1ZTtcblx0XHRcdHJlZnJlc2hNYXRlcmlhbCA9IHRydWU7XG5cdFx0XHRyZWZyZXNoTGlnaHRzID0gdHJ1ZTtcblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwuaWQgIT09IF9jdXJyZW50TWF0ZXJpYWxJZCApIHtcblxuXHRcdFx0X2N1cnJlbnRNYXRlcmlhbElkID0gbWF0ZXJpYWwuaWQ7XG5cblx0XHRcdHJlZnJlc2hNYXRlcmlhbCA9IHRydWU7XG5cblx0XHR9XG5cblx0XHRpZiAoIHJlZnJlc2hQcm9ncmFtIHx8IGNhbWVyYSAhPT0gX2N1cnJlbnRDYW1lcmEgKSB7XG5cblx0XHRcdHBfdW5pZm9ybXMuc2V0VmFsdWUoIF9nbCwgJ3Byb2plY3Rpb25NYXRyaXgnLCBjYW1lcmEucHJvamVjdGlvbk1hdHJpeCApO1xuXG5cdFx0XHRpZiAoIGNhcGFiaWxpdGllcy5sb2dhcml0aG1pY0RlcHRoQnVmZmVyICkge1xuXG5cdFx0XHRcdHBfdW5pZm9ybXMuc2V0VmFsdWUoIF9nbCwgJ2xvZ0RlcHRoQnVmRkMnLFxuXHRcdFx0XHRcdDIuMCAvICggTWF0aC5sb2coIGNhbWVyYS5mYXIgKyAxLjAgKSAvIE1hdGguTE4yICkgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBBdm9pZCB1bm5lZWRlZCB1bmlmb3JtIHVwZGF0ZXMgcGVyIEFycmF5Q2FtZXJhJ3Mgc3ViLWNhbWVyYVxuXG5cdFx0XHRpZiAoIF9jdXJyZW50Q2FtZXJhICE9PSAoIF9jdXJyZW50QXJyYXlDYW1lcmEgfHwgY2FtZXJhICkgKSB7XG5cblx0XHRcdFx0X2N1cnJlbnRDYW1lcmEgPSAoIF9jdXJyZW50QXJyYXlDYW1lcmEgfHwgY2FtZXJhICk7XG5cblx0XHRcdFx0Ly8gbGlnaHRpbmcgdW5pZm9ybXMgZGVwZW5kIG9uIHRoZSBjYW1lcmEgc28gZW5mb3JjZSBhbiB1cGRhdGVcblx0XHRcdFx0Ly8gbm93LCBpbiBjYXNlIHRoaXMgbWF0ZXJpYWwgc3VwcG9ydHMgbGlnaHRzIC0gb3IgbGF0ZXIsIHdoZW5cblx0XHRcdFx0Ly8gdGhlIG5leHQgbWF0ZXJpYWwgdGhhdCBkb2VzIGdldHMgYWN0aXZhdGVkOlxuXG5cdFx0XHRcdHJlZnJlc2hNYXRlcmlhbCA9IHRydWU7XHRcdC8vIHNldCB0byB0cnVlIG9uIG1hdGVyaWFsIGNoYW5nZVxuXHRcdFx0XHRyZWZyZXNoTGlnaHRzID0gdHJ1ZTtcdFx0Ly8gcmVtYWlucyBzZXQgdW50aWwgdXBkYXRlIGRvbmVcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBsb2FkIG1hdGVyaWFsIHNwZWNpZmljIHVuaWZvcm1zXG5cdFx0XHQvLyAoc2hhZGVyIG1hdGVyaWFsIGFsc28gZ2V0cyB0aGVtIGZvciB0aGUgc2FrZSBvZiBnZW5lcmljaXR5KVxuXG5cdFx0XHRpZiAoIG1hdGVyaWFsLmlzU2hhZGVyTWF0ZXJpYWwgfHxcblx0XHRcdFx0bWF0ZXJpYWwuaXNNZXNoUGhvbmdNYXRlcmlhbCB8fFxuXHRcdFx0XHRtYXRlcmlhbC5pc01lc2hTdGFuZGFyZE1hdGVyaWFsIHx8XG5cdFx0XHRcdG1hdGVyaWFsLmVudk1hcCApIHtcblxuXHRcdFx0XHR2YXIgdUNhbVBvcyA9IHBfdW5pZm9ybXMubWFwLmNhbWVyYVBvc2l0aW9uO1xuXG5cdFx0XHRcdGlmICggdUNhbVBvcyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0dUNhbVBvcy5zZXRWYWx1ZSggX2dsLFxuXHRcdFx0XHRcdFx0X3ZlY3RvcjMuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBjYW1lcmEubWF0cml4V29ybGQgKSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIG1hdGVyaWFsLmlzTWVzaFBob25nTWF0ZXJpYWwgfHxcblx0XHRcdFx0bWF0ZXJpYWwuaXNNZXNoTGFtYmVydE1hdGVyaWFsIHx8XG5cdFx0XHRcdG1hdGVyaWFsLmlzTWVzaEJhc2ljTWF0ZXJpYWwgfHxcblx0XHRcdFx0bWF0ZXJpYWwuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbCB8fFxuXHRcdFx0XHRtYXRlcmlhbC5pc1NoYWRlck1hdGVyaWFsIHx8XG5cdFx0XHRcdG1hdGVyaWFsLnNraW5uaW5nICkge1xuXG5cdFx0XHRcdHBfdW5pZm9ybXMuc2V0VmFsdWUoIF9nbCwgJ3ZpZXdNYXRyaXgnLCBjYW1lcmEubWF0cml4V29ybGRJbnZlcnNlICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIHNraW5uaW5nIHVuaWZvcm1zIG11c3QgYmUgc2V0IGV2ZW4gaWYgbWF0ZXJpYWwgZGlkbid0IGNoYW5nZVxuXHRcdC8vIGF1dG8tc2V0dGluZyBvZiB0ZXh0dXJlIHVuaXQgZm9yIGJvbmUgdGV4dHVyZSBtdXN0IGdvIGJlZm9yZSBvdGhlciB0ZXh0dXJlc1xuXHRcdC8vIG5vdCBzdXJlIHdoeSwgYnV0IG90aGVyd2lzZSB3ZWlyZCB0aGluZ3MgaGFwcGVuXG5cblx0XHRpZiAoIG1hdGVyaWFsLnNraW5uaW5nICkge1xuXG5cdFx0XHRwX3VuaWZvcm1zLnNldE9wdGlvbmFsKCBfZ2wsIG9iamVjdCwgJ2JpbmRNYXRyaXgnICk7XG5cdFx0XHRwX3VuaWZvcm1zLnNldE9wdGlvbmFsKCBfZ2wsIG9iamVjdCwgJ2JpbmRNYXRyaXhJbnZlcnNlJyApO1xuXG5cdFx0XHR2YXIgc2tlbGV0b24gPSBvYmplY3Quc2tlbGV0b247XG5cblx0XHRcdGlmICggc2tlbGV0b24gKSB7XG5cblx0XHRcdFx0dmFyIGJvbmVzID0gc2tlbGV0b24uYm9uZXM7XG5cblx0XHRcdFx0aWYgKCBjYXBhYmlsaXRpZXMuZmxvYXRWZXJ0ZXhUZXh0dXJlcyApIHtcblxuXHRcdFx0XHRcdGlmICggc2tlbGV0b24uYm9uZVRleHR1cmUgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdFx0Ly8gbGF5b3V0ICgxIG1hdHJpeCA9IDQgcGl4ZWxzKVxuXHRcdFx0XHRcdFx0Ly8gICAgICBSR0JBIFJHQkEgUkdCQSBSR0JBICg9PiBjb2x1bW4xLCBjb2x1bW4yLCBjb2x1bW4zLCBjb2x1bW40KVxuXHRcdFx0XHRcdFx0Ly8gIHdpdGggIDh4OCAgcGl4ZWwgdGV4dHVyZSBtYXggICAxNiBib25lcyAqIDQgcGl4ZWxzID0gICg4ICogOClcblx0XHRcdFx0XHRcdC8vICAgICAgIDE2eDE2IHBpeGVsIHRleHR1cmUgbWF4ICAgNjQgYm9uZXMgKiA0IHBpeGVscyA9ICgxNiAqIDE2KVxuXHRcdFx0XHRcdFx0Ly8gICAgICAgMzJ4MzIgcGl4ZWwgdGV4dHVyZSBtYXggIDI1NiBib25lcyAqIDQgcGl4ZWxzID0gKDMyICogMzIpXG5cdFx0XHRcdFx0XHQvLyAgICAgICA2NHg2NCBwaXhlbCB0ZXh0dXJlIG1heCAxMDI0IGJvbmVzICogNCBwaXhlbHMgPSAoNjQgKiA2NClcblxuXG5cdFx0XHRcdFx0XHR2YXIgc2l6ZSA9IE1hdGguc3FydCggYm9uZXMubGVuZ3RoICogNCApOyAvLyA0IHBpeGVscyBuZWVkZWQgZm9yIDEgbWF0cml4XG5cdFx0XHRcdFx0XHRzaXplID0gX01hdGguY2VpbFBvd2VyT2ZUd28oIHNpemUgKTtcblx0XHRcdFx0XHRcdHNpemUgPSBNYXRoLm1heCggc2l6ZSwgNCApO1xuXG5cdFx0XHRcdFx0XHR2YXIgYm9uZU1hdHJpY2VzID0gbmV3IEZsb2F0MzJBcnJheSggc2l6ZSAqIHNpemUgKiA0ICk7IC8vIDQgZmxvYXRzIHBlciBSR0JBIHBpeGVsXG5cdFx0XHRcdFx0XHRib25lTWF0cmljZXMuc2V0KCBza2VsZXRvbi5ib25lTWF0cmljZXMgKTsgLy8gY29weSBjdXJyZW50IHZhbHVlc1xuXG5cdFx0XHRcdFx0XHR2YXIgYm9uZVRleHR1cmUgPSBuZXcgRGF0YVRleHR1cmUoIGJvbmVNYXRyaWNlcywgc2l6ZSwgc2l6ZSwgUkdCQUZvcm1hdCwgRmxvYXRUeXBlICk7XG5cdFx0XHRcdFx0XHRib25lVGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdFx0XHRcdHNrZWxldG9uLmJvbmVNYXRyaWNlcyA9IGJvbmVNYXRyaWNlcztcblx0XHRcdFx0XHRcdHNrZWxldG9uLmJvbmVUZXh0dXJlID0gYm9uZVRleHR1cmU7XG5cdFx0XHRcdFx0XHRza2VsZXRvbi5ib25lVGV4dHVyZVNpemUgPSBzaXplO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cF91bmlmb3Jtcy5zZXRWYWx1ZSggX2dsLCAnYm9uZVRleHR1cmUnLCBza2VsZXRvbi5ib25lVGV4dHVyZSApO1xuXHRcdFx0XHRcdHBfdW5pZm9ybXMuc2V0VmFsdWUoIF9nbCwgJ2JvbmVUZXh0dXJlU2l6ZScsIHNrZWxldG9uLmJvbmVUZXh0dXJlU2l6ZSApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRwX3VuaWZvcm1zLnNldE9wdGlvbmFsKCBfZ2wsIHNrZWxldG9uLCAnYm9uZU1hdHJpY2VzJyApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCByZWZyZXNoTWF0ZXJpYWwgKSB7XG5cblx0XHRcdHBfdW5pZm9ybXMuc2V0VmFsdWUoIF9nbCwgJ3RvbmVNYXBwaW5nRXhwb3N1cmUnLCBfdGhpcy50b25lTWFwcGluZ0V4cG9zdXJlICk7XG5cdFx0XHRwX3VuaWZvcm1zLnNldFZhbHVlKCBfZ2wsICd0b25lTWFwcGluZ1doaXRlUG9pbnQnLCBfdGhpcy50b25lTWFwcGluZ1doaXRlUG9pbnQgKTtcblxuXHRcdFx0aWYgKCBtYXRlcmlhbC5saWdodHMgKSB7XG5cblx0XHRcdFx0Ly8gdGhlIGN1cnJlbnQgbWF0ZXJpYWwgcmVxdWlyZXMgbGlnaHRpbmcgaW5mb1xuXG5cdFx0XHRcdC8vIG5vdGU6IGFsbCBsaWdodGluZyB1bmlmb3JtcyBhcmUgYWx3YXlzIHNldCBjb3JyZWN0bHlcblx0XHRcdFx0Ly8gdGhleSBzaW1wbHkgcmVmZXJlbmNlIHRoZSByZW5kZXJlcidzIHN0YXRlIGZvciB0aGVpclxuXHRcdFx0XHQvLyB2YWx1ZXNcblx0XHRcdFx0Ly9cblx0XHRcdFx0Ly8gdXNlIHRoZSBjdXJyZW50IG1hdGVyaWFsJ3MgLm5lZWRzVXBkYXRlIGZsYWdzIHRvIHNldFxuXHRcdFx0XHQvLyB0aGUgR0wgc3RhdGUgd2hlbiByZXF1aXJlZFxuXG5cdFx0XHRcdG1hcmtVbmlmb3Jtc0xpZ2h0c05lZWRzVXBkYXRlKCBtX3VuaWZvcm1zLCByZWZyZXNoTGlnaHRzICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gcmVmcmVzaCB1bmlmb3JtcyBjb21tb24gdG8gc2V2ZXJhbCBtYXRlcmlhbHNcblxuXHRcdFx0aWYgKCBmb2cgJiYgbWF0ZXJpYWwuZm9nICkge1xuXG5cdFx0XHRcdHJlZnJlc2hVbmlmb3Jtc0ZvZyggbV91bmlmb3JtcywgZm9nICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBtYXRlcmlhbC5pc01lc2hCYXNpY01hdGVyaWFsICkge1xuXG5cdFx0XHRcdHJlZnJlc2hVbmlmb3Jtc0NvbW1vbiggbV91bmlmb3JtcywgbWF0ZXJpYWwgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuaXNNZXNoTGFtYmVydE1hdGVyaWFsICkge1xuXG5cdFx0XHRcdHJlZnJlc2hVbmlmb3Jtc0NvbW1vbiggbV91bmlmb3JtcywgbWF0ZXJpYWwgKTtcblx0XHRcdFx0cmVmcmVzaFVuaWZvcm1zTGFtYmVydCggbV91bmlmb3JtcywgbWF0ZXJpYWwgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuaXNNZXNoUGhvbmdNYXRlcmlhbCApIHtcblxuXHRcdFx0XHRyZWZyZXNoVW5pZm9ybXNDb21tb24oIG1fdW5pZm9ybXMsIG1hdGVyaWFsICk7XG5cblx0XHRcdFx0aWYgKCBtYXRlcmlhbC5pc01lc2hUb29uTWF0ZXJpYWwgKSB7XG5cblx0XHRcdFx0XHRyZWZyZXNoVW5pZm9ybXNUb29uKCBtX3VuaWZvcm1zLCBtYXRlcmlhbCApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRyZWZyZXNoVW5pZm9ybXNQaG9uZyggbV91bmlmb3JtcywgbWF0ZXJpYWwgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLmlzTWVzaFN0YW5kYXJkTWF0ZXJpYWwgKSB7XG5cblx0XHRcdFx0cmVmcmVzaFVuaWZvcm1zQ29tbW9uKCBtX3VuaWZvcm1zLCBtYXRlcmlhbCApO1xuXG5cdFx0XHRcdGlmICggbWF0ZXJpYWwuaXNNZXNoUGh5c2ljYWxNYXRlcmlhbCApIHtcblxuXHRcdFx0XHRcdHJlZnJlc2hVbmlmb3Jtc1BoeXNpY2FsKCBtX3VuaWZvcm1zLCBtYXRlcmlhbCApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRyZWZyZXNoVW5pZm9ybXNTdGFuZGFyZCggbV91bmlmb3JtcywgbWF0ZXJpYWwgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLmlzTWVzaERlcHRoTWF0ZXJpYWwgKSB7XG5cblx0XHRcdFx0cmVmcmVzaFVuaWZvcm1zQ29tbW9uKCBtX3VuaWZvcm1zLCBtYXRlcmlhbCApO1xuXHRcdFx0XHRyZWZyZXNoVW5pZm9ybXNEZXB0aCggbV91bmlmb3JtcywgbWF0ZXJpYWwgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuaXNNZXNoRGlzdGFuY2VNYXRlcmlhbCApIHtcblxuXHRcdFx0XHRyZWZyZXNoVW5pZm9ybXNDb21tb24oIG1fdW5pZm9ybXMsIG1hdGVyaWFsICk7XG5cdFx0XHRcdHJlZnJlc2hVbmlmb3Jtc0Rpc3RhbmNlKCBtX3VuaWZvcm1zLCBtYXRlcmlhbCApO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC5pc01lc2hOb3JtYWxNYXRlcmlhbCApIHtcblxuXHRcdFx0XHRyZWZyZXNoVW5pZm9ybXNDb21tb24oIG1fdW5pZm9ybXMsIG1hdGVyaWFsICk7XG5cdFx0XHRcdHJlZnJlc2hVbmlmb3Jtc05vcm1hbCggbV91bmlmb3JtcywgbWF0ZXJpYWwgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuaXNMaW5lQmFzaWNNYXRlcmlhbCApIHtcblxuXHRcdFx0XHRyZWZyZXNoVW5pZm9ybXNMaW5lKCBtX3VuaWZvcm1zLCBtYXRlcmlhbCApO1xuXG5cdFx0XHRcdGlmICggbWF0ZXJpYWwuaXNMaW5lRGFzaGVkTWF0ZXJpYWwgKSB7XG5cblx0XHRcdFx0XHRyZWZyZXNoVW5pZm9ybXNEYXNoKCBtX3VuaWZvcm1zLCBtYXRlcmlhbCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuaXNQb2ludHNNYXRlcmlhbCApIHtcblxuXHRcdFx0XHRyZWZyZXNoVW5pZm9ybXNQb2ludHMoIG1fdW5pZm9ybXMsIG1hdGVyaWFsICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLmlzU2hhZG93TWF0ZXJpYWwgKSB7XG5cblx0XHRcdFx0bV91bmlmb3Jtcy5jb2xvci52YWx1ZSA9IG1hdGVyaWFsLmNvbG9yO1xuXHRcdFx0XHRtX3VuaWZvcm1zLm9wYWNpdHkudmFsdWUgPSBtYXRlcmlhbC5vcGFjaXR5O1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIFJlY3RBcmVhTGlnaHQgVGV4dHVyZVxuXHRcdFx0Ly8gVE9ETyAobXJkb29iKTogRmluZCBhIG5pY2VyIGltcGxlbWVudGF0aW9uXG5cblx0XHRcdGlmICggbV91bmlmb3Jtcy5sdGNfMSAhPT0gdW5kZWZpbmVkICkgbV91bmlmb3Jtcy5sdGNfMS52YWx1ZSA9IFVuaWZvcm1zTGliLkxUQ18xO1xuXHRcdFx0aWYgKCBtX3VuaWZvcm1zLmx0Y18yICE9PSB1bmRlZmluZWQgKSBtX3VuaWZvcm1zLmx0Y18yLnZhbHVlID0gVW5pZm9ybXNMaWIuTFRDXzI7XG5cblx0XHRcdFdlYkdMVW5pZm9ybXMudXBsb2FkKCBfZ2wsIG1hdGVyaWFsUHJvcGVydGllcy51bmlmb3Jtc0xpc3QsIG1fdW5pZm9ybXMsIF90aGlzICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLmlzU2hhZGVyTWF0ZXJpYWwgJiYgbWF0ZXJpYWwudW5pZm9ybXNOZWVkVXBkYXRlID09PSB0cnVlICkge1xuXG5cdFx0XHRXZWJHTFVuaWZvcm1zLnVwbG9hZCggX2dsLCBtYXRlcmlhbFByb3BlcnRpZXMudW5pZm9ybXNMaXN0LCBtX3VuaWZvcm1zLCBfdGhpcyApO1xuXHRcdFx0bWF0ZXJpYWwudW5pZm9ybXNOZWVkVXBkYXRlID0gZmFsc2U7XG5cblx0XHR9XG5cblx0XHQvLyBjb21tb24gbWF0cmljZXNcblxuXHRcdHBfdW5pZm9ybXMuc2V0VmFsdWUoIF9nbCwgJ21vZGVsVmlld01hdHJpeCcsIG9iamVjdC5tb2RlbFZpZXdNYXRyaXggKTtcblx0XHRwX3VuaWZvcm1zLnNldFZhbHVlKCBfZ2wsICdub3JtYWxNYXRyaXgnLCBvYmplY3Qubm9ybWFsTWF0cml4ICk7XG5cdFx0cF91bmlmb3Jtcy5zZXRWYWx1ZSggX2dsLCAnbW9kZWxNYXRyaXgnLCBvYmplY3QubWF0cml4V29ybGQgKTtcblxuXHRcdHJldHVybiBwcm9ncmFtO1xuXG5cdH1cblxuXHQvLyBVbmlmb3JtcyAocmVmcmVzaCB1bmlmb3JtcyBvYmplY3RzKVxuXG5cdGZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc0NvbW1vbiggdW5pZm9ybXMsIG1hdGVyaWFsICkge1xuXG5cdFx0dW5pZm9ybXMub3BhY2l0eS52YWx1ZSA9IG1hdGVyaWFsLm9wYWNpdHk7XG5cblx0XHRpZiAoIG1hdGVyaWFsLmNvbG9yICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5kaWZmdXNlLnZhbHVlID0gbWF0ZXJpYWwuY29sb3I7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLmVtaXNzaXZlICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5lbWlzc2l2ZS52YWx1ZS5jb3B5KCBtYXRlcmlhbC5lbWlzc2l2ZSApLm11bHRpcGx5U2NhbGFyKCBtYXRlcmlhbC5lbWlzc2l2ZUludGVuc2l0eSApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5tYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLm1hcC52YWx1ZSA9IG1hdGVyaWFsLm1hcDtcblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwuYWxwaGFNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmFscGhhTWFwLnZhbHVlID0gbWF0ZXJpYWwuYWxwaGFNYXA7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLnNwZWN1bGFyTWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5zcGVjdWxhck1hcC52YWx1ZSA9IG1hdGVyaWFsLnNwZWN1bGFyTWFwO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5lbnZNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmVudk1hcC52YWx1ZSA9IG1hdGVyaWFsLmVudk1hcDtcblxuXHRcdFx0Ly8gZG9uJ3QgZmxpcCBDdWJlVGV4dHVyZSBlbnZNYXBzLCBmbGlwIGV2ZXJ5dGhpbmcgZWxzZTpcblx0XHRcdC8vICBXZWJHTFJlbmRlclRhcmdldEN1YmUgd2lsbCBiZSBmbGlwcGVkIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuXHRcdFx0Ly8gIFdlYkdMUmVuZGVyVGFyZ2V0Q3ViZS50ZXh0dXJlIHdpbGwgYmUgZmxpcHBlZCBiZWNhdXNlIGl0J3MgYSBUZXh0dXJlIGFuZCBOT1QgYSBDdWJlVGV4dHVyZVxuXHRcdFx0Ly8gdGhpcyBjaGVjayBtdXN0IGJlIGhhbmRsZWQgZGlmZmVyZW50bHksIG9yIHJlbW92ZWQgZW50aXJlbHksIGlmIFdlYkdMUmVuZGVyVGFyZ2V0Q3ViZSB1c2VzIGEgQ3ViZVRleHR1cmUgaW4gdGhlIGZ1dHVyZVxuXHRcdFx0dW5pZm9ybXMuZmxpcEVudk1hcC52YWx1ZSA9ICggISAoIG1hdGVyaWFsLmVudk1hcCAmJiBtYXRlcmlhbC5lbnZNYXAuaXNDdWJlVGV4dHVyZSApICkgPyAxIDogLSAxO1xuXG5cdFx0XHR1bmlmb3Jtcy5yZWZsZWN0aXZpdHkudmFsdWUgPSBtYXRlcmlhbC5yZWZsZWN0aXZpdHk7XG5cdFx0XHR1bmlmb3Jtcy5yZWZyYWN0aW9uUmF0aW8udmFsdWUgPSBtYXRlcmlhbC5yZWZyYWN0aW9uUmF0aW87XG5cblx0XHRcdHVuaWZvcm1zLm1heE1pcExldmVsLnZhbHVlID0gcHJvcGVydGllcy5nZXQoIG1hdGVyaWFsLmVudk1hcCApLl9fbWF4TWlwTGV2ZWw7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLmxpZ2h0TWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5saWdodE1hcC52YWx1ZSA9IG1hdGVyaWFsLmxpZ2h0TWFwO1xuXHRcdFx0dW5pZm9ybXMubGlnaHRNYXBJbnRlbnNpdHkudmFsdWUgPSBtYXRlcmlhbC5saWdodE1hcEludGVuc2l0eTtcblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwuYW9NYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmFvTWFwLnZhbHVlID0gbWF0ZXJpYWwuYW9NYXA7XG5cdFx0XHR1bmlmb3Jtcy5hb01hcEludGVuc2l0eS52YWx1ZSA9IG1hdGVyaWFsLmFvTWFwSW50ZW5zaXR5O1xuXG5cdFx0fVxuXG5cdFx0Ly8gdXYgcmVwZWF0IGFuZCBvZmZzZXQgc2V0dGluZyBwcmlvcml0aWVzXG5cdFx0Ly8gMS4gY29sb3IgbWFwXG5cdFx0Ly8gMi4gc3BlY3VsYXIgbWFwXG5cdFx0Ly8gMy4gbm9ybWFsIG1hcFxuXHRcdC8vIDQuIGJ1bXAgbWFwXG5cdFx0Ly8gNS4gYWxwaGEgbWFwXG5cdFx0Ly8gNi4gZW1pc3NpdmUgbWFwXG5cblx0XHR2YXIgdXZTY2FsZU1hcDtcblxuXHRcdGlmICggbWF0ZXJpYWwubWFwICkge1xuXG5cdFx0XHR1dlNjYWxlTWFwID0gbWF0ZXJpYWwubWFwO1xuXG5cdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuc3BlY3VsYXJNYXAgKSB7XG5cblx0XHRcdHV2U2NhbGVNYXAgPSBtYXRlcmlhbC5zcGVjdWxhck1hcDtcblxuXHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcCApIHtcblxuXHRcdFx0dXZTY2FsZU1hcCA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcDtcblxuXHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLm5vcm1hbE1hcCApIHtcblxuXHRcdFx0dXZTY2FsZU1hcCA9IG1hdGVyaWFsLm5vcm1hbE1hcDtcblxuXHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLmJ1bXBNYXAgKSB7XG5cblx0XHRcdHV2U2NhbGVNYXAgPSBtYXRlcmlhbC5idW1wTWFwO1xuXG5cdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwucm91Z2huZXNzTWFwICkge1xuXG5cdFx0XHR1dlNjYWxlTWFwID0gbWF0ZXJpYWwucm91Z2huZXNzTWFwO1xuXG5cdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwubWV0YWxuZXNzTWFwICkge1xuXG5cdFx0XHR1dlNjYWxlTWFwID0gbWF0ZXJpYWwubWV0YWxuZXNzTWFwO1xuXG5cdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuYWxwaGFNYXAgKSB7XG5cblx0XHRcdHV2U2NhbGVNYXAgPSBtYXRlcmlhbC5hbHBoYU1hcDtcblxuXHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLmVtaXNzaXZlTWFwICkge1xuXG5cdFx0XHR1dlNjYWxlTWFwID0gbWF0ZXJpYWwuZW1pc3NpdmVNYXA7XG5cblx0XHR9XG5cblx0XHRpZiAoIHV2U2NhbGVNYXAgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Ly8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcblx0XHRcdGlmICggdXZTY2FsZU1hcC5pc1dlYkdMUmVuZGVyVGFyZ2V0ICkge1xuXG5cdFx0XHRcdHV2U2NhbGVNYXAgPSB1dlNjYWxlTWFwLnRleHR1cmU7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCB1dlNjYWxlTWFwLm1hdHJpeEF1dG9VcGRhdGUgPT09IHRydWUgKSB7XG5cblx0XHRcdFx0dXZTY2FsZU1hcC51cGRhdGVNYXRyaXgoKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR1bmlmb3Jtcy51dlRyYW5zZm9ybS52YWx1ZS5jb3B5KCB1dlNjYWxlTWFwLm1hdHJpeCApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiByZWZyZXNoVW5pZm9ybXNMaW5lKCB1bmlmb3JtcywgbWF0ZXJpYWwgKSB7XG5cblx0XHR1bmlmb3Jtcy5kaWZmdXNlLnZhbHVlID0gbWF0ZXJpYWwuY29sb3I7XG5cdFx0dW5pZm9ybXMub3BhY2l0eS52YWx1ZSA9IG1hdGVyaWFsLm9wYWNpdHk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc0Rhc2goIHVuaWZvcm1zLCBtYXRlcmlhbCApIHtcblxuXHRcdHVuaWZvcm1zLmRhc2hTaXplLnZhbHVlID0gbWF0ZXJpYWwuZGFzaFNpemU7XG5cdFx0dW5pZm9ybXMudG90YWxTaXplLnZhbHVlID0gbWF0ZXJpYWwuZGFzaFNpemUgKyBtYXRlcmlhbC5nYXBTaXplO1xuXHRcdHVuaWZvcm1zLnNjYWxlLnZhbHVlID0gbWF0ZXJpYWwuc2NhbGU7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc1BvaW50cyggdW5pZm9ybXMsIG1hdGVyaWFsICkge1xuXG5cdFx0dW5pZm9ybXMuZGlmZnVzZS52YWx1ZSA9IG1hdGVyaWFsLmNvbG9yO1xuXHRcdHVuaWZvcm1zLm9wYWNpdHkudmFsdWUgPSBtYXRlcmlhbC5vcGFjaXR5O1xuXHRcdHVuaWZvcm1zLnNpemUudmFsdWUgPSBtYXRlcmlhbC5zaXplICogX3BpeGVsUmF0aW87XG5cdFx0dW5pZm9ybXMuc2NhbGUudmFsdWUgPSBfaGVpZ2h0ICogMC41O1xuXG5cdFx0dW5pZm9ybXMubWFwLnZhbHVlID0gbWF0ZXJpYWwubWFwO1xuXG5cdFx0aWYgKCBtYXRlcmlhbC5tYXAgIT09IG51bGwgKSB7XG5cblx0XHRcdGlmICggbWF0ZXJpYWwubWFwLm1hdHJpeEF1dG9VcGRhdGUgPT09IHRydWUgKSB7XG5cblx0XHRcdFx0bWF0ZXJpYWwubWFwLnVwZGF0ZU1hdHJpeCgpO1xuXG5cdFx0XHR9XG5cblx0XHRcdHVuaWZvcm1zLnV2VHJhbnNmb3JtLnZhbHVlLmNvcHkoIG1hdGVyaWFsLm1hcC5tYXRyaXggKTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVmcmVzaFVuaWZvcm1zRm9nKCB1bmlmb3JtcywgZm9nICkge1xuXG5cdFx0dW5pZm9ybXMuZm9nQ29sb3IudmFsdWUgPSBmb2cuY29sb3I7XG5cblx0XHRpZiAoIGZvZy5pc0ZvZyApIHtcblxuXHRcdFx0dW5pZm9ybXMuZm9nTmVhci52YWx1ZSA9IGZvZy5uZWFyO1xuXHRcdFx0dW5pZm9ybXMuZm9nRmFyLnZhbHVlID0gZm9nLmZhcjtcblxuXHRcdH0gZWxzZSBpZiAoIGZvZy5pc0ZvZ0V4cDIgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmZvZ0RlbnNpdHkudmFsdWUgPSBmb2cuZGVuc2l0eTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVmcmVzaFVuaWZvcm1zTGFtYmVydCggdW5pZm9ybXMsIG1hdGVyaWFsICkge1xuXG5cdFx0aWYgKCBtYXRlcmlhbC5lbWlzc2l2ZU1hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMuZW1pc3NpdmVNYXAudmFsdWUgPSBtYXRlcmlhbC5lbWlzc2l2ZU1hcDtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVmcmVzaFVuaWZvcm1zUGhvbmcoIHVuaWZvcm1zLCBtYXRlcmlhbCApIHtcblxuXHRcdHVuaWZvcm1zLnNwZWN1bGFyLnZhbHVlID0gbWF0ZXJpYWwuc3BlY3VsYXI7XG5cdFx0dW5pZm9ybXMuc2hpbmluZXNzLnZhbHVlID0gTWF0aC5tYXgoIG1hdGVyaWFsLnNoaW5pbmVzcywgMWUtNCApOyAvLyB0byBwcmV2ZW50IHBvdyggMC4wLCAwLjAgKVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5lbWlzc2l2ZU1hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMuZW1pc3NpdmVNYXAudmFsdWUgPSBtYXRlcmlhbC5lbWlzc2l2ZU1hcDtcblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwuYnVtcE1hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMuYnVtcE1hcC52YWx1ZSA9IG1hdGVyaWFsLmJ1bXBNYXA7XG5cdFx0XHR1bmlmb3Jtcy5idW1wU2NhbGUudmFsdWUgPSBtYXRlcmlhbC5idW1wU2NhbGU7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLm5vcm1hbE1hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMubm9ybWFsTWFwLnZhbHVlID0gbWF0ZXJpYWwubm9ybWFsTWFwO1xuXHRcdFx0dW5pZm9ybXMubm9ybWFsU2NhbGUudmFsdWUuY29weSggbWF0ZXJpYWwubm9ybWFsU2NhbGUgKTtcblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5kaXNwbGFjZW1lbnRNYXAudmFsdWUgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRNYXA7XG5cdFx0XHR1bmlmb3Jtcy5kaXNwbGFjZW1lbnRTY2FsZS52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudFNjYWxlO1xuXHRcdFx0dW5pZm9ybXMuZGlzcGxhY2VtZW50Qmlhcy52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudEJpYXM7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc1Rvb24oIHVuaWZvcm1zLCBtYXRlcmlhbCApIHtcblxuXHRcdHJlZnJlc2hVbmlmb3Jtc1Bob25nKCB1bmlmb3JtcywgbWF0ZXJpYWwgKTtcblxuXHRcdGlmICggbWF0ZXJpYWwuZ3JhZGllbnRNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmdyYWRpZW50TWFwLnZhbHVlID0gbWF0ZXJpYWwuZ3JhZGllbnRNYXA7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc1N0YW5kYXJkKCB1bmlmb3JtcywgbWF0ZXJpYWwgKSB7XG5cblx0XHR1bmlmb3Jtcy5yb3VnaG5lc3MudmFsdWUgPSBtYXRlcmlhbC5yb3VnaG5lc3M7XG5cdFx0dW5pZm9ybXMubWV0YWxuZXNzLnZhbHVlID0gbWF0ZXJpYWwubWV0YWxuZXNzO1xuXG5cdFx0aWYgKCBtYXRlcmlhbC5yb3VnaG5lc3NNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLnJvdWdobmVzc01hcC52YWx1ZSA9IG1hdGVyaWFsLnJvdWdobmVzc01hcDtcblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwubWV0YWxuZXNzTWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5tZXRhbG5lc3NNYXAudmFsdWUgPSBtYXRlcmlhbC5tZXRhbG5lc3NNYXA7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLmVtaXNzaXZlTWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5lbWlzc2l2ZU1hcC52YWx1ZSA9IG1hdGVyaWFsLmVtaXNzaXZlTWFwO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5idW1wTWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5idW1wTWFwLnZhbHVlID0gbWF0ZXJpYWwuYnVtcE1hcDtcblx0XHRcdHVuaWZvcm1zLmJ1bXBTY2FsZS52YWx1ZSA9IG1hdGVyaWFsLmJ1bXBTY2FsZTtcblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwubm9ybWFsTWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5ub3JtYWxNYXAudmFsdWUgPSBtYXRlcmlhbC5ub3JtYWxNYXA7XG5cdFx0XHR1bmlmb3Jtcy5ub3JtYWxTY2FsZS52YWx1ZS5jb3B5KCBtYXRlcmlhbC5ub3JtYWxTY2FsZSApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5kaXNwbGFjZW1lbnRNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmRpc3BsYWNlbWVudE1hcC52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcDtcblx0XHRcdHVuaWZvcm1zLmRpc3BsYWNlbWVudFNjYWxlLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50U2NhbGU7XG5cdFx0XHR1bmlmb3Jtcy5kaXNwbGFjZW1lbnRCaWFzLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50QmlhcztcblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwuZW52TWFwICkge1xuXG5cdFx0XHQvL3VuaWZvcm1zLmVudk1hcC52YWx1ZSA9IG1hdGVyaWFsLmVudk1hcDsgLy8gcGFydCBvZiB1bmlmb3JtcyBjb21tb25cblx0XHRcdHVuaWZvcm1zLmVudk1hcEludGVuc2l0eS52YWx1ZSA9IG1hdGVyaWFsLmVudk1hcEludGVuc2l0eTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVmcmVzaFVuaWZvcm1zUGh5c2ljYWwoIHVuaWZvcm1zLCBtYXRlcmlhbCApIHtcblxuXHRcdHVuaWZvcm1zLmNsZWFyQ29hdC52YWx1ZSA9IG1hdGVyaWFsLmNsZWFyQ29hdDtcblx0XHR1bmlmb3Jtcy5jbGVhckNvYXRSb3VnaG5lc3MudmFsdWUgPSBtYXRlcmlhbC5jbGVhckNvYXRSb3VnaG5lc3M7XG5cblx0XHRyZWZyZXNoVW5pZm9ybXNTdGFuZGFyZCggdW5pZm9ybXMsIG1hdGVyaWFsICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc0RlcHRoKCB1bmlmb3JtcywgbWF0ZXJpYWwgKSB7XG5cblx0XHRpZiAoIG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMuZGlzcGxhY2VtZW50TWFwLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwO1xuXHRcdFx0dW5pZm9ybXMuZGlzcGxhY2VtZW50U2NhbGUudmFsdWUgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRTY2FsZTtcblx0XHRcdHVuaWZvcm1zLmRpc3BsYWNlbWVudEJpYXMudmFsdWUgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRCaWFzO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiByZWZyZXNoVW5pZm9ybXNEaXN0YW5jZSggdW5pZm9ybXMsIG1hdGVyaWFsICkge1xuXG5cdFx0aWYgKCBtYXRlcmlhbC5kaXNwbGFjZW1lbnRNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmRpc3BsYWNlbWVudE1hcC52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcDtcblx0XHRcdHVuaWZvcm1zLmRpc3BsYWNlbWVudFNjYWxlLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50U2NhbGU7XG5cdFx0XHR1bmlmb3Jtcy5kaXNwbGFjZW1lbnRCaWFzLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50QmlhcztcblxuXHRcdH1cblxuXHRcdHVuaWZvcm1zLnJlZmVyZW5jZVBvc2l0aW9uLnZhbHVlLmNvcHkoIG1hdGVyaWFsLnJlZmVyZW5jZVBvc2l0aW9uICk7XG5cdFx0dW5pZm9ybXMubmVhckRpc3RhbmNlLnZhbHVlID0gbWF0ZXJpYWwubmVhckRpc3RhbmNlO1xuXHRcdHVuaWZvcm1zLmZhckRpc3RhbmNlLnZhbHVlID0gbWF0ZXJpYWwuZmFyRGlzdGFuY2U7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc05vcm1hbCggdW5pZm9ybXMsIG1hdGVyaWFsICkge1xuXG5cdFx0aWYgKCBtYXRlcmlhbC5idW1wTWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5idW1wTWFwLnZhbHVlID0gbWF0ZXJpYWwuYnVtcE1hcDtcblx0XHRcdHVuaWZvcm1zLmJ1bXBTY2FsZS52YWx1ZSA9IG1hdGVyaWFsLmJ1bXBTY2FsZTtcblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwubm9ybWFsTWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5ub3JtYWxNYXAudmFsdWUgPSBtYXRlcmlhbC5ub3JtYWxNYXA7XG5cdFx0XHR1bmlmb3Jtcy5ub3JtYWxTY2FsZS52YWx1ZS5jb3B5KCBtYXRlcmlhbC5ub3JtYWxTY2FsZSApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5kaXNwbGFjZW1lbnRNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmRpc3BsYWNlbWVudE1hcC52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcDtcblx0XHRcdHVuaWZvcm1zLmRpc3BsYWNlbWVudFNjYWxlLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50U2NhbGU7XG5cdFx0XHR1bmlmb3Jtcy5kaXNwbGFjZW1lbnRCaWFzLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50QmlhcztcblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gSWYgdW5pZm9ybXMgYXJlIG1hcmtlZCBhcyBjbGVhbiwgdGhleSBkb24ndCBuZWVkIHRvIGJlIGxvYWRlZCB0byB0aGUgR1BVLlxuXG5cdGZ1bmN0aW9uIG1hcmtVbmlmb3Jtc0xpZ2h0c05lZWRzVXBkYXRlKCB1bmlmb3JtcywgdmFsdWUgKSB7XG5cblx0XHR1bmlmb3Jtcy5hbWJpZW50TGlnaHRDb2xvci5uZWVkc1VwZGF0ZSA9IHZhbHVlO1xuXG5cdFx0dW5pZm9ybXMuZGlyZWN0aW9uYWxMaWdodHMubmVlZHNVcGRhdGUgPSB2YWx1ZTtcblx0XHR1bmlmb3Jtcy5wb2ludExpZ2h0cy5uZWVkc1VwZGF0ZSA9IHZhbHVlO1xuXHRcdHVuaWZvcm1zLnNwb3RMaWdodHMubmVlZHNVcGRhdGUgPSB2YWx1ZTtcblx0XHR1bmlmb3Jtcy5yZWN0QXJlYUxpZ2h0cy5uZWVkc1VwZGF0ZSA9IHZhbHVlO1xuXHRcdHVuaWZvcm1zLmhlbWlzcGhlcmVMaWdodHMubmVlZHNVcGRhdGUgPSB2YWx1ZTtcblxuXHR9XG5cblx0Ly8gVGV4dHVyZXNcblxuXHRmdW5jdGlvbiBhbGxvY1RleHR1cmVVbml0KCkge1xuXG5cdFx0dmFyIHRleHR1cmVVbml0ID0gX3VzZWRUZXh0dXJlVW5pdHM7XG5cblx0XHRpZiAoIHRleHR1cmVVbml0ID49IGNhcGFiaWxpdGllcy5tYXhUZXh0dXJlcyApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogVHJ5aW5nIHRvIHVzZSAnICsgdGV4dHVyZVVuaXQgKyAnIHRleHR1cmUgdW5pdHMgd2hpbGUgdGhpcyBHUFUgc3VwcG9ydHMgb25seSAnICsgY2FwYWJpbGl0aWVzLm1heFRleHR1cmVzICk7XG5cblx0XHR9XG5cblx0XHRfdXNlZFRleHR1cmVVbml0cyArPSAxO1xuXG5cdFx0cmV0dXJuIHRleHR1cmVVbml0O1xuXG5cdH1cblxuXHR0aGlzLmFsbG9jVGV4dHVyZVVuaXQgPSBhbGxvY1RleHR1cmVVbml0O1xuXG5cdC8vIHRoaXMuc2V0VGV4dHVyZTJEID0gc2V0VGV4dHVyZTJEO1xuXHR0aGlzLnNldFRleHR1cmUyRCA9ICggZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHdhcm5lZCA9IGZhbHNlO1xuXG5cdFx0Ly8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6IHBlZWwgdGV4dHVyZS50ZXh0dXJlXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHNldFRleHR1cmUyRCggdGV4dHVyZSwgc2xvdCApIHtcblxuXHRcdFx0aWYgKCB0ZXh0dXJlICYmIHRleHR1cmUuaXNXZWJHTFJlbmRlclRhcmdldCApIHtcblxuXHRcdFx0XHRpZiAoICEgd2FybmVkICkge1xuXG5cdFx0XHRcdFx0Y29uc29sZS53YXJuKCBcIlRIUkVFLldlYkdMUmVuZGVyZXIuc2V0VGV4dHVyZTJEOiBkb24ndCB1c2UgcmVuZGVyIHRhcmdldHMgYXMgdGV4dHVyZXMuIFVzZSB0aGVpciAudGV4dHVyZSBwcm9wZXJ0eSBpbnN0ZWFkLlwiICk7XG5cdFx0XHRcdFx0d2FybmVkID0gdHJ1ZTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGV4dHVyZSA9IHRleHR1cmUudGV4dHVyZTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0ZXh0dXJlcy5zZXRUZXh0dXJlMkQoIHRleHR1cmUsIHNsb3QgKTtcblxuXHRcdH07XG5cblx0fSgpICk7XG5cblx0dGhpcy5zZXRUZXh0dXJlID0gKCBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgd2FybmVkID0gZmFsc2U7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gc2V0VGV4dHVyZSggdGV4dHVyZSwgc2xvdCApIHtcblxuXHRcdFx0aWYgKCAhIHdhcm5lZCApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oIFwiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNldFRleHR1cmUgaXMgZGVwcmVjYXRlZCwgdXNlIHNldFRleHR1cmUyRCBpbnN0ZWFkLlwiICk7XG5cdFx0XHRcdHdhcm5lZCA9IHRydWU7XG5cblx0XHRcdH1cblxuXHRcdFx0dGV4dHVyZXMuc2V0VGV4dHVyZTJEKCB0ZXh0dXJlLCBzbG90ICk7XG5cblx0XHR9O1xuXG5cdH0oKSApO1xuXG5cdHRoaXMuc2V0VGV4dHVyZUN1YmUgPSAoIGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB3YXJuZWQgPSBmYWxzZTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBzZXRUZXh0dXJlQ3ViZSggdGV4dHVyZSwgc2xvdCApIHtcblxuXHRcdFx0Ly8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6IHBlZWwgdGV4dHVyZS50ZXh0dXJlXG5cdFx0XHRpZiAoIHRleHR1cmUgJiYgdGV4dHVyZS5pc1dlYkdMUmVuZGVyVGFyZ2V0Q3ViZSApIHtcblxuXHRcdFx0XHRpZiAoICEgd2FybmVkICkge1xuXG5cdFx0XHRcdFx0Y29uc29sZS53YXJuKCBcIlRIUkVFLldlYkdMUmVuZGVyZXIuc2V0VGV4dHVyZUN1YmU6IGRvbid0IHVzZSBjdWJlIHJlbmRlciB0YXJnZXRzIGFzIHRleHR1cmVzLiBVc2UgdGhlaXIgLnRleHR1cmUgcHJvcGVydHkgaW5zdGVhZC5cIiApO1xuXHRcdFx0XHRcdHdhcm5lZCA9IHRydWU7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRleHR1cmUgPSB0ZXh0dXJlLnRleHR1cmU7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gY3VycmVudGx5IHJlbHlpbmcgb24gdGhlIGZhY3QgdGhhdCBXZWJHTFJlbmRlclRhcmdldEN1YmUudGV4dHVyZSBpcyBhIFRleHR1cmUgYW5kIE5PVCBhIEN1YmVUZXh0dXJlXG5cdFx0XHQvLyBUT0RPOiB1bmlmeSB0aGVzZSBjb2RlIHBhdGhzXG5cdFx0XHRpZiAoICggdGV4dHVyZSAmJiB0ZXh0dXJlLmlzQ3ViZVRleHR1cmUgKSB8fFxuXHRcdFx0XHQoIEFycmF5LmlzQXJyYXkoIHRleHR1cmUuaW1hZ2UgKSAmJiB0ZXh0dXJlLmltYWdlLmxlbmd0aCA9PT0gNiApICkge1xuXG5cdFx0XHRcdC8vIENvbXByZXNzZWRUZXh0dXJlIGNhbiBoYXZlIEFycmF5IGluIGltYWdlIDovXG5cblx0XHRcdFx0Ly8gdGhpcyBmdW5jdGlvbiBhbG9uZSBzaG91bGQgdGFrZSBjYXJlIG9mIGN1YmUgdGV4dHVyZXNcblx0XHRcdFx0dGV4dHVyZXMuc2V0VGV4dHVyZUN1YmUoIHRleHR1cmUsIHNsb3QgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyBhc3N1bWVkOiB0ZXh0dXJlIHByb3BlcnR5IG9mIFRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0Q3ViZVxuXG5cdFx0XHRcdHRleHR1cmVzLnNldFRleHR1cmVDdWJlRHluYW1pYyggdGV4dHVyZSwgc2xvdCApO1xuXG5cdFx0XHR9XG5cblx0XHR9O1xuXG5cdH0oKSApO1xuXG5cdHRoaXMuZ2V0UmVuZGVyVGFyZ2V0ID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIF9jdXJyZW50UmVuZGVyVGFyZ2V0O1xuXG5cdH07XG5cblx0dGhpcy5zZXRSZW5kZXJUYXJnZXQgPSBmdW5jdGlvbiAoIHJlbmRlclRhcmdldCApIHtcblxuXHRcdF9jdXJyZW50UmVuZGVyVGFyZ2V0ID0gcmVuZGVyVGFyZ2V0O1xuXG5cdFx0aWYgKCByZW5kZXJUYXJnZXQgJiYgcHJvcGVydGllcy5nZXQoIHJlbmRlclRhcmdldCApLl9fd2ViZ2xGcmFtZWJ1ZmZlciA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR0ZXh0dXJlcy5zZXR1cFJlbmRlclRhcmdldCggcmVuZGVyVGFyZ2V0ICk7XG5cblx0XHR9XG5cblx0XHR2YXIgZnJhbWVidWZmZXIgPSBudWxsO1xuXHRcdHZhciBpc0N1YmUgPSBmYWxzZTtcblxuXHRcdGlmICggcmVuZGVyVGFyZ2V0ICkge1xuXG5cdFx0XHR2YXIgX193ZWJnbEZyYW1lYnVmZmVyID0gcHJvcGVydGllcy5nZXQoIHJlbmRlclRhcmdldCApLl9fd2ViZ2xGcmFtZWJ1ZmZlcjtcblxuXHRcdFx0aWYgKCByZW5kZXJUYXJnZXQuaXNXZWJHTFJlbmRlclRhcmdldEN1YmUgKSB7XG5cblx0XHRcdFx0ZnJhbWVidWZmZXIgPSBfX3dlYmdsRnJhbWVidWZmZXJbIHJlbmRlclRhcmdldC5hY3RpdmVDdWJlRmFjZSBdO1xuXHRcdFx0XHRpc0N1YmUgPSB0cnVlO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGZyYW1lYnVmZmVyID0gX193ZWJnbEZyYW1lYnVmZmVyO1xuXG5cdFx0XHR9XG5cblx0XHRcdF9jdXJyZW50Vmlld3BvcnQuY29weSggcmVuZGVyVGFyZ2V0LnZpZXdwb3J0ICk7XG5cdFx0XHRfY3VycmVudFNjaXNzb3IuY29weSggcmVuZGVyVGFyZ2V0LnNjaXNzb3IgKTtcblx0XHRcdF9jdXJyZW50U2Npc3NvclRlc3QgPSByZW5kZXJUYXJnZXQuc2Npc3NvclRlc3Q7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRfY3VycmVudFZpZXdwb3J0LmNvcHkoIF92aWV3cG9ydCApLm11bHRpcGx5U2NhbGFyKCBfcGl4ZWxSYXRpbyApO1xuXHRcdFx0X2N1cnJlbnRTY2lzc29yLmNvcHkoIF9zY2lzc29yICkubXVsdGlwbHlTY2FsYXIoIF9waXhlbFJhdGlvICk7XG5cdFx0XHRfY3VycmVudFNjaXNzb3JUZXN0ID0gX3NjaXNzb3JUZXN0O1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBfY3VycmVudEZyYW1lYnVmZmVyICE9PSBmcmFtZWJ1ZmZlciApIHtcblxuXHRcdFx0X2dsLmJpbmRGcmFtZWJ1ZmZlciggX2dsLkZSQU1FQlVGRkVSLCBmcmFtZWJ1ZmZlciApO1xuXHRcdFx0X2N1cnJlbnRGcmFtZWJ1ZmZlciA9IGZyYW1lYnVmZmVyO1xuXG5cdFx0fVxuXG5cdFx0c3RhdGUudmlld3BvcnQoIF9jdXJyZW50Vmlld3BvcnQgKTtcblx0XHRzdGF0ZS5zY2lzc29yKCBfY3VycmVudFNjaXNzb3IgKTtcblx0XHRzdGF0ZS5zZXRTY2lzc29yVGVzdCggX2N1cnJlbnRTY2lzc29yVGVzdCApO1xuXG5cdFx0aWYgKCBpc0N1YmUgKSB7XG5cblx0XHRcdHZhciB0ZXh0dXJlUHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCByZW5kZXJUYXJnZXQudGV4dHVyZSApO1xuXHRcdFx0X2dsLmZyYW1lYnVmZmVyVGV4dHVyZTJEKCBfZ2wuRlJBTUVCVUZGRVIsIF9nbC5DT0xPUl9BVFRBQ0hNRU5UMCwgX2dsLlRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCArIHJlbmRlclRhcmdldC5hY3RpdmVDdWJlRmFjZSwgdGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbFRleHR1cmUsIHJlbmRlclRhcmdldC5hY3RpdmVNaXBNYXBMZXZlbCApO1xuXG5cdFx0fVxuXG5cdH07XG5cblx0dGhpcy5yZWFkUmVuZGVyVGFyZ2V0UGl4ZWxzID0gZnVuY3Rpb24gKCByZW5kZXJUYXJnZXQsIHgsIHksIHdpZHRoLCBoZWlnaHQsIGJ1ZmZlciApIHtcblxuXHRcdGlmICggISAoIHJlbmRlclRhcmdldCAmJiByZW5kZXJUYXJnZXQuaXNXZWJHTFJlbmRlclRhcmdldCApICkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuV2ViR0xSZW5kZXJlci5yZWFkUmVuZGVyVGFyZ2V0UGl4ZWxzOiByZW5kZXJUYXJnZXQgaXMgbm90IFRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0LicgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdHZhciBmcmFtZWJ1ZmZlciA9IHByb3BlcnRpZXMuZ2V0KCByZW5kZXJUYXJnZXQgKS5fX3dlYmdsRnJhbWVidWZmZXI7XG5cblx0XHRpZiAoIGZyYW1lYnVmZmVyICkge1xuXG5cdFx0XHR2YXIgcmVzdG9yZSA9IGZhbHNlO1xuXG5cdFx0XHRpZiAoIGZyYW1lYnVmZmVyICE9PSBfY3VycmVudEZyYW1lYnVmZmVyICkge1xuXG5cdFx0XHRcdF9nbC5iaW5kRnJhbWVidWZmZXIoIF9nbC5GUkFNRUJVRkZFUiwgZnJhbWVidWZmZXIgKTtcblxuXHRcdFx0XHRyZXN0b3JlID0gdHJ1ZTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0cnkge1xuXG5cdFx0XHRcdHZhciB0ZXh0dXJlID0gcmVuZGVyVGFyZ2V0LnRleHR1cmU7XG5cdFx0XHRcdHZhciB0ZXh0dXJlRm9ybWF0ID0gdGV4dHVyZS5mb3JtYXQ7XG5cdFx0XHRcdHZhciB0ZXh0dXJlVHlwZSA9IHRleHR1cmUudHlwZTtcblxuXHRcdFx0XHRpZiAoIHRleHR1cmVGb3JtYXQgIT09IFJHQkFGb3JtYXQgJiYgdXRpbHMuY29udmVydCggdGV4dHVyZUZvcm1hdCApICE9PSBfZ2wuZ2V0UGFyYW1ldGVyKCBfZ2wuSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9GT1JNQVQgKSApIHtcblxuXHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTFJlbmRlcmVyLnJlYWRSZW5kZXJUYXJnZXRQaXhlbHM6IHJlbmRlclRhcmdldCBpcyBub3QgaW4gUkdCQSBvciBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkIGZvcm1hdC4nICk7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIHRleHR1cmVUeXBlICE9PSBVbnNpZ25lZEJ5dGVUeXBlICYmIHV0aWxzLmNvbnZlcnQoIHRleHR1cmVUeXBlICkgIT09IF9nbC5nZXRQYXJhbWV0ZXIoIF9nbC5JTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFEX1RZUEUgKSAmJiAvLyBJRTExLCBFZGdlIGFuZCBDaHJvbWUgTWFjIDwgNTIgKCM5NTEzKVxuXHRcdFx0XHRcdCEgKCB0ZXh0dXJlVHlwZSA9PT0gRmxvYXRUeXBlICYmICggZXh0ZW5zaW9ucy5nZXQoICdPRVNfdGV4dHVyZV9mbG9hdCcgKSB8fCBleHRlbnNpb25zLmdldCggJ1dFQkdMX2NvbG9yX2J1ZmZlcl9mbG9hdCcgKSApICkgJiYgLy8gQ2hyb21lIE1hYyA+PSA1MiBhbmQgRmlyZWZveFxuXHRcdFx0XHRcdCEgKCB0ZXh0dXJlVHlwZSA9PT0gSGFsZkZsb2F0VHlwZSAmJiBleHRlbnNpb25zLmdldCggJ0VYVF9jb2xvcl9idWZmZXJfaGFsZl9mbG9hdCcgKSApICkge1xuXG5cdFx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdMUmVuZGVyZXIucmVhZFJlbmRlclRhcmdldFBpeGVsczogcmVuZGVyVGFyZ2V0IGlzIG5vdCBpbiBVbnNpZ25lZEJ5dGVUeXBlIG9yIGltcGxlbWVudGF0aW9uIGRlZmluZWQgdHlwZS4nICk7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIF9nbC5jaGVja0ZyYW1lYnVmZmVyU3RhdHVzKCBfZ2wuRlJBTUVCVUZGRVIgKSA9PT0gX2dsLkZSQU1FQlVGRkVSX0NPTVBMRVRFICkge1xuXG5cdFx0XHRcdFx0Ly8gdGhlIGZvbGxvd2luZyBpZiBzdGF0ZW1lbnQgZW5zdXJlcyB2YWxpZCByZWFkIHJlcXVlc3RzIChubyBvdXQtb2YtYm91bmRzIHBpeGVscywgc2VlICM4NjA0KVxuXG5cdFx0XHRcdFx0aWYgKCAoIHggPj0gMCAmJiB4IDw9ICggcmVuZGVyVGFyZ2V0LndpZHRoIC0gd2lkdGggKSApICYmICggeSA+PSAwICYmIHkgPD0gKCByZW5kZXJUYXJnZXQuaGVpZ2h0IC0gaGVpZ2h0ICkgKSApIHtcblxuXHRcdFx0XHRcdFx0X2dsLnJlYWRQaXhlbHMoIHgsIHksIHdpZHRoLCBoZWlnaHQsIHV0aWxzLmNvbnZlcnQoIHRleHR1cmVGb3JtYXQgKSwgdXRpbHMuY29udmVydCggdGV4dHVyZVR5cGUgKSwgYnVmZmVyICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTFJlbmRlcmVyLnJlYWRSZW5kZXJUYXJnZXRQaXhlbHM6IHJlYWRQaXhlbHMgZnJvbSByZW5kZXJUYXJnZXQgZmFpbGVkLiBGcmFtZWJ1ZmZlciBub3QgY29tcGxldGUuJyApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBmaW5hbGx5IHtcblxuXHRcdFx0XHRpZiAoIHJlc3RvcmUgKSB7XG5cblx0XHRcdFx0XHRfZ2wuYmluZEZyYW1lYnVmZmVyKCBfZ2wuRlJBTUVCVUZGRVIsIF9jdXJyZW50RnJhbWVidWZmZXIgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9O1xuXG5cdHRoaXMuY29weUZyYW1lYnVmZmVyVG9UZXh0dXJlID0gZnVuY3Rpb24gKCBwb3NpdGlvbiwgdGV4dHVyZSwgbGV2ZWwgKSB7XG5cblx0XHR2YXIgd2lkdGggPSB0ZXh0dXJlLmltYWdlLndpZHRoO1xuXHRcdHZhciBoZWlnaHQgPSB0ZXh0dXJlLmltYWdlLmhlaWdodDtcblx0XHR2YXIgZ2xGb3JtYXQgPSB1dGlscy5jb252ZXJ0KCB0ZXh0dXJlLmZvcm1hdCApO1xuXG5cdFx0dGhpcy5zZXRUZXh0dXJlMkQoIHRleHR1cmUsIDAgKTtcblxuXHRcdF9nbC5jb3B5VGV4SW1hZ2UyRCggX2dsLlRFWFRVUkVfMkQsIGxldmVsIHx8IDAsIGdsRm9ybWF0LCBwb3NpdGlvbi54LCBwb3NpdGlvbi55LCB3aWR0aCwgaGVpZ2h0LCAwICk7XG5cblx0fTtcblxuXHR0aGlzLmNvcHlUZXh0dXJlVG9UZXh0dXJlID0gZnVuY3Rpb24gKCBwb3NpdGlvbiwgc3JjVGV4dHVyZSwgZHN0VGV4dHVyZSwgbGV2ZWwgKSB7XG5cblx0XHR2YXIgd2lkdGggPSBzcmNUZXh0dXJlLmltYWdlLndpZHRoO1xuXHRcdHZhciBoZWlnaHQgPSBzcmNUZXh0dXJlLmltYWdlLmhlaWdodDtcblx0XHR2YXIgZ2xGb3JtYXQgPSB1dGlscy5jb252ZXJ0KCBkc3RUZXh0dXJlLmZvcm1hdCApO1xuXHRcdHZhciBnbFR5cGUgPSB1dGlscy5jb252ZXJ0KCBkc3RUZXh0dXJlLnR5cGUgKTtcblx0XHR2YXIgcGl4ZWxzID0gc3JjVGV4dHVyZS5pc0RhdGFUZXh0dXJlID8gc3JjVGV4dHVyZS5pbWFnZS5kYXRhIDogc3JjVGV4dHVyZS5pbWFnZTtcblxuXHRcdHRoaXMuc2V0VGV4dHVyZTJEKCBkc3RUZXh0dXJlLCAwICk7XG5cblx0XHRfZ2wudGV4U3ViSW1hZ2UyRCggX2dsLlRFWFRVUkVfMkQsIGxldmVsIHx8IDAsIHBvc2l0aW9uLngsIHBvc2l0aW9uLnksIHdpZHRoLCBoZWlnaHQsIGdsRm9ybWF0LCBnbFR5cGUsIHBpeGVscyApO1xuXG5cdH07XG5cbn1cblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBGb2dFeHAyKCBjb2xvciwgZGVuc2l0eSApIHtcblxuXHR0aGlzLm5hbWUgPSAnJztcblxuXHR0aGlzLmNvbG9yID0gbmV3IENvbG9yKCBjb2xvciApO1xuXHR0aGlzLmRlbnNpdHkgPSAoIGRlbnNpdHkgIT09IHVuZGVmaW5lZCApID8gZGVuc2l0eSA6IDAuMDAwMjU7XG5cbn1cblxuRm9nRXhwMi5wcm90b3R5cGUuaXNGb2dFeHAyID0gdHJ1ZTtcblxuRm9nRXhwMi5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiAoKSB7XG5cblx0cmV0dXJuIG5ldyBGb2dFeHAyKCB0aGlzLmNvbG9yLmdldEhleCgpLCB0aGlzLmRlbnNpdHkgKTtcblxufTtcblxuRm9nRXhwMi5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gKCAvKiBtZXRhICovICkge1xuXG5cdHJldHVybiB7XG5cdFx0dHlwZTogJ0ZvZ0V4cDInLFxuXHRcdGNvbG9yOiB0aGlzLmNvbG9yLmdldEhleCgpLFxuXHRcdGRlbnNpdHk6IHRoaXMuZGVuc2l0eVxuXHR9O1xuXG59O1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICovXG5cbmZ1bmN0aW9uIEZvZyggY29sb3IsIG5lYXIsIGZhciApIHtcblxuXHR0aGlzLm5hbWUgPSAnJztcblxuXHR0aGlzLmNvbG9yID0gbmV3IENvbG9yKCBjb2xvciApO1xuXG5cdHRoaXMubmVhciA9ICggbmVhciAhPT0gdW5kZWZpbmVkICkgPyBuZWFyIDogMTtcblx0dGhpcy5mYXIgPSAoIGZhciAhPT0gdW5kZWZpbmVkICkgPyBmYXIgOiAxMDAwO1xuXG59XG5cbkZvZy5wcm90b3R5cGUuaXNGb2cgPSB0cnVlO1xuXG5Gb2cucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKCkge1xuXG5cdHJldHVybiBuZXcgRm9nKCB0aGlzLmNvbG9yLmdldEhleCgpLCB0aGlzLm5lYXIsIHRoaXMuZmFyICk7XG5cbn07XG5cbkZvZy5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gKCAvKiBtZXRhICovICkge1xuXG5cdHJldHVybiB7XG5cdFx0dHlwZTogJ0ZvZycsXG5cdFx0Y29sb3I6IHRoaXMuY29sb3IuZ2V0SGV4KCksXG5cdFx0bmVhcjogdGhpcy5uZWFyLFxuXHRcdGZhcjogdGhpcy5mYXJcblx0fTtcblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIFNjZW5lKCkge1xuXG5cdE9iamVjdDNELmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnU2NlbmUnO1xuXG5cdHRoaXMuYmFja2dyb3VuZCA9IG51bGw7XG5cdHRoaXMuZm9nID0gbnVsbDtcblx0dGhpcy5vdmVycmlkZU1hdGVyaWFsID0gbnVsbDtcblxuXHR0aGlzLmF1dG9VcGRhdGUgPSB0cnVlOyAvLyBjaGVja2VkIGJ5IHRoZSByZW5kZXJlclxuXG59XG5cblNjZW5lLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IFNjZW5lLFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlLCByZWN1cnNpdmUgKSB7XG5cblx0XHRPYmplY3QzRC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UsIHJlY3Vyc2l2ZSApO1xuXG5cdFx0aWYgKCBzb3VyY2UuYmFja2dyb3VuZCAhPT0gbnVsbCApIHRoaXMuYmFja2dyb3VuZCA9IHNvdXJjZS5iYWNrZ3JvdW5kLmNsb25lKCk7XG5cdFx0aWYgKCBzb3VyY2UuZm9nICE9PSBudWxsICkgdGhpcy5mb2cgPSBzb3VyY2UuZm9nLmNsb25lKCk7XG5cdFx0aWYgKCBzb3VyY2Uub3ZlcnJpZGVNYXRlcmlhbCAhPT0gbnVsbCApIHRoaXMub3ZlcnJpZGVNYXRlcmlhbCA9IHNvdXJjZS5vdmVycmlkZU1hdGVyaWFsLmNsb25lKCk7XG5cblx0XHR0aGlzLmF1dG9VcGRhdGUgPSBzb3VyY2UuYXV0b1VwZGF0ZTtcblx0XHR0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSBzb3VyY2UubWF0cml4QXV0b1VwZGF0ZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dG9KU09OOiBmdW5jdGlvbiAoIG1ldGEgKSB7XG5cblx0XHR2YXIgZGF0YSA9IE9iamVjdDNELnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcywgbWV0YSApO1xuXG5cdFx0aWYgKCB0aGlzLmJhY2tncm91bmQgIT09IG51bGwgKSBkYXRhLm9iamVjdC5iYWNrZ3JvdW5kID0gdGhpcy5iYWNrZ3JvdW5kLnRvSlNPTiggbWV0YSApO1xuXHRcdGlmICggdGhpcy5mb2cgIT09IG51bGwgKSBkYXRhLm9iamVjdC5mb2cgPSB0aGlzLmZvZy50b0pTT04oKTtcblxuXHRcdHJldHVybiBkYXRhO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKlxuICogcGFyYW1ldGVycyA9IHtcbiAqICBjb2xvcjogPGhleD4sXG4gKiAgb3BhY2l0eTogPGZsb2F0PixcbiAqICBtYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICpcdHV2T2Zmc2V0OiBuZXcgVEhSRUUuVmVjdG9yMigpLFxuICpcdHV2U2NhbGU6IG5ldyBUSFJFRS5WZWN0b3IyKClcbiAqIH1cbiAqL1xuXG5mdW5jdGlvbiBTcHJpdGVNYXRlcmlhbCggcGFyYW1ldGVycyApIHtcblxuXHRNYXRlcmlhbC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1Nwcml0ZU1hdGVyaWFsJztcblxuXHR0aGlzLmNvbG9yID0gbmV3IENvbG9yKCAweGZmZmZmZiApO1xuXHR0aGlzLm1hcCA9IG51bGw7XG5cblx0dGhpcy5yb3RhdGlvbiA9IDA7XG5cblx0dGhpcy5mb2cgPSBmYWxzZTtcblx0dGhpcy5saWdodHMgPSBmYWxzZTtcblxuXHR0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApO1xuXG59XG5cblNwcml0ZU1hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE1hdGVyaWFsLnByb3RvdHlwZSApO1xuU3ByaXRlTWF0ZXJpYWwucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU3ByaXRlTWF0ZXJpYWw7XG5TcHJpdGVNYXRlcmlhbC5wcm90b3R5cGUuaXNTcHJpdGVNYXRlcmlhbCA9IHRydWU7XG5cblNwcml0ZU1hdGVyaWFsLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0TWF0ZXJpYWwucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0dGhpcy5jb2xvci5jb3B5KCBzb3VyY2UuY29sb3IgKTtcblx0dGhpcy5tYXAgPSBzb3VyY2UubWFwO1xuXG5cdHRoaXMucm90YXRpb24gPSBzb3VyY2Uucm90YXRpb247XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBtaWthZWwgZW10aW5nZXIgLyBodHRwOi8vZ29tby5zZS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKi9cblxuZnVuY3Rpb24gU3ByaXRlKCBtYXRlcmlhbCApIHtcblxuXHRPYmplY3QzRC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1Nwcml0ZSc7XG5cblx0dGhpcy5tYXRlcmlhbCA9ICggbWF0ZXJpYWwgIT09IHVuZGVmaW5lZCApID8gbWF0ZXJpYWwgOiBuZXcgU3ByaXRlTWF0ZXJpYWwoKTtcblxuXHR0aGlzLmNlbnRlciA9IG5ldyBWZWN0b3IyKCAwLjUsIDAuNSApO1xuXG59XG5cblNwcml0ZS5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBTcHJpdGUsXG5cblx0aXNTcHJpdGU6IHRydWUsXG5cblx0cmF5Y2FzdDogKCBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgaW50ZXJzZWN0UG9pbnQgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciB3b3JsZFBvc2l0aW9uID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgd29ybGRTY2FsZSA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gcmF5Y2FzdCggcmF5Y2FzdGVyLCBpbnRlcnNlY3RzICkge1xuXG5cdFx0XHR3b3JsZFBvc2l0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbiggdGhpcy5tYXRyaXhXb3JsZCApO1xuXHRcdFx0cmF5Y2FzdGVyLnJheS5jbG9zZXN0UG9pbnRUb1BvaW50KCB3b3JsZFBvc2l0aW9uLCBpbnRlcnNlY3RQb2ludCApO1xuXG5cdFx0XHR3b3JsZFNjYWxlLnNldEZyb21NYXRyaXhTY2FsZSggdGhpcy5tYXRyaXhXb3JsZCApO1xuXHRcdFx0dmFyIGd1ZXNzU2l6ZVNxID0gd29ybGRTY2FsZS54ICogd29ybGRTY2FsZS55IC8gNDtcblxuXHRcdFx0aWYgKCB3b3JsZFBvc2l0aW9uLmRpc3RhbmNlVG9TcXVhcmVkKCBpbnRlcnNlY3RQb2ludCApID4gZ3Vlc3NTaXplU3EgKSByZXR1cm47XG5cblx0XHRcdHZhciBkaXN0YW5jZSA9IHJheWNhc3Rlci5yYXkub3JpZ2luLmRpc3RhbmNlVG8oIGludGVyc2VjdFBvaW50ICk7XG5cblx0XHRcdGlmICggZGlzdGFuY2UgPCByYXljYXN0ZXIubmVhciB8fCBkaXN0YW5jZSA+IHJheWNhc3Rlci5mYXIgKSByZXR1cm47XG5cblx0XHRcdGludGVyc2VjdHMucHVzaCgge1xuXG5cdFx0XHRcdGRpc3RhbmNlOiBkaXN0YW5jZSxcblx0XHRcdFx0cG9pbnQ6IGludGVyc2VjdFBvaW50LmNsb25lKCksXG5cdFx0XHRcdGZhY2U6IG51bGwsXG5cdFx0XHRcdG9iamVjdDogdGhpc1xuXG5cdFx0XHR9ICk7XG5cblx0XHR9O1xuXG5cdH0oKSApLFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoIHRoaXMubWF0ZXJpYWwgKS5jb3B5KCB0aGlzICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRcdE9iamVjdDNELnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdFx0aWYgKCBzb3VyY2UuY2VudGVyICE9PSB1bmRlZmluZWQgKSB0aGlzLmNlbnRlci5jb3B5KCBzb3VyY2UuY2VudGVyICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbWlrYWVsIGVtdGluZ2VyIC8gaHR0cDovL2dvbW8uc2UvXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBMT0QoKSB7XG5cblx0T2JqZWN0M0QuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdMT0QnO1xuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCB0aGlzLCB7XG5cdFx0bGV2ZWxzOiB7XG5cdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0dmFsdWU6IFtdXG5cdFx0fVxuXHR9ICk7XG5cbn1cblxuTE9ELnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IExPRCxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRcdE9iamVjdDNELnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSwgZmFsc2UgKTtcblxuXHRcdHZhciBsZXZlbHMgPSBzb3VyY2UubGV2ZWxzO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gbGV2ZWxzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBsZXZlbCA9IGxldmVsc1sgaSBdO1xuXG5cdFx0XHR0aGlzLmFkZExldmVsKCBsZXZlbC5vYmplY3QuY2xvbmUoKSwgbGV2ZWwuZGlzdGFuY2UgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YWRkTGV2ZWw6IGZ1bmN0aW9uICggb2JqZWN0LCBkaXN0YW5jZSApIHtcblxuXHRcdGlmICggZGlzdGFuY2UgPT09IHVuZGVmaW5lZCApIGRpc3RhbmNlID0gMDtcblxuXHRcdGRpc3RhbmNlID0gTWF0aC5hYnMoIGRpc3RhbmNlICk7XG5cblx0XHR2YXIgbGV2ZWxzID0gdGhpcy5sZXZlbHM7XG5cblx0XHRmb3IgKCB2YXIgbCA9IDA7IGwgPCBsZXZlbHMubGVuZ3RoOyBsICsrICkge1xuXG5cdFx0XHRpZiAoIGRpc3RhbmNlIDwgbGV2ZWxzWyBsIF0uZGlzdGFuY2UgKSB7XG5cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGxldmVscy5zcGxpY2UoIGwsIDAsIHsgZGlzdGFuY2U6IGRpc3RhbmNlLCBvYmplY3Q6IG9iamVjdCB9ICk7XG5cblx0XHR0aGlzLmFkZCggb2JqZWN0ICk7XG5cblx0fSxcblxuXHRnZXRPYmplY3RGb3JEaXN0YW5jZTogZnVuY3Rpb24gKCBkaXN0YW5jZSApIHtcblxuXHRcdHZhciBsZXZlbHMgPSB0aGlzLmxldmVscztcblxuXHRcdGZvciAoIHZhciBpID0gMSwgbCA9IGxldmVscy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRpZiAoIGRpc3RhbmNlIDwgbGV2ZWxzWyBpIF0uZGlzdGFuY2UgKSB7XG5cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiBsZXZlbHNbIGkgLSAxIF0ub2JqZWN0O1xuXG5cdH0sXG5cblx0cmF5Y2FzdDogKCBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgbWF0cml4UG9zaXRpb24gPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHJheWNhc3QoIHJheWNhc3RlciwgaW50ZXJzZWN0cyApIHtcblxuXHRcdFx0bWF0cml4UG9zaXRpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCB0aGlzLm1hdHJpeFdvcmxkICk7XG5cblx0XHRcdHZhciBkaXN0YW5jZSA9IHJheWNhc3Rlci5yYXkub3JpZ2luLmRpc3RhbmNlVG8oIG1hdHJpeFBvc2l0aW9uICk7XG5cblx0XHRcdHRoaXMuZ2V0T2JqZWN0Rm9yRGlzdGFuY2UoIGRpc3RhbmNlICkucmF5Y2FzdCggcmF5Y2FzdGVyLCBpbnRlcnNlY3RzICk7XG5cblx0XHR9O1xuXG5cdH0oKSApLFxuXG5cdHVwZGF0ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgdjIgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZSggY2FtZXJhICkge1xuXG5cdFx0XHR2YXIgbGV2ZWxzID0gdGhpcy5sZXZlbHM7XG5cblx0XHRcdGlmICggbGV2ZWxzLmxlbmd0aCA+IDEgKSB7XG5cblx0XHRcdFx0djEuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBjYW1lcmEubWF0cml4V29ybGQgKTtcblx0XHRcdFx0djIuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCB0aGlzLm1hdHJpeFdvcmxkICk7XG5cblx0XHRcdFx0dmFyIGRpc3RhbmNlID0gdjEuZGlzdGFuY2VUbyggdjIgKTtcblxuXHRcdFx0XHRsZXZlbHNbIDAgXS5vYmplY3QudmlzaWJsZSA9IHRydWU7XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAxLCBsID0gbGV2ZWxzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRpZiAoIGRpc3RhbmNlID49IGxldmVsc1sgaSBdLmRpc3RhbmNlICkge1xuXG5cdFx0XHRcdFx0XHRsZXZlbHNbIGkgLSAxIF0ub2JqZWN0LnZpc2libGUgPSBmYWxzZTtcblx0XHRcdFx0XHRcdGxldmVsc1sgaSBdLm9iamVjdC52aXNpYmxlID0gdHJ1ZTtcblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRmb3IgKCA7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0bGV2ZWxzWyBpIF0ub2JqZWN0LnZpc2libGUgPSBmYWxzZTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCBtZXRhICkge1xuXG5cdFx0dmFyIGRhdGEgPSBPYmplY3QzRC5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMsIG1ldGEgKTtcblxuXHRcdGRhdGEub2JqZWN0LmxldmVscyA9IFtdO1xuXG5cdFx0dmFyIGxldmVscyA9IHRoaXMubGV2ZWxzO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gbGV2ZWxzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBsZXZlbCA9IGxldmVsc1sgaSBdO1xuXG5cdFx0XHRkYXRhLm9iamVjdC5sZXZlbHMucHVzaCgge1xuXHRcdFx0XHRvYmplY3Q6IGxldmVsLm9iamVjdC51dWlkLFxuXHRcdFx0XHRkaXN0YW5jZTogbGV2ZWwuZGlzdGFuY2Vcblx0XHRcdH0gKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBkYXRhO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbWlrYWVsIGVtdGluZ2VyIC8gaHR0cDovL2dvbW8uc2UvXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBtaWNoYWVsIGd1ZXJyZXJvIC8gaHR0cDovL3JlYWxpdHltZWx0ZG93bi5jb21cbiAqIEBhdXRob3IgaWtlcnIgLyBodHRwOi8vdmVyb2xkLmNvbVxuICovXG5cbmZ1bmN0aW9uIFNrZWxldG9uKCBib25lcywgYm9uZUludmVyc2VzICkge1xuXG5cdC8vIGNvcHkgdGhlIGJvbmUgYXJyYXlcblxuXHRib25lcyA9IGJvbmVzIHx8IFtdO1xuXG5cdHRoaXMuYm9uZXMgPSBib25lcy5zbGljZSggMCApO1xuXHR0aGlzLmJvbmVNYXRyaWNlcyA9IG5ldyBGbG9hdDMyQXJyYXkoIHRoaXMuYm9uZXMubGVuZ3RoICogMTYgKTtcblxuXHQvLyB1c2UgdGhlIHN1cHBsaWVkIGJvbmUgaW52ZXJzZXMgb3IgY2FsY3VsYXRlIHRoZSBpbnZlcnNlc1xuXG5cdGlmICggYm9uZUludmVyc2VzID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHR0aGlzLmNhbGN1bGF0ZUludmVyc2VzKCk7XG5cblx0fSBlbHNlIHtcblxuXHRcdGlmICggdGhpcy5ib25lcy5sZW5ndGggPT09IGJvbmVJbnZlcnNlcy5sZW5ndGggKSB7XG5cblx0XHRcdHRoaXMuYm9uZUludmVyc2VzID0gYm9uZUludmVyc2VzLnNsaWNlKCAwICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Ta2VsZXRvbiBib25lSW52ZXJzZXMgaXMgdGhlIHdyb25nIGxlbmd0aC4nICk7XG5cblx0XHRcdHRoaXMuYm9uZUludmVyc2VzID0gW107XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSB0aGlzLmJvbmVzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdHRoaXMuYm9uZUludmVyc2VzLnB1c2goIG5ldyBNYXRyaXg0KCkgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH1cblxufVxuXG5PYmplY3QuYXNzaWduKCBTa2VsZXRvbi5wcm90b3R5cGUsIHtcblxuXHRjYWxjdWxhdGVJbnZlcnNlczogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5ib25lSW52ZXJzZXMgPSBbXTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSB0aGlzLmJvbmVzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgaW52ZXJzZSA9IG5ldyBNYXRyaXg0KCk7XG5cblx0XHRcdGlmICggdGhpcy5ib25lc1sgaSBdICkge1xuXG5cdFx0XHRcdGludmVyc2UuZ2V0SW52ZXJzZSggdGhpcy5ib25lc1sgaSBdLm1hdHJpeFdvcmxkICk7XG5cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5ib25lSW52ZXJzZXMucHVzaCggaW52ZXJzZSApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0cG9zZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGJvbmUsIGksIGlsO1xuXG5cdFx0Ly8gcmVjb3ZlciB0aGUgYmluZC10aW1lIHdvcmxkIG1hdHJpY2VzXG5cblx0XHRmb3IgKCBpID0gMCwgaWwgPSB0aGlzLmJvbmVzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRib25lID0gdGhpcy5ib25lc1sgaSBdO1xuXG5cdFx0XHRpZiAoIGJvbmUgKSB7XG5cblx0XHRcdFx0Ym9uZS5tYXRyaXhXb3JsZC5nZXRJbnZlcnNlKCB0aGlzLmJvbmVJbnZlcnNlc1sgaSBdICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIGNvbXB1dGUgdGhlIGxvY2FsIG1hdHJpY2VzLCBwb3NpdGlvbnMsIHJvdGF0aW9ucyBhbmQgc2NhbGVzXG5cblx0XHRmb3IgKCBpID0gMCwgaWwgPSB0aGlzLmJvbmVzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRib25lID0gdGhpcy5ib25lc1sgaSBdO1xuXG5cdFx0XHRpZiAoIGJvbmUgKSB7XG5cblx0XHRcdFx0aWYgKCBib25lLnBhcmVudCAmJiBib25lLnBhcmVudC5pc0JvbmUgKSB7XG5cblx0XHRcdFx0XHRib25lLm1hdHJpeC5nZXRJbnZlcnNlKCBib25lLnBhcmVudC5tYXRyaXhXb3JsZCApO1xuXHRcdFx0XHRcdGJvbmUubWF0cml4Lm11bHRpcGx5KCBib25lLm1hdHJpeFdvcmxkICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGJvbmUubWF0cml4LmNvcHkoIGJvbmUubWF0cml4V29ybGQgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ym9uZS5tYXRyaXguZGVjb21wb3NlKCBib25lLnBvc2l0aW9uLCBib25lLnF1YXRlcm5pb24sIGJvbmUuc2NhbGUgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH0sXG5cblx0dXBkYXRlOiAoIGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBvZmZzZXRNYXRyaXggPSBuZXcgTWF0cml4NCgpO1xuXHRcdHZhciBpZGVudGl0eU1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gdXBkYXRlKCkge1xuXG5cdFx0XHR2YXIgYm9uZXMgPSB0aGlzLmJvbmVzO1xuXHRcdFx0dmFyIGJvbmVJbnZlcnNlcyA9IHRoaXMuYm9uZUludmVyc2VzO1xuXHRcdFx0dmFyIGJvbmVNYXRyaWNlcyA9IHRoaXMuYm9uZU1hdHJpY2VzO1xuXHRcdFx0dmFyIGJvbmVUZXh0dXJlID0gdGhpcy5ib25lVGV4dHVyZTtcblxuXHRcdFx0Ly8gZmxhdHRlbiBib25lIG1hdHJpY2VzIHRvIGFycmF5XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBib25lcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHQvLyBjb21wdXRlIHRoZSBvZmZzZXQgYmV0d2VlbiB0aGUgY3VycmVudCBhbmQgdGhlIG9yaWdpbmFsIHRyYW5zZm9ybVxuXG5cdFx0XHRcdHZhciBtYXRyaXggPSBib25lc1sgaSBdID8gYm9uZXNbIGkgXS5tYXRyaXhXb3JsZCA6IGlkZW50aXR5TWF0cml4O1xuXG5cdFx0XHRcdG9mZnNldE1hdHJpeC5tdWx0aXBseU1hdHJpY2VzKCBtYXRyaXgsIGJvbmVJbnZlcnNlc1sgaSBdICk7XG5cdFx0XHRcdG9mZnNldE1hdHJpeC50b0FycmF5KCBib25lTWF0cmljZXMsIGkgKiAxNiApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggYm9uZVRleHR1cmUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRib25lVGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdH1cblxuXHRcdH07XG5cblx0fSApKCksXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgU2tlbGV0b24oIHRoaXMuYm9uZXMsIHRoaXMuYm9uZUludmVyc2VzICk7XG5cblx0fSxcblxuXHRnZXRCb25lQnlOYW1lOiBmdW5jdGlvbiAoIG5hbWUgKSB7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gdGhpcy5ib25lcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGJvbmUgPSB0aGlzLmJvbmVzWyBpIF07XG5cblx0XHRcdGlmICggYm9uZS5uYW1lID09PSBuYW1lICkge1xuXG5cdFx0XHRcdHJldHVybiBib25lO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbWlrYWVsIGVtdGluZ2VyIC8gaHR0cDovL2dvbW8uc2UvXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBpa2VyciAvIGh0dHA6Ly92ZXJvbGQuY29tXG4gKi9cblxuZnVuY3Rpb24gQm9uZSgpIHtcblxuXHRPYmplY3QzRC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0JvbmUnO1xuXG59XG5cbkJvbmUucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogQm9uZSxcblxuXHRpc0JvbmU6IHRydWVcblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbWlrYWVsIGVtdGluZ2VyIC8gaHR0cDovL2dvbW8uc2UvXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBpa2VyciAvIGh0dHA6Ly92ZXJvbGQuY29tXG4gKi9cblxuZnVuY3Rpb24gU2tpbm5lZE1lc2goIGdlb21ldHJ5LCBtYXRlcmlhbCApIHtcblxuXHRNZXNoLmNhbGwoIHRoaXMsIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xuXG5cdHRoaXMudHlwZSA9ICdTa2lubmVkTWVzaCc7XG5cblx0dGhpcy5iaW5kTW9kZSA9ICdhdHRhY2hlZCc7XG5cdHRoaXMuYmluZE1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7XG5cdHRoaXMuYmluZE1hdHJpeEludmVyc2UgPSBuZXcgTWF0cml4NCgpO1xuXG5cdHZhciBib25lcyA9IHRoaXMuaW5pdEJvbmVzKCk7XG5cdHZhciBza2VsZXRvbiA9IG5ldyBTa2VsZXRvbiggYm9uZXMgKTtcblxuXHR0aGlzLmJpbmQoIHNrZWxldG9uLCB0aGlzLm1hdHJpeFdvcmxkICk7XG5cblx0dGhpcy5ub3JtYWxpemVTa2luV2VpZ2h0cygpO1xuXG59XG5cblNraW5uZWRNZXNoLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIE1lc2gucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogU2tpbm5lZE1lc2gsXG5cblx0aXNTa2lubmVkTWVzaDogdHJ1ZSxcblxuXHRpbml0Qm9uZXM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBib25lcyA9IFtdLCBib25lLCBnYm9uZTtcblx0XHR2YXIgaSwgaWw7XG5cblx0XHRpZiAoIHRoaXMuZ2VvbWV0cnkgJiYgdGhpcy5nZW9tZXRyeS5ib25lcyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHQvLyBmaXJzdCwgY3JlYXRlIGFycmF5IG9mICdCb25lJyBvYmplY3RzIGZyb20gZ2VvbWV0cnkgZGF0YVxuXG5cdFx0XHRmb3IgKCBpID0gMCwgaWwgPSB0aGlzLmdlb21ldHJ5LmJvbmVzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdGdib25lID0gdGhpcy5nZW9tZXRyeS5ib25lc1sgaSBdO1xuXG5cdFx0XHRcdC8vIGNyZWF0ZSBuZXcgJ0JvbmUnIG9iamVjdFxuXG5cdFx0XHRcdGJvbmUgPSBuZXcgQm9uZSgpO1xuXHRcdFx0XHRib25lcy5wdXNoKCBib25lICk7XG5cblx0XHRcdFx0Ly8gYXBwbHkgdmFsdWVzXG5cblx0XHRcdFx0Ym9uZS5uYW1lID0gZ2JvbmUubmFtZTtcblx0XHRcdFx0Ym9uZS5wb3NpdGlvbi5mcm9tQXJyYXkoIGdib25lLnBvcyApO1xuXHRcdFx0XHRib25lLnF1YXRlcm5pb24uZnJvbUFycmF5KCBnYm9uZS5yb3RxICk7XG5cdFx0XHRcdGlmICggZ2JvbmUuc2NsICE9PSB1bmRlZmluZWQgKSBib25lLnNjYWxlLmZyb21BcnJheSggZ2JvbmUuc2NsICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gc2Vjb25kLCBjcmVhdGUgYm9uZSBoaWVyYXJjaHlcblxuXHRcdFx0Zm9yICggaSA9IDAsIGlsID0gdGhpcy5nZW9tZXRyeS5ib25lcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHRnYm9uZSA9IHRoaXMuZ2VvbWV0cnkuYm9uZXNbIGkgXTtcblxuXHRcdFx0XHRpZiAoICggZ2JvbmUucGFyZW50ICE9PSAtIDEgKSAmJiAoIGdib25lLnBhcmVudCAhPT0gbnVsbCApICYmICggYm9uZXNbIGdib25lLnBhcmVudCBdICE9PSB1bmRlZmluZWQgKSApIHtcblxuXHRcdFx0XHRcdC8vIHN1YnNlcXVlbnQgYm9uZXMgaW4gdGhlIGhpZXJhcmNoeVxuXG5cdFx0XHRcdFx0Ym9uZXNbIGdib25lLnBhcmVudCBdLmFkZCggYm9uZXNbIGkgXSApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHQvLyB0b3Btb3N0IGJvbmUsIGltbWVkaWF0ZSBjaGlsZCBvZiB0aGUgc2tpbm5lZCBtZXNoXG5cblx0XHRcdFx0XHR0aGlzLmFkZCggYm9uZXNbIGkgXSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gbm93IHRoZSBib25lcyBhcmUgcGFydCBvZiB0aGUgc2NlbmUgZ3JhcGggYW5kIGNoaWxkcmVuIG9mIHRoZSBza2lubmVkIG1lc2guXG5cdFx0Ly8gbGV0J3MgdXBkYXRlIHRoZSBjb3JyZXNwb25kaW5nIG1hdHJpY2VzXG5cblx0XHR0aGlzLnVwZGF0ZU1hdHJpeFdvcmxkKCB0cnVlICk7XG5cblx0XHRyZXR1cm4gYm9uZXM7XG5cblx0fSxcblxuXHRiaW5kOiBmdW5jdGlvbiAoIHNrZWxldG9uLCBiaW5kTWF0cml4ICkge1xuXG5cdFx0dGhpcy5za2VsZXRvbiA9IHNrZWxldG9uO1xuXG5cdFx0aWYgKCBiaW5kTWF0cml4ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHRoaXMudXBkYXRlTWF0cml4V29ybGQoIHRydWUgKTtcblxuXHRcdFx0dGhpcy5za2VsZXRvbi5jYWxjdWxhdGVJbnZlcnNlcygpO1xuXG5cdFx0XHRiaW5kTWF0cml4ID0gdGhpcy5tYXRyaXhXb3JsZDtcblxuXHRcdH1cblxuXHRcdHRoaXMuYmluZE1hdHJpeC5jb3B5KCBiaW5kTWF0cml4ICk7XG5cdFx0dGhpcy5iaW5kTWF0cml4SW52ZXJzZS5nZXRJbnZlcnNlKCBiaW5kTWF0cml4ICk7XG5cblx0fSxcblxuXHRwb3NlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLnNrZWxldG9uLnBvc2UoKTtcblxuXHR9LFxuXG5cdG5vcm1hbGl6ZVNraW5XZWlnaHRzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgc2NhbGUsIGk7XG5cblx0XHRpZiAoIHRoaXMuZ2VvbWV0cnkgJiYgdGhpcy5nZW9tZXRyeS5pc0dlb21ldHJ5ICkge1xuXG5cdFx0XHRmb3IgKCBpID0gMDsgaSA8IHRoaXMuZ2VvbWV0cnkuc2tpbldlaWdodHMubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRcdHZhciBzdyA9IHRoaXMuZ2VvbWV0cnkuc2tpbldlaWdodHNbIGkgXTtcblxuXHRcdFx0XHRzY2FsZSA9IDEuMCAvIHN3Lm1hbmhhdHRhbkxlbmd0aCgpO1xuXG5cdFx0XHRcdGlmICggc2NhbGUgIT09IEluZmluaXR5ICkge1xuXG5cdFx0XHRcdFx0c3cubXVsdGlwbHlTY2FsYXIoIHNjYWxlICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdHN3LnNldCggMSwgMCwgMCwgMCApOyAvLyBkbyBzb21ldGhpbmcgcmVhc29uYWJsZVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIGlmICggdGhpcy5nZW9tZXRyeSAmJiB0aGlzLmdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkgKSB7XG5cblx0XHRcdHZhciB2ZWMgPSBuZXcgVmVjdG9yNCgpO1xuXG5cdFx0XHR2YXIgc2tpbldlaWdodCA9IHRoaXMuZ2VvbWV0cnkuYXR0cmlidXRlcy5za2luV2VpZ2h0O1xuXG5cdFx0XHRmb3IgKCBpID0gMDsgaSA8IHNraW5XZWlnaHQuY291bnQ7IGkgKysgKSB7XG5cblx0XHRcdFx0dmVjLnggPSBza2luV2VpZ2h0LmdldFgoIGkgKTtcblx0XHRcdFx0dmVjLnkgPSBza2luV2VpZ2h0LmdldFkoIGkgKTtcblx0XHRcdFx0dmVjLnogPSBza2luV2VpZ2h0LmdldFooIGkgKTtcblx0XHRcdFx0dmVjLncgPSBza2luV2VpZ2h0LmdldFcoIGkgKTtcblxuXHRcdFx0XHRzY2FsZSA9IDEuMCAvIHZlYy5tYW5oYXR0YW5MZW5ndGgoKTtcblxuXHRcdFx0XHRpZiAoIHNjYWxlICE9PSBJbmZpbml0eSApIHtcblxuXHRcdFx0XHRcdHZlYy5tdWx0aXBseVNjYWxhciggc2NhbGUgKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0dmVjLnNldCggMSwgMCwgMCwgMCApOyAvLyBkbyBzb21ldGhpbmcgcmVhc29uYWJsZVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRza2luV2VpZ2h0LnNldFhZWlcoIGksIHZlYy54LCB2ZWMueSwgdmVjLnosIHZlYy53ICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9LFxuXG5cdHVwZGF0ZU1hdHJpeFdvcmxkOiBmdW5jdGlvbiAoIGZvcmNlICkge1xuXG5cdFx0TWVzaC5wcm90b3R5cGUudXBkYXRlTWF0cml4V29ybGQuY2FsbCggdGhpcywgZm9yY2UgKTtcblxuXHRcdGlmICggdGhpcy5iaW5kTW9kZSA9PT0gJ2F0dGFjaGVkJyApIHtcblxuXHRcdFx0dGhpcy5iaW5kTWF0cml4SW52ZXJzZS5nZXRJbnZlcnNlKCB0aGlzLm1hdHJpeFdvcmxkICk7XG5cblx0XHR9IGVsc2UgaWYgKCB0aGlzLmJpbmRNb2RlID09PSAnZGV0YWNoZWQnICkge1xuXG5cdFx0XHR0aGlzLmJpbmRNYXRyaXhJbnZlcnNlLmdldEludmVyc2UoIHRoaXMuYmluZE1hdHJpeCApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuU2tpbm5lZE1lc2g6IFVucmVjb2duaXplZCBiaW5kTW9kZTogJyArIHRoaXMuYmluZE1vZGUgKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoIHRoaXMuZ2VvbWV0cnksIHRoaXMubWF0ZXJpYWwgKS5jb3B5KCB0aGlzICk7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKlxuICogcGFyYW1ldGVycyA9IHtcbiAqICBjb2xvcjogPGhleD4sXG4gKiAgb3BhY2l0eTogPGZsb2F0PixcbiAqXG4gKiAgbGluZXdpZHRoOiA8ZmxvYXQ+LFxuICogIGxpbmVjYXA6IFwicm91bmRcIixcbiAqICBsaW5lam9pbjogXCJyb3VuZFwiXG4gKiB9XG4gKi9cblxuZnVuY3Rpb24gTGluZUJhc2ljTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKSB7XG5cblx0TWF0ZXJpYWwuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdMaW5lQmFzaWNNYXRlcmlhbCc7XG5cblx0dGhpcy5jb2xvciA9IG5ldyBDb2xvciggMHhmZmZmZmYgKTtcblxuXHR0aGlzLmxpbmV3aWR0aCA9IDE7XG5cdHRoaXMubGluZWNhcCA9ICdyb3VuZCc7XG5cdHRoaXMubGluZWpvaW4gPSAncm91bmQnO1xuXG5cdHRoaXMubGlnaHRzID0gZmFsc2U7XG5cblx0dGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTtcblxufVxuXG5MaW5lQmFzaWNNYXRlcmlhbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBNYXRlcmlhbC5wcm90b3R5cGUgKTtcbkxpbmVCYXNpY01hdGVyaWFsLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IExpbmVCYXNpY01hdGVyaWFsO1xuXG5MaW5lQmFzaWNNYXRlcmlhbC5wcm90b3R5cGUuaXNMaW5lQmFzaWNNYXRlcmlhbCA9IHRydWU7XG5cbkxpbmVCYXNpY01hdGVyaWFsLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0TWF0ZXJpYWwucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0dGhpcy5jb2xvci5jb3B5KCBzb3VyY2UuY29sb3IgKTtcblxuXHR0aGlzLmxpbmV3aWR0aCA9IHNvdXJjZS5saW5ld2lkdGg7XG5cdHRoaXMubGluZWNhcCA9IHNvdXJjZS5saW5lY2FwO1xuXHR0aGlzLmxpbmVqb2luID0gc291cmNlLmxpbmVqb2luO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gTGluZSggZ2VvbWV0cnksIG1hdGVyaWFsLCBtb2RlICkge1xuXG5cdGlmICggbW9kZSA9PT0gMSApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxpbmU6IHBhcmFtZXRlciBUSFJFRS5MaW5lUGllY2VzIG5vIGxvbmdlciBzdXBwb3J0ZWQuIENyZWF0ZWQgVEhSRUUuTGluZVNlZ21lbnRzIGluc3RlYWQuJyApO1xuXHRcdHJldHVybiBuZXcgTGluZVNlZ21lbnRzKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcblxuXHR9XG5cblx0T2JqZWN0M0QuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdMaW5lJztcblxuXHR0aGlzLmdlb21ldHJ5ID0gZ2VvbWV0cnkgIT09IHVuZGVmaW5lZCA/IGdlb21ldHJ5IDogbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cdHRoaXMubWF0ZXJpYWwgPSBtYXRlcmlhbCAhPT0gdW5kZWZpbmVkID8gbWF0ZXJpYWwgOiBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IE1hdGgucmFuZG9tKCkgKiAweGZmZmZmZiB9ICk7XG5cbn1cblxuTGluZS5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBMaW5lLFxuXG5cdGlzTGluZTogdHJ1ZSxcblxuXHRjb21wdXRlTGluZURpc3RhbmNlczogKCBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgc3RhcnQgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciBlbmQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGNvbXB1dGVMaW5lRGlzdGFuY2VzKCkge1xuXG5cdFx0XHR2YXIgZ2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5O1xuXG5cdFx0XHRpZiAoIGdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkgKSB7XG5cblx0XHRcdFx0Ly8gd2UgYXNzdW1lIG5vbi1pbmRleGVkIGdlb21ldHJ5XG5cblx0XHRcdFx0aWYgKCBnZW9tZXRyeS5pbmRleCA9PT0gbnVsbCApIHtcblxuXHRcdFx0XHRcdHZhciBwb3NpdGlvbkF0dHJpYnV0ZSA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247XG5cdFx0XHRcdFx0dmFyIGxpbmVEaXN0YW5jZXMgPSBbIDAgXTtcblxuXHRcdFx0XHRcdGZvciAoIHZhciBpID0gMSwgbCA9IHBvc2l0aW9uQXR0cmlidXRlLmNvdW50OyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdFx0c3RhcnQuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25BdHRyaWJ1dGUsIGkgLSAxICk7XG5cdFx0XHRcdFx0XHRlbmQuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25BdHRyaWJ1dGUsIGkgKTtcblxuXHRcdFx0XHRcdFx0bGluZURpc3RhbmNlc1sgaSBdID0gbGluZURpc3RhbmNlc1sgaSAtIDEgXTtcblx0XHRcdFx0XHRcdGxpbmVEaXN0YW5jZXNbIGkgXSArPSBzdGFydC5kaXN0YW5jZVRvKCBlbmQgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ2xpbmVEaXN0YW5jZScsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBsaW5lRGlzdGFuY2VzLCAxICkgKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTGluZS5jb21wdXRlTGluZURpc3RhbmNlcygpOiBDb21wdXRhdGlvbiBvbmx5IHBvc3NpYmxlIHdpdGggbm9uLWluZGV4ZWQgQnVmZmVyR2VvbWV0cnkuJyApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIGlmICggZ2VvbWV0cnkuaXNHZW9tZXRyeSApIHtcblxuXHRcdFx0XHR2YXIgdmVydGljZXMgPSBnZW9tZXRyeS52ZXJ0aWNlcztcblx0XHRcdFx0dmFyIGxpbmVEaXN0YW5jZXMgPSBnZW9tZXRyeS5saW5lRGlzdGFuY2VzO1xuXG5cdFx0XHRcdGxpbmVEaXN0YW5jZXNbIDAgXSA9IDA7XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAxLCBsID0gdmVydGljZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdGxpbmVEaXN0YW5jZXNbIGkgXSA9IGxpbmVEaXN0YW5jZXNbIGkgLSAxIF07XG5cdFx0XHRcdFx0bGluZURpc3RhbmNlc1sgaSBdICs9IHZlcnRpY2VzWyBpIC0gMSBdLmRpc3RhbmNlVG8oIHZlcnRpY2VzWyBpIF0gKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9O1xuXG5cdH0oKSApLFxuXG5cdHJheWNhc3Q6ICggZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGludmVyc2VNYXRyaXggPSBuZXcgTWF0cml4NCgpO1xuXHRcdHZhciByYXkgPSBuZXcgUmF5KCk7XG5cdFx0dmFyIHNwaGVyZSA9IG5ldyBTcGhlcmUoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiByYXljYXN0KCByYXljYXN0ZXIsIGludGVyc2VjdHMgKSB7XG5cblx0XHRcdHZhciBwcmVjaXNpb24gPSByYXljYXN0ZXIubGluZVByZWNpc2lvbjtcblx0XHRcdHZhciBwcmVjaXNpb25TcSA9IHByZWNpc2lvbiAqIHByZWNpc2lvbjtcblxuXHRcdFx0dmFyIGdlb21ldHJ5ID0gdGhpcy5nZW9tZXRyeTtcblx0XHRcdHZhciBtYXRyaXhXb3JsZCA9IHRoaXMubWF0cml4V29ybGQ7XG5cblx0XHRcdC8vIENoZWNraW5nIGJvdW5kaW5nU3BoZXJlIGRpc3RhbmNlIHRvIHJheVxuXG5cdFx0XHRpZiAoIGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlID09PSBudWxsICkgZ2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7XG5cblx0XHRcdHNwaGVyZS5jb3B5KCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSApO1xuXHRcdFx0c3BoZXJlLmFwcGx5TWF0cml4NCggbWF0cml4V29ybGQgKTtcblxuXHRcdFx0aWYgKCByYXljYXN0ZXIucmF5LmludGVyc2VjdHNTcGhlcmUoIHNwaGVyZSApID09PSBmYWxzZSApIHJldHVybjtcblxuXHRcdFx0Ly9cblxuXHRcdFx0aW52ZXJzZU1hdHJpeC5nZXRJbnZlcnNlKCBtYXRyaXhXb3JsZCApO1xuXHRcdFx0cmF5LmNvcHkoIHJheWNhc3Rlci5yYXkgKS5hcHBseU1hdHJpeDQoIGludmVyc2VNYXRyaXggKTtcblxuXHRcdFx0dmFyIHZTdGFydCA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0XHR2YXIgdkVuZCA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0XHR2YXIgaW50ZXJTZWdtZW50ID0gbmV3IFZlY3RvcjMoKTtcblx0XHRcdHZhciBpbnRlclJheSA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0XHR2YXIgc3RlcCA9ICggdGhpcyAmJiB0aGlzLmlzTGluZVNlZ21lbnRzICkgPyAyIDogMTtcblxuXHRcdFx0aWYgKCBnZW9tZXRyeS5pc0J1ZmZlckdlb21ldHJ5ICkge1xuXG5cdFx0XHRcdHZhciBpbmRleCA9IGdlb21ldHJ5LmluZGV4O1xuXHRcdFx0XHR2YXIgYXR0cmlidXRlcyA9IGdlb21ldHJ5LmF0dHJpYnV0ZXM7XG5cdFx0XHRcdHZhciBwb3NpdGlvbnMgPSBhdHRyaWJ1dGVzLnBvc2l0aW9uLmFycmF5O1xuXG5cdFx0XHRcdGlmICggaW5kZXggIT09IG51bGwgKSB7XG5cblx0XHRcdFx0XHR2YXIgaW5kaWNlcyA9IGluZGV4LmFycmF5O1xuXG5cdFx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gaW5kaWNlcy5sZW5ndGggLSAxOyBpIDwgbDsgaSArPSBzdGVwICkge1xuXG5cdFx0XHRcdFx0XHR2YXIgYSA9IGluZGljZXNbIGkgXTtcblx0XHRcdFx0XHRcdHZhciBiID0gaW5kaWNlc1sgaSArIDEgXTtcblxuXHRcdFx0XHRcdFx0dlN0YXJ0LmZyb21BcnJheSggcG9zaXRpb25zLCBhICogMyApO1xuXHRcdFx0XHRcdFx0dkVuZC5mcm9tQXJyYXkoIHBvc2l0aW9ucywgYiAqIDMgKTtcblxuXHRcdFx0XHRcdFx0dmFyIGRpc3RTcSA9IHJheS5kaXN0YW5jZVNxVG9TZWdtZW50KCB2U3RhcnQsIHZFbmQsIGludGVyUmF5LCBpbnRlclNlZ21lbnQgKTtcblxuXHRcdFx0XHRcdFx0aWYgKCBkaXN0U3EgPiBwcmVjaXNpb25TcSApIGNvbnRpbnVlO1xuXG5cdFx0XHRcdFx0XHRpbnRlclJheS5hcHBseU1hdHJpeDQoIHRoaXMubWF0cml4V29ybGQgKTsgLy9Nb3ZlIGJhY2sgdG8gd29ybGQgc3BhY2UgZm9yIGRpc3RhbmNlIGNhbGN1bGF0aW9uXG5cblx0XHRcdFx0XHRcdHZhciBkaXN0YW5jZSA9IHJheWNhc3Rlci5yYXkub3JpZ2luLmRpc3RhbmNlVG8oIGludGVyUmF5ICk7XG5cblx0XHRcdFx0XHRcdGlmICggZGlzdGFuY2UgPCByYXljYXN0ZXIubmVhciB8fCBkaXN0YW5jZSA+IHJheWNhc3Rlci5mYXIgKSBjb250aW51ZTtcblxuXHRcdFx0XHRcdFx0aW50ZXJzZWN0cy5wdXNoKCB7XG5cblx0XHRcdFx0XHRcdFx0ZGlzdGFuY2U6IGRpc3RhbmNlLFxuXHRcdFx0XHRcdFx0XHQvLyBXaGF0IGRvIHdlIHdhbnQ/IGludGVyc2VjdGlvbiBwb2ludCBvbiB0aGUgcmF5IG9yIG9uIHRoZSBzZWdtZW50Pz9cblx0XHRcdFx0XHRcdFx0Ly8gcG9pbnQ6IHJheWNhc3Rlci5yYXkuYXQoIGRpc3RhbmNlICksXG5cdFx0XHRcdFx0XHRcdHBvaW50OiBpbnRlclNlZ21lbnQuY2xvbmUoKS5hcHBseU1hdHJpeDQoIHRoaXMubWF0cml4V29ybGQgKSxcblx0XHRcdFx0XHRcdFx0aW5kZXg6IGksXG5cdFx0XHRcdFx0XHRcdGZhY2U6IG51bGwsXG5cdFx0XHRcdFx0XHRcdGZhY2VJbmRleDogbnVsbCxcblx0XHRcdFx0XHRcdFx0b2JqZWN0OiB0aGlzXG5cblx0XHRcdFx0XHRcdH0gKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gcG9zaXRpb25zLmxlbmd0aCAvIDMgLSAxOyBpIDwgbDsgaSArPSBzdGVwICkge1xuXG5cdFx0XHRcdFx0XHR2U3RhcnQuZnJvbUFycmF5KCBwb3NpdGlvbnMsIDMgKiBpICk7XG5cdFx0XHRcdFx0XHR2RW5kLmZyb21BcnJheSggcG9zaXRpb25zLCAzICogaSArIDMgKTtcblxuXHRcdFx0XHRcdFx0dmFyIGRpc3RTcSA9IHJheS5kaXN0YW5jZVNxVG9TZWdtZW50KCB2U3RhcnQsIHZFbmQsIGludGVyUmF5LCBpbnRlclNlZ21lbnQgKTtcblxuXHRcdFx0XHRcdFx0aWYgKCBkaXN0U3EgPiBwcmVjaXNpb25TcSApIGNvbnRpbnVlO1xuXG5cdFx0XHRcdFx0XHRpbnRlclJheS5hcHBseU1hdHJpeDQoIHRoaXMubWF0cml4V29ybGQgKTsgLy9Nb3ZlIGJhY2sgdG8gd29ybGQgc3BhY2UgZm9yIGRpc3RhbmNlIGNhbGN1bGF0aW9uXG5cblx0XHRcdFx0XHRcdHZhciBkaXN0YW5jZSA9IHJheWNhc3Rlci5yYXkub3JpZ2luLmRpc3RhbmNlVG8oIGludGVyUmF5ICk7XG5cblx0XHRcdFx0XHRcdGlmICggZGlzdGFuY2UgPCByYXljYXN0ZXIubmVhciB8fCBkaXN0YW5jZSA+IHJheWNhc3Rlci5mYXIgKSBjb250aW51ZTtcblxuXHRcdFx0XHRcdFx0aW50ZXJzZWN0cy5wdXNoKCB7XG5cblx0XHRcdFx0XHRcdFx0ZGlzdGFuY2U6IGRpc3RhbmNlLFxuXHRcdFx0XHRcdFx0XHQvLyBXaGF0IGRvIHdlIHdhbnQ/IGludGVyc2VjdGlvbiBwb2ludCBvbiB0aGUgcmF5IG9yIG9uIHRoZSBzZWdtZW50Pz9cblx0XHRcdFx0XHRcdFx0Ly8gcG9pbnQ6IHJheWNhc3Rlci5yYXkuYXQoIGRpc3RhbmNlICksXG5cdFx0XHRcdFx0XHRcdHBvaW50OiBpbnRlclNlZ21lbnQuY2xvbmUoKS5hcHBseU1hdHJpeDQoIHRoaXMubWF0cml4V29ybGQgKSxcblx0XHRcdFx0XHRcdFx0aW5kZXg6IGksXG5cdFx0XHRcdFx0XHRcdGZhY2U6IG51bGwsXG5cdFx0XHRcdFx0XHRcdGZhY2VJbmRleDogbnVsbCxcblx0XHRcdFx0XHRcdFx0b2JqZWN0OiB0aGlzXG5cblx0XHRcdFx0XHRcdH0gKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSBpZiAoIGdlb21ldHJ5LmlzR2VvbWV0cnkgKSB7XG5cblx0XHRcdFx0dmFyIHZlcnRpY2VzID0gZ2VvbWV0cnkudmVydGljZXM7XG5cdFx0XHRcdHZhciBuYlZlcnRpY2VzID0gdmVydGljZXMubGVuZ3RoO1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IG5iVmVydGljZXMgLSAxOyBpICs9IHN0ZXAgKSB7XG5cblx0XHRcdFx0XHR2YXIgZGlzdFNxID0gcmF5LmRpc3RhbmNlU3FUb1NlZ21lbnQoIHZlcnRpY2VzWyBpIF0sIHZlcnRpY2VzWyBpICsgMSBdLCBpbnRlclJheSwgaW50ZXJTZWdtZW50ICk7XG5cblx0XHRcdFx0XHRpZiAoIGRpc3RTcSA+IHByZWNpc2lvblNxICkgY29udGludWU7XG5cblx0XHRcdFx0XHRpbnRlclJheS5hcHBseU1hdHJpeDQoIHRoaXMubWF0cml4V29ybGQgKTsgLy9Nb3ZlIGJhY2sgdG8gd29ybGQgc3BhY2UgZm9yIGRpc3RhbmNlIGNhbGN1bGF0aW9uXG5cblx0XHRcdFx0XHR2YXIgZGlzdGFuY2UgPSByYXljYXN0ZXIucmF5Lm9yaWdpbi5kaXN0YW5jZVRvKCBpbnRlclJheSApO1xuXG5cdFx0XHRcdFx0aWYgKCBkaXN0YW5jZSA8IHJheWNhc3Rlci5uZWFyIHx8IGRpc3RhbmNlID4gcmF5Y2FzdGVyLmZhciApIGNvbnRpbnVlO1xuXG5cdFx0XHRcdFx0aW50ZXJzZWN0cy5wdXNoKCB7XG5cblx0XHRcdFx0XHRcdGRpc3RhbmNlOiBkaXN0YW5jZSxcblx0XHRcdFx0XHRcdC8vIFdoYXQgZG8gd2Ugd2FudD8gaW50ZXJzZWN0aW9uIHBvaW50IG9uIHRoZSByYXkgb3Igb24gdGhlIHNlZ21lbnQ/P1xuXHRcdFx0XHRcdFx0Ly8gcG9pbnQ6IHJheWNhc3Rlci5yYXkuYXQoIGRpc3RhbmNlICksXG5cdFx0XHRcdFx0XHRwb2ludDogaW50ZXJTZWdtZW50LmNsb25lKCkuYXBwbHlNYXRyaXg0KCB0aGlzLm1hdHJpeFdvcmxkICksXG5cdFx0XHRcdFx0XHRpbmRleDogaSxcblx0XHRcdFx0XHRcdGZhY2U6IG51bGwsXG5cdFx0XHRcdFx0XHRmYWNlSW5kZXg6IG51bGwsXG5cdFx0XHRcdFx0XHRvYmplY3Q6IHRoaXNcblxuXHRcdFx0XHRcdH0gKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH07XG5cblx0fSgpICksXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvciggdGhpcy5nZW9tZXRyeSwgdGhpcy5tYXRlcmlhbCApLmNvcHkoIHRoaXMgKTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIExpbmVTZWdtZW50cyggZ2VvbWV0cnksIG1hdGVyaWFsICkge1xuXG5cdExpbmUuY2FsbCggdGhpcywgZ2VvbWV0cnksIG1hdGVyaWFsICk7XG5cblx0dGhpcy50eXBlID0gJ0xpbmVTZWdtZW50cyc7XG5cbn1cblxuTGluZVNlZ21lbnRzLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIExpbmUucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogTGluZVNlZ21lbnRzLFxuXG5cdGlzTGluZVNlZ21lbnRzOiB0cnVlLFxuXG5cdGNvbXB1dGVMaW5lRGlzdGFuY2VzOiAoIGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBzdGFydCA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIGVuZCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gY29tcHV0ZUxpbmVEaXN0YW5jZXMoKSB7XG5cblx0XHRcdHZhciBnZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7XG5cblx0XHRcdGlmICggZ2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSApIHtcblxuXHRcdFx0XHQvLyB3ZSBhc3N1bWUgbm9uLWluZGV4ZWQgZ2VvbWV0cnlcblxuXHRcdFx0XHRpZiAoIGdlb21ldHJ5LmluZGV4ID09PSBudWxsICkge1xuXG5cdFx0XHRcdFx0dmFyIHBvc2l0aW9uQXR0cmlidXRlID0gZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbjtcblx0XHRcdFx0XHR2YXIgbGluZURpc3RhbmNlcyA9IFtdO1xuXG5cdFx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gcG9zaXRpb25BdHRyaWJ1dGUuY291bnQ7IGkgPCBsOyBpICs9IDIgKSB7XG5cblx0XHRcdFx0XHRcdHN0YXJ0LmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uQXR0cmlidXRlLCBpICk7XG5cdFx0XHRcdFx0XHRlbmQuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25BdHRyaWJ1dGUsIGkgKyAxICk7XG5cblx0XHRcdFx0XHRcdGxpbmVEaXN0YW5jZXNbIGkgXSA9ICggaSA9PT0gMCApID8gMCA6IGxpbmVEaXN0YW5jZXNbIGkgLSAxIF07XG5cdFx0XHRcdFx0XHRsaW5lRGlzdGFuY2VzWyBpICsgMSBdID0gbGluZURpc3RhbmNlc1sgaSBdICsgc3RhcnQuZGlzdGFuY2VUbyggZW5kICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdsaW5lRGlzdGFuY2UnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbGluZURpc3RhbmNlcywgMSApICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxpbmVTZWdtZW50cy5jb21wdXRlTGluZURpc3RhbmNlcygpOiBDb21wdXRhdGlvbiBvbmx5IHBvc3NpYmxlIHdpdGggbm9uLWluZGV4ZWQgQnVmZmVyR2VvbWV0cnkuJyApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIGlmICggZ2VvbWV0cnkuaXNHZW9tZXRyeSApIHtcblxuXHRcdFx0XHR2YXIgdmVydGljZXMgPSBnZW9tZXRyeS52ZXJ0aWNlcztcblx0XHRcdFx0dmFyIGxpbmVEaXN0YW5jZXMgPSBnZW9tZXRyeS5saW5lRGlzdGFuY2VzO1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHZlcnRpY2VzLmxlbmd0aDsgaSA8IGw7IGkgKz0gMiApIHtcblxuXHRcdFx0XHRcdHN0YXJ0LmNvcHkoIHZlcnRpY2VzWyBpIF0gKTtcblx0XHRcdFx0XHRlbmQuY29weSggdmVydGljZXNbIGkgKyAxIF0gKTtcblxuXHRcdFx0XHRcdGxpbmVEaXN0YW5jZXNbIGkgXSA9ICggaSA9PT0gMCApID8gMCA6IGxpbmVEaXN0YW5jZXNbIGkgLSAxIF07XG5cdFx0XHRcdFx0bGluZURpc3RhbmNlc1sgaSArIDEgXSA9IGxpbmVEaXN0YW5jZXNbIGkgXSArIHN0YXJ0LmRpc3RhbmNlVG8oIGVuZCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpIClcblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbWdyZXRlciAvIGh0dHA6Ly9naXRodWIuY29tL21ncmV0ZXJcbiAqL1xuXG5mdW5jdGlvbiBMaW5lTG9vcCggZ2VvbWV0cnksIG1hdGVyaWFsICkge1xuXG5cdExpbmUuY2FsbCggdGhpcywgZ2VvbWV0cnksIG1hdGVyaWFsICk7XG5cblx0dGhpcy50eXBlID0gJ0xpbmVMb29wJztcblxufVxuXG5MaW5lTG9vcC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBMaW5lLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IExpbmVMb29wLFxuXG5cdGlzTGluZUxvb3A6IHRydWUsXG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqXG4gKiBwYXJhbWV0ZXJzID0ge1xuICogIGNvbG9yOiA8aGV4PixcbiAqICBvcGFjaXR5OiA8ZmxvYXQ+LFxuICogIG1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgc2l6ZTogPGZsb2F0PixcbiAqICBzaXplQXR0ZW51YXRpb246IDxib29sPlxuICogfVxuICovXG5cbmZ1bmN0aW9uIFBvaW50c01hdGVyaWFsKCBwYXJhbWV0ZXJzICkge1xuXG5cdE1hdGVyaWFsLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnUG9pbnRzTWF0ZXJpYWwnO1xuXG5cdHRoaXMuY29sb3IgPSBuZXcgQ29sb3IoIDB4ZmZmZmZmICk7XG5cblx0dGhpcy5tYXAgPSBudWxsO1xuXG5cdHRoaXMuc2l6ZSA9IDE7XG5cdHRoaXMuc2l6ZUF0dGVudWF0aW9uID0gdHJ1ZTtcblxuXHR0aGlzLmxpZ2h0cyA9IGZhbHNlO1xuXG5cdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XG5cbn1cblxuUG9pbnRzTWF0ZXJpYWwucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTWF0ZXJpYWwucHJvdG90eXBlICk7XG5Qb2ludHNNYXRlcmlhbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBQb2ludHNNYXRlcmlhbDtcblxuUG9pbnRzTWF0ZXJpYWwucHJvdG90eXBlLmlzUG9pbnRzTWF0ZXJpYWwgPSB0cnVlO1xuXG5Qb2ludHNNYXRlcmlhbC5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdHRoaXMuY29sb3IuY29weSggc291cmNlLmNvbG9yICk7XG5cblx0dGhpcy5tYXAgPSBzb3VyY2UubWFwO1xuXG5cdHRoaXMuc2l6ZSA9IHNvdXJjZS5zaXplO1xuXHR0aGlzLnNpemVBdHRlbnVhdGlvbiA9IHNvdXJjZS5zaXplQXR0ZW51YXRpb247XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBQb2ludHMoIGdlb21ldHJ5LCBtYXRlcmlhbCApIHtcblxuXHRPYmplY3QzRC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1BvaW50cyc7XG5cblx0dGhpcy5nZW9tZXRyeSA9IGdlb21ldHJ5ICE9PSB1bmRlZmluZWQgPyBnZW9tZXRyeSA6IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXHR0aGlzLm1hdGVyaWFsID0gbWF0ZXJpYWwgIT09IHVuZGVmaW5lZCA/IG1hdGVyaWFsIDogbmV3IFBvaW50c01hdGVyaWFsKCB7IGNvbG9yOiBNYXRoLnJhbmRvbSgpICogMHhmZmZmZmYgfSApO1xuXG59XG5cblBvaW50cy5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBQb2ludHMsXG5cblx0aXNQb2ludHM6IHRydWUsXG5cblx0cmF5Y2FzdDogKCBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgaW52ZXJzZU1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7XG5cdFx0dmFyIHJheSA9IG5ldyBSYXkoKTtcblx0XHR2YXIgc3BoZXJlID0gbmV3IFNwaGVyZSgpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHJheWNhc3QoIHJheWNhc3RlciwgaW50ZXJzZWN0cyApIHtcblxuXHRcdFx0dmFyIG9iamVjdCA9IHRoaXM7XG5cdFx0XHR2YXIgZ2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5O1xuXHRcdFx0dmFyIG1hdHJpeFdvcmxkID0gdGhpcy5tYXRyaXhXb3JsZDtcblx0XHRcdHZhciB0aHJlc2hvbGQgPSByYXljYXN0ZXIucGFyYW1zLlBvaW50cy50aHJlc2hvbGQ7XG5cblx0XHRcdC8vIENoZWNraW5nIGJvdW5kaW5nU3BoZXJlIGRpc3RhbmNlIHRvIHJheVxuXG5cdFx0XHRpZiAoIGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlID09PSBudWxsICkgZ2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7XG5cblx0XHRcdHNwaGVyZS5jb3B5KCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSApO1xuXHRcdFx0c3BoZXJlLmFwcGx5TWF0cml4NCggbWF0cml4V29ybGQgKTtcblx0XHRcdHNwaGVyZS5yYWRpdXMgKz0gdGhyZXNob2xkO1xuXG5cdFx0XHRpZiAoIHJheWNhc3Rlci5yYXkuaW50ZXJzZWN0c1NwaGVyZSggc3BoZXJlICkgPT09IGZhbHNlICkgcmV0dXJuO1xuXG5cdFx0XHQvL1xuXG5cdFx0XHRpbnZlcnNlTWF0cml4LmdldEludmVyc2UoIG1hdHJpeFdvcmxkICk7XG5cdFx0XHRyYXkuY29weSggcmF5Y2FzdGVyLnJheSApLmFwcGx5TWF0cml4NCggaW52ZXJzZU1hdHJpeCApO1xuXG5cdFx0XHR2YXIgbG9jYWxUaHJlc2hvbGQgPSB0aHJlc2hvbGQgLyAoICggdGhpcy5zY2FsZS54ICsgdGhpcy5zY2FsZS55ICsgdGhpcy5zY2FsZS56ICkgLyAzICk7XG5cdFx0XHR2YXIgbG9jYWxUaHJlc2hvbGRTcSA9IGxvY2FsVGhyZXNob2xkICogbG9jYWxUaHJlc2hvbGQ7XG5cdFx0XHR2YXIgcG9zaXRpb24gPSBuZXcgVmVjdG9yMygpO1xuXHRcdFx0dmFyIGludGVyc2VjdFBvaW50ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdFx0ZnVuY3Rpb24gdGVzdFBvaW50KCBwb2ludCwgaW5kZXggKSB7XG5cblx0XHRcdFx0dmFyIHJheVBvaW50RGlzdGFuY2VTcSA9IHJheS5kaXN0YW5jZVNxVG9Qb2ludCggcG9pbnQgKTtcblxuXHRcdFx0XHRpZiAoIHJheVBvaW50RGlzdGFuY2VTcSA8IGxvY2FsVGhyZXNob2xkU3EgKSB7XG5cblx0XHRcdFx0XHRyYXkuY2xvc2VzdFBvaW50VG9Qb2ludCggcG9pbnQsIGludGVyc2VjdFBvaW50ICk7XG5cdFx0XHRcdFx0aW50ZXJzZWN0UG9pbnQuYXBwbHlNYXRyaXg0KCBtYXRyaXhXb3JsZCApO1xuXG5cdFx0XHRcdFx0dmFyIGRpc3RhbmNlID0gcmF5Y2FzdGVyLnJheS5vcmlnaW4uZGlzdGFuY2VUbyggaW50ZXJzZWN0UG9pbnQgKTtcblxuXHRcdFx0XHRcdGlmICggZGlzdGFuY2UgPCByYXljYXN0ZXIubmVhciB8fCBkaXN0YW5jZSA+IHJheWNhc3Rlci5mYXIgKSByZXR1cm47XG5cblx0XHRcdFx0XHRpbnRlcnNlY3RzLnB1c2goIHtcblxuXHRcdFx0XHRcdFx0ZGlzdGFuY2U6IGRpc3RhbmNlLFxuXHRcdFx0XHRcdFx0ZGlzdGFuY2VUb1JheTogTWF0aC5zcXJ0KCByYXlQb2ludERpc3RhbmNlU3EgKSxcblx0XHRcdFx0XHRcdHBvaW50OiBpbnRlcnNlY3RQb2ludC5jbG9uZSgpLFxuXHRcdFx0XHRcdFx0aW5kZXg6IGluZGV4LFxuXHRcdFx0XHRcdFx0ZmFjZTogbnVsbCxcblx0XHRcdFx0XHRcdG9iamVjdDogb2JqZWN0XG5cblx0XHRcdFx0XHR9ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggZ2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSApIHtcblxuXHRcdFx0XHR2YXIgaW5kZXggPSBnZW9tZXRyeS5pbmRleDtcblx0XHRcdFx0dmFyIGF0dHJpYnV0ZXMgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzO1xuXHRcdFx0XHR2YXIgcG9zaXRpb25zID0gYXR0cmlidXRlcy5wb3NpdGlvbi5hcnJheTtcblxuXHRcdFx0XHRpZiAoIGluZGV4ICE9PSBudWxsICkge1xuXG5cdFx0XHRcdFx0dmFyIGluZGljZXMgPSBpbmRleC5hcnJheTtcblxuXHRcdFx0XHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBpbmRpY2VzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0XHR2YXIgYSA9IGluZGljZXNbIGkgXTtcblxuXHRcdFx0XHRcdFx0cG9zaXRpb24uZnJvbUFycmF5KCBwb3NpdGlvbnMsIGEgKiAzICk7XG5cblx0XHRcdFx0XHRcdHRlc3RQb2ludCggcG9zaXRpb24sIGEgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gcG9zaXRpb25zLmxlbmd0aCAvIDM7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0XHRwb3NpdGlvbi5mcm9tQXJyYXkoIHBvc2l0aW9ucywgaSAqIDMgKTtcblxuXHRcdFx0XHRcdFx0dGVzdFBvaW50KCBwb3NpdGlvbiwgaSApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHR2YXIgdmVydGljZXMgPSBnZW9tZXRyeS52ZXJ0aWNlcztcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSB2ZXJ0aWNlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0dGVzdFBvaW50KCB2ZXJ0aWNlc1sgaSBdLCBpICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9O1xuXG5cdH0oKSApLFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoIHRoaXMuZ2VvbWV0cnksIHRoaXMubWF0ZXJpYWwgKS5jb3B5KCB0aGlzICk7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBHcm91cCgpIHtcblxuXHRPYmplY3QzRC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0dyb3VwJztcblxufVxuXG5Hcm91cC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBHcm91cCxcblxuXHRpc0dyb3VwOiB0cnVlXG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIFZpZGVvVGV4dHVyZSggdmlkZW8sIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmlsdGVyLCBtaW5GaWx0ZXIsIGZvcm1hdCwgdHlwZSwgYW5pc290cm9weSApIHtcblxuXHRUZXh0dXJlLmNhbGwoIHRoaXMsIHZpZGVvLCBtYXBwaW5nLCB3cmFwUywgd3JhcFQsIG1hZ0ZpbHRlciwgbWluRmlsdGVyLCBmb3JtYXQsIHR5cGUsIGFuaXNvdHJvcHkgKTtcblxuXHR0aGlzLmdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlO1xuXG59XG5cblZpZGVvVGV4dHVyZS5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBUZXh0dXJlLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IFZpZGVvVGV4dHVyZSxcblxuXHRpc1ZpZGVvVGV4dHVyZTogdHJ1ZSxcblxuXHR1cGRhdGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2aWRlbyA9IHRoaXMuaW1hZ2U7XG5cblx0XHRpZiAoIHZpZGVvLnJlYWR5U3RhdGUgPj0gdmlkZW8uSEFWRV9DVVJSRU5UX0RBVEEgKSB7XG5cblx0XHRcdHRoaXMubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0fVxuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKi9cblxuZnVuY3Rpb24gQ29tcHJlc3NlZFRleHR1cmUoIG1pcG1hcHMsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdHlwZSwgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIsIG1pbkZpbHRlciwgYW5pc290cm9weSwgZW5jb2RpbmcgKSB7XG5cblx0VGV4dHVyZS5jYWxsKCB0aGlzLCBudWxsLCBtYXBwaW5nLCB3cmFwUywgd3JhcFQsIG1hZ0ZpbHRlciwgbWluRmlsdGVyLCBmb3JtYXQsIHR5cGUsIGFuaXNvdHJvcHksIGVuY29kaW5nICk7XG5cblx0dGhpcy5pbWFnZSA9IHsgd2lkdGg6IHdpZHRoLCBoZWlnaHQ6IGhlaWdodCB9O1xuXHR0aGlzLm1pcG1hcHMgPSBtaXBtYXBzO1xuXG5cdC8vIG5vIGZsaXBwaW5nIGZvciBjdWJlIHRleHR1cmVzXG5cdC8vIChhbHNvIGZsaXBwaW5nIGRvZXNuJ3Qgd29yayBmb3IgY29tcHJlc3NlZCB0ZXh0dXJlcyApXG5cblx0dGhpcy5mbGlwWSA9IGZhbHNlO1xuXG5cdC8vIGNhbid0IGdlbmVyYXRlIG1pcG1hcHMgZm9yIGNvbXByZXNzZWQgdGV4dHVyZXNcblx0Ly8gbWlwcyBtdXN0IGJlIGVtYmVkZGVkIGluIEREUyBmaWxlc1xuXG5cdHRoaXMuZ2VuZXJhdGVNaXBtYXBzID0gZmFsc2U7XG5cbn1cblxuQ29tcHJlc3NlZFRleHR1cmUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggVGV4dHVyZS5wcm90b3R5cGUgKTtcbkNvbXByZXNzZWRUZXh0dXJlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IENvbXByZXNzZWRUZXh0dXJlO1xuXG5Db21wcmVzc2VkVGV4dHVyZS5wcm90b3R5cGUuaXNDb21wcmVzc2VkVGV4dHVyZSA9IHRydWU7XG5cbi8qKlxuICogQGF1dGhvciBNYXR0IERlc0xhdXJpZXJzIC8gQG1hdHRkZXNsXG4gKiBAYXV0aG9yIGF0aXggLyBhcnRodXJzaWxiZXIuZGVcbiAqL1xuXG5mdW5jdGlvbiBEZXB0aFRleHR1cmUoIHdpZHRoLCBoZWlnaHQsIHR5cGUsIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmlsdGVyLCBtaW5GaWx0ZXIsIGFuaXNvdHJvcHksIGZvcm1hdCApIHtcblxuXHRmb3JtYXQgPSBmb3JtYXQgIT09IHVuZGVmaW5lZCA/IGZvcm1hdCA6IERlcHRoRm9ybWF0O1xuXG5cdGlmICggZm9ybWF0ICE9PSBEZXB0aEZvcm1hdCAmJiBmb3JtYXQgIT09IERlcHRoU3RlbmNpbEZvcm1hdCApIHtcblxuXHRcdHRocm93IG5ldyBFcnJvciggJ0RlcHRoVGV4dHVyZSBmb3JtYXQgbXVzdCBiZSBlaXRoZXIgVEhSRUUuRGVwdGhGb3JtYXQgb3IgVEhSRUUuRGVwdGhTdGVuY2lsRm9ybWF0JyApO1xuXG5cdH1cblxuXHRpZiAoIHR5cGUgPT09IHVuZGVmaW5lZCAmJiBmb3JtYXQgPT09IERlcHRoRm9ybWF0ICkgdHlwZSA9IFVuc2lnbmVkU2hvcnRUeXBlO1xuXHRpZiAoIHR5cGUgPT09IHVuZGVmaW5lZCAmJiBmb3JtYXQgPT09IERlcHRoU3RlbmNpbEZvcm1hdCApIHR5cGUgPSBVbnNpZ25lZEludDI0OFR5cGU7XG5cblx0VGV4dHVyZS5jYWxsKCB0aGlzLCBudWxsLCBtYXBwaW5nLCB3cmFwUywgd3JhcFQsIG1hZ0ZpbHRlciwgbWluRmlsdGVyLCBmb3JtYXQsIHR5cGUsIGFuaXNvdHJvcHkgKTtcblxuXHR0aGlzLmltYWdlID0geyB3aWR0aDogd2lkdGgsIGhlaWdodDogaGVpZ2h0IH07XG5cblx0dGhpcy5tYWdGaWx0ZXIgPSBtYWdGaWx0ZXIgIT09IHVuZGVmaW5lZCA/IG1hZ0ZpbHRlciA6IE5lYXJlc3RGaWx0ZXI7XG5cdHRoaXMubWluRmlsdGVyID0gbWluRmlsdGVyICE9PSB1bmRlZmluZWQgPyBtaW5GaWx0ZXIgOiBOZWFyZXN0RmlsdGVyO1xuXG5cdHRoaXMuZmxpcFkgPSBmYWxzZTtcblx0dGhpcy5nZW5lcmF0ZU1pcG1hcHNcdD0gZmFsc2U7XG5cbn1cblxuRGVwdGhUZXh0dXJlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIFRleHR1cmUucHJvdG90eXBlICk7XG5EZXB0aFRleHR1cmUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gRGVwdGhUZXh0dXJlO1xuRGVwdGhUZXh0dXJlLnByb3RvdHlwZS5pc0RlcHRoVGV4dHVyZSA9IHRydWU7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKi9cblxuZnVuY3Rpb24gV2lyZWZyYW1lR2VvbWV0cnkoIGdlb21ldHJ5ICkge1xuXG5cdEJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnV2lyZWZyYW1lR2VvbWV0cnknO1xuXG5cdC8vIGJ1ZmZlclxuXG5cdHZhciB2ZXJ0aWNlcyA9IFtdO1xuXG5cdC8vIGhlbHBlciB2YXJpYWJsZXNcblxuXHR2YXIgaSwgaiwgbCwgbywgb2w7XG5cdHZhciBlZGdlID0gWyAwLCAwIF0sIGVkZ2VzID0ge30sIGUsIGVkZ2UxLCBlZGdlMjtcblx0dmFyIGtleSwga2V5cyA9IFsgJ2EnLCAnYicsICdjJyBdO1xuXHR2YXIgdmVydGV4O1xuXG5cdC8vIGRpZmZlcmVudCBsb2dpYyBmb3IgR2VvbWV0cnkgYW5kIEJ1ZmZlckdlb21ldHJ5XG5cblx0aWYgKCBnZW9tZXRyeSAmJiBnZW9tZXRyeS5pc0dlb21ldHJ5ICkge1xuXG5cdFx0Ly8gY3JlYXRlIGEgZGF0YSBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyBhbGwgZWRnZXMgd2l0aG91dCBkdXBsaWNhdGVzXG5cblx0XHR2YXIgZmFjZXMgPSBnZW9tZXRyeS5mYWNlcztcblxuXHRcdGZvciAoIGkgPSAwLCBsID0gZmFjZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGZhY2UgPSBmYWNlc1sgaSBdO1xuXG5cdFx0XHRmb3IgKCBqID0gMDsgaiA8IDM7IGogKysgKSB7XG5cblx0XHRcdFx0ZWRnZTEgPSBmYWNlWyBrZXlzWyBqIF0gXTtcblx0XHRcdFx0ZWRnZTIgPSBmYWNlWyBrZXlzWyAoIGogKyAxICkgJSAzIF0gXTtcblx0XHRcdFx0ZWRnZVsgMCBdID0gTWF0aC5taW4oIGVkZ2UxLCBlZGdlMiApOyAvLyBzb3J0aW5nIHByZXZlbnRzIGR1cGxpY2F0ZXNcblx0XHRcdFx0ZWRnZVsgMSBdID0gTWF0aC5tYXgoIGVkZ2UxLCBlZGdlMiApO1xuXG5cdFx0XHRcdGtleSA9IGVkZ2VbIDAgXSArICcsJyArIGVkZ2VbIDEgXTtcblxuXHRcdFx0XHRpZiAoIGVkZ2VzWyBrZXkgXSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0ZWRnZXNbIGtleSBdID0geyBpbmRleDE6IGVkZ2VbIDAgXSwgaW5kZXgyOiBlZGdlWyAxIF0gfTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIGdlbmVyYXRlIHZlcnRpY2VzXG5cblx0XHRmb3IgKCBrZXkgaW4gZWRnZXMgKSB7XG5cblx0XHRcdGUgPSBlZGdlc1sga2V5IF07XG5cblx0XHRcdHZlcnRleCA9IGdlb21ldHJ5LnZlcnRpY2VzWyBlLmluZGV4MSBdO1xuXHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0XHR2ZXJ0ZXggPSBnZW9tZXRyeS52ZXJ0aWNlc1sgZS5pbmRleDIgXTtcblx0XHRcdHZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTtcblxuXHRcdH1cblxuXHR9IGVsc2UgaWYgKCBnZW9tZXRyeSAmJiBnZW9tZXRyeS5pc0J1ZmZlckdlb21ldHJ5ICkge1xuXG5cdFx0dmFyIHBvc2l0aW9uLCBpbmRpY2VzLCBncm91cHM7XG5cdFx0dmFyIGdyb3VwLCBzdGFydCwgY291bnQ7XG5cdFx0dmFyIGluZGV4MSwgaW5kZXgyO1xuXG5cdFx0dmVydGV4ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdGlmICggZ2VvbWV0cnkuaW5kZXggIT09IG51bGwgKSB7XG5cblx0XHRcdC8vIGluZGV4ZWQgQnVmZmVyR2VvbWV0cnlcblxuXHRcdFx0cG9zaXRpb24gPSBnZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uO1xuXHRcdFx0aW5kaWNlcyA9IGdlb21ldHJ5LmluZGV4O1xuXHRcdFx0Z3JvdXBzID0gZ2VvbWV0cnkuZ3JvdXBzO1xuXG5cdFx0XHRpZiAoIGdyb3Vwcy5sZW5ndGggPT09IDAgKSB7XG5cblx0XHRcdFx0Z3JvdXBzID0gWyB7IHN0YXJ0OiAwLCBjb3VudDogaW5kaWNlcy5jb3VudCwgbWF0ZXJpYWxJbmRleDogMCB9IF07XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gY3JlYXRlIGEgZGF0YSBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyBhbGwgZWdlcyB3aXRob3V0IGR1cGxpY2F0ZXNcblxuXHRcdFx0Zm9yICggbyA9IDAsIG9sID0gZ3JvdXBzLmxlbmd0aDsgbyA8IG9sOyArKyBvICkge1xuXG5cdFx0XHRcdGdyb3VwID0gZ3JvdXBzWyBvIF07XG5cblx0XHRcdFx0c3RhcnQgPSBncm91cC5zdGFydDtcblx0XHRcdFx0Y291bnQgPSBncm91cC5jb3VudDtcblxuXHRcdFx0XHRmb3IgKCBpID0gc3RhcnQsIGwgPSAoIHN0YXJ0ICsgY291bnQgKTsgaSA8IGw7IGkgKz0gMyApIHtcblxuXHRcdFx0XHRcdGZvciAoIGogPSAwOyBqIDwgMzsgaiArKyApIHtcblxuXHRcdFx0XHRcdFx0ZWRnZTEgPSBpbmRpY2VzLmdldFgoIGkgKyBqICk7XG5cdFx0XHRcdFx0XHRlZGdlMiA9IGluZGljZXMuZ2V0WCggaSArICggaiArIDEgKSAlIDMgKTtcblx0XHRcdFx0XHRcdGVkZ2VbIDAgXSA9IE1hdGgubWluKCBlZGdlMSwgZWRnZTIgKTsgLy8gc29ydGluZyBwcmV2ZW50cyBkdXBsaWNhdGVzXG5cdFx0XHRcdFx0XHRlZGdlWyAxIF0gPSBNYXRoLm1heCggZWRnZTEsIGVkZ2UyICk7XG5cblx0XHRcdFx0XHRcdGtleSA9IGVkZ2VbIDAgXSArICcsJyArIGVkZ2VbIDEgXTtcblxuXHRcdFx0XHRcdFx0aWYgKCBlZGdlc1sga2V5IF0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdFx0XHRlZGdlc1sga2V5IF0gPSB7IGluZGV4MTogZWRnZVsgMCBdLCBpbmRleDI6IGVkZ2VbIDEgXSB9O1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdC8vIGdlbmVyYXRlIHZlcnRpY2VzXG5cblx0XHRcdGZvciAoIGtleSBpbiBlZGdlcyApIHtcblxuXHRcdFx0XHRlID0gZWRnZXNbIGtleSBdO1xuXG5cdFx0XHRcdHZlcnRleC5mcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbiwgZS5pbmRleDEgKTtcblx0XHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0XHRcdHZlcnRleC5mcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbiwgZS5pbmRleDIgKTtcblx0XHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBub24taW5kZXhlZCBCdWZmZXJHZW9tZXRyeVxuXG5cdFx0XHRwb3NpdGlvbiA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247XG5cblx0XHRcdGZvciAoIGkgPSAwLCBsID0gKCBwb3NpdGlvbi5jb3VudCAvIDMgKTsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0Zm9yICggaiA9IDA7IGogPCAzOyBqICsrICkge1xuXG5cdFx0XHRcdFx0Ly8gdGhyZWUgZWRnZXMgcGVyIHRyaWFuZ2xlLCBhbiBlZGdlIGlzIHJlcHJlc2VudGVkIGFzIChpbmRleDEsIGluZGV4Milcblx0XHRcdFx0XHQvLyBlLmcuIHRoZSBmaXJzdCB0cmlhbmdsZSBoYXMgdGhlIGZvbGxvd2luZyBlZGdlczogKDAsMSksKDEsMiksKDIsMClcblxuXHRcdFx0XHRcdGluZGV4MSA9IDMgKiBpICsgajtcblx0XHRcdFx0XHR2ZXJ0ZXguZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb24sIGluZGV4MSApO1xuXHRcdFx0XHRcdHZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTtcblxuXHRcdFx0XHRcdGluZGV4MiA9IDMgKiBpICsgKCAoIGogKyAxICkgJSAzICk7XG5cdFx0XHRcdFx0dmVydGV4LmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uLCBpbmRleDIgKTtcblx0XHRcdFx0XHR2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vIGJ1aWxkIGdlb21ldHJ5XG5cblx0dGhpcy5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XG5cbn1cblxuV2lyZWZyYW1lR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7XG5XaXJlZnJhbWVHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBXaXJlZnJhbWVHZW9tZXRyeTtcblxuLyoqXG4gKiBAYXV0aG9yIHp6ODUgLyBodHRwczovL2dpdGh1Yi5jb20veno4NVxuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqXG4gKiBQYXJhbWV0cmljIFN1cmZhY2VzIEdlb21ldHJ5XG4gKiBiYXNlZCBvbiB0aGUgYnJpbGxpYW50IGFydGljbGUgYnkgQHByaWRlb3V0IGh0dHA6Ly9wcmlkZW91dC5uZXQvYmxvZy8/cD00NFxuICovXG5cbi8vIFBhcmFtZXRyaWNHZW9tZXRyeVxuXG5mdW5jdGlvbiBQYXJhbWV0cmljR2VvbWV0cnkoIGZ1bmMsIHNsaWNlcywgc3RhY2tzICkge1xuXG5cdEdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnUGFyYW1ldHJpY0dlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0ZnVuYzogZnVuYyxcblx0XHRzbGljZXM6IHNsaWNlcyxcblx0XHRzdGFja3M6IHN0YWNrc1xuXHR9O1xuXG5cdHRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgUGFyYW1ldHJpY0J1ZmZlckdlb21ldHJ5KCBmdW5jLCBzbGljZXMsIHN0YWNrcyApICk7XG5cdHRoaXMubWVyZ2VWZXJ0aWNlcygpO1xuXG59XG5cblBhcmFtZXRyaWNHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBHZW9tZXRyeS5wcm90b3R5cGUgKTtcblBhcmFtZXRyaWNHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBQYXJhbWV0cmljR2VvbWV0cnk7XG5cbi8vIFBhcmFtZXRyaWNCdWZmZXJHZW9tZXRyeVxuXG5mdW5jdGlvbiBQYXJhbWV0cmljQnVmZmVyR2VvbWV0cnkoIGZ1bmMsIHNsaWNlcywgc3RhY2tzICkge1xuXG5cdEJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnUGFyYW1ldHJpY0J1ZmZlckdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0ZnVuYzogZnVuYyxcblx0XHRzbGljZXM6IHNsaWNlcyxcblx0XHRzdGFja3M6IHN0YWNrc1xuXHR9O1xuXG5cdC8vIGJ1ZmZlcnNcblxuXHR2YXIgaW5kaWNlcyA9IFtdO1xuXHR2YXIgdmVydGljZXMgPSBbXTtcblx0dmFyIG5vcm1hbHMgPSBbXTtcblx0dmFyIHV2cyA9IFtdO1xuXG5cdHZhciBFUFMgPSAwLjAwMDAxO1xuXG5cdHZhciBub3JtYWwgPSBuZXcgVmVjdG9yMygpO1xuXG5cdHZhciBwMCA9IG5ldyBWZWN0b3IzKCksIHAxID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIHB1ID0gbmV3IFZlY3RvcjMoKSwgcHYgPSBuZXcgVmVjdG9yMygpO1xuXG5cdHZhciBpLCBqO1xuXG5cdC8vIGdlbmVyYXRlIHZlcnRpY2VzLCBub3JtYWxzIGFuZCB1dnNcblxuXHR2YXIgc2xpY2VDb3VudCA9IHNsaWNlcyArIDE7XG5cblx0Zm9yICggaSA9IDA7IGkgPD0gc3RhY2tzOyBpICsrICkge1xuXG5cdFx0dmFyIHYgPSBpIC8gc3RhY2tzO1xuXG5cdFx0Zm9yICggaiA9IDA7IGogPD0gc2xpY2VzOyBqICsrICkge1xuXG5cdFx0XHR2YXIgdSA9IGogLyBzbGljZXM7XG5cblx0XHRcdC8vIHZlcnRleFxuXG5cdFx0XHRmdW5jKCB1LCB2LCBwMCApO1xuXHRcdFx0dmVydGljZXMucHVzaCggcDAueCwgcDAueSwgcDAueiApO1xuXG5cdFx0XHQvLyBub3JtYWxcblxuXHRcdFx0Ly8gYXBwcm94aW1hdGUgdGFuZ2VudCB2ZWN0b3JzIHZpYSBmaW5pdGUgZGlmZmVyZW5jZXNcblxuXHRcdFx0aWYgKCB1IC0gRVBTID49IDAgKSB7XG5cblx0XHRcdFx0ZnVuYyggdSAtIEVQUywgdiwgcDEgKTtcblx0XHRcdFx0cHUuc3ViVmVjdG9ycyggcDAsIHAxICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0ZnVuYyggdSArIEVQUywgdiwgcDEgKTtcblx0XHRcdFx0cHUuc3ViVmVjdG9ycyggcDEsIHAwICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCB2IC0gRVBTID49IDAgKSB7XG5cblx0XHRcdFx0ZnVuYyggdSwgdiAtIEVQUywgcDEgKTtcblx0XHRcdFx0cHYuc3ViVmVjdG9ycyggcDAsIHAxICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0ZnVuYyggdSwgdiArIEVQUywgcDEgKTtcblx0XHRcdFx0cHYuc3ViVmVjdG9ycyggcDEsIHAwICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gY3Jvc3MgcHJvZHVjdCBvZiB0YW5nZW50IHZlY3RvcnMgcmV0dXJucyBzdXJmYWNlIG5vcm1hbFxuXG5cdFx0XHRub3JtYWwuY3Jvc3NWZWN0b3JzKCBwdSwgcHYgKS5ub3JtYWxpemUoKTtcblx0XHRcdG5vcm1hbHMucHVzaCggbm9ybWFsLngsIG5vcm1hbC55LCBub3JtYWwueiApO1xuXG5cdFx0XHQvLyB1dlxuXG5cdFx0XHR1dnMucHVzaCggdSwgdiApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHQvLyBnZW5lcmF0ZSBpbmRpY2VzXG5cblx0Zm9yICggaSA9IDA7IGkgPCBzdGFja3M7IGkgKysgKSB7XG5cblx0XHRmb3IgKCBqID0gMDsgaiA8IHNsaWNlczsgaiArKyApIHtcblxuXHRcdFx0dmFyIGEgPSBpICogc2xpY2VDb3VudCArIGo7XG5cdFx0XHR2YXIgYiA9IGkgKiBzbGljZUNvdW50ICsgaiArIDE7XG5cdFx0XHR2YXIgYyA9ICggaSArIDEgKSAqIHNsaWNlQ291bnQgKyBqICsgMTtcblx0XHRcdHZhciBkID0gKCBpICsgMSApICogc2xpY2VDb3VudCArIGo7XG5cblx0XHRcdC8vIGZhY2VzIG9uZSBhbmQgdHdvXG5cblx0XHRcdGluZGljZXMucHVzaCggYSwgYiwgZCApO1xuXHRcdFx0aW5kaWNlcy5wdXNoKCBiLCBjLCBkICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vIGJ1aWxkIGdlb21ldHJ5XG5cblx0dGhpcy5zZXRJbmRleCggaW5kaWNlcyApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICdub3JtYWwnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbm9ybWFscywgMyApICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZzLCAyICkgKTtcblxufVxuXG5QYXJhbWV0cmljQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7XG5QYXJhbWV0cmljQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUGFyYW1ldHJpY0J1ZmZlckdlb21ldHJ5O1xuXG4vKipcbiAqIEBhdXRob3IgY2xvY2t3b3JrZ2VlayAvIGh0dHBzOi8vZ2l0aHViLmNvbS9jbG9ja3dvcmtnZWVrXG4gKiBAYXV0aG9yIHRpbW90aHlwcmF0bGV5IC8gaHR0cHM6Ly9naXRodWIuY29tL3RpbW90aHlwcmF0bGV5XG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKi9cblxuLy8gUG9seWhlZHJvbkdlb21ldHJ5XG5cbmZ1bmN0aW9uIFBvbHloZWRyb25HZW9tZXRyeSggdmVydGljZXMsIGluZGljZXMsIHJhZGl1cywgZGV0YWlsICkge1xuXG5cdEdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnUG9seWhlZHJvbkdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0dmVydGljZXM6IHZlcnRpY2VzLFxuXHRcdGluZGljZXM6IGluZGljZXMsXG5cdFx0cmFkaXVzOiByYWRpdXMsXG5cdFx0ZGV0YWlsOiBkZXRhaWxcblx0fTtcblxuXHR0aGlzLmZyb21CdWZmZXJHZW9tZXRyeSggbmV3IFBvbHloZWRyb25CdWZmZXJHZW9tZXRyeSggdmVydGljZXMsIGluZGljZXMsIHJhZGl1cywgZGV0YWlsICkgKTtcblx0dGhpcy5tZXJnZVZlcnRpY2VzKCk7XG5cbn1cblxuUG9seWhlZHJvbkdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEdlb21ldHJ5LnByb3RvdHlwZSApO1xuUG9seWhlZHJvbkdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFBvbHloZWRyb25HZW9tZXRyeTtcblxuLy8gUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5XG5cbmZ1bmN0aW9uIFBvbHloZWRyb25CdWZmZXJHZW9tZXRyeSggdmVydGljZXMsIGluZGljZXMsIHJhZGl1cywgZGV0YWlsICkge1xuXG5cdEJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0dmVydGljZXM6IHZlcnRpY2VzLFxuXHRcdGluZGljZXM6IGluZGljZXMsXG5cdFx0cmFkaXVzOiByYWRpdXMsXG5cdFx0ZGV0YWlsOiBkZXRhaWxcblx0fTtcblxuXHRyYWRpdXMgPSByYWRpdXMgfHwgMTtcblx0ZGV0YWlsID0gZGV0YWlsIHx8IDA7XG5cblx0Ly8gZGVmYXVsdCBidWZmZXIgZGF0YVxuXG5cdHZhciB2ZXJ0ZXhCdWZmZXIgPSBbXTtcblx0dmFyIHV2QnVmZmVyID0gW107XG5cblx0Ly8gdGhlIHN1YmRpdmlzaW9uIGNyZWF0ZXMgdGhlIHZlcnRleCBidWZmZXIgZGF0YVxuXG5cdHN1YmRpdmlkZSggZGV0YWlsICk7XG5cblx0Ly8gYWxsIHZlcnRpY2VzIHNob3VsZCBsaWUgb24gYSBjb25jZXB0dWFsIHNwaGVyZSB3aXRoIGEgZ2l2ZW4gcmFkaXVzXG5cblx0YXBwcGx5UmFkaXVzKCByYWRpdXMgKTtcblxuXHQvLyBmaW5hbGx5LCBjcmVhdGUgdGhlIHV2IGRhdGFcblxuXHRnZW5lcmF0ZVVWcygpO1xuXG5cdC8vIGJ1aWxkIG5vbi1pbmRleGVkIGdlb21ldHJ5XG5cblx0dGhpcy5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0ZXhCdWZmZXIsIDMgKSApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ25vcm1hbCcsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0ZXhCdWZmZXIuc2xpY2UoKSwgMyApICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZCdWZmZXIsIDIgKSApO1xuXG5cdGlmICggZGV0YWlsID09PSAwICkge1xuXG5cdFx0dGhpcy5jb21wdXRlVmVydGV4Tm9ybWFscygpOyAvLyBmbGF0IG5vcm1hbHNcblxuXHR9IGVsc2Uge1xuXG5cdFx0dGhpcy5ub3JtYWxpemVOb3JtYWxzKCk7IC8vIHNtb290aCBub3JtYWxzXG5cblx0fVxuXG5cdC8vIGhlbHBlciBmdW5jdGlvbnNcblxuXHRmdW5jdGlvbiBzdWJkaXZpZGUoIGRldGFpbCApIHtcblxuXHRcdHZhciBhID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgYiA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIGMgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0Ly8gaXRlcmF0ZSBvdmVyIGFsbCBmYWNlcyBhbmQgYXBwbHkgYSBzdWJkaXZpc29uIHdpdGggdGhlIGdpdmVuIGRldGFpbCB2YWx1ZVxuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgaW5kaWNlcy5sZW5ndGg7IGkgKz0gMyApIHtcblxuXHRcdFx0Ly8gZ2V0IHRoZSB2ZXJ0aWNlcyBvZiB0aGUgZmFjZVxuXG5cdFx0XHRnZXRWZXJ0ZXhCeUluZGV4KCBpbmRpY2VzWyBpICsgMCBdLCBhICk7XG5cdFx0XHRnZXRWZXJ0ZXhCeUluZGV4KCBpbmRpY2VzWyBpICsgMSBdLCBiICk7XG5cdFx0XHRnZXRWZXJ0ZXhCeUluZGV4KCBpbmRpY2VzWyBpICsgMiBdLCBjICk7XG5cblx0XHRcdC8vIHBlcmZvcm0gc3ViZGl2aXNpb25cblxuXHRcdFx0c3ViZGl2aWRlRmFjZSggYSwgYiwgYywgZGV0YWlsICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHN1YmRpdmlkZUZhY2UoIGEsIGIsIGMsIGRldGFpbCApIHtcblxuXHRcdHZhciBjb2xzID0gTWF0aC5wb3coIDIsIGRldGFpbCApO1xuXG5cdFx0Ly8gd2UgdXNlIHRoaXMgbXVsdGlkaW1lbnNpb25hbCBhcnJheSBhcyBhIGRhdGEgc3RydWN0dXJlIGZvciBjcmVhdGluZyB0aGUgc3ViZGl2aXNpb25cblxuXHRcdHZhciB2ID0gW107XG5cblx0XHR2YXIgaSwgajtcblxuXHRcdC8vIGNvbnN0cnVjdCBhbGwgb2YgdGhlIHZlcnRpY2VzIGZvciB0aGlzIHN1YmRpdmlzaW9uXG5cblx0XHRmb3IgKCBpID0gMDsgaSA8PSBjb2xzOyBpICsrICkge1xuXG5cdFx0XHR2WyBpIF0gPSBbXTtcblxuXHRcdFx0dmFyIGFqID0gYS5jbG9uZSgpLmxlcnAoIGMsIGkgLyBjb2xzICk7XG5cdFx0XHR2YXIgYmogPSBiLmNsb25lKCkubGVycCggYywgaSAvIGNvbHMgKTtcblxuXHRcdFx0dmFyIHJvd3MgPSBjb2xzIC0gaTtcblxuXHRcdFx0Zm9yICggaiA9IDA7IGogPD0gcm93czsgaiArKyApIHtcblxuXHRcdFx0XHRpZiAoIGogPT09IDAgJiYgaSA9PT0gY29scyApIHtcblxuXHRcdFx0XHRcdHZbIGkgXVsgaiBdID0gYWo7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdHZbIGkgXVsgaiBdID0gYWouY2xvbmUoKS5sZXJwKCBiaiwgaiAvIHJvd3MgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIGNvbnN0cnVjdCBhbGwgb2YgdGhlIGZhY2VzXG5cblx0XHRmb3IgKCBpID0gMDsgaSA8IGNvbHM7IGkgKysgKSB7XG5cblx0XHRcdGZvciAoIGogPSAwOyBqIDwgMiAqICggY29scyAtIGkgKSAtIDE7IGogKysgKSB7XG5cblx0XHRcdFx0dmFyIGsgPSBNYXRoLmZsb29yKCBqIC8gMiApO1xuXG5cdFx0XHRcdGlmICggaiAlIDIgPT09IDAgKSB7XG5cblx0XHRcdFx0XHRwdXNoVmVydGV4KCB2WyBpIF1bIGsgKyAxIF0gKTtcblx0XHRcdFx0XHRwdXNoVmVydGV4KCB2WyBpICsgMSBdWyBrIF0gKTtcblx0XHRcdFx0XHRwdXNoVmVydGV4KCB2WyBpIF1bIGsgXSApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRwdXNoVmVydGV4KCB2WyBpIF1bIGsgKyAxIF0gKTtcblx0XHRcdFx0XHRwdXNoVmVydGV4KCB2WyBpICsgMSBdWyBrICsgMSBdICk7XG5cdFx0XHRcdFx0cHVzaFZlcnRleCggdlsgaSArIDEgXVsgayBdICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGFwcHBseVJhZGl1cyggcmFkaXVzICkge1xuXG5cdFx0dmFyIHZlcnRleCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHQvLyBpdGVyYXRlIG92ZXIgdGhlIGVudGlyZSBidWZmZXIgYW5kIGFwcGx5IHRoZSByYWRpdXMgdG8gZWFjaCB2ZXJ0ZXhcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IHZlcnRleEJ1ZmZlci5sZW5ndGg7IGkgKz0gMyApIHtcblxuXHRcdFx0dmVydGV4LnggPSB2ZXJ0ZXhCdWZmZXJbIGkgKyAwIF07XG5cdFx0XHR2ZXJ0ZXgueSA9IHZlcnRleEJ1ZmZlclsgaSArIDEgXTtcblx0XHRcdHZlcnRleC56ID0gdmVydGV4QnVmZmVyWyBpICsgMiBdO1xuXG5cdFx0XHR2ZXJ0ZXgubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIoIHJhZGl1cyApO1xuXG5cdFx0XHR2ZXJ0ZXhCdWZmZXJbIGkgKyAwIF0gPSB2ZXJ0ZXgueDtcblx0XHRcdHZlcnRleEJ1ZmZlclsgaSArIDEgXSA9IHZlcnRleC55O1xuXHRcdFx0dmVydGV4QnVmZmVyWyBpICsgMiBdID0gdmVydGV4Lno7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGdlbmVyYXRlVVZzKCkge1xuXG5cdFx0dmFyIHZlcnRleCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCB2ZXJ0ZXhCdWZmZXIubGVuZ3RoOyBpICs9IDMgKSB7XG5cblx0XHRcdHZlcnRleC54ID0gdmVydGV4QnVmZmVyWyBpICsgMCBdO1xuXHRcdFx0dmVydGV4LnkgPSB2ZXJ0ZXhCdWZmZXJbIGkgKyAxIF07XG5cdFx0XHR2ZXJ0ZXgueiA9IHZlcnRleEJ1ZmZlclsgaSArIDIgXTtcblxuXHRcdFx0dmFyIHUgPSBhemltdXRoKCB2ZXJ0ZXggKSAvIDIgLyBNYXRoLlBJICsgMC41O1xuXHRcdFx0dmFyIHYgPSBpbmNsaW5hdGlvbiggdmVydGV4ICkgLyBNYXRoLlBJICsgMC41O1xuXHRcdFx0dXZCdWZmZXIucHVzaCggdSwgMSAtIHYgKTtcblxuXHRcdH1cblxuXHRcdGNvcnJlY3RVVnMoKTtcblxuXHRcdGNvcnJlY3RTZWFtKCk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGNvcnJlY3RTZWFtKCkge1xuXG5cdFx0Ly8gaGFuZGxlIGNhc2Ugd2hlbiBmYWNlIHN0cmFkZGxlcyB0aGUgc2VhbSwgc2VlICMzMjY5XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCB1dkJ1ZmZlci5sZW5ndGg7IGkgKz0gNiApIHtcblxuXHRcdFx0Ly8gdXYgZGF0YSBvZiBhIHNpbmdsZSBmYWNlXG5cblx0XHRcdHZhciB4MCA9IHV2QnVmZmVyWyBpICsgMCBdO1xuXHRcdFx0dmFyIHgxID0gdXZCdWZmZXJbIGkgKyAyIF07XG5cdFx0XHR2YXIgeDIgPSB1dkJ1ZmZlclsgaSArIDQgXTtcblxuXHRcdFx0dmFyIG1heCA9IE1hdGgubWF4KCB4MCwgeDEsIHgyICk7XG5cdFx0XHR2YXIgbWluID0gTWF0aC5taW4oIHgwLCB4MSwgeDIgKTtcblxuXHRcdFx0Ly8gMC45IGlzIHNvbWV3aGF0IGFyYml0cmFyeVxuXG5cdFx0XHRpZiAoIG1heCA+IDAuOSAmJiBtaW4gPCAwLjEgKSB7XG5cblx0XHRcdFx0aWYgKCB4MCA8IDAuMiApIHV2QnVmZmVyWyBpICsgMCBdICs9IDE7XG5cdFx0XHRcdGlmICggeDEgPCAwLjIgKSB1dkJ1ZmZlclsgaSArIDIgXSArPSAxO1xuXHRcdFx0XHRpZiAoIHgyIDwgMC4yICkgdXZCdWZmZXJbIGkgKyA0IF0gKz0gMTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBwdXNoVmVydGV4KCB2ZXJ0ZXggKSB7XG5cblx0XHR2ZXJ0ZXhCdWZmZXIucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBnZXRWZXJ0ZXhCeUluZGV4KCBpbmRleCwgdmVydGV4ICkge1xuXG5cdFx0dmFyIHN0cmlkZSA9IGluZGV4ICogMztcblxuXHRcdHZlcnRleC54ID0gdmVydGljZXNbIHN0cmlkZSArIDAgXTtcblx0XHR2ZXJ0ZXgueSA9IHZlcnRpY2VzWyBzdHJpZGUgKyAxIF07XG5cdFx0dmVydGV4LnogPSB2ZXJ0aWNlc1sgc3RyaWRlICsgMiBdO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBjb3JyZWN0VVZzKCkge1xuXG5cdFx0dmFyIGEgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciBiID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgYyA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR2YXIgY2VudHJvaWQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0dmFyIHV2QSA9IG5ldyBWZWN0b3IyKCk7XG5cdFx0dmFyIHV2QiA9IG5ldyBWZWN0b3IyKCk7XG5cdFx0dmFyIHV2QyA9IG5ldyBWZWN0b3IyKCk7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGogPSAwOyBpIDwgdmVydGV4QnVmZmVyLmxlbmd0aDsgaSArPSA5LCBqICs9IDYgKSB7XG5cblx0XHRcdGEuc2V0KCB2ZXJ0ZXhCdWZmZXJbIGkgKyAwIF0sIHZlcnRleEJ1ZmZlclsgaSArIDEgXSwgdmVydGV4QnVmZmVyWyBpICsgMiBdICk7XG5cdFx0XHRiLnNldCggdmVydGV4QnVmZmVyWyBpICsgMyBdLCB2ZXJ0ZXhCdWZmZXJbIGkgKyA0IF0sIHZlcnRleEJ1ZmZlclsgaSArIDUgXSApO1xuXHRcdFx0Yy5zZXQoIHZlcnRleEJ1ZmZlclsgaSArIDYgXSwgdmVydGV4QnVmZmVyWyBpICsgNyBdLCB2ZXJ0ZXhCdWZmZXJbIGkgKyA4IF0gKTtcblxuXHRcdFx0dXZBLnNldCggdXZCdWZmZXJbIGogKyAwIF0sIHV2QnVmZmVyWyBqICsgMSBdICk7XG5cdFx0XHR1dkIuc2V0KCB1dkJ1ZmZlclsgaiArIDIgXSwgdXZCdWZmZXJbIGogKyAzIF0gKTtcblx0XHRcdHV2Qy5zZXQoIHV2QnVmZmVyWyBqICsgNCBdLCB1dkJ1ZmZlclsgaiArIDUgXSApO1xuXG5cdFx0XHRjZW50cm9pZC5jb3B5KCBhICkuYWRkKCBiICkuYWRkKCBjICkuZGl2aWRlU2NhbGFyKCAzICk7XG5cblx0XHRcdHZhciBhemkgPSBhemltdXRoKCBjZW50cm9pZCApO1xuXG5cdFx0XHRjb3JyZWN0VVYoIHV2QSwgaiArIDAsIGEsIGF6aSApO1xuXHRcdFx0Y29ycmVjdFVWKCB1dkIsIGogKyAyLCBiLCBhemkgKTtcblx0XHRcdGNvcnJlY3RVViggdXZDLCBqICsgNCwgYywgYXppICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGNvcnJlY3RVViggdXYsIHN0cmlkZSwgdmVjdG9yLCBhemltdXRoICkge1xuXG5cdFx0aWYgKCAoIGF6aW11dGggPCAwICkgJiYgKCB1di54ID09PSAxICkgKSB7XG5cblx0XHRcdHV2QnVmZmVyWyBzdHJpZGUgXSA9IHV2LnggLSAxO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCAoIHZlY3Rvci54ID09PSAwICkgJiYgKCB2ZWN0b3IueiA9PT0gMCApICkge1xuXG5cdFx0XHR1dkJ1ZmZlclsgc3RyaWRlIF0gPSBhemltdXRoIC8gMiAvIE1hdGguUEkgKyAwLjU7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vIEFuZ2xlIGFyb3VuZCB0aGUgWSBheGlzLCBjb3VudGVyLWNsb2Nrd2lzZSB3aGVuIGxvb2tpbmcgZnJvbSBhYm92ZS5cblxuXHRmdW5jdGlvbiBhemltdXRoKCB2ZWN0b3IgKSB7XG5cblx0XHRyZXR1cm4gTWF0aC5hdGFuMiggdmVjdG9yLnosIC0gdmVjdG9yLnggKTtcblxuXHR9XG5cblxuXHQvLyBBbmdsZSBhYm92ZSB0aGUgWFogcGxhbmUuXG5cblx0ZnVuY3Rpb24gaW5jbGluYXRpb24oIHZlY3RvciApIHtcblxuXHRcdHJldHVybiBNYXRoLmF0YW4yKCAtIHZlY3Rvci55LCBNYXRoLnNxcnQoICggdmVjdG9yLnggKiB2ZWN0b3IueCApICsgKCB2ZWN0b3IueiAqIHZlY3Rvci56ICkgKSApO1xuXG5cdH1cblxufVxuXG5Qb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7XG5Qb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5O1xuXG4vKipcbiAqIEBhdXRob3IgdGltb3RoeXByYXRsZXkgLyBodHRwczovL2dpdGh1Yi5jb20vdGltb3RoeXByYXRsZXlcbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKi9cblxuLy8gVGV0cmFoZWRyb25HZW9tZXRyeVxuXG5mdW5jdGlvbiBUZXRyYWhlZHJvbkdlb21ldHJ5KCByYWRpdXMsIGRldGFpbCApIHtcblxuXHRHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1RldHJhaGVkcm9uR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRyYWRpdXM6IHJhZGl1cyxcblx0XHRkZXRhaWw6IGRldGFpbFxuXHR9O1xuXG5cdHRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgVGV0cmFoZWRyb25CdWZmZXJHZW9tZXRyeSggcmFkaXVzLCBkZXRhaWwgKSApO1xuXHR0aGlzLm1lcmdlVmVydGljZXMoKTtcblxufVxuXG5UZXRyYWhlZHJvbkdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEdlb21ldHJ5LnByb3RvdHlwZSApO1xuVGV0cmFoZWRyb25HZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBUZXRyYWhlZHJvbkdlb21ldHJ5O1xuXG4vLyBUZXRyYWhlZHJvbkJ1ZmZlckdlb21ldHJ5XG5cbmZ1bmN0aW9uIFRldHJhaGVkcm9uQnVmZmVyR2VvbWV0cnkoIHJhZGl1cywgZGV0YWlsICkge1xuXG5cdHZhciB2ZXJ0aWNlcyA9IFtcblx0XHQxLCAxLCAxLCBcdC0gMSwgLSAxLCAxLCBcdC0gMSwgMSwgLSAxLCBcdDEsIC0gMSwgLSAxXG5cdF07XG5cblx0dmFyIGluZGljZXMgPSBbXG5cdFx0MiwgMSwgMCwgXHQwLCAzLCAyLFx0MSwgMywgMCxcdDIsIDMsIDFcblx0XTtcblxuXHRQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcywgdmVydGljZXMsIGluZGljZXMsIHJhZGl1cywgZGV0YWlsICk7XG5cblx0dGhpcy50eXBlID0gJ1RldHJhaGVkcm9uQnVmZmVyR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRyYWRpdXM6IHJhZGl1cyxcblx0XHRkZXRhaWw6IGRldGFpbFxuXHR9O1xuXG59XG5cblRldHJhaGVkcm9uQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApO1xuVGV0cmFoZWRyb25CdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBUZXRyYWhlZHJvbkJ1ZmZlckdlb21ldHJ5O1xuXG4vKipcbiAqIEBhdXRob3IgdGltb3RoeXByYXRsZXkgLyBodHRwczovL2dpdGh1Yi5jb20vdGltb3RoeXByYXRsZXlcbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKi9cblxuLy8gT2N0YWhlZHJvbkdlb21ldHJ5XG5cbmZ1bmN0aW9uIE9jdGFoZWRyb25HZW9tZXRyeSggcmFkaXVzLCBkZXRhaWwgKSB7XG5cblx0R2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdPY3RhaGVkcm9uR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRyYWRpdXM6IHJhZGl1cyxcblx0XHRkZXRhaWw6IGRldGFpbFxuXHR9O1xuXG5cdHRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgT2N0YWhlZHJvbkJ1ZmZlckdlb21ldHJ5KCByYWRpdXMsIGRldGFpbCApICk7XG5cdHRoaXMubWVyZ2VWZXJ0aWNlcygpO1xuXG59XG5cbk9jdGFoZWRyb25HZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBHZW9tZXRyeS5wcm90b3R5cGUgKTtcbk9jdGFoZWRyb25HZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBPY3RhaGVkcm9uR2VvbWV0cnk7XG5cbi8vIE9jdGFoZWRyb25CdWZmZXJHZW9tZXRyeVxuXG5mdW5jdGlvbiBPY3RhaGVkcm9uQnVmZmVyR2VvbWV0cnkoIHJhZGl1cywgZGV0YWlsICkge1xuXG5cdHZhciB2ZXJ0aWNlcyA9IFtcblx0XHQxLCAwLCAwLCBcdC0gMSwgMCwgMCxcdDAsIDEsIDAsXG5cdFx0MCwgLSAxLCAwLCBcdDAsIDAsIDEsXHQwLCAwLCAtIDFcblx0XTtcblxuXHR2YXIgaW5kaWNlcyA9IFtcblx0XHQwLCAyLCA0LFx0MCwgNCwgMyxcdDAsIDMsIDUsXG5cdFx0MCwgNSwgMixcdDEsIDIsIDUsXHQxLCA1LCAzLFxuXHRcdDEsIDMsIDQsXHQxLCA0LCAyXG5cdF07XG5cblx0UG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMsIHZlcnRpY2VzLCBpbmRpY2VzLCByYWRpdXMsIGRldGFpbCApO1xuXG5cdHRoaXMudHlwZSA9ICdPY3RhaGVkcm9uQnVmZmVyR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRyYWRpdXM6IHJhZGl1cyxcblx0XHRkZXRhaWw6IGRldGFpbFxuXHR9O1xuXG59XG5cbk9jdGFoZWRyb25CdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7XG5PY3RhaGVkcm9uQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gT2N0YWhlZHJvbkJ1ZmZlckdlb21ldHJ5O1xuXG4vKipcbiAqIEBhdXRob3IgdGltb3RoeXByYXRsZXkgLyBodHRwczovL2dpdGh1Yi5jb20vdGltb3RoeXByYXRsZXlcbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKi9cblxuLy8gSWNvc2FoZWRyb25HZW9tZXRyeVxuXG5mdW5jdGlvbiBJY29zYWhlZHJvbkdlb21ldHJ5KCByYWRpdXMsIGRldGFpbCApIHtcblxuXHRHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0ljb3NhaGVkcm9uR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRyYWRpdXM6IHJhZGl1cyxcblx0XHRkZXRhaWw6IGRldGFpbFxuXHR9O1xuXG5cdHRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgSWNvc2FoZWRyb25CdWZmZXJHZW9tZXRyeSggcmFkaXVzLCBkZXRhaWwgKSApO1xuXHR0aGlzLm1lcmdlVmVydGljZXMoKTtcblxufVxuXG5JY29zYWhlZHJvbkdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEdlb21ldHJ5LnByb3RvdHlwZSApO1xuSWNvc2FoZWRyb25HZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBJY29zYWhlZHJvbkdlb21ldHJ5O1xuXG4vLyBJY29zYWhlZHJvbkJ1ZmZlckdlb21ldHJ5XG5cbmZ1bmN0aW9uIEljb3NhaGVkcm9uQnVmZmVyR2VvbWV0cnkoIHJhZGl1cywgZGV0YWlsICkge1xuXG5cdHZhciB0ID0gKCAxICsgTWF0aC5zcXJ0KCA1ICkgKSAvIDI7XG5cblx0dmFyIHZlcnRpY2VzID0gW1xuXHRcdC0gMSwgdCwgMCwgXHQxLCB0LCAwLCBcdC0gMSwgLSB0LCAwLCBcdDEsIC0gdCwgMCxcblx0XHQgMCwgLSAxLCB0LCBcdDAsIDEsIHQsXHQwLCAtIDEsIC0gdCwgXHQwLCAxLCAtIHQsXG5cdFx0IHQsIDAsIC0gMSwgXHR0LCAwLCAxLCBcdC0gdCwgMCwgLSAxLCBcdC0gdCwgMCwgMVxuXHRdO1xuXG5cdHZhciBpbmRpY2VzID0gW1xuXHRcdCAwLCAxMSwgNSwgXHQwLCA1LCAxLCBcdDAsIDEsIDcsIFx0MCwgNywgMTAsIFx0MCwgMTAsIDExLFxuXHRcdCAxLCA1LCA5LCBcdDUsIDExLCA0LFx0MTEsIDEwLCAyLFx0MTAsIDcsIDYsXHQ3LCAxLCA4LFxuXHRcdCAzLCA5LCA0LCBcdDMsIDQsIDIsXHQzLCAyLCA2LFx0MywgNiwgOCxcdDMsIDgsIDksXG5cdFx0IDQsIDksIDUsIFx0MiwgNCwgMTEsXHQ2LCAyLCAxMCxcdDgsIDYsIDcsXHQ5LCA4LCAxXG5cdF07XG5cblx0UG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMsIHZlcnRpY2VzLCBpbmRpY2VzLCByYWRpdXMsIGRldGFpbCApO1xuXG5cdHRoaXMudHlwZSA9ICdJY29zYWhlZHJvbkJ1ZmZlckdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0cmFkaXVzOiByYWRpdXMsXG5cdFx0ZGV0YWlsOiBkZXRhaWxcblx0fTtcblxufVxuXG5JY29zYWhlZHJvbkJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIFBvbHloZWRyb25CdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTtcbkljb3NhaGVkcm9uQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gSWNvc2FoZWRyb25CdWZmZXJHZW9tZXRyeTtcblxuLyoqXG4gKiBAYXV0aG9yIEFiZSBQYXpvcyAvIGh0dHBzOi8vaGFtb2lkLmNvbVxuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqL1xuXG4vLyBEb2RlY2FoZWRyb25HZW9tZXRyeVxuXG5mdW5jdGlvbiBEb2RlY2FoZWRyb25HZW9tZXRyeSggcmFkaXVzLCBkZXRhaWwgKSB7XG5cblx0R2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdEb2RlY2FoZWRyb25HZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHJhZGl1czogcmFkaXVzLFxuXHRcdGRldGFpbDogZGV0YWlsXG5cdH07XG5cblx0dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIG5ldyBEb2RlY2FoZWRyb25CdWZmZXJHZW9tZXRyeSggcmFkaXVzLCBkZXRhaWwgKSApO1xuXHR0aGlzLm1lcmdlVmVydGljZXMoKTtcblxufVxuXG5Eb2RlY2FoZWRyb25HZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBHZW9tZXRyeS5wcm90b3R5cGUgKTtcbkRvZGVjYWhlZHJvbkdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IERvZGVjYWhlZHJvbkdlb21ldHJ5O1xuXG4vLyBEb2RlY2FoZWRyb25CdWZmZXJHZW9tZXRyeVxuXG5mdW5jdGlvbiBEb2RlY2FoZWRyb25CdWZmZXJHZW9tZXRyeSggcmFkaXVzLCBkZXRhaWwgKSB7XG5cblx0dmFyIHQgPSAoIDEgKyBNYXRoLnNxcnQoIDUgKSApIC8gMjtcblx0dmFyIHIgPSAxIC8gdDtcblxuXHR2YXIgdmVydGljZXMgPSBbXG5cblx0XHQvLyAowrExLCDCsTEsIMKxMSlcblx0XHQtIDEsIC0gMSwgLSAxLFx0LSAxLCAtIDEsIDEsXG5cdFx0LSAxLCAxLCAtIDEsIC0gMSwgMSwgMSxcblx0XHQxLCAtIDEsIC0gMSwgMSwgLSAxLCAxLFxuXHRcdDEsIDEsIC0gMSwgMSwgMSwgMSxcblxuXHRcdC8vICgwLCDCsTEvz4YsIMKxz4YpXG5cdFx0IDAsIC0gciwgLSB0LCAwLCAtIHIsIHQsXG5cdFx0IDAsIHIsIC0gdCwgMCwgciwgdCxcblxuXHRcdC8vICjCsTEvz4YsIMKxz4YsIDApXG5cdFx0LSByLCAtIHQsIDAsIC0gciwgdCwgMCxcblx0XHQgciwgLSB0LCAwLCByLCB0LCAwLFxuXG5cdFx0Ly8gKMKxz4YsIDAsIMKxMS/Philcblx0XHQtIHQsIDAsIC0gciwgdCwgMCwgLSByLFxuXHRcdC0gdCwgMCwgciwgdCwgMCwgclxuXHRdO1xuXG5cdHZhciBpbmRpY2VzID0gW1xuXHRcdDMsIDExLCA3LCBcdDMsIDcsIDE1LCBcdDMsIDE1LCAxMyxcblx0XHQ3LCAxOSwgMTcsIFx0NywgMTcsIDYsIFx0NywgNiwgMTUsXG5cdFx0MTcsIDQsIDgsIFx0MTcsIDgsIDEwLCBcdDE3LCAxMCwgNixcblx0XHQ4LCAwLCAxNiwgXHQ4LCAxNiwgMiwgXHQ4LCAyLCAxMCxcblx0XHQwLCAxMiwgMSwgXHQwLCAxLCAxOCwgXHQwLCAxOCwgMTYsXG5cdFx0NiwgMTAsIDIsIFx0NiwgMiwgMTMsIFx0NiwgMTMsIDE1LFxuXHRcdDIsIDE2LCAxOCwgXHQyLCAxOCwgMywgXHQyLCAzLCAxMyxcblx0XHQxOCwgMSwgOSwgXHQxOCwgOSwgMTEsIFx0MTgsIDExLCAzLFxuXHRcdDQsIDE0LCAxMiwgXHQ0LCAxMiwgMCwgXHQ0LCAwLCA4LFxuXHRcdDExLCA5LCA1LCBcdDExLCA1LCAxOSwgXHQxMSwgMTksIDcsXG5cdFx0MTksIDUsIDE0LCBcdDE5LCAxNCwgNCwgXHQxOSwgNCwgMTcsXG5cdFx0MSwgMTIsIDE0LCBcdDEsIDE0LCA1LCBcdDEsIDUsIDlcblx0XTtcblxuXHRQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcywgdmVydGljZXMsIGluZGljZXMsIHJhZGl1cywgZGV0YWlsICk7XG5cblx0dGhpcy50eXBlID0gJ0RvZGVjYWhlZHJvbkJ1ZmZlckdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0cmFkaXVzOiByYWRpdXMsXG5cdFx0ZGV0YWlsOiBkZXRhaWxcblx0fTtcblxufVxuXG5Eb2RlY2FoZWRyb25CdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7XG5Eb2RlY2FoZWRyb25CdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBEb2RlY2FoZWRyb25CdWZmZXJHZW9tZXRyeTtcblxuLyoqXG4gKiBAYXV0aG9yIG9vc21veGllY29kZSAvIGh0dHBzOi8vZ2l0aHViLmNvbS9vb3Ntb3hpZWNvZGVcbiAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwczovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqIEBhdXRob3Igeno4NSAvIGh0dHBzOi8vZ2l0aHViLmNvbS96ejg1XG4gKiBAYXV0aG9yIG1pbmluZ29sZCAvIGh0dHBzOi8vZ2l0aHViLmNvbS9taW5pbmdvbGRcbiAqIEBhdXRob3Igam9ub2JyMSAvIGh0dHBzOi8vZ2l0aHViLmNvbS9qb25vYnIxXG4gKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44N1xuICpcbiAqL1xuXG4vLyBUdWJlR2VvbWV0cnlcblxuZnVuY3Rpb24gVHViZUdlb21ldHJ5KCBwYXRoLCB0dWJ1bGFyU2VnbWVudHMsIHJhZGl1cywgcmFkaWFsU2VnbWVudHMsIGNsb3NlZCwgdGFwZXIgKSB7XG5cblx0R2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdUdWJlR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRwYXRoOiBwYXRoLFxuXHRcdHR1YnVsYXJTZWdtZW50czogdHVidWxhclNlZ21lbnRzLFxuXHRcdHJhZGl1czogcmFkaXVzLFxuXHRcdHJhZGlhbFNlZ21lbnRzOiByYWRpYWxTZWdtZW50cyxcblx0XHRjbG9zZWQ6IGNsb3NlZFxuXHR9O1xuXG5cdGlmICggdGFwZXIgIT09IHVuZGVmaW5lZCApIGNvbnNvbGUud2FybiggJ1RIUkVFLlR1YmVHZW9tZXRyeTogdGFwZXIgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0dmFyIGJ1ZmZlckdlb21ldHJ5ID0gbmV3IFR1YmVCdWZmZXJHZW9tZXRyeSggcGF0aCwgdHVidWxhclNlZ21lbnRzLCByYWRpdXMsIHJhZGlhbFNlZ21lbnRzLCBjbG9zZWQgKTtcblxuXHQvLyBleHBvc2UgaW50ZXJuYWxzXG5cblx0dGhpcy50YW5nZW50cyA9IGJ1ZmZlckdlb21ldHJ5LnRhbmdlbnRzO1xuXHR0aGlzLm5vcm1hbHMgPSBidWZmZXJHZW9tZXRyeS5ub3JtYWxzO1xuXHR0aGlzLmJpbm9ybWFscyA9IGJ1ZmZlckdlb21ldHJ5LmJpbm9ybWFscztcblxuXHQvLyBjcmVhdGUgZ2VvbWV0cnlcblxuXHR0aGlzLmZyb21CdWZmZXJHZW9tZXRyeSggYnVmZmVyR2VvbWV0cnkgKTtcblx0dGhpcy5tZXJnZVZlcnRpY2VzKCk7XG5cbn1cblxuVHViZUdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEdlb21ldHJ5LnByb3RvdHlwZSApO1xuVHViZUdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFR1YmVHZW9tZXRyeTtcblxuLy8gVHViZUJ1ZmZlckdlb21ldHJ5XG5cbmZ1bmN0aW9uIFR1YmVCdWZmZXJHZW9tZXRyeSggcGF0aCwgdHVidWxhclNlZ21lbnRzLCByYWRpdXMsIHJhZGlhbFNlZ21lbnRzLCBjbG9zZWQgKSB7XG5cblx0QnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdUdWJlQnVmZmVyR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRwYXRoOiBwYXRoLFxuXHRcdHR1YnVsYXJTZWdtZW50czogdHVidWxhclNlZ21lbnRzLFxuXHRcdHJhZGl1czogcmFkaXVzLFxuXHRcdHJhZGlhbFNlZ21lbnRzOiByYWRpYWxTZWdtZW50cyxcblx0XHRjbG9zZWQ6IGNsb3NlZFxuXHR9O1xuXG5cdHR1YnVsYXJTZWdtZW50cyA9IHR1YnVsYXJTZWdtZW50cyB8fCA2NDtcblx0cmFkaXVzID0gcmFkaXVzIHx8IDE7XG5cdHJhZGlhbFNlZ21lbnRzID0gcmFkaWFsU2VnbWVudHMgfHwgODtcblx0Y2xvc2VkID0gY2xvc2VkIHx8IGZhbHNlO1xuXG5cdHZhciBmcmFtZXMgPSBwYXRoLmNvbXB1dGVGcmVuZXRGcmFtZXMoIHR1YnVsYXJTZWdtZW50cywgY2xvc2VkICk7XG5cblx0Ly8gZXhwb3NlIGludGVybmFsc1xuXG5cdHRoaXMudGFuZ2VudHMgPSBmcmFtZXMudGFuZ2VudHM7XG5cdHRoaXMubm9ybWFscyA9IGZyYW1lcy5ub3JtYWxzO1xuXHR0aGlzLmJpbm9ybWFscyA9IGZyYW1lcy5iaW5vcm1hbHM7XG5cblx0Ly8gaGVscGVyIHZhcmlhYmxlc1xuXG5cdHZhciB2ZXJ0ZXggPSBuZXcgVmVjdG9yMygpO1xuXHR2YXIgbm9ybWFsID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIHV2ID0gbmV3IFZlY3RvcjIoKTtcblx0dmFyIFAgPSBuZXcgVmVjdG9yMygpO1xuXG5cdHZhciBpLCBqO1xuXG5cdC8vIGJ1ZmZlclxuXG5cdHZhciB2ZXJ0aWNlcyA9IFtdO1xuXHR2YXIgbm9ybWFscyA9IFtdO1xuXHR2YXIgdXZzID0gW107XG5cdHZhciBpbmRpY2VzID0gW107XG5cblx0Ly8gY3JlYXRlIGJ1ZmZlciBkYXRhXG5cblx0Z2VuZXJhdGVCdWZmZXJEYXRhKCk7XG5cblx0Ly8gYnVpbGQgZ2VvbWV0cnlcblxuXHR0aGlzLnNldEluZGV4KCBpbmRpY2VzICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ25vcm1hbCcsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBub3JtYWxzLCAzICkgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICd1dicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB1dnMsIDIgKSApO1xuXG5cdC8vIGZ1bmN0aW9uc1xuXG5cdGZ1bmN0aW9uIGdlbmVyYXRlQnVmZmVyRGF0YSgpIHtcblxuXHRcdGZvciAoIGkgPSAwOyBpIDwgdHVidWxhclNlZ21lbnRzOyBpICsrICkge1xuXG5cdFx0XHRnZW5lcmF0ZVNlZ21lbnQoIGkgKTtcblxuXHRcdH1cblxuXHRcdC8vIGlmIHRoZSBnZW9tZXRyeSBpcyBub3QgY2xvc2VkLCBnZW5lcmF0ZSB0aGUgbGFzdCByb3cgb2YgdmVydGljZXMgYW5kIG5vcm1hbHNcblx0XHQvLyBhdCB0aGUgcmVndWxhciBwb3NpdGlvbiBvbiB0aGUgZ2l2ZW4gcGF0aFxuXHRcdC8vXG5cdFx0Ly8gaWYgdGhlIGdlb21ldHJ5IGlzIGNsb3NlZCwgZHVwbGljYXRlIHRoZSBmaXJzdCByb3cgb2YgdmVydGljZXMgYW5kIG5vcm1hbHMgKHV2cyB3aWxsIGRpZmZlcilcblxuXHRcdGdlbmVyYXRlU2VnbWVudCggKCBjbG9zZWQgPT09IGZhbHNlICkgPyB0dWJ1bGFyU2VnbWVudHMgOiAwICk7XG5cblx0XHQvLyB1dnMgYXJlIGdlbmVyYXRlZCBpbiBhIHNlcGFyYXRlIGZ1bmN0aW9uLlxuXHRcdC8vIHRoaXMgbWFrZXMgaXQgZWFzeSBjb21wdXRlIGNvcnJlY3QgdmFsdWVzIGZvciBjbG9zZWQgZ2VvbWV0cmllc1xuXG5cdFx0Z2VuZXJhdGVVVnMoKTtcblxuXHRcdC8vIGZpbmFsbHkgY3JlYXRlIGZhY2VzXG5cblx0XHRnZW5lcmF0ZUluZGljZXMoKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gZ2VuZXJhdGVTZWdtZW50KCBpICkge1xuXG5cdFx0Ly8gd2UgdXNlIGdldFBvaW50QXQgdG8gc2FtcGxlIGV2ZW5seSBkaXN0cmlidXRlZCBwb2ludHMgZnJvbSB0aGUgZ2l2ZW4gcGF0aFxuXG5cdFx0UCA9IHBhdGguZ2V0UG9pbnRBdCggaSAvIHR1YnVsYXJTZWdtZW50cywgUCApO1xuXG5cdFx0Ly8gcmV0cmlldmUgY29ycmVzcG9uZGluZyBub3JtYWwgYW5kIGJpbm9ybWFsXG5cblx0XHR2YXIgTiA9IGZyYW1lcy5ub3JtYWxzWyBpIF07XG5cdFx0dmFyIEIgPSBmcmFtZXMuYmlub3JtYWxzWyBpIF07XG5cblx0XHQvLyBnZW5lcmF0ZSBub3JtYWxzIGFuZCB2ZXJ0aWNlcyBmb3IgdGhlIGN1cnJlbnQgc2VnbWVudFxuXG5cdFx0Zm9yICggaiA9IDA7IGogPD0gcmFkaWFsU2VnbWVudHM7IGogKysgKSB7XG5cblx0XHRcdHZhciB2ID0gaiAvIHJhZGlhbFNlZ21lbnRzICogTWF0aC5QSSAqIDI7XG5cblx0XHRcdHZhciBzaW4gPSBNYXRoLnNpbiggdiApO1xuXHRcdFx0dmFyIGNvcyA9IC0gTWF0aC5jb3MoIHYgKTtcblxuXHRcdFx0Ly8gbm9ybWFsXG5cblx0XHRcdG5vcm1hbC54ID0gKCBjb3MgKiBOLnggKyBzaW4gKiBCLnggKTtcblx0XHRcdG5vcm1hbC55ID0gKCBjb3MgKiBOLnkgKyBzaW4gKiBCLnkgKTtcblx0XHRcdG5vcm1hbC56ID0gKCBjb3MgKiBOLnogKyBzaW4gKiBCLnogKTtcblx0XHRcdG5vcm1hbC5ub3JtYWxpemUoKTtcblxuXHRcdFx0bm9ybWFscy5wdXNoKCBub3JtYWwueCwgbm9ybWFsLnksIG5vcm1hbC56ICk7XG5cblx0XHRcdC8vIHZlcnRleFxuXG5cdFx0XHR2ZXJ0ZXgueCA9IFAueCArIHJhZGl1cyAqIG5vcm1hbC54O1xuXHRcdFx0dmVydGV4LnkgPSBQLnkgKyByYWRpdXMgKiBub3JtYWwueTtcblx0XHRcdHZlcnRleC56ID0gUC56ICsgcmFkaXVzICogbm9ybWFsLno7XG5cblx0XHRcdHZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gZ2VuZXJhdGVJbmRpY2VzKCkge1xuXG5cdFx0Zm9yICggaiA9IDE7IGogPD0gdHVidWxhclNlZ21lbnRzOyBqICsrICkge1xuXG5cdFx0XHRmb3IgKCBpID0gMTsgaSA8PSByYWRpYWxTZWdtZW50czsgaSArKyApIHtcblxuXHRcdFx0XHR2YXIgYSA9ICggcmFkaWFsU2VnbWVudHMgKyAxICkgKiAoIGogLSAxICkgKyAoIGkgLSAxICk7XG5cdFx0XHRcdHZhciBiID0gKCByYWRpYWxTZWdtZW50cyArIDEgKSAqIGogKyAoIGkgLSAxICk7XG5cdFx0XHRcdHZhciBjID0gKCByYWRpYWxTZWdtZW50cyArIDEgKSAqIGogKyBpO1xuXHRcdFx0XHR2YXIgZCA9ICggcmFkaWFsU2VnbWVudHMgKyAxICkgKiAoIGogLSAxICkgKyBpO1xuXG5cdFx0XHRcdC8vIGZhY2VzXG5cblx0XHRcdFx0aW5kaWNlcy5wdXNoKCBhLCBiLCBkICk7XG5cdFx0XHRcdGluZGljZXMucHVzaCggYiwgYywgZCApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGdlbmVyYXRlVVZzKCkge1xuXG5cdFx0Zm9yICggaSA9IDA7IGkgPD0gdHVidWxhclNlZ21lbnRzOyBpICsrICkge1xuXG5cdFx0XHRmb3IgKCBqID0gMDsgaiA8PSByYWRpYWxTZWdtZW50czsgaiArKyApIHtcblxuXHRcdFx0XHR1di54ID0gaSAvIHR1YnVsYXJTZWdtZW50cztcblx0XHRcdFx0dXYueSA9IGogLyByYWRpYWxTZWdtZW50cztcblxuXHRcdFx0XHR1dnMucHVzaCggdXYueCwgdXYueSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fVxuXG59XG5cblR1YmVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTtcblR1YmVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBUdWJlQnVmZmVyR2VvbWV0cnk7XG5cbi8qKlxuICogQGF1dGhvciBvb3Ntb3hpZWNvZGVcbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKlxuICogYmFzZWQgb24gaHR0cDovL3d3dy5ibGFja3Bhd24uY29tL3RleHRzL3BxdG9ydXMvXG4gKi9cblxuLy8gVG9ydXNLbm90R2VvbWV0cnlcblxuZnVuY3Rpb24gVG9ydXNLbm90R2VvbWV0cnkoIHJhZGl1cywgdHViZSwgdHVidWxhclNlZ21lbnRzLCByYWRpYWxTZWdtZW50cywgcCwgcSwgaGVpZ2h0U2NhbGUgKSB7XG5cblx0R2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdUb3J1c0tub3RHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHJhZGl1czogcmFkaXVzLFxuXHRcdHR1YmU6IHR1YmUsXG5cdFx0dHVidWxhclNlZ21lbnRzOiB0dWJ1bGFyU2VnbWVudHMsXG5cdFx0cmFkaWFsU2VnbWVudHM6IHJhZGlhbFNlZ21lbnRzLFxuXHRcdHA6IHAsXG5cdFx0cTogcVxuXHR9O1xuXG5cdGlmICggaGVpZ2h0U2NhbGUgIT09IHVuZGVmaW5lZCApIGNvbnNvbGUud2FybiggJ1RIUkVFLlRvcnVzS25vdEdlb21ldHJ5OiBoZWlnaHRTY2FsZSBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgLnNjYWxlKCB4LCB5LCB6ICkgaW5zdGVhZC4nICk7XG5cblx0dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIG5ldyBUb3J1c0tub3RCdWZmZXJHZW9tZXRyeSggcmFkaXVzLCB0dWJlLCB0dWJ1bGFyU2VnbWVudHMsIHJhZGlhbFNlZ21lbnRzLCBwLCBxICkgKTtcblx0dGhpcy5tZXJnZVZlcnRpY2VzKCk7XG5cbn1cblxuVG9ydXNLbm90R2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7XG5Ub3J1c0tub3RHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBUb3J1c0tub3RHZW9tZXRyeTtcblxuLy8gVG9ydXNLbm90QnVmZmVyR2VvbWV0cnlcblxuZnVuY3Rpb24gVG9ydXNLbm90QnVmZmVyR2VvbWV0cnkoIHJhZGl1cywgdHViZSwgdHVidWxhclNlZ21lbnRzLCByYWRpYWxTZWdtZW50cywgcCwgcSApIHtcblxuXHRCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1RvcnVzS25vdEJ1ZmZlckdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0cmFkaXVzOiByYWRpdXMsXG5cdFx0dHViZTogdHViZSxcblx0XHR0dWJ1bGFyU2VnbWVudHM6IHR1YnVsYXJTZWdtZW50cyxcblx0XHRyYWRpYWxTZWdtZW50czogcmFkaWFsU2VnbWVudHMsXG5cdFx0cDogcCxcblx0XHRxOiBxXG5cdH07XG5cblx0cmFkaXVzID0gcmFkaXVzIHx8IDE7XG5cdHR1YmUgPSB0dWJlIHx8IDAuNDtcblx0dHVidWxhclNlZ21lbnRzID0gTWF0aC5mbG9vciggdHVidWxhclNlZ21lbnRzICkgfHwgNjQ7XG5cdHJhZGlhbFNlZ21lbnRzID0gTWF0aC5mbG9vciggcmFkaWFsU2VnbWVudHMgKSB8fCA4O1xuXHRwID0gcCB8fCAyO1xuXHRxID0gcSB8fCAzO1xuXG5cdC8vIGJ1ZmZlcnNcblxuXHR2YXIgaW5kaWNlcyA9IFtdO1xuXHR2YXIgdmVydGljZXMgPSBbXTtcblx0dmFyIG5vcm1hbHMgPSBbXTtcblx0dmFyIHV2cyA9IFtdO1xuXG5cdC8vIGhlbHBlciB2YXJpYWJsZXNcblxuXHR2YXIgaSwgajtcblxuXHR2YXIgdmVydGV4ID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIG5vcm1hbCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0dmFyIFAxID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIFAyID0gbmV3IFZlY3RvcjMoKTtcblxuXHR2YXIgQiA9IG5ldyBWZWN0b3IzKCk7XG5cdHZhciBUID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIE4gPSBuZXcgVmVjdG9yMygpO1xuXG5cdC8vIGdlbmVyYXRlIHZlcnRpY2VzLCBub3JtYWxzIGFuZCB1dnNcblxuXHRmb3IgKCBpID0gMDsgaSA8PSB0dWJ1bGFyU2VnbWVudHM7ICsrIGkgKSB7XG5cblx0XHQvLyB0aGUgcmFkaWFuIFwidVwiIGlzIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBwb3NpdGlvbiBvbiB0aGUgdG9ydXMgY3VydmUgb2YgdGhlIGN1cnJlbnQgdHVidWxhciBzZWdlbWVudFxuXG5cdFx0dmFyIHUgPSBpIC8gdHVidWxhclNlZ21lbnRzICogcCAqIE1hdGguUEkgKiAyO1xuXG5cdFx0Ly8gbm93IHdlIGNhbGN1bGF0ZSB0d28gcG9pbnRzLiBQMSBpcyBvdXIgY3VycmVudCBwb3NpdGlvbiBvbiB0aGUgY3VydmUsIFAyIGlzIGEgbGl0dGxlIGZhcnRoZXIgYWhlYWQuXG5cdFx0Ly8gdGhlc2UgcG9pbnRzIGFyZSB1c2VkIHRvIGNyZWF0ZSBhIHNwZWNpYWwgXCJjb29yZGluYXRlIHNwYWNlXCIsIHdoaWNoIGlzIG5lY2Vzc2FyeSB0byBjYWxjdWxhdGUgdGhlIGNvcnJlY3QgdmVydGV4IHBvc2l0aW9uc1xuXG5cdFx0Y2FsY3VsYXRlUG9zaXRpb25PbkN1cnZlKCB1LCBwLCBxLCByYWRpdXMsIFAxICk7XG5cdFx0Y2FsY3VsYXRlUG9zaXRpb25PbkN1cnZlKCB1ICsgMC4wMSwgcCwgcSwgcmFkaXVzLCBQMiApO1xuXG5cdFx0Ly8gY2FsY3VsYXRlIG9ydGhvbm9ybWFsIGJhc2lzXG5cblx0XHRULnN1YlZlY3RvcnMoIFAyLCBQMSApO1xuXHRcdE4uYWRkVmVjdG9ycyggUDIsIFAxICk7XG5cdFx0Qi5jcm9zc1ZlY3RvcnMoIFQsIE4gKTtcblx0XHROLmNyb3NzVmVjdG9ycyggQiwgVCApO1xuXG5cdFx0Ly8gbm9ybWFsaXplIEIsIE4uIFQgY2FuIGJlIGlnbm9yZWQsIHdlIGRvbid0IHVzZSBpdFxuXG5cdFx0Qi5ub3JtYWxpemUoKTtcblx0XHROLm5vcm1hbGl6ZSgpO1xuXG5cdFx0Zm9yICggaiA9IDA7IGogPD0gcmFkaWFsU2VnbWVudHM7ICsrIGogKSB7XG5cblx0XHRcdC8vIG5vdyBjYWxjdWxhdGUgdGhlIHZlcnRpY2VzLiB0aGV5IGFyZSBub3RoaW5nIG1vcmUgdGhhbiBhbiBleHRydXNpb24gb2YgdGhlIHRvcnVzIGN1cnZlLlxuXHRcdFx0Ly8gYmVjYXVzZSB3ZSBleHRydWRlIGEgc2hhcGUgaW4gdGhlIHh5LXBsYW5lLCB0aGVyZSBpcyBubyBuZWVkIHRvIGNhbGN1bGF0ZSBhIHotdmFsdWUuXG5cblx0XHRcdHZhciB2ID0gaiAvIHJhZGlhbFNlZ21lbnRzICogTWF0aC5QSSAqIDI7XG5cdFx0XHR2YXIgY3ggPSAtIHR1YmUgKiBNYXRoLmNvcyggdiApO1xuXHRcdFx0dmFyIGN5ID0gdHViZSAqIE1hdGguc2luKCB2ICk7XG5cblx0XHRcdC8vIG5vdyBjYWxjdWxhdGUgdGhlIGZpbmFsIHZlcnRleCBwb3NpdGlvbi5cblx0XHRcdC8vIGZpcnN0IHdlIG9yaWVudCB0aGUgZXh0cnVzaW9uIHdpdGggb3VyIGJhc2lzIHZlY3RvcywgdGhlbiB3ZSBhZGQgaXQgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24gb24gdGhlIGN1cnZlXG5cblx0XHRcdHZlcnRleC54ID0gUDEueCArICggY3ggKiBOLnggKyBjeSAqIEIueCApO1xuXHRcdFx0dmVydGV4LnkgPSBQMS55ICsgKCBjeCAqIE4ueSArIGN5ICogQi55ICk7XG5cdFx0XHR2ZXJ0ZXgueiA9IFAxLnogKyAoIGN4ICogTi56ICsgY3kgKiBCLnogKTtcblxuXHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0XHQvLyBub3JtYWwgKFAxIGlzIGFsd2F5cyB0aGUgY2VudGVyL29yaWdpbiBvZiB0aGUgZXh0cnVzaW9uLCB0aHVzIHdlIGNhbiB1c2UgaXQgdG8gY2FsY3VsYXRlIHRoZSBub3JtYWwpXG5cblx0XHRcdG5vcm1hbC5zdWJWZWN0b3JzKCB2ZXJ0ZXgsIFAxICkubm9ybWFsaXplKCk7XG5cblx0XHRcdG5vcm1hbHMucHVzaCggbm9ybWFsLngsIG5vcm1hbC55LCBub3JtYWwueiApO1xuXG5cdFx0XHQvLyB1dlxuXG5cdFx0XHR1dnMucHVzaCggaSAvIHR1YnVsYXJTZWdtZW50cyApO1xuXHRcdFx0dXZzLnB1c2goIGogLyByYWRpYWxTZWdtZW50cyApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHQvLyBnZW5lcmF0ZSBpbmRpY2VzXG5cblx0Zm9yICggaiA9IDE7IGogPD0gdHVidWxhclNlZ21lbnRzOyBqICsrICkge1xuXG5cdFx0Zm9yICggaSA9IDE7IGkgPD0gcmFkaWFsU2VnbWVudHM7IGkgKysgKSB7XG5cblx0XHRcdC8vIGluZGljZXNcblxuXHRcdFx0dmFyIGEgPSAoIHJhZGlhbFNlZ21lbnRzICsgMSApICogKCBqIC0gMSApICsgKCBpIC0gMSApO1xuXHRcdFx0dmFyIGIgPSAoIHJhZGlhbFNlZ21lbnRzICsgMSApICogaiArICggaSAtIDEgKTtcblx0XHRcdHZhciBjID0gKCByYWRpYWxTZWdtZW50cyArIDEgKSAqIGogKyBpO1xuXHRcdFx0dmFyIGQgPSAoIHJhZGlhbFNlZ21lbnRzICsgMSApICogKCBqIC0gMSApICsgaTtcblxuXHRcdFx0Ly8gZmFjZXNcblxuXHRcdFx0aW5kaWNlcy5wdXNoKCBhLCBiLCBkICk7XG5cdFx0XHRpbmRpY2VzLnB1c2goIGIsIGMsIGQgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gYnVpbGQgZ2VvbWV0cnlcblxuXHR0aGlzLnNldEluZGV4KCBpbmRpY2VzICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ25vcm1hbCcsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBub3JtYWxzLCAzICkgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICd1dicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB1dnMsIDIgKSApO1xuXG5cdC8vIHRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgY3VycmVudCBwb3NpdGlvbiBvbiB0aGUgdG9ydXMgY3VydmVcblxuXHRmdW5jdGlvbiBjYWxjdWxhdGVQb3NpdGlvbk9uQ3VydmUoIHUsIHAsIHEsIHJhZGl1cywgcG9zaXRpb24gKSB7XG5cblx0XHR2YXIgY3UgPSBNYXRoLmNvcyggdSApO1xuXHRcdHZhciBzdSA9IE1hdGguc2luKCB1ICk7XG5cdFx0dmFyIHF1T3ZlclAgPSBxIC8gcCAqIHU7XG5cdFx0dmFyIGNzID0gTWF0aC5jb3MoIHF1T3ZlclAgKTtcblxuXHRcdHBvc2l0aW9uLnggPSByYWRpdXMgKiAoIDIgKyBjcyApICogMC41ICogY3U7XG5cdFx0cG9zaXRpb24ueSA9IHJhZGl1cyAqICggMiArIGNzICkgKiBzdSAqIDAuNTtcblx0XHRwb3NpdGlvbi56ID0gcmFkaXVzICogTWF0aC5zaW4oIHF1T3ZlclAgKSAqIDAuNTtcblxuXHR9XG5cbn1cblxuVG9ydXNLbm90QnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7XG5Ub3J1c0tub3RCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBUb3J1c0tub3RCdWZmZXJHZW9tZXRyeTtcblxuLyoqXG4gKiBAYXV0aG9yIG9vc21veGllY29kZVxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKi9cblxuLy8gVG9ydXNHZW9tZXRyeVxuXG5mdW5jdGlvbiBUb3J1c0dlb21ldHJ5KCByYWRpdXMsIHR1YmUsIHJhZGlhbFNlZ21lbnRzLCB0dWJ1bGFyU2VnbWVudHMsIGFyYyApIHtcblxuXHRHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1RvcnVzR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRyYWRpdXM6IHJhZGl1cyxcblx0XHR0dWJlOiB0dWJlLFxuXHRcdHJhZGlhbFNlZ21lbnRzOiByYWRpYWxTZWdtZW50cyxcblx0XHR0dWJ1bGFyU2VnbWVudHM6IHR1YnVsYXJTZWdtZW50cyxcblx0XHRhcmM6IGFyY1xuXHR9O1xuXG5cdHRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgVG9ydXNCdWZmZXJHZW9tZXRyeSggcmFkaXVzLCB0dWJlLCByYWRpYWxTZWdtZW50cywgdHVidWxhclNlZ21lbnRzLCBhcmMgKSApO1xuXHR0aGlzLm1lcmdlVmVydGljZXMoKTtcblxufVxuXG5Ub3J1c0dlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEdlb21ldHJ5LnByb3RvdHlwZSApO1xuVG9ydXNHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBUb3J1c0dlb21ldHJ5O1xuXG4vLyBUb3J1c0J1ZmZlckdlb21ldHJ5XG5cbmZ1bmN0aW9uIFRvcnVzQnVmZmVyR2VvbWV0cnkoIHJhZGl1cywgdHViZSwgcmFkaWFsU2VnbWVudHMsIHR1YnVsYXJTZWdtZW50cywgYXJjICkge1xuXG5cdEJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnVG9ydXNCdWZmZXJHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHJhZGl1czogcmFkaXVzLFxuXHRcdHR1YmU6IHR1YmUsXG5cdFx0cmFkaWFsU2VnbWVudHM6IHJhZGlhbFNlZ21lbnRzLFxuXHRcdHR1YnVsYXJTZWdtZW50czogdHVidWxhclNlZ21lbnRzLFxuXHRcdGFyYzogYXJjXG5cdH07XG5cblx0cmFkaXVzID0gcmFkaXVzIHx8IDE7XG5cdHR1YmUgPSB0dWJlIHx8IDAuNDtcblx0cmFkaWFsU2VnbWVudHMgPSBNYXRoLmZsb29yKCByYWRpYWxTZWdtZW50cyApIHx8IDg7XG5cdHR1YnVsYXJTZWdtZW50cyA9IE1hdGguZmxvb3IoIHR1YnVsYXJTZWdtZW50cyApIHx8IDY7XG5cdGFyYyA9IGFyYyB8fCBNYXRoLlBJICogMjtcblxuXHQvLyBidWZmZXJzXG5cblx0dmFyIGluZGljZXMgPSBbXTtcblx0dmFyIHZlcnRpY2VzID0gW107XG5cdHZhciBub3JtYWxzID0gW107XG5cdHZhciB1dnMgPSBbXTtcblxuXHQvLyBoZWxwZXIgdmFyaWFibGVzXG5cblx0dmFyIGNlbnRlciA9IG5ldyBWZWN0b3IzKCk7XG5cdHZhciB2ZXJ0ZXggPSBuZXcgVmVjdG9yMygpO1xuXHR2YXIgbm9ybWFsID0gbmV3IFZlY3RvcjMoKTtcblxuXHR2YXIgaiwgaTtcblxuXHQvLyBnZW5lcmF0ZSB2ZXJ0aWNlcywgbm9ybWFscyBhbmQgdXZzXG5cblx0Zm9yICggaiA9IDA7IGogPD0gcmFkaWFsU2VnbWVudHM7IGogKysgKSB7XG5cblx0XHRmb3IgKCBpID0gMDsgaSA8PSB0dWJ1bGFyU2VnbWVudHM7IGkgKysgKSB7XG5cblx0XHRcdHZhciB1ID0gaSAvIHR1YnVsYXJTZWdtZW50cyAqIGFyYztcblx0XHRcdHZhciB2ID0gaiAvIHJhZGlhbFNlZ21lbnRzICogTWF0aC5QSSAqIDI7XG5cblx0XHRcdC8vIHZlcnRleFxuXG5cdFx0XHR2ZXJ0ZXgueCA9ICggcmFkaXVzICsgdHViZSAqIE1hdGguY29zKCB2ICkgKSAqIE1hdGguY29zKCB1ICk7XG5cdFx0XHR2ZXJ0ZXgueSA9ICggcmFkaXVzICsgdHViZSAqIE1hdGguY29zKCB2ICkgKSAqIE1hdGguc2luKCB1ICk7XG5cdFx0XHR2ZXJ0ZXgueiA9IHR1YmUgKiBNYXRoLnNpbiggdiApO1xuXG5cdFx0XHR2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7XG5cblx0XHRcdC8vIG5vcm1hbFxuXG5cdFx0XHRjZW50ZXIueCA9IHJhZGl1cyAqIE1hdGguY29zKCB1ICk7XG5cdFx0XHRjZW50ZXIueSA9IHJhZGl1cyAqIE1hdGguc2luKCB1ICk7XG5cdFx0XHRub3JtYWwuc3ViVmVjdG9ycyggdmVydGV4LCBjZW50ZXIgKS5ub3JtYWxpemUoKTtcblxuXHRcdFx0bm9ybWFscy5wdXNoKCBub3JtYWwueCwgbm9ybWFsLnksIG5vcm1hbC56ICk7XG5cblx0XHRcdC8vIHV2XG5cblx0XHRcdHV2cy5wdXNoKCBpIC8gdHVidWxhclNlZ21lbnRzICk7XG5cdFx0XHR1dnMucHVzaCggaiAvIHJhZGlhbFNlZ21lbnRzICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vIGdlbmVyYXRlIGluZGljZXNcblxuXHRmb3IgKCBqID0gMTsgaiA8PSByYWRpYWxTZWdtZW50czsgaiArKyApIHtcblxuXHRcdGZvciAoIGkgPSAxOyBpIDw9IHR1YnVsYXJTZWdtZW50czsgaSArKyApIHtcblxuXHRcdFx0Ly8gaW5kaWNlc1xuXG5cdFx0XHR2YXIgYSA9ICggdHVidWxhclNlZ21lbnRzICsgMSApICogaiArIGkgLSAxO1xuXHRcdFx0dmFyIGIgPSAoIHR1YnVsYXJTZWdtZW50cyArIDEgKSAqICggaiAtIDEgKSArIGkgLSAxO1xuXHRcdFx0dmFyIGMgPSAoIHR1YnVsYXJTZWdtZW50cyArIDEgKSAqICggaiAtIDEgKSArIGk7XG5cdFx0XHR2YXIgZCA9ICggdHVidWxhclNlZ21lbnRzICsgMSApICogaiArIGk7XG5cblx0XHRcdC8vIGZhY2VzXG5cblx0XHRcdGluZGljZXMucHVzaCggYSwgYiwgZCApO1xuXHRcdFx0aW5kaWNlcy5wdXNoKCBiLCBjLCBkICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vIGJ1aWxkIGdlb21ldHJ5XG5cblx0dGhpcy5zZXRJbmRleCggaW5kaWNlcyApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICdub3JtYWwnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbm9ybWFscywgMyApICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZzLCAyICkgKTtcblxufVxuXG5Ub3J1c0J1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApO1xuVG9ydXNCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBUb3J1c0J1ZmZlckdlb21ldHJ5O1xuXG4vKipcbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKiBQb3J0IGZyb20gaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9lYXJjdXQgKHYyLjEuMilcbiAqL1xuXG52YXIgRWFyY3V0ID0ge1xuXG5cdHRyaWFuZ3VsYXRlOiBmdW5jdGlvbiAoIGRhdGEsIGhvbGVJbmRpY2VzLCBkaW0gKSB7XG5cblx0XHRkaW0gPSBkaW0gfHwgMjtcblxuXHRcdHZhciBoYXNIb2xlcyA9IGhvbGVJbmRpY2VzICYmIGhvbGVJbmRpY2VzLmxlbmd0aCxcblx0XHRcdG91dGVyTGVuID0gaGFzSG9sZXMgPyBob2xlSW5kaWNlc1sgMCBdICogZGltIDogZGF0YS5sZW5ndGgsXG5cdFx0XHRvdXRlck5vZGUgPSBsaW5rZWRMaXN0KCBkYXRhLCAwLCBvdXRlckxlbiwgZGltLCB0cnVlICksXG5cdFx0XHR0cmlhbmdsZXMgPSBbXTtcblxuXHRcdGlmICggISBvdXRlck5vZGUgKSByZXR1cm4gdHJpYW5nbGVzO1xuXG5cdFx0dmFyIG1pblgsIG1pblksIG1heFgsIG1heFksIHgsIHksIGludlNpemU7XG5cblx0XHRpZiAoIGhhc0hvbGVzICkgb3V0ZXJOb2RlID0gZWxpbWluYXRlSG9sZXMoIGRhdGEsIGhvbGVJbmRpY2VzLCBvdXRlck5vZGUsIGRpbSApO1xuXG5cdFx0Ly8gaWYgdGhlIHNoYXBlIGlzIG5vdCB0b28gc2ltcGxlLCB3ZSdsbCB1c2Ugei1vcmRlciBjdXJ2ZSBoYXNoIGxhdGVyOyBjYWxjdWxhdGUgcG9seWdvbiBiYm94XG5cblx0XHRpZiAoIGRhdGEubGVuZ3RoID4gODAgKiBkaW0gKSB7XG5cblx0XHRcdG1pblggPSBtYXhYID0gZGF0YVsgMCBdO1xuXHRcdFx0bWluWSA9IG1heFkgPSBkYXRhWyAxIF07XG5cblx0XHRcdGZvciAoIHZhciBpID0gZGltOyBpIDwgb3V0ZXJMZW47IGkgKz0gZGltICkge1xuXG5cdFx0XHRcdHggPSBkYXRhWyBpIF07XG5cdFx0XHRcdHkgPSBkYXRhWyBpICsgMSBdO1xuXHRcdFx0XHRpZiAoIHggPCBtaW5YICkgbWluWCA9IHg7XG5cdFx0XHRcdGlmICggeSA8IG1pblkgKSBtaW5ZID0geTtcblx0XHRcdFx0aWYgKCB4ID4gbWF4WCApIG1heFggPSB4O1xuXHRcdFx0XHRpZiAoIHkgPiBtYXhZICkgbWF4WSA9IHk7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gbWluWCwgbWluWSBhbmQgaW52U2l6ZSBhcmUgbGF0ZXIgdXNlZCB0byB0cmFuc2Zvcm0gY29vcmRzIGludG8gaW50ZWdlcnMgZm9yIHotb3JkZXIgY2FsY3VsYXRpb25cblxuXHRcdFx0aW52U2l6ZSA9IE1hdGgubWF4KCBtYXhYIC0gbWluWCwgbWF4WSAtIG1pblkgKTtcblx0XHRcdGludlNpemUgPSBpbnZTaXplICE9PSAwID8gMSAvIGludlNpemUgOiAwO1xuXG5cdFx0fVxuXG5cdFx0ZWFyY3V0TGlua2VkKCBvdXRlck5vZGUsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplICk7XG5cblx0XHRyZXR1cm4gdHJpYW5nbGVzO1xuXG5cdH1cblxufTtcblxuLy8gY3JlYXRlIGEgY2lyY3VsYXIgZG91Ymx5IGxpbmtlZCBsaXN0IGZyb20gcG9seWdvbiBwb2ludHMgaW4gdGhlIHNwZWNpZmllZCB3aW5kaW5nIG9yZGVyXG5cbmZ1bmN0aW9uIGxpbmtlZExpc3QoIGRhdGEsIHN0YXJ0LCBlbmQsIGRpbSwgY2xvY2t3aXNlICkge1xuXG5cdHZhciBpLCBsYXN0O1xuXG5cdGlmICggY2xvY2t3aXNlID09PSAoIHNpZ25lZEFyZWEoIGRhdGEsIHN0YXJ0LCBlbmQsIGRpbSApID4gMCApICkge1xuXG5cdFx0Zm9yICggaSA9IHN0YXJ0OyBpIDwgZW5kOyBpICs9IGRpbSApIGxhc3QgPSBpbnNlcnROb2RlKCBpLCBkYXRhWyBpIF0sIGRhdGFbIGkgKyAxIF0sIGxhc3QgKTtcblxuXHR9IGVsc2Uge1xuXG5cdFx0Zm9yICggaSA9IGVuZCAtIGRpbTsgaSA+PSBzdGFydDsgaSAtPSBkaW0gKSBsYXN0ID0gaW5zZXJ0Tm9kZSggaSwgZGF0YVsgaSBdLCBkYXRhWyBpICsgMSBdLCBsYXN0ICk7XG5cblx0fVxuXG5cdGlmICggbGFzdCAmJiBlcXVhbHMoIGxhc3QsIGxhc3QubmV4dCApICkge1xuXG5cdFx0cmVtb3ZlTm9kZSggbGFzdCApO1xuXHRcdGxhc3QgPSBsYXN0Lm5leHQ7XG5cblx0fVxuXG5cdHJldHVybiBsYXN0O1xuXG59XG5cbi8vIGVsaW1pbmF0ZSBjb2xpbmVhciBvciBkdXBsaWNhdGUgcG9pbnRzXG5cbmZ1bmN0aW9uIGZpbHRlclBvaW50cyggc3RhcnQsIGVuZCApIHtcblxuXHRpZiAoICEgc3RhcnQgKSByZXR1cm4gc3RhcnQ7XG5cdGlmICggISBlbmQgKSBlbmQgPSBzdGFydDtcblxuXHR2YXIgcCA9IHN0YXJ0LCBhZ2FpbjtcblxuXHRkbyB7XG5cblx0XHRhZ2FpbiA9IGZhbHNlO1xuXG5cdFx0aWYgKCAhIHAuc3RlaW5lciAmJiAoIGVxdWFscyggcCwgcC5uZXh0ICkgfHwgYXJlYSggcC5wcmV2LCBwLCBwLm5leHQgKSA9PT0gMCApICkge1xuXG5cdFx0XHRyZW1vdmVOb2RlKCBwICk7XG5cdFx0XHRwID0gZW5kID0gcC5wcmV2O1xuXHRcdFx0aWYgKCBwID09PSBwLm5leHQgKSBicmVhaztcblx0XHRcdGFnYWluID0gdHJ1ZTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHAgPSBwLm5leHQ7XG5cblx0XHR9XG5cblx0fSB3aGlsZSAoIGFnYWluIHx8IHAgIT09IGVuZCApO1xuXG5cdHJldHVybiBlbmQ7XG5cbn1cblxuLy8gbWFpbiBlYXIgc2xpY2luZyBsb29wIHdoaWNoIHRyaWFuZ3VsYXRlcyBhIHBvbHlnb24gKGdpdmVuIGFzIGEgbGlua2VkIGxpc3QpXG5cbmZ1bmN0aW9uIGVhcmN1dExpbmtlZCggZWFyLCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgaW52U2l6ZSwgcGFzcyApIHtcblxuXHRpZiAoICEgZWFyICkgcmV0dXJuO1xuXG5cdC8vIGludGVybGluayBwb2x5Z29uIG5vZGVzIGluIHotb3JkZXJcblxuXHRpZiAoICEgcGFzcyAmJiBpbnZTaXplICkgaW5kZXhDdXJ2ZSggZWFyLCBtaW5YLCBtaW5ZLCBpbnZTaXplICk7XG5cblx0dmFyIHN0b3AgPSBlYXIsIHByZXYsIG5leHQ7XG5cblx0Ly8gaXRlcmF0ZSB0aHJvdWdoIGVhcnMsIHNsaWNpbmcgdGhlbSBvbmUgYnkgb25lXG5cblx0d2hpbGUgKCBlYXIucHJldiAhPT0gZWFyLm5leHQgKSB7XG5cblx0XHRwcmV2ID0gZWFyLnByZXY7XG5cdFx0bmV4dCA9IGVhci5uZXh0O1xuXG5cdFx0aWYgKCBpbnZTaXplID8gaXNFYXJIYXNoZWQoIGVhciwgbWluWCwgbWluWSwgaW52U2l6ZSApIDogaXNFYXIoIGVhciApICkge1xuXG5cdFx0XHQvLyBjdXQgb2ZmIHRoZSB0cmlhbmdsZVxuXHRcdFx0dHJpYW5nbGVzLnB1c2goIHByZXYuaSAvIGRpbSApO1xuXHRcdFx0dHJpYW5nbGVzLnB1c2goIGVhci5pIC8gZGltICk7XG5cdFx0XHR0cmlhbmdsZXMucHVzaCggbmV4dC5pIC8gZGltICk7XG5cblx0XHRcdHJlbW92ZU5vZGUoIGVhciApO1xuXG5cdFx0XHQvLyBza2lwcGluZyB0aGUgbmV4dCB2ZXJ0aWNlIGxlYWRzIHRvIGxlc3Mgc2xpdmVyIHRyaWFuZ2xlc1xuXHRcdFx0ZWFyID0gbmV4dC5uZXh0O1xuXHRcdFx0c3RvcCA9IG5leHQubmV4dDtcblxuXHRcdFx0Y29udGludWU7XG5cblx0XHR9XG5cblx0XHRlYXIgPSBuZXh0O1xuXG5cdFx0Ly8gaWYgd2UgbG9vcGVkIHRocm91Z2ggdGhlIHdob2xlIHJlbWFpbmluZyBwb2x5Z29uIGFuZCBjYW4ndCBmaW5kIGFueSBtb3JlIGVhcnNcblxuXHRcdGlmICggZWFyID09PSBzdG9wICkge1xuXG5cdFx0XHQvLyB0cnkgZmlsdGVyaW5nIHBvaW50cyBhbmQgc2xpY2luZyBhZ2FpblxuXG5cdFx0XHRpZiAoICEgcGFzcyApIHtcblxuXHRcdFx0XHRlYXJjdXRMaW5rZWQoIGZpbHRlclBvaW50cyggZWFyICksIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplLCAxICk7XG5cblx0XHRcdFx0Ly8gaWYgdGhpcyBkaWRuJ3Qgd29yaywgdHJ5IGN1cmluZyBhbGwgc21hbGwgc2VsZi1pbnRlcnNlY3Rpb25zIGxvY2FsbHlcblxuXHRcdFx0fSBlbHNlIGlmICggcGFzcyA9PT0gMSApIHtcblxuXHRcdFx0XHRlYXIgPSBjdXJlTG9jYWxJbnRlcnNlY3Rpb25zKCBlYXIsIHRyaWFuZ2xlcywgZGltICk7XG5cdFx0XHRcdGVhcmN1dExpbmtlZCggZWFyLCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgaW52U2l6ZSwgMiApO1xuXG5cdFx0XHQvLyBhcyBhIGxhc3QgcmVzb3J0LCB0cnkgc3BsaXR0aW5nIHRoZSByZW1haW5pbmcgcG9seWdvbiBpbnRvIHR3b1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBwYXNzID09PSAyICkge1xuXG5cdFx0XHRcdHNwbGl0RWFyY3V0KCBlYXIsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplICk7XG5cblx0XHRcdH1cblxuXHRcdFx0YnJlYWs7XG5cblx0XHR9XG5cblx0fVxuXG59XG5cbi8vIGNoZWNrIHdoZXRoZXIgYSBwb2x5Z29uIG5vZGUgZm9ybXMgYSB2YWxpZCBlYXIgd2l0aCBhZGphY2VudCBub2Rlc1xuXG5mdW5jdGlvbiBpc0VhciggZWFyICkge1xuXG5cdHZhciBhID0gZWFyLnByZXYsXG5cdFx0YiA9IGVhcixcblx0XHRjID0gZWFyLm5leHQ7XG5cblx0aWYgKCBhcmVhKCBhLCBiLCBjICkgPj0gMCApIHJldHVybiBmYWxzZTsgLy8gcmVmbGV4LCBjYW4ndCBiZSBhbiBlYXJcblxuXHQvLyBub3cgbWFrZSBzdXJlIHdlIGRvbid0IGhhdmUgb3RoZXIgcG9pbnRzIGluc2lkZSB0aGUgcG90ZW50aWFsIGVhclxuXHR2YXIgcCA9IGVhci5uZXh0Lm5leHQ7XG5cblx0d2hpbGUgKCBwICE9PSBlYXIucHJldiApIHtcblxuXHRcdGlmICggcG9pbnRJblRyaWFuZ2xlKCBhLngsIGEueSwgYi54LCBiLnksIGMueCwgYy55LCBwLngsIHAueSApICYmIGFyZWEoIHAucHJldiwgcCwgcC5uZXh0ICkgPj0gMCApIHtcblxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXG5cdFx0fVxuXG5cdFx0cCA9IHAubmV4dDtcblxuXHR9XG5cblx0cmV0dXJuIHRydWU7XG5cbn1cblxuZnVuY3Rpb24gaXNFYXJIYXNoZWQoIGVhciwgbWluWCwgbWluWSwgaW52U2l6ZSApIHtcblxuXHR2YXIgYSA9IGVhci5wcmV2LFxuXHRcdGIgPSBlYXIsXG5cdFx0YyA9IGVhci5uZXh0O1xuXG5cdGlmICggYXJlYSggYSwgYiwgYyApID49IDAgKSByZXR1cm4gZmFsc2U7IC8vIHJlZmxleCwgY2FuJ3QgYmUgYW4gZWFyXG5cblx0Ly8gdHJpYW5nbGUgYmJveDsgbWluICYgbWF4IGFyZSBjYWxjdWxhdGVkIGxpa2UgdGhpcyBmb3Igc3BlZWRcblxuXHR2YXIgbWluVFggPSBhLnggPCBiLnggPyAoIGEueCA8IGMueCA/IGEueCA6IGMueCApIDogKCBiLnggPCBjLnggPyBiLnggOiBjLnggKSxcblx0XHRtaW5UWSA9IGEueSA8IGIueSA/ICggYS55IDwgYy55ID8gYS55IDogYy55ICkgOiAoIGIueSA8IGMueSA/IGIueSA6IGMueSApLFxuXHRcdG1heFRYID0gYS54ID4gYi54ID8gKCBhLnggPiBjLnggPyBhLnggOiBjLnggKSA6ICggYi54ID4gYy54ID8gYi54IDogYy54ICksXG5cdFx0bWF4VFkgPSBhLnkgPiBiLnkgPyAoIGEueSA+IGMueSA/IGEueSA6IGMueSApIDogKCBiLnkgPiBjLnkgPyBiLnkgOiBjLnkgKTtcblxuXHQvLyB6LW9yZGVyIHJhbmdlIGZvciB0aGUgY3VycmVudCB0cmlhbmdsZSBiYm94O1xuXG5cdHZhciBtaW5aID0gek9yZGVyKCBtaW5UWCwgbWluVFksIG1pblgsIG1pblksIGludlNpemUgKSxcblx0XHRtYXhaID0gek9yZGVyKCBtYXhUWCwgbWF4VFksIG1pblgsIG1pblksIGludlNpemUgKTtcblxuXHQvLyBmaXJzdCBsb29rIGZvciBwb2ludHMgaW5zaWRlIHRoZSB0cmlhbmdsZSBpbiBpbmNyZWFzaW5nIHotb3JkZXJcblxuXHR2YXIgcCA9IGVhci5uZXh0WjtcblxuXHR3aGlsZSAoIHAgJiYgcC56IDw9IG1heFogKSB7XG5cblx0XHRpZiAoIHAgIT09IGVhci5wcmV2ICYmIHAgIT09IGVhci5uZXh0ICYmXG5cdFx0XHRcdHBvaW50SW5UcmlhbmdsZSggYS54LCBhLnksIGIueCwgYi55LCBjLngsIGMueSwgcC54LCBwLnkgKSAmJlxuXHRcdFx0XHRhcmVhKCBwLnByZXYsIHAsIHAubmV4dCApID49IDAgKSByZXR1cm4gZmFsc2U7XG5cdFx0cCA9IHAubmV4dFo7XG5cblx0fVxuXG5cdC8vIHRoZW4gbG9vayBmb3IgcG9pbnRzIGluIGRlY3JlYXNpbmcgei1vcmRlclxuXG5cdHAgPSBlYXIucHJldlo7XG5cblx0d2hpbGUgKCBwICYmIHAueiA+PSBtaW5aICkge1xuXG5cdFx0aWYgKCBwICE9PSBlYXIucHJldiAmJiBwICE9PSBlYXIubmV4dCAmJlxuXHRcdFx0XHRwb2ludEluVHJpYW5nbGUoIGEueCwgYS55LCBiLngsIGIueSwgYy54LCBjLnksIHAueCwgcC55ICkgJiZcblx0XHRcdFx0YXJlYSggcC5wcmV2LCBwLCBwLm5leHQgKSA+PSAwICkgcmV0dXJuIGZhbHNlO1xuXG5cdFx0cCA9IHAucHJldlo7XG5cblx0fVxuXG5cdHJldHVybiB0cnVlO1xuXG59XG5cbi8vIGdvIHRocm91Z2ggYWxsIHBvbHlnb24gbm9kZXMgYW5kIGN1cmUgc21hbGwgbG9jYWwgc2VsZi1pbnRlcnNlY3Rpb25zXG5cbmZ1bmN0aW9uIGN1cmVMb2NhbEludGVyc2VjdGlvbnMoIHN0YXJ0LCB0cmlhbmdsZXMsIGRpbSApIHtcblxuXHR2YXIgcCA9IHN0YXJ0O1xuXG5cdGRvIHtcblxuXHRcdHZhciBhID0gcC5wcmV2LCBiID0gcC5uZXh0Lm5leHQ7XG5cblx0XHRpZiAoICEgZXF1YWxzKCBhLCBiICkgJiYgaW50ZXJzZWN0cyggYSwgcCwgcC5uZXh0LCBiICkgJiYgbG9jYWxseUluc2lkZSggYSwgYiApICYmIGxvY2FsbHlJbnNpZGUoIGIsIGEgKSApIHtcblxuXHRcdFx0dHJpYW5nbGVzLnB1c2goIGEuaSAvIGRpbSApO1xuXHRcdFx0dHJpYW5nbGVzLnB1c2goIHAuaSAvIGRpbSApO1xuXHRcdFx0dHJpYW5nbGVzLnB1c2goIGIuaSAvIGRpbSApO1xuXG5cdFx0XHQvLyByZW1vdmUgdHdvIG5vZGVzIGludm9sdmVkXG5cblx0XHRcdHJlbW92ZU5vZGUoIHAgKTtcblx0XHRcdHJlbW92ZU5vZGUoIHAubmV4dCApO1xuXG5cdFx0XHRwID0gc3RhcnQgPSBiO1xuXG5cdFx0fVxuXG5cdFx0cCA9IHAubmV4dDtcblxuXHR9IHdoaWxlICggcCAhPT0gc3RhcnQgKTtcblxuXHRyZXR1cm4gcDtcblxufVxuXG4vLyB0cnkgc3BsaXR0aW5nIHBvbHlnb24gaW50byB0d28gYW5kIHRyaWFuZ3VsYXRlIHRoZW0gaW5kZXBlbmRlbnRseVxuXG5mdW5jdGlvbiBzcGxpdEVhcmN1dCggc3RhcnQsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplICkge1xuXG5cdC8vIGxvb2sgZm9yIGEgdmFsaWQgZGlhZ29uYWwgdGhhdCBkaXZpZGVzIHRoZSBwb2x5Z29uIGludG8gdHdvXG5cblx0dmFyIGEgPSBzdGFydDtcblxuXHRkbyB7XG5cblx0XHR2YXIgYiA9IGEubmV4dC5uZXh0O1xuXG5cdFx0d2hpbGUgKCBiICE9PSBhLnByZXYgKSB7XG5cblx0XHRcdGlmICggYS5pICE9PSBiLmkgJiYgaXNWYWxpZERpYWdvbmFsKCBhLCBiICkgKSB7XG5cblx0XHRcdFx0Ly8gc3BsaXQgdGhlIHBvbHlnb24gaW4gdHdvIGJ5IHRoZSBkaWFnb25hbFxuXG5cdFx0XHRcdHZhciBjID0gc3BsaXRQb2x5Z29uKCBhLCBiICk7XG5cblx0XHRcdFx0Ly8gZmlsdGVyIGNvbGluZWFyIHBvaW50cyBhcm91bmQgdGhlIGN1dHNcblxuXHRcdFx0XHRhID0gZmlsdGVyUG9pbnRzKCBhLCBhLm5leHQgKTtcblx0XHRcdFx0YyA9IGZpbHRlclBvaW50cyggYywgYy5uZXh0ICk7XG5cblx0XHRcdFx0Ly8gcnVuIGVhcmN1dCBvbiBlYWNoIGhhbGZcblxuXHRcdFx0XHRlYXJjdXRMaW5rZWQoIGEsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplICk7XG5cdFx0XHRcdGVhcmN1dExpbmtlZCggYywgdHJpYW5nbGVzLCBkaW0sIG1pblgsIG1pblksIGludlNpemUgKTtcblx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHR9XG5cblx0XHRcdGIgPSBiLm5leHQ7XG5cblx0XHR9XG5cblx0XHRhID0gYS5uZXh0O1xuXG5cdH0gd2hpbGUgKCBhICE9PSBzdGFydCApO1xuXG59XG5cbi8vIGxpbmsgZXZlcnkgaG9sZSBpbnRvIHRoZSBvdXRlciBsb29wLCBwcm9kdWNpbmcgYSBzaW5nbGUtcmluZyBwb2x5Z29uIHdpdGhvdXQgaG9sZXNcblxuZnVuY3Rpb24gZWxpbWluYXRlSG9sZXMoIGRhdGEsIGhvbGVJbmRpY2VzLCBvdXRlck5vZGUsIGRpbSApIHtcblxuXHR2YXIgcXVldWUgPSBbXSwgaSwgbGVuLCBzdGFydCwgZW5kLCBsaXN0O1xuXG5cdGZvciAoIGkgPSAwLCBsZW4gPSBob2xlSW5kaWNlcy5sZW5ndGg7IGkgPCBsZW47IGkgKysgKSB7XG5cblx0XHRzdGFydCA9IGhvbGVJbmRpY2VzWyBpIF0gKiBkaW07XG5cdFx0ZW5kID0gaSA8IGxlbiAtIDEgPyBob2xlSW5kaWNlc1sgaSArIDEgXSAqIGRpbSA6IGRhdGEubGVuZ3RoO1xuXHRcdGxpc3QgPSBsaW5rZWRMaXN0KCBkYXRhLCBzdGFydCwgZW5kLCBkaW0sIGZhbHNlICk7XG5cdFx0aWYgKCBsaXN0ID09PSBsaXN0Lm5leHQgKSBsaXN0LnN0ZWluZXIgPSB0cnVlO1xuXHRcdHF1ZXVlLnB1c2goIGdldExlZnRtb3N0KCBsaXN0ICkgKTtcblxuXHR9XG5cblx0cXVldWUuc29ydCggY29tcGFyZVggKTtcblxuXHQvLyBwcm9jZXNzIGhvbGVzIGZyb20gbGVmdCB0byByaWdodFxuXG5cdGZvciAoIGkgPSAwOyBpIDwgcXVldWUubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0ZWxpbWluYXRlSG9sZSggcXVldWVbIGkgXSwgb3V0ZXJOb2RlICk7XG5cdFx0b3V0ZXJOb2RlID0gZmlsdGVyUG9pbnRzKCBvdXRlck5vZGUsIG91dGVyTm9kZS5uZXh0ICk7XG5cblx0fVxuXG5cdHJldHVybiBvdXRlck5vZGU7XG5cbn1cblxuZnVuY3Rpb24gY29tcGFyZVgoIGEsIGIgKSB7XG5cblx0cmV0dXJuIGEueCAtIGIueDtcblxufVxuXG4vLyBmaW5kIGEgYnJpZGdlIGJldHdlZW4gdmVydGljZXMgdGhhdCBjb25uZWN0cyBob2xlIHdpdGggYW4gb3V0ZXIgcmluZyBhbmQgYW5kIGxpbmsgaXRcblxuZnVuY3Rpb24gZWxpbWluYXRlSG9sZSggaG9sZSwgb3V0ZXJOb2RlICkge1xuXG5cdG91dGVyTm9kZSA9IGZpbmRIb2xlQnJpZGdlKCBob2xlLCBvdXRlck5vZGUgKTtcblxuXHRpZiAoIG91dGVyTm9kZSApIHtcblxuXHRcdHZhciBiID0gc3BsaXRQb2x5Z29uKCBvdXRlck5vZGUsIGhvbGUgKTtcblxuXHRcdGZpbHRlclBvaW50cyggYiwgYi5uZXh0ICk7XG5cblx0fVxuXG59XG5cbi8vIERhdmlkIEViZXJseSdzIGFsZ29yaXRobSBmb3IgZmluZGluZyBhIGJyaWRnZSBiZXR3ZWVuIGhvbGUgYW5kIG91dGVyIHBvbHlnb25cblxuZnVuY3Rpb24gZmluZEhvbGVCcmlkZ2UoIGhvbGUsIG91dGVyTm9kZSApIHtcblxuXHR2YXIgcCA9IG91dGVyTm9kZSxcblx0XHRoeCA9IGhvbGUueCxcblx0XHRoeSA9IGhvbGUueSxcblx0XHRxeCA9IC0gSW5maW5pdHksXG5cdFx0bTtcblxuXHQvLyBmaW5kIGEgc2VnbWVudCBpbnRlcnNlY3RlZCBieSBhIHJheSBmcm9tIHRoZSBob2xlJ3MgbGVmdG1vc3QgcG9pbnQgdG8gdGhlIGxlZnQ7XG5cdC8vIHNlZ21lbnQncyBlbmRwb2ludCB3aXRoIGxlc3NlciB4IHdpbGwgYmUgcG90ZW50aWFsIGNvbm5lY3Rpb24gcG9pbnRcblxuXHRkbyB7XG5cblx0XHRpZiAoIGh5IDw9IHAueSAmJiBoeSA+PSBwLm5leHQueSAmJiBwLm5leHQueSAhPT0gcC55ICkge1xuXG5cdFx0XHR2YXIgeCA9IHAueCArICggaHkgLSBwLnkgKSAqICggcC5uZXh0LnggLSBwLnggKSAvICggcC5uZXh0LnkgLSBwLnkgKTtcblxuXHRcdFx0aWYgKCB4IDw9IGh4ICYmIHggPiBxeCApIHtcblxuXHRcdFx0XHRxeCA9IHg7XG5cblx0XHRcdFx0aWYgKCB4ID09PSBoeCApIHtcblxuXHRcdFx0XHRcdGlmICggaHkgPT09IHAueSApIHJldHVybiBwO1xuXHRcdFx0XHRcdGlmICggaHkgPT09IHAubmV4dC55ICkgcmV0dXJuIHAubmV4dDtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0bSA9IHAueCA8IHAubmV4dC54ID8gcCA6IHAubmV4dDtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cCA9IHAubmV4dDtcblxuXHR9IHdoaWxlICggcCAhPT0gb3V0ZXJOb2RlICk7XG5cblx0aWYgKCAhIG0gKSByZXR1cm4gbnVsbDtcblxuXHRpZiAoIGh4ID09PSBxeCApIHJldHVybiBtLnByZXY7IC8vIGhvbGUgdG91Y2hlcyBvdXRlciBzZWdtZW50OyBwaWNrIGxvd2VyIGVuZHBvaW50XG5cblx0Ly8gbG9vayBmb3IgcG9pbnRzIGluc2lkZSB0aGUgdHJpYW5nbGUgb2YgaG9sZSBwb2ludCwgc2VnbWVudCBpbnRlcnNlY3Rpb24gYW5kIGVuZHBvaW50O1xuXHQvLyBpZiB0aGVyZSBhcmUgbm8gcG9pbnRzIGZvdW5kLCB3ZSBoYXZlIGEgdmFsaWQgY29ubmVjdGlvbjtcblx0Ly8gb3RoZXJ3aXNlIGNob29zZSB0aGUgcG9pbnQgb2YgdGhlIG1pbmltdW0gYW5nbGUgd2l0aCB0aGUgcmF5IGFzIGNvbm5lY3Rpb24gcG9pbnRcblxuXHR2YXIgc3RvcCA9IG0sXG5cdFx0bXggPSBtLngsXG5cdFx0bXkgPSBtLnksXG5cdFx0dGFuTWluID0gSW5maW5pdHksXG5cdFx0dGFuO1xuXG5cdHAgPSBtLm5leHQ7XG5cblx0d2hpbGUgKCBwICE9PSBzdG9wICkge1xuXG5cdFx0aWYgKCBoeCA+PSBwLnggJiYgcC54ID49IG14ICYmIGh4ICE9PSBwLnggJiZcblx0XHRcdFx0XHRcdHBvaW50SW5UcmlhbmdsZSggaHkgPCBteSA/IGh4IDogcXgsIGh5LCBteCwgbXksIGh5IDwgbXkgPyBxeCA6IGh4LCBoeSwgcC54LCBwLnkgKSApIHtcblxuXHRcdFx0dGFuID0gTWF0aC5hYnMoIGh5IC0gcC55ICkgLyAoIGh4IC0gcC54ICk7IC8vIHRhbmdlbnRpYWxcblxuXHRcdFx0aWYgKCAoIHRhbiA8IHRhbk1pbiB8fCAoIHRhbiA9PT0gdGFuTWluICYmIHAueCA+IG0ueCApICkgJiYgbG9jYWxseUluc2lkZSggcCwgaG9sZSApICkge1xuXG5cdFx0XHRcdG0gPSBwO1xuXHRcdFx0XHR0YW5NaW4gPSB0YW47XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHAgPSBwLm5leHQ7XG5cblx0fVxuXG5cdHJldHVybiBtO1xuXG59XG5cbi8vIGludGVybGluayBwb2x5Z29uIG5vZGVzIGluIHotb3JkZXJcblxuZnVuY3Rpb24gaW5kZXhDdXJ2ZSggc3RhcnQsIG1pblgsIG1pblksIGludlNpemUgKSB7XG5cblx0dmFyIHAgPSBzdGFydDtcblxuXHRkbyB7XG5cblx0XHRpZiAoIHAueiA9PT0gbnVsbCApIHAueiA9IHpPcmRlciggcC54LCBwLnksIG1pblgsIG1pblksIGludlNpemUgKTtcblx0XHRwLnByZXZaID0gcC5wcmV2O1xuXHRcdHAubmV4dFogPSBwLm5leHQ7XG5cdFx0cCA9IHAubmV4dDtcblxuXHR9IHdoaWxlICggcCAhPT0gc3RhcnQgKTtcblxuXHRwLnByZXZaLm5leHRaID0gbnVsbDtcblx0cC5wcmV2WiA9IG51bGw7XG5cblx0c29ydExpbmtlZCggcCApO1xuXG59XG5cbi8vIFNpbW9uIFRhdGhhbSdzIGxpbmtlZCBsaXN0IG1lcmdlIHNvcnQgYWxnb3JpdGhtXG4vLyBodHRwOi8vd3d3LmNoaWFyay5ncmVlbmVuZC5vcmcudWsvfnNndGF0aGFtL2FsZ29yaXRobXMvbGlzdHNvcnQuaHRtbFxuXG5mdW5jdGlvbiBzb3J0TGlua2VkKCBsaXN0ICkge1xuXG5cdHZhciBpLCBwLCBxLCBlLCB0YWlsLCBudW1NZXJnZXMsIHBTaXplLCBxU2l6ZSwgaW5TaXplID0gMTtcblxuXHRkbyB7XG5cblx0XHRwID0gbGlzdDtcblx0XHRsaXN0ID0gbnVsbDtcblx0XHR0YWlsID0gbnVsbDtcblx0XHRudW1NZXJnZXMgPSAwO1xuXG5cdFx0d2hpbGUgKCBwICkge1xuXG5cdFx0XHRudW1NZXJnZXMgKys7XG5cdFx0XHRxID0gcDtcblx0XHRcdHBTaXplID0gMDtcblxuXHRcdFx0Zm9yICggaSA9IDA7IGkgPCBpblNpemU7IGkgKysgKSB7XG5cblx0XHRcdFx0cFNpemUgKys7XG5cdFx0XHRcdHEgPSBxLm5leHRaO1xuXHRcdFx0XHRpZiAoICEgcSApIGJyZWFrO1xuXG5cdFx0XHR9XG5cblx0XHRcdHFTaXplID0gaW5TaXplO1xuXG5cdFx0XHR3aGlsZSAoIHBTaXplID4gMCB8fCAoIHFTaXplID4gMCAmJiBxICkgKSB7XG5cblx0XHRcdFx0aWYgKCBwU2l6ZSAhPT0gMCAmJiAoIHFTaXplID09PSAwIHx8ICEgcSB8fCBwLnogPD0gcS56ICkgKSB7XG5cblx0XHRcdFx0XHRlID0gcDtcblx0XHRcdFx0XHRwID0gcC5uZXh0Wjtcblx0XHRcdFx0XHRwU2l6ZSAtLTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0ZSA9IHE7XG5cdFx0XHRcdFx0cSA9IHEubmV4dFo7XG5cdFx0XHRcdFx0cVNpemUgLS07XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICggdGFpbCApIHRhaWwubmV4dFogPSBlO1xuXHRcdFx0XHRlbHNlIGxpc3QgPSBlO1xuXG5cdFx0XHRcdGUucHJldlogPSB0YWlsO1xuXHRcdFx0XHR0YWlsID0gZTtcblxuXHRcdFx0fVxuXG5cdFx0XHRwID0gcTtcblxuXHRcdH1cblxuXHRcdHRhaWwubmV4dFogPSBudWxsO1xuXHRcdGluU2l6ZSAqPSAyO1xuXG5cdH0gd2hpbGUgKCBudW1NZXJnZXMgPiAxICk7XG5cblx0cmV0dXJuIGxpc3Q7XG5cbn1cblxuLy8gei1vcmRlciBvZiBhIHBvaW50IGdpdmVuIGNvb3JkcyBhbmQgaW52ZXJzZSBvZiB0aGUgbG9uZ2VyIHNpZGUgb2YgZGF0YSBiYm94XG5cbmZ1bmN0aW9uIHpPcmRlciggeCwgeSwgbWluWCwgbWluWSwgaW52U2l6ZSApIHtcblxuXHQvLyBjb29yZHMgYXJlIHRyYW5zZm9ybWVkIGludG8gbm9uLW5lZ2F0aXZlIDE1LWJpdCBpbnRlZ2VyIHJhbmdlXG5cblx0eCA9IDMyNzY3ICogKCB4IC0gbWluWCApICogaW52U2l6ZTtcblx0eSA9IDMyNzY3ICogKCB5IC0gbWluWSApICogaW52U2l6ZTtcblxuXHR4ID0gKCB4IHwgKCB4IDw8IDggKSApICYgMHgwMEZGMDBGRjtcblx0eCA9ICggeCB8ICggeCA8PCA0ICkgKSAmIDB4MEYwRjBGMEY7XG5cdHggPSAoIHggfCAoIHggPDwgMiApICkgJiAweDMzMzMzMzMzO1xuXHR4ID0gKCB4IHwgKCB4IDw8IDEgKSApICYgMHg1NTU1NTU1NTtcblxuXHR5ID0gKCB5IHwgKCB5IDw8IDggKSApICYgMHgwMEZGMDBGRjtcblx0eSA9ICggeSB8ICggeSA8PCA0ICkgKSAmIDB4MEYwRjBGMEY7XG5cdHkgPSAoIHkgfCAoIHkgPDwgMiApICkgJiAweDMzMzMzMzMzO1xuXHR5ID0gKCB5IHwgKCB5IDw8IDEgKSApICYgMHg1NTU1NTU1NTtcblxuXHRyZXR1cm4geCB8ICggeSA8PCAxICk7XG5cbn1cblxuLy8gZmluZCB0aGUgbGVmdG1vc3Qgbm9kZSBvZiBhIHBvbHlnb24gcmluZ1xuXG5mdW5jdGlvbiBnZXRMZWZ0bW9zdCggc3RhcnQgKSB7XG5cblx0dmFyIHAgPSBzdGFydCwgbGVmdG1vc3QgPSBzdGFydDtcblxuXHRkbyB7XG5cblx0XHRpZiAoIHAueCA8IGxlZnRtb3N0LnggKSBsZWZ0bW9zdCA9IHA7XG5cdFx0cCA9IHAubmV4dDtcblxuXHR9IHdoaWxlICggcCAhPT0gc3RhcnQgKTtcblxuXHRyZXR1cm4gbGVmdG1vc3Q7XG5cbn1cblxuLy8gY2hlY2sgaWYgYSBwb2ludCBsaWVzIHdpdGhpbiBhIGNvbnZleCB0cmlhbmdsZVxuXG5mdW5jdGlvbiBwb2ludEluVHJpYW5nbGUoIGF4LCBheSwgYngsIGJ5LCBjeCwgY3ksIHB4LCBweSApIHtcblxuXHRyZXR1cm4gKCBjeCAtIHB4ICkgKiAoIGF5IC0gcHkgKSAtICggYXggLSBweCApICogKCBjeSAtIHB5ICkgPj0gMCAmJlxuXHQgKCBheCAtIHB4ICkgKiAoIGJ5IC0gcHkgKSAtICggYnggLSBweCApICogKCBheSAtIHB5ICkgPj0gMCAmJlxuXHQgKCBieCAtIHB4ICkgKiAoIGN5IC0gcHkgKSAtICggY3ggLSBweCApICogKCBieSAtIHB5ICkgPj0gMDtcblxufVxuXG4vLyBjaGVjayBpZiBhIGRpYWdvbmFsIGJldHdlZW4gdHdvIHBvbHlnb24gbm9kZXMgaXMgdmFsaWQgKGxpZXMgaW4gcG9seWdvbiBpbnRlcmlvcilcblxuZnVuY3Rpb24gaXNWYWxpZERpYWdvbmFsKCBhLCBiICkge1xuXG5cdHJldHVybiBhLm5leHQuaSAhPT0gYi5pICYmIGEucHJldi5pICE9PSBiLmkgJiYgISBpbnRlcnNlY3RzUG9seWdvbiggYSwgYiApICYmXG5cdFx0bG9jYWxseUluc2lkZSggYSwgYiApICYmIGxvY2FsbHlJbnNpZGUoIGIsIGEgKSAmJiBtaWRkbGVJbnNpZGUoIGEsIGIgKTtcblxufVxuXG4vLyBzaWduZWQgYXJlYSBvZiBhIHRyaWFuZ2xlXG5cbmZ1bmN0aW9uIGFyZWEoIHAsIHEsIHIgKSB7XG5cblx0cmV0dXJuICggcS55IC0gcC55ICkgKiAoIHIueCAtIHEueCApIC0gKCBxLnggLSBwLnggKSAqICggci55IC0gcS55ICk7XG5cbn1cblxuLy8gY2hlY2sgaWYgdHdvIHBvaW50cyBhcmUgZXF1YWxcblxuZnVuY3Rpb24gZXF1YWxzKCBwMSwgcDIgKSB7XG5cblx0cmV0dXJuIHAxLnggPT09IHAyLnggJiYgcDEueSA9PT0gcDIueTtcblxufVxuXG4vLyBjaGVjayBpZiB0d28gc2VnbWVudHMgaW50ZXJzZWN0XG5cbmZ1bmN0aW9uIGludGVyc2VjdHMoIHAxLCBxMSwgcDIsIHEyICkge1xuXG5cdGlmICggKCBlcXVhbHMoIHAxLCBxMSApICYmIGVxdWFscyggcDIsIHEyICkgKSB8fFxuXHRcdFx0KCBlcXVhbHMoIHAxLCBxMiApICYmIGVxdWFscyggcDIsIHExICkgKSApIHJldHVybiB0cnVlO1xuXG5cdHJldHVybiBhcmVhKCBwMSwgcTEsIHAyICkgPiAwICE9PSBhcmVhKCBwMSwgcTEsIHEyICkgPiAwICYmXG5cdFx0XHRcdCBhcmVhKCBwMiwgcTIsIHAxICkgPiAwICE9PSBhcmVhKCBwMiwgcTIsIHExICkgPiAwO1xuXG59XG5cbi8vIGNoZWNrIGlmIGEgcG9seWdvbiBkaWFnb25hbCBpbnRlcnNlY3RzIGFueSBwb2x5Z29uIHNlZ21lbnRzXG5cbmZ1bmN0aW9uIGludGVyc2VjdHNQb2x5Z29uKCBhLCBiICkge1xuXG5cdHZhciBwID0gYTtcblxuXHRkbyB7XG5cblx0XHRpZiAoIHAuaSAhPT0gYS5pICYmIHAubmV4dC5pICE9PSBhLmkgJiYgcC5pICE9PSBiLmkgJiYgcC5uZXh0LmkgIT09IGIuaSAmJlxuXHRcdFx0XHRcdFx0aW50ZXJzZWN0cyggcCwgcC5uZXh0LCBhLCBiICkgKSB7XG5cblx0XHRcdHJldHVybiB0cnVlO1xuXG5cdFx0fVxuXG5cdFx0cCA9IHAubmV4dDtcblxuXHR9IHdoaWxlICggcCAhPT0gYSApO1xuXG5cdHJldHVybiBmYWxzZTtcblxufVxuXG4vLyBjaGVjayBpZiBhIHBvbHlnb24gZGlhZ29uYWwgaXMgbG9jYWxseSBpbnNpZGUgdGhlIHBvbHlnb25cblxuZnVuY3Rpb24gbG9jYWxseUluc2lkZSggYSwgYiApIHtcblxuXHRyZXR1cm4gYXJlYSggYS5wcmV2LCBhLCBhLm5leHQgKSA8IDAgP1xuXHRcdGFyZWEoIGEsIGIsIGEubmV4dCApID49IDAgJiYgYXJlYSggYSwgYS5wcmV2LCBiICkgPj0gMCA6XG5cdFx0YXJlYSggYSwgYiwgYS5wcmV2ICkgPCAwIHx8IGFyZWEoIGEsIGEubmV4dCwgYiApIDwgMDtcblxufVxuXG4vLyBjaGVjayBpZiB0aGUgbWlkZGxlIHBvaW50IG9mIGEgcG9seWdvbiBkaWFnb25hbCBpcyBpbnNpZGUgdGhlIHBvbHlnb25cblxuZnVuY3Rpb24gbWlkZGxlSW5zaWRlKCBhLCBiICkge1xuXG5cdHZhciBwID0gYSxcblx0XHRpbnNpZGUgPSBmYWxzZSxcblx0XHRweCA9ICggYS54ICsgYi54ICkgLyAyLFxuXHRcdHB5ID0gKCBhLnkgKyBiLnkgKSAvIDI7XG5cblx0ZG8ge1xuXG5cdFx0aWYgKCAoICggcC55ID4gcHkgKSAhPT0gKCBwLm5leHQueSA+IHB5ICkgKSAmJiBwLm5leHQueSAhPT0gcC55ICYmXG5cdFx0XHRcdFx0XHQoIHB4IDwgKCBwLm5leHQueCAtIHAueCApICogKCBweSAtIHAueSApIC8gKCBwLm5leHQueSAtIHAueSApICsgcC54ICkgKSB7XG5cblx0XHRcdGluc2lkZSA9ICEgaW5zaWRlO1xuXG5cdFx0fVxuXG5cdFx0cCA9IHAubmV4dDtcblxuXHR9IHdoaWxlICggcCAhPT0gYSApO1xuXG5cdHJldHVybiBpbnNpZGU7XG5cbn1cblxuLy8gbGluayB0d28gcG9seWdvbiB2ZXJ0aWNlcyB3aXRoIGEgYnJpZGdlOyBpZiB0aGUgdmVydGljZXMgYmVsb25nIHRvIHRoZSBzYW1lIHJpbmcsIGl0IHNwbGl0cyBwb2x5Z29uIGludG8gdHdvO1xuLy8gaWYgb25lIGJlbG9uZ3MgdG8gdGhlIG91dGVyIHJpbmcgYW5kIGFub3RoZXIgdG8gYSBob2xlLCBpdCBtZXJnZXMgaXQgaW50byBhIHNpbmdsZSByaW5nXG5cbmZ1bmN0aW9uIHNwbGl0UG9seWdvbiggYSwgYiApIHtcblxuXHR2YXIgYTIgPSBuZXcgTm9kZSggYS5pLCBhLngsIGEueSApLFxuXHRcdGIyID0gbmV3IE5vZGUoIGIuaSwgYi54LCBiLnkgKSxcblx0XHRhbiA9IGEubmV4dCxcblx0XHRicCA9IGIucHJldjtcblxuXHRhLm5leHQgPSBiO1xuXHRiLnByZXYgPSBhO1xuXG5cdGEyLm5leHQgPSBhbjtcblx0YW4ucHJldiA9IGEyO1xuXG5cdGIyLm5leHQgPSBhMjtcblx0YTIucHJldiA9IGIyO1xuXG5cdGJwLm5leHQgPSBiMjtcblx0YjIucHJldiA9IGJwO1xuXG5cdHJldHVybiBiMjtcblxufVxuXG4vLyBjcmVhdGUgYSBub2RlIGFuZCBvcHRpb25hbGx5IGxpbmsgaXQgd2l0aCBwcmV2aW91cyBvbmUgKGluIGEgY2lyY3VsYXIgZG91Ymx5IGxpbmtlZCBsaXN0KVxuXG5mdW5jdGlvbiBpbnNlcnROb2RlKCBpLCB4LCB5LCBsYXN0ICkge1xuXG5cdHZhciBwID0gbmV3IE5vZGUoIGksIHgsIHkgKTtcblxuXHRpZiAoICEgbGFzdCApIHtcblxuXHRcdHAucHJldiA9IHA7XG5cdFx0cC5uZXh0ID0gcDtcblxuXHR9IGVsc2Uge1xuXG5cdFx0cC5uZXh0ID0gbGFzdC5uZXh0O1xuXHRcdHAucHJldiA9IGxhc3Q7XG5cdFx0bGFzdC5uZXh0LnByZXYgPSBwO1xuXHRcdGxhc3QubmV4dCA9IHA7XG5cblx0fVxuXG5cdHJldHVybiBwO1xuXG59XG5cbmZ1bmN0aW9uIHJlbW92ZU5vZGUoIHAgKSB7XG5cblx0cC5uZXh0LnByZXYgPSBwLnByZXY7XG5cdHAucHJldi5uZXh0ID0gcC5uZXh0O1xuXG5cdGlmICggcC5wcmV2WiApIHAucHJldloubmV4dFogPSBwLm5leHRaO1xuXHRpZiAoIHAubmV4dFogKSBwLm5leHRaLnByZXZaID0gcC5wcmV2WjtcblxufVxuXG5mdW5jdGlvbiBOb2RlKCBpLCB4LCB5ICkge1xuXG5cdC8vIHZlcnRpY2UgaW5kZXggaW4gY29vcmRpbmF0ZXMgYXJyYXlcblx0dGhpcy5pID0gaTtcblxuXHQvLyB2ZXJ0ZXggY29vcmRpbmF0ZXNcblx0dGhpcy54ID0geDtcblx0dGhpcy55ID0geTtcblxuXHQvLyBwcmV2aW91cyBhbmQgbmV4dCB2ZXJ0aWNlIG5vZGVzIGluIGEgcG9seWdvbiByaW5nXG5cdHRoaXMucHJldiA9IG51bGw7XG5cdHRoaXMubmV4dCA9IG51bGw7XG5cblx0Ly8gei1vcmRlciBjdXJ2ZSB2YWx1ZVxuXHR0aGlzLnogPSBudWxsO1xuXG5cdC8vIHByZXZpb3VzIGFuZCBuZXh0IG5vZGVzIGluIHotb3JkZXJcblx0dGhpcy5wcmV2WiA9IG51bGw7XG5cdHRoaXMubmV4dFogPSBudWxsO1xuXG5cdC8vIGluZGljYXRlcyB3aGV0aGVyIHRoaXMgaXMgYSBzdGVpbmVyIHBvaW50XG5cdHRoaXMuc3RlaW5lciA9IGZhbHNlO1xuXG59XG5cbmZ1bmN0aW9uIHNpZ25lZEFyZWEoIGRhdGEsIHN0YXJ0LCBlbmQsIGRpbSApIHtcblxuXHR2YXIgc3VtID0gMDtcblxuXHRmb3IgKCB2YXIgaSA9IHN0YXJ0LCBqID0gZW5kIC0gZGltOyBpIDwgZW5kOyBpICs9IGRpbSApIHtcblxuXHRcdHN1bSArPSAoIGRhdGFbIGogXSAtIGRhdGFbIGkgXSApICogKCBkYXRhWyBpICsgMSBdICsgZGF0YVsgaiArIDEgXSApO1xuXHRcdGogPSBpO1xuXG5cdH1cblxuXHRyZXR1cm4gc3VtO1xuXG59XG5cbi8qKlxuICogQGF1dGhvciB6ejg1IC8gaHR0cDovL3d3dy5sYWI0Z2FtZXMubmV0L3p6ODUvYmxvZ1xuICovXG5cbnZhciBTaGFwZVV0aWxzID0ge1xuXG5cdC8vIGNhbGN1bGF0ZSBhcmVhIG9mIHRoZSBjb250b3VyIHBvbHlnb25cblxuXHRhcmVhOiBmdW5jdGlvbiAoIGNvbnRvdXIgKSB7XG5cblx0XHR2YXIgbiA9IGNvbnRvdXIubGVuZ3RoO1xuXHRcdHZhciBhID0gMC4wO1xuXG5cdFx0Zm9yICggdmFyIHAgPSBuIC0gMSwgcSA9IDA7IHEgPCBuOyBwID0gcSArKyApIHtcblxuXHRcdFx0YSArPSBjb250b3VyWyBwIF0ueCAqIGNvbnRvdXJbIHEgXS55IC0gY29udG91clsgcSBdLnggKiBjb250b3VyWyBwIF0ueTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBhICogMC41O1xuXG5cdH0sXG5cblx0aXNDbG9ja1dpc2U6IGZ1bmN0aW9uICggcHRzICkge1xuXG5cdFx0cmV0dXJuIFNoYXBlVXRpbHMuYXJlYSggcHRzICkgPCAwO1xuXG5cdH0sXG5cblx0dHJpYW5ndWxhdGVTaGFwZTogZnVuY3Rpb24gKCBjb250b3VyLCBob2xlcyApIHtcblxuXHRcdHZhciB2ZXJ0aWNlcyA9IFtdOyAvLyBmbGF0IGFycmF5IG9mIHZlcnRpY2VzIGxpa2UgWyB4MCx5MCwgeDEseTEsIHgyLHkyLCAuLi4gXVxuXHRcdHZhciBob2xlSW5kaWNlcyA9IFtdOyAvLyBhcnJheSBvZiBob2xlIGluZGljZXNcblx0XHR2YXIgZmFjZXMgPSBbXTsgLy8gZmluYWwgYXJyYXkgb2YgdmVydGV4IGluZGljZXMgbGlrZSBbIFsgYSxiLGQgXSwgWyBiLGMsZCBdIF1cblxuXHRcdHJlbW92ZUR1cEVuZFB0cyggY29udG91ciApO1xuXHRcdGFkZENvbnRvdXIoIHZlcnRpY2VzLCBjb250b3VyICk7XG5cblx0XHQvL1xuXG5cdFx0dmFyIGhvbGVJbmRleCA9IGNvbnRvdXIubGVuZ3RoO1xuXG5cdFx0aG9sZXMuZm9yRWFjaCggcmVtb3ZlRHVwRW5kUHRzICk7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBob2xlcy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdGhvbGVJbmRpY2VzLnB1c2goIGhvbGVJbmRleCApO1xuXHRcdFx0aG9sZUluZGV4ICs9IGhvbGVzWyBpIF0ubGVuZ3RoO1xuXHRcdFx0YWRkQ29udG91ciggdmVydGljZXMsIGhvbGVzWyBpIF0gKTtcblxuXHRcdH1cblxuXHRcdC8vXG5cblx0XHR2YXIgdHJpYW5nbGVzID0gRWFyY3V0LnRyaWFuZ3VsYXRlKCB2ZXJ0aWNlcywgaG9sZUluZGljZXMgKTtcblxuXHRcdC8vXG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCB0cmlhbmdsZXMubGVuZ3RoOyBpICs9IDMgKSB7XG5cblx0XHRcdGZhY2VzLnB1c2goIHRyaWFuZ2xlcy5zbGljZSggaSwgaSArIDMgKSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZhY2VzO1xuXG5cdH1cblxufTtcblxuZnVuY3Rpb24gcmVtb3ZlRHVwRW5kUHRzKCBwb2ludHMgKSB7XG5cblx0dmFyIGwgPSBwb2ludHMubGVuZ3RoO1xuXG5cdGlmICggbCA+IDIgJiYgcG9pbnRzWyBsIC0gMSBdLmVxdWFscyggcG9pbnRzWyAwIF0gKSApIHtcblxuXHRcdHBvaW50cy5wb3AoKTtcblxuXHR9XG5cbn1cblxuZnVuY3Rpb24gYWRkQ29udG91ciggdmVydGljZXMsIGNvbnRvdXIgKSB7XG5cblx0Zm9yICggdmFyIGkgPSAwOyBpIDwgY29udG91ci5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHR2ZXJ0aWNlcy5wdXNoKCBjb250b3VyWyBpIF0ueCApO1xuXHRcdHZlcnRpY2VzLnB1c2goIGNvbnRvdXJbIGkgXS55ICk7XG5cblx0fVxuXG59XG5cbi8qKlxuICogQGF1dGhvciB6ejg1IC8gaHR0cDovL3d3dy5sYWI0Z2FtZXMubmV0L3p6ODUvYmxvZ1xuICpcbiAqIENyZWF0ZXMgZXh0cnVkZWQgZ2VvbWV0cnkgZnJvbSBhIHBhdGggc2hhcGUuXG4gKlxuICogcGFyYW1ldGVycyA9IHtcbiAqXG4gKiAgY3VydmVTZWdtZW50czogPGludD4sIC8vIG51bWJlciBvZiBwb2ludHMgb24gdGhlIGN1cnZlc1xuICogIHN0ZXBzOiA8aW50PiwgLy8gbnVtYmVyIG9mIHBvaW50cyBmb3Igei1zaWRlIGV4dHJ1c2lvbnMgLyB1c2VkIGZvciBzdWJkaXZpZGluZyBzZWdtZW50cyBvZiBleHRydWRlIHNwbGluZSB0b29cbiAqICBhbW91bnQ6IDxpbnQ+LCAvLyBEZXB0aCB0byBleHRydWRlIHRoZSBzaGFwZVxuICpcbiAqICBiZXZlbEVuYWJsZWQ6IDxib29sPiwgLy8gdHVybiBvbiBiZXZlbFxuICogIGJldmVsVGhpY2tuZXNzOiA8ZmxvYXQ+LCAvLyBob3cgZGVlcCBpbnRvIHRoZSBvcmlnaW5hbCBzaGFwZSBiZXZlbCBnb2VzXG4gKiAgYmV2ZWxTaXplOiA8ZmxvYXQ+LCAvLyBob3cgZmFyIGZyb20gc2hhcGUgb3V0bGluZSBpcyBiZXZlbFxuICogIGJldmVsU2VnbWVudHM6IDxpbnQ+LCAvLyBudW1iZXIgb2YgYmV2ZWwgbGF5ZXJzXG4gKlxuICogIGV4dHJ1ZGVQYXRoOiA8VEhSRUUuQ3VydmU+IC8vIGN1cnZlIHRvIGV4dHJ1ZGUgc2hhcGUgYWxvbmdcbiAqXG4gKiAgVVZHZW5lcmF0b3I6IDxPYmplY3Q+IC8vIG9iamVjdCB0aGF0IHByb3ZpZGVzIFVWIGdlbmVyYXRvciBmdW5jdGlvbnNcbiAqXG4gKiB9XG4gKi9cblxuLy8gRXh0cnVkZUdlb21ldHJ5XG5cbmZ1bmN0aW9uIEV4dHJ1ZGVHZW9tZXRyeSggc2hhcGVzLCBvcHRpb25zICkge1xuXG5cdEdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnRXh0cnVkZUdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0c2hhcGVzOiBzaGFwZXMsXG5cdFx0b3B0aW9uczogb3B0aW9uc1xuXHR9O1xuXG5cdHRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgRXh0cnVkZUJ1ZmZlckdlb21ldHJ5KCBzaGFwZXMsIG9wdGlvbnMgKSApO1xuXHR0aGlzLm1lcmdlVmVydGljZXMoKTtcblxufVxuXG5FeHRydWRlR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7XG5FeHRydWRlR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gRXh0cnVkZUdlb21ldHJ5O1xuXG4vLyBFeHRydWRlQnVmZmVyR2VvbWV0cnlcblxuZnVuY3Rpb24gRXh0cnVkZUJ1ZmZlckdlb21ldHJ5KCBzaGFwZXMsIG9wdGlvbnMgKSB7XG5cblx0QnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdFeHRydWRlQnVmZmVyR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRzaGFwZXM6IHNoYXBlcyxcblx0XHRvcHRpb25zOiBvcHRpb25zXG5cdH07XG5cblx0c2hhcGVzID0gQXJyYXkuaXNBcnJheSggc2hhcGVzICkgPyBzaGFwZXMgOiBbIHNoYXBlcyBdO1xuXG5cdHZhciBzY29wZSA9IHRoaXM7XG5cblx0dmFyIHZlcnRpY2VzQXJyYXkgPSBbXTtcblx0dmFyIHV2QXJyYXkgPSBbXTtcblxuXHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBzaGFwZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdHZhciBzaGFwZSA9IHNoYXBlc1sgaSBdO1xuXHRcdGFkZFNoYXBlKCBzaGFwZSwgb3B0aW9ucyApO1xuXG5cdH1cblxuXHQvLyBidWlsZCBnZW9tZXRyeVxuXG5cdHRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXNBcnJheSwgMyApICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZBcnJheSwgMiApICk7XG5cblx0dGhpcy5jb21wdXRlVmVydGV4Tm9ybWFscygpO1xuXG5cdC8vIGZ1bmN0aW9uc1xuXG5cdGZ1bmN0aW9uIGFkZFNoYXBlKCBzaGFwZSApIHtcblxuXHRcdHZhciBwbGFjZWhvbGRlciA9IFtdO1xuXG5cdFx0Ly8gb3B0aW9uc1xuXG5cdFx0dmFyIGN1cnZlU2VnbWVudHMgPSBvcHRpb25zLmN1cnZlU2VnbWVudHMgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuY3VydmVTZWdtZW50cyA6IDEyO1xuXHRcdHZhciBzdGVwcyA9IG9wdGlvbnMuc3RlcHMgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuc3RlcHMgOiAxO1xuXHRcdHZhciBhbW91bnQgPSBvcHRpb25zLmFtb3VudCAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5hbW91bnQgOiAxMDA7XG5cblx0XHR2YXIgYmV2ZWxFbmFibGVkID0gb3B0aW9ucy5iZXZlbEVuYWJsZWQgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuYmV2ZWxFbmFibGVkIDogdHJ1ZTtcblx0XHR2YXIgYmV2ZWxUaGlja25lc3MgPSBvcHRpb25zLmJldmVsVGhpY2tuZXNzICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmJldmVsVGhpY2tuZXNzIDogNjtcblx0XHR2YXIgYmV2ZWxTaXplID0gb3B0aW9ucy5iZXZlbFNpemUgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuYmV2ZWxTaXplIDogYmV2ZWxUaGlja25lc3MgLSAyO1xuXHRcdHZhciBiZXZlbFNlZ21lbnRzID0gb3B0aW9ucy5iZXZlbFNlZ21lbnRzICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmJldmVsU2VnbWVudHMgOiAzO1xuXG5cdFx0dmFyIGV4dHJ1ZGVQYXRoID0gb3B0aW9ucy5leHRydWRlUGF0aDtcblxuXHRcdHZhciB1dmdlbiA9IG9wdGlvbnMuVVZHZW5lcmF0b3IgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuVVZHZW5lcmF0b3IgOiBXb3JsZFVWR2VuZXJhdG9yO1xuXG5cdFx0Ly9cblxuXHRcdHZhciBleHRydWRlUHRzLCBleHRydWRlQnlQYXRoID0gZmFsc2U7XG5cdFx0dmFyIHNwbGluZVR1YmUsIGJpbm9ybWFsLCBub3JtYWwsIHBvc2l0aW9uMjtcblxuXHRcdGlmICggZXh0cnVkZVBhdGggKSB7XG5cblx0XHRcdGV4dHJ1ZGVQdHMgPSBleHRydWRlUGF0aC5nZXRTcGFjZWRQb2ludHMoIHN0ZXBzICk7XG5cblx0XHRcdGV4dHJ1ZGVCeVBhdGggPSB0cnVlO1xuXHRcdFx0YmV2ZWxFbmFibGVkID0gZmFsc2U7IC8vIGJldmVscyBub3Qgc3VwcG9ydGVkIGZvciBwYXRoIGV4dHJ1c2lvblxuXG5cdFx0XHQvLyBTRVRVUCBUTkIgdmFyaWFibGVzXG5cblx0XHRcdC8vIFRPRE8xIC0gaGF2ZSBhIC5pc0Nsb3NlZCBpbiBzcGxpbmU/XG5cblx0XHRcdHNwbGluZVR1YmUgPSBleHRydWRlUGF0aC5jb21wdXRlRnJlbmV0RnJhbWVzKCBzdGVwcywgZmFsc2UgKTtcblxuXHRcdFx0Ly8gY29uc29sZS5sb2coc3BsaW5lVHViZSwgJ3NwbGluZVR1YmUnLCBzcGxpbmVUdWJlLm5vcm1hbHMubGVuZ3RoLCAnc3RlcHMnLCBzdGVwcywgJ2V4dHJ1ZGVQdHMnLCBleHRydWRlUHRzLmxlbmd0aCk7XG5cblx0XHRcdGJpbm9ybWFsID0gbmV3IFZlY3RvcjMoKTtcblx0XHRcdG5vcm1hbCA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0XHRwb3NpdGlvbjIgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0fVxuXG5cdFx0Ly8gU2FmZWd1YXJkcyBpZiBiZXZlbHMgYXJlIG5vdCBlbmFibGVkXG5cblx0XHRpZiAoICEgYmV2ZWxFbmFibGVkICkge1xuXG5cdFx0XHRiZXZlbFNlZ21lbnRzID0gMDtcblx0XHRcdGJldmVsVGhpY2tuZXNzID0gMDtcblx0XHRcdGJldmVsU2l6ZSA9IDA7XG5cblx0XHR9XG5cblx0XHQvLyBWYXJpYWJsZXMgaW5pdGlhbGl6YXRpb25cblxuXHRcdHZhciBhaG9sZSwgaCwgaGw7IC8vIGxvb3Bpbmcgb2YgaG9sZXNcblxuXHRcdHZhciBzaGFwZVBvaW50cyA9IHNoYXBlLmV4dHJhY3RQb2ludHMoIGN1cnZlU2VnbWVudHMgKTtcblxuXHRcdHZhciB2ZXJ0aWNlcyA9IHNoYXBlUG9pbnRzLnNoYXBlO1xuXHRcdHZhciBob2xlcyA9IHNoYXBlUG9pbnRzLmhvbGVzO1xuXG5cdFx0dmFyIHJldmVyc2UgPSAhIFNoYXBlVXRpbHMuaXNDbG9ja1dpc2UoIHZlcnRpY2VzICk7XG5cblx0XHRpZiAoIHJldmVyc2UgKSB7XG5cblx0XHRcdHZlcnRpY2VzID0gdmVydGljZXMucmV2ZXJzZSgpO1xuXG5cdFx0XHQvLyBNYXliZSB3ZSBzaG91bGQgYWxzbyBjaGVjayBpZiBob2xlcyBhcmUgaW4gdGhlIG9wcG9zaXRlIGRpcmVjdGlvbiwganVzdCB0byBiZSBzYWZlIC4uLlxuXG5cdFx0XHRmb3IgKCBoID0gMCwgaGwgPSBob2xlcy5sZW5ndGg7IGggPCBobDsgaCArKyApIHtcblxuXHRcdFx0XHRhaG9sZSA9IGhvbGVzWyBoIF07XG5cblx0XHRcdFx0aWYgKCBTaGFwZVV0aWxzLmlzQ2xvY2tXaXNlKCBhaG9sZSApICkge1xuXG5cdFx0XHRcdFx0aG9sZXNbIGggXSA9IGFob2xlLnJldmVyc2UoKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXG5cdFx0dmFyIGZhY2VzID0gU2hhcGVVdGlscy50cmlhbmd1bGF0ZVNoYXBlKCB2ZXJ0aWNlcywgaG9sZXMgKTtcblxuXHRcdC8qIFZlcnRpY2VzICovXG5cblx0XHR2YXIgY29udG91ciA9IHZlcnRpY2VzOyAvLyB2ZXJ0aWNlcyBoYXMgYWxsIHBvaW50cyBidXQgY29udG91ciBoYXMgb25seSBwb2ludHMgb2YgY2lyY3VtZmVyZW5jZVxuXG5cdFx0Zm9yICggaCA9IDAsIGhsID0gaG9sZXMubGVuZ3RoOyBoIDwgaGw7IGggKysgKSB7XG5cblx0XHRcdGFob2xlID0gaG9sZXNbIGggXTtcblxuXHRcdFx0dmVydGljZXMgPSB2ZXJ0aWNlcy5jb25jYXQoIGFob2xlICk7XG5cblx0XHR9XG5cblxuXHRcdGZ1bmN0aW9uIHNjYWxlUHQyKCBwdCwgdmVjLCBzaXplICkge1xuXG5cdFx0XHRpZiAoICEgdmVjICkgY29uc29sZS5lcnJvciggXCJUSFJFRS5FeHRydWRlR2VvbWV0cnk6IHZlYyBkb2VzIG5vdCBleGlzdFwiICk7XG5cblx0XHRcdHJldHVybiB2ZWMuY2xvbmUoKS5tdWx0aXBseVNjYWxhciggc2l6ZSApLmFkZCggcHQgKTtcblxuXHRcdH1cblxuXHRcdHZhciBiLCBicywgdCwgeixcblx0XHRcdHZlcnQsIHZsZW4gPSB2ZXJ0aWNlcy5sZW5ndGgsXG5cdFx0XHRmYWNlLCBmbGVuID0gZmFjZXMubGVuZ3RoO1xuXG5cblx0XHQvLyBGaW5kIGRpcmVjdGlvbnMgZm9yIHBvaW50IG1vdmVtZW50XG5cblxuXHRcdGZ1bmN0aW9uIGdldEJldmVsVmVjKCBpblB0LCBpblByZXYsIGluTmV4dCApIHtcblxuXHRcdFx0Ly8gY29tcHV0ZXMgZm9yIGluUHQgdGhlIGNvcnJlc3BvbmRpbmcgcG9pbnQgaW5QdCcgb24gYSBuZXcgY29udG91clxuXHRcdFx0Ly8gICBzaGlmdGVkIGJ5IDEgdW5pdCAobGVuZ3RoIG9mIG5vcm1hbGl6ZWQgdmVjdG9yKSB0byB0aGUgbGVmdFxuXHRcdFx0Ly8gaWYgd2Ugd2FsayBhbG9uZyBjb250b3VyIGNsb2Nrd2lzZSwgdGhpcyBuZXcgY29udG91ciBpcyBvdXRzaWRlIHRoZSBvbGQgb25lXG5cdFx0XHQvL1xuXHRcdFx0Ly8gaW5QdCcgaXMgdGhlIGludGVyc2VjdGlvbiBvZiB0aGUgdHdvIGxpbmVzIHBhcmFsbGVsIHRvIHRoZSB0d29cblx0XHRcdC8vICBhZGphY2VudCBlZGdlcyBvZiBpblB0IGF0IGEgZGlzdGFuY2Ugb2YgMSB1bml0IG9uIHRoZSBsZWZ0IHNpZGUuXG5cblx0XHRcdHZhciB2X3RyYW5zX3gsIHZfdHJhbnNfeSwgc2hyaW5rX2J5OyAvLyByZXN1bHRpbmcgdHJhbnNsYXRpb24gdmVjdG9yIGZvciBpblB0XG5cblx0XHRcdC8vIGdvb2QgcmVhZGluZyBmb3IgZ2VvbWV0cnkgYWxnb3JpdGhtcyAoaGVyZTogbGluZS1saW5lIGludGVyc2VjdGlvbilcblx0XHRcdC8vIGh0dHA6Ly9nZW9tYWxnb3JpdGhtcy5jb20vYTA1LV9pbnRlcnNlY3QtMS5odG1sXG5cblx0XHRcdHZhciB2X3ByZXZfeCA9IGluUHQueCAtIGluUHJldi54LFxuXHRcdFx0XHR2X3ByZXZfeSA9IGluUHQueSAtIGluUHJldi55O1xuXHRcdFx0dmFyIHZfbmV4dF94ID0gaW5OZXh0LnggLSBpblB0LngsXG5cdFx0XHRcdHZfbmV4dF95ID0gaW5OZXh0LnkgLSBpblB0Lnk7XG5cblx0XHRcdHZhciB2X3ByZXZfbGVuc3EgPSAoIHZfcHJldl94ICogdl9wcmV2X3ggKyB2X3ByZXZfeSAqIHZfcHJldl95ICk7XG5cblx0XHRcdC8vIGNoZWNrIGZvciBjb2xsaW5lYXIgZWRnZXNcblx0XHRcdHZhciBjb2xsaW5lYXIwID0gKCB2X3ByZXZfeCAqIHZfbmV4dF95IC0gdl9wcmV2X3kgKiB2X25leHRfeCApO1xuXG5cdFx0XHRpZiAoIE1hdGguYWJzKCBjb2xsaW5lYXIwICkgPiBOdW1iZXIuRVBTSUxPTiApIHtcblxuXHRcdFx0XHQvLyBub3QgY29sbGluZWFyXG5cblx0XHRcdFx0Ly8gbGVuZ3RoIG9mIHZlY3RvcnMgZm9yIG5vcm1hbGl6aW5nXG5cblx0XHRcdFx0dmFyIHZfcHJldl9sZW4gPSBNYXRoLnNxcnQoIHZfcHJldl9sZW5zcSApO1xuXHRcdFx0XHR2YXIgdl9uZXh0X2xlbiA9IE1hdGguc3FydCggdl9uZXh0X3ggKiB2X25leHRfeCArIHZfbmV4dF95ICogdl9uZXh0X3kgKTtcblxuXHRcdFx0XHQvLyBzaGlmdCBhZGphY2VudCBwb2ludHMgYnkgdW5pdCB2ZWN0b3JzIHRvIHRoZSBsZWZ0XG5cblx0XHRcdFx0dmFyIHB0UHJldlNoaWZ0X3ggPSAoIGluUHJldi54IC0gdl9wcmV2X3kgLyB2X3ByZXZfbGVuICk7XG5cdFx0XHRcdHZhciBwdFByZXZTaGlmdF95ID0gKCBpblByZXYueSArIHZfcHJldl94IC8gdl9wcmV2X2xlbiApO1xuXG5cdFx0XHRcdHZhciBwdE5leHRTaGlmdF94ID0gKCBpbk5leHQueCAtIHZfbmV4dF95IC8gdl9uZXh0X2xlbiApO1xuXHRcdFx0XHR2YXIgcHROZXh0U2hpZnRfeSA9ICggaW5OZXh0LnkgKyB2X25leHRfeCAvIHZfbmV4dF9sZW4gKTtcblxuXHRcdFx0XHQvLyBzY2FsaW5nIGZhY3RvciBmb3Igdl9wcmV2IHRvIGludGVyc2VjdGlvbiBwb2ludFxuXG5cdFx0XHRcdHZhciBzZiA9ICggKCBwdE5leHRTaGlmdF94IC0gcHRQcmV2U2hpZnRfeCApICogdl9uZXh0X3kgLVxuXHRcdFx0XHRcdFx0KCBwdE5leHRTaGlmdF95IC0gcHRQcmV2U2hpZnRfeSApICogdl9uZXh0X3ggKSAvXG5cdFx0XHRcdFx0KCB2X3ByZXZfeCAqIHZfbmV4dF95IC0gdl9wcmV2X3kgKiB2X25leHRfeCApO1xuXG5cdFx0XHRcdC8vIHZlY3RvciBmcm9tIGluUHQgdG8gaW50ZXJzZWN0aW9uIHBvaW50XG5cblx0XHRcdFx0dl90cmFuc194ID0gKCBwdFByZXZTaGlmdF94ICsgdl9wcmV2X3ggKiBzZiAtIGluUHQueCApO1xuXHRcdFx0XHR2X3RyYW5zX3kgPSAoIHB0UHJldlNoaWZ0X3kgKyB2X3ByZXZfeSAqIHNmIC0gaW5QdC55ICk7XG5cblx0XHRcdFx0Ly8gRG9uJ3Qgbm9ybWFsaXplISwgb3RoZXJ3aXNlIHNoYXJwIGNvcm5lcnMgYmVjb21lIHVnbHlcblx0XHRcdFx0Ly8gIGJ1dCBwcmV2ZW50IGNyYXp5IHNwaWtlc1xuXHRcdFx0XHR2YXIgdl90cmFuc19sZW5zcSA9ICggdl90cmFuc194ICogdl90cmFuc194ICsgdl90cmFuc195ICogdl90cmFuc195ICk7XG5cdFx0XHRcdGlmICggdl90cmFuc19sZW5zcSA8PSAyICkge1xuXG5cdFx0XHRcdFx0cmV0dXJuIG5ldyBWZWN0b3IyKCB2X3RyYW5zX3gsIHZfdHJhbnNfeSApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRzaHJpbmtfYnkgPSBNYXRoLnNxcnQoIHZfdHJhbnNfbGVuc3EgLyAyICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdC8vIGhhbmRsZSBzcGVjaWFsIGNhc2Ugb2YgY29sbGluZWFyIGVkZ2VzXG5cblx0XHRcdFx0dmFyIGRpcmVjdGlvbl9lcSA9IGZhbHNlOyAvLyBhc3N1bWVzOiBvcHBvc2l0ZVxuXHRcdFx0XHRpZiAoIHZfcHJldl94ID4gTnVtYmVyLkVQU0lMT04gKSB7XG5cblx0XHRcdFx0XHRpZiAoIHZfbmV4dF94ID4gTnVtYmVyLkVQU0lMT04gKSB7XG5cblx0XHRcdFx0XHRcdGRpcmVjdGlvbl9lcSA9IHRydWU7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGlmICggdl9wcmV2X3ggPCAtIE51bWJlci5FUFNJTE9OICkge1xuXG5cdFx0XHRcdFx0XHRpZiAoIHZfbmV4dF94IDwgLSBOdW1iZXIuRVBTSUxPTiApIHtcblxuXHRcdFx0XHRcdFx0XHRkaXJlY3Rpb25fZXEgPSB0cnVlO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRpZiAoIE1hdGguc2lnbiggdl9wcmV2X3kgKSA9PT0gTWF0aC5zaWduKCB2X25leHRfeSApICkge1xuXG5cdFx0XHRcdFx0XHRcdGRpcmVjdGlvbl9lcSA9IHRydWU7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCBkaXJlY3Rpb25fZXEgKSB7XG5cblx0XHRcdFx0XHQvLyBjb25zb2xlLmxvZyhcIldhcm5pbmc6IGxpbmVzIGFyZSBhIHN0cmFpZ2h0IHNlcXVlbmNlXCIpO1xuXHRcdFx0XHRcdHZfdHJhbnNfeCA9IC0gdl9wcmV2X3k7XG5cdFx0XHRcdFx0dl90cmFuc195ID0gdl9wcmV2X3g7XG5cdFx0XHRcdFx0c2hyaW5rX2J5ID0gTWF0aC5zcXJ0KCB2X3ByZXZfbGVuc3EgKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0Ly8gY29uc29sZS5sb2coXCJXYXJuaW5nOiBsaW5lcyBhcmUgYSBzdHJhaWdodCBzcGlrZVwiKTtcblx0XHRcdFx0XHR2X3RyYW5zX3ggPSB2X3ByZXZfeDtcblx0XHRcdFx0XHR2X3RyYW5zX3kgPSB2X3ByZXZfeTtcblx0XHRcdFx0XHRzaHJpbmtfYnkgPSBNYXRoLnNxcnQoIHZfcHJldl9sZW5zcSAvIDIgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIG5ldyBWZWN0b3IyKCB2X3RyYW5zX3ggLyBzaHJpbmtfYnksIHZfdHJhbnNfeSAvIHNocmlua19ieSApO1xuXG5cdFx0fVxuXG5cblx0XHR2YXIgY29udG91ck1vdmVtZW50cyA9IFtdO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IGNvbnRvdXIubGVuZ3RoLCBqID0gaWwgLSAxLCBrID0gaSArIDE7IGkgPCBpbDsgaSArKywgaiArKywgayArKyApIHtcblxuXHRcdFx0aWYgKCBqID09PSBpbCApIGogPSAwO1xuXHRcdFx0aWYgKCBrID09PSBpbCApIGsgPSAwO1xuXG5cdFx0XHQvLyAgKGopLS0tKGkpLS0tKGspXG5cdFx0XHQvLyBjb25zb2xlLmxvZygnaSxqLGsnLCBpLCBqICwgaylcblxuXHRcdFx0Y29udG91ck1vdmVtZW50c1sgaSBdID0gZ2V0QmV2ZWxWZWMoIGNvbnRvdXJbIGkgXSwgY29udG91clsgaiBdLCBjb250b3VyWyBrIF0gKTtcblxuXHRcdH1cblxuXHRcdHZhciBob2xlc01vdmVtZW50cyA9IFtdLFxuXHRcdFx0b25lSG9sZU1vdmVtZW50cywgdmVydGljZXNNb3ZlbWVudHMgPSBjb250b3VyTW92ZW1lbnRzLmNvbmNhdCgpO1xuXG5cdFx0Zm9yICggaCA9IDAsIGhsID0gaG9sZXMubGVuZ3RoOyBoIDwgaGw7IGggKysgKSB7XG5cblx0XHRcdGFob2xlID0gaG9sZXNbIGggXTtcblxuXHRcdFx0b25lSG9sZU1vdmVtZW50cyA9IFtdO1xuXG5cdFx0XHRmb3IgKCBpID0gMCwgaWwgPSBhaG9sZS5sZW5ndGgsIGogPSBpbCAtIDEsIGsgPSBpICsgMTsgaSA8IGlsOyBpICsrLCBqICsrLCBrICsrICkge1xuXG5cdFx0XHRcdGlmICggaiA9PT0gaWwgKSBqID0gMDtcblx0XHRcdFx0aWYgKCBrID09PSBpbCApIGsgPSAwO1xuXG5cdFx0XHRcdC8vICAoaiktLS0oaSktLS0oaylcblx0XHRcdFx0b25lSG9sZU1vdmVtZW50c1sgaSBdID0gZ2V0QmV2ZWxWZWMoIGFob2xlWyBpIF0sIGFob2xlWyBqIF0sIGFob2xlWyBrIF0gKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRob2xlc01vdmVtZW50cy5wdXNoKCBvbmVIb2xlTW92ZW1lbnRzICk7XG5cdFx0XHR2ZXJ0aWNlc01vdmVtZW50cyA9IHZlcnRpY2VzTW92ZW1lbnRzLmNvbmNhdCggb25lSG9sZU1vdmVtZW50cyApO1xuXG5cdFx0fVxuXG5cblx0XHQvLyBMb29wIGJldmVsU2VnbWVudHMsIDEgZm9yIHRoZSBmcm9udCwgMSBmb3IgdGhlIGJhY2tcblxuXHRcdGZvciAoIGIgPSAwOyBiIDwgYmV2ZWxTZWdtZW50czsgYiArKyApIHtcblxuXHRcdFx0Ly9mb3IgKCBiID0gYmV2ZWxTZWdtZW50czsgYiA+IDA7IGIgLS0gKSB7XG5cblx0XHRcdHQgPSBiIC8gYmV2ZWxTZWdtZW50cztcblx0XHRcdHogPSBiZXZlbFRoaWNrbmVzcyAqIE1hdGguY29zKCB0ICogTWF0aC5QSSAvIDIgKTtcblx0XHRcdGJzID0gYmV2ZWxTaXplICogTWF0aC5zaW4oIHQgKiBNYXRoLlBJIC8gMiApO1xuXG5cdFx0XHQvLyBjb250cmFjdCBzaGFwZVxuXG5cdFx0XHRmb3IgKCBpID0gMCwgaWwgPSBjb250b3VyLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdHZlcnQgPSBzY2FsZVB0MiggY29udG91clsgaSBdLCBjb250b3VyTW92ZW1lbnRzWyBpIF0sIGJzICk7XG5cblx0XHRcdFx0diggdmVydC54LCB2ZXJ0LnksIC0geiApO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIGV4cGFuZCBob2xlc1xuXG5cdFx0XHRmb3IgKCBoID0gMCwgaGwgPSBob2xlcy5sZW5ndGg7IGggPCBobDsgaCArKyApIHtcblxuXHRcdFx0XHRhaG9sZSA9IGhvbGVzWyBoIF07XG5cdFx0XHRcdG9uZUhvbGVNb3ZlbWVudHMgPSBob2xlc01vdmVtZW50c1sgaCBdO1xuXG5cdFx0XHRcdGZvciAoIGkgPSAwLCBpbCA9IGFob2xlLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0dmVydCA9IHNjYWxlUHQyKCBhaG9sZVsgaSBdLCBvbmVIb2xlTW92ZW1lbnRzWyBpIF0sIGJzICk7XG5cblx0XHRcdFx0XHR2KCB2ZXJ0LngsIHZlcnQueSwgLSB6ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRicyA9IGJldmVsU2l6ZTtcblxuXHRcdC8vIEJhY2sgZmFjaW5nIHZlcnRpY2VzXG5cblx0XHRmb3IgKCBpID0gMDsgaSA8IHZsZW47IGkgKysgKSB7XG5cblx0XHRcdHZlcnQgPSBiZXZlbEVuYWJsZWQgPyBzY2FsZVB0MiggdmVydGljZXNbIGkgXSwgdmVydGljZXNNb3ZlbWVudHNbIGkgXSwgYnMgKSA6IHZlcnRpY2VzWyBpIF07XG5cblx0XHRcdGlmICggISBleHRydWRlQnlQYXRoICkge1xuXG5cdFx0XHRcdHYoIHZlcnQueCwgdmVydC55LCAwICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Ly8gdiggdmVydC54LCB2ZXJ0LnkgKyBleHRydWRlUHRzWyAwIF0ueSwgZXh0cnVkZVB0c1sgMCBdLnggKTtcblxuXHRcdFx0XHRub3JtYWwuY29weSggc3BsaW5lVHViZS5ub3JtYWxzWyAwIF0gKS5tdWx0aXBseVNjYWxhciggdmVydC54ICk7XG5cdFx0XHRcdGJpbm9ybWFsLmNvcHkoIHNwbGluZVR1YmUuYmlub3JtYWxzWyAwIF0gKS5tdWx0aXBseVNjYWxhciggdmVydC55ICk7XG5cblx0XHRcdFx0cG9zaXRpb24yLmNvcHkoIGV4dHJ1ZGVQdHNbIDAgXSApLmFkZCggbm9ybWFsICkuYWRkKCBiaW5vcm1hbCApO1xuXG5cdFx0XHRcdHYoIHBvc2l0aW9uMi54LCBwb3NpdGlvbjIueSwgcG9zaXRpb24yLnogKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gQWRkIHN0ZXBwZWQgdmVydGljZXMuLi5cblx0XHQvLyBJbmNsdWRpbmcgZnJvbnQgZmFjaW5nIHZlcnRpY2VzXG5cblx0XHR2YXIgcztcblxuXHRcdGZvciAoIHMgPSAxOyBzIDw9IHN0ZXBzOyBzICsrICkge1xuXG5cdFx0XHRmb3IgKCBpID0gMDsgaSA8IHZsZW47IGkgKysgKSB7XG5cblx0XHRcdFx0dmVydCA9IGJldmVsRW5hYmxlZCA/IHNjYWxlUHQyKCB2ZXJ0aWNlc1sgaSBdLCB2ZXJ0aWNlc01vdmVtZW50c1sgaSBdLCBicyApIDogdmVydGljZXNbIGkgXTtcblxuXHRcdFx0XHRpZiAoICEgZXh0cnVkZUJ5UGF0aCApIHtcblxuXHRcdFx0XHRcdHYoIHZlcnQueCwgdmVydC55LCBhbW91bnQgLyBzdGVwcyAqIHMgKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0Ly8gdiggdmVydC54LCB2ZXJ0LnkgKyBleHRydWRlUHRzWyBzIC0gMSBdLnksIGV4dHJ1ZGVQdHNbIHMgLSAxIF0ueCApO1xuXG5cdFx0XHRcdFx0bm9ybWFsLmNvcHkoIHNwbGluZVR1YmUubm9ybWFsc1sgcyBdICkubXVsdGlwbHlTY2FsYXIoIHZlcnQueCApO1xuXHRcdFx0XHRcdGJpbm9ybWFsLmNvcHkoIHNwbGluZVR1YmUuYmlub3JtYWxzWyBzIF0gKS5tdWx0aXBseVNjYWxhciggdmVydC55ICk7XG5cblx0XHRcdFx0XHRwb3NpdGlvbjIuY29weSggZXh0cnVkZVB0c1sgcyBdICkuYWRkKCBub3JtYWwgKS5hZGQoIGJpbm9ybWFsICk7XG5cblx0XHRcdFx0XHR2KCBwb3NpdGlvbjIueCwgcG9zaXRpb24yLnksIHBvc2l0aW9uMi56ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblxuXHRcdC8vIEFkZCBiZXZlbCBzZWdtZW50cyBwbGFuZXNcblxuXHRcdC8vZm9yICggYiA9IDE7IGIgPD0gYmV2ZWxTZWdtZW50czsgYiArKyApIHtcblx0XHRmb3IgKCBiID0gYmV2ZWxTZWdtZW50cyAtIDE7IGIgPj0gMDsgYiAtLSApIHtcblxuXHRcdFx0dCA9IGIgLyBiZXZlbFNlZ21lbnRzO1xuXHRcdFx0eiA9IGJldmVsVGhpY2tuZXNzICogTWF0aC5jb3MoIHQgKiBNYXRoLlBJIC8gMiApO1xuXHRcdFx0YnMgPSBiZXZlbFNpemUgKiBNYXRoLnNpbiggdCAqIE1hdGguUEkgLyAyICk7XG5cblx0XHRcdC8vIGNvbnRyYWN0IHNoYXBlXG5cblx0XHRcdGZvciAoIGkgPSAwLCBpbCA9IGNvbnRvdXIubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdFx0dmVydCA9IHNjYWxlUHQyKCBjb250b3VyWyBpIF0sIGNvbnRvdXJNb3ZlbWVudHNbIGkgXSwgYnMgKTtcblx0XHRcdFx0diggdmVydC54LCB2ZXJ0LnksIGFtb3VudCArIHogKTtcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBleHBhbmQgaG9sZXNcblxuXHRcdFx0Zm9yICggaCA9IDAsIGhsID0gaG9sZXMubGVuZ3RoOyBoIDwgaGw7IGggKysgKSB7XG5cblx0XHRcdFx0YWhvbGUgPSBob2xlc1sgaCBdO1xuXHRcdFx0XHRvbmVIb2xlTW92ZW1lbnRzID0gaG9sZXNNb3ZlbWVudHNbIGggXTtcblxuXHRcdFx0XHRmb3IgKCBpID0gMCwgaWwgPSBhaG9sZS5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdHZlcnQgPSBzY2FsZVB0MiggYWhvbGVbIGkgXSwgb25lSG9sZU1vdmVtZW50c1sgaSBdLCBicyApO1xuXG5cdFx0XHRcdFx0aWYgKCAhIGV4dHJ1ZGVCeVBhdGggKSB7XG5cblx0XHRcdFx0XHRcdHYoIHZlcnQueCwgdmVydC55LCBhbW91bnQgKyB6ICk7XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHR2KCB2ZXJ0LngsIHZlcnQueSArIGV4dHJ1ZGVQdHNbIHN0ZXBzIC0gMSBdLnksIGV4dHJ1ZGVQdHNbIHN0ZXBzIC0gMSBdLnggKyB6ICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvKiBGYWNlcyAqL1xuXG5cdFx0Ly8gVG9wIGFuZCBib3R0b20gZmFjZXNcblxuXHRcdGJ1aWxkTGlkRmFjZXMoKTtcblxuXHRcdC8vIFNpZGVzIGZhY2VzXG5cblx0XHRidWlsZFNpZGVGYWNlcygpO1xuXG5cblx0XHQvLy8vLyAgSW50ZXJuYWwgZnVuY3Rpb25zXG5cblx0XHRmdW5jdGlvbiBidWlsZExpZEZhY2VzKCkge1xuXG5cdFx0XHR2YXIgc3RhcnQgPSB2ZXJ0aWNlc0FycmF5Lmxlbmd0aCAvIDM7XG5cblx0XHRcdGlmICggYmV2ZWxFbmFibGVkICkge1xuXG5cdFx0XHRcdHZhciBsYXllciA9IDA7IC8vIHN0ZXBzICsgMVxuXHRcdFx0XHR2YXIgb2Zmc2V0ID0gdmxlbiAqIGxheWVyO1xuXG5cdFx0XHRcdC8vIEJvdHRvbSBmYWNlc1xuXG5cdFx0XHRcdGZvciAoIGkgPSAwOyBpIDwgZmxlbjsgaSArKyApIHtcblxuXHRcdFx0XHRcdGZhY2UgPSBmYWNlc1sgaSBdO1xuXHRcdFx0XHRcdGYzKCBmYWNlWyAyIF0gKyBvZmZzZXQsIGZhY2VbIDEgXSArIG9mZnNldCwgZmFjZVsgMCBdICsgb2Zmc2V0ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGxheWVyID0gc3RlcHMgKyBiZXZlbFNlZ21lbnRzICogMjtcblx0XHRcdFx0b2Zmc2V0ID0gdmxlbiAqIGxheWVyO1xuXG5cdFx0XHRcdC8vIFRvcCBmYWNlc1xuXG5cdFx0XHRcdGZvciAoIGkgPSAwOyBpIDwgZmxlbjsgaSArKyApIHtcblxuXHRcdFx0XHRcdGZhY2UgPSBmYWNlc1sgaSBdO1xuXHRcdFx0XHRcdGYzKCBmYWNlWyAwIF0gKyBvZmZzZXQsIGZhY2VbIDEgXSArIG9mZnNldCwgZmFjZVsgMiBdICsgb2Zmc2V0ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdC8vIEJvdHRvbSBmYWNlc1xuXG5cdFx0XHRcdGZvciAoIGkgPSAwOyBpIDwgZmxlbjsgaSArKyApIHtcblxuXHRcdFx0XHRcdGZhY2UgPSBmYWNlc1sgaSBdO1xuXHRcdFx0XHRcdGYzKCBmYWNlWyAyIF0sIGZhY2VbIDEgXSwgZmFjZVsgMCBdICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFRvcCBmYWNlc1xuXG5cdFx0XHRcdGZvciAoIGkgPSAwOyBpIDwgZmxlbjsgaSArKyApIHtcblxuXHRcdFx0XHRcdGZhY2UgPSBmYWNlc1sgaSBdO1xuXHRcdFx0XHRcdGYzKCBmYWNlWyAwIF0gKyB2bGVuICogc3RlcHMsIGZhY2VbIDEgXSArIHZsZW4gKiBzdGVwcywgZmFjZVsgMiBdICsgdmxlbiAqIHN0ZXBzICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdHNjb3BlLmFkZEdyb3VwKCBzdGFydCwgdmVydGljZXNBcnJheS5sZW5ndGggLyAzIC0gc3RhcnQsIDAgKTtcblxuXHRcdH1cblxuXHRcdC8vIENyZWF0ZSBmYWNlcyBmb3IgdGhlIHotc2lkZXMgb2YgdGhlIHNoYXBlXG5cblx0XHRmdW5jdGlvbiBidWlsZFNpZGVGYWNlcygpIHtcblxuXHRcdFx0dmFyIHN0YXJ0ID0gdmVydGljZXNBcnJheS5sZW5ndGggLyAzO1xuXHRcdFx0dmFyIGxheWVyb2Zmc2V0ID0gMDtcblx0XHRcdHNpZGV3YWxscyggY29udG91ciwgbGF5ZXJvZmZzZXQgKTtcblx0XHRcdGxheWVyb2Zmc2V0ICs9IGNvbnRvdXIubGVuZ3RoO1xuXG5cdFx0XHRmb3IgKCBoID0gMCwgaGwgPSBob2xlcy5sZW5ndGg7IGggPCBobDsgaCArKyApIHtcblxuXHRcdFx0XHRhaG9sZSA9IGhvbGVzWyBoIF07XG5cdFx0XHRcdHNpZGV3YWxscyggYWhvbGUsIGxheWVyb2Zmc2V0ICk7XG5cblx0XHRcdFx0Ly8sIHRydWVcblx0XHRcdFx0bGF5ZXJvZmZzZXQgKz0gYWhvbGUubGVuZ3RoO1xuXG5cdFx0XHR9XG5cblxuXHRcdFx0c2NvcGUuYWRkR3JvdXAoIHN0YXJ0LCB2ZXJ0aWNlc0FycmF5Lmxlbmd0aCAvIDMgLSBzdGFydCwgMSApO1xuXG5cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBzaWRld2FsbHMoIGNvbnRvdXIsIGxheWVyb2Zmc2V0ICkge1xuXG5cdFx0XHR2YXIgaiwgaztcblx0XHRcdGkgPSBjb250b3VyLmxlbmd0aDtcblxuXHRcdFx0d2hpbGUgKCAtLSBpID49IDAgKSB7XG5cblx0XHRcdFx0aiA9IGk7XG5cdFx0XHRcdGsgPSBpIC0gMTtcblx0XHRcdFx0aWYgKCBrIDwgMCApIGsgPSBjb250b3VyLmxlbmd0aCAtIDE7XG5cblx0XHRcdFx0Ly9jb25zb2xlLmxvZygnYicsIGksaiwgaS0xLCBrLHZlcnRpY2VzLmxlbmd0aCk7XG5cblx0XHRcdFx0dmFyIHMgPSAwLFxuXHRcdFx0XHRcdHNsID0gc3RlcHMgKyBiZXZlbFNlZ21lbnRzICogMjtcblxuXHRcdFx0XHRmb3IgKCBzID0gMDsgcyA8IHNsOyBzICsrICkge1xuXG5cdFx0XHRcdFx0dmFyIHNsZW4xID0gdmxlbiAqIHM7XG5cdFx0XHRcdFx0dmFyIHNsZW4yID0gdmxlbiAqICggcyArIDEgKTtcblxuXHRcdFx0XHRcdHZhciBhID0gbGF5ZXJvZmZzZXQgKyBqICsgc2xlbjEsXG5cdFx0XHRcdFx0XHRiID0gbGF5ZXJvZmZzZXQgKyBrICsgc2xlbjEsXG5cdFx0XHRcdFx0XHRjID0gbGF5ZXJvZmZzZXQgKyBrICsgc2xlbjIsXG5cdFx0XHRcdFx0XHRkID0gbGF5ZXJvZmZzZXQgKyBqICsgc2xlbjI7XG5cblx0XHRcdFx0XHRmNCggYSwgYiwgYywgZCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gdiggeCwgeSwgeiApIHtcblxuXHRcdFx0cGxhY2Vob2xkZXIucHVzaCggeCApO1xuXHRcdFx0cGxhY2Vob2xkZXIucHVzaCggeSApO1xuXHRcdFx0cGxhY2Vob2xkZXIucHVzaCggeiApO1xuXG5cdFx0fVxuXG5cblx0XHRmdW5jdGlvbiBmMyggYSwgYiwgYyApIHtcblxuXHRcdFx0YWRkVmVydGV4KCBhICk7XG5cdFx0XHRhZGRWZXJ0ZXgoIGIgKTtcblx0XHRcdGFkZFZlcnRleCggYyApO1xuXG5cdFx0XHR2YXIgbmV4dEluZGV4ID0gdmVydGljZXNBcnJheS5sZW5ndGggLyAzO1xuXHRcdFx0dmFyIHV2cyA9IHV2Z2VuLmdlbmVyYXRlVG9wVVYoIHNjb3BlLCB2ZXJ0aWNlc0FycmF5LCBuZXh0SW5kZXggLSAzLCBuZXh0SW5kZXggLSAyLCBuZXh0SW5kZXggLSAxICk7XG5cblx0XHRcdGFkZFVWKCB1dnNbIDAgXSApO1xuXHRcdFx0YWRkVVYoIHV2c1sgMSBdICk7XG5cdFx0XHRhZGRVViggdXZzWyAyIF0gKTtcblxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIGY0KCBhLCBiLCBjLCBkICkge1xuXG5cdFx0XHRhZGRWZXJ0ZXgoIGEgKTtcblx0XHRcdGFkZFZlcnRleCggYiApO1xuXHRcdFx0YWRkVmVydGV4KCBkICk7XG5cblx0XHRcdGFkZFZlcnRleCggYiApO1xuXHRcdFx0YWRkVmVydGV4KCBjICk7XG5cdFx0XHRhZGRWZXJ0ZXgoIGQgKTtcblxuXG5cdFx0XHR2YXIgbmV4dEluZGV4ID0gdmVydGljZXNBcnJheS5sZW5ndGggLyAzO1xuXHRcdFx0dmFyIHV2cyA9IHV2Z2VuLmdlbmVyYXRlU2lkZVdhbGxVViggc2NvcGUsIHZlcnRpY2VzQXJyYXksIG5leHRJbmRleCAtIDYsIG5leHRJbmRleCAtIDMsIG5leHRJbmRleCAtIDIsIG5leHRJbmRleCAtIDEgKTtcblxuXHRcdFx0YWRkVVYoIHV2c1sgMCBdICk7XG5cdFx0XHRhZGRVViggdXZzWyAxIF0gKTtcblx0XHRcdGFkZFVWKCB1dnNbIDMgXSApO1xuXG5cdFx0XHRhZGRVViggdXZzWyAxIF0gKTtcblx0XHRcdGFkZFVWKCB1dnNbIDIgXSApO1xuXHRcdFx0YWRkVVYoIHV2c1sgMyBdICk7XG5cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBhZGRWZXJ0ZXgoIGluZGV4ICkge1xuXG5cdFx0XHR2ZXJ0aWNlc0FycmF5LnB1c2goIHBsYWNlaG9sZGVyWyBpbmRleCAqIDMgKyAwIF0gKTtcblx0XHRcdHZlcnRpY2VzQXJyYXkucHVzaCggcGxhY2Vob2xkZXJbIGluZGV4ICogMyArIDEgXSApO1xuXHRcdFx0dmVydGljZXNBcnJheS5wdXNoKCBwbGFjZWhvbGRlclsgaW5kZXggKiAzICsgMiBdICk7XG5cblx0XHR9XG5cblxuXHRcdGZ1bmN0aW9uIGFkZFVWKCB2ZWN0b3IyICkge1xuXG5cdFx0XHR1dkFycmF5LnB1c2goIHZlY3RvcjIueCApO1xuXHRcdFx0dXZBcnJheS5wdXNoKCB2ZWN0b3IyLnkgKTtcblxuXHRcdH1cblxuXHR9XG5cbn1cblxuRXh0cnVkZUJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApO1xuRXh0cnVkZUJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEV4dHJ1ZGVCdWZmZXJHZW9tZXRyeTtcblxudmFyIFdvcmxkVVZHZW5lcmF0b3IgPSB7XG5cblx0Z2VuZXJhdGVUb3BVVjogZnVuY3Rpb24gKCBnZW9tZXRyeSwgdmVydGljZXMsIGluZGV4QSwgaW5kZXhCLCBpbmRleEMgKSB7XG5cblx0XHR2YXIgYV94ID0gdmVydGljZXNbIGluZGV4QSAqIDMgXTtcblx0XHR2YXIgYV95ID0gdmVydGljZXNbIGluZGV4QSAqIDMgKyAxIF07XG5cdFx0dmFyIGJfeCA9IHZlcnRpY2VzWyBpbmRleEIgKiAzIF07XG5cdFx0dmFyIGJfeSA9IHZlcnRpY2VzWyBpbmRleEIgKiAzICsgMSBdO1xuXHRcdHZhciBjX3ggPSB2ZXJ0aWNlc1sgaW5kZXhDICogMyBdO1xuXHRcdHZhciBjX3kgPSB2ZXJ0aWNlc1sgaW5kZXhDICogMyArIDEgXTtcblxuXHRcdHJldHVybiBbXG5cdFx0XHRuZXcgVmVjdG9yMiggYV94LCBhX3kgKSxcblx0XHRcdG5ldyBWZWN0b3IyKCBiX3gsIGJfeSApLFxuXHRcdFx0bmV3IFZlY3RvcjIoIGNfeCwgY195IClcblx0XHRdO1xuXG5cdH0sXG5cblx0Z2VuZXJhdGVTaWRlV2FsbFVWOiBmdW5jdGlvbiAoIGdlb21ldHJ5LCB2ZXJ0aWNlcywgaW5kZXhBLCBpbmRleEIsIGluZGV4QywgaW5kZXhEICkge1xuXG5cdFx0dmFyIGFfeCA9IHZlcnRpY2VzWyBpbmRleEEgKiAzIF07XG5cdFx0dmFyIGFfeSA9IHZlcnRpY2VzWyBpbmRleEEgKiAzICsgMSBdO1xuXHRcdHZhciBhX3ogPSB2ZXJ0aWNlc1sgaW5kZXhBICogMyArIDIgXTtcblx0XHR2YXIgYl94ID0gdmVydGljZXNbIGluZGV4QiAqIDMgXTtcblx0XHR2YXIgYl95ID0gdmVydGljZXNbIGluZGV4QiAqIDMgKyAxIF07XG5cdFx0dmFyIGJfeiA9IHZlcnRpY2VzWyBpbmRleEIgKiAzICsgMiBdO1xuXHRcdHZhciBjX3ggPSB2ZXJ0aWNlc1sgaW5kZXhDICogMyBdO1xuXHRcdHZhciBjX3kgPSB2ZXJ0aWNlc1sgaW5kZXhDICogMyArIDEgXTtcblx0XHR2YXIgY196ID0gdmVydGljZXNbIGluZGV4QyAqIDMgKyAyIF07XG5cdFx0dmFyIGRfeCA9IHZlcnRpY2VzWyBpbmRleEQgKiAzIF07XG5cdFx0dmFyIGRfeSA9IHZlcnRpY2VzWyBpbmRleEQgKiAzICsgMSBdO1xuXHRcdHZhciBkX3ogPSB2ZXJ0aWNlc1sgaW5kZXhEICogMyArIDIgXTtcblxuXHRcdGlmICggTWF0aC5hYnMoIGFfeSAtIGJfeSApIDwgMC4wMSApIHtcblxuXHRcdFx0cmV0dXJuIFtcblx0XHRcdFx0bmV3IFZlY3RvcjIoIGFfeCwgMSAtIGFfeiApLFxuXHRcdFx0XHRuZXcgVmVjdG9yMiggYl94LCAxIC0gYl96ICksXG5cdFx0XHRcdG5ldyBWZWN0b3IyKCBjX3gsIDEgLSBjX3ogKSxcblx0XHRcdFx0bmV3IFZlY3RvcjIoIGRfeCwgMSAtIGRfeiApXG5cdFx0XHRdO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0cmV0dXJuIFtcblx0XHRcdFx0bmV3IFZlY3RvcjIoIGFfeSwgMSAtIGFfeiApLFxuXHRcdFx0XHRuZXcgVmVjdG9yMiggYl95LCAxIC0gYl96ICksXG5cdFx0XHRcdG5ldyBWZWN0b3IyKCBjX3ksIDEgLSBjX3ogKSxcblx0XHRcdFx0bmV3IFZlY3RvcjIoIGRfeSwgMSAtIGRfeiApXG5cdFx0XHRdO1xuXG5cdFx0fVxuXG5cdH1cbn07XG5cbi8qKlxuICogQGF1dGhvciB6ejg1IC8gaHR0cDovL3d3dy5sYWI0Z2FtZXMubmV0L3p6ODUvYmxvZ1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqXG4gKiBUZXh0ID0gM0QgVGV4dFxuICpcbiAqIHBhcmFtZXRlcnMgPSB7XG4gKiAgZm9udDogPFRIUkVFLkZvbnQ+LCAvLyBmb250XG4gKlxuICogIHNpemU6IDxmbG9hdD4sIC8vIHNpemUgb2YgdGhlIHRleHRcbiAqICBoZWlnaHQ6IDxmbG9hdD4sIC8vIHRoaWNrbmVzcyB0byBleHRydWRlIHRleHRcbiAqICBjdXJ2ZVNlZ21lbnRzOiA8aW50PiwgLy8gbnVtYmVyIG9mIHBvaW50cyBvbiB0aGUgY3VydmVzXG4gKlxuICogIGJldmVsRW5hYmxlZDogPGJvb2w+LCAvLyB0dXJuIG9uIGJldmVsXG4gKiAgYmV2ZWxUaGlja25lc3M6IDxmbG9hdD4sIC8vIGhvdyBkZWVwIGludG8gdGV4dCBiZXZlbCBnb2VzXG4gKiAgYmV2ZWxTaXplOiA8ZmxvYXQ+IC8vIGhvdyBmYXIgZnJvbSB0ZXh0IG91dGxpbmUgaXMgYmV2ZWxcbiAqIH1cbiAqL1xuXG4vLyBUZXh0R2VvbWV0cnlcblxuZnVuY3Rpb24gVGV4dEdlb21ldHJ5KCB0ZXh0LCBwYXJhbWV0ZXJzICkge1xuXG5cdEdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnVGV4dEdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0dGV4dDogdGV4dCxcblx0XHRwYXJhbWV0ZXJzOiBwYXJhbWV0ZXJzXG5cdH07XG5cblx0dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIG5ldyBUZXh0QnVmZmVyR2VvbWV0cnkoIHRleHQsIHBhcmFtZXRlcnMgKSApO1xuXHR0aGlzLm1lcmdlVmVydGljZXMoKTtcblxufVxuXG5UZXh0R2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7XG5UZXh0R2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVGV4dEdlb21ldHJ5O1xuXG4vLyBUZXh0QnVmZmVyR2VvbWV0cnlcblxuZnVuY3Rpb24gVGV4dEJ1ZmZlckdlb21ldHJ5KCB0ZXh0LCBwYXJhbWV0ZXJzICkge1xuXG5cdHBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzIHx8IHt9O1xuXG5cdHZhciBmb250ID0gcGFyYW1ldGVycy5mb250O1xuXG5cdGlmICggISAoIGZvbnQgJiYgZm9udC5pc0ZvbnQgKSApIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5UZXh0R2VvbWV0cnk6IGZvbnQgcGFyYW1ldGVyIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBUSFJFRS5Gb250LicgKTtcblx0XHRyZXR1cm4gbmV3IEdlb21ldHJ5KCk7XG5cblx0fVxuXG5cdHZhciBzaGFwZXMgPSBmb250LmdlbmVyYXRlU2hhcGVzKCB0ZXh0LCBwYXJhbWV0ZXJzLnNpemUsIHBhcmFtZXRlcnMuY3VydmVTZWdtZW50cyApO1xuXG5cdC8vIHRyYW5zbGF0ZSBwYXJhbWV0ZXJzIHRvIEV4dHJ1ZGVHZW9tZXRyeSBBUElcblxuXHRwYXJhbWV0ZXJzLmFtb3VudCA9IHBhcmFtZXRlcnMuaGVpZ2h0ICE9PSB1bmRlZmluZWQgPyBwYXJhbWV0ZXJzLmhlaWdodCA6IDUwO1xuXG5cdC8vIGRlZmF1bHRzXG5cblx0aWYgKCBwYXJhbWV0ZXJzLmJldmVsVGhpY2tuZXNzID09PSB1bmRlZmluZWQgKSBwYXJhbWV0ZXJzLmJldmVsVGhpY2tuZXNzID0gMTA7XG5cdGlmICggcGFyYW1ldGVycy5iZXZlbFNpemUgPT09IHVuZGVmaW5lZCApIHBhcmFtZXRlcnMuYmV2ZWxTaXplID0gODtcblx0aWYgKCBwYXJhbWV0ZXJzLmJldmVsRW5hYmxlZCA9PT0gdW5kZWZpbmVkICkgcGFyYW1ldGVycy5iZXZlbEVuYWJsZWQgPSBmYWxzZTtcblxuXHRFeHRydWRlQnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcywgc2hhcGVzLCBwYXJhbWV0ZXJzICk7XG5cblx0dGhpcy50eXBlID0gJ1RleHRCdWZmZXJHZW9tZXRyeSc7XG5cbn1cblxuVGV4dEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEV4dHJ1ZGVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTtcblRleHRCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBUZXh0QnVmZmVyR2VvbWV0cnk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgYmVuYWFkYW1zIC8gaHR0cHM6Ly90d2l0dGVyLmNvbS9iZW5fYV9hZGFtc1xuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqL1xuXG4vLyBTcGhlcmVHZW9tZXRyeVxuXG5mdW5jdGlvbiBTcGhlcmVHZW9tZXRyeSggcmFkaXVzLCB3aWR0aFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgcGhpU3RhcnQsIHBoaUxlbmd0aCwgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKSB7XG5cblx0R2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdTcGhlcmVHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHJhZGl1czogcmFkaXVzLFxuXHRcdHdpZHRoU2VnbWVudHM6IHdpZHRoU2VnbWVudHMsXG5cdFx0aGVpZ2h0U2VnbWVudHM6IGhlaWdodFNlZ21lbnRzLFxuXHRcdHBoaVN0YXJ0OiBwaGlTdGFydCxcblx0XHRwaGlMZW5ndGg6IHBoaUxlbmd0aCxcblx0XHR0aGV0YVN0YXJ0OiB0aGV0YVN0YXJ0LFxuXHRcdHRoZXRhTGVuZ3RoOiB0aGV0YUxlbmd0aFxuXHR9O1xuXG5cdHRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgU3BoZXJlQnVmZmVyR2VvbWV0cnkoIHJhZGl1cywgd2lkdGhTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIHBoaVN0YXJ0LCBwaGlMZW5ndGgsIHRoZXRhU3RhcnQsIHRoZXRhTGVuZ3RoICkgKTtcblx0dGhpcy5tZXJnZVZlcnRpY2VzKCk7XG5cbn1cblxuU3BoZXJlR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7XG5TcGhlcmVHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBTcGhlcmVHZW9tZXRyeTtcblxuLy8gU3BoZXJlQnVmZmVyR2VvbWV0cnlcblxuZnVuY3Rpb24gU3BoZXJlQnVmZmVyR2VvbWV0cnkoIHJhZGl1cywgd2lkdGhTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIHBoaVN0YXJ0LCBwaGlMZW5ndGgsIHRoZXRhU3RhcnQsIHRoZXRhTGVuZ3RoICkge1xuXG5cdEJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnU3BoZXJlQnVmZmVyR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRyYWRpdXM6IHJhZGl1cyxcblx0XHR3aWR0aFNlZ21lbnRzOiB3aWR0aFNlZ21lbnRzLFxuXHRcdGhlaWdodFNlZ21lbnRzOiBoZWlnaHRTZWdtZW50cyxcblx0XHRwaGlTdGFydDogcGhpU3RhcnQsXG5cdFx0cGhpTGVuZ3RoOiBwaGlMZW5ndGgsXG5cdFx0dGhldGFTdGFydDogdGhldGFTdGFydCxcblx0XHR0aGV0YUxlbmd0aDogdGhldGFMZW5ndGhcblx0fTtcblxuXHRyYWRpdXMgPSByYWRpdXMgfHwgMTtcblxuXHR3aWR0aFNlZ21lbnRzID0gTWF0aC5tYXgoIDMsIE1hdGguZmxvb3IoIHdpZHRoU2VnbWVudHMgKSB8fCA4ICk7XG5cdGhlaWdodFNlZ21lbnRzID0gTWF0aC5tYXgoIDIsIE1hdGguZmxvb3IoIGhlaWdodFNlZ21lbnRzICkgfHwgNiApO1xuXG5cdHBoaVN0YXJ0ID0gcGhpU3RhcnQgIT09IHVuZGVmaW5lZCA/IHBoaVN0YXJ0IDogMDtcblx0cGhpTGVuZ3RoID0gcGhpTGVuZ3RoICE9PSB1bmRlZmluZWQgPyBwaGlMZW5ndGggOiBNYXRoLlBJICogMjtcblxuXHR0aGV0YVN0YXJ0ID0gdGhldGFTdGFydCAhPT0gdW5kZWZpbmVkID8gdGhldGFTdGFydCA6IDA7XG5cdHRoZXRhTGVuZ3RoID0gdGhldGFMZW5ndGggIT09IHVuZGVmaW5lZCA/IHRoZXRhTGVuZ3RoIDogTWF0aC5QSTtcblxuXHR2YXIgdGhldGFFbmQgPSB0aGV0YVN0YXJ0ICsgdGhldGFMZW5ndGg7XG5cblx0dmFyIGl4LCBpeTtcblxuXHR2YXIgaW5kZXggPSAwO1xuXHR2YXIgZ3JpZCA9IFtdO1xuXG5cdHZhciB2ZXJ0ZXggPSBuZXcgVmVjdG9yMygpO1xuXHR2YXIgbm9ybWFsID0gbmV3IFZlY3RvcjMoKTtcblxuXHQvLyBidWZmZXJzXG5cblx0dmFyIGluZGljZXMgPSBbXTtcblx0dmFyIHZlcnRpY2VzID0gW107XG5cdHZhciBub3JtYWxzID0gW107XG5cdHZhciB1dnMgPSBbXTtcblxuXHQvLyBnZW5lcmF0ZSB2ZXJ0aWNlcywgbm9ybWFscyBhbmQgdXZzXG5cblx0Zm9yICggaXkgPSAwOyBpeSA8PSBoZWlnaHRTZWdtZW50czsgaXkgKysgKSB7XG5cblx0XHR2YXIgdmVydGljZXNSb3cgPSBbXTtcblxuXHRcdHZhciB2ID0gaXkgLyBoZWlnaHRTZWdtZW50cztcblxuXHRcdGZvciAoIGl4ID0gMDsgaXggPD0gd2lkdGhTZWdtZW50czsgaXggKysgKSB7XG5cblx0XHRcdHZhciB1ID0gaXggLyB3aWR0aFNlZ21lbnRzO1xuXG5cdFx0XHQvLyB2ZXJ0ZXhcblxuXHRcdFx0dmVydGV4LnggPSAtIHJhZGl1cyAqIE1hdGguY29zKCBwaGlTdGFydCArIHUgKiBwaGlMZW5ndGggKSAqIE1hdGguc2luKCB0aGV0YVN0YXJ0ICsgdiAqIHRoZXRhTGVuZ3RoICk7XG5cdFx0XHR2ZXJ0ZXgueSA9IHJhZGl1cyAqIE1hdGguY29zKCB0aGV0YVN0YXJ0ICsgdiAqIHRoZXRhTGVuZ3RoICk7XG5cdFx0XHR2ZXJ0ZXgueiA9IHJhZGl1cyAqIE1hdGguc2luKCBwaGlTdGFydCArIHUgKiBwaGlMZW5ndGggKSAqIE1hdGguc2luKCB0aGV0YVN0YXJ0ICsgdiAqIHRoZXRhTGVuZ3RoICk7XG5cblx0XHRcdHZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTtcblxuXHRcdFx0Ly8gbm9ybWFsXG5cblx0XHRcdG5vcm1hbC5zZXQoIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKS5ub3JtYWxpemUoKTtcblx0XHRcdG5vcm1hbHMucHVzaCggbm9ybWFsLngsIG5vcm1hbC55LCBub3JtYWwueiApO1xuXG5cdFx0XHQvLyB1dlxuXG5cdFx0XHR1dnMucHVzaCggdSwgMSAtIHYgKTtcblxuXHRcdFx0dmVydGljZXNSb3cucHVzaCggaW5kZXggKysgKTtcblxuXHRcdH1cblxuXHRcdGdyaWQucHVzaCggdmVydGljZXNSb3cgKTtcblxuXHR9XG5cblx0Ly8gaW5kaWNlc1xuXG5cdGZvciAoIGl5ID0gMDsgaXkgPCBoZWlnaHRTZWdtZW50czsgaXkgKysgKSB7XG5cblx0XHRmb3IgKCBpeCA9IDA7IGl4IDwgd2lkdGhTZWdtZW50czsgaXggKysgKSB7XG5cblx0XHRcdHZhciBhID0gZ3JpZFsgaXkgXVsgaXggKyAxIF07XG5cdFx0XHR2YXIgYiA9IGdyaWRbIGl5IF1bIGl4IF07XG5cdFx0XHR2YXIgYyA9IGdyaWRbIGl5ICsgMSBdWyBpeCBdO1xuXHRcdFx0dmFyIGQgPSBncmlkWyBpeSArIDEgXVsgaXggKyAxIF07XG5cblx0XHRcdGlmICggaXkgIT09IDAgfHwgdGhldGFTdGFydCA+IDAgKSBpbmRpY2VzLnB1c2goIGEsIGIsIGQgKTtcblx0XHRcdGlmICggaXkgIT09IGhlaWdodFNlZ21lbnRzIC0gMSB8fCB0aGV0YUVuZCA8IE1hdGguUEkgKSBpbmRpY2VzLnB1c2goIGIsIGMsIGQgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gYnVpbGQgZ2VvbWV0cnlcblxuXHR0aGlzLnNldEluZGV4KCBpbmRpY2VzICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ25vcm1hbCcsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBub3JtYWxzLCAzICkgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICd1dicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB1dnMsIDIgKSApO1xuXG59XG5cblNwaGVyZUJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApO1xuU3BoZXJlQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU3BoZXJlQnVmZmVyR2VvbWV0cnk7XG5cbi8qKlxuICogQGF1dGhvciBLYWxlYiBNdXJwaHlcbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKi9cblxuLy8gUmluZ0dlb21ldHJ5XG5cbmZ1bmN0aW9uIFJpbmdHZW9tZXRyeSggaW5uZXJSYWRpdXMsIG91dGVyUmFkaXVzLCB0aGV0YVNlZ21lbnRzLCBwaGlTZWdtZW50cywgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKSB7XG5cblx0R2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdSaW5nR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRpbm5lclJhZGl1czogaW5uZXJSYWRpdXMsXG5cdFx0b3V0ZXJSYWRpdXM6IG91dGVyUmFkaXVzLFxuXHRcdHRoZXRhU2VnbWVudHM6IHRoZXRhU2VnbWVudHMsXG5cdFx0cGhpU2VnbWVudHM6IHBoaVNlZ21lbnRzLFxuXHRcdHRoZXRhU3RhcnQ6IHRoZXRhU3RhcnQsXG5cdFx0dGhldGFMZW5ndGg6IHRoZXRhTGVuZ3RoXG5cdH07XG5cblx0dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIG5ldyBSaW5nQnVmZmVyR2VvbWV0cnkoIGlubmVyUmFkaXVzLCBvdXRlclJhZGl1cywgdGhldGFTZWdtZW50cywgcGhpU2VnbWVudHMsIHRoZXRhU3RhcnQsIHRoZXRhTGVuZ3RoICkgKTtcblx0dGhpcy5tZXJnZVZlcnRpY2VzKCk7XG5cbn1cblxuUmluZ0dlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEdlb21ldHJ5LnByb3RvdHlwZSApO1xuUmluZ0dlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFJpbmdHZW9tZXRyeTtcblxuLy8gUmluZ0J1ZmZlckdlb21ldHJ5XG5cbmZ1bmN0aW9uIFJpbmdCdWZmZXJHZW9tZXRyeSggaW5uZXJSYWRpdXMsIG91dGVyUmFkaXVzLCB0aGV0YVNlZ21lbnRzLCBwaGlTZWdtZW50cywgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKSB7XG5cblx0QnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdSaW5nQnVmZmVyR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRpbm5lclJhZGl1czogaW5uZXJSYWRpdXMsXG5cdFx0b3V0ZXJSYWRpdXM6IG91dGVyUmFkaXVzLFxuXHRcdHRoZXRhU2VnbWVudHM6IHRoZXRhU2VnbWVudHMsXG5cdFx0cGhpU2VnbWVudHM6IHBoaVNlZ21lbnRzLFxuXHRcdHRoZXRhU3RhcnQ6IHRoZXRhU3RhcnQsXG5cdFx0dGhldGFMZW5ndGg6IHRoZXRhTGVuZ3RoXG5cdH07XG5cblx0aW5uZXJSYWRpdXMgPSBpbm5lclJhZGl1cyB8fCAwLjU7XG5cdG91dGVyUmFkaXVzID0gb3V0ZXJSYWRpdXMgfHwgMTtcblxuXHR0aGV0YVN0YXJ0ID0gdGhldGFTdGFydCAhPT0gdW5kZWZpbmVkID8gdGhldGFTdGFydCA6IDA7XG5cdHRoZXRhTGVuZ3RoID0gdGhldGFMZW5ndGggIT09IHVuZGVmaW5lZCA/IHRoZXRhTGVuZ3RoIDogTWF0aC5QSSAqIDI7XG5cblx0dGhldGFTZWdtZW50cyA9IHRoZXRhU2VnbWVudHMgIT09IHVuZGVmaW5lZCA/IE1hdGgubWF4KCAzLCB0aGV0YVNlZ21lbnRzICkgOiA4O1xuXHRwaGlTZWdtZW50cyA9IHBoaVNlZ21lbnRzICE9PSB1bmRlZmluZWQgPyBNYXRoLm1heCggMSwgcGhpU2VnbWVudHMgKSA6IDE7XG5cblx0Ly8gYnVmZmVyc1xuXG5cdHZhciBpbmRpY2VzID0gW107XG5cdHZhciB2ZXJ0aWNlcyA9IFtdO1xuXHR2YXIgbm9ybWFscyA9IFtdO1xuXHR2YXIgdXZzID0gW107XG5cblx0Ly8gc29tZSBoZWxwZXIgdmFyaWFibGVzXG5cblx0dmFyIHNlZ21lbnQ7XG5cdHZhciByYWRpdXMgPSBpbm5lclJhZGl1cztcblx0dmFyIHJhZGl1c1N0ZXAgPSAoICggb3V0ZXJSYWRpdXMgLSBpbm5lclJhZGl1cyApIC8gcGhpU2VnbWVudHMgKTtcblx0dmFyIHZlcnRleCA9IG5ldyBWZWN0b3IzKCk7XG5cdHZhciB1diA9IG5ldyBWZWN0b3IyKCk7XG5cdHZhciBqLCBpO1xuXG5cdC8vIGdlbmVyYXRlIHZlcnRpY2VzLCBub3JtYWxzIGFuZCB1dnNcblxuXHRmb3IgKCBqID0gMDsgaiA8PSBwaGlTZWdtZW50czsgaiArKyApIHtcblxuXHRcdGZvciAoIGkgPSAwOyBpIDw9IHRoZXRhU2VnbWVudHM7IGkgKysgKSB7XG5cblx0XHRcdC8vIHZhbHVlcyBhcmUgZ2VuZXJhdGUgZnJvbSB0aGUgaW5zaWRlIG9mIHRoZSByaW5nIHRvIHRoZSBvdXRzaWRlXG5cblx0XHRcdHNlZ21lbnQgPSB0aGV0YVN0YXJ0ICsgaSAvIHRoZXRhU2VnbWVudHMgKiB0aGV0YUxlbmd0aDtcblxuXHRcdFx0Ly8gdmVydGV4XG5cblx0XHRcdHZlcnRleC54ID0gcmFkaXVzICogTWF0aC5jb3MoIHNlZ21lbnQgKTtcblx0XHRcdHZlcnRleC55ID0gcmFkaXVzICogTWF0aC5zaW4oIHNlZ21lbnQgKTtcblxuXHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0XHQvLyBub3JtYWxcblxuXHRcdFx0bm9ybWFscy5wdXNoKCAwLCAwLCAxICk7XG5cblx0XHRcdC8vIHV2XG5cblx0XHRcdHV2LnggPSAoIHZlcnRleC54IC8gb3V0ZXJSYWRpdXMgKyAxICkgLyAyO1xuXHRcdFx0dXYueSA9ICggdmVydGV4LnkgLyBvdXRlclJhZGl1cyArIDEgKSAvIDI7XG5cblx0XHRcdHV2cy5wdXNoKCB1di54LCB1di55ICk7XG5cblx0XHR9XG5cblx0XHQvLyBpbmNyZWFzZSB0aGUgcmFkaXVzIGZvciBuZXh0IHJvdyBvZiB2ZXJ0aWNlc1xuXG5cdFx0cmFkaXVzICs9IHJhZGl1c1N0ZXA7XG5cblx0fVxuXG5cdC8vIGluZGljZXNcblxuXHRmb3IgKCBqID0gMDsgaiA8IHBoaVNlZ21lbnRzOyBqICsrICkge1xuXG5cdFx0dmFyIHRoZXRhU2VnbWVudExldmVsID0gaiAqICggdGhldGFTZWdtZW50cyArIDEgKTtcblxuXHRcdGZvciAoIGkgPSAwOyBpIDwgdGhldGFTZWdtZW50czsgaSArKyApIHtcblxuXHRcdFx0c2VnbWVudCA9IGkgKyB0aGV0YVNlZ21lbnRMZXZlbDtcblxuXHRcdFx0dmFyIGEgPSBzZWdtZW50O1xuXHRcdFx0dmFyIGIgPSBzZWdtZW50ICsgdGhldGFTZWdtZW50cyArIDE7XG5cdFx0XHR2YXIgYyA9IHNlZ21lbnQgKyB0aGV0YVNlZ21lbnRzICsgMjtcblx0XHRcdHZhciBkID0gc2VnbWVudCArIDE7XG5cblx0XHRcdC8vIGZhY2VzXG5cblx0XHRcdGluZGljZXMucHVzaCggYSwgYiwgZCApO1xuXHRcdFx0aW5kaWNlcy5wdXNoKCBiLCBjLCBkICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vIGJ1aWxkIGdlb21ldHJ5XG5cblx0dGhpcy5zZXRJbmRleCggaW5kaWNlcyApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICdub3JtYWwnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbm9ybWFscywgMyApICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZzLCAyICkgKTtcblxufVxuXG5SaW5nQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7XG5SaW5nQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUmluZ0J1ZmZlckdlb21ldHJ5O1xuXG4vKipcbiAqIEBhdXRob3IgYXN0cm9kdWQgLyBodHRwOi8vYXN0cm9kdWQuaXNncmVhdC5vcmcvXG4gKiBAYXV0aG9yIHp6ODUgLyBodHRwczovL2dpdGh1Yi5jb20veno4NVxuICogQGF1dGhvciBiaG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pb1xuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqL1xuXG4vLyBMYXRoZUdlb21ldHJ5XG5cbmZ1bmN0aW9uIExhdGhlR2VvbWV0cnkoIHBvaW50cywgc2VnbWVudHMsIHBoaVN0YXJ0LCBwaGlMZW5ndGggKSB7XG5cblx0R2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdMYXRoZUdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0cG9pbnRzOiBwb2ludHMsXG5cdFx0c2VnbWVudHM6IHNlZ21lbnRzLFxuXHRcdHBoaVN0YXJ0OiBwaGlTdGFydCxcblx0XHRwaGlMZW5ndGg6IHBoaUxlbmd0aFxuXHR9O1xuXG5cdHRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgTGF0aGVCdWZmZXJHZW9tZXRyeSggcG9pbnRzLCBzZWdtZW50cywgcGhpU3RhcnQsIHBoaUxlbmd0aCApICk7XG5cdHRoaXMubWVyZ2VWZXJ0aWNlcygpO1xuXG59XG5cbkxhdGhlR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7XG5MYXRoZUdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IExhdGhlR2VvbWV0cnk7XG5cbi8vIExhdGhlQnVmZmVyR2VvbWV0cnlcblxuZnVuY3Rpb24gTGF0aGVCdWZmZXJHZW9tZXRyeSggcG9pbnRzLCBzZWdtZW50cywgcGhpU3RhcnQsIHBoaUxlbmd0aCApIHtcblxuXHRCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0xhdGhlQnVmZmVyR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRwb2ludHM6IHBvaW50cyxcblx0XHRzZWdtZW50czogc2VnbWVudHMsXG5cdFx0cGhpU3RhcnQ6IHBoaVN0YXJ0LFxuXHRcdHBoaUxlbmd0aDogcGhpTGVuZ3RoXG5cdH07XG5cblx0c2VnbWVudHMgPSBNYXRoLmZsb29yKCBzZWdtZW50cyApIHx8IDEyO1xuXHRwaGlTdGFydCA9IHBoaVN0YXJ0IHx8IDA7XG5cdHBoaUxlbmd0aCA9IHBoaUxlbmd0aCB8fCBNYXRoLlBJICogMjtcblxuXHQvLyBjbGFtcCBwaGlMZW5ndGggc28gaXQncyBpbiByYW5nZSBvZiBbIDAsIDJQSSBdXG5cblx0cGhpTGVuZ3RoID0gX01hdGguY2xhbXAoIHBoaUxlbmd0aCwgMCwgTWF0aC5QSSAqIDIgKTtcblxuXG5cdC8vIGJ1ZmZlcnNcblxuXHR2YXIgaW5kaWNlcyA9IFtdO1xuXHR2YXIgdmVydGljZXMgPSBbXTtcblx0dmFyIHV2cyA9IFtdO1xuXG5cdC8vIGhlbHBlciB2YXJpYWJsZXNcblxuXHR2YXIgYmFzZTtcblx0dmFyIGludmVyc2VTZWdtZW50cyA9IDEuMCAvIHNlZ21lbnRzO1xuXHR2YXIgdmVydGV4ID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIHV2ID0gbmV3IFZlY3RvcjIoKTtcblx0dmFyIGksIGo7XG5cblx0Ly8gZ2VuZXJhdGUgdmVydGljZXMgYW5kIHV2c1xuXG5cdGZvciAoIGkgPSAwOyBpIDw9IHNlZ21lbnRzOyBpICsrICkge1xuXG5cdFx0dmFyIHBoaSA9IHBoaVN0YXJ0ICsgaSAqIGludmVyc2VTZWdtZW50cyAqIHBoaUxlbmd0aDtcblxuXHRcdHZhciBzaW4gPSBNYXRoLnNpbiggcGhpICk7XG5cdFx0dmFyIGNvcyA9IE1hdGguY29zKCBwaGkgKTtcblxuXHRcdGZvciAoIGogPSAwOyBqIDw9ICggcG9pbnRzLmxlbmd0aCAtIDEgKTsgaiArKyApIHtcblxuXHRcdFx0Ly8gdmVydGV4XG5cblx0XHRcdHZlcnRleC54ID0gcG9pbnRzWyBqIF0ueCAqIHNpbjtcblx0XHRcdHZlcnRleC55ID0gcG9pbnRzWyBqIF0ueTtcblx0XHRcdHZlcnRleC56ID0gcG9pbnRzWyBqIF0ueCAqIGNvcztcblxuXHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0XHQvLyB1dlxuXG5cdFx0XHR1di54ID0gaSAvIHNlZ21lbnRzO1xuXHRcdFx0dXYueSA9IGogLyAoIHBvaW50cy5sZW5ndGggLSAxICk7XG5cblx0XHRcdHV2cy5wdXNoKCB1di54LCB1di55ICk7XG5cblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gaW5kaWNlc1xuXG5cdGZvciAoIGkgPSAwOyBpIDwgc2VnbWVudHM7IGkgKysgKSB7XG5cblx0XHRmb3IgKCBqID0gMDsgaiA8ICggcG9pbnRzLmxlbmd0aCAtIDEgKTsgaiArKyApIHtcblxuXHRcdFx0YmFzZSA9IGogKyBpICogcG9pbnRzLmxlbmd0aDtcblxuXHRcdFx0dmFyIGEgPSBiYXNlO1xuXHRcdFx0dmFyIGIgPSBiYXNlICsgcG9pbnRzLmxlbmd0aDtcblx0XHRcdHZhciBjID0gYmFzZSArIHBvaW50cy5sZW5ndGggKyAxO1xuXHRcdFx0dmFyIGQgPSBiYXNlICsgMTtcblxuXHRcdFx0Ly8gZmFjZXNcblxuXHRcdFx0aW5kaWNlcy5wdXNoKCBhLCBiLCBkICk7XG5cdFx0XHRpbmRpY2VzLnB1c2goIGIsIGMsIGQgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gYnVpbGQgZ2VvbWV0cnlcblxuXHR0aGlzLnNldEluZGV4KCBpbmRpY2VzICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2cywgMiApICk7XG5cblx0Ly8gZ2VuZXJhdGUgbm9ybWFsc1xuXG5cdHRoaXMuY29tcHV0ZVZlcnRleE5vcm1hbHMoKTtcblxuXHQvLyBpZiB0aGUgZ2VvbWV0cnkgaXMgY2xvc2VkLCB3ZSBuZWVkIHRvIGF2ZXJhZ2UgdGhlIG5vcm1hbHMgYWxvbmcgdGhlIHNlYW0uXG5cdC8vIGJlY2F1c2UgdGhlIGNvcnJlc3BvbmRpbmcgdmVydGljZXMgYXJlIGlkZW50aWNhbCAoYnV0IHN0aWxsIGhhdmUgZGlmZmVyZW50IFVWcykuXG5cblx0aWYgKCBwaGlMZW5ndGggPT09IE1hdGguUEkgKiAyICkge1xuXG5cdFx0dmFyIG5vcm1hbHMgPSB0aGlzLmF0dHJpYnV0ZXMubm9ybWFsLmFycmF5O1xuXHRcdHZhciBuMSA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIG4yID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgbiA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHQvLyB0aGlzIGlzIHRoZSBidWZmZXIgb2Zmc2V0IGZvciB0aGUgbGFzdCBsaW5lIG9mIHZlcnRpY2VzXG5cblx0XHRiYXNlID0gc2VnbWVudHMgKiBwb2ludHMubGVuZ3RoICogMztcblxuXHRcdGZvciAoIGkgPSAwLCBqID0gMDsgaSA8IHBvaW50cy5sZW5ndGg7IGkgKyssIGogKz0gMyApIHtcblxuXHRcdFx0Ly8gc2VsZWN0IHRoZSBub3JtYWwgb2YgdGhlIHZlcnRleCBpbiB0aGUgZmlyc3QgbGluZVxuXG5cdFx0XHRuMS54ID0gbm9ybWFsc1sgaiArIDAgXTtcblx0XHRcdG4xLnkgPSBub3JtYWxzWyBqICsgMSBdO1xuXHRcdFx0bjEueiA9IG5vcm1hbHNbIGogKyAyIF07XG5cblx0XHRcdC8vIHNlbGVjdCB0aGUgbm9ybWFsIG9mIHRoZSB2ZXJ0ZXggaW4gdGhlIGxhc3QgbGluZVxuXG5cdFx0XHRuMi54ID0gbm9ybWFsc1sgYmFzZSArIGogKyAwIF07XG5cdFx0XHRuMi55ID0gbm9ybWFsc1sgYmFzZSArIGogKyAxIF07XG5cdFx0XHRuMi56ID0gbm9ybWFsc1sgYmFzZSArIGogKyAyIF07XG5cblx0XHRcdC8vIGF2ZXJhZ2Ugbm9ybWFsc1xuXG5cdFx0XHRuLmFkZFZlY3RvcnMoIG4xLCBuMiApLm5vcm1hbGl6ZSgpO1xuXG5cdFx0XHQvLyBhc3NpZ24gdGhlIG5ldyB2YWx1ZXMgdG8gYm90aCBub3JtYWxzXG5cblx0XHRcdG5vcm1hbHNbIGogKyAwIF0gPSBub3JtYWxzWyBiYXNlICsgaiArIDAgXSA9IG4ueDtcblx0XHRcdG5vcm1hbHNbIGogKyAxIF0gPSBub3JtYWxzWyBiYXNlICsgaiArIDEgXSA9IG4ueTtcblx0XHRcdG5vcm1hbHNbIGogKyAyIF0gPSBub3JtYWxzWyBiYXNlICsgaiArIDIgXSA9IG4uejtcblxuXHRcdH1cblxuXHR9XG5cbn1cblxuTGF0aGVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTtcbkxhdGhlQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTGF0aGVCdWZmZXJHZW9tZXRyeTtcblxuLyoqXG4gKiBAYXV0aG9yIGpvbm9icjEgLyBodHRwOi8vam9ub2JyMS5jb21cbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKi9cblxuLy8gU2hhcGVHZW9tZXRyeVxuXG5mdW5jdGlvbiBTaGFwZUdlb21ldHJ5KCBzaGFwZXMsIGN1cnZlU2VnbWVudHMgKSB7XG5cblx0R2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdTaGFwZUdlb21ldHJ5JztcblxuXHRpZiAoIHR5cGVvZiBjdXJ2ZVNlZ21lbnRzID09PSAnb2JqZWN0JyApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlNoYXBlR2VvbWV0cnk6IE9wdGlvbnMgcGFyYW1ldGVyIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdFx0Y3VydmVTZWdtZW50cyA9IGN1cnZlU2VnbWVudHMuY3VydmVTZWdtZW50cztcblxuXHR9XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHNoYXBlczogc2hhcGVzLFxuXHRcdGN1cnZlU2VnbWVudHM6IGN1cnZlU2VnbWVudHNcblx0fTtcblxuXHR0aGlzLmZyb21CdWZmZXJHZW9tZXRyeSggbmV3IFNoYXBlQnVmZmVyR2VvbWV0cnkoIHNoYXBlcywgY3VydmVTZWdtZW50cyApICk7XG5cdHRoaXMubWVyZ2VWZXJ0aWNlcygpO1xuXG59XG5cblNoYXBlR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7XG5TaGFwZUdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFNoYXBlR2VvbWV0cnk7XG5cblNoYXBlR2VvbWV0cnkucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uICgpIHtcblxuXHR2YXIgZGF0YSA9IEdlb21ldHJ5LnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcyApO1xuXG5cdHZhciBzaGFwZXMgPSB0aGlzLnBhcmFtZXRlcnMuc2hhcGVzO1xuXG5cdHJldHVybiB0b0pTT04oIHNoYXBlcywgZGF0YSApO1xuXG59O1xuXG4vLyBTaGFwZUJ1ZmZlckdlb21ldHJ5XG5cbmZ1bmN0aW9uIFNoYXBlQnVmZmVyR2VvbWV0cnkoIHNoYXBlcywgY3VydmVTZWdtZW50cyApIHtcblxuXHRCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1NoYXBlQnVmZmVyR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRzaGFwZXM6IHNoYXBlcyxcblx0XHRjdXJ2ZVNlZ21lbnRzOiBjdXJ2ZVNlZ21lbnRzXG5cdH07XG5cblx0Y3VydmVTZWdtZW50cyA9IGN1cnZlU2VnbWVudHMgfHwgMTI7XG5cblx0Ly8gYnVmZmVyc1xuXG5cdHZhciBpbmRpY2VzID0gW107XG5cdHZhciB2ZXJ0aWNlcyA9IFtdO1xuXHR2YXIgbm9ybWFscyA9IFtdO1xuXHR2YXIgdXZzID0gW107XG5cblx0Ly8gaGVscGVyIHZhcmlhYmxlc1xuXG5cdHZhciBncm91cFN0YXJ0ID0gMDtcblx0dmFyIGdyb3VwQ291bnQgPSAwO1xuXG5cdC8vIGFsbG93IHNpbmdsZSBhbmQgYXJyYXkgdmFsdWVzIGZvciBcInNoYXBlc1wiIHBhcmFtZXRlclxuXG5cdGlmICggQXJyYXkuaXNBcnJheSggc2hhcGVzICkgPT09IGZhbHNlICkge1xuXG5cdFx0YWRkU2hhcGUoIHNoYXBlcyApO1xuXG5cdH0gZWxzZSB7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBzaGFwZXMubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRhZGRTaGFwZSggc2hhcGVzWyBpIF0gKTtcblxuXHRcdFx0dGhpcy5hZGRHcm91cCggZ3JvdXBTdGFydCwgZ3JvdXBDb3VudCwgaSApOyAvLyBlbmFibGVzIE11bHRpTWF0ZXJpYWwgc3VwcG9ydFxuXG5cdFx0XHRncm91cFN0YXJ0ICs9IGdyb3VwQ291bnQ7XG5cdFx0XHRncm91cENvdW50ID0gMDtcblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gYnVpbGQgZ2VvbWV0cnlcblxuXHR0aGlzLnNldEluZGV4KCBpbmRpY2VzICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ25vcm1hbCcsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBub3JtYWxzLCAzICkgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICd1dicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB1dnMsIDIgKSApO1xuXG5cblx0Ly8gaGVscGVyIGZ1bmN0aW9uc1xuXG5cdGZ1bmN0aW9uIGFkZFNoYXBlKCBzaGFwZSApIHtcblxuXHRcdHZhciBpLCBsLCBzaGFwZUhvbGU7XG5cblx0XHR2YXIgaW5kZXhPZmZzZXQgPSB2ZXJ0aWNlcy5sZW5ndGggLyAzO1xuXHRcdHZhciBwb2ludHMgPSBzaGFwZS5leHRyYWN0UG9pbnRzKCBjdXJ2ZVNlZ21lbnRzICk7XG5cblx0XHR2YXIgc2hhcGVWZXJ0aWNlcyA9IHBvaW50cy5zaGFwZTtcblx0XHR2YXIgc2hhcGVIb2xlcyA9IHBvaW50cy5ob2xlcztcblxuXHRcdC8vIGNoZWNrIGRpcmVjdGlvbiBvZiB2ZXJ0aWNlc1xuXG5cdFx0aWYgKCBTaGFwZVV0aWxzLmlzQ2xvY2tXaXNlKCBzaGFwZVZlcnRpY2VzICkgPT09IGZhbHNlICkge1xuXG5cdFx0XHRzaGFwZVZlcnRpY2VzID0gc2hhcGVWZXJ0aWNlcy5yZXZlcnNlKCk7XG5cblx0XHRcdC8vIGFsc28gY2hlY2sgaWYgaG9sZXMgYXJlIGluIHRoZSBvcHBvc2l0ZSBkaXJlY3Rpb25cblxuXHRcdFx0Zm9yICggaSA9IDAsIGwgPSBzaGFwZUhvbGVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0c2hhcGVIb2xlID0gc2hhcGVIb2xlc1sgaSBdO1xuXG5cdFx0XHRcdGlmICggU2hhcGVVdGlscy5pc0Nsb2NrV2lzZSggc2hhcGVIb2xlICkgPT09IHRydWUgKSB7XG5cblx0XHRcdFx0XHRzaGFwZUhvbGVzWyBpIF0gPSBzaGFwZUhvbGUucmV2ZXJzZSgpO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0dmFyIGZhY2VzID0gU2hhcGVVdGlscy50cmlhbmd1bGF0ZVNoYXBlKCBzaGFwZVZlcnRpY2VzLCBzaGFwZUhvbGVzICk7XG5cblx0XHQvLyBqb2luIHZlcnRpY2VzIG9mIGlubmVyIGFuZCBvdXRlciBwYXRocyB0byBhIHNpbmdsZSBhcnJheVxuXG5cdFx0Zm9yICggaSA9IDAsIGwgPSBzaGFwZUhvbGVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHNoYXBlSG9sZSA9IHNoYXBlSG9sZXNbIGkgXTtcblx0XHRcdHNoYXBlVmVydGljZXMgPSBzaGFwZVZlcnRpY2VzLmNvbmNhdCggc2hhcGVIb2xlICk7XG5cblx0XHR9XG5cblx0XHQvLyB2ZXJ0aWNlcywgbm9ybWFscywgdXZzXG5cblx0XHRmb3IgKCBpID0gMCwgbCA9IHNoYXBlVmVydGljZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIHZlcnRleCA9IHNoYXBlVmVydGljZXNbIGkgXTtcblxuXHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCAwICk7XG5cdFx0XHRub3JtYWxzLnB1c2goIDAsIDAsIDEgKTtcblx0XHRcdHV2cy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnkgKTsgLy8gd29ybGQgdXZzXG5cblx0XHR9XG5cblx0XHQvLyBpbmNpZGVzXG5cblx0XHRmb3IgKCBpID0gMCwgbCA9IGZhY2VzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBmYWNlID0gZmFjZXNbIGkgXTtcblxuXHRcdFx0dmFyIGEgPSBmYWNlWyAwIF0gKyBpbmRleE9mZnNldDtcblx0XHRcdHZhciBiID0gZmFjZVsgMSBdICsgaW5kZXhPZmZzZXQ7XG5cdFx0XHR2YXIgYyA9IGZhY2VbIDIgXSArIGluZGV4T2Zmc2V0O1xuXG5cdFx0XHRpbmRpY2VzLnB1c2goIGEsIGIsIGMgKTtcblx0XHRcdGdyb3VwQ291bnQgKz0gMztcblxuXHRcdH1cblxuXHR9XG5cbn1cblxuU2hhcGVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTtcblNoYXBlQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU2hhcGVCdWZmZXJHZW9tZXRyeTtcblxuU2hhcGVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gKCkge1xuXG5cdHZhciBkYXRhID0gQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzICk7XG5cblx0dmFyIHNoYXBlcyA9IHRoaXMucGFyYW1ldGVycy5zaGFwZXM7XG5cblx0cmV0dXJuIHRvSlNPTiggc2hhcGVzLCBkYXRhICk7XG5cbn07XG5cbi8vXG5cbmZ1bmN0aW9uIHRvSlNPTiggc2hhcGVzLCBkYXRhICkge1xuXG5cdGRhdGEuc2hhcGVzID0gW107XG5cblx0aWYgKCBBcnJheS5pc0FycmF5KCBzaGFwZXMgKSApIHtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHNoYXBlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgc2hhcGUgPSBzaGFwZXNbIGkgXTtcblxuXHRcdFx0ZGF0YS5zaGFwZXMucHVzaCggc2hhcGUudXVpZCApO1xuXG5cdFx0fVxuXG5cdH0gZWxzZSB7XG5cblx0XHRkYXRhLnNoYXBlcy5wdXNoKCBzaGFwZXMudXVpZCApO1xuXG5cdH1cblxuXHRyZXR1cm4gZGF0YTtcblxufVxuXG4vKipcbiAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleVxuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqL1xuXG5mdW5jdGlvbiBFZGdlc0dlb21ldHJ5KCBnZW9tZXRyeSwgdGhyZXNob2xkQW5nbGUgKSB7XG5cblx0QnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdFZGdlc0dlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0dGhyZXNob2xkQW5nbGU6IHRocmVzaG9sZEFuZ2xlXG5cdH07XG5cblx0dGhyZXNob2xkQW5nbGUgPSAoIHRocmVzaG9sZEFuZ2xlICE9PSB1bmRlZmluZWQgKSA/IHRocmVzaG9sZEFuZ2xlIDogMTtcblxuXHQvLyBidWZmZXJcblxuXHR2YXIgdmVydGljZXMgPSBbXTtcblxuXHQvLyBoZWxwZXIgdmFyaWFibGVzXG5cblx0dmFyIHRocmVzaG9sZERvdCA9IE1hdGguY29zKCBfTWF0aC5ERUcyUkFEICogdGhyZXNob2xkQW5nbGUgKTtcblx0dmFyIGVkZ2UgPSBbIDAsIDAgXSwgZWRnZXMgPSB7fSwgZWRnZTEsIGVkZ2UyO1xuXHR2YXIga2V5LCBrZXlzID0gWyAnYScsICdiJywgJ2MnIF07XG5cblx0Ly8gcHJlcGFyZSBzb3VyY2UgZ2VvbWV0cnlcblxuXHR2YXIgZ2VvbWV0cnkyO1xuXG5cdGlmICggZ2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSApIHtcblxuXHRcdGdlb21ldHJ5MiA9IG5ldyBHZW9tZXRyeSgpO1xuXHRcdGdlb21ldHJ5Mi5mcm9tQnVmZmVyR2VvbWV0cnkoIGdlb21ldHJ5ICk7XG5cblx0fSBlbHNlIHtcblxuXHRcdGdlb21ldHJ5MiA9IGdlb21ldHJ5LmNsb25lKCk7XG5cblx0fVxuXG5cdGdlb21ldHJ5Mi5tZXJnZVZlcnRpY2VzKCk7XG5cdGdlb21ldHJ5Mi5jb21wdXRlRmFjZU5vcm1hbHMoKTtcblxuXHR2YXIgc291cmNlVmVydGljZXMgPSBnZW9tZXRyeTIudmVydGljZXM7XG5cdHZhciBmYWNlcyA9IGdlb21ldHJ5Mi5mYWNlcztcblxuXHQvLyBub3cgY3JlYXRlIGEgZGF0YSBzdHJ1Y3R1cmUgd2hlcmUgZWFjaCBlbnRyeSByZXByZXNlbnRzIGFuIGVkZ2Ugd2l0aCBpdHMgYWRqb2luaW5nIGZhY2VzXG5cblx0Zm9yICggdmFyIGkgPSAwLCBsID0gZmFjZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdHZhciBmYWNlID0gZmFjZXNbIGkgXTtcblxuXHRcdGZvciAoIHZhciBqID0gMDsgaiA8IDM7IGogKysgKSB7XG5cblx0XHRcdGVkZ2UxID0gZmFjZVsga2V5c1sgaiBdIF07XG5cdFx0XHRlZGdlMiA9IGZhY2VbIGtleXNbICggaiArIDEgKSAlIDMgXSBdO1xuXHRcdFx0ZWRnZVsgMCBdID0gTWF0aC5taW4oIGVkZ2UxLCBlZGdlMiApO1xuXHRcdFx0ZWRnZVsgMSBdID0gTWF0aC5tYXgoIGVkZ2UxLCBlZGdlMiApO1xuXG5cdFx0XHRrZXkgPSBlZGdlWyAwIF0gKyAnLCcgKyBlZGdlWyAxIF07XG5cblx0XHRcdGlmICggZWRnZXNbIGtleSBdID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0ZWRnZXNbIGtleSBdID0geyBpbmRleDE6IGVkZ2VbIDAgXSwgaW5kZXgyOiBlZGdlWyAxIF0sIGZhY2UxOiBpLCBmYWNlMjogdW5kZWZpbmVkIH07XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0ZWRnZXNbIGtleSBdLmZhY2UyID0gaTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH1cblxuXHQvLyBnZW5lcmF0ZSB2ZXJ0aWNlc1xuXG5cdGZvciAoIGtleSBpbiBlZGdlcyApIHtcblxuXHRcdHZhciBlID0gZWRnZXNbIGtleSBdO1xuXG5cdFx0Ly8gYW4gZWRnZSBpcyBvbmx5IHJlbmRlcmVkIGlmIHRoZSBhbmdsZSAoaW4gZGVncmVlcykgYmV0d2VlbiB0aGUgZmFjZSBub3JtYWxzIG9mIHRoZSBhZGpvaW5pbmcgZmFjZXMgZXhjZWVkcyB0aGlzIHZhbHVlLiBkZWZhdWx0ID0gMSBkZWdyZWUuXG5cblx0XHRpZiAoIGUuZmFjZTIgPT09IHVuZGVmaW5lZCB8fCBmYWNlc1sgZS5mYWNlMSBdLm5vcm1hbC5kb3QoIGZhY2VzWyBlLmZhY2UyIF0ubm9ybWFsICkgPD0gdGhyZXNob2xkRG90ICkge1xuXG5cdFx0XHR2YXIgdmVydGV4ID0gc291cmNlVmVydGljZXNbIGUuaW5kZXgxIF07XG5cdFx0XHR2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7XG5cblx0XHRcdHZlcnRleCA9IHNvdXJjZVZlcnRpY2VzWyBlLmluZGV4MiBdO1xuXHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHQvLyBidWlsZCBnZW9tZXRyeVxuXG5cdHRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xuXG59XG5cbkVkZ2VzR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7XG5FZGdlc0dlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEVkZ2VzR2VvbWV0cnk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKi9cblxuLy8gQ3lsaW5kZXJHZW9tZXRyeVxuXG5mdW5jdGlvbiBDeWxpbmRlckdlb21ldHJ5KCByYWRpdXNUb3AsIHJhZGl1c0JvdHRvbSwgaGVpZ2h0LCByYWRpYWxTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIG9wZW5FbmRlZCwgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKSB7XG5cblx0R2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdDeWxpbmRlckdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0cmFkaXVzVG9wOiByYWRpdXNUb3AsXG5cdFx0cmFkaXVzQm90dG9tOiByYWRpdXNCb3R0b20sXG5cdFx0aGVpZ2h0OiBoZWlnaHQsXG5cdFx0cmFkaWFsU2VnbWVudHM6IHJhZGlhbFNlZ21lbnRzLFxuXHRcdGhlaWdodFNlZ21lbnRzOiBoZWlnaHRTZWdtZW50cyxcblx0XHRvcGVuRW5kZWQ6IG9wZW5FbmRlZCxcblx0XHR0aGV0YVN0YXJ0OiB0aGV0YVN0YXJ0LFxuXHRcdHRoZXRhTGVuZ3RoOiB0aGV0YUxlbmd0aFxuXHR9O1xuXG5cdHRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgQ3lsaW5kZXJCdWZmZXJHZW9tZXRyeSggcmFkaXVzVG9wLCByYWRpdXNCb3R0b20sIGhlaWdodCwgcmFkaWFsU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzLCBvcGVuRW5kZWQsIHRoZXRhU3RhcnQsIHRoZXRhTGVuZ3RoICkgKTtcblx0dGhpcy5tZXJnZVZlcnRpY2VzKCk7XG5cbn1cblxuQ3lsaW5kZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBHZW9tZXRyeS5wcm90b3R5cGUgKTtcbkN5bGluZGVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ3lsaW5kZXJHZW9tZXRyeTtcblxuLy8gQ3lsaW5kZXJCdWZmZXJHZW9tZXRyeVxuXG5mdW5jdGlvbiBDeWxpbmRlckJ1ZmZlckdlb21ldHJ5KCByYWRpdXNUb3AsIHJhZGl1c0JvdHRvbSwgaGVpZ2h0LCByYWRpYWxTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIG9wZW5FbmRlZCwgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKSB7XG5cblx0QnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdDeWxpbmRlckJ1ZmZlckdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0cmFkaXVzVG9wOiByYWRpdXNUb3AsXG5cdFx0cmFkaXVzQm90dG9tOiByYWRpdXNCb3R0b20sXG5cdFx0aGVpZ2h0OiBoZWlnaHQsXG5cdFx0cmFkaWFsU2VnbWVudHM6IHJhZGlhbFNlZ21lbnRzLFxuXHRcdGhlaWdodFNlZ21lbnRzOiBoZWlnaHRTZWdtZW50cyxcblx0XHRvcGVuRW5kZWQ6IG9wZW5FbmRlZCxcblx0XHR0aGV0YVN0YXJ0OiB0aGV0YVN0YXJ0LFxuXHRcdHRoZXRhTGVuZ3RoOiB0aGV0YUxlbmd0aFxuXHR9O1xuXG5cdHZhciBzY29wZSA9IHRoaXM7XG5cblx0cmFkaXVzVG9wID0gcmFkaXVzVG9wICE9PSB1bmRlZmluZWQgPyByYWRpdXNUb3AgOiAxO1xuXHRyYWRpdXNCb3R0b20gPSByYWRpdXNCb3R0b20gIT09IHVuZGVmaW5lZCA/IHJhZGl1c0JvdHRvbSA6IDE7XG5cdGhlaWdodCA9IGhlaWdodCB8fCAxO1xuXG5cdHJhZGlhbFNlZ21lbnRzID0gTWF0aC5mbG9vciggcmFkaWFsU2VnbWVudHMgKSB8fCA4O1xuXHRoZWlnaHRTZWdtZW50cyA9IE1hdGguZmxvb3IoIGhlaWdodFNlZ21lbnRzICkgfHwgMTtcblxuXHRvcGVuRW5kZWQgPSBvcGVuRW5kZWQgIT09IHVuZGVmaW5lZCA/IG9wZW5FbmRlZCA6IGZhbHNlO1xuXHR0aGV0YVN0YXJ0ID0gdGhldGFTdGFydCAhPT0gdW5kZWZpbmVkID8gdGhldGFTdGFydCA6IDAuMDtcblx0dGhldGFMZW5ndGggPSB0aGV0YUxlbmd0aCAhPT0gdW5kZWZpbmVkID8gdGhldGFMZW5ndGggOiBNYXRoLlBJICogMjtcblxuXHQvLyBidWZmZXJzXG5cblx0dmFyIGluZGljZXMgPSBbXTtcblx0dmFyIHZlcnRpY2VzID0gW107XG5cdHZhciBub3JtYWxzID0gW107XG5cdHZhciB1dnMgPSBbXTtcblxuXHQvLyBoZWxwZXIgdmFyaWFibGVzXG5cblx0dmFyIGluZGV4ID0gMDtcblx0dmFyIGluZGV4QXJyYXkgPSBbXTtcblx0dmFyIGhhbGZIZWlnaHQgPSBoZWlnaHQgLyAyO1xuXHR2YXIgZ3JvdXBTdGFydCA9IDA7XG5cblx0Ly8gZ2VuZXJhdGUgZ2VvbWV0cnlcblxuXHRnZW5lcmF0ZVRvcnNvKCk7XG5cblx0aWYgKCBvcGVuRW5kZWQgPT09IGZhbHNlICkge1xuXG5cdFx0aWYgKCByYWRpdXNUb3AgPiAwICkgZ2VuZXJhdGVDYXAoIHRydWUgKTtcblx0XHRpZiAoIHJhZGl1c0JvdHRvbSA+IDAgKSBnZW5lcmF0ZUNhcCggZmFsc2UgKTtcblxuXHR9XG5cblx0Ly8gYnVpbGQgZ2VvbWV0cnlcblxuXHR0aGlzLnNldEluZGV4KCBpbmRpY2VzICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ25vcm1hbCcsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBub3JtYWxzLCAzICkgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICd1dicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB1dnMsIDIgKSApO1xuXG5cdGZ1bmN0aW9uIGdlbmVyYXRlVG9yc28oKSB7XG5cblx0XHR2YXIgeCwgeTtcblx0XHR2YXIgbm9ybWFsID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgdmVydGV4ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHZhciBncm91cENvdW50ID0gMDtcblxuXHRcdC8vIHRoaXMgd2lsbCBiZSB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgbm9ybWFsXG5cdFx0dmFyIHNsb3BlID0gKCByYWRpdXNCb3R0b20gLSByYWRpdXNUb3AgKSAvIGhlaWdodDtcblxuXHRcdC8vIGdlbmVyYXRlIHZlcnRpY2VzLCBub3JtYWxzIGFuZCB1dnNcblxuXHRcdGZvciAoIHkgPSAwOyB5IDw9IGhlaWdodFNlZ21lbnRzOyB5ICsrICkge1xuXG5cdFx0XHR2YXIgaW5kZXhSb3cgPSBbXTtcblxuXHRcdFx0dmFyIHYgPSB5IC8gaGVpZ2h0U2VnbWVudHM7XG5cblx0XHRcdC8vIGNhbGN1bGF0ZSB0aGUgcmFkaXVzIG9mIHRoZSBjdXJyZW50IHJvd1xuXG5cdFx0XHR2YXIgcmFkaXVzID0gdiAqICggcmFkaXVzQm90dG9tIC0gcmFkaXVzVG9wICkgKyByYWRpdXNUb3A7XG5cblx0XHRcdGZvciAoIHggPSAwOyB4IDw9IHJhZGlhbFNlZ21lbnRzOyB4ICsrICkge1xuXG5cdFx0XHRcdHZhciB1ID0geCAvIHJhZGlhbFNlZ21lbnRzO1xuXG5cdFx0XHRcdHZhciB0aGV0YSA9IHUgKiB0aGV0YUxlbmd0aCArIHRoZXRhU3RhcnQ7XG5cblx0XHRcdFx0dmFyIHNpblRoZXRhID0gTWF0aC5zaW4oIHRoZXRhICk7XG5cdFx0XHRcdHZhciBjb3NUaGV0YSA9IE1hdGguY29zKCB0aGV0YSApO1xuXG5cdFx0XHRcdC8vIHZlcnRleFxuXG5cdFx0XHRcdHZlcnRleC54ID0gcmFkaXVzICogc2luVGhldGE7XG5cdFx0XHRcdHZlcnRleC55ID0gLSB2ICogaGVpZ2h0ICsgaGFsZkhlaWdodDtcblx0XHRcdFx0dmVydGV4LnogPSByYWRpdXMgKiBjb3NUaGV0YTtcblx0XHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0XHRcdC8vIG5vcm1hbFxuXG5cdFx0XHRcdG5vcm1hbC5zZXQoIHNpblRoZXRhLCBzbG9wZSwgY29zVGhldGEgKS5ub3JtYWxpemUoKTtcblx0XHRcdFx0bm9ybWFscy5wdXNoKCBub3JtYWwueCwgbm9ybWFsLnksIG5vcm1hbC56ICk7XG5cblx0XHRcdFx0Ly8gdXZcblxuXHRcdFx0XHR1dnMucHVzaCggdSwgMSAtIHYgKTtcblxuXHRcdFx0XHQvLyBzYXZlIGluZGV4IG9mIHZlcnRleCBpbiByZXNwZWN0aXZlIHJvd1xuXG5cdFx0XHRcdGluZGV4Um93LnB1c2goIGluZGV4ICsrICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gbm93IHNhdmUgdmVydGljZXMgb2YgdGhlIHJvdyBpbiBvdXIgaW5kZXggYXJyYXlcblxuXHRcdFx0aW5kZXhBcnJheS5wdXNoKCBpbmRleFJvdyApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gZ2VuZXJhdGUgaW5kaWNlc1xuXG5cdFx0Zm9yICggeCA9IDA7IHggPCByYWRpYWxTZWdtZW50czsgeCArKyApIHtcblxuXHRcdFx0Zm9yICggeSA9IDA7IHkgPCBoZWlnaHRTZWdtZW50czsgeSArKyApIHtcblxuXHRcdFx0XHQvLyB3ZSB1c2UgdGhlIGluZGV4IGFycmF5IHRvIGFjY2VzcyB0aGUgY29ycmVjdCBpbmRpY2VzXG5cblx0XHRcdFx0dmFyIGEgPSBpbmRleEFycmF5WyB5IF1bIHggXTtcblx0XHRcdFx0dmFyIGIgPSBpbmRleEFycmF5WyB5ICsgMSBdWyB4IF07XG5cdFx0XHRcdHZhciBjID0gaW5kZXhBcnJheVsgeSArIDEgXVsgeCArIDEgXTtcblx0XHRcdFx0dmFyIGQgPSBpbmRleEFycmF5WyB5IF1bIHggKyAxIF07XG5cblx0XHRcdFx0Ly8gZmFjZXNcblxuXHRcdFx0XHRpbmRpY2VzLnB1c2goIGEsIGIsIGQgKTtcblx0XHRcdFx0aW5kaWNlcy5wdXNoKCBiLCBjLCBkICk7XG5cblx0XHRcdFx0Ly8gdXBkYXRlIGdyb3VwIGNvdW50ZXJcblxuXHRcdFx0XHRncm91cENvdW50ICs9IDY7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIGFkZCBhIGdyb3VwIHRvIHRoZSBnZW9tZXRyeS4gdGhpcyB3aWxsIGVuc3VyZSBtdWx0aSBtYXRlcmlhbCBzdXBwb3J0XG5cblx0XHRzY29wZS5hZGRHcm91cCggZ3JvdXBTdGFydCwgZ3JvdXBDb3VudCwgMCApO1xuXG5cdFx0Ly8gY2FsY3VsYXRlIG5ldyBzdGFydCB2YWx1ZSBmb3IgZ3JvdXBzXG5cblx0XHRncm91cFN0YXJ0ICs9IGdyb3VwQ291bnQ7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGdlbmVyYXRlQ2FwKCB0b3AgKSB7XG5cblx0XHR2YXIgeCwgY2VudGVySW5kZXhTdGFydCwgY2VudGVySW5kZXhFbmQ7XG5cblx0XHR2YXIgdXYgPSBuZXcgVmVjdG9yMigpO1xuXHRcdHZhciB2ZXJ0ZXggPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0dmFyIGdyb3VwQ291bnQgPSAwO1xuXG5cdFx0dmFyIHJhZGl1cyA9ICggdG9wID09PSB0cnVlICkgPyByYWRpdXNUb3AgOiByYWRpdXNCb3R0b207XG5cdFx0dmFyIHNpZ24gPSAoIHRvcCA9PT0gdHJ1ZSApID8gMSA6IC0gMTtcblxuXHRcdC8vIHNhdmUgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBjZW50ZXIgdmVydGV4XG5cdFx0Y2VudGVySW5kZXhTdGFydCA9IGluZGV4O1xuXG5cdFx0Ly8gZmlyc3Qgd2UgZ2VuZXJhdGUgdGhlIGNlbnRlciB2ZXJ0ZXggZGF0YSBvZiB0aGUgY2FwLlxuXHRcdC8vIGJlY2F1c2UgdGhlIGdlb21ldHJ5IG5lZWRzIG9uZSBzZXQgb2YgdXZzIHBlciBmYWNlLFxuXHRcdC8vIHdlIG11c3QgZ2VuZXJhdGUgYSBjZW50ZXIgdmVydGV4IHBlciBmYWNlL3NlZ21lbnRcblxuXHRcdGZvciAoIHggPSAxOyB4IDw9IHJhZGlhbFNlZ21lbnRzOyB4ICsrICkge1xuXG5cdFx0XHQvLyB2ZXJ0ZXhcblxuXHRcdFx0dmVydGljZXMucHVzaCggMCwgaGFsZkhlaWdodCAqIHNpZ24sIDAgKTtcblxuXHRcdFx0Ly8gbm9ybWFsXG5cblx0XHRcdG5vcm1hbHMucHVzaCggMCwgc2lnbiwgMCApO1xuXG5cdFx0XHQvLyB1dlxuXG5cdFx0XHR1dnMucHVzaCggMC41LCAwLjUgKTtcblxuXHRcdFx0Ly8gaW5jcmVhc2UgaW5kZXhcblxuXHRcdFx0aW5kZXggKys7XG5cblx0XHR9XG5cblx0XHQvLyBzYXZlIHRoZSBpbmRleCBvZiB0aGUgbGFzdCBjZW50ZXIgdmVydGV4XG5cblx0XHRjZW50ZXJJbmRleEVuZCA9IGluZGV4O1xuXG5cdFx0Ly8gbm93IHdlIGdlbmVyYXRlIHRoZSBzdXJyb3VuZGluZyB2ZXJ0aWNlcywgbm9ybWFscyBhbmQgdXZzXG5cblx0XHRmb3IgKCB4ID0gMDsgeCA8PSByYWRpYWxTZWdtZW50czsgeCArKyApIHtcblxuXHRcdFx0dmFyIHUgPSB4IC8gcmFkaWFsU2VnbWVudHM7XG5cdFx0XHR2YXIgdGhldGEgPSB1ICogdGhldGFMZW5ndGggKyB0aGV0YVN0YXJ0O1xuXG5cdFx0XHR2YXIgY29zVGhldGEgPSBNYXRoLmNvcyggdGhldGEgKTtcblx0XHRcdHZhciBzaW5UaGV0YSA9IE1hdGguc2luKCB0aGV0YSApO1xuXG5cdFx0XHQvLyB2ZXJ0ZXhcblxuXHRcdFx0dmVydGV4LnggPSByYWRpdXMgKiBzaW5UaGV0YTtcblx0XHRcdHZlcnRleC55ID0gaGFsZkhlaWdodCAqIHNpZ247XG5cdFx0XHR2ZXJ0ZXgueiA9IHJhZGl1cyAqIGNvc1RoZXRhO1xuXHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0XHQvLyBub3JtYWxcblxuXHRcdFx0bm9ybWFscy5wdXNoKCAwLCBzaWduLCAwICk7XG5cblx0XHRcdC8vIHV2XG5cblx0XHRcdHV2LnggPSAoIGNvc1RoZXRhICogMC41ICkgKyAwLjU7XG5cdFx0XHR1di55ID0gKCBzaW5UaGV0YSAqIDAuNSAqIHNpZ24gKSArIDAuNTtcblx0XHRcdHV2cy5wdXNoKCB1di54LCB1di55ICk7XG5cblx0XHRcdC8vIGluY3JlYXNlIGluZGV4XG5cblx0XHRcdGluZGV4ICsrO1xuXG5cdFx0fVxuXG5cdFx0Ly8gZ2VuZXJhdGUgaW5kaWNlc1xuXG5cdFx0Zm9yICggeCA9IDA7IHggPCByYWRpYWxTZWdtZW50czsgeCArKyApIHtcblxuXHRcdFx0dmFyIGMgPSBjZW50ZXJJbmRleFN0YXJ0ICsgeDtcblx0XHRcdHZhciBpID0gY2VudGVySW5kZXhFbmQgKyB4O1xuXG5cdFx0XHRpZiAoIHRvcCA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0XHQvLyBmYWNlIHRvcFxuXG5cdFx0XHRcdGluZGljZXMucHVzaCggaSwgaSArIDEsIGMgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyBmYWNlIGJvdHRvbVxuXG5cdFx0XHRcdGluZGljZXMucHVzaCggaSArIDEsIGksIGMgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRncm91cENvdW50ICs9IDM7XG5cblx0XHR9XG5cblx0XHQvLyBhZGQgYSBncm91cCB0byB0aGUgZ2VvbWV0cnkuIHRoaXMgd2lsbCBlbnN1cmUgbXVsdGkgbWF0ZXJpYWwgc3VwcG9ydFxuXG5cdFx0c2NvcGUuYWRkR3JvdXAoIGdyb3VwU3RhcnQsIGdyb3VwQ291bnQsIHRvcCA9PT0gdHJ1ZSA/IDEgOiAyICk7XG5cblx0XHQvLyBjYWxjdWxhdGUgbmV3IHN0YXJ0IHZhbHVlIGZvciBncm91cHNcblxuXHRcdGdyb3VwU3RhcnQgKz0gZ3JvdXBDb3VudDtcblxuXHR9XG5cbn1cblxuQ3lsaW5kZXJCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTtcbkN5bGluZGVyQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ3lsaW5kZXJCdWZmZXJHZW9tZXRyeTtcblxuLyoqXG4gKiBAYXV0aG9yIGFiZWxuYXRpb24gLyBodHRwOi8vZ2l0aHViLmNvbS9hYmVsbmF0aW9uXG4gKi9cblxuLy8gQ29uZUdlb21ldHJ5XG5cbmZ1bmN0aW9uIENvbmVHZW9tZXRyeSggcmFkaXVzLCBoZWlnaHQsIHJhZGlhbFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgb3BlbkVuZGVkLCB0aGV0YVN0YXJ0LCB0aGV0YUxlbmd0aCApIHtcblxuXHRDeWxpbmRlckdlb21ldHJ5LmNhbGwoIHRoaXMsIDAsIHJhZGl1cywgaGVpZ2h0LCByYWRpYWxTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIG9wZW5FbmRlZCwgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKTtcblxuXHR0aGlzLnR5cGUgPSAnQ29uZUdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0cmFkaXVzOiByYWRpdXMsXG5cdFx0aGVpZ2h0OiBoZWlnaHQsXG5cdFx0cmFkaWFsU2VnbWVudHM6IHJhZGlhbFNlZ21lbnRzLFxuXHRcdGhlaWdodFNlZ21lbnRzOiBoZWlnaHRTZWdtZW50cyxcblx0XHRvcGVuRW5kZWQ6IG9wZW5FbmRlZCxcblx0XHR0aGV0YVN0YXJ0OiB0aGV0YVN0YXJ0LFxuXHRcdHRoZXRhTGVuZ3RoOiB0aGV0YUxlbmd0aFxuXHR9O1xuXG59XG5cbkNvbmVHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDeWxpbmRlckdlb21ldHJ5LnByb3RvdHlwZSApO1xuQ29uZUdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IENvbmVHZW9tZXRyeTtcblxuLy8gQ29uZUJ1ZmZlckdlb21ldHJ5XG5cbmZ1bmN0aW9uIENvbmVCdWZmZXJHZW9tZXRyeSggcmFkaXVzLCBoZWlnaHQsIHJhZGlhbFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgb3BlbkVuZGVkLCB0aGV0YVN0YXJ0LCB0aGV0YUxlbmd0aCApIHtcblxuXHRDeWxpbmRlckJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMsIDAsIHJhZGl1cywgaGVpZ2h0LCByYWRpYWxTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIG9wZW5FbmRlZCwgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKTtcblxuXHR0aGlzLnR5cGUgPSAnQ29uZUJ1ZmZlckdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0cmFkaXVzOiByYWRpdXMsXG5cdFx0aGVpZ2h0OiBoZWlnaHQsXG5cdFx0cmFkaWFsU2VnbWVudHM6IHJhZGlhbFNlZ21lbnRzLFxuXHRcdGhlaWdodFNlZ21lbnRzOiBoZWlnaHRTZWdtZW50cyxcblx0XHRvcGVuRW5kZWQ6IG9wZW5FbmRlZCxcblx0XHR0aGV0YVN0YXJ0OiB0aGV0YVN0YXJ0LFxuXHRcdHRoZXRhTGVuZ3RoOiB0aGV0YUxlbmd0aFxuXHR9O1xuXG59XG5cbkNvbmVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDeWxpbmRlckJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApO1xuQ29uZUJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IENvbmVCdWZmZXJHZW9tZXRyeTtcblxuLyoqXG4gKiBAYXV0aG9yIGJlbmFhZGFtcyAvIGh0dHBzOi8vdHdpdHRlci5jb20vYmVuX2FfYWRhbXNcbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKiBAYXV0aG9yIGh1Z2hlc1xuICovXG5cbi8vIENpcmNsZUdlb21ldHJ5XG5cbmZ1bmN0aW9uIENpcmNsZUdlb21ldHJ5KCByYWRpdXMsIHNlZ21lbnRzLCB0aGV0YVN0YXJ0LCB0aGV0YUxlbmd0aCApIHtcblxuXHRHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0NpcmNsZUdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0cmFkaXVzOiByYWRpdXMsXG5cdFx0c2VnbWVudHM6IHNlZ21lbnRzLFxuXHRcdHRoZXRhU3RhcnQ6IHRoZXRhU3RhcnQsXG5cdFx0dGhldGFMZW5ndGg6IHRoZXRhTGVuZ3RoXG5cdH07XG5cblx0dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIG5ldyBDaXJjbGVCdWZmZXJHZW9tZXRyeSggcmFkaXVzLCBzZWdtZW50cywgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKSApO1xuXHR0aGlzLm1lcmdlVmVydGljZXMoKTtcblxufVxuXG5DaXJjbGVHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBHZW9tZXRyeS5wcm90b3R5cGUgKTtcbkNpcmNsZUdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IENpcmNsZUdlb21ldHJ5O1xuXG4vLyBDaXJjbGVCdWZmZXJHZW9tZXRyeVxuXG5mdW5jdGlvbiBDaXJjbGVCdWZmZXJHZW9tZXRyeSggcmFkaXVzLCBzZWdtZW50cywgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKSB7XG5cblx0QnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdDaXJjbGVCdWZmZXJHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHJhZGl1czogcmFkaXVzLFxuXHRcdHNlZ21lbnRzOiBzZWdtZW50cyxcblx0XHR0aGV0YVN0YXJ0OiB0aGV0YVN0YXJ0LFxuXHRcdHRoZXRhTGVuZ3RoOiB0aGV0YUxlbmd0aFxuXHR9O1xuXG5cdHJhZGl1cyA9IHJhZGl1cyB8fCAxO1xuXHRzZWdtZW50cyA9IHNlZ21lbnRzICE9PSB1bmRlZmluZWQgPyBNYXRoLm1heCggMywgc2VnbWVudHMgKSA6IDg7XG5cblx0dGhldGFTdGFydCA9IHRoZXRhU3RhcnQgIT09IHVuZGVmaW5lZCA/IHRoZXRhU3RhcnQgOiAwO1xuXHR0aGV0YUxlbmd0aCA9IHRoZXRhTGVuZ3RoICE9PSB1bmRlZmluZWQgPyB0aGV0YUxlbmd0aCA6IE1hdGguUEkgKiAyO1xuXG5cdC8vIGJ1ZmZlcnNcblxuXHR2YXIgaW5kaWNlcyA9IFtdO1xuXHR2YXIgdmVydGljZXMgPSBbXTtcblx0dmFyIG5vcm1hbHMgPSBbXTtcblx0dmFyIHV2cyA9IFtdO1xuXG5cdC8vIGhlbHBlciB2YXJpYWJsZXNcblxuXHR2YXIgaSwgcztcblx0dmFyIHZlcnRleCA9IG5ldyBWZWN0b3IzKCk7XG5cdHZhciB1diA9IG5ldyBWZWN0b3IyKCk7XG5cblx0Ly8gY2VudGVyIHBvaW50XG5cblx0dmVydGljZXMucHVzaCggMCwgMCwgMCApO1xuXHRub3JtYWxzLnB1c2goIDAsIDAsIDEgKTtcblx0dXZzLnB1c2goIDAuNSwgMC41ICk7XG5cblx0Zm9yICggcyA9IDAsIGkgPSAzOyBzIDw9IHNlZ21lbnRzOyBzICsrLCBpICs9IDMgKSB7XG5cblx0XHR2YXIgc2VnbWVudCA9IHRoZXRhU3RhcnQgKyBzIC8gc2VnbWVudHMgKiB0aGV0YUxlbmd0aDtcblxuXHRcdC8vIHZlcnRleFxuXG5cdFx0dmVydGV4LnggPSByYWRpdXMgKiBNYXRoLmNvcyggc2VnbWVudCApO1xuXHRcdHZlcnRleC55ID0gcmFkaXVzICogTWF0aC5zaW4oIHNlZ21lbnQgKTtcblxuXHRcdHZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTtcblxuXHRcdC8vIG5vcm1hbFxuXG5cdFx0bm9ybWFscy5wdXNoKCAwLCAwLCAxICk7XG5cblx0XHQvLyB1dnNcblxuXHRcdHV2LnggPSAoIHZlcnRpY2VzWyBpIF0gLyByYWRpdXMgKyAxICkgLyAyO1xuXHRcdHV2LnkgPSAoIHZlcnRpY2VzWyBpICsgMSBdIC8gcmFkaXVzICsgMSApIC8gMjtcblxuXHRcdHV2cy5wdXNoKCB1di54LCB1di55ICk7XG5cblx0fVxuXG5cdC8vIGluZGljZXNcblxuXHRmb3IgKCBpID0gMTsgaSA8PSBzZWdtZW50czsgaSArKyApIHtcblxuXHRcdGluZGljZXMucHVzaCggaSwgaSArIDEsIDAgKTtcblxuXHR9XG5cblx0Ly8gYnVpbGQgZ2VvbWV0cnlcblxuXHR0aGlzLnNldEluZGV4KCBpbmRpY2VzICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ25vcm1hbCcsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBub3JtYWxzLCAzICkgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICd1dicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB1dnMsIDIgKSApO1xuXG59XG5cbkNpcmNsZUJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApO1xuQ2lyY2xlQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ2lyY2xlQnVmZmVyR2VvbWV0cnk7XG5cblxuXG52YXIgR2VvbWV0cmllcyA9IE9iamVjdC5mcmVlemUoe1xuXHRXaXJlZnJhbWVHZW9tZXRyeTogV2lyZWZyYW1lR2VvbWV0cnksXG5cdFBhcmFtZXRyaWNHZW9tZXRyeTogUGFyYW1ldHJpY0dlb21ldHJ5LFxuXHRQYXJhbWV0cmljQnVmZmVyR2VvbWV0cnk6IFBhcmFtZXRyaWNCdWZmZXJHZW9tZXRyeSxcblx0VGV0cmFoZWRyb25HZW9tZXRyeTogVGV0cmFoZWRyb25HZW9tZXRyeSxcblx0VGV0cmFoZWRyb25CdWZmZXJHZW9tZXRyeTogVGV0cmFoZWRyb25CdWZmZXJHZW9tZXRyeSxcblx0T2N0YWhlZHJvbkdlb21ldHJ5OiBPY3RhaGVkcm9uR2VvbWV0cnksXG5cdE9jdGFoZWRyb25CdWZmZXJHZW9tZXRyeTogT2N0YWhlZHJvbkJ1ZmZlckdlb21ldHJ5LFxuXHRJY29zYWhlZHJvbkdlb21ldHJ5OiBJY29zYWhlZHJvbkdlb21ldHJ5LFxuXHRJY29zYWhlZHJvbkJ1ZmZlckdlb21ldHJ5OiBJY29zYWhlZHJvbkJ1ZmZlckdlb21ldHJ5LFxuXHREb2RlY2FoZWRyb25HZW9tZXRyeTogRG9kZWNhaGVkcm9uR2VvbWV0cnksXG5cdERvZGVjYWhlZHJvbkJ1ZmZlckdlb21ldHJ5OiBEb2RlY2FoZWRyb25CdWZmZXJHZW9tZXRyeSxcblx0UG9seWhlZHJvbkdlb21ldHJ5OiBQb2x5aGVkcm9uR2VvbWV0cnksXG5cdFBvbHloZWRyb25CdWZmZXJHZW9tZXRyeTogUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5LFxuXHRUdWJlR2VvbWV0cnk6IFR1YmVHZW9tZXRyeSxcblx0VHViZUJ1ZmZlckdlb21ldHJ5OiBUdWJlQnVmZmVyR2VvbWV0cnksXG5cdFRvcnVzS25vdEdlb21ldHJ5OiBUb3J1c0tub3RHZW9tZXRyeSxcblx0VG9ydXNLbm90QnVmZmVyR2VvbWV0cnk6IFRvcnVzS25vdEJ1ZmZlckdlb21ldHJ5LFxuXHRUb3J1c0dlb21ldHJ5OiBUb3J1c0dlb21ldHJ5LFxuXHRUb3J1c0J1ZmZlckdlb21ldHJ5OiBUb3J1c0J1ZmZlckdlb21ldHJ5LFxuXHRUZXh0R2VvbWV0cnk6IFRleHRHZW9tZXRyeSxcblx0VGV4dEJ1ZmZlckdlb21ldHJ5OiBUZXh0QnVmZmVyR2VvbWV0cnksXG5cdFNwaGVyZUdlb21ldHJ5OiBTcGhlcmVHZW9tZXRyeSxcblx0U3BoZXJlQnVmZmVyR2VvbWV0cnk6IFNwaGVyZUJ1ZmZlckdlb21ldHJ5LFxuXHRSaW5nR2VvbWV0cnk6IFJpbmdHZW9tZXRyeSxcblx0UmluZ0J1ZmZlckdlb21ldHJ5OiBSaW5nQnVmZmVyR2VvbWV0cnksXG5cdFBsYW5lR2VvbWV0cnk6IFBsYW5lR2VvbWV0cnksXG5cdFBsYW5lQnVmZmVyR2VvbWV0cnk6IFBsYW5lQnVmZmVyR2VvbWV0cnksXG5cdExhdGhlR2VvbWV0cnk6IExhdGhlR2VvbWV0cnksXG5cdExhdGhlQnVmZmVyR2VvbWV0cnk6IExhdGhlQnVmZmVyR2VvbWV0cnksXG5cdFNoYXBlR2VvbWV0cnk6IFNoYXBlR2VvbWV0cnksXG5cdFNoYXBlQnVmZmVyR2VvbWV0cnk6IFNoYXBlQnVmZmVyR2VvbWV0cnksXG5cdEV4dHJ1ZGVHZW9tZXRyeTogRXh0cnVkZUdlb21ldHJ5LFxuXHRFeHRydWRlQnVmZmVyR2VvbWV0cnk6IEV4dHJ1ZGVCdWZmZXJHZW9tZXRyeSxcblx0RWRnZXNHZW9tZXRyeTogRWRnZXNHZW9tZXRyeSxcblx0Q29uZUdlb21ldHJ5OiBDb25lR2VvbWV0cnksXG5cdENvbmVCdWZmZXJHZW9tZXRyeTogQ29uZUJ1ZmZlckdlb21ldHJ5LFxuXHRDeWxpbmRlckdlb21ldHJ5OiBDeWxpbmRlckdlb21ldHJ5LFxuXHRDeWxpbmRlckJ1ZmZlckdlb21ldHJ5OiBDeWxpbmRlckJ1ZmZlckdlb21ldHJ5LFxuXHRDaXJjbGVHZW9tZXRyeTogQ2lyY2xlR2VvbWV0cnksXG5cdENpcmNsZUJ1ZmZlckdlb21ldHJ5OiBDaXJjbGVCdWZmZXJHZW9tZXRyeSxcblx0Qm94R2VvbWV0cnk6IEJveEdlb21ldHJ5LFxuXHRCb3hCdWZmZXJHZW9tZXRyeTogQm94QnVmZmVyR2VvbWV0cnlcbn0pO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKlxuICogcGFyYW1ldGVycyA9IHtcbiAqICBjb2xvcjogPFRIUkVFLkNvbG9yPlxuICogfVxuICovXG5cbmZ1bmN0aW9uIFNoYWRvd01hdGVyaWFsKCBwYXJhbWV0ZXJzICkge1xuXG5cdE1hdGVyaWFsLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnU2hhZG93TWF0ZXJpYWwnO1xuXG5cdHRoaXMuY29sb3IgPSBuZXcgQ29sb3IoIDB4MDAwMDAwICk7XG5cdHRoaXMudHJhbnNwYXJlbnQgPSB0cnVlO1xuXG5cdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XG5cbn1cblxuU2hhZG93TWF0ZXJpYWwucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTWF0ZXJpYWwucHJvdG90eXBlICk7XG5TaGFkb3dNYXRlcmlhbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBTaGFkb3dNYXRlcmlhbDtcblxuU2hhZG93TWF0ZXJpYWwucHJvdG90eXBlLmlzU2hhZG93TWF0ZXJpYWwgPSB0cnVlO1xuXG5TaGFkb3dNYXRlcmlhbC5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdHRoaXMuY29sb3IuY29weSggc291cmNlLmNvbG9yICk7XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBSYXdTaGFkZXJNYXRlcmlhbCggcGFyYW1ldGVycyApIHtcblxuXHRTaGFkZXJNYXRlcmlhbC5jYWxsKCB0aGlzLCBwYXJhbWV0ZXJzICk7XG5cblx0dGhpcy50eXBlID0gJ1Jhd1NoYWRlck1hdGVyaWFsJztcblxufVxuXG5SYXdTaGFkZXJNYXRlcmlhbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBTaGFkZXJNYXRlcmlhbC5wcm90b3R5cGUgKTtcblJhd1NoYWRlck1hdGVyaWFsLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFJhd1NoYWRlck1hdGVyaWFsO1xuXG5SYXdTaGFkZXJNYXRlcmlhbC5wcm90b3R5cGUuaXNSYXdTaGFkZXJNYXRlcmlhbCA9IHRydWU7XG5cbi8qKlxuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKlxuICogcGFyYW1ldGVycyA9IHtcbiAqICBjb2xvcjogPGhleD4sXG4gKiAgcm91Z2huZXNzOiA8ZmxvYXQ+LFxuICogIG1ldGFsbmVzczogPGZsb2F0PixcbiAqICBvcGFjaXR5OiA8ZmxvYXQ+LFxuICpcbiAqICBtYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIGxpZ2h0TWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGxpZ2h0TWFwSW50ZW5zaXR5OiA8ZmxvYXQ+XG4gKlxuICogIGFvTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGFvTWFwSW50ZW5zaXR5OiA8ZmxvYXQ+XG4gKlxuICogIGVtaXNzaXZlOiA8aGV4PixcbiAqICBlbWlzc2l2ZUludGVuc2l0eTogPGZsb2F0PlxuICogIGVtaXNzaXZlTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBidW1wTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGJ1bXBTY2FsZTogPGZsb2F0PixcbiAqXG4gKiAgbm9ybWFsTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIG5vcm1hbFNjYWxlOiA8VmVjdG9yMj4sXG4gKlxuICogIGRpc3BsYWNlbWVudE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBkaXNwbGFjZW1lbnRTY2FsZTogPGZsb2F0PixcbiAqICBkaXNwbGFjZW1lbnRCaWFzOiA8ZmxvYXQ+LFxuICpcbiAqICByb3VnaG5lc3NNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIG1ldGFsbmVzc01hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgYWxwaGFNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIGVudk1hcDogbmV3IFRIUkVFLkN1YmVUZXh0dXJlKCBbcG9zeCwgbmVneCwgcG9zeSwgbmVneSwgcG9zeiwgbmVnel0gKSxcbiAqICBlbnZNYXBJbnRlbnNpdHk6IDxmbG9hdD5cbiAqXG4gKiAgcmVmcmFjdGlvblJhdGlvOiA8ZmxvYXQ+LFxuICpcbiAqICB3aXJlZnJhbWU6IDxib29sZWFuPixcbiAqICB3aXJlZnJhbWVMaW5ld2lkdGg6IDxmbG9hdD4sXG4gKlxuICogIHNraW5uaW5nOiA8Ym9vbD4sXG4gKiAgbW9ycGhUYXJnZXRzOiA8Ym9vbD4sXG4gKiAgbW9ycGhOb3JtYWxzOiA8Ym9vbD5cbiAqIH1cbiAqL1xuXG5mdW5jdGlvbiBNZXNoU3RhbmRhcmRNYXRlcmlhbCggcGFyYW1ldGVycyApIHtcblxuXHRNYXRlcmlhbC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy5kZWZpbmVzID0geyAnU1RBTkRBUkQnOiAnJyB9O1xuXG5cdHRoaXMudHlwZSA9ICdNZXNoU3RhbmRhcmRNYXRlcmlhbCc7XG5cblx0dGhpcy5jb2xvciA9IG5ldyBDb2xvciggMHhmZmZmZmYgKTsgLy8gZGlmZnVzZVxuXHR0aGlzLnJvdWdobmVzcyA9IDAuNTtcblx0dGhpcy5tZXRhbG5lc3MgPSAwLjU7XG5cblx0dGhpcy5tYXAgPSBudWxsO1xuXG5cdHRoaXMubGlnaHRNYXAgPSBudWxsO1xuXHR0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5ID0gMS4wO1xuXG5cdHRoaXMuYW9NYXAgPSBudWxsO1xuXHR0aGlzLmFvTWFwSW50ZW5zaXR5ID0gMS4wO1xuXG5cdHRoaXMuZW1pc3NpdmUgPSBuZXcgQ29sb3IoIDB4MDAwMDAwICk7XG5cdHRoaXMuZW1pc3NpdmVJbnRlbnNpdHkgPSAxLjA7XG5cdHRoaXMuZW1pc3NpdmVNYXAgPSBudWxsO1xuXG5cdHRoaXMuYnVtcE1hcCA9IG51bGw7XG5cdHRoaXMuYnVtcFNjYWxlID0gMTtcblxuXHR0aGlzLm5vcm1hbE1hcCA9IG51bGw7XG5cdHRoaXMubm9ybWFsU2NhbGUgPSBuZXcgVmVjdG9yMiggMSwgMSApO1xuXG5cdHRoaXMuZGlzcGxhY2VtZW50TWFwID0gbnVsbDtcblx0dGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IDE7XG5cdHRoaXMuZGlzcGxhY2VtZW50QmlhcyA9IDA7XG5cblx0dGhpcy5yb3VnaG5lc3NNYXAgPSBudWxsO1xuXG5cdHRoaXMubWV0YWxuZXNzTWFwID0gbnVsbDtcblxuXHR0aGlzLmFscGhhTWFwID0gbnVsbDtcblxuXHR0aGlzLmVudk1hcCA9IG51bGw7XG5cdHRoaXMuZW52TWFwSW50ZW5zaXR5ID0gMS4wO1xuXG5cdHRoaXMucmVmcmFjdGlvblJhdGlvID0gMC45ODtcblxuXHR0aGlzLndpcmVmcmFtZSA9IGZhbHNlO1xuXHR0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IDE7XG5cdHRoaXMud2lyZWZyYW1lTGluZWNhcCA9ICdyb3VuZCc7XG5cdHRoaXMud2lyZWZyYW1lTGluZWpvaW4gPSAncm91bmQnO1xuXG5cdHRoaXMuc2tpbm5pbmcgPSBmYWxzZTtcblx0dGhpcy5tb3JwaFRhcmdldHMgPSBmYWxzZTtcblx0dGhpcy5tb3JwaE5vcm1hbHMgPSBmYWxzZTtcblxuXHR0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApO1xuXG59XG5cbk1lc2hTdGFuZGFyZE1hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE1hdGVyaWFsLnByb3RvdHlwZSApO1xuTWVzaFN0YW5kYXJkTWF0ZXJpYWwucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTWVzaFN0YW5kYXJkTWF0ZXJpYWw7XG5cbk1lc2hTdGFuZGFyZE1hdGVyaWFsLnByb3RvdHlwZS5pc01lc2hTdGFuZGFyZE1hdGVyaWFsID0gdHJ1ZTtcblxuTWVzaFN0YW5kYXJkTWF0ZXJpYWwucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRNYXRlcmlhbC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHR0aGlzLmRlZmluZXMgPSB7ICdTVEFOREFSRCc6ICcnIH07XG5cblx0dGhpcy5jb2xvci5jb3B5KCBzb3VyY2UuY29sb3IgKTtcblx0dGhpcy5yb3VnaG5lc3MgPSBzb3VyY2Uucm91Z2huZXNzO1xuXHR0aGlzLm1ldGFsbmVzcyA9IHNvdXJjZS5tZXRhbG5lc3M7XG5cblx0dGhpcy5tYXAgPSBzb3VyY2UubWFwO1xuXG5cdHRoaXMubGlnaHRNYXAgPSBzb3VyY2UubGlnaHRNYXA7XG5cdHRoaXMubGlnaHRNYXBJbnRlbnNpdHkgPSBzb3VyY2UubGlnaHRNYXBJbnRlbnNpdHk7XG5cblx0dGhpcy5hb01hcCA9IHNvdXJjZS5hb01hcDtcblx0dGhpcy5hb01hcEludGVuc2l0eSA9IHNvdXJjZS5hb01hcEludGVuc2l0eTtcblxuXHR0aGlzLmVtaXNzaXZlLmNvcHkoIHNvdXJjZS5lbWlzc2l2ZSApO1xuXHR0aGlzLmVtaXNzaXZlTWFwID0gc291cmNlLmVtaXNzaXZlTWFwO1xuXHR0aGlzLmVtaXNzaXZlSW50ZW5zaXR5ID0gc291cmNlLmVtaXNzaXZlSW50ZW5zaXR5O1xuXG5cdHRoaXMuYnVtcE1hcCA9IHNvdXJjZS5idW1wTWFwO1xuXHR0aGlzLmJ1bXBTY2FsZSA9IHNvdXJjZS5idW1wU2NhbGU7XG5cblx0dGhpcy5ub3JtYWxNYXAgPSBzb3VyY2Uubm9ybWFsTWFwO1xuXHR0aGlzLm5vcm1hbFNjYWxlLmNvcHkoIHNvdXJjZS5ub3JtYWxTY2FsZSApO1xuXG5cdHRoaXMuZGlzcGxhY2VtZW50TWFwID0gc291cmNlLmRpc3BsYWNlbWVudE1hcDtcblx0dGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IHNvdXJjZS5kaXNwbGFjZW1lbnRTY2FsZTtcblx0dGhpcy5kaXNwbGFjZW1lbnRCaWFzID0gc291cmNlLmRpc3BsYWNlbWVudEJpYXM7XG5cblx0dGhpcy5yb3VnaG5lc3NNYXAgPSBzb3VyY2Uucm91Z2huZXNzTWFwO1xuXG5cdHRoaXMubWV0YWxuZXNzTWFwID0gc291cmNlLm1ldGFsbmVzc01hcDtcblxuXHR0aGlzLmFscGhhTWFwID0gc291cmNlLmFscGhhTWFwO1xuXG5cdHRoaXMuZW52TWFwID0gc291cmNlLmVudk1hcDtcblx0dGhpcy5lbnZNYXBJbnRlbnNpdHkgPSBzb3VyY2UuZW52TWFwSW50ZW5zaXR5O1xuXG5cdHRoaXMucmVmcmFjdGlvblJhdGlvID0gc291cmNlLnJlZnJhY3Rpb25SYXRpbztcblxuXHR0aGlzLndpcmVmcmFtZSA9IHNvdXJjZS53aXJlZnJhbWU7XG5cdHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gc291cmNlLndpcmVmcmFtZUxpbmV3aWR0aDtcblx0dGhpcy53aXJlZnJhbWVMaW5lY2FwID0gc291cmNlLndpcmVmcmFtZUxpbmVjYXA7XG5cdHRoaXMud2lyZWZyYW1lTGluZWpvaW4gPSBzb3VyY2Uud2lyZWZyYW1lTGluZWpvaW47XG5cblx0dGhpcy5za2lubmluZyA9IHNvdXJjZS5za2lubmluZztcblx0dGhpcy5tb3JwaFRhcmdldHMgPSBzb3VyY2UubW9ycGhUYXJnZXRzO1xuXHR0aGlzLm1vcnBoTm9ybWFscyA9IHNvdXJjZS5tb3JwaE5vcm1hbHM7XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKlxuICogcGFyYW1ldGVycyA9IHtcbiAqICByZWZsZWN0aXZpdHk6IDxmbG9hdD5cbiAqIH1cbiAqL1xuXG5mdW5jdGlvbiBNZXNoUGh5c2ljYWxNYXRlcmlhbCggcGFyYW1ldGVycyApIHtcblxuXHRNZXNoU3RhbmRhcmRNYXRlcmlhbC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy5kZWZpbmVzID0geyAnUEhZU0lDQUwnOiAnJyB9O1xuXG5cdHRoaXMudHlwZSA9ICdNZXNoUGh5c2ljYWxNYXRlcmlhbCc7XG5cblx0dGhpcy5yZWZsZWN0aXZpdHkgPSAwLjU7IC8vIG1hcHMgdG8gRjAgPSAwLjA0XG5cblx0dGhpcy5jbGVhckNvYXQgPSAwLjA7XG5cdHRoaXMuY2xlYXJDb2F0Um91Z2huZXNzID0gMC4wO1xuXG5cdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XG5cbn1cblxuTWVzaFBoeXNpY2FsTWF0ZXJpYWwucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTWVzaFN0YW5kYXJkTWF0ZXJpYWwucHJvdG90eXBlICk7XG5NZXNoUGh5c2ljYWxNYXRlcmlhbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNZXNoUGh5c2ljYWxNYXRlcmlhbDtcblxuTWVzaFBoeXNpY2FsTWF0ZXJpYWwucHJvdG90eXBlLmlzTWVzaFBoeXNpY2FsTWF0ZXJpYWwgPSB0cnVlO1xuXG5NZXNoUGh5c2ljYWxNYXRlcmlhbC5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdE1lc2hTdGFuZGFyZE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdHRoaXMuZGVmaW5lcyA9IHsgJ1BIWVNJQ0FMJzogJycgfTtcblxuXHR0aGlzLnJlZmxlY3Rpdml0eSA9IHNvdXJjZS5yZWZsZWN0aXZpdHk7XG5cblx0dGhpcy5jbGVhckNvYXQgPSBzb3VyY2UuY2xlYXJDb2F0O1xuXHR0aGlzLmNsZWFyQ29hdFJvdWdobmVzcyA9IHNvdXJjZS5jbGVhckNvYXRSb3VnaG5lc3M7XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKlxuICogcGFyYW1ldGVycyA9IHtcbiAqICBjb2xvcjogPGhleD4sXG4gKiAgc3BlY3VsYXI6IDxoZXg+LFxuICogIHNoaW5pbmVzczogPGZsb2F0PixcbiAqICBvcGFjaXR5OiA8ZmxvYXQ+LFxuICpcbiAqICBtYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIGxpZ2h0TWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGxpZ2h0TWFwSW50ZW5zaXR5OiA8ZmxvYXQ+XG4gKlxuICogIGFvTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGFvTWFwSW50ZW5zaXR5OiA8ZmxvYXQ+XG4gKlxuICogIGVtaXNzaXZlOiA8aGV4PixcbiAqICBlbWlzc2l2ZUludGVuc2l0eTogPGZsb2F0PlxuICogIGVtaXNzaXZlTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBidW1wTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGJ1bXBTY2FsZTogPGZsb2F0PixcbiAqXG4gKiAgbm9ybWFsTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIG5vcm1hbFNjYWxlOiA8VmVjdG9yMj4sXG4gKlxuICogIGRpc3BsYWNlbWVudE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBkaXNwbGFjZW1lbnRTY2FsZTogPGZsb2F0PixcbiAqICBkaXNwbGFjZW1lbnRCaWFzOiA8ZmxvYXQ+LFxuICpcbiAqICBzcGVjdWxhck1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgYWxwaGFNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIGVudk1hcDogbmV3IFRIUkVFLkN1YmVUZXh0dXJlKCBbcG9zeCwgbmVneCwgcG9zeSwgbmVneSwgcG9zeiwgbmVnel0gKSxcbiAqICBjb21iaW5lOiBUSFJFRS5NdWx0aXBseSxcbiAqICByZWZsZWN0aXZpdHk6IDxmbG9hdD4sXG4gKiAgcmVmcmFjdGlvblJhdGlvOiA8ZmxvYXQ+LFxuICpcbiAqICB3aXJlZnJhbWU6IDxib29sZWFuPixcbiAqICB3aXJlZnJhbWVMaW5ld2lkdGg6IDxmbG9hdD4sXG4gKlxuICogIHNraW5uaW5nOiA8Ym9vbD4sXG4gKiAgbW9ycGhUYXJnZXRzOiA8Ym9vbD4sXG4gKiAgbW9ycGhOb3JtYWxzOiA8Ym9vbD5cbiAqIH1cbiAqL1xuXG5mdW5jdGlvbiBNZXNoUGhvbmdNYXRlcmlhbCggcGFyYW1ldGVycyApIHtcblxuXHRNYXRlcmlhbC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ01lc2hQaG9uZ01hdGVyaWFsJztcblxuXHR0aGlzLmNvbG9yID0gbmV3IENvbG9yKCAweGZmZmZmZiApOyAvLyBkaWZmdXNlXG5cdHRoaXMuc3BlY3VsYXIgPSBuZXcgQ29sb3IoIDB4MTExMTExICk7XG5cdHRoaXMuc2hpbmluZXNzID0gMzA7XG5cblx0dGhpcy5tYXAgPSBudWxsO1xuXG5cdHRoaXMubGlnaHRNYXAgPSBudWxsO1xuXHR0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5ID0gMS4wO1xuXG5cdHRoaXMuYW9NYXAgPSBudWxsO1xuXHR0aGlzLmFvTWFwSW50ZW5zaXR5ID0gMS4wO1xuXG5cdHRoaXMuZW1pc3NpdmUgPSBuZXcgQ29sb3IoIDB4MDAwMDAwICk7XG5cdHRoaXMuZW1pc3NpdmVJbnRlbnNpdHkgPSAxLjA7XG5cdHRoaXMuZW1pc3NpdmVNYXAgPSBudWxsO1xuXG5cdHRoaXMuYnVtcE1hcCA9IG51bGw7XG5cdHRoaXMuYnVtcFNjYWxlID0gMTtcblxuXHR0aGlzLm5vcm1hbE1hcCA9IG51bGw7XG5cdHRoaXMubm9ybWFsU2NhbGUgPSBuZXcgVmVjdG9yMiggMSwgMSApO1xuXG5cdHRoaXMuZGlzcGxhY2VtZW50TWFwID0gbnVsbDtcblx0dGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IDE7XG5cdHRoaXMuZGlzcGxhY2VtZW50QmlhcyA9IDA7XG5cblx0dGhpcy5zcGVjdWxhck1hcCA9IG51bGw7XG5cblx0dGhpcy5hbHBoYU1hcCA9IG51bGw7XG5cblx0dGhpcy5lbnZNYXAgPSBudWxsO1xuXHR0aGlzLmNvbWJpbmUgPSBNdWx0aXBseU9wZXJhdGlvbjtcblx0dGhpcy5yZWZsZWN0aXZpdHkgPSAxO1xuXHR0aGlzLnJlZnJhY3Rpb25SYXRpbyA9IDAuOTg7XG5cblx0dGhpcy53aXJlZnJhbWUgPSBmYWxzZTtcblx0dGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSAxO1xuXHR0aGlzLndpcmVmcmFtZUxpbmVjYXAgPSAncm91bmQnO1xuXHR0aGlzLndpcmVmcmFtZUxpbmVqb2luID0gJ3JvdW5kJztcblxuXHR0aGlzLnNraW5uaW5nID0gZmFsc2U7XG5cdHRoaXMubW9ycGhUYXJnZXRzID0gZmFsc2U7XG5cdHRoaXMubW9ycGhOb3JtYWxzID0gZmFsc2U7XG5cblx0dGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTtcblxufVxuXG5NZXNoUGhvbmdNYXRlcmlhbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBNYXRlcmlhbC5wcm90b3R5cGUgKTtcbk1lc2hQaG9uZ01hdGVyaWFsLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE1lc2hQaG9uZ01hdGVyaWFsO1xuXG5NZXNoUGhvbmdNYXRlcmlhbC5wcm90b3R5cGUuaXNNZXNoUGhvbmdNYXRlcmlhbCA9IHRydWU7XG5cbk1lc2hQaG9uZ01hdGVyaWFsLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0TWF0ZXJpYWwucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0dGhpcy5jb2xvci5jb3B5KCBzb3VyY2UuY29sb3IgKTtcblx0dGhpcy5zcGVjdWxhci5jb3B5KCBzb3VyY2Uuc3BlY3VsYXIgKTtcblx0dGhpcy5zaGluaW5lc3MgPSBzb3VyY2Uuc2hpbmluZXNzO1xuXG5cdHRoaXMubWFwID0gc291cmNlLm1hcDtcblxuXHR0aGlzLmxpZ2h0TWFwID0gc291cmNlLmxpZ2h0TWFwO1xuXHR0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5ID0gc291cmNlLmxpZ2h0TWFwSW50ZW5zaXR5O1xuXG5cdHRoaXMuYW9NYXAgPSBzb3VyY2UuYW9NYXA7XG5cdHRoaXMuYW9NYXBJbnRlbnNpdHkgPSBzb3VyY2UuYW9NYXBJbnRlbnNpdHk7XG5cblx0dGhpcy5lbWlzc2l2ZS5jb3B5KCBzb3VyY2UuZW1pc3NpdmUgKTtcblx0dGhpcy5lbWlzc2l2ZU1hcCA9IHNvdXJjZS5lbWlzc2l2ZU1hcDtcblx0dGhpcy5lbWlzc2l2ZUludGVuc2l0eSA9IHNvdXJjZS5lbWlzc2l2ZUludGVuc2l0eTtcblxuXHR0aGlzLmJ1bXBNYXAgPSBzb3VyY2UuYnVtcE1hcDtcblx0dGhpcy5idW1wU2NhbGUgPSBzb3VyY2UuYnVtcFNjYWxlO1xuXG5cdHRoaXMubm9ybWFsTWFwID0gc291cmNlLm5vcm1hbE1hcDtcblx0dGhpcy5ub3JtYWxTY2FsZS5jb3B5KCBzb3VyY2Uubm9ybWFsU2NhbGUgKTtcblxuXHR0aGlzLmRpc3BsYWNlbWVudE1hcCA9IHNvdXJjZS5kaXNwbGFjZW1lbnRNYXA7XG5cdHRoaXMuZGlzcGxhY2VtZW50U2NhbGUgPSBzb3VyY2UuZGlzcGxhY2VtZW50U2NhbGU7XG5cdHRoaXMuZGlzcGxhY2VtZW50QmlhcyA9IHNvdXJjZS5kaXNwbGFjZW1lbnRCaWFzO1xuXG5cdHRoaXMuc3BlY3VsYXJNYXAgPSBzb3VyY2Uuc3BlY3VsYXJNYXA7XG5cblx0dGhpcy5hbHBoYU1hcCA9IHNvdXJjZS5hbHBoYU1hcDtcblxuXHR0aGlzLmVudk1hcCA9IHNvdXJjZS5lbnZNYXA7XG5cdHRoaXMuY29tYmluZSA9IHNvdXJjZS5jb21iaW5lO1xuXHR0aGlzLnJlZmxlY3Rpdml0eSA9IHNvdXJjZS5yZWZsZWN0aXZpdHk7XG5cdHRoaXMucmVmcmFjdGlvblJhdGlvID0gc291cmNlLnJlZnJhY3Rpb25SYXRpbztcblxuXHR0aGlzLndpcmVmcmFtZSA9IHNvdXJjZS53aXJlZnJhbWU7XG5cdHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gc291cmNlLndpcmVmcmFtZUxpbmV3aWR0aDtcblx0dGhpcy53aXJlZnJhbWVMaW5lY2FwID0gc291cmNlLndpcmVmcmFtZUxpbmVjYXA7XG5cdHRoaXMud2lyZWZyYW1lTGluZWpvaW4gPSBzb3VyY2Uud2lyZWZyYW1lTGluZWpvaW47XG5cblx0dGhpcy5za2lubmluZyA9IHNvdXJjZS5za2lubmluZztcblx0dGhpcy5tb3JwaFRhcmdldHMgPSBzb3VyY2UubW9ycGhUYXJnZXRzO1xuXHR0aGlzLm1vcnBoTm9ybWFscyA9IHNvdXJjZS5tb3JwaE5vcm1hbHM7XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciB0YWthaGlyb3ggLyBodHRwOi8vZ2l0aHViLmNvbS90YWthaGlyb3hcbiAqXG4gKiBwYXJhbWV0ZXJzID0ge1xuICogIGdyYWRpZW50TWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApXG4gKiB9XG4gKi9cblxuZnVuY3Rpb24gTWVzaFRvb25NYXRlcmlhbCggcGFyYW1ldGVycyApIHtcblxuXHRNZXNoUGhvbmdNYXRlcmlhbC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy5kZWZpbmVzID0geyAnVE9PTic6ICcnIH07XG5cblx0dGhpcy50eXBlID0gJ01lc2hUb29uTWF0ZXJpYWwnO1xuXG5cdHRoaXMuZ3JhZGllbnRNYXAgPSBudWxsO1xuXG5cdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XG5cbn1cblxuTWVzaFRvb25NYXRlcmlhbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBNZXNoUGhvbmdNYXRlcmlhbC5wcm90b3R5cGUgKTtcbk1lc2hUb29uTWF0ZXJpYWwucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTWVzaFRvb25NYXRlcmlhbDtcblxuTWVzaFRvb25NYXRlcmlhbC5wcm90b3R5cGUuaXNNZXNoVG9vbk1hdGVyaWFsID0gdHJ1ZTtcblxuTWVzaFRvb25NYXRlcmlhbC5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdE1lc2hQaG9uZ01hdGVyaWFsLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdHRoaXMuZ3JhZGllbnRNYXAgPSBzb3VyY2UuZ3JhZGllbnRNYXA7XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleVxuICpcbiAqIHBhcmFtZXRlcnMgPSB7XG4gKiAgb3BhY2l0eTogPGZsb2F0PixcbiAqXG4gKiAgYnVtcE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBidW1wU2NhbGU6IDxmbG9hdD4sXG4gKlxuICogIG5vcm1hbE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBub3JtYWxTY2FsZTogPFZlY3RvcjI+LFxuICpcbiAqICBkaXNwbGFjZW1lbnRNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKiAgZGlzcGxhY2VtZW50U2NhbGU6IDxmbG9hdD4sXG4gKiAgZGlzcGxhY2VtZW50QmlhczogPGZsb2F0PixcbiAqXG4gKiAgd2lyZWZyYW1lOiA8Ym9vbGVhbj4sXG4gKiAgd2lyZWZyYW1lTGluZXdpZHRoOiA8ZmxvYXQ+XG4gKlxuICogIHNraW5uaW5nOiA8Ym9vbD4sXG4gKiAgbW9ycGhUYXJnZXRzOiA8Ym9vbD4sXG4gKiAgbW9ycGhOb3JtYWxzOiA8Ym9vbD5cbiAqIH1cbiAqL1xuXG5mdW5jdGlvbiBNZXNoTm9ybWFsTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKSB7XG5cblx0TWF0ZXJpYWwuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdNZXNoTm9ybWFsTWF0ZXJpYWwnO1xuXG5cdHRoaXMuYnVtcE1hcCA9IG51bGw7XG5cdHRoaXMuYnVtcFNjYWxlID0gMTtcblxuXHR0aGlzLm5vcm1hbE1hcCA9IG51bGw7XG5cdHRoaXMubm9ybWFsU2NhbGUgPSBuZXcgVmVjdG9yMiggMSwgMSApO1xuXG5cdHRoaXMuZGlzcGxhY2VtZW50TWFwID0gbnVsbDtcblx0dGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IDE7XG5cdHRoaXMuZGlzcGxhY2VtZW50QmlhcyA9IDA7XG5cblx0dGhpcy53aXJlZnJhbWUgPSBmYWxzZTtcblx0dGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSAxO1xuXG5cdHRoaXMuZm9nID0gZmFsc2U7XG5cdHRoaXMubGlnaHRzID0gZmFsc2U7XG5cblx0dGhpcy5za2lubmluZyA9IGZhbHNlO1xuXHR0aGlzLm1vcnBoVGFyZ2V0cyA9IGZhbHNlO1xuXHR0aGlzLm1vcnBoTm9ybWFscyA9IGZhbHNlO1xuXG5cdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XG5cbn1cblxuTWVzaE5vcm1hbE1hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE1hdGVyaWFsLnByb3RvdHlwZSApO1xuTWVzaE5vcm1hbE1hdGVyaWFsLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE1lc2hOb3JtYWxNYXRlcmlhbDtcblxuTWVzaE5vcm1hbE1hdGVyaWFsLnByb3RvdHlwZS5pc01lc2hOb3JtYWxNYXRlcmlhbCA9IHRydWU7XG5cbk1lc2hOb3JtYWxNYXRlcmlhbC5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdHRoaXMuYnVtcE1hcCA9IHNvdXJjZS5idW1wTWFwO1xuXHR0aGlzLmJ1bXBTY2FsZSA9IHNvdXJjZS5idW1wU2NhbGU7XG5cblx0dGhpcy5ub3JtYWxNYXAgPSBzb3VyY2Uubm9ybWFsTWFwO1xuXHR0aGlzLm5vcm1hbFNjYWxlLmNvcHkoIHNvdXJjZS5ub3JtYWxTY2FsZSApO1xuXG5cdHRoaXMuZGlzcGxhY2VtZW50TWFwID0gc291cmNlLmRpc3BsYWNlbWVudE1hcDtcblx0dGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IHNvdXJjZS5kaXNwbGFjZW1lbnRTY2FsZTtcblx0dGhpcy5kaXNwbGFjZW1lbnRCaWFzID0gc291cmNlLmRpc3BsYWNlbWVudEJpYXM7XG5cblx0dGhpcy53aXJlZnJhbWUgPSBzb3VyY2Uud2lyZWZyYW1lO1xuXHR0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IHNvdXJjZS53aXJlZnJhbWVMaW5ld2lkdGg7XG5cblx0dGhpcy5za2lubmluZyA9IHNvdXJjZS5za2lubmluZztcblx0dGhpcy5tb3JwaFRhcmdldHMgPSBzb3VyY2UubW9ycGhUYXJnZXRzO1xuXHR0aGlzLm1vcnBoTm9ybWFscyA9IHNvdXJjZS5tb3JwaE5vcm1hbHM7XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKlxuICogcGFyYW1ldGVycyA9IHtcbiAqICBjb2xvcjogPGhleD4sXG4gKiAgb3BhY2l0eTogPGZsb2F0PixcbiAqXG4gKiAgbWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBsaWdodE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBsaWdodE1hcEludGVuc2l0eTogPGZsb2F0PlxuICpcbiAqICBhb01hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBhb01hcEludGVuc2l0eTogPGZsb2F0PlxuICpcbiAqICBlbWlzc2l2ZTogPGhleD4sXG4gKiAgZW1pc3NpdmVJbnRlbnNpdHk6IDxmbG9hdD5cbiAqICBlbWlzc2l2ZU1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgc3BlY3VsYXJNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIGFscGhhTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBlbnZNYXA6IG5ldyBUSFJFRS5DdWJlVGV4dHVyZSggW3Bvc3gsIG5lZ3gsIHBvc3ksIG5lZ3ksIHBvc3osIG5lZ3pdICksXG4gKiAgY29tYmluZTogVEhSRUUuTXVsdGlwbHksXG4gKiAgcmVmbGVjdGl2aXR5OiA8ZmxvYXQ+LFxuICogIHJlZnJhY3Rpb25SYXRpbzogPGZsb2F0PixcbiAqXG4gKiAgd2lyZWZyYW1lOiA8Ym9vbGVhbj4sXG4gKiAgd2lyZWZyYW1lTGluZXdpZHRoOiA8ZmxvYXQ+LFxuICpcbiAqICBza2lubmluZzogPGJvb2w+LFxuICogIG1vcnBoVGFyZ2V0czogPGJvb2w+LFxuICogIG1vcnBoTm9ybWFsczogPGJvb2w+XG4gKiB9XG4gKi9cblxuZnVuY3Rpb24gTWVzaExhbWJlcnRNYXRlcmlhbCggcGFyYW1ldGVycyApIHtcblxuXHRNYXRlcmlhbC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ01lc2hMYW1iZXJ0TWF0ZXJpYWwnO1xuXG5cdHRoaXMuY29sb3IgPSBuZXcgQ29sb3IoIDB4ZmZmZmZmICk7IC8vIGRpZmZ1c2VcblxuXHR0aGlzLm1hcCA9IG51bGw7XG5cblx0dGhpcy5saWdodE1hcCA9IG51bGw7XG5cdHRoaXMubGlnaHRNYXBJbnRlbnNpdHkgPSAxLjA7XG5cblx0dGhpcy5hb01hcCA9IG51bGw7XG5cdHRoaXMuYW9NYXBJbnRlbnNpdHkgPSAxLjA7XG5cblx0dGhpcy5lbWlzc2l2ZSA9IG5ldyBDb2xvciggMHgwMDAwMDAgKTtcblx0dGhpcy5lbWlzc2l2ZUludGVuc2l0eSA9IDEuMDtcblx0dGhpcy5lbWlzc2l2ZU1hcCA9IG51bGw7XG5cblx0dGhpcy5zcGVjdWxhck1hcCA9IG51bGw7XG5cblx0dGhpcy5hbHBoYU1hcCA9IG51bGw7XG5cblx0dGhpcy5lbnZNYXAgPSBudWxsO1xuXHR0aGlzLmNvbWJpbmUgPSBNdWx0aXBseU9wZXJhdGlvbjtcblx0dGhpcy5yZWZsZWN0aXZpdHkgPSAxO1xuXHR0aGlzLnJlZnJhY3Rpb25SYXRpbyA9IDAuOTg7XG5cblx0dGhpcy53aXJlZnJhbWUgPSBmYWxzZTtcblx0dGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSAxO1xuXHR0aGlzLndpcmVmcmFtZUxpbmVjYXAgPSAncm91bmQnO1xuXHR0aGlzLndpcmVmcmFtZUxpbmVqb2luID0gJ3JvdW5kJztcblxuXHR0aGlzLnNraW5uaW5nID0gZmFsc2U7XG5cdHRoaXMubW9ycGhUYXJnZXRzID0gZmFsc2U7XG5cdHRoaXMubW9ycGhOb3JtYWxzID0gZmFsc2U7XG5cblx0dGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTtcblxufVxuXG5NZXNoTGFtYmVydE1hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE1hdGVyaWFsLnByb3RvdHlwZSApO1xuTWVzaExhbWJlcnRNYXRlcmlhbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNZXNoTGFtYmVydE1hdGVyaWFsO1xuXG5NZXNoTGFtYmVydE1hdGVyaWFsLnByb3RvdHlwZS5pc01lc2hMYW1iZXJ0TWF0ZXJpYWwgPSB0cnVlO1xuXG5NZXNoTGFtYmVydE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0TWF0ZXJpYWwucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0dGhpcy5jb2xvci5jb3B5KCBzb3VyY2UuY29sb3IgKTtcblxuXHR0aGlzLm1hcCA9IHNvdXJjZS5tYXA7XG5cblx0dGhpcy5saWdodE1hcCA9IHNvdXJjZS5saWdodE1hcDtcblx0dGhpcy5saWdodE1hcEludGVuc2l0eSA9IHNvdXJjZS5saWdodE1hcEludGVuc2l0eTtcblxuXHR0aGlzLmFvTWFwID0gc291cmNlLmFvTWFwO1xuXHR0aGlzLmFvTWFwSW50ZW5zaXR5ID0gc291cmNlLmFvTWFwSW50ZW5zaXR5O1xuXG5cdHRoaXMuZW1pc3NpdmUuY29weSggc291cmNlLmVtaXNzaXZlICk7XG5cdHRoaXMuZW1pc3NpdmVNYXAgPSBzb3VyY2UuZW1pc3NpdmVNYXA7XG5cdHRoaXMuZW1pc3NpdmVJbnRlbnNpdHkgPSBzb3VyY2UuZW1pc3NpdmVJbnRlbnNpdHk7XG5cblx0dGhpcy5zcGVjdWxhck1hcCA9IHNvdXJjZS5zcGVjdWxhck1hcDtcblxuXHR0aGlzLmFscGhhTWFwID0gc291cmNlLmFscGhhTWFwO1xuXG5cdHRoaXMuZW52TWFwID0gc291cmNlLmVudk1hcDtcblx0dGhpcy5jb21iaW5lID0gc291cmNlLmNvbWJpbmU7XG5cdHRoaXMucmVmbGVjdGl2aXR5ID0gc291cmNlLnJlZmxlY3Rpdml0eTtcblx0dGhpcy5yZWZyYWN0aW9uUmF0aW8gPSBzb3VyY2UucmVmcmFjdGlvblJhdGlvO1xuXG5cdHRoaXMud2lyZWZyYW1lID0gc291cmNlLndpcmVmcmFtZTtcblx0dGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSBzb3VyY2Uud2lyZWZyYW1lTGluZXdpZHRoO1xuXHR0aGlzLndpcmVmcmFtZUxpbmVjYXAgPSBzb3VyY2Uud2lyZWZyYW1lTGluZWNhcDtcblx0dGhpcy53aXJlZnJhbWVMaW5lam9pbiA9IHNvdXJjZS53aXJlZnJhbWVMaW5lam9pbjtcblxuXHR0aGlzLnNraW5uaW5nID0gc291cmNlLnNraW5uaW5nO1xuXHR0aGlzLm1vcnBoVGFyZ2V0cyA9IHNvdXJjZS5tb3JwaFRhcmdldHM7XG5cdHRoaXMubW9ycGhOb3JtYWxzID0gc291cmNlLm1vcnBoTm9ybWFscztcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICpcbiAqIHBhcmFtZXRlcnMgPSB7XG4gKiAgY29sb3I6IDxoZXg+LFxuICogIG9wYWNpdHk6IDxmbG9hdD4sXG4gKlxuICogIGxpbmV3aWR0aDogPGZsb2F0PixcbiAqXG4gKiAgc2NhbGU6IDxmbG9hdD4sXG4gKiAgZGFzaFNpemU6IDxmbG9hdD4sXG4gKiAgZ2FwU2l6ZTogPGZsb2F0PlxuICogfVxuICovXG5cbmZ1bmN0aW9uIExpbmVEYXNoZWRNYXRlcmlhbCggcGFyYW1ldGVycyApIHtcblxuXHRMaW5lQmFzaWNNYXRlcmlhbC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0xpbmVEYXNoZWRNYXRlcmlhbCc7XG5cblx0dGhpcy5zY2FsZSA9IDE7XG5cdHRoaXMuZGFzaFNpemUgPSAzO1xuXHR0aGlzLmdhcFNpemUgPSAxO1xuXG5cdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XG5cbn1cblxuTGluZURhc2hlZE1hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIExpbmVCYXNpY01hdGVyaWFsLnByb3RvdHlwZSApO1xuTGluZURhc2hlZE1hdGVyaWFsLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IExpbmVEYXNoZWRNYXRlcmlhbDtcblxuTGluZURhc2hlZE1hdGVyaWFsLnByb3RvdHlwZS5pc0xpbmVEYXNoZWRNYXRlcmlhbCA9IHRydWU7XG5cbkxpbmVEYXNoZWRNYXRlcmlhbC5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdExpbmVCYXNpY01hdGVyaWFsLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdHRoaXMuc2NhbGUgPSBzb3VyY2Uuc2NhbGU7XG5cdHRoaXMuZGFzaFNpemUgPSBzb3VyY2UuZGFzaFNpemU7XG5cdHRoaXMuZ2FwU2l6ZSA9IHNvdXJjZS5nYXBTaXplO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG5cblxudmFyIE1hdGVyaWFscyA9IE9iamVjdC5mcmVlemUoe1xuXHRTaGFkb3dNYXRlcmlhbDogU2hhZG93TWF0ZXJpYWwsXG5cdFNwcml0ZU1hdGVyaWFsOiBTcHJpdGVNYXRlcmlhbCxcblx0UmF3U2hhZGVyTWF0ZXJpYWw6IFJhd1NoYWRlck1hdGVyaWFsLFxuXHRTaGFkZXJNYXRlcmlhbDogU2hhZGVyTWF0ZXJpYWwsXG5cdFBvaW50c01hdGVyaWFsOiBQb2ludHNNYXRlcmlhbCxcblx0TWVzaFBoeXNpY2FsTWF0ZXJpYWw6IE1lc2hQaHlzaWNhbE1hdGVyaWFsLFxuXHRNZXNoU3RhbmRhcmRNYXRlcmlhbDogTWVzaFN0YW5kYXJkTWF0ZXJpYWwsXG5cdE1lc2hQaG9uZ01hdGVyaWFsOiBNZXNoUGhvbmdNYXRlcmlhbCxcblx0TWVzaFRvb25NYXRlcmlhbDogTWVzaFRvb25NYXRlcmlhbCxcblx0TWVzaE5vcm1hbE1hdGVyaWFsOiBNZXNoTm9ybWFsTWF0ZXJpYWwsXG5cdE1lc2hMYW1iZXJ0TWF0ZXJpYWw6IE1lc2hMYW1iZXJ0TWF0ZXJpYWwsXG5cdE1lc2hEZXB0aE1hdGVyaWFsOiBNZXNoRGVwdGhNYXRlcmlhbCxcblx0TWVzaERpc3RhbmNlTWF0ZXJpYWw6IE1lc2hEaXN0YW5jZU1hdGVyaWFsLFxuXHRNZXNoQmFzaWNNYXRlcmlhbDogTWVzaEJhc2ljTWF0ZXJpYWwsXG5cdExpbmVEYXNoZWRNYXRlcmlhbDogTGluZURhc2hlZE1hdGVyaWFsLFxuXHRMaW5lQmFzaWNNYXRlcmlhbDogTGluZUJhc2ljTWF0ZXJpYWwsXG5cdE1hdGVyaWFsOiBNYXRlcmlhbFxufSk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG52YXIgQ2FjaGUgPSB7XG5cblx0ZW5hYmxlZDogZmFsc2UsXG5cblx0ZmlsZXM6IHt9LFxuXG5cdGFkZDogZnVuY3Rpb24gKCBrZXksIGZpbGUgKSB7XG5cblx0XHRpZiAoIHRoaXMuZW5hYmxlZCA9PT0gZmFsc2UgKSByZXR1cm47XG5cblx0XHQvLyBjb25zb2xlLmxvZyggJ1RIUkVFLkNhY2hlJywgJ0FkZGluZyBrZXk6Jywga2V5ICk7XG5cblx0XHR0aGlzLmZpbGVzWyBrZXkgXSA9IGZpbGU7XG5cblx0fSxcblxuXHRnZXQ6IGZ1bmN0aW9uICgga2V5ICkge1xuXG5cdFx0aWYgKCB0aGlzLmVuYWJsZWQgPT09IGZhbHNlICkgcmV0dXJuO1xuXG5cdFx0Ly8gY29uc29sZS5sb2coICdUSFJFRS5DYWNoZScsICdDaGVja2luZyBrZXk6Jywga2V5ICk7XG5cblx0XHRyZXR1cm4gdGhpcy5maWxlc1sga2V5IF07XG5cblx0fSxcblxuXHRyZW1vdmU6IGZ1bmN0aW9uICgga2V5ICkge1xuXG5cdFx0ZGVsZXRlIHRoaXMuZmlsZXNbIGtleSBdO1xuXG5cdH0sXG5cblx0Y2xlYXI6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuZmlsZXMgPSB7fTtcblxuXHR9XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBMb2FkaW5nTWFuYWdlciggb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkge1xuXG5cdHZhciBzY29wZSA9IHRoaXM7XG5cblx0dmFyIGlzTG9hZGluZyA9IGZhbHNlO1xuXHR2YXIgaXRlbXNMb2FkZWQgPSAwO1xuXHR2YXIgaXRlbXNUb3RhbCA9IDA7XG5cdHZhciB1cmxNb2RpZmllciA9IHVuZGVmaW5lZDtcblxuXHR0aGlzLm9uU3RhcnQgPSB1bmRlZmluZWQ7XG5cdHRoaXMub25Mb2FkID0gb25Mb2FkO1xuXHR0aGlzLm9uUHJvZ3Jlc3MgPSBvblByb2dyZXNzO1xuXHR0aGlzLm9uRXJyb3IgPSBvbkVycm9yO1xuXG5cdHRoaXMuaXRlbVN0YXJ0ID0gZnVuY3Rpb24gKCB1cmwgKSB7XG5cblx0XHRpdGVtc1RvdGFsICsrO1xuXG5cdFx0aWYgKCBpc0xvYWRpbmcgPT09IGZhbHNlICkge1xuXG5cdFx0XHRpZiAoIHNjb3BlLm9uU3RhcnQgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRzY29wZS5vblN0YXJ0KCB1cmwsIGl0ZW1zTG9hZGVkLCBpdGVtc1RvdGFsICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlzTG9hZGluZyA9IHRydWU7XG5cblx0fTtcblxuXHR0aGlzLml0ZW1FbmQgPSBmdW5jdGlvbiAoIHVybCApIHtcblxuXHRcdGl0ZW1zTG9hZGVkICsrO1xuXG5cdFx0aWYgKCBzY29wZS5vblByb2dyZXNzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHNjb3BlLm9uUHJvZ3Jlc3MoIHVybCwgaXRlbXNMb2FkZWQsIGl0ZW1zVG90YWwgKTtcblxuXHRcdH1cblxuXHRcdGlmICggaXRlbXNMb2FkZWQgPT09IGl0ZW1zVG90YWwgKSB7XG5cblx0XHRcdGlzTG9hZGluZyA9IGZhbHNlO1xuXG5cdFx0XHRpZiAoIHNjb3BlLm9uTG9hZCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHNjb3BlLm9uTG9hZCgpO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fTtcblxuXHR0aGlzLml0ZW1FcnJvciA9IGZ1bmN0aW9uICggdXJsICkge1xuXG5cdFx0aWYgKCBzY29wZS5vbkVycm9yICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHNjb3BlLm9uRXJyb3IoIHVybCApO1xuXG5cdFx0fVxuXG5cdH07XG5cblx0dGhpcy5yZXNvbHZlVVJMID0gZnVuY3Rpb24gKCB1cmwgKSB7XG5cblx0XHRpZiAoIHVybE1vZGlmaWVyICkge1xuXG5cdFx0XHRyZXR1cm4gdXJsTW9kaWZpZXIoIHVybCApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHVybDtcblxuXHR9O1xuXG5cdHRoaXMuc2V0VVJMTW9kaWZpZXIgPSBmdW5jdGlvbiAoIHRyYW5zZm9ybSApIHtcblxuXHRcdHVybE1vZGlmaWVyID0gdHJhbnNmb3JtO1xuXHRcdHJldHVybiB0aGlzO1xuXG5cdH07XG5cbn1cblxudmFyIERlZmF1bHRMb2FkaW5nTWFuYWdlciA9IG5ldyBMb2FkaW5nTWFuYWdlcigpO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxudmFyIGxvYWRpbmcgPSB7fTtcblxuZnVuY3Rpb24gRmlsZUxvYWRlciggbWFuYWdlciApIHtcblxuXHR0aGlzLm1hbmFnZXIgPSAoIG1hbmFnZXIgIT09IHVuZGVmaW5lZCApID8gbWFuYWdlciA6IERlZmF1bHRMb2FkaW5nTWFuYWdlcjtcblxufVxuXG5PYmplY3QuYXNzaWduKCBGaWxlTG9hZGVyLnByb3RvdHlwZSwge1xuXG5cdGxvYWQ6IGZ1bmN0aW9uICggdXJsLCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKSB7XG5cblx0XHRpZiAoIHVybCA9PT0gdW5kZWZpbmVkICkgdXJsID0gJyc7XG5cblx0XHRpZiAoIHRoaXMucGF0aCAhPT0gdW5kZWZpbmVkICkgdXJsID0gdGhpcy5wYXRoICsgdXJsO1xuXG5cdFx0dXJsID0gdGhpcy5tYW5hZ2VyLnJlc29sdmVVUkwoIHVybCApO1xuXG5cdFx0dmFyIHNjb3BlID0gdGhpcztcblxuXHRcdHZhciBjYWNoZWQgPSBDYWNoZS5nZXQoIHVybCApO1xuXG5cdFx0aWYgKCBjYWNoZWQgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0c2NvcGUubWFuYWdlci5pdGVtU3RhcnQoIHVybCApO1xuXG5cdFx0XHRzZXRUaW1lb3V0KCBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdFx0aWYgKCBvbkxvYWQgKSBvbkxvYWQoIGNhY2hlZCApO1xuXG5cdFx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7XG5cblx0XHRcdH0sIDAgKTtcblxuXHRcdFx0cmV0dXJuIGNhY2hlZDtcblxuXHRcdH1cblxuXHRcdC8vIENoZWNrIGlmIHJlcXVlc3QgaXMgZHVwbGljYXRlXG5cblx0XHRpZiAoIGxvYWRpbmdbIHVybCBdICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGxvYWRpbmdbIHVybCBdLnB1c2goIHtcblxuXHRcdFx0XHRvbkxvYWQ6IG9uTG9hZCxcblx0XHRcdFx0b25Qcm9ncmVzczogb25Qcm9ncmVzcyxcblx0XHRcdFx0b25FcnJvcjogb25FcnJvclxuXG5cdFx0XHR9ICk7XG5cblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdC8vIENoZWNrIGZvciBkYXRhOiBVUklcblx0XHR2YXIgZGF0YVVyaVJlZ2V4ID0gL15kYXRhOiguKj8pKDtiYXNlNjQpPywoLiopJC87XG5cdFx0dmFyIGRhdGFVcmlSZWdleFJlc3VsdCA9IHVybC5tYXRjaCggZGF0YVVyaVJlZ2V4ICk7XG5cblx0XHQvLyBTYWZhcmkgY2FuIG5vdCBoYW5kbGUgRGF0YSBVUklzIHRocm91Z2ggWE1MSHR0cFJlcXVlc3Qgc28gcHJvY2VzcyBtYW51YWxseVxuXHRcdGlmICggZGF0YVVyaVJlZ2V4UmVzdWx0ICkge1xuXG5cdFx0XHR2YXIgbWltZVR5cGUgPSBkYXRhVXJpUmVnZXhSZXN1bHRbIDEgXTtcblx0XHRcdHZhciBpc0Jhc2U2NCA9ICEhIGRhdGFVcmlSZWdleFJlc3VsdFsgMiBdO1xuXHRcdFx0dmFyIGRhdGEgPSBkYXRhVXJpUmVnZXhSZXN1bHRbIDMgXTtcblxuXHRcdFx0ZGF0YSA9IHdpbmRvdy5kZWNvZGVVUklDb21wb25lbnQoIGRhdGEgKTtcblxuXHRcdFx0aWYgKCBpc0Jhc2U2NCApIGRhdGEgPSB3aW5kb3cuYXRvYiggZGF0YSApO1xuXG5cdFx0XHR0cnkge1xuXG5cdFx0XHRcdHZhciByZXNwb25zZTtcblx0XHRcdFx0dmFyIHJlc3BvbnNlVHlwZSA9ICggdGhpcy5yZXNwb25zZVR5cGUgfHwgJycgKS50b0xvd2VyQ2FzZSgpO1xuXG5cdFx0XHRcdHN3aXRjaCAoIHJlc3BvbnNlVHlwZSApIHtcblxuXHRcdFx0XHRcdGNhc2UgJ2FycmF5YnVmZmVyJzpcblx0XHRcdFx0XHRjYXNlICdibG9iJzpcblxuXHRcdFx0XHRcdFx0dmFyIHZpZXcgPSBuZXcgVWludDhBcnJheSggZGF0YS5sZW5ndGggKTtcblxuXHRcdFx0XHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdFx0dmlld1sgaSBdID0gZGF0YS5jaGFyQ29kZUF0KCBpICk7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKCByZXNwb25zZVR5cGUgPT09ICdibG9iJyApIHtcblxuXHRcdFx0XHRcdFx0XHRyZXNwb25zZSA9IG5ldyBCbG9iKCBbIHZpZXcuYnVmZmVyIF0sIHsgdHlwZTogbWltZVR5cGUgfSApO1xuXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdHJlc3BvbnNlID0gdmlldy5idWZmZXI7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlICdkb2N1bWVudCc6XG5cblx0XHRcdFx0XHRcdHZhciBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7XG5cdFx0XHRcdFx0XHRyZXNwb25zZSA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcoIGRhdGEsIG1pbWVUeXBlICk7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSAnanNvbic6XG5cblx0XHRcdFx0XHRcdHJlc3BvbnNlID0gSlNPTi5wYXJzZSggZGF0YSApO1xuXG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGRlZmF1bHQ6IC8vICd0ZXh0JyBvciBvdGhlclxuXG5cdFx0XHRcdFx0XHRyZXNwb25zZSA9IGRhdGE7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBXYWl0IGZvciBuZXh0IGJyb3dzZXIgdGljayBsaWtlIHN0YW5kYXJkIFhNTEh0dHBSZXF1ZXN0IGV2ZW50IGRpc3BhdGNoaW5nIGRvZXNcblx0XHRcdFx0d2luZG93LnNldFRpbWVvdXQoIGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0XHRcdGlmICggb25Mb2FkICkgb25Mb2FkKCByZXNwb25zZSApO1xuXG5cdFx0XHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRW5kKCB1cmwgKTtcblxuXHRcdFx0XHR9LCAwICk7XG5cblx0XHRcdH0gY2F0Y2ggKCBlcnJvciApIHtcblxuXHRcdFx0XHQvLyBXYWl0IGZvciBuZXh0IGJyb3dzZXIgdGljayBsaWtlIHN0YW5kYXJkIFhNTEh0dHBSZXF1ZXN0IGV2ZW50IGRpc3BhdGNoaW5nIGRvZXNcblx0XHRcdFx0d2luZG93LnNldFRpbWVvdXQoIGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0XHRcdGlmICggb25FcnJvciApIG9uRXJyb3IoIGVycm9yICk7XG5cblx0XHRcdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1FbmQoIHVybCApO1xuXHRcdFx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVycm9yKCB1cmwgKTtcblxuXHRcdFx0XHR9LCAwICk7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIEluaXRpYWxpc2UgYXJyYXkgZm9yIGR1cGxpY2F0ZSByZXF1ZXN0c1xuXG5cdFx0XHRsb2FkaW5nWyB1cmwgXSA9IFtdO1xuXG5cdFx0XHRsb2FkaW5nWyB1cmwgXS5wdXNoKCB7XG5cblx0XHRcdFx0b25Mb2FkOiBvbkxvYWQsXG5cdFx0XHRcdG9uUHJvZ3Jlc3M6IG9uUHJvZ3Jlc3MsXG5cdFx0XHRcdG9uRXJyb3I6IG9uRXJyb3JcblxuXHRcdFx0fSApO1xuXG5cdFx0XHR2YXIgcmVxdWVzdCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuXG5cdFx0XHRyZXF1ZXN0Lm9wZW4oICdHRVQnLCB1cmwsIHRydWUgKTtcblxuXHRcdFx0cmVxdWVzdC5hZGRFdmVudExpc3RlbmVyKCAnbG9hZCcsIGZ1bmN0aW9uICggZXZlbnQgKSB7XG5cblx0XHRcdFx0dmFyIHJlc3BvbnNlID0gdGhpcy5yZXNwb25zZTtcblxuXHRcdFx0XHRDYWNoZS5hZGQoIHVybCwgcmVzcG9uc2UgKTtcblxuXHRcdFx0XHR2YXIgY2FsbGJhY2tzID0gbG9hZGluZ1sgdXJsIF07XG5cblx0XHRcdFx0ZGVsZXRlIGxvYWRpbmdbIHVybCBdO1xuXG5cdFx0XHRcdGlmICggdGhpcy5zdGF0dXMgPT09IDIwMCApIHtcblxuXHRcdFx0XHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBjYWxsYmFja3MubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdHZhciBjYWxsYmFjayA9IGNhbGxiYWNrc1sgaSBdO1xuXHRcdFx0XHRcdFx0aWYgKCBjYWxsYmFjay5vbkxvYWQgKSBjYWxsYmFjay5vbkxvYWQoIHJlc3BvbnNlICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1FbmQoIHVybCApO1xuXG5cdFx0XHRcdH0gZWxzZSBpZiAoIHRoaXMuc3RhdHVzID09PSAwICkge1xuXG5cdFx0XHRcdFx0Ly8gU29tZSBicm93c2VycyByZXR1cm4gSFRUUCBTdGF0dXMgMCB3aGVuIHVzaW5nIG5vbi1odHRwIHByb3RvY29sXG5cdFx0XHRcdFx0Ly8gZS5nLiAnZmlsZTovLycgb3IgJ2RhdGE6Ly8nLiBIYW5kbGUgYXMgc3VjY2Vzcy5cblxuXHRcdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkZpbGVMb2FkZXI6IEhUVFAgU3RhdHVzIDAgcmVjZWl2ZWQuJyApO1xuXG5cdFx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IGNhbGxiYWNrcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdFx0dmFyIGNhbGxiYWNrID0gY2FsbGJhY2tzWyBpIF07XG5cdFx0XHRcdFx0XHRpZiAoIGNhbGxiYWNrLm9uTG9hZCApIGNhbGxiYWNrLm9uTG9hZCggcmVzcG9uc2UgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBjYWxsYmFja3MubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdHZhciBjYWxsYmFjayA9IGNhbGxiYWNrc1sgaSBdO1xuXHRcdFx0XHRcdFx0aWYgKCBjYWxsYmFjay5vbkVycm9yICkgY2FsbGJhY2sub25FcnJvciggZXZlbnQgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7XG5cdFx0XHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRXJyb3IoIHVybCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSwgZmFsc2UgKTtcblxuXHRcdFx0cmVxdWVzdC5hZGRFdmVudExpc3RlbmVyKCAncHJvZ3Jlc3MnLCBmdW5jdGlvbiAoIGV2ZW50ICkge1xuXG5cdFx0XHRcdHZhciBjYWxsYmFja3MgPSBsb2FkaW5nWyB1cmwgXTtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gY2FsbGJhY2tzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0dmFyIGNhbGxiYWNrID0gY2FsbGJhY2tzWyBpIF07XG5cdFx0XHRcdFx0aWYgKCBjYWxsYmFjay5vblByb2dyZXNzICkgY2FsbGJhY2sub25Qcm9ncmVzcyggZXZlbnQgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0sIGZhbHNlICk7XG5cblx0XHRcdHJlcXVlc3QuYWRkRXZlbnRMaXN0ZW5lciggJ2Vycm9yJywgZnVuY3Rpb24gKCBldmVudCApIHtcblxuXHRcdFx0XHR2YXIgY2FsbGJhY2tzID0gbG9hZGluZ1sgdXJsIF07XG5cblx0XHRcdFx0ZGVsZXRlIGxvYWRpbmdbIHVybCBdO1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBjYWxsYmFja3MubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHR2YXIgY2FsbGJhY2sgPSBjYWxsYmFja3NbIGkgXTtcblx0XHRcdFx0XHRpZiAoIGNhbGxiYWNrLm9uRXJyb3IgKSBjYWxsYmFjay5vbkVycm9yKCBldmVudCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1FbmQoIHVybCApO1xuXHRcdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1FcnJvciggdXJsICk7XG5cblx0XHRcdH0sIGZhbHNlICk7XG5cblx0XHRcdGlmICggdGhpcy5yZXNwb25zZVR5cGUgIT09IHVuZGVmaW5lZCApIHJlcXVlc3QucmVzcG9uc2VUeXBlID0gdGhpcy5yZXNwb25zZVR5cGU7XG5cdFx0XHRpZiAoIHRoaXMud2l0aENyZWRlbnRpYWxzICE9PSB1bmRlZmluZWQgKSByZXF1ZXN0LndpdGhDcmVkZW50aWFscyA9IHRoaXMud2l0aENyZWRlbnRpYWxzO1xuXG5cdFx0XHRpZiAoIHJlcXVlc3Qub3ZlcnJpZGVNaW1lVHlwZSApIHJlcXVlc3Qub3ZlcnJpZGVNaW1lVHlwZSggdGhpcy5taW1lVHlwZSAhPT0gdW5kZWZpbmVkID8gdGhpcy5taW1lVHlwZSA6ICd0ZXh0L3BsYWluJyApO1xuXG5cdFx0XHRmb3IgKCB2YXIgaGVhZGVyIGluIHRoaXMucmVxdWVzdEhlYWRlciApIHtcblxuXHRcdFx0XHRyZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIoIGhlYWRlciwgdGhpcy5yZXF1ZXN0SGVhZGVyWyBoZWFkZXIgXSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJlcXVlc3Quc2VuZCggbnVsbCApO1xuXG5cdFx0fVxuXG5cdFx0c2NvcGUubWFuYWdlci5pdGVtU3RhcnQoIHVybCApO1xuXG5cdFx0cmV0dXJuIHJlcXVlc3Q7XG5cblx0fSxcblxuXHRzZXRQYXRoOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5wYXRoID0gdmFsdWU7XG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRSZXNwb25zZVR5cGU6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLnJlc3BvbnNlVHlwZSA9IHZhbHVlO1xuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0V2l0aENyZWRlbnRpYWxzOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy53aXRoQ3JlZGVudGlhbHMgPSB2YWx1ZTtcblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldE1pbWVUeXBlOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5taW1lVHlwZSA9IHZhbHVlO1xuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0UmVxdWVzdEhlYWRlcjogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMucmVxdWVzdEhlYWRlciA9IHZhbHVlO1xuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKlxuICogQWJzdHJhY3QgQmFzZSBjbGFzcyB0byBibG9jayBiYXNlZCB0ZXh0dXJlcyBsb2FkZXIgKGRkcywgcHZyLCAuLi4pXG4gKi9cblxuZnVuY3Rpb24gQ29tcHJlc3NlZFRleHR1cmVMb2FkZXIoIG1hbmFnZXIgKSB7XG5cblx0dGhpcy5tYW5hZ2VyID0gKCBtYW5hZ2VyICE9PSB1bmRlZmluZWQgKSA/IG1hbmFnZXIgOiBEZWZhdWx0TG9hZGluZ01hbmFnZXI7XG5cblx0Ly8gb3ZlcnJpZGUgaW4gc3ViIGNsYXNzZXNcblx0dGhpcy5fcGFyc2VyID0gbnVsbDtcblxufVxuXG5PYmplY3QuYXNzaWduKCBDb21wcmVzc2VkVGV4dHVyZUxvYWRlci5wcm90b3R5cGUsIHtcblxuXHRsb2FkOiBmdW5jdGlvbiAoIHVybCwgb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkge1xuXG5cdFx0dmFyIHNjb3BlID0gdGhpcztcblxuXHRcdHZhciBpbWFnZXMgPSBbXTtcblxuXHRcdHZhciB0ZXh0dXJlID0gbmV3IENvbXByZXNzZWRUZXh0dXJlKCk7XG5cdFx0dGV4dHVyZS5pbWFnZSA9IGltYWdlcztcblxuXHRcdHZhciBsb2FkZXIgPSBuZXcgRmlsZUxvYWRlciggdGhpcy5tYW5hZ2VyICk7XG5cdFx0bG9hZGVyLnNldFBhdGgoIHRoaXMucGF0aCApO1xuXHRcdGxvYWRlci5zZXRSZXNwb25zZVR5cGUoICdhcnJheWJ1ZmZlcicgKTtcblxuXHRcdGZ1bmN0aW9uIGxvYWRUZXh0dXJlKCBpICkge1xuXG5cdFx0XHRsb2FkZXIubG9hZCggdXJsWyBpIF0sIGZ1bmN0aW9uICggYnVmZmVyICkge1xuXG5cdFx0XHRcdHZhciB0ZXhEYXRhcyA9IHNjb3BlLl9wYXJzZXIoIGJ1ZmZlciwgdHJ1ZSApO1xuXG5cdFx0XHRcdGltYWdlc1sgaSBdID0ge1xuXHRcdFx0XHRcdHdpZHRoOiB0ZXhEYXRhcy53aWR0aCxcblx0XHRcdFx0XHRoZWlnaHQ6IHRleERhdGFzLmhlaWdodCxcblx0XHRcdFx0XHRmb3JtYXQ6IHRleERhdGFzLmZvcm1hdCxcblx0XHRcdFx0XHRtaXBtYXBzOiB0ZXhEYXRhcy5taXBtYXBzXG5cdFx0XHRcdH07XG5cblx0XHRcdFx0bG9hZGVkICs9IDE7XG5cblx0XHRcdFx0aWYgKCBsb2FkZWQgPT09IDYgKSB7XG5cblx0XHRcdFx0XHRpZiAoIHRleERhdGFzLm1pcG1hcENvdW50ID09PSAxIClcblx0XHRcdFx0XHRcdHRleHR1cmUubWluRmlsdGVyID0gTGluZWFyRmlsdGVyO1xuXG5cdFx0XHRcdFx0dGV4dHVyZS5mb3JtYXQgPSB0ZXhEYXRhcy5mb3JtYXQ7XG5cdFx0XHRcdFx0dGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdFx0XHRpZiAoIG9uTG9hZCApIG9uTG9hZCggdGV4dHVyZSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSwgb25Qcm9ncmVzcywgb25FcnJvciApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBBcnJheS5pc0FycmF5KCB1cmwgKSApIHtcblxuXHRcdFx0dmFyIGxvYWRlZCA9IDA7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSB1cmwubGVuZ3RoOyBpIDwgaWw7ICsrIGkgKSB7XG5cblx0XHRcdFx0bG9hZFRleHR1cmUoIGkgKTtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gY29tcHJlc3NlZCBjdWJlbWFwIHRleHR1cmUgc3RvcmVkIGluIGEgc2luZ2xlIEREUyBmaWxlXG5cblx0XHRcdGxvYWRlci5sb2FkKCB1cmwsIGZ1bmN0aW9uICggYnVmZmVyICkge1xuXG5cdFx0XHRcdHZhciB0ZXhEYXRhcyA9IHNjb3BlLl9wYXJzZXIoIGJ1ZmZlciwgdHJ1ZSApO1xuXG5cdFx0XHRcdGlmICggdGV4RGF0YXMuaXNDdWJlbWFwICkge1xuXG5cdFx0XHRcdFx0dmFyIGZhY2VzID0gdGV4RGF0YXMubWlwbWFwcy5sZW5ndGggLyB0ZXhEYXRhcy5taXBtYXBDb3VudDtcblxuXHRcdFx0XHRcdGZvciAoIHZhciBmID0gMDsgZiA8IGZhY2VzOyBmICsrICkge1xuXG5cdFx0XHRcdFx0XHRpbWFnZXNbIGYgXSA9IHsgbWlwbWFwczogW10gfTtcblxuXHRcdFx0XHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgdGV4RGF0YXMubWlwbWFwQ291bnQ7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdFx0aW1hZ2VzWyBmIF0ubWlwbWFwcy5wdXNoKCB0ZXhEYXRhcy5taXBtYXBzWyBmICogdGV4RGF0YXMubWlwbWFwQ291bnQgKyBpIF0gKTtcblx0XHRcdFx0XHRcdFx0aW1hZ2VzWyBmIF0uZm9ybWF0ID0gdGV4RGF0YXMuZm9ybWF0O1xuXHRcdFx0XHRcdFx0XHRpbWFnZXNbIGYgXS53aWR0aCA9IHRleERhdGFzLndpZHRoO1xuXHRcdFx0XHRcdFx0XHRpbWFnZXNbIGYgXS5oZWlnaHQgPSB0ZXhEYXRhcy5oZWlnaHQ7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0dGV4dHVyZS5pbWFnZS53aWR0aCA9IHRleERhdGFzLndpZHRoO1xuXHRcdFx0XHRcdHRleHR1cmUuaW1hZ2UuaGVpZ2h0ID0gdGV4RGF0YXMuaGVpZ2h0O1xuXHRcdFx0XHRcdHRleHR1cmUubWlwbWFwcyA9IHRleERhdGFzLm1pcG1hcHM7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICggdGV4RGF0YXMubWlwbWFwQ291bnQgPT09IDEgKSB7XG5cblx0XHRcdFx0XHR0ZXh0dXJlLm1pbkZpbHRlciA9IExpbmVhckZpbHRlcjtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGV4dHVyZS5mb3JtYXQgPSB0ZXhEYXRhcy5mb3JtYXQ7XG5cdFx0XHRcdHRleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHRcdGlmICggb25Mb2FkICkgb25Mb2FkKCB0ZXh0dXJlICk7XG5cblx0XHRcdH0sIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0ZXh0dXJlO1xuXG5cdH0sXG5cblx0c2V0UGF0aDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMucGF0aCA9IHZhbHVlO1xuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgTmlrb3MgTS4gLyBodHRwczovL2dpdGh1Yi5jb20vZm9vMTIzL1xuICpcbiAqIEFic3RyYWN0IEJhc2UgY2xhc3MgdG8gbG9hZCBnZW5lcmljIGJpbmFyeSB0ZXh0dXJlcyBmb3JtYXRzIChyZ2JlLCBoZHIsIC4uLilcbiAqL1xuXG5mdW5jdGlvbiBEYXRhVGV4dHVyZUxvYWRlciggbWFuYWdlciApIHtcblxuXHR0aGlzLm1hbmFnZXIgPSAoIG1hbmFnZXIgIT09IHVuZGVmaW5lZCApID8gbWFuYWdlciA6IERlZmF1bHRMb2FkaW5nTWFuYWdlcjtcblxuXHQvLyBvdmVycmlkZSBpbiBzdWIgY2xhc3Nlc1xuXHR0aGlzLl9wYXJzZXIgPSBudWxsO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIERhdGFUZXh0dXJlTG9hZGVyLnByb3RvdHlwZSwge1xuXG5cdGxvYWQ6IGZ1bmN0aW9uICggdXJsLCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKSB7XG5cblx0XHR2YXIgc2NvcGUgPSB0aGlzO1xuXG5cdFx0dmFyIHRleHR1cmUgPSBuZXcgRGF0YVRleHR1cmUoKTtcblxuXHRcdHZhciBsb2FkZXIgPSBuZXcgRmlsZUxvYWRlciggdGhpcy5tYW5hZ2VyICk7XG5cdFx0bG9hZGVyLnNldFJlc3BvbnNlVHlwZSggJ2FycmF5YnVmZmVyJyApO1xuXG5cdFx0bG9hZGVyLmxvYWQoIHVybCwgZnVuY3Rpb24gKCBidWZmZXIgKSB7XG5cblx0XHRcdHZhciB0ZXhEYXRhID0gc2NvcGUuX3BhcnNlciggYnVmZmVyICk7XG5cblx0XHRcdGlmICggISB0ZXhEYXRhICkgcmV0dXJuO1xuXG5cdFx0XHRpZiAoIHVuZGVmaW5lZCAhPT0gdGV4RGF0YS5pbWFnZSApIHtcblxuXHRcdFx0XHR0ZXh0dXJlLmltYWdlID0gdGV4RGF0YS5pbWFnZTtcblxuXHRcdFx0fSBlbHNlIGlmICggdW5kZWZpbmVkICE9PSB0ZXhEYXRhLmRhdGEgKSB7XG5cblx0XHRcdFx0dGV4dHVyZS5pbWFnZS53aWR0aCA9IHRleERhdGEud2lkdGg7XG5cdFx0XHRcdHRleHR1cmUuaW1hZ2UuaGVpZ2h0ID0gdGV4RGF0YS5oZWlnaHQ7XG5cdFx0XHRcdHRleHR1cmUuaW1hZ2UuZGF0YSA9IHRleERhdGEuZGF0YTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0ZXh0dXJlLndyYXBTID0gdW5kZWZpbmVkICE9PSB0ZXhEYXRhLndyYXBTID8gdGV4RGF0YS53cmFwUyA6IENsYW1wVG9FZGdlV3JhcHBpbmc7XG5cdFx0XHR0ZXh0dXJlLndyYXBUID0gdW5kZWZpbmVkICE9PSB0ZXhEYXRhLndyYXBUID8gdGV4RGF0YS53cmFwVCA6IENsYW1wVG9FZGdlV3JhcHBpbmc7XG5cblx0XHRcdHRleHR1cmUubWFnRmlsdGVyID0gdW5kZWZpbmVkICE9PSB0ZXhEYXRhLm1hZ0ZpbHRlciA/IHRleERhdGEubWFnRmlsdGVyIDogTGluZWFyRmlsdGVyO1xuXHRcdFx0dGV4dHVyZS5taW5GaWx0ZXIgPSB1bmRlZmluZWQgIT09IHRleERhdGEubWluRmlsdGVyID8gdGV4RGF0YS5taW5GaWx0ZXIgOiBMaW5lYXJNaXBNYXBMaW5lYXJGaWx0ZXI7XG5cblx0XHRcdHRleHR1cmUuYW5pc290cm9weSA9IHVuZGVmaW5lZCAhPT0gdGV4RGF0YS5hbmlzb3Ryb3B5ID8gdGV4RGF0YS5hbmlzb3Ryb3B5IDogMTtcblxuXHRcdFx0aWYgKCB1bmRlZmluZWQgIT09IHRleERhdGEuZm9ybWF0ICkge1xuXG5cdFx0XHRcdHRleHR1cmUuZm9ybWF0ID0gdGV4RGF0YS5mb3JtYXQ7XG5cblx0XHRcdH1cblx0XHRcdGlmICggdW5kZWZpbmVkICE9PSB0ZXhEYXRhLnR5cGUgKSB7XG5cblx0XHRcdFx0dGV4dHVyZS50eXBlID0gdGV4RGF0YS50eXBlO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggdW5kZWZpbmVkICE9PSB0ZXhEYXRhLm1pcG1hcHMgKSB7XG5cblx0XHRcdFx0dGV4dHVyZS5taXBtYXBzID0gdGV4RGF0YS5taXBtYXBzO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggMSA9PT0gdGV4RGF0YS5taXBtYXBDb3VudCApIHtcblxuXHRcdFx0XHR0ZXh0dXJlLm1pbkZpbHRlciA9IExpbmVhckZpbHRlcjtcblxuXHRcdFx0fVxuXG5cdFx0XHR0ZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0aWYgKCBvbkxvYWQgKSBvbkxvYWQoIHRleHR1cmUsIHRleERhdGEgKTtcblxuXHRcdH0sIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKTtcblxuXG5cdFx0cmV0dXJuIHRleHR1cmU7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBJbWFnZUxvYWRlciggbWFuYWdlciApIHtcblxuXHR0aGlzLm1hbmFnZXIgPSAoIG1hbmFnZXIgIT09IHVuZGVmaW5lZCApID8gbWFuYWdlciA6IERlZmF1bHRMb2FkaW5nTWFuYWdlcjtcblxufVxuXG5PYmplY3QuYXNzaWduKCBJbWFnZUxvYWRlci5wcm90b3R5cGUsIHtcblxuXHRjcm9zc09yaWdpbjogJ0Fub255bW91cycsXG5cblx0bG9hZDogZnVuY3Rpb24gKCB1cmwsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciApIHtcblxuXHRcdGlmICggdXJsID09PSB1bmRlZmluZWQgKSB1cmwgPSAnJztcblxuXHRcdGlmICggdGhpcy5wYXRoICE9PSB1bmRlZmluZWQgKSB1cmwgPSB0aGlzLnBhdGggKyB1cmw7XG5cblx0XHR1cmwgPSB0aGlzLm1hbmFnZXIucmVzb2x2ZVVSTCggdXJsICk7XG5cblx0XHR2YXIgc2NvcGUgPSB0aGlzO1xuXG5cdFx0dmFyIGNhY2hlZCA9IENhY2hlLmdldCggdXJsICk7XG5cblx0XHRpZiAoIGNhY2hlZCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1TdGFydCggdXJsICk7XG5cblx0XHRcdHNldFRpbWVvdXQoIGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0XHRpZiAoIG9uTG9hZCApIG9uTG9hZCggY2FjaGVkICk7XG5cblx0XHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRW5kKCB1cmwgKTtcblxuXHRcdFx0fSwgMCApO1xuXG5cdFx0XHRyZXR1cm4gY2FjaGVkO1xuXG5cdFx0fVxuXG5cdFx0dmFyIGltYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCcsICdpbWcnICk7XG5cblx0XHRpbWFnZS5hZGRFdmVudExpc3RlbmVyKCAnbG9hZCcsIGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Q2FjaGUuYWRkKCB1cmwsIHRoaXMgKTtcblxuXHRcdFx0aWYgKCBvbkxvYWQgKSBvbkxvYWQoIHRoaXMgKTtcblxuXHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRW5kKCB1cmwgKTtcblxuXHRcdH0sIGZhbHNlICk7XG5cblx0XHQvKlxuXHRcdGltYWdlLmFkZEV2ZW50TGlzdGVuZXIoICdwcm9ncmVzcycsIGZ1bmN0aW9uICggZXZlbnQgKSB7XG5cblx0XHRcdGlmICggb25Qcm9ncmVzcyApIG9uUHJvZ3Jlc3MoIGV2ZW50ICk7XG5cblx0XHR9LCBmYWxzZSApO1xuXHRcdCovXG5cblx0XHRpbWFnZS5hZGRFdmVudExpc3RlbmVyKCAnZXJyb3InLCBmdW5jdGlvbiAoIGV2ZW50ICkge1xuXG5cdFx0XHRpZiAoIG9uRXJyb3IgKSBvbkVycm9yKCBldmVudCApO1xuXG5cdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1FbmQoIHVybCApO1xuXHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRXJyb3IoIHVybCApO1xuXG5cdFx0fSwgZmFsc2UgKTtcblxuXHRcdGlmICggdXJsLnN1YnN0ciggMCwgNSApICE9PSAnZGF0YTonICkge1xuXG5cdFx0XHRpZiAoIHRoaXMuY3Jvc3NPcmlnaW4gIT09IHVuZGVmaW5lZCApIGltYWdlLmNyb3NzT3JpZ2luID0gdGhpcy5jcm9zc09yaWdpbjtcblxuXHRcdH1cblxuXHRcdHNjb3BlLm1hbmFnZXIuaXRlbVN0YXJ0KCB1cmwgKTtcblxuXHRcdGltYWdlLnNyYyA9IHVybDtcblxuXHRcdHJldHVybiBpbWFnZTtcblxuXHR9LFxuXG5cdHNldENyb3NzT3JpZ2luOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5jcm9zc09yaWdpbiA9IHZhbHVlO1xuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0UGF0aDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMucGF0aCA9IHZhbHVlO1xuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gQ3ViZVRleHR1cmVMb2FkZXIoIG1hbmFnZXIgKSB7XG5cblx0dGhpcy5tYW5hZ2VyID0gKCBtYW5hZ2VyICE9PSB1bmRlZmluZWQgKSA/IG1hbmFnZXIgOiBEZWZhdWx0TG9hZGluZ01hbmFnZXI7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggQ3ViZVRleHR1cmVMb2FkZXIucHJvdG90eXBlLCB7XG5cblx0Y3Jvc3NPcmlnaW46ICdBbm9ueW1vdXMnLFxuXG5cdGxvYWQ6IGZ1bmN0aW9uICggdXJscywgb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkge1xuXG5cdFx0dmFyIHRleHR1cmUgPSBuZXcgQ3ViZVRleHR1cmUoKTtcblxuXHRcdHZhciBsb2FkZXIgPSBuZXcgSW1hZ2VMb2FkZXIoIHRoaXMubWFuYWdlciApO1xuXHRcdGxvYWRlci5zZXRDcm9zc09yaWdpbiggdGhpcy5jcm9zc09yaWdpbiApO1xuXHRcdGxvYWRlci5zZXRQYXRoKCB0aGlzLnBhdGggKTtcblxuXHRcdHZhciBsb2FkZWQgPSAwO1xuXG5cdFx0ZnVuY3Rpb24gbG9hZFRleHR1cmUoIGkgKSB7XG5cblx0XHRcdGxvYWRlci5sb2FkKCB1cmxzWyBpIF0sIGZ1bmN0aW9uICggaW1hZ2UgKSB7XG5cblx0XHRcdFx0dGV4dHVyZS5pbWFnZXNbIGkgXSA9IGltYWdlO1xuXG5cdFx0XHRcdGxvYWRlZCArKztcblxuXHRcdFx0XHRpZiAoIGxvYWRlZCA9PT0gNiApIHtcblxuXHRcdFx0XHRcdHRleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHRcdFx0aWYgKCBvbkxvYWQgKSBvbkxvYWQoIHRleHR1cmUgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0sIHVuZGVmaW5lZCwgb25FcnJvciApO1xuXG5cdFx0fVxuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgdXJscy5sZW5ndGg7ICsrIGkgKSB7XG5cblx0XHRcdGxvYWRUZXh0dXJlKCBpICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGV4dHVyZTtcblxuXHR9LFxuXG5cdHNldENyb3NzT3JpZ2luOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5jcm9zc09yaWdpbiA9IHZhbHVlO1xuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0UGF0aDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMucGF0aCA9IHZhbHVlO1xuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gVGV4dHVyZUxvYWRlciggbWFuYWdlciApIHtcblxuXHR0aGlzLm1hbmFnZXIgPSAoIG1hbmFnZXIgIT09IHVuZGVmaW5lZCApID8gbWFuYWdlciA6IERlZmF1bHRMb2FkaW5nTWFuYWdlcjtcblxufVxuXG5PYmplY3QuYXNzaWduKCBUZXh0dXJlTG9hZGVyLnByb3RvdHlwZSwge1xuXG5cdGNyb3NzT3JpZ2luOiAnQW5vbnltb3VzJyxcblxuXHRsb2FkOiBmdW5jdGlvbiAoIHVybCwgb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkge1xuXG5cdFx0dmFyIHRleHR1cmUgPSBuZXcgVGV4dHVyZSgpO1xuXG5cdFx0dmFyIGxvYWRlciA9IG5ldyBJbWFnZUxvYWRlciggdGhpcy5tYW5hZ2VyICk7XG5cdFx0bG9hZGVyLnNldENyb3NzT3JpZ2luKCB0aGlzLmNyb3NzT3JpZ2luICk7XG5cdFx0bG9hZGVyLnNldFBhdGgoIHRoaXMucGF0aCApO1xuXG5cdFx0bG9hZGVyLmxvYWQoIHVybCwgZnVuY3Rpb24gKCBpbWFnZSApIHtcblxuXHRcdFx0dGV4dHVyZS5pbWFnZSA9IGltYWdlO1xuXG5cdFx0XHQvLyBKUEVHcyBjYW4ndCBoYXZlIGFuIGFscGhhIGNoYW5uZWwsIHNvIG1lbW9yeSBjYW4gYmUgc2F2ZWQgYnkgc3RvcmluZyB0aGVtIGFzIFJHQi5cblx0XHRcdHZhciBpc0pQRUcgPSB1cmwuc2VhcmNoKCAvXFwuKGpwZ3xqcGVnKSQvICkgPiAwIHx8IHVybC5zZWFyY2goIC9eZGF0YVxcOmltYWdlXFwvanBlZy8gKSA9PT0gMDtcblxuXHRcdFx0dGV4dHVyZS5mb3JtYXQgPSBpc0pQRUcgPyBSR0JGb3JtYXQgOiBSR0JBRm9ybWF0O1xuXHRcdFx0dGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdGlmICggb25Mb2FkICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0b25Mb2FkKCB0ZXh0dXJlICk7XG5cblx0XHRcdH1cblxuXHRcdH0sIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKTtcblxuXHRcdHJldHVybiB0ZXh0dXJlO1xuXG5cdH0sXG5cblx0c2V0Q3Jvc3NPcmlnaW46IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLmNyb3NzT3JpZ2luID0gdmFsdWU7XG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRQYXRoOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5wYXRoID0gdmFsdWU7XG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciB6ejg1IC8gaHR0cDovL3d3dy5sYWI0Z2FtZXMubmV0L3p6ODUvYmxvZ1xuICogRXh0ZW5zaWJsZSBjdXJ2ZSBvYmplY3RcbiAqXG4gKiBTb21lIGNvbW1vbiBvZiBjdXJ2ZSBtZXRob2RzOlxuICogLmdldFBvaW50KCB0LCBvcHRpb25hbFRhcmdldCApLCAuZ2V0VGFuZ2VudCggdCApXG4gKiAuZ2V0UG9pbnRBdCggdSwgb3B0aW9uYWxUYXJnZXQgKSwgLmdldFRhbmdlbnRBdCggdSApXG4gKiAuZ2V0UG9pbnRzKCksIC5nZXRTcGFjZWRQb2ludHMoKVxuICogLmdldExlbmd0aCgpXG4gKiAudXBkYXRlQXJjTGVuZ3RocygpXG4gKlxuICogVGhpcyBmb2xsb3dpbmcgY3VydmVzIGluaGVyaXQgZnJvbSBUSFJFRS5DdXJ2ZTpcbiAqXG4gKiAtLSAyRCBjdXJ2ZXMgLS1cbiAqIFRIUkVFLkFyY0N1cnZlXG4gKiBUSFJFRS5DdWJpY0JlemllckN1cnZlXG4gKiBUSFJFRS5FbGxpcHNlQ3VydmVcbiAqIFRIUkVFLkxpbmVDdXJ2ZVxuICogVEhSRUUuUXVhZHJhdGljQmV6aWVyQ3VydmVcbiAqIFRIUkVFLlNwbGluZUN1cnZlXG4gKlxuICogLS0gM0QgY3VydmVzIC0tXG4gKiBUSFJFRS5DYXRtdWxsUm9tQ3VydmUzXG4gKiBUSFJFRS5DdWJpY0JlemllckN1cnZlM1xuICogVEhSRUUuTGluZUN1cnZlM1xuICogVEhSRUUuUXVhZHJhdGljQmV6aWVyQ3VydmUzXG4gKlxuICogQSBzZXJpZXMgb2YgY3VydmVzIGNhbiBiZSByZXByZXNlbnRlZCBhcyBhIFRIUkVFLkN1cnZlUGF0aC5cbiAqXG4gKiovXG5cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICpcdEFic3RyYWN0IEN1cnZlIGJhc2UgY2xhc3NcbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuZnVuY3Rpb24gQ3VydmUoKSB7XG5cblx0dGhpcy50eXBlID0gJ0N1cnZlJztcblxuXHR0aGlzLmFyY0xlbmd0aERpdmlzaW9ucyA9IDIwMDtcblxufVxuXG5PYmplY3QuYXNzaWduKCBDdXJ2ZS5wcm90b3R5cGUsIHtcblxuXHQvLyBWaXJ0dWFsIGJhc2UgY2xhc3MgbWV0aG9kIHRvIG92ZXJ3cml0ZSBhbmQgaW1wbGVtZW50IGluIHN1YmNsYXNzZXNcblx0Ly9cdC0gdCBbMCAuLiAxXVxuXG5cdGdldFBvaW50OiBmdW5jdGlvbiAoIC8qIHQsIG9wdGlvbmFsVGFyZ2V0ICovICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQ3VydmU6IC5nZXRQb2ludCgpIG5vdCBpbXBsZW1lbnRlZC4nICk7XG5cdFx0cmV0dXJuIG51bGw7XG5cblx0fSxcblxuXHQvLyBHZXQgcG9pbnQgYXQgcmVsYXRpdmUgcG9zaXRpb24gaW4gY3VydmUgYWNjb3JkaW5nIHRvIGFyYyBsZW5ndGhcblx0Ly8gLSB1IFswIC4uIDFdXG5cblx0Z2V0UG9pbnRBdDogZnVuY3Rpb24gKCB1LCBvcHRpb25hbFRhcmdldCApIHtcblxuXHRcdHZhciB0ID0gdGhpcy5nZXRVdG9UbWFwcGluZyggdSApO1xuXHRcdHJldHVybiB0aGlzLmdldFBvaW50KCB0LCBvcHRpb25hbFRhcmdldCApO1xuXG5cdH0sXG5cblx0Ly8gR2V0IHNlcXVlbmNlIG9mIHBvaW50cyB1c2luZyBnZXRQb2ludCggdCApXG5cblx0Z2V0UG9pbnRzOiBmdW5jdGlvbiAoIGRpdmlzaW9ucyApIHtcblxuXHRcdGlmICggZGl2aXNpb25zID09PSB1bmRlZmluZWQgKSBkaXZpc2lvbnMgPSA1O1xuXG5cdFx0dmFyIHBvaW50cyA9IFtdO1xuXG5cdFx0Zm9yICggdmFyIGQgPSAwOyBkIDw9IGRpdmlzaW9uczsgZCArKyApIHtcblxuXHRcdFx0cG9pbnRzLnB1c2goIHRoaXMuZ2V0UG9pbnQoIGQgLyBkaXZpc2lvbnMgKSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHBvaW50cztcblxuXHR9LFxuXG5cdC8vIEdldCBzZXF1ZW5jZSBvZiBwb2ludHMgdXNpbmcgZ2V0UG9pbnRBdCggdSApXG5cblx0Z2V0U3BhY2VkUG9pbnRzOiBmdW5jdGlvbiAoIGRpdmlzaW9ucyApIHtcblxuXHRcdGlmICggZGl2aXNpb25zID09PSB1bmRlZmluZWQgKSBkaXZpc2lvbnMgPSA1O1xuXG5cdFx0dmFyIHBvaW50cyA9IFtdO1xuXG5cdFx0Zm9yICggdmFyIGQgPSAwOyBkIDw9IGRpdmlzaW9uczsgZCArKyApIHtcblxuXHRcdFx0cG9pbnRzLnB1c2goIHRoaXMuZ2V0UG9pbnRBdCggZCAvIGRpdmlzaW9ucyApICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gcG9pbnRzO1xuXG5cdH0sXG5cblx0Ly8gR2V0IHRvdGFsIGN1cnZlIGFyYyBsZW5ndGhcblxuXHRnZXRMZW5ndGg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBsZW5ndGhzID0gdGhpcy5nZXRMZW5ndGhzKCk7XG5cdFx0cmV0dXJuIGxlbmd0aHNbIGxlbmd0aHMubGVuZ3RoIC0gMSBdO1xuXG5cdH0sXG5cblx0Ly8gR2V0IGxpc3Qgb2YgY3VtdWxhdGl2ZSBzZWdtZW50IGxlbmd0aHNcblxuXHRnZXRMZW5ndGhzOiBmdW5jdGlvbiAoIGRpdmlzaW9ucyApIHtcblxuXHRcdGlmICggZGl2aXNpb25zID09PSB1bmRlZmluZWQgKSBkaXZpc2lvbnMgPSB0aGlzLmFyY0xlbmd0aERpdmlzaW9ucztcblxuXHRcdGlmICggdGhpcy5jYWNoZUFyY0xlbmd0aHMgJiZcblx0XHRcdCggdGhpcy5jYWNoZUFyY0xlbmd0aHMubGVuZ3RoID09PSBkaXZpc2lvbnMgKyAxICkgJiZcblx0XHRcdCEgdGhpcy5uZWVkc1VwZGF0ZSApIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMuY2FjaGVBcmNMZW5ndGhzO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5uZWVkc1VwZGF0ZSA9IGZhbHNlO1xuXG5cdFx0dmFyIGNhY2hlID0gW107XG5cdFx0dmFyIGN1cnJlbnQsIGxhc3QgPSB0aGlzLmdldFBvaW50KCAwICk7XG5cdFx0dmFyIHAsIHN1bSA9IDA7XG5cblx0XHRjYWNoZS5wdXNoKCAwICk7XG5cblx0XHRmb3IgKCBwID0gMTsgcCA8PSBkaXZpc2lvbnM7IHAgKysgKSB7XG5cblx0XHRcdGN1cnJlbnQgPSB0aGlzLmdldFBvaW50KCBwIC8gZGl2aXNpb25zICk7XG5cdFx0XHRzdW0gKz0gY3VycmVudC5kaXN0YW5jZVRvKCBsYXN0ICk7XG5cdFx0XHRjYWNoZS5wdXNoKCBzdW0gKTtcblx0XHRcdGxhc3QgPSBjdXJyZW50O1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5jYWNoZUFyY0xlbmd0aHMgPSBjYWNoZTtcblxuXHRcdHJldHVybiBjYWNoZTsgLy8geyBzdW1zOiBjYWNoZSwgc3VtOiBzdW0gfTsgU3VtIGlzIGluIHRoZSBsYXN0IGVsZW1lbnQuXG5cblx0fSxcblxuXHR1cGRhdGVBcmNMZW5ndGhzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblx0XHR0aGlzLmdldExlbmd0aHMoKTtcblxuXHR9LFxuXG5cdC8vIEdpdmVuIHUgKCAwIC4uIDEgKSwgZ2V0IGEgdCB0byBmaW5kIHAuIFRoaXMgZ2l2ZXMgeW91IHBvaW50cyB3aGljaCBhcmUgZXF1aWRpc3RhbnRcblxuXHRnZXRVdG9UbWFwcGluZzogZnVuY3Rpb24gKCB1LCBkaXN0YW5jZSApIHtcblxuXHRcdHZhciBhcmNMZW5ndGhzID0gdGhpcy5nZXRMZW5ndGhzKCk7XG5cblx0XHR2YXIgaSA9IDAsIGlsID0gYXJjTGVuZ3Rocy5sZW5ndGg7XG5cblx0XHR2YXIgdGFyZ2V0QXJjTGVuZ3RoOyAvLyBUaGUgdGFyZ2V0ZWQgdSBkaXN0YW5jZSB2YWx1ZSB0byBnZXRcblxuXHRcdGlmICggZGlzdGFuY2UgKSB7XG5cblx0XHRcdHRhcmdldEFyY0xlbmd0aCA9IGRpc3RhbmNlO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dGFyZ2V0QXJjTGVuZ3RoID0gdSAqIGFyY0xlbmd0aHNbIGlsIC0gMSBdO1xuXG5cdFx0fVxuXG5cdFx0Ly8gYmluYXJ5IHNlYXJjaCBmb3IgdGhlIGluZGV4IHdpdGggbGFyZ2VzdCB2YWx1ZSBzbWFsbGVyIHRoYW4gdGFyZ2V0IHUgZGlzdGFuY2VcblxuXHRcdHZhciBsb3cgPSAwLCBoaWdoID0gaWwgLSAxLCBjb21wYXJpc29uO1xuXG5cdFx0d2hpbGUgKCBsb3cgPD0gaGlnaCApIHtcblxuXHRcdFx0aSA9IE1hdGguZmxvb3IoIGxvdyArICggaGlnaCAtIGxvdyApIC8gMiApOyAvLyBsZXNzIGxpa2VseSB0byBvdmVyZmxvdywgdGhvdWdoIHByb2JhYmx5IG5vdCBpc3N1ZSBoZXJlLCBKUyBkb2Vzbid0IHJlYWxseSBoYXZlIGludGVnZXJzLCBhbGwgbnVtYmVycyBhcmUgZmxvYXRzXG5cblx0XHRcdGNvbXBhcmlzb24gPSBhcmNMZW5ndGhzWyBpIF0gLSB0YXJnZXRBcmNMZW5ndGg7XG5cblx0XHRcdGlmICggY29tcGFyaXNvbiA8IDAgKSB7XG5cblx0XHRcdFx0bG93ID0gaSArIDE7XG5cblx0XHRcdH0gZWxzZSBpZiAoIGNvbXBhcmlzb24gPiAwICkge1xuXG5cdFx0XHRcdGhpZ2ggPSBpIC0gMTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRoaWdoID0gaTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Ly8gRE9ORVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpID0gaGlnaDtcblxuXHRcdGlmICggYXJjTGVuZ3Roc1sgaSBdID09PSB0YXJnZXRBcmNMZW5ndGggKSB7XG5cblx0XHRcdHJldHVybiBpIC8gKCBpbCAtIDEgKTtcblxuXHRcdH1cblxuXHRcdC8vIHdlIGNvdWxkIGdldCBmaW5lciBncmFpbiBhdCBsZW5ndGhzLCBvciB1c2Ugc2ltcGxlIGludGVycG9sYXRpb24gYmV0d2VlbiB0d28gcG9pbnRzXG5cblx0XHR2YXIgbGVuZ3RoQmVmb3JlID0gYXJjTGVuZ3Roc1sgaSBdO1xuXHRcdHZhciBsZW5ndGhBZnRlciA9IGFyY0xlbmd0aHNbIGkgKyAxIF07XG5cblx0XHR2YXIgc2VnbWVudExlbmd0aCA9IGxlbmd0aEFmdGVyIC0gbGVuZ3RoQmVmb3JlO1xuXG5cdFx0Ly8gZGV0ZXJtaW5lIHdoZXJlIHdlIGFyZSBiZXR3ZWVuIHRoZSAnYmVmb3JlJyBhbmQgJ2FmdGVyJyBwb2ludHNcblxuXHRcdHZhciBzZWdtZW50RnJhY3Rpb24gPSAoIHRhcmdldEFyY0xlbmd0aCAtIGxlbmd0aEJlZm9yZSApIC8gc2VnbWVudExlbmd0aDtcblxuXHRcdC8vIGFkZCB0aGF0IGZyYWN0aW9uYWwgYW1vdW50IHRvIHRcblxuXHRcdHZhciB0ID0gKCBpICsgc2VnbWVudEZyYWN0aW9uICkgLyAoIGlsIC0gMSApO1xuXG5cdFx0cmV0dXJuIHQ7XG5cblx0fSxcblxuXHQvLyBSZXR1cm5zIGEgdW5pdCB2ZWN0b3IgdGFuZ2VudCBhdCB0XG5cdC8vIEluIGNhc2UgYW55IHN1YiBjdXJ2ZSBkb2VzIG5vdCBpbXBsZW1lbnQgaXRzIHRhbmdlbnQgZGVyaXZhdGlvbixcblx0Ly8gMiBwb2ludHMgYSBzbWFsbCBkZWx0YSBhcGFydCB3aWxsIGJlIHVzZWQgdG8gZmluZCBpdHMgZ3JhZGllbnRcblx0Ly8gd2hpY2ggc2VlbXMgdG8gZ2l2ZSBhIHJlYXNvbmFibGUgYXBwcm94aW1hdGlvblxuXG5cdGdldFRhbmdlbnQ6IGZ1bmN0aW9uICggdCApIHtcblxuXHRcdHZhciBkZWx0YSA9IDAuMDAwMTtcblx0XHR2YXIgdDEgPSB0IC0gZGVsdGE7XG5cdFx0dmFyIHQyID0gdCArIGRlbHRhO1xuXG5cdFx0Ly8gQ2FwcGluZyBpbiBjYXNlIG9mIGRhbmdlclxuXG5cdFx0aWYgKCB0MSA8IDAgKSB0MSA9IDA7XG5cdFx0aWYgKCB0MiA+IDEgKSB0MiA9IDE7XG5cblx0XHR2YXIgcHQxID0gdGhpcy5nZXRQb2ludCggdDEgKTtcblx0XHR2YXIgcHQyID0gdGhpcy5nZXRQb2ludCggdDIgKTtcblxuXHRcdHZhciB2ZWMgPSBwdDIuY2xvbmUoKS5zdWIoIHB0MSApO1xuXHRcdHJldHVybiB2ZWMubm9ybWFsaXplKCk7XG5cblx0fSxcblxuXHRnZXRUYW5nZW50QXQ6IGZ1bmN0aW9uICggdSApIHtcblxuXHRcdHZhciB0ID0gdGhpcy5nZXRVdG9UbWFwcGluZyggdSApO1xuXHRcdHJldHVybiB0aGlzLmdldFRhbmdlbnQoIHQgKTtcblxuXHR9LFxuXG5cdGNvbXB1dGVGcmVuZXRGcmFtZXM6IGZ1bmN0aW9uICggc2VnbWVudHMsIGNsb3NlZCApIHtcblxuXHRcdC8vIHNlZSBodHRwOi8vd3d3LmNzLmluZGlhbmEuZWR1L3B1Yi90ZWNocmVwb3J0cy9UUjQyNS5wZGZcblxuXHRcdHZhciBub3JtYWwgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0dmFyIHRhbmdlbnRzID0gW107XG5cdFx0dmFyIG5vcm1hbHMgPSBbXTtcblx0XHR2YXIgYmlub3JtYWxzID0gW107XG5cblx0XHR2YXIgdmVjID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgbWF0ID0gbmV3IE1hdHJpeDQoKTtcblxuXHRcdHZhciBpLCB1LCB0aGV0YTtcblxuXHRcdC8vIGNvbXB1dGUgdGhlIHRhbmdlbnQgdmVjdG9ycyBmb3IgZWFjaCBzZWdtZW50IG9uIHRoZSBjdXJ2ZVxuXG5cdFx0Zm9yICggaSA9IDA7IGkgPD0gc2VnbWVudHM7IGkgKysgKSB7XG5cblx0XHRcdHUgPSBpIC8gc2VnbWVudHM7XG5cblx0XHRcdHRhbmdlbnRzWyBpIF0gPSB0aGlzLmdldFRhbmdlbnRBdCggdSApO1xuXHRcdFx0dGFuZ2VudHNbIGkgXS5ub3JtYWxpemUoKTtcblxuXHRcdH1cblxuXHRcdC8vIHNlbGVjdCBhbiBpbml0aWFsIG5vcm1hbCB2ZWN0b3IgcGVycGVuZGljdWxhciB0byB0aGUgZmlyc3QgdGFuZ2VudCB2ZWN0b3IsXG5cdFx0Ly8gYW5kIGluIHRoZSBkaXJlY3Rpb24gb2YgdGhlIG1pbmltdW0gdGFuZ2VudCB4eXogY29tcG9uZW50XG5cblx0XHRub3JtYWxzWyAwIF0gPSBuZXcgVmVjdG9yMygpO1xuXHRcdGJpbm9ybWFsc1sgMCBdID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgbWluID0gTnVtYmVyLk1BWF9WQUxVRTtcblx0XHR2YXIgdHggPSBNYXRoLmFicyggdGFuZ2VudHNbIDAgXS54ICk7XG5cdFx0dmFyIHR5ID0gTWF0aC5hYnMoIHRhbmdlbnRzWyAwIF0ueSApO1xuXHRcdHZhciB0eiA9IE1hdGguYWJzKCB0YW5nZW50c1sgMCBdLnogKTtcblxuXHRcdGlmICggdHggPD0gbWluICkge1xuXG5cdFx0XHRtaW4gPSB0eDtcblx0XHRcdG5vcm1hbC5zZXQoIDEsIDAsIDAgKTtcblxuXHRcdH1cblxuXHRcdGlmICggdHkgPD0gbWluICkge1xuXG5cdFx0XHRtaW4gPSB0eTtcblx0XHRcdG5vcm1hbC5zZXQoIDAsIDEsIDAgKTtcblxuXHRcdH1cblxuXHRcdGlmICggdHogPD0gbWluICkge1xuXG5cdFx0XHRub3JtYWwuc2V0KCAwLCAwLCAxICk7XG5cblx0XHR9XG5cblx0XHR2ZWMuY3Jvc3NWZWN0b3JzKCB0YW5nZW50c1sgMCBdLCBub3JtYWwgKS5ub3JtYWxpemUoKTtcblxuXHRcdG5vcm1hbHNbIDAgXS5jcm9zc1ZlY3RvcnMoIHRhbmdlbnRzWyAwIF0sIHZlYyApO1xuXHRcdGJpbm9ybWFsc1sgMCBdLmNyb3NzVmVjdG9ycyggdGFuZ2VudHNbIDAgXSwgbm9ybWFsc1sgMCBdICk7XG5cblxuXHRcdC8vIGNvbXB1dGUgdGhlIHNsb3dseS12YXJ5aW5nIG5vcm1hbCBhbmQgYmlub3JtYWwgdmVjdG9ycyBmb3IgZWFjaCBzZWdtZW50IG9uIHRoZSBjdXJ2ZVxuXG5cdFx0Zm9yICggaSA9IDE7IGkgPD0gc2VnbWVudHM7IGkgKysgKSB7XG5cblx0XHRcdG5vcm1hbHNbIGkgXSA9IG5vcm1hbHNbIGkgLSAxIF0uY2xvbmUoKTtcblxuXHRcdFx0Ymlub3JtYWxzWyBpIF0gPSBiaW5vcm1hbHNbIGkgLSAxIF0uY2xvbmUoKTtcblxuXHRcdFx0dmVjLmNyb3NzVmVjdG9ycyggdGFuZ2VudHNbIGkgLSAxIF0sIHRhbmdlbnRzWyBpIF0gKTtcblxuXHRcdFx0aWYgKCB2ZWMubGVuZ3RoKCkgPiBOdW1iZXIuRVBTSUxPTiApIHtcblxuXHRcdFx0XHR2ZWMubm9ybWFsaXplKCk7XG5cblx0XHRcdFx0dGhldGEgPSBNYXRoLmFjb3MoIF9NYXRoLmNsYW1wKCB0YW5nZW50c1sgaSAtIDEgXS5kb3QoIHRhbmdlbnRzWyBpIF0gKSwgLSAxLCAxICkgKTsgLy8gY2xhbXAgZm9yIGZsb2F0aW5nIHB0IGVycm9yc1xuXG5cdFx0XHRcdG5vcm1hbHNbIGkgXS5hcHBseU1hdHJpeDQoIG1hdC5tYWtlUm90YXRpb25BeGlzKCB2ZWMsIHRoZXRhICkgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRiaW5vcm1hbHNbIGkgXS5jcm9zc1ZlY3RvcnMoIHRhbmdlbnRzWyBpIF0sIG5vcm1hbHNbIGkgXSApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gaWYgdGhlIGN1cnZlIGlzIGNsb3NlZCwgcG9zdHByb2Nlc3MgdGhlIHZlY3RvcnMgc28gdGhlIGZpcnN0IGFuZCBsYXN0IG5vcm1hbCB2ZWN0b3JzIGFyZSB0aGUgc2FtZVxuXG5cdFx0aWYgKCBjbG9zZWQgPT09IHRydWUgKSB7XG5cblx0XHRcdHRoZXRhID0gTWF0aC5hY29zKCBfTWF0aC5jbGFtcCggbm9ybWFsc1sgMCBdLmRvdCggbm9ybWFsc1sgc2VnbWVudHMgXSApLCAtIDEsIDEgKSApO1xuXHRcdFx0dGhldGEgLz0gc2VnbWVudHM7XG5cblx0XHRcdGlmICggdGFuZ2VudHNbIDAgXS5kb3QoIHZlYy5jcm9zc1ZlY3RvcnMoIG5vcm1hbHNbIDAgXSwgbm9ybWFsc1sgc2VnbWVudHMgXSApICkgPiAwICkge1xuXG5cdFx0XHRcdHRoZXRhID0gLSB0aGV0YTtcblxuXHRcdFx0fVxuXG5cdFx0XHRmb3IgKCBpID0gMTsgaSA8PSBzZWdtZW50czsgaSArKyApIHtcblxuXHRcdFx0XHQvLyB0d2lzdCBhIGxpdHRsZS4uLlxuXHRcdFx0XHRub3JtYWxzWyBpIF0uYXBwbHlNYXRyaXg0KCBtYXQubWFrZVJvdGF0aW9uQXhpcyggdGFuZ2VudHNbIGkgXSwgdGhldGEgKiBpICkgKTtcblx0XHRcdFx0Ymlub3JtYWxzWyBpIF0uY3Jvc3NWZWN0b3JzKCB0YW5nZW50c1sgaSBdLCBub3JtYWxzWyBpIF0gKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHtcblx0XHRcdHRhbmdlbnRzOiB0YW5nZW50cyxcblx0XHRcdG5vcm1hbHM6IG5vcm1hbHMsXG5cdFx0XHRiaW5vcm1hbHM6IGJpbm9ybWFsc1xuXHRcdH07XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHR0aGlzLmFyY0xlbmd0aERpdmlzaW9ucyA9IHNvdXJjZS5hcmNMZW5ndGhEaXZpc2lvbnM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGRhdGEgPSB7XG5cdFx0XHRtZXRhZGF0YToge1xuXHRcdFx0XHR2ZXJzaW9uOiA0LjUsXG5cdFx0XHRcdHR5cGU6ICdDdXJ2ZScsXG5cdFx0XHRcdGdlbmVyYXRvcjogJ0N1cnZlLnRvSlNPTidcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0ZGF0YS5hcmNMZW5ndGhEaXZpc2lvbnMgPSB0aGlzLmFyY0xlbmd0aERpdmlzaW9ucztcblx0XHRkYXRhLnR5cGUgPSB0aGlzLnR5cGU7XG5cblx0XHRyZXR1cm4gZGF0YTtcblxuXHR9LFxuXG5cdGZyb21KU09OOiBmdW5jdGlvbiAoIGpzb24gKSB7XG5cblx0XHR0aGlzLmFyY0xlbmd0aERpdmlzaW9ucyA9IGpzb24uYXJjTGVuZ3RoRGl2aXNpb25zO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbmZ1bmN0aW9uIEVsbGlwc2VDdXJ2ZSggYVgsIGFZLCB4UmFkaXVzLCB5UmFkaXVzLCBhU3RhcnRBbmdsZSwgYUVuZEFuZ2xlLCBhQ2xvY2t3aXNlLCBhUm90YXRpb24gKSB7XG5cblx0Q3VydmUuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdFbGxpcHNlQ3VydmUnO1xuXG5cdHRoaXMuYVggPSBhWCB8fCAwO1xuXHR0aGlzLmFZID0gYVkgfHwgMDtcblxuXHR0aGlzLnhSYWRpdXMgPSB4UmFkaXVzIHx8IDE7XG5cdHRoaXMueVJhZGl1cyA9IHlSYWRpdXMgfHwgMTtcblxuXHR0aGlzLmFTdGFydEFuZ2xlID0gYVN0YXJ0QW5nbGUgfHwgMDtcblx0dGhpcy5hRW5kQW5nbGUgPSBhRW5kQW5nbGUgfHwgMiAqIE1hdGguUEk7XG5cblx0dGhpcy5hQ2xvY2t3aXNlID0gYUNsb2Nrd2lzZSB8fCBmYWxzZTtcblxuXHR0aGlzLmFSb3RhdGlvbiA9IGFSb3RhdGlvbiB8fCAwO1xuXG59XG5cbkVsbGlwc2VDdXJ2ZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDdXJ2ZS5wcm90b3R5cGUgKTtcbkVsbGlwc2VDdXJ2ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBFbGxpcHNlQ3VydmU7XG5cbkVsbGlwc2VDdXJ2ZS5wcm90b3R5cGUuaXNFbGxpcHNlQ3VydmUgPSB0cnVlO1xuXG5FbGxpcHNlQ3VydmUucHJvdG90eXBlLmdldFBvaW50ID0gZnVuY3Rpb24gKCB0LCBvcHRpb25hbFRhcmdldCApIHtcblxuXHR2YXIgcG9pbnQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgVmVjdG9yMigpO1xuXG5cdHZhciB0d29QaSA9IE1hdGguUEkgKiAyO1xuXHR2YXIgZGVsdGFBbmdsZSA9IHRoaXMuYUVuZEFuZ2xlIC0gdGhpcy5hU3RhcnRBbmdsZTtcblx0dmFyIHNhbWVQb2ludHMgPSBNYXRoLmFicyggZGVsdGFBbmdsZSApIDwgTnVtYmVyLkVQU0lMT047XG5cblx0Ly8gZW5zdXJlcyB0aGF0IGRlbHRhQW5nbGUgaXMgMCAuLiAyIFBJXG5cdHdoaWxlICggZGVsdGFBbmdsZSA8IDAgKSBkZWx0YUFuZ2xlICs9IHR3b1BpO1xuXHR3aGlsZSAoIGRlbHRhQW5nbGUgPiB0d29QaSApIGRlbHRhQW5nbGUgLT0gdHdvUGk7XG5cblx0aWYgKCBkZWx0YUFuZ2xlIDwgTnVtYmVyLkVQU0lMT04gKSB7XG5cblx0XHRpZiAoIHNhbWVQb2ludHMgKSB7XG5cblx0XHRcdGRlbHRhQW5nbGUgPSAwO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0ZGVsdGFBbmdsZSA9IHR3b1BpO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRpZiAoIHRoaXMuYUNsb2Nrd2lzZSA9PT0gdHJ1ZSAmJiAhIHNhbWVQb2ludHMgKSB7XG5cblx0XHRpZiAoIGRlbHRhQW5nbGUgPT09IHR3b1BpICkge1xuXG5cdFx0XHRkZWx0YUFuZ2xlID0gLSB0d29QaTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGRlbHRhQW5nbGUgPSBkZWx0YUFuZ2xlIC0gdHdvUGk7XG5cblx0XHR9XG5cblx0fVxuXG5cdHZhciBhbmdsZSA9IHRoaXMuYVN0YXJ0QW5nbGUgKyB0ICogZGVsdGFBbmdsZTtcblx0dmFyIHggPSB0aGlzLmFYICsgdGhpcy54UmFkaXVzICogTWF0aC5jb3MoIGFuZ2xlICk7XG5cdHZhciB5ID0gdGhpcy5hWSArIHRoaXMueVJhZGl1cyAqIE1hdGguc2luKCBhbmdsZSApO1xuXG5cdGlmICggdGhpcy5hUm90YXRpb24gIT09IDAgKSB7XG5cblx0XHR2YXIgY29zID0gTWF0aC5jb3MoIHRoaXMuYVJvdGF0aW9uICk7XG5cdFx0dmFyIHNpbiA9IE1hdGguc2luKCB0aGlzLmFSb3RhdGlvbiApO1xuXG5cdFx0dmFyIHR4ID0geCAtIHRoaXMuYVg7XG5cdFx0dmFyIHR5ID0geSAtIHRoaXMuYVk7XG5cblx0XHQvLyBSb3RhdGUgdGhlIHBvaW50IGFib3V0IHRoZSBjZW50ZXIgb2YgdGhlIGVsbGlwc2UuXG5cdFx0eCA9IHR4ICogY29zIC0gdHkgKiBzaW4gKyB0aGlzLmFYO1xuXHRcdHkgPSB0eCAqIHNpbiArIHR5ICogY29zICsgdGhpcy5hWTtcblxuXHR9XG5cblx0cmV0dXJuIHBvaW50LnNldCggeCwgeSApO1xuXG59O1xuXG5FbGxpcHNlQ3VydmUucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRDdXJ2ZS5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHR0aGlzLmFYID0gc291cmNlLmFYO1xuXHR0aGlzLmFZID0gc291cmNlLmFZO1xuXG5cdHRoaXMueFJhZGl1cyA9IHNvdXJjZS54UmFkaXVzO1xuXHR0aGlzLnlSYWRpdXMgPSBzb3VyY2UueVJhZGl1cztcblxuXHR0aGlzLmFTdGFydEFuZ2xlID0gc291cmNlLmFTdGFydEFuZ2xlO1xuXHR0aGlzLmFFbmRBbmdsZSA9IHNvdXJjZS5hRW5kQW5nbGU7XG5cblx0dGhpcy5hQ2xvY2t3aXNlID0gc291cmNlLmFDbG9ja3dpc2U7XG5cblx0dGhpcy5hUm90YXRpb24gPSBzb3VyY2UuYVJvdGF0aW9uO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG5cbkVsbGlwc2VDdXJ2ZS5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gKCkge1xuXG5cdHZhciBkYXRhID0gQ3VydmUucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzICk7XG5cblx0ZGF0YS5hWCA9IHRoaXMuYVg7XG5cdGRhdGEuYVkgPSB0aGlzLmFZO1xuXG5cdGRhdGEueFJhZGl1cyA9IHRoaXMueFJhZGl1cztcblx0ZGF0YS55UmFkaXVzID0gdGhpcy55UmFkaXVzO1xuXG5cdGRhdGEuYVN0YXJ0QW5nbGUgPSB0aGlzLmFTdGFydEFuZ2xlO1xuXHRkYXRhLmFFbmRBbmdsZSA9IHRoaXMuYUVuZEFuZ2xlO1xuXG5cdGRhdGEuYUNsb2Nrd2lzZSA9IHRoaXMuYUNsb2Nrd2lzZTtcblxuXHRkYXRhLmFSb3RhdGlvbiA9IHRoaXMuYVJvdGF0aW9uO1xuXG5cdHJldHVybiBkYXRhO1xuXG59O1xuXG5FbGxpcHNlQ3VydmUucHJvdG90eXBlLmZyb21KU09OID0gZnVuY3Rpb24gKCBqc29uICkge1xuXG5cdEN1cnZlLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKCB0aGlzLCBqc29uICk7XG5cblx0dGhpcy5hWCA9IGpzb24uYVg7XG5cdHRoaXMuYVkgPSBqc29uLmFZO1xuXG5cdHRoaXMueFJhZGl1cyA9IGpzb24ueFJhZGl1cztcblx0dGhpcy55UmFkaXVzID0ganNvbi55UmFkaXVzO1xuXG5cdHRoaXMuYVN0YXJ0QW5nbGUgPSBqc29uLmFTdGFydEFuZ2xlO1xuXHR0aGlzLmFFbmRBbmdsZSA9IGpzb24uYUVuZEFuZ2xlO1xuXG5cdHRoaXMuYUNsb2Nrd2lzZSA9IGpzb24uYUNsb2Nrd2lzZTtcblxuXHR0aGlzLmFSb3RhdGlvbiA9IGpzb24uYVJvdGF0aW9uO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG5mdW5jdGlvbiBBcmNDdXJ2ZSggYVgsIGFZLCBhUmFkaXVzLCBhU3RhcnRBbmdsZSwgYUVuZEFuZ2xlLCBhQ2xvY2t3aXNlICkge1xuXG5cdEVsbGlwc2VDdXJ2ZS5jYWxsKCB0aGlzLCBhWCwgYVksIGFSYWRpdXMsIGFSYWRpdXMsIGFTdGFydEFuZ2xlLCBhRW5kQW5nbGUsIGFDbG9ja3dpc2UgKTtcblxuXHR0aGlzLnR5cGUgPSAnQXJjQ3VydmUnO1xuXG59XG5cbkFyY0N1cnZlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEVsbGlwc2VDdXJ2ZS5wcm90b3R5cGUgKTtcbkFyY0N1cnZlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEFyY0N1cnZlO1xuXG5BcmNDdXJ2ZS5wcm90b3R5cGUuaXNBcmNDdXJ2ZSA9IHRydWU7XG5cbi8qKlxuICogQGF1dGhvciB6ejg1IGh0dHBzOi8vZ2l0aHViLmNvbS96ejg1XG4gKlxuICogQ2VudHJpcGV0YWwgQ2F0bXVsbFJvbSBDdXJ2ZSAtIHdoaWNoIGlzIHVzZWZ1bCBmb3IgYXZvaWRpbmdcbiAqIGN1c3BzIGFuZCBzZWxmLWludGVyc2VjdGlvbnMgaW4gbm9uLXVuaWZvcm0gY2F0bXVsbCByb20gY3VydmVzLlxuICogaHR0cDovL3d3dy5jZW15dWtzZWwuY29tL3Jlc2VhcmNoL2NhdG11bGxyb21fcGFyYW0vY2F0bXVsbHJvbS5wZGZcbiAqXG4gKiBjdXJ2ZS50eXBlIGFjY2VwdHMgY2VudHJpcGV0YWwoZGVmYXVsdCksIGNob3JkYWwgYW5kIGNhdG11bGxyb21cbiAqIGN1cnZlLnRlbnNpb24gaXMgdXNlZCBmb3IgY2F0bXVsbHJvbSB3aGljaCBkZWZhdWx0cyB0byAwLjVcbiAqL1xuXG5cbi8qXG5CYXNlZCBvbiBhbiBvcHRpbWl6ZWQgYysrIHNvbHV0aW9uIGluXG4gLSBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzk0ODk3MzYvY2F0bXVsbC1yb20tY3VydmUtd2l0aC1uby1jdXNwcy1hbmQtbm8tc2VsZi1pbnRlcnNlY3Rpb25zL1xuIC0gaHR0cDovL2lkZW9uZS5jb20vTm9FYlZNXG5cblRoaXMgQ3ViaWNQb2x5IGNsYXNzIGNvdWxkIGJlIHVzZWQgZm9yIHJldXNpbmcgc29tZSB2YXJpYWJsZXMgYW5kIGNhbGN1bGF0aW9ucyxcbmJ1dCBmb3IgdGhyZWUuanMgY3VydmUgdXNlLCBpdCBjb3VsZCBiZSBwb3NzaWJsZSBpbmxpbmVkIGFuZCBmbGF0dGVuIGludG8gYSBzaW5nbGUgZnVuY3Rpb24gY2FsbFxud2hpY2ggY2FuIGJlIHBsYWNlZCBpbiBDdXJ2ZVV0aWxzLlxuKi9cblxuZnVuY3Rpb24gQ3ViaWNQb2x5KCkge1xuXG5cdHZhciBjMCA9IDAsIGMxID0gMCwgYzIgPSAwLCBjMyA9IDA7XG5cblx0Lypcblx0ICogQ29tcHV0ZSBjb2VmZmljaWVudHMgZm9yIGEgY3ViaWMgcG9seW5vbWlhbFxuXHQgKiAgIHAocykgPSBjMCArIGMxKnMgKyBjMipzXjIgKyBjMypzXjNcblx0ICogc3VjaCB0aGF0XG5cdCAqICAgcCgwKSA9IHgwLCBwKDEpID0geDFcblx0ICogIGFuZFxuXHQgKiAgIHAnKDApID0gdDAsIHAnKDEpID0gdDEuXG5cdCAqL1xuXHRmdW5jdGlvbiBpbml0KCB4MCwgeDEsIHQwLCB0MSApIHtcblxuXHRcdGMwID0geDA7XG5cdFx0YzEgPSB0MDtcblx0XHRjMiA9IC0gMyAqIHgwICsgMyAqIHgxIC0gMiAqIHQwIC0gdDE7XG5cdFx0YzMgPSAyICogeDAgLSAyICogeDEgKyB0MCArIHQxO1xuXG5cdH1cblxuXHRyZXR1cm4ge1xuXG5cdFx0aW5pdENhdG11bGxSb206IGZ1bmN0aW9uICggeDAsIHgxLCB4MiwgeDMsIHRlbnNpb24gKSB7XG5cblx0XHRcdGluaXQoIHgxLCB4MiwgdGVuc2lvbiAqICggeDIgLSB4MCApLCB0ZW5zaW9uICogKCB4MyAtIHgxICkgKTtcblxuXHRcdH0sXG5cblx0XHRpbml0Tm9udW5pZm9ybUNhdG11bGxSb206IGZ1bmN0aW9uICggeDAsIHgxLCB4MiwgeDMsIGR0MCwgZHQxLCBkdDIgKSB7XG5cblx0XHRcdC8vIGNvbXB1dGUgdGFuZ2VudHMgd2hlbiBwYXJhbWV0ZXJpemVkIGluIFt0MSx0Ml1cblx0XHRcdHZhciB0MSA9ICggeDEgLSB4MCApIC8gZHQwIC0gKCB4MiAtIHgwICkgLyAoIGR0MCArIGR0MSApICsgKCB4MiAtIHgxICkgLyBkdDE7XG5cdFx0XHR2YXIgdDIgPSAoIHgyIC0geDEgKSAvIGR0MSAtICggeDMgLSB4MSApIC8gKCBkdDEgKyBkdDIgKSArICggeDMgLSB4MiApIC8gZHQyO1xuXG5cdFx0XHQvLyByZXNjYWxlIHRhbmdlbnRzIGZvciBwYXJhbWV0cml6YXRpb24gaW4gWzAsMV1cblx0XHRcdHQxICo9IGR0MTtcblx0XHRcdHQyICo9IGR0MTtcblxuXHRcdFx0aW5pdCggeDEsIHgyLCB0MSwgdDIgKTtcblxuXHRcdH0sXG5cblx0XHRjYWxjOiBmdW5jdGlvbiAoIHQgKSB7XG5cblx0XHRcdHZhciB0MiA9IHQgKiB0O1xuXHRcdFx0dmFyIHQzID0gdDIgKiB0O1xuXHRcdFx0cmV0dXJuIGMwICsgYzEgKiB0ICsgYzIgKiB0MiArIGMzICogdDM7XG5cblx0XHR9XG5cblx0fTtcblxufVxuXG4vL1xuXG52YXIgdG1wID0gbmV3IFZlY3RvcjMoKTtcbnZhciBweCA9IG5ldyBDdWJpY1BvbHkoKTtcbnZhciBweSA9IG5ldyBDdWJpY1BvbHkoKTtcbnZhciBweiA9IG5ldyBDdWJpY1BvbHkoKTtcblxuZnVuY3Rpb24gQ2F0bXVsbFJvbUN1cnZlMyggcG9pbnRzLCBjbG9zZWQsIGN1cnZlVHlwZSwgdGVuc2lvbiApIHtcblxuXHRDdXJ2ZS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0NhdG11bGxSb21DdXJ2ZTMnO1xuXG5cdHRoaXMucG9pbnRzID0gcG9pbnRzIHx8IFtdO1xuXHR0aGlzLmNsb3NlZCA9IGNsb3NlZCB8fCBmYWxzZTtcblx0dGhpcy5jdXJ2ZVR5cGUgPSBjdXJ2ZVR5cGUgfHwgJ2NlbnRyaXBldGFsJztcblx0dGhpcy50ZW5zaW9uID0gdGVuc2lvbiB8fCAwLjU7XG5cbn1cblxuQ2F0bXVsbFJvbUN1cnZlMy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDdXJ2ZS5wcm90b3R5cGUgKTtcbkNhdG11bGxSb21DdXJ2ZTMucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ2F0bXVsbFJvbUN1cnZlMztcblxuQ2F0bXVsbFJvbUN1cnZlMy5wcm90b3R5cGUuaXNDYXRtdWxsUm9tQ3VydmUzID0gdHJ1ZTtcblxuQ2F0bXVsbFJvbUN1cnZlMy5wcm90b3R5cGUuZ2V0UG9pbnQgPSBmdW5jdGlvbiAoIHQsIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdHZhciBwb2ludCA9IG9wdGlvbmFsVGFyZ2V0IHx8IG5ldyBWZWN0b3IzKCk7XG5cblx0dmFyIHBvaW50cyA9IHRoaXMucG9pbnRzO1xuXHR2YXIgbCA9IHBvaW50cy5sZW5ndGg7XG5cblx0dmFyIHAgPSAoIGwgLSAoIHRoaXMuY2xvc2VkID8gMCA6IDEgKSApICogdDtcblx0dmFyIGludFBvaW50ID0gTWF0aC5mbG9vciggcCApO1xuXHR2YXIgd2VpZ2h0ID0gcCAtIGludFBvaW50O1xuXG5cdGlmICggdGhpcy5jbG9zZWQgKSB7XG5cblx0XHRpbnRQb2ludCArPSBpbnRQb2ludCA+IDAgPyAwIDogKCBNYXRoLmZsb29yKCBNYXRoLmFicyggaW50UG9pbnQgKSAvIGwgKSArIDEgKSAqIGw7XG5cblx0fSBlbHNlIGlmICggd2VpZ2h0ID09PSAwICYmIGludFBvaW50ID09PSBsIC0gMSApIHtcblxuXHRcdGludFBvaW50ID0gbCAtIDI7XG5cdFx0d2VpZ2h0ID0gMTtcblxuXHR9XG5cblx0dmFyIHAwLCBwMSwgcDIsIHAzOyAvLyA0IHBvaW50c1xuXG5cdGlmICggdGhpcy5jbG9zZWQgfHwgaW50UG9pbnQgPiAwICkge1xuXG5cdFx0cDAgPSBwb2ludHNbICggaW50UG9pbnQgLSAxICkgJSBsIF07XG5cblx0fSBlbHNlIHtcblxuXHRcdC8vIGV4dHJhcG9sYXRlIGZpcnN0IHBvaW50XG5cdFx0dG1wLnN1YlZlY3RvcnMoIHBvaW50c1sgMCBdLCBwb2ludHNbIDEgXSApLmFkZCggcG9pbnRzWyAwIF0gKTtcblx0XHRwMCA9IHRtcDtcblxuXHR9XG5cblx0cDEgPSBwb2ludHNbIGludFBvaW50ICUgbCBdO1xuXHRwMiA9IHBvaW50c1sgKCBpbnRQb2ludCArIDEgKSAlIGwgXTtcblxuXHRpZiAoIHRoaXMuY2xvc2VkIHx8IGludFBvaW50ICsgMiA8IGwgKSB7XG5cblx0XHRwMyA9IHBvaW50c1sgKCBpbnRQb2ludCArIDIgKSAlIGwgXTtcblxuXHR9IGVsc2Uge1xuXG5cdFx0Ly8gZXh0cmFwb2xhdGUgbGFzdCBwb2ludFxuXHRcdHRtcC5zdWJWZWN0b3JzKCBwb2ludHNbIGwgLSAxIF0sIHBvaW50c1sgbCAtIDIgXSApLmFkZCggcG9pbnRzWyBsIC0gMSBdICk7XG5cdFx0cDMgPSB0bXA7XG5cblx0fVxuXG5cdGlmICggdGhpcy5jdXJ2ZVR5cGUgPT09ICdjZW50cmlwZXRhbCcgfHwgdGhpcy5jdXJ2ZVR5cGUgPT09ICdjaG9yZGFsJyApIHtcblxuXHRcdC8vIGluaXQgQ2VudHJpcGV0YWwgLyBDaG9yZGFsIENhdG11bGwtUm9tXG5cdFx0dmFyIHBvdyA9IHRoaXMuY3VydmVUeXBlID09PSAnY2hvcmRhbCcgPyAwLjUgOiAwLjI1O1xuXHRcdHZhciBkdDAgPSBNYXRoLnBvdyggcDAuZGlzdGFuY2VUb1NxdWFyZWQoIHAxICksIHBvdyApO1xuXHRcdHZhciBkdDEgPSBNYXRoLnBvdyggcDEuZGlzdGFuY2VUb1NxdWFyZWQoIHAyICksIHBvdyApO1xuXHRcdHZhciBkdDIgPSBNYXRoLnBvdyggcDIuZGlzdGFuY2VUb1NxdWFyZWQoIHAzICksIHBvdyApO1xuXG5cdFx0Ly8gc2FmZXR5IGNoZWNrIGZvciByZXBlYXRlZCBwb2ludHNcblx0XHRpZiAoIGR0MSA8IDFlLTQgKSBkdDEgPSAxLjA7XG5cdFx0aWYgKCBkdDAgPCAxZS00ICkgZHQwID0gZHQxO1xuXHRcdGlmICggZHQyIDwgMWUtNCApIGR0MiA9IGR0MTtcblxuXHRcdHB4LmluaXROb251bmlmb3JtQ2F0bXVsbFJvbSggcDAueCwgcDEueCwgcDIueCwgcDMueCwgZHQwLCBkdDEsIGR0MiApO1xuXHRcdHB5LmluaXROb251bmlmb3JtQ2F0bXVsbFJvbSggcDAueSwgcDEueSwgcDIueSwgcDMueSwgZHQwLCBkdDEsIGR0MiApO1xuXHRcdHB6LmluaXROb251bmlmb3JtQ2F0bXVsbFJvbSggcDAueiwgcDEueiwgcDIueiwgcDMueiwgZHQwLCBkdDEsIGR0MiApO1xuXG5cdH0gZWxzZSBpZiAoIHRoaXMuY3VydmVUeXBlID09PSAnY2F0bXVsbHJvbScgKSB7XG5cblx0XHRweC5pbml0Q2F0bXVsbFJvbSggcDAueCwgcDEueCwgcDIueCwgcDMueCwgdGhpcy50ZW5zaW9uICk7XG5cdFx0cHkuaW5pdENhdG11bGxSb20oIHAwLnksIHAxLnksIHAyLnksIHAzLnksIHRoaXMudGVuc2lvbiApO1xuXHRcdHB6LmluaXRDYXRtdWxsUm9tKCBwMC56LCBwMS56LCBwMi56LCBwMy56LCB0aGlzLnRlbnNpb24gKTtcblxuXHR9XG5cblx0cG9pbnQuc2V0KFxuXHRcdHB4LmNhbGMoIHdlaWdodCApLFxuXHRcdHB5LmNhbGMoIHdlaWdodCApLFxuXHRcdHB6LmNhbGMoIHdlaWdodCApXG5cdCk7XG5cblx0cmV0dXJuIHBvaW50O1xuXG59O1xuXG5DYXRtdWxsUm9tQ3VydmUzLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0Q3VydmUucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0dGhpcy5wb2ludHMgPSBbXTtcblxuXHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBzb3VyY2UucG9pbnRzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHR2YXIgcG9pbnQgPSBzb3VyY2UucG9pbnRzWyBpIF07XG5cblx0XHR0aGlzLnBvaW50cy5wdXNoKCBwb2ludC5jbG9uZSgpICk7XG5cblx0fVxuXG5cdHRoaXMuY2xvc2VkID0gc291cmNlLmNsb3NlZDtcblx0dGhpcy5jdXJ2ZVR5cGUgPSBzb3VyY2UuY3VydmVUeXBlO1xuXHR0aGlzLnRlbnNpb24gPSBzb3VyY2UudGVuc2lvbjtcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuQ2F0bXVsbFJvbUN1cnZlMy5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gKCkge1xuXG5cdHZhciBkYXRhID0gQ3VydmUucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzICk7XG5cblx0ZGF0YS5wb2ludHMgPSBbXTtcblxuXHRmb3IgKCB2YXIgaSA9IDAsIGwgPSB0aGlzLnBvaW50cy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0dmFyIHBvaW50ID0gdGhpcy5wb2ludHNbIGkgXTtcblx0XHRkYXRhLnBvaW50cy5wdXNoKCBwb2ludC50b0FycmF5KCkgKTtcblxuXHR9XG5cblx0ZGF0YS5jbG9zZWQgPSB0aGlzLmNsb3NlZDtcblx0ZGF0YS5jdXJ2ZVR5cGUgPSB0aGlzLmN1cnZlVHlwZTtcblx0ZGF0YS50ZW5zaW9uID0gdGhpcy50ZW5zaW9uO1xuXG5cdHJldHVybiBkYXRhO1xuXG59O1xuXG5DYXRtdWxsUm9tQ3VydmUzLnByb3RvdHlwZS5mcm9tSlNPTiA9IGZ1bmN0aW9uICgganNvbiApIHtcblxuXHRDdXJ2ZS5wcm90b3R5cGUuZnJvbUpTT04uY2FsbCggdGhpcywganNvbiApO1xuXG5cdHRoaXMucG9pbnRzID0gW107XG5cblx0Zm9yICggdmFyIGkgPSAwLCBsID0ganNvbi5wb2ludHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdHZhciBwb2ludCA9IGpzb24ucG9pbnRzWyBpIF07XG5cdFx0dGhpcy5wb2ludHMucHVzaCggbmV3IFZlY3RvcjMoKS5mcm9tQXJyYXkoIHBvaW50ICkgKTtcblxuXHR9XG5cblx0dGhpcy5jbG9zZWQgPSBqc29uLmNsb3NlZDtcblx0dGhpcy5jdXJ2ZVR5cGUgPSBqc29uLmN1cnZlVHlwZTtcblx0dGhpcy50ZW5zaW9uID0ganNvbi50ZW5zaW9uO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG4vKipcbiAqIEBhdXRob3Igeno4NSAvIGh0dHA6Ly93d3cubGFiNGdhbWVzLm5ldC96ejg1L2Jsb2dcbiAqXG4gKiBCZXppZXIgQ3VydmVzIGZvcm11bGFzIG9idGFpbmVkIGZyb21cbiAqIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQsOpemllcl9jdXJ2ZVxuICovXG5cbmZ1bmN0aW9uIENhdG11bGxSb20oIHQsIHAwLCBwMSwgcDIsIHAzICkge1xuXG5cdHZhciB2MCA9ICggcDIgLSBwMCApICogMC41O1xuXHR2YXIgdjEgPSAoIHAzIC0gcDEgKSAqIDAuNTtcblx0dmFyIHQyID0gdCAqIHQ7XG5cdHZhciB0MyA9IHQgKiB0Mjtcblx0cmV0dXJuICggMiAqIHAxIC0gMiAqIHAyICsgdjAgKyB2MSApICogdDMgKyAoIC0gMyAqIHAxICsgMyAqIHAyIC0gMiAqIHYwIC0gdjEgKSAqIHQyICsgdjAgKiB0ICsgcDE7XG5cbn1cblxuLy9cblxuZnVuY3Rpb24gUXVhZHJhdGljQmV6aWVyUDAoIHQsIHAgKSB7XG5cblx0dmFyIGsgPSAxIC0gdDtcblx0cmV0dXJuIGsgKiBrICogcDtcblxufVxuXG5mdW5jdGlvbiBRdWFkcmF0aWNCZXppZXJQMSggdCwgcCApIHtcblxuXHRyZXR1cm4gMiAqICggMSAtIHQgKSAqIHQgKiBwO1xuXG59XG5cbmZ1bmN0aW9uIFF1YWRyYXRpY0JlemllclAyKCB0LCBwICkge1xuXG5cdHJldHVybiB0ICogdCAqIHA7XG5cbn1cblxuZnVuY3Rpb24gUXVhZHJhdGljQmV6aWVyKCB0LCBwMCwgcDEsIHAyICkge1xuXG5cdHJldHVybiBRdWFkcmF0aWNCZXppZXJQMCggdCwgcDAgKSArIFF1YWRyYXRpY0JlemllclAxKCB0LCBwMSApICtcblx0XHRRdWFkcmF0aWNCZXppZXJQMiggdCwgcDIgKTtcblxufVxuXG4vL1xuXG5mdW5jdGlvbiBDdWJpY0JlemllclAwKCB0LCBwICkge1xuXG5cdHZhciBrID0gMSAtIHQ7XG5cdHJldHVybiBrICogayAqIGsgKiBwO1xuXG59XG5cbmZ1bmN0aW9uIEN1YmljQmV6aWVyUDEoIHQsIHAgKSB7XG5cblx0dmFyIGsgPSAxIC0gdDtcblx0cmV0dXJuIDMgKiBrICogayAqIHQgKiBwO1xuXG59XG5cbmZ1bmN0aW9uIEN1YmljQmV6aWVyUDIoIHQsIHAgKSB7XG5cblx0cmV0dXJuIDMgKiAoIDEgLSB0ICkgKiB0ICogdCAqIHA7XG5cbn1cblxuZnVuY3Rpb24gQ3ViaWNCZXppZXJQMyggdCwgcCApIHtcblxuXHRyZXR1cm4gdCAqIHQgKiB0ICogcDtcblxufVxuXG5mdW5jdGlvbiBDdWJpY0JlemllciggdCwgcDAsIHAxLCBwMiwgcDMgKSB7XG5cblx0cmV0dXJuIEN1YmljQmV6aWVyUDAoIHQsIHAwICkgKyBDdWJpY0JlemllclAxKCB0LCBwMSApICsgQ3ViaWNCZXppZXJQMiggdCwgcDIgKSArXG5cdFx0Q3ViaWNCZXppZXJQMyggdCwgcDMgKTtcblxufVxuXG5mdW5jdGlvbiBDdWJpY0JlemllckN1cnZlKCB2MCwgdjEsIHYyLCB2MyApIHtcblxuXHRDdXJ2ZS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0N1YmljQmV6aWVyQ3VydmUnO1xuXG5cdHRoaXMudjAgPSB2MCB8fCBuZXcgVmVjdG9yMigpO1xuXHR0aGlzLnYxID0gdjEgfHwgbmV3IFZlY3RvcjIoKTtcblx0dGhpcy52MiA9IHYyIHx8IG5ldyBWZWN0b3IyKCk7XG5cdHRoaXMudjMgPSB2MyB8fCBuZXcgVmVjdG9yMigpO1xuXG59XG5cbkN1YmljQmV6aWVyQ3VydmUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQ3VydmUucHJvdG90eXBlICk7XG5DdWJpY0JlemllckN1cnZlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEN1YmljQmV6aWVyQ3VydmU7XG5cbkN1YmljQmV6aWVyQ3VydmUucHJvdG90eXBlLmlzQ3ViaWNCZXppZXJDdXJ2ZSA9IHRydWU7XG5cbkN1YmljQmV6aWVyQ3VydmUucHJvdG90eXBlLmdldFBvaW50ID0gZnVuY3Rpb24gKCB0LCBvcHRpb25hbFRhcmdldCApIHtcblxuXHR2YXIgcG9pbnQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgVmVjdG9yMigpO1xuXG5cdHZhciB2MCA9IHRoaXMudjAsIHYxID0gdGhpcy52MSwgdjIgPSB0aGlzLnYyLCB2MyA9IHRoaXMudjM7XG5cblx0cG9pbnQuc2V0KFxuXHRcdEN1YmljQmV6aWVyKCB0LCB2MC54LCB2MS54LCB2Mi54LCB2My54ICksXG5cdFx0Q3ViaWNCZXppZXIoIHQsIHYwLnksIHYxLnksIHYyLnksIHYzLnkgKVxuXHQpO1xuXG5cdHJldHVybiBwb2ludDtcblxufTtcblxuQ3ViaWNCZXppZXJDdXJ2ZS5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdEN1cnZlLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdHRoaXMudjAuY29weSggc291cmNlLnYwICk7XG5cdHRoaXMudjEuY29weSggc291cmNlLnYxICk7XG5cdHRoaXMudjIuY29weSggc291cmNlLnYyICk7XG5cdHRoaXMudjMuY29weSggc291cmNlLnYzICk7XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cbkN1YmljQmV6aWVyQ3VydmUucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uICgpIHtcblxuXHR2YXIgZGF0YSA9IEN1cnZlLnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcyApO1xuXG5cdGRhdGEudjAgPSB0aGlzLnYwLnRvQXJyYXkoKTtcblx0ZGF0YS52MSA9IHRoaXMudjEudG9BcnJheSgpO1xuXHRkYXRhLnYyID0gdGhpcy52Mi50b0FycmF5KCk7XG5cdGRhdGEudjMgPSB0aGlzLnYzLnRvQXJyYXkoKTtcblxuXHRyZXR1cm4gZGF0YTtcblxufTtcblxuQ3ViaWNCZXppZXJDdXJ2ZS5wcm90b3R5cGUuZnJvbUpTT04gPSBmdW5jdGlvbiAoIGpzb24gKSB7XG5cblx0Q3VydmUucHJvdG90eXBlLmZyb21KU09OLmNhbGwoIHRoaXMsIGpzb24gKTtcblxuXHR0aGlzLnYwLmZyb21BcnJheSgganNvbi52MCApO1xuXHR0aGlzLnYxLmZyb21BcnJheSgganNvbi52MSApO1xuXHR0aGlzLnYyLmZyb21BcnJheSgganNvbi52MiApO1xuXHR0aGlzLnYzLmZyb21BcnJheSgganNvbi52MyApO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG5mdW5jdGlvbiBDdWJpY0JlemllckN1cnZlMyggdjAsIHYxLCB2MiwgdjMgKSB7XG5cblx0Q3VydmUuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdDdWJpY0JlemllckN1cnZlMyc7XG5cblx0dGhpcy52MCA9IHYwIHx8IG5ldyBWZWN0b3IzKCk7XG5cdHRoaXMudjEgPSB2MSB8fCBuZXcgVmVjdG9yMygpO1xuXHR0aGlzLnYyID0gdjIgfHwgbmV3IFZlY3RvcjMoKTtcblx0dGhpcy52MyA9IHYzIHx8IG5ldyBWZWN0b3IzKCk7XG5cbn1cblxuQ3ViaWNCZXppZXJDdXJ2ZTMucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQ3VydmUucHJvdG90eXBlICk7XG5DdWJpY0JlemllckN1cnZlMy5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDdWJpY0JlemllckN1cnZlMztcblxuQ3ViaWNCZXppZXJDdXJ2ZTMucHJvdG90eXBlLmlzQ3ViaWNCZXppZXJDdXJ2ZTMgPSB0cnVlO1xuXG5DdWJpY0JlemllckN1cnZlMy5wcm90b3R5cGUuZ2V0UG9pbnQgPSBmdW5jdGlvbiAoIHQsIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdHZhciBwb2ludCA9IG9wdGlvbmFsVGFyZ2V0IHx8IG5ldyBWZWN0b3IzKCk7XG5cblx0dmFyIHYwID0gdGhpcy52MCwgdjEgPSB0aGlzLnYxLCB2MiA9IHRoaXMudjIsIHYzID0gdGhpcy52MztcblxuXHRwb2ludC5zZXQoXG5cdFx0Q3ViaWNCZXppZXIoIHQsIHYwLngsIHYxLngsIHYyLngsIHYzLnggKSxcblx0XHRDdWJpY0JlemllciggdCwgdjAueSwgdjEueSwgdjIueSwgdjMueSApLFxuXHRcdEN1YmljQmV6aWVyKCB0LCB2MC56LCB2MS56LCB2Mi56LCB2My56IClcblx0KTtcblxuXHRyZXR1cm4gcG9pbnQ7XG5cbn07XG5cbkN1YmljQmV6aWVyQ3VydmUzLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0Q3VydmUucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0dGhpcy52MC5jb3B5KCBzb3VyY2UudjAgKTtcblx0dGhpcy52MS5jb3B5KCBzb3VyY2UudjEgKTtcblx0dGhpcy52Mi5jb3B5KCBzb3VyY2UudjIgKTtcblx0dGhpcy52My5jb3B5KCBzb3VyY2UudjMgKTtcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuQ3ViaWNCZXppZXJDdXJ2ZTMucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uICgpIHtcblxuXHR2YXIgZGF0YSA9IEN1cnZlLnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcyApO1xuXG5cdGRhdGEudjAgPSB0aGlzLnYwLnRvQXJyYXkoKTtcblx0ZGF0YS52MSA9IHRoaXMudjEudG9BcnJheSgpO1xuXHRkYXRhLnYyID0gdGhpcy52Mi50b0FycmF5KCk7XG5cdGRhdGEudjMgPSB0aGlzLnYzLnRvQXJyYXkoKTtcblxuXHRyZXR1cm4gZGF0YTtcblxufTtcblxuQ3ViaWNCZXppZXJDdXJ2ZTMucHJvdG90eXBlLmZyb21KU09OID0gZnVuY3Rpb24gKCBqc29uICkge1xuXG5cdEN1cnZlLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKCB0aGlzLCBqc29uICk7XG5cblx0dGhpcy52MC5mcm9tQXJyYXkoIGpzb24udjAgKTtcblx0dGhpcy52MS5mcm9tQXJyYXkoIGpzb24udjEgKTtcblx0dGhpcy52Mi5mcm9tQXJyYXkoIGpzb24udjIgKTtcblx0dGhpcy52My5mcm9tQXJyYXkoIGpzb24udjMgKTtcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuZnVuY3Rpb24gTGluZUN1cnZlKCB2MSwgdjIgKSB7XG5cblx0Q3VydmUuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdMaW5lQ3VydmUnO1xuXG5cdHRoaXMudjEgPSB2MSB8fCBuZXcgVmVjdG9yMigpO1xuXHR0aGlzLnYyID0gdjIgfHwgbmV3IFZlY3RvcjIoKTtcblxufVxuXG5MaW5lQ3VydmUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQ3VydmUucHJvdG90eXBlICk7XG5MaW5lQ3VydmUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTGluZUN1cnZlO1xuXG5MaW5lQ3VydmUucHJvdG90eXBlLmlzTGluZUN1cnZlID0gdHJ1ZTtcblxuTGluZUN1cnZlLnByb3RvdHlwZS5nZXRQb2ludCA9IGZ1bmN0aW9uICggdCwgb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0dmFyIHBvaW50ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IFZlY3RvcjIoKTtcblxuXHRpZiAoIHQgPT09IDEgKSB7XG5cblx0XHRwb2ludC5jb3B5KCB0aGlzLnYyICk7XG5cblx0fSBlbHNlIHtcblxuXHRcdHBvaW50LmNvcHkoIHRoaXMudjIgKS5zdWIoIHRoaXMudjEgKTtcblx0XHRwb2ludC5tdWx0aXBseVNjYWxhciggdCApLmFkZCggdGhpcy52MSApO1xuXG5cdH1cblxuXHRyZXR1cm4gcG9pbnQ7XG5cbn07XG5cbi8vIExpbmUgY3VydmUgaXMgbGluZWFyLCBzbyB3ZSBjYW4gb3ZlcndyaXRlIGRlZmF1bHQgZ2V0UG9pbnRBdFxuXG5MaW5lQ3VydmUucHJvdG90eXBlLmdldFBvaW50QXQgPSBmdW5jdGlvbiAoIHUsIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdHJldHVybiB0aGlzLmdldFBvaW50KCB1LCBvcHRpb25hbFRhcmdldCApO1xuXG59O1xuXG5MaW5lQ3VydmUucHJvdG90eXBlLmdldFRhbmdlbnQgPSBmdW5jdGlvbiAoIC8qIHQgKi8gKSB7XG5cblx0dmFyIHRhbmdlbnQgPSB0aGlzLnYyLmNsb25lKCkuc3ViKCB0aGlzLnYxICk7XG5cblx0cmV0dXJuIHRhbmdlbnQubm9ybWFsaXplKCk7XG5cbn07XG5cbkxpbmVDdXJ2ZS5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdEN1cnZlLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdHRoaXMudjEuY29weSggc291cmNlLnYxICk7XG5cdHRoaXMudjIuY29weSggc291cmNlLnYyICk7XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cbkxpbmVDdXJ2ZS5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gKCkge1xuXG5cdHZhciBkYXRhID0gQ3VydmUucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzICk7XG5cblx0ZGF0YS52MSA9IHRoaXMudjEudG9BcnJheSgpO1xuXHRkYXRhLnYyID0gdGhpcy52Mi50b0FycmF5KCk7XG5cblx0cmV0dXJuIGRhdGE7XG5cbn07XG5cbkxpbmVDdXJ2ZS5wcm90b3R5cGUuZnJvbUpTT04gPSBmdW5jdGlvbiAoIGpzb24gKSB7XG5cblx0Q3VydmUucHJvdG90eXBlLmZyb21KU09OLmNhbGwoIHRoaXMsIGpzb24gKTtcblxuXHR0aGlzLnYxLmZyb21BcnJheSgganNvbi52MSApO1xuXHR0aGlzLnYyLmZyb21BcnJheSgganNvbi52MiApO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG5mdW5jdGlvbiBMaW5lQ3VydmUzKCB2MSwgdjIgKSB7XG5cblx0Q3VydmUuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdMaW5lQ3VydmUzJztcblxuXHR0aGlzLnYxID0gdjEgfHwgbmV3IFZlY3RvcjMoKTtcblx0dGhpcy52MiA9IHYyIHx8IG5ldyBWZWN0b3IzKCk7XG5cbn1cblxuTGluZUN1cnZlMy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDdXJ2ZS5wcm90b3R5cGUgKTtcbkxpbmVDdXJ2ZTMucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTGluZUN1cnZlMztcblxuTGluZUN1cnZlMy5wcm90b3R5cGUuaXNMaW5lQ3VydmUzID0gdHJ1ZTtcblxuTGluZUN1cnZlMy5wcm90b3R5cGUuZ2V0UG9pbnQgPSBmdW5jdGlvbiAoIHQsIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdHZhciBwb2ludCA9IG9wdGlvbmFsVGFyZ2V0IHx8IG5ldyBWZWN0b3IzKCk7XG5cblx0aWYgKCB0ID09PSAxICkge1xuXG5cdFx0cG9pbnQuY29weSggdGhpcy52MiApO1xuXG5cdH0gZWxzZSB7XG5cblx0XHRwb2ludC5jb3B5KCB0aGlzLnYyICkuc3ViKCB0aGlzLnYxICk7XG5cdFx0cG9pbnQubXVsdGlwbHlTY2FsYXIoIHQgKS5hZGQoIHRoaXMudjEgKTtcblxuXHR9XG5cblx0cmV0dXJuIHBvaW50O1xuXG59O1xuXG4vLyBMaW5lIGN1cnZlIGlzIGxpbmVhciwgc28gd2UgY2FuIG92ZXJ3cml0ZSBkZWZhdWx0IGdldFBvaW50QXRcblxuTGluZUN1cnZlMy5wcm90b3R5cGUuZ2V0UG9pbnRBdCA9IGZ1bmN0aW9uICggdSwgb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0cmV0dXJuIHRoaXMuZ2V0UG9pbnQoIHUsIG9wdGlvbmFsVGFyZ2V0ICk7XG5cbn07XG5cbkxpbmVDdXJ2ZTMucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRDdXJ2ZS5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHR0aGlzLnYxLmNvcHkoIHNvdXJjZS52MSApO1xuXHR0aGlzLnYyLmNvcHkoIHNvdXJjZS52MiApO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG5MaW5lQ3VydmUzLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoKSB7XG5cblx0dmFyIGRhdGEgPSBDdXJ2ZS5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMgKTtcblxuXHRkYXRhLnYxID0gdGhpcy52MS50b0FycmF5KCk7XG5cdGRhdGEudjIgPSB0aGlzLnYyLnRvQXJyYXkoKTtcblxuXHRyZXR1cm4gZGF0YTtcblxufTtcblxuTGluZUN1cnZlMy5wcm90b3R5cGUuZnJvbUpTT04gPSBmdW5jdGlvbiAoIGpzb24gKSB7XG5cblx0Q3VydmUucHJvdG90eXBlLmZyb21KU09OLmNhbGwoIHRoaXMsIGpzb24gKTtcblxuXHR0aGlzLnYxLmZyb21BcnJheSgganNvbi52MSApO1xuXHR0aGlzLnYyLmZyb21BcnJheSgganNvbi52MiApO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG5mdW5jdGlvbiBRdWFkcmF0aWNCZXppZXJDdXJ2ZSggdjAsIHYxLCB2MiApIHtcblxuXHRDdXJ2ZS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1F1YWRyYXRpY0JlemllckN1cnZlJztcblxuXHR0aGlzLnYwID0gdjAgfHwgbmV3IFZlY3RvcjIoKTtcblx0dGhpcy52MSA9IHYxIHx8IG5ldyBWZWN0b3IyKCk7XG5cdHRoaXMudjIgPSB2MiB8fCBuZXcgVmVjdG9yMigpO1xuXG59XG5cblF1YWRyYXRpY0JlemllckN1cnZlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEN1cnZlLnByb3RvdHlwZSApO1xuUXVhZHJhdGljQmV6aWVyQ3VydmUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUXVhZHJhdGljQmV6aWVyQ3VydmU7XG5cblF1YWRyYXRpY0JlemllckN1cnZlLnByb3RvdHlwZS5pc1F1YWRyYXRpY0JlemllckN1cnZlID0gdHJ1ZTtcblxuUXVhZHJhdGljQmV6aWVyQ3VydmUucHJvdG90eXBlLmdldFBvaW50ID0gZnVuY3Rpb24gKCB0LCBvcHRpb25hbFRhcmdldCApIHtcblxuXHR2YXIgcG9pbnQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgVmVjdG9yMigpO1xuXG5cdHZhciB2MCA9IHRoaXMudjAsIHYxID0gdGhpcy52MSwgdjIgPSB0aGlzLnYyO1xuXG5cdHBvaW50LnNldChcblx0XHRRdWFkcmF0aWNCZXppZXIoIHQsIHYwLngsIHYxLngsIHYyLnggKSxcblx0XHRRdWFkcmF0aWNCZXppZXIoIHQsIHYwLnksIHYxLnksIHYyLnkgKVxuXHQpO1xuXG5cdHJldHVybiBwb2ludDtcblxufTtcblxuUXVhZHJhdGljQmV6aWVyQ3VydmUucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRDdXJ2ZS5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHR0aGlzLnYwLmNvcHkoIHNvdXJjZS52MCApO1xuXHR0aGlzLnYxLmNvcHkoIHNvdXJjZS52MSApO1xuXHR0aGlzLnYyLmNvcHkoIHNvdXJjZS52MiApO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG5RdWFkcmF0aWNCZXppZXJDdXJ2ZS5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gKCkge1xuXG5cdHZhciBkYXRhID0gQ3VydmUucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzICk7XG5cblx0ZGF0YS52MCA9IHRoaXMudjAudG9BcnJheSgpO1xuXHRkYXRhLnYxID0gdGhpcy52MS50b0FycmF5KCk7XG5cdGRhdGEudjIgPSB0aGlzLnYyLnRvQXJyYXkoKTtcblxuXHRyZXR1cm4gZGF0YTtcblxufTtcblxuUXVhZHJhdGljQmV6aWVyQ3VydmUucHJvdG90eXBlLmZyb21KU09OID0gZnVuY3Rpb24gKCBqc29uICkge1xuXG5cdEN1cnZlLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKCB0aGlzLCBqc29uICk7XG5cblx0dGhpcy52MC5mcm9tQXJyYXkoIGpzb24udjAgKTtcblx0dGhpcy52MS5mcm9tQXJyYXkoIGpzb24udjEgKTtcblx0dGhpcy52Mi5mcm9tQXJyYXkoIGpzb24udjIgKTtcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuZnVuY3Rpb24gUXVhZHJhdGljQmV6aWVyQ3VydmUzKCB2MCwgdjEsIHYyICkge1xuXG5cdEN1cnZlLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnUXVhZHJhdGljQmV6aWVyQ3VydmUzJztcblxuXHR0aGlzLnYwID0gdjAgfHwgbmV3IFZlY3RvcjMoKTtcblx0dGhpcy52MSA9IHYxIHx8IG5ldyBWZWN0b3IzKCk7XG5cdHRoaXMudjIgPSB2MiB8fCBuZXcgVmVjdG9yMygpO1xuXG59XG5cblF1YWRyYXRpY0JlemllckN1cnZlMy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDdXJ2ZS5wcm90b3R5cGUgKTtcblF1YWRyYXRpY0JlemllckN1cnZlMy5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBRdWFkcmF0aWNCZXppZXJDdXJ2ZTM7XG5cblF1YWRyYXRpY0JlemllckN1cnZlMy5wcm90b3R5cGUuaXNRdWFkcmF0aWNCZXppZXJDdXJ2ZTMgPSB0cnVlO1xuXG5RdWFkcmF0aWNCZXppZXJDdXJ2ZTMucHJvdG90eXBlLmdldFBvaW50ID0gZnVuY3Rpb24gKCB0LCBvcHRpb25hbFRhcmdldCApIHtcblxuXHR2YXIgcG9pbnQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgVmVjdG9yMygpO1xuXG5cdHZhciB2MCA9IHRoaXMudjAsIHYxID0gdGhpcy52MSwgdjIgPSB0aGlzLnYyO1xuXG5cdHBvaW50LnNldChcblx0XHRRdWFkcmF0aWNCZXppZXIoIHQsIHYwLngsIHYxLngsIHYyLnggKSxcblx0XHRRdWFkcmF0aWNCZXppZXIoIHQsIHYwLnksIHYxLnksIHYyLnkgKSxcblx0XHRRdWFkcmF0aWNCZXppZXIoIHQsIHYwLnosIHYxLnosIHYyLnogKVxuXHQpO1xuXG5cdHJldHVybiBwb2ludDtcblxufTtcblxuUXVhZHJhdGljQmV6aWVyQ3VydmUzLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0Q3VydmUucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0dGhpcy52MC5jb3B5KCBzb3VyY2UudjAgKTtcblx0dGhpcy52MS5jb3B5KCBzb3VyY2UudjEgKTtcblx0dGhpcy52Mi5jb3B5KCBzb3VyY2UudjIgKTtcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuUXVhZHJhdGljQmV6aWVyQ3VydmUzLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoKSB7XG5cblx0dmFyIGRhdGEgPSBDdXJ2ZS5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMgKTtcblxuXHRkYXRhLnYwID0gdGhpcy52MC50b0FycmF5KCk7XG5cdGRhdGEudjEgPSB0aGlzLnYxLnRvQXJyYXkoKTtcblx0ZGF0YS52MiA9IHRoaXMudjIudG9BcnJheSgpO1xuXG5cdHJldHVybiBkYXRhO1xuXG59O1xuXG5RdWFkcmF0aWNCZXppZXJDdXJ2ZTMucHJvdG90eXBlLmZyb21KU09OID0gZnVuY3Rpb24gKCBqc29uICkge1xuXG5cdEN1cnZlLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKCB0aGlzLCBqc29uICk7XG5cblx0dGhpcy52MC5mcm9tQXJyYXkoIGpzb24udjAgKTtcblx0dGhpcy52MS5mcm9tQXJyYXkoIGpzb24udjEgKTtcblx0dGhpcy52Mi5mcm9tQXJyYXkoIGpzb24udjIgKTtcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuZnVuY3Rpb24gU3BsaW5lQ3VydmUoIHBvaW50cyAvKiBhcnJheSBvZiBWZWN0b3IyICovICkge1xuXG5cdEN1cnZlLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnU3BsaW5lQ3VydmUnO1xuXG5cdHRoaXMucG9pbnRzID0gcG9pbnRzIHx8IFtdO1xuXG59XG5cblNwbGluZUN1cnZlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEN1cnZlLnByb3RvdHlwZSApO1xuU3BsaW5lQ3VydmUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU3BsaW5lQ3VydmU7XG5cblNwbGluZUN1cnZlLnByb3RvdHlwZS5pc1NwbGluZUN1cnZlID0gdHJ1ZTtcblxuU3BsaW5lQ3VydmUucHJvdG90eXBlLmdldFBvaW50ID0gZnVuY3Rpb24gKCB0LCBvcHRpb25hbFRhcmdldCApIHtcblxuXHR2YXIgcG9pbnQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgVmVjdG9yMigpO1xuXG5cdHZhciBwb2ludHMgPSB0aGlzLnBvaW50cztcblx0dmFyIHAgPSAoIHBvaW50cy5sZW5ndGggLSAxICkgKiB0O1xuXG5cdHZhciBpbnRQb2ludCA9IE1hdGguZmxvb3IoIHAgKTtcblx0dmFyIHdlaWdodCA9IHAgLSBpbnRQb2ludDtcblxuXHR2YXIgcDAgPSBwb2ludHNbIGludFBvaW50ID09PSAwID8gaW50UG9pbnQgOiBpbnRQb2ludCAtIDEgXTtcblx0dmFyIHAxID0gcG9pbnRzWyBpbnRQb2ludCBdO1xuXHR2YXIgcDIgPSBwb2ludHNbIGludFBvaW50ID4gcG9pbnRzLmxlbmd0aCAtIDIgPyBwb2ludHMubGVuZ3RoIC0gMSA6IGludFBvaW50ICsgMSBdO1xuXHR2YXIgcDMgPSBwb2ludHNbIGludFBvaW50ID4gcG9pbnRzLmxlbmd0aCAtIDMgPyBwb2ludHMubGVuZ3RoIC0gMSA6IGludFBvaW50ICsgMiBdO1xuXG5cdHBvaW50LnNldChcblx0XHRDYXRtdWxsUm9tKCB3ZWlnaHQsIHAwLngsIHAxLngsIHAyLngsIHAzLnggKSxcblx0XHRDYXRtdWxsUm9tKCB3ZWlnaHQsIHAwLnksIHAxLnksIHAyLnksIHAzLnkgKVxuXHQpO1xuXG5cdHJldHVybiBwb2ludDtcblxufTtcblxuU3BsaW5lQ3VydmUucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRDdXJ2ZS5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHR0aGlzLnBvaW50cyA9IFtdO1xuXG5cdGZvciAoIHZhciBpID0gMCwgbCA9IHNvdXJjZS5wb2ludHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdHZhciBwb2ludCA9IHNvdXJjZS5wb2ludHNbIGkgXTtcblxuXHRcdHRoaXMucG9pbnRzLnB1c2goIHBvaW50LmNsb25lKCkgKTtcblxuXHR9XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cblNwbGluZUN1cnZlLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoKSB7XG5cblx0dmFyIGRhdGEgPSBDdXJ2ZS5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMgKTtcblxuXHRkYXRhLnBvaW50cyA9IFtdO1xuXG5cdGZvciAoIHZhciBpID0gMCwgbCA9IHRoaXMucG9pbnRzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHR2YXIgcG9pbnQgPSB0aGlzLnBvaW50c1sgaSBdO1xuXHRcdGRhdGEucG9pbnRzLnB1c2goIHBvaW50LnRvQXJyYXkoKSApO1xuXG5cdH1cblxuXHRyZXR1cm4gZGF0YTtcblxufTtcblxuU3BsaW5lQ3VydmUucHJvdG90eXBlLmZyb21KU09OID0gZnVuY3Rpb24gKCBqc29uICkge1xuXG5cdEN1cnZlLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKCB0aGlzLCBqc29uICk7XG5cblx0dGhpcy5wb2ludHMgPSBbXTtcblxuXHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBqc29uLnBvaW50cy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0dmFyIHBvaW50ID0ganNvbi5wb2ludHNbIGkgXTtcblx0XHR0aGlzLnBvaW50cy5wdXNoKCBuZXcgVmVjdG9yMigpLmZyb21BcnJheSggcG9pbnQgKSApO1xuXG5cdH1cblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuXG5cbnZhciBDdXJ2ZXMgPSBPYmplY3QuZnJlZXplKHtcblx0QXJjQ3VydmU6IEFyY0N1cnZlLFxuXHRDYXRtdWxsUm9tQ3VydmUzOiBDYXRtdWxsUm9tQ3VydmUzLFxuXHRDdWJpY0JlemllckN1cnZlOiBDdWJpY0JlemllckN1cnZlLFxuXHRDdWJpY0JlemllckN1cnZlMzogQ3ViaWNCZXppZXJDdXJ2ZTMsXG5cdEVsbGlwc2VDdXJ2ZTogRWxsaXBzZUN1cnZlLFxuXHRMaW5lQ3VydmU6IExpbmVDdXJ2ZSxcblx0TGluZUN1cnZlMzogTGluZUN1cnZlMyxcblx0UXVhZHJhdGljQmV6aWVyQ3VydmU6IFF1YWRyYXRpY0JlemllckN1cnZlLFxuXHRRdWFkcmF0aWNCZXppZXJDdXJ2ZTM6IFF1YWRyYXRpY0JlemllckN1cnZlMyxcblx0U3BsaW5lQ3VydmU6IFNwbGluZUN1cnZlXG59KTtcblxuLyoqXG4gKiBAYXV0aG9yIHp6ODUgLyBodHRwOi8vd3d3LmxhYjRnYW1lcy5uZXQveno4NS9ibG9nXG4gKlxuICoqL1xuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAqXHRDdXJ2ZWQgUGF0aCAtIGEgY3VydmUgcGF0aCBpcyBzaW1wbHkgYSBhcnJheSBvZiBjb25uZWN0ZWRcbiAqICBjdXJ2ZXMsIGJ1dCByZXRhaW5zIHRoZSBhcGkgb2YgYSBjdXJ2ZVxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5mdW5jdGlvbiBDdXJ2ZVBhdGgoKSB7XG5cblx0Q3VydmUuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdDdXJ2ZVBhdGgnO1xuXG5cdHRoaXMuY3VydmVzID0gW107XG5cdHRoaXMuYXV0b0Nsb3NlID0gZmFsc2U7IC8vIEF1dG9tYXRpY2FsbHkgY2xvc2VzIHRoZSBwYXRoXG5cbn1cblxuQ3VydmVQYXRoLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEN1cnZlLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IEN1cnZlUGF0aCxcblxuXHRhZGQ6IGZ1bmN0aW9uICggY3VydmUgKSB7XG5cblx0XHR0aGlzLmN1cnZlcy5wdXNoKCBjdXJ2ZSApO1xuXG5cdH0sXG5cblx0Y2xvc2VQYXRoOiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyBBZGQgYSBsaW5lIGN1cnZlIGlmIHN0YXJ0IGFuZCBlbmQgb2YgbGluZXMgYXJlIG5vdCBjb25uZWN0ZWRcblx0XHR2YXIgc3RhcnRQb2ludCA9IHRoaXMuY3VydmVzWyAwIF0uZ2V0UG9pbnQoIDAgKTtcblx0XHR2YXIgZW5kUG9pbnQgPSB0aGlzLmN1cnZlc1sgdGhpcy5jdXJ2ZXMubGVuZ3RoIC0gMSBdLmdldFBvaW50KCAxICk7XG5cblx0XHRpZiAoICEgc3RhcnRQb2ludC5lcXVhbHMoIGVuZFBvaW50ICkgKSB7XG5cblx0XHRcdHRoaXMuY3VydmVzLnB1c2goIG5ldyBMaW5lQ3VydmUoIGVuZFBvaW50LCBzdGFydFBvaW50ICkgKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdC8vIFRvIGdldCBhY2N1cmF0ZSBwb2ludCB3aXRoIHJlZmVyZW5jZSB0b1xuXHQvLyBlbnRpcmUgcGF0aCBkaXN0YW5jZSBhdCB0aW1lIHQsXG5cdC8vIGZvbGxvd2luZyBoYXMgdG8gYmUgZG9uZTpcblxuXHQvLyAxLiBMZW5ndGggb2YgZWFjaCBzdWIgcGF0aCBoYXZlIHRvIGJlIGtub3duXG5cdC8vIDIuIExvY2F0ZSBhbmQgaWRlbnRpZnkgdHlwZSBvZiBjdXJ2ZVxuXHQvLyAzLiBHZXQgdCBmb3IgdGhlIGN1cnZlXG5cdC8vIDQuIFJldHVybiBjdXJ2ZS5nZXRQb2ludEF0KHQnKVxuXG5cdGdldFBvaW50OiBmdW5jdGlvbiAoIHQgKSB7XG5cblx0XHR2YXIgZCA9IHQgKiB0aGlzLmdldExlbmd0aCgpO1xuXHRcdHZhciBjdXJ2ZUxlbmd0aHMgPSB0aGlzLmdldEN1cnZlTGVuZ3RocygpO1xuXHRcdHZhciBpID0gMDtcblxuXHRcdC8vIFRvIHRoaW5rIGFib3V0IGJvdW5kYXJpZXMgcG9pbnRzLlxuXG5cdFx0d2hpbGUgKCBpIDwgY3VydmVMZW5ndGhzLmxlbmd0aCApIHtcblxuXHRcdFx0aWYgKCBjdXJ2ZUxlbmd0aHNbIGkgXSA+PSBkICkge1xuXG5cdFx0XHRcdHZhciBkaWZmID0gY3VydmVMZW5ndGhzWyBpIF0gLSBkO1xuXHRcdFx0XHR2YXIgY3VydmUgPSB0aGlzLmN1cnZlc1sgaSBdO1xuXG5cdFx0XHRcdHZhciBzZWdtZW50TGVuZ3RoID0gY3VydmUuZ2V0TGVuZ3RoKCk7XG5cdFx0XHRcdHZhciB1ID0gc2VnbWVudExlbmd0aCA9PT0gMCA/IDAgOiAxIC0gZGlmZiAvIHNlZ21lbnRMZW5ndGg7XG5cblx0XHRcdFx0cmV0dXJuIGN1cnZlLmdldFBvaW50QXQoIHUgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpICsrO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIG51bGw7XG5cblx0XHQvLyBsb29wIHdoZXJlIHN1bSAhPSAwLCBzdW0gPiBkICwgc3VtKzEgPGRcblxuXHR9LFxuXG5cdC8vIFdlIGNhbm5vdCB1c2UgdGhlIGRlZmF1bHQgVEhSRUUuQ3VydmUgZ2V0UG9pbnQoKSB3aXRoIGdldExlbmd0aCgpIGJlY2F1c2UgaW5cblx0Ly8gVEhSRUUuQ3VydmUsIGdldExlbmd0aCgpIGRlcGVuZHMgb24gZ2V0UG9pbnQoKSBidXQgaW4gVEhSRUUuQ3VydmVQYXRoXG5cdC8vIGdldFBvaW50KCkgZGVwZW5kcyBvbiBnZXRMZW5ndGhcblxuXHRnZXRMZW5ndGg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBsZW5zID0gdGhpcy5nZXRDdXJ2ZUxlbmd0aHMoKTtcblx0XHRyZXR1cm4gbGVuc1sgbGVucy5sZW5ndGggLSAxIF07XG5cblx0fSxcblxuXHQvLyBjYWNoZUxlbmd0aHMgbXVzdCBiZSByZWNhbGN1bGF0ZWQuXG5cdHVwZGF0ZUFyY0xlbmd0aHM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMubmVlZHNVcGRhdGUgPSB0cnVlO1xuXHRcdHRoaXMuY2FjaGVMZW5ndGhzID0gbnVsbDtcblx0XHR0aGlzLmdldEN1cnZlTGVuZ3RocygpO1xuXG5cdH0sXG5cblx0Ly8gQ29tcHV0ZSBsZW5ndGhzIGFuZCBjYWNoZSB0aGVtXG5cdC8vIFdlIGNhbm5vdCBvdmVyd3JpdGUgZ2V0TGVuZ3RocygpIGJlY2F1c2UgVXRvVCBtYXBwaW5nIHVzZXMgaXQuXG5cblx0Z2V0Q3VydmVMZW5ndGhzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyBXZSB1c2UgY2FjaGUgdmFsdWVzIGlmIGN1cnZlcyBhbmQgY2FjaGUgYXJyYXkgYXJlIHNhbWUgbGVuZ3RoXG5cblx0XHRpZiAoIHRoaXMuY2FjaGVMZW5ndGhzICYmIHRoaXMuY2FjaGVMZW5ndGhzLmxlbmd0aCA9PT0gdGhpcy5jdXJ2ZXMubGVuZ3RoICkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5jYWNoZUxlbmd0aHM7XG5cblx0XHR9XG5cblx0XHQvLyBHZXQgbGVuZ3RoIG9mIHN1Yi1jdXJ2ZVxuXHRcdC8vIFB1c2ggc3VtcyBpbnRvIGNhY2hlZCBhcnJheVxuXG5cdFx0dmFyIGxlbmd0aHMgPSBbXSwgc3VtcyA9IDA7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSB0aGlzLmN1cnZlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRzdW1zICs9IHRoaXMuY3VydmVzWyBpIF0uZ2V0TGVuZ3RoKCk7XG5cdFx0XHRsZW5ndGhzLnB1c2goIHN1bXMgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMuY2FjaGVMZW5ndGhzID0gbGVuZ3RocztcblxuXHRcdHJldHVybiBsZW5ndGhzO1xuXG5cdH0sXG5cblx0Z2V0U3BhY2VkUG9pbnRzOiBmdW5jdGlvbiAoIGRpdmlzaW9ucyApIHtcblxuXHRcdGlmICggZGl2aXNpb25zID09PSB1bmRlZmluZWQgKSBkaXZpc2lvbnMgPSA0MDtcblxuXHRcdHZhciBwb2ludHMgPSBbXTtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8PSBkaXZpc2lvbnM7IGkgKysgKSB7XG5cblx0XHRcdHBvaW50cy5wdXNoKCB0aGlzLmdldFBvaW50KCBpIC8gZGl2aXNpb25zICkgKTtcblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5hdXRvQ2xvc2UgKSB7XG5cblx0XHRcdHBvaW50cy5wdXNoKCBwb2ludHNbIDAgXSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHBvaW50cztcblxuXHR9LFxuXG5cdGdldFBvaW50czogZnVuY3Rpb24gKCBkaXZpc2lvbnMgKSB7XG5cblx0XHRkaXZpc2lvbnMgPSBkaXZpc2lvbnMgfHwgMTI7XG5cblx0XHR2YXIgcG9pbnRzID0gW10sIGxhc3Q7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGN1cnZlcyA9IHRoaXMuY3VydmVzOyBpIDwgY3VydmVzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGN1cnZlID0gY3VydmVzWyBpIF07XG5cdFx0XHR2YXIgcmVzb2x1dGlvbiA9ICggY3VydmUgJiYgY3VydmUuaXNFbGxpcHNlQ3VydmUgKSA/IGRpdmlzaW9ucyAqIDJcblx0XHRcdFx0OiAoIGN1cnZlICYmIGN1cnZlLmlzTGluZUN1cnZlICkgPyAxXG5cdFx0XHRcdFx0OiAoIGN1cnZlICYmIGN1cnZlLmlzU3BsaW5lQ3VydmUgKSA/IGRpdmlzaW9ucyAqIGN1cnZlLnBvaW50cy5sZW5ndGhcblx0XHRcdFx0XHRcdDogZGl2aXNpb25zO1xuXG5cdFx0XHR2YXIgcHRzID0gY3VydmUuZ2V0UG9pbnRzKCByZXNvbHV0aW9uICk7XG5cblx0XHRcdGZvciAoIHZhciBqID0gMDsgaiA8IHB0cy5sZW5ndGg7IGogKysgKSB7XG5cblx0XHRcdFx0dmFyIHBvaW50ID0gcHRzWyBqIF07XG5cblx0XHRcdFx0aWYgKCBsYXN0ICYmIGxhc3QuZXF1YWxzKCBwb2ludCApICkgY29udGludWU7IC8vIGVuc3VyZXMgbm8gY29uc2VjdXRpdmUgcG9pbnRzIGFyZSBkdXBsaWNhdGVzXG5cblx0XHRcdFx0cG9pbnRzLnB1c2goIHBvaW50ICk7XG5cdFx0XHRcdGxhc3QgPSBwb2ludDtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLmF1dG9DbG9zZSAmJiBwb2ludHMubGVuZ3RoID4gMSAmJiAhIHBvaW50c1sgcG9pbnRzLmxlbmd0aCAtIDEgXS5lcXVhbHMoIHBvaW50c1sgMCBdICkgKSB7XG5cblx0XHRcdHBvaW50cy5wdXNoKCBwb2ludHNbIDAgXSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHBvaW50cztcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0Q3VydmUucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0XHR0aGlzLmN1cnZlcyA9IFtdO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gc291cmNlLmN1cnZlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgY3VydmUgPSBzb3VyY2UuY3VydmVzWyBpIF07XG5cblx0XHRcdHRoaXMuY3VydmVzLnB1c2goIGN1cnZlLmNsb25lKCkgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMuYXV0b0Nsb3NlID0gc291cmNlLmF1dG9DbG9zZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dG9KU09OOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgZGF0YSA9IEN1cnZlLnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcyApO1xuXG5cdFx0ZGF0YS5hdXRvQ2xvc2UgPSB0aGlzLmF1dG9DbG9zZTtcblx0XHRkYXRhLmN1cnZlcyA9IFtdO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gdGhpcy5jdXJ2ZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGN1cnZlID0gdGhpcy5jdXJ2ZXNbIGkgXTtcblx0XHRcdGRhdGEuY3VydmVzLnB1c2goIGN1cnZlLnRvSlNPTigpICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gZGF0YTtcblxuXHR9LFxuXG5cdGZyb21KU09OOiBmdW5jdGlvbiAoIGpzb24gKSB7XG5cblx0XHRDdXJ2ZS5wcm90b3R5cGUuZnJvbUpTT04uY2FsbCggdGhpcywganNvbiApO1xuXG5cdFx0dGhpcy5hdXRvQ2xvc2UgPSBqc29uLmF1dG9DbG9zZTtcblx0XHR0aGlzLmN1cnZlcyA9IFtdO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0ganNvbi5jdXJ2ZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGN1cnZlID0ganNvbi5jdXJ2ZXNbIGkgXTtcblx0XHRcdHRoaXMuY3VydmVzLnB1c2goIG5ldyBDdXJ2ZXNbIGN1cnZlLnR5cGUgXSgpLmZyb21KU09OKCBjdXJ2ZSApICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIHp6ODUgLyBodHRwOi8vd3d3LmxhYjRnYW1lcy5uZXQveno4NS9ibG9nXG4gKiBDcmVhdGVzIGZyZWUgZm9ybSAyZCBwYXRoIHVzaW5nIHNlcmllcyBvZiBwb2ludHMsIGxpbmVzIG9yIGN1cnZlcy5cbiAqKi9cblxuZnVuY3Rpb24gUGF0aCggcG9pbnRzICkge1xuXG5cdEN1cnZlUGF0aC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1BhdGgnO1xuXG5cdHRoaXMuY3VycmVudFBvaW50ID0gbmV3IFZlY3RvcjIoKTtcblxuXHRpZiAoIHBvaW50cyApIHtcblxuXHRcdHRoaXMuc2V0RnJvbVBvaW50cyggcG9pbnRzICk7XG5cblx0fVxuXG59XG5cblBhdGgucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggQ3VydmVQYXRoLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IFBhdGgsXG5cblx0c2V0RnJvbVBvaW50czogZnVuY3Rpb24gKCBwb2ludHMgKSB7XG5cblx0XHR0aGlzLm1vdmVUbyggcG9pbnRzWyAwIF0ueCwgcG9pbnRzWyAwIF0ueSApO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAxLCBsID0gcG9pbnRzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHRoaXMubGluZVRvKCBwb2ludHNbIGkgXS54LCBwb2ludHNbIGkgXS55ICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHRtb3ZlVG86IGZ1bmN0aW9uICggeCwgeSApIHtcblxuXHRcdHRoaXMuY3VycmVudFBvaW50LnNldCggeCwgeSApOyAvLyBUT0RPIGNvbnNpZGVyIHJlZmVyZW5jaW5nIHZlY3RvcnMgaW5zdGVhZCBvZiBjb3B5aW5nP1xuXG5cdH0sXG5cblx0bGluZVRvOiBmdW5jdGlvbiAoIHgsIHkgKSB7XG5cblx0XHR2YXIgY3VydmUgPSBuZXcgTGluZUN1cnZlKCB0aGlzLmN1cnJlbnRQb2ludC5jbG9uZSgpLCBuZXcgVmVjdG9yMiggeCwgeSApICk7XG5cdFx0dGhpcy5jdXJ2ZXMucHVzaCggY3VydmUgKTtcblxuXHRcdHRoaXMuY3VycmVudFBvaW50LnNldCggeCwgeSApO1xuXG5cdH0sXG5cblx0cXVhZHJhdGljQ3VydmVUbzogZnVuY3Rpb24gKCBhQ1B4LCBhQ1B5LCBhWCwgYVkgKSB7XG5cblx0XHR2YXIgY3VydmUgPSBuZXcgUXVhZHJhdGljQmV6aWVyQ3VydmUoXG5cdFx0XHR0aGlzLmN1cnJlbnRQb2ludC5jbG9uZSgpLFxuXHRcdFx0bmV3IFZlY3RvcjIoIGFDUHgsIGFDUHkgKSxcblx0XHRcdG5ldyBWZWN0b3IyKCBhWCwgYVkgKVxuXHRcdCk7XG5cblx0XHR0aGlzLmN1cnZlcy5wdXNoKCBjdXJ2ZSApO1xuXG5cdFx0dGhpcy5jdXJyZW50UG9pbnQuc2V0KCBhWCwgYVkgKTtcblxuXHR9LFxuXG5cdGJlemllckN1cnZlVG86IGZ1bmN0aW9uICggYUNQMXgsIGFDUDF5LCBhQ1AyeCwgYUNQMnksIGFYLCBhWSApIHtcblxuXHRcdHZhciBjdXJ2ZSA9IG5ldyBDdWJpY0JlemllckN1cnZlKFxuXHRcdFx0dGhpcy5jdXJyZW50UG9pbnQuY2xvbmUoKSxcblx0XHRcdG5ldyBWZWN0b3IyKCBhQ1AxeCwgYUNQMXkgKSxcblx0XHRcdG5ldyBWZWN0b3IyKCBhQ1AyeCwgYUNQMnkgKSxcblx0XHRcdG5ldyBWZWN0b3IyKCBhWCwgYVkgKVxuXHRcdCk7XG5cblx0XHR0aGlzLmN1cnZlcy5wdXNoKCBjdXJ2ZSApO1xuXG5cdFx0dGhpcy5jdXJyZW50UG9pbnQuc2V0KCBhWCwgYVkgKTtcblxuXHR9LFxuXG5cdHNwbGluZVRocnU6IGZ1bmN0aW9uICggcHRzIC8qQXJyYXkgb2YgVmVjdG9yKi8gKSB7XG5cblx0XHR2YXIgbnB0cyA9IFsgdGhpcy5jdXJyZW50UG9pbnQuY2xvbmUoKSBdLmNvbmNhdCggcHRzICk7XG5cblx0XHR2YXIgY3VydmUgPSBuZXcgU3BsaW5lQ3VydmUoIG5wdHMgKTtcblx0XHR0aGlzLmN1cnZlcy5wdXNoKCBjdXJ2ZSApO1xuXG5cdFx0dGhpcy5jdXJyZW50UG9pbnQuY29weSggcHRzWyBwdHMubGVuZ3RoIC0gMSBdICk7XG5cblx0fSxcblxuXHRhcmM6IGZ1bmN0aW9uICggYVgsIGFZLCBhUmFkaXVzLCBhU3RhcnRBbmdsZSwgYUVuZEFuZ2xlLCBhQ2xvY2t3aXNlICkge1xuXG5cdFx0dmFyIHgwID0gdGhpcy5jdXJyZW50UG9pbnQueDtcblx0XHR2YXIgeTAgPSB0aGlzLmN1cnJlbnRQb2ludC55O1xuXG5cdFx0dGhpcy5hYnNhcmMoIGFYICsgeDAsIGFZICsgeTAsIGFSYWRpdXMsXG5cdFx0XHRhU3RhcnRBbmdsZSwgYUVuZEFuZ2xlLCBhQ2xvY2t3aXNlICk7XG5cblx0fSxcblxuXHRhYnNhcmM6IGZ1bmN0aW9uICggYVgsIGFZLCBhUmFkaXVzLCBhU3RhcnRBbmdsZSwgYUVuZEFuZ2xlLCBhQ2xvY2t3aXNlICkge1xuXG5cdFx0dGhpcy5hYnNlbGxpcHNlKCBhWCwgYVksIGFSYWRpdXMsIGFSYWRpdXMsIGFTdGFydEFuZ2xlLCBhRW5kQW5nbGUsIGFDbG9ja3dpc2UgKTtcblxuXHR9LFxuXG5cdGVsbGlwc2U6IGZ1bmN0aW9uICggYVgsIGFZLCB4UmFkaXVzLCB5UmFkaXVzLCBhU3RhcnRBbmdsZSwgYUVuZEFuZ2xlLCBhQ2xvY2t3aXNlLCBhUm90YXRpb24gKSB7XG5cblx0XHR2YXIgeDAgPSB0aGlzLmN1cnJlbnRQb2ludC54O1xuXHRcdHZhciB5MCA9IHRoaXMuY3VycmVudFBvaW50Lnk7XG5cblx0XHR0aGlzLmFic2VsbGlwc2UoIGFYICsgeDAsIGFZICsgeTAsIHhSYWRpdXMsIHlSYWRpdXMsIGFTdGFydEFuZ2xlLCBhRW5kQW5nbGUsIGFDbG9ja3dpc2UsIGFSb3RhdGlvbiApO1xuXG5cdH0sXG5cblx0YWJzZWxsaXBzZTogZnVuY3Rpb24gKCBhWCwgYVksIHhSYWRpdXMsIHlSYWRpdXMsIGFTdGFydEFuZ2xlLCBhRW5kQW5nbGUsIGFDbG9ja3dpc2UsIGFSb3RhdGlvbiApIHtcblxuXHRcdHZhciBjdXJ2ZSA9IG5ldyBFbGxpcHNlQ3VydmUoIGFYLCBhWSwgeFJhZGl1cywgeVJhZGl1cywgYVN0YXJ0QW5nbGUsIGFFbmRBbmdsZSwgYUNsb2Nrd2lzZSwgYVJvdGF0aW9uICk7XG5cblx0XHRpZiAoIHRoaXMuY3VydmVzLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdC8vIGlmIGEgcHJldmlvdXMgY3VydmUgaXMgcHJlc2VudCwgYXR0ZW1wdCB0byBqb2luXG5cdFx0XHR2YXIgZmlyc3RQb2ludCA9IGN1cnZlLmdldFBvaW50KCAwICk7XG5cblx0XHRcdGlmICggISBmaXJzdFBvaW50LmVxdWFscyggdGhpcy5jdXJyZW50UG9pbnQgKSApIHtcblxuXHRcdFx0XHR0aGlzLmxpbmVUbyggZmlyc3RQb2ludC54LCBmaXJzdFBvaW50LnkgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0dGhpcy5jdXJ2ZXMucHVzaCggY3VydmUgKTtcblxuXHRcdHZhciBsYXN0UG9pbnQgPSBjdXJ2ZS5nZXRQb2ludCggMSApO1xuXHRcdHRoaXMuY3VycmVudFBvaW50LmNvcHkoIGxhc3RQb2ludCApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHRDdXJ2ZVBhdGgucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0XHR0aGlzLmN1cnJlbnRQb2ludC5jb3B5KCBzb3VyY2UuY3VycmVudFBvaW50ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGRhdGEgPSBDdXJ2ZVBhdGgucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzICk7XG5cblx0XHRkYXRhLmN1cnJlbnRQb2ludCA9IHRoaXMuY3VycmVudFBvaW50LnRvQXJyYXkoKTtcblxuXHRcdHJldHVybiBkYXRhO1xuXG5cdH0sXG5cblx0ZnJvbUpTT046IGZ1bmN0aW9uICgganNvbiApIHtcblxuXHRcdEN1cnZlUGF0aC5wcm90b3R5cGUuZnJvbUpTT04uY2FsbCggdGhpcywganNvbiApO1xuXG5cdFx0dGhpcy5jdXJyZW50UG9pbnQuZnJvbUFycmF5KCBqc29uLmN1cnJlbnRQb2ludCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciB6ejg1IC8gaHR0cDovL3d3dy5sYWI0Z2FtZXMubmV0L3p6ODUvYmxvZ1xuICogRGVmaW5lcyBhIDJkIHNoYXBlIHBsYW5lIHVzaW5nIHBhdGhzLlxuICoqL1xuXG4vLyBTVEVQIDEgQ3JlYXRlIGEgcGF0aC5cbi8vIFNURVAgMiBUdXJuIHBhdGggaW50byBzaGFwZS5cbi8vIFNURVAgMyBFeHRydWRlR2VvbWV0cnkgdGFrZXMgaW4gU2hhcGUvU2hhcGVzXG4vLyBTVEVQIDNhIC0gRXh0cmFjdCBwb2ludHMgZnJvbSBlYWNoIHNoYXBlLCB0dXJuIHRvIHZlcnRpY2VzXG4vLyBTVEVQIDNiIC0gVHJpYW5ndWxhdGUgZWFjaCBzaGFwZSwgYWRkIGZhY2VzLlxuXG5mdW5jdGlvbiBTaGFwZSggcG9pbnRzICkge1xuXG5cdFBhdGguY2FsbCggdGhpcywgcG9pbnRzICk7XG5cblx0dGhpcy51dWlkID0gX01hdGguZ2VuZXJhdGVVVUlEKCk7XG5cblx0dGhpcy50eXBlID0gJ1NoYXBlJztcblxuXHR0aGlzLmhvbGVzID0gW107XG5cbn1cblxuU2hhcGUucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggUGF0aC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBTaGFwZSxcblxuXHRnZXRQb2ludHNIb2xlczogZnVuY3Rpb24gKCBkaXZpc2lvbnMgKSB7XG5cblx0XHR2YXIgaG9sZXNQdHMgPSBbXTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHRoaXMuaG9sZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0aG9sZXNQdHNbIGkgXSA9IHRoaXMuaG9sZXNbIGkgXS5nZXRQb2ludHMoIGRpdmlzaW9ucyApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGhvbGVzUHRzO1xuXG5cdH0sXG5cblx0Ly8gZ2V0IHBvaW50cyBvZiBzaGFwZSBhbmQgaG9sZXMgKGtleXBvaW50cyBiYXNlZCBvbiBzZWdtZW50cyBwYXJhbWV0ZXIpXG5cblx0ZXh0cmFjdFBvaW50czogZnVuY3Rpb24gKCBkaXZpc2lvbnMgKSB7XG5cblx0XHRyZXR1cm4ge1xuXG5cdFx0XHRzaGFwZTogdGhpcy5nZXRQb2ludHMoIGRpdmlzaW9ucyApLFxuXHRcdFx0aG9sZXM6IHRoaXMuZ2V0UG9pbnRzSG9sZXMoIGRpdmlzaW9ucyApXG5cblx0XHR9O1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHRQYXRoLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdFx0dGhpcy5ob2xlcyA9IFtdO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gc291cmNlLmhvbGVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBob2xlID0gc291cmNlLmhvbGVzWyBpIF07XG5cblx0XHRcdHRoaXMuaG9sZXMucHVzaCggaG9sZS5jbG9uZSgpICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGRhdGEgPSBQYXRoLnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcyApO1xuXG5cdFx0ZGF0YS51dWlkID0gdGhpcy51dWlkO1xuXHRcdGRhdGEuaG9sZXMgPSBbXTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHRoaXMuaG9sZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGhvbGUgPSB0aGlzLmhvbGVzWyBpIF07XG5cdFx0XHRkYXRhLmhvbGVzLnB1c2goIGhvbGUudG9KU09OKCkgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBkYXRhO1xuXG5cdH0sXG5cblx0ZnJvbUpTT046IGZ1bmN0aW9uICgganNvbiApIHtcblxuXHRcdFBhdGgucHJvdG90eXBlLmZyb21KU09OLmNhbGwoIHRoaXMsIGpzb24gKTtcblxuXHRcdHRoaXMudXVpZCA9IGpzb24udXVpZDtcblx0XHR0aGlzLmhvbGVzID0gW107XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBqc29uLmhvbGVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBob2xlID0ganNvbi5ob2xlc1sgaSBdO1xuXHRcdFx0dGhpcy5ob2xlcy5wdXNoKCBuZXcgUGF0aCgpLmZyb21KU09OKCBob2xlICkgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICovXG5cbmZ1bmN0aW9uIExpZ2h0KCBjb2xvciwgaW50ZW5zaXR5ICkge1xuXG5cdE9iamVjdDNELmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnTGlnaHQnO1xuXG5cdHRoaXMuY29sb3IgPSBuZXcgQ29sb3IoIGNvbG9yICk7XG5cdHRoaXMuaW50ZW5zaXR5ID0gaW50ZW5zaXR5ICE9PSB1bmRlZmluZWQgPyBpbnRlbnNpdHkgOiAxO1xuXG5cdHRoaXMucmVjZWl2ZVNoYWRvdyA9IHVuZGVmaW5lZDtcblxufVxuXG5MaWdodC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBMaWdodCxcblxuXHRpc0xpZ2h0OiB0cnVlLFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0T2JqZWN0M0QucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0XHR0aGlzLmNvbG9yLmNvcHkoIHNvdXJjZS5jb2xvciApO1xuXHRcdHRoaXMuaW50ZW5zaXR5ID0gc291cmNlLmludGVuc2l0eTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dG9KU09OOiBmdW5jdGlvbiAoIG1ldGEgKSB7XG5cblx0XHR2YXIgZGF0YSA9IE9iamVjdDNELnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcywgbWV0YSApO1xuXG5cdFx0ZGF0YS5vYmplY3QuY29sb3IgPSB0aGlzLmNvbG9yLmdldEhleCgpO1xuXHRcdGRhdGEub2JqZWN0LmludGVuc2l0eSA9IHRoaXMuaW50ZW5zaXR5O1xuXG5cdFx0aWYgKCB0aGlzLmdyb3VuZENvbG9yICE9PSB1bmRlZmluZWQgKSBkYXRhLm9iamVjdC5ncm91bmRDb2xvciA9IHRoaXMuZ3JvdW5kQ29sb3IuZ2V0SGV4KCk7XG5cblx0XHRpZiAoIHRoaXMuZGlzdGFuY2UgIT09IHVuZGVmaW5lZCApIGRhdGEub2JqZWN0LmRpc3RhbmNlID0gdGhpcy5kaXN0YW5jZTtcblx0XHRpZiAoIHRoaXMuYW5nbGUgIT09IHVuZGVmaW5lZCApIGRhdGEub2JqZWN0LmFuZ2xlID0gdGhpcy5hbmdsZTtcblx0XHRpZiAoIHRoaXMuZGVjYXkgIT09IHVuZGVmaW5lZCApIGRhdGEub2JqZWN0LmRlY2F5ID0gdGhpcy5kZWNheTtcblx0XHRpZiAoIHRoaXMucGVudW1icmEgIT09IHVuZGVmaW5lZCApIGRhdGEub2JqZWN0LnBlbnVtYnJhID0gdGhpcy5wZW51bWJyYTtcblxuXHRcdGlmICggdGhpcy5zaGFkb3cgIT09IHVuZGVmaW5lZCApIGRhdGEub2JqZWN0LnNoYWRvdyA9IHRoaXMuc2hhZG93LnRvSlNPTigpO1xuXG5cdFx0cmV0dXJuIGRhdGE7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBIZW1pc3BoZXJlTGlnaHQoIHNreUNvbG9yLCBncm91bmRDb2xvciwgaW50ZW5zaXR5ICkge1xuXG5cdExpZ2h0LmNhbGwoIHRoaXMsIHNreUNvbG9yLCBpbnRlbnNpdHkgKTtcblxuXHR0aGlzLnR5cGUgPSAnSGVtaXNwaGVyZUxpZ2h0JztcblxuXHR0aGlzLmNhc3RTaGFkb3cgPSB1bmRlZmluZWQ7XG5cblx0dGhpcy5wb3NpdGlvbi5jb3B5KCBPYmplY3QzRC5EZWZhdWx0VXAgKTtcblx0dGhpcy51cGRhdGVNYXRyaXgoKTtcblxuXHR0aGlzLmdyb3VuZENvbG9yID0gbmV3IENvbG9yKCBncm91bmRDb2xvciApO1xuXG59XG5cbkhlbWlzcGhlcmVMaWdodC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBMaWdodC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBIZW1pc3BoZXJlTGlnaHQsXG5cblx0aXNIZW1pc3BoZXJlTGlnaHQ6IHRydWUsXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHRMaWdodC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHRcdHRoaXMuZ3JvdW5kQ29sb3IuY29weSggc291cmNlLmdyb3VuZENvbG9yICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIExpZ2h0U2hhZG93KCBjYW1lcmEgKSB7XG5cblx0dGhpcy5jYW1lcmEgPSBjYW1lcmE7XG5cblx0dGhpcy5iaWFzID0gMDtcblx0dGhpcy5yYWRpdXMgPSAxO1xuXG5cdHRoaXMubWFwU2l6ZSA9IG5ldyBWZWN0b3IyKCA1MTIsIDUxMiApO1xuXG5cdHRoaXMubWFwID0gbnVsbDtcblx0dGhpcy5tYXRyaXggPSBuZXcgTWF0cml4NCgpO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIExpZ2h0U2hhZG93LnByb3RvdHlwZSwge1xuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0dGhpcy5jYW1lcmEgPSBzb3VyY2UuY2FtZXJhLmNsb25lKCk7XG5cblx0XHR0aGlzLmJpYXMgPSBzb3VyY2UuYmlhcztcblx0XHR0aGlzLnJhZGl1cyA9IHNvdXJjZS5yYWRpdXM7XG5cblx0XHR0aGlzLm1hcFNpemUuY29weSggc291cmNlLm1hcFNpemUgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIG9iamVjdCA9IHt9O1xuXG5cdFx0aWYgKCB0aGlzLmJpYXMgIT09IDAgKSBvYmplY3QuYmlhcyA9IHRoaXMuYmlhcztcblx0XHRpZiAoIHRoaXMucmFkaXVzICE9PSAxICkgb2JqZWN0LnJhZGl1cyA9IHRoaXMucmFkaXVzO1xuXHRcdGlmICggdGhpcy5tYXBTaXplLnggIT09IDUxMiB8fCB0aGlzLm1hcFNpemUueSAhPT0gNTEyICkgb2JqZWN0Lm1hcFNpemUgPSB0aGlzLm1hcFNpemUudG9BcnJheSgpO1xuXG5cdFx0b2JqZWN0LmNhbWVyYSA9IHRoaXMuY2FtZXJhLnRvSlNPTiggZmFsc2UgKS5vYmplY3Q7XG5cdFx0ZGVsZXRlIG9iamVjdC5jYW1lcmEubWF0cml4O1xuXG5cdFx0cmV0dXJuIG9iamVjdDtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIFNwb3RMaWdodFNoYWRvdygpIHtcblxuXHRMaWdodFNoYWRvdy5jYWxsKCB0aGlzLCBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoIDUwLCAxLCAwLjUsIDUwMCApICk7XG5cbn1cblxuU3BvdExpZ2h0U2hhZG93LnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIExpZ2h0U2hhZG93LnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IFNwb3RMaWdodFNoYWRvdyxcblxuXHRpc1Nwb3RMaWdodFNoYWRvdzogdHJ1ZSxcblxuXHR1cGRhdGU6IGZ1bmN0aW9uICggbGlnaHQgKSB7XG5cblx0XHR2YXIgY2FtZXJhID0gdGhpcy5jYW1lcmE7XG5cblx0XHR2YXIgZm92ID0gX01hdGguUkFEMkRFRyAqIDIgKiBsaWdodC5hbmdsZTtcblx0XHR2YXIgYXNwZWN0ID0gdGhpcy5tYXBTaXplLndpZHRoIC8gdGhpcy5tYXBTaXplLmhlaWdodDtcblx0XHR2YXIgZmFyID0gbGlnaHQuZGlzdGFuY2UgfHwgY2FtZXJhLmZhcjtcblxuXHRcdGlmICggZm92ICE9PSBjYW1lcmEuZm92IHx8IGFzcGVjdCAhPT0gY2FtZXJhLmFzcGVjdCB8fCBmYXIgIT09IGNhbWVyYS5mYXIgKSB7XG5cblx0XHRcdGNhbWVyYS5mb3YgPSBmb3Y7XG5cdFx0XHRjYW1lcmEuYXNwZWN0ID0gYXNwZWN0O1xuXHRcdFx0Y2FtZXJhLmZhciA9IGZhcjtcblx0XHRcdGNhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XG5cblx0XHR9XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBTcG90TGlnaHQoIGNvbG9yLCBpbnRlbnNpdHksIGRpc3RhbmNlLCBhbmdsZSwgcGVudW1icmEsIGRlY2F5ICkge1xuXG5cdExpZ2h0LmNhbGwoIHRoaXMsIGNvbG9yLCBpbnRlbnNpdHkgKTtcblxuXHR0aGlzLnR5cGUgPSAnU3BvdExpZ2h0JztcblxuXHR0aGlzLnBvc2l0aW9uLmNvcHkoIE9iamVjdDNELkRlZmF1bHRVcCApO1xuXHR0aGlzLnVwZGF0ZU1hdHJpeCgpO1xuXG5cdHRoaXMudGFyZ2V0ID0gbmV3IE9iamVjdDNEKCk7XG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KCB0aGlzLCAncG93ZXInLCB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdC8vIGludGVuc2l0eSA9IHBvd2VyIHBlciBzb2xpZCBhbmdsZS5cblx0XHRcdC8vIHJlZjogZXF1YXRpb24gKDE3KSBmcm9tIGh0dHBzOi8vc2VibGFnYXJkZS5maWxlcy53b3JkcHJlc3MuY29tLzIwMTUvMDcvY291cnNlX25vdGVzX21vdmluZ19mcm9zdGJpdGVfdG9fcGJyX3YzMi5wZGZcblx0XHRcdHJldHVybiB0aGlzLmludGVuc2l0eSAqIE1hdGguUEk7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCBwb3dlciApIHtcblxuXHRcdFx0Ly8gaW50ZW5zaXR5ID0gcG93ZXIgcGVyIHNvbGlkIGFuZ2xlLlxuXHRcdFx0Ly8gcmVmOiBlcXVhdGlvbiAoMTcpIGZyb20gaHR0cHM6Ly9zZWJsYWdhcmRlLmZpbGVzLndvcmRwcmVzcy5jb20vMjAxNS8wNy9jb3Vyc2Vfbm90ZXNfbW92aW5nX2Zyb3N0Yml0ZV90b19wYnJfdjMyLnBkZlxuXHRcdFx0dGhpcy5pbnRlbnNpdHkgPSBwb3dlciAvIE1hdGguUEk7XG5cblx0XHR9XG5cdH0gKTtcblxuXHR0aGlzLmRpc3RhbmNlID0gKCBkaXN0YW5jZSAhPT0gdW5kZWZpbmVkICkgPyBkaXN0YW5jZSA6IDA7XG5cdHRoaXMuYW5nbGUgPSAoIGFuZ2xlICE9PSB1bmRlZmluZWQgKSA/IGFuZ2xlIDogTWF0aC5QSSAvIDM7XG5cdHRoaXMucGVudW1icmEgPSAoIHBlbnVtYnJhICE9PSB1bmRlZmluZWQgKSA/IHBlbnVtYnJhIDogMDtcblx0dGhpcy5kZWNheSA9ICggZGVjYXkgIT09IHVuZGVmaW5lZCApID8gZGVjYXkgOiAxO1x0Ly8gZm9yIHBoeXNpY2FsbHkgY29ycmVjdCBsaWdodHMsIHNob3VsZCBiZSAyLlxuXG5cdHRoaXMuc2hhZG93ID0gbmV3IFNwb3RMaWdodFNoYWRvdygpO1xuXG59XG5cblNwb3RMaWdodC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBMaWdodC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBTcG90TGlnaHQsXG5cblx0aXNTcG90TGlnaHQ6IHRydWUsXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHRMaWdodC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHRcdHRoaXMuZGlzdGFuY2UgPSBzb3VyY2UuZGlzdGFuY2U7XG5cdFx0dGhpcy5hbmdsZSA9IHNvdXJjZS5hbmdsZTtcblx0XHR0aGlzLnBlbnVtYnJhID0gc291cmNlLnBlbnVtYnJhO1xuXHRcdHRoaXMuZGVjYXkgPSBzb3VyY2UuZGVjYXk7XG5cblx0XHR0aGlzLnRhcmdldCA9IHNvdXJjZS50YXJnZXQuY2xvbmUoKTtcblxuXHRcdHRoaXMuc2hhZG93ID0gc291cmNlLnNoYWRvdy5jbG9uZSgpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5cbmZ1bmN0aW9uIFBvaW50TGlnaHQoIGNvbG9yLCBpbnRlbnNpdHksIGRpc3RhbmNlLCBkZWNheSApIHtcblxuXHRMaWdodC5jYWxsKCB0aGlzLCBjb2xvciwgaW50ZW5zaXR5ICk7XG5cblx0dGhpcy50eXBlID0gJ1BvaW50TGlnaHQnO1xuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggdGhpcywgJ3Bvd2VyJywge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHQvLyBpbnRlbnNpdHkgPSBwb3dlciBwZXIgc29saWQgYW5nbGUuXG5cdFx0XHQvLyByZWY6IGVxdWF0aW9uICgxNSkgZnJvbSBodHRwczovL3NlYmxhZ2FyZGUuZmlsZXMud29yZHByZXNzLmNvbS8yMDE1LzA3L2NvdXJzZV9ub3Rlc19tb3ZpbmdfZnJvc3RiaXRlX3RvX3Bicl92MzIucGRmXG5cdFx0XHRyZXR1cm4gdGhpcy5pbnRlbnNpdHkgKiA0ICogTWF0aC5QSTtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHBvd2VyICkge1xuXG5cdFx0XHQvLyBpbnRlbnNpdHkgPSBwb3dlciBwZXIgc29saWQgYW5nbGUuXG5cdFx0XHQvLyByZWY6IGVxdWF0aW9uICgxNSkgZnJvbSBodHRwczovL3NlYmxhZ2FyZGUuZmlsZXMud29yZHByZXNzLmNvbS8yMDE1LzA3L2NvdXJzZV9ub3Rlc19tb3ZpbmdfZnJvc3RiaXRlX3RvX3Bicl92MzIucGRmXG5cdFx0XHR0aGlzLmludGVuc2l0eSA9IHBvd2VyIC8gKCA0ICogTWF0aC5QSSApO1xuXG5cdFx0fVxuXHR9ICk7XG5cblx0dGhpcy5kaXN0YW5jZSA9ICggZGlzdGFuY2UgIT09IHVuZGVmaW5lZCApID8gZGlzdGFuY2UgOiAwO1xuXHR0aGlzLmRlY2F5ID0gKCBkZWNheSAhPT0gdW5kZWZpbmVkICkgPyBkZWNheSA6IDE7XHQvLyBmb3IgcGh5c2ljYWxseSBjb3JyZWN0IGxpZ2h0cywgc2hvdWxkIGJlIDIuXG5cblx0dGhpcy5zaGFkb3cgPSBuZXcgTGlnaHRTaGFkb3coIG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSggOTAsIDEsIDAuNSwgNTAwICkgKTtcblxufVxuXG5Qb2ludExpZ2h0LnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIExpZ2h0LnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IFBvaW50TGlnaHQsXG5cblx0aXNQb2ludExpZ2h0OiB0cnVlLFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0TGlnaHQucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0XHR0aGlzLmRpc3RhbmNlID0gc291cmNlLmRpc3RhbmNlO1xuXHRcdHRoaXMuZGVjYXkgPSBzb3VyY2UuZGVjYXk7XG5cblx0XHR0aGlzLnNoYWRvdyA9IHNvdXJjZS5zaGFkb3cuY2xvbmUoKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gRGlyZWN0aW9uYWxMaWdodFNoYWRvdyggKSB7XG5cblx0TGlnaHRTaGFkb3cuY2FsbCggdGhpcywgbmV3IE9ydGhvZ3JhcGhpY0NhbWVyYSggLSA1LCA1LCA1LCAtIDUsIDAuNSwgNTAwICkgKTtcblxufVxuXG5EaXJlY3Rpb25hbExpZ2h0U2hhZG93LnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIExpZ2h0U2hhZG93LnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IERpcmVjdGlvbmFsTGlnaHRTaGFkb3dcblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICovXG5cbmZ1bmN0aW9uIERpcmVjdGlvbmFsTGlnaHQoIGNvbG9yLCBpbnRlbnNpdHkgKSB7XG5cblx0TGlnaHQuY2FsbCggdGhpcywgY29sb3IsIGludGVuc2l0eSApO1xuXG5cdHRoaXMudHlwZSA9ICdEaXJlY3Rpb25hbExpZ2h0JztcblxuXHR0aGlzLnBvc2l0aW9uLmNvcHkoIE9iamVjdDNELkRlZmF1bHRVcCApO1xuXHR0aGlzLnVwZGF0ZU1hdHJpeCgpO1xuXG5cdHRoaXMudGFyZ2V0ID0gbmV3IE9iamVjdDNEKCk7XG5cblx0dGhpcy5zaGFkb3cgPSBuZXcgRGlyZWN0aW9uYWxMaWdodFNoYWRvdygpO1xuXG59XG5cbkRpcmVjdGlvbmFsTGlnaHQucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggTGlnaHQucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogRGlyZWN0aW9uYWxMaWdodCxcblxuXHRpc0RpcmVjdGlvbmFsTGlnaHQ6IHRydWUsXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHRMaWdodC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHRcdHRoaXMudGFyZ2V0ID0gc291cmNlLnRhcmdldC5jbG9uZSgpO1xuXG5cdFx0dGhpcy5zaGFkb3cgPSBzb3VyY2Uuc2hhZG93LmNsb25lKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIEFtYmllbnRMaWdodCggY29sb3IsIGludGVuc2l0eSApIHtcblxuXHRMaWdodC5jYWxsKCB0aGlzLCBjb2xvciwgaW50ZW5zaXR5ICk7XG5cblx0dGhpcy50eXBlID0gJ0FtYmllbnRMaWdodCc7XG5cblx0dGhpcy5jYXN0U2hhZG93ID0gdW5kZWZpbmVkO1xuXG59XG5cbkFtYmllbnRMaWdodC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBMaWdodC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBBbWJpZW50TGlnaHQsXG5cblx0aXNBbWJpZW50TGlnaHQ6IHRydWVcblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgYWJlbG5hdGlvbiAvIGh0dHA6Ly9naXRodWIuY29tL2FiZWxuYXRpb25cbiAqL1xuXG5mdW5jdGlvbiBSZWN0QXJlYUxpZ2h0KCBjb2xvciwgaW50ZW5zaXR5LCB3aWR0aCwgaGVpZ2h0ICkge1xuXG5cdExpZ2h0LmNhbGwoIHRoaXMsIGNvbG9yLCBpbnRlbnNpdHkgKTtcblxuXHR0aGlzLnR5cGUgPSAnUmVjdEFyZWFMaWdodCc7XG5cblx0dGhpcy53aWR0aCA9ICggd2lkdGggIT09IHVuZGVmaW5lZCApID8gd2lkdGggOiAxMDtcblx0dGhpcy5oZWlnaHQgPSAoIGhlaWdodCAhPT0gdW5kZWZpbmVkICkgPyBoZWlnaHQgOiAxMDtcblxufVxuXG5SZWN0QXJlYUxpZ2h0LnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIExpZ2h0LnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IFJlY3RBcmVhTGlnaHQsXG5cblx0aXNSZWN0QXJlYUxpZ2h0OiB0cnVlLFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0TGlnaHQucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0XHR0aGlzLndpZHRoID0gc291cmNlLndpZHRoO1xuXHRcdHRoaXMuaGVpZ2h0ID0gc291cmNlLmhlaWdodDtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dG9KU09OOiBmdW5jdGlvbiAoIG1ldGEgKSB7XG5cblx0XHR2YXIgZGF0YSA9IExpZ2h0LnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcywgbWV0YSApO1xuXG5cdFx0ZGF0YS5vYmplY3Qud2lkdGggPSB0aGlzLndpZHRoO1xuXHRcdGRhdGEub2JqZWN0LmhlaWdodCA9IHRoaXMuaGVpZ2h0O1xuXG5cdFx0cmV0dXJuIGRhdGE7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICpcbiAqIEEgVHJhY2sgdGhhdCBpbnRlcnBvbGF0ZXMgU3RyaW5nc1xuICpcbiAqXG4gKiBAYXV0aG9yIEJlbiBIb3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvL1xuICogQGF1dGhvciBEYXZpZCBTYXJubyAvIGh0dHA6Ly9saWdodGhhdXMudXMvXG4gKiBAYXV0aG9yIHRzY2h3XG4gKi9cblxuZnVuY3Rpb24gU3RyaW5nS2V5ZnJhbWVUcmFjayggbmFtZSwgdGltZXMsIHZhbHVlcywgaW50ZXJwb2xhdGlvbiApIHtcblxuXHRLZXlmcmFtZVRyYWNrLmNhbGwoIHRoaXMsIG5hbWUsIHRpbWVzLCB2YWx1ZXMsIGludGVycG9sYXRpb24gKTtcblxufVxuXG5TdHJpbmdLZXlmcmFtZVRyYWNrLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEtleWZyYW1lVHJhY2sucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogU3RyaW5nS2V5ZnJhbWVUcmFjayxcblxuXHRWYWx1ZVR5cGVOYW1lOiAnc3RyaW5nJyxcblx0VmFsdWVCdWZmZXJUeXBlOiBBcnJheSxcblxuXHREZWZhdWx0SW50ZXJwb2xhdGlvbjogSW50ZXJwb2xhdGVEaXNjcmV0ZSxcblxuXHRJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RMaW5lYXI6IHVuZGVmaW5lZCxcblxuXHRJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGg6IHVuZGVmaW5lZFxuXG59ICk7XG5cbi8qKlxuICpcbiAqIEEgVHJhY2sgb2YgQm9vbGVhbiBrZXlmcmFtZSB2YWx1ZXMuXG4gKlxuICpcbiAqIEBhdXRob3IgQmVuIEhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW8vXG4gKiBAYXV0aG9yIERhdmlkIFNhcm5vIC8gaHR0cDovL2xpZ2h0aGF1cy51cy9cbiAqIEBhdXRob3IgdHNjaHdcbiAqL1xuXG5mdW5jdGlvbiBCb29sZWFuS2V5ZnJhbWVUcmFjayggbmFtZSwgdGltZXMsIHZhbHVlcyApIHtcblxuXHRLZXlmcmFtZVRyYWNrLmNhbGwoIHRoaXMsIG5hbWUsIHRpbWVzLCB2YWx1ZXMgKTtcblxufVxuXG5Cb29sZWFuS2V5ZnJhbWVUcmFjay5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBLZXlmcmFtZVRyYWNrLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IEJvb2xlYW5LZXlmcmFtZVRyYWNrLFxuXG5cdFZhbHVlVHlwZU5hbWU6ICdib29sJyxcblx0VmFsdWVCdWZmZXJUeXBlOiBBcnJheSxcblxuXHREZWZhdWx0SW50ZXJwb2xhdGlvbjogSW50ZXJwb2xhdGVEaXNjcmV0ZSxcblxuXHRJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RMaW5lYXI6IHVuZGVmaW5lZCxcblx0SW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kU21vb3RoOiB1bmRlZmluZWRcblxuXHQvLyBOb3RlOiBBY3R1YWxseSB0aGlzIHRyYWNrIGNvdWxkIGhhdmUgYSBvcHRpbWl6ZWQgLyBjb21wcmVzc2VkXG5cdC8vIHJlcHJlc2VudGF0aW9uIG9mIGEgc2luZ2xlIHZhbHVlIGFuZCBhIGN1c3RvbSBpbnRlcnBvbGFudCB0aGF0XG5cdC8vIGNvbXB1dGVzIFwiZmlyc3RWYWx1ZSBeIGlzT2RkKCBpbmRleCApXCIuXG5cbn0gKTtcblxuLyoqXG4gKiBBYnN0cmFjdCBiYXNlIGNsYXNzIG9mIGludGVycG9sYW50cyBvdmVyIHBhcmFtZXRyaWMgc2FtcGxlcy5cbiAqXG4gKiBUaGUgcGFyYW1ldGVyIGRvbWFpbiBpcyBvbmUgZGltZW5zaW9uYWwsIHR5cGljYWxseSB0aGUgdGltZSBvciBhIHBhdGhcbiAqIGFsb25nIGEgY3VydmUgZGVmaW5lZCBieSB0aGUgZGF0YS5cbiAqXG4gKiBUaGUgc2FtcGxlIHZhbHVlcyBjYW4gaGF2ZSBhbnkgZGltZW5zaW9uYWxpdHkgYW5kIGRlcml2ZWQgY2xhc3NlcyBtYXlcbiAqIGFwcGx5IHNwZWNpYWwgaW50ZXJwcmV0YXRpb25zIHRvIHRoZSBkYXRhLlxuICpcbiAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgdGhlIGludGVydmFsIHNlZWsgaW4gYSBUZW1wbGF0ZSBNZXRob2QsIGRlZmVycmluZ1xuICogdGhlIGFjdHVhbCBpbnRlcnBvbGF0aW9uIHRvIGRlcml2ZWQgY2xhc3Nlcy5cbiAqXG4gKiBUaW1lIGNvbXBsZXhpdHkgaXMgTygxKSBmb3IgbGluZWFyIGFjY2VzcyBjcm9zc2luZyBhdCBtb3N0IHR3byBwb2ludHNcbiAqIGFuZCBPKGxvZyBOKSBmb3IgcmFuZG9tIGFjY2Vzcywgd2hlcmUgTiBpcyB0aGUgbnVtYmVyIG9mIHBvc2l0aW9ucy5cbiAqXG4gKiBSZWZlcmVuY2VzOlxuICpcbiAqIFx0XHRodHRwOi8vd3d3Lm9vZGVzaWduLmNvbS90ZW1wbGF0ZS1tZXRob2QtcGF0dGVybi5odG1sXG4gKlxuICogQGF1dGhvciB0c2Nod1xuICovXG5cbmZ1bmN0aW9uIEludGVycG9sYW50KCBwYXJhbWV0ZXJQb3NpdGlvbnMsIHNhbXBsZVZhbHVlcywgc2FtcGxlU2l6ZSwgcmVzdWx0QnVmZmVyICkge1xuXG5cdHRoaXMucGFyYW1ldGVyUG9zaXRpb25zID0gcGFyYW1ldGVyUG9zaXRpb25zO1xuXHR0aGlzLl9jYWNoZWRJbmRleCA9IDA7XG5cblx0dGhpcy5yZXN1bHRCdWZmZXIgPSByZXN1bHRCdWZmZXIgIT09IHVuZGVmaW5lZCA/XG5cdFx0cmVzdWx0QnVmZmVyIDogbmV3IHNhbXBsZVZhbHVlcy5jb25zdHJ1Y3Rvciggc2FtcGxlU2l6ZSApO1xuXHR0aGlzLnNhbXBsZVZhbHVlcyA9IHNhbXBsZVZhbHVlcztcblx0dGhpcy52YWx1ZVNpemUgPSBzYW1wbGVTaXplO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIEludGVycG9sYW50LnByb3RvdHlwZSwge1xuXG5cdGV2YWx1YXRlOiBmdW5jdGlvbiAoIHQgKSB7XG5cblx0XHR2YXIgcHAgPSB0aGlzLnBhcmFtZXRlclBvc2l0aW9ucyxcblx0XHRcdGkxID0gdGhpcy5fY2FjaGVkSW5kZXgsXG5cblx0XHRcdHQxID0gcHBbIGkxIF0sXG5cdFx0XHR0MCA9IHBwWyBpMSAtIDEgXTtcblxuXHRcdHZhbGlkYXRlX2ludGVydmFsOiB7XG5cblx0XHRcdHNlZWs6IHtcblxuXHRcdFx0XHR2YXIgcmlnaHQ7XG5cblx0XHRcdFx0bGluZWFyX3NjYW46IHtcblxuXHRcdFx0XHRcdC8vLSBTZWUgaHR0cDovL2pzcGVyZi5jb20vY29tcGFyaXNvbi10by11bmRlZmluZWQvM1xuXHRcdFx0XHRcdC8vLSBzbG93ZXIgY29kZTpcblx0XHRcdFx0XHQvLy1cblx0XHRcdFx0XHQvLy0gXHRcdFx0XHRpZiAoIHQgPj0gdDEgfHwgdDEgPT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0XHRmb3J3YXJkX3NjYW46IGlmICggISAoIHQgPCB0MSApICkge1xuXG5cdFx0XHRcdFx0XHRmb3IgKCB2YXIgZ2l2ZVVwQXQgPSBpMSArIDI7IDsgKSB7XG5cblx0XHRcdFx0XHRcdFx0aWYgKCB0MSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCB0IDwgdDAgKSBicmVhayBmb3J3YXJkX3NjYW47XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBhZnRlciBlbmRcblxuXHRcdFx0XHRcdFx0XHRcdGkxID0gcHAubGVuZ3RoO1xuXHRcdFx0XHRcdFx0XHRcdHRoaXMuX2NhY2hlZEluZGV4ID0gaTE7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMuYWZ0ZXJFbmRfKCBpMSAtIDEsIHQsIHQwICk7XG5cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdGlmICggaTEgPT09IGdpdmVVcEF0ICkgYnJlYWs7IC8vIHRoaXMgbG9vcFxuXG5cdFx0XHRcdFx0XHRcdHQwID0gdDE7XG5cdFx0XHRcdFx0XHRcdHQxID0gcHBbICsrIGkxIF07XG5cblx0XHRcdFx0XHRcdFx0aWYgKCB0IDwgdDEgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHQvLyB3ZSBoYXZlIGFycml2ZWQgYXQgdGhlIHNvdWdodCBpbnRlcnZhbFxuXHRcdFx0XHRcdFx0XHRcdGJyZWFrIHNlZWs7XG5cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdC8vIHByZXBhcmUgYmluYXJ5IHNlYXJjaCBvbiB0aGUgcmlnaHQgc2lkZSBvZiB0aGUgaW5kZXhcblx0XHRcdFx0XHRcdHJpZ2h0ID0gcHAubGVuZ3RoO1xuXHRcdFx0XHRcdFx0YnJlYWsgbGluZWFyX3NjYW47XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLy0gc2xvd2VyIGNvZGU6XG5cdFx0XHRcdFx0Ly8tXHRcdFx0XHRcdGlmICggdCA8IHQwIHx8IHQwID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0aWYgKCAhICggdCA+PSB0MCApICkge1xuXG5cdFx0XHRcdFx0XHQvLyBsb29waW5nP1xuXG5cdFx0XHRcdFx0XHR2YXIgdDFnbG9iYWwgPSBwcFsgMSBdO1xuXG5cdFx0XHRcdFx0XHRpZiAoIHQgPCB0MWdsb2JhbCApIHtcblxuXHRcdFx0XHRcdFx0XHRpMSA9IDI7IC8vICsgMSwgdXNpbmcgdGhlIHNjYW4gZm9yIHRoZSBkZXRhaWxzXG5cdFx0XHRcdFx0XHRcdHQwID0gdDFnbG9iYWw7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Ly8gbGluZWFyIHJldmVyc2Ugc2NhblxuXG5cdFx0XHRcdFx0XHRmb3IgKCB2YXIgZ2l2ZVVwQXQgPSBpMSAtIDI7IDsgKSB7XG5cblx0XHRcdFx0XHRcdFx0aWYgKCB0MCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gYmVmb3JlIHN0YXJ0XG5cblx0XHRcdFx0XHRcdFx0XHR0aGlzLl9jYWNoZWRJbmRleCA9IDA7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMuYmVmb3JlU3RhcnRfKCAwLCB0LCB0MSApO1xuXG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRpZiAoIGkxID09PSBnaXZlVXBBdCApIGJyZWFrOyAvLyB0aGlzIGxvb3BcblxuXHRcdFx0XHRcdFx0XHR0MSA9IHQwO1xuXHRcdFx0XHRcdFx0XHR0MCA9IHBwWyAtLSBpMSAtIDEgXTtcblxuXHRcdFx0XHRcdFx0XHRpZiAoIHQgPj0gdDAgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHQvLyB3ZSBoYXZlIGFycml2ZWQgYXQgdGhlIHNvdWdodCBpbnRlcnZhbFxuXHRcdFx0XHRcdFx0XHRcdGJyZWFrIHNlZWs7XG5cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdC8vIHByZXBhcmUgYmluYXJ5IHNlYXJjaCBvbiB0aGUgbGVmdCBzaWRlIG9mIHRoZSBpbmRleFxuXHRcdFx0XHRcdFx0cmlnaHQgPSBpMTtcblx0XHRcdFx0XHRcdGkxID0gMDtcblx0XHRcdFx0XHRcdGJyZWFrIGxpbmVhcl9zY2FuO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gdGhlIGludGVydmFsIGlzIHZhbGlkXG5cblx0XHRcdFx0XHRicmVhayB2YWxpZGF0ZV9pbnRlcnZhbDtcblxuXHRcdFx0XHR9IC8vIGxpbmVhciBzY2FuXG5cblx0XHRcdFx0Ly8gYmluYXJ5IHNlYXJjaFxuXG5cdFx0XHRcdHdoaWxlICggaTEgPCByaWdodCApIHtcblxuXHRcdFx0XHRcdHZhciBtaWQgPSAoIGkxICsgcmlnaHQgKSA+Pj4gMTtcblxuXHRcdFx0XHRcdGlmICggdCA8IHBwWyBtaWQgXSApIHtcblxuXHRcdFx0XHRcdFx0cmlnaHQgPSBtaWQ7XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRpMSA9IG1pZCArIDE7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHQxID0gcHBbIGkxIF07XG5cdFx0XHRcdHQwID0gcHBbIGkxIC0gMSBdO1xuXG5cdFx0XHRcdC8vIGNoZWNrIGJvdW5kYXJ5IGNhc2VzLCBhZ2FpblxuXG5cdFx0XHRcdGlmICggdDAgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdHRoaXMuX2NhY2hlZEluZGV4ID0gMDtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5iZWZvcmVTdGFydF8oIDAsIHQsIHQxICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICggdDEgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdGkxID0gcHAubGVuZ3RoO1xuXHRcdFx0XHRcdHRoaXMuX2NhY2hlZEluZGV4ID0gaTE7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuYWZ0ZXJFbmRfKCBpMSAtIDEsIHQwLCB0ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9IC8vIHNlZWtcblxuXHRcdFx0dGhpcy5fY2FjaGVkSW5kZXggPSBpMTtcblxuXHRcdFx0dGhpcy5pbnRlcnZhbENoYW5nZWRfKCBpMSwgdDAsIHQxICk7XG5cblx0XHR9IC8vIHZhbGlkYXRlX2ludGVydmFsXG5cblx0XHRyZXR1cm4gdGhpcy5pbnRlcnBvbGF0ZV8oIGkxLCB0MCwgdCwgdDEgKTtcblxuXHR9LFxuXG5cdHNldHRpbmdzOiBudWxsLCAvLyBvcHRpb25hbCwgc3ViY2xhc3Mtc3BlY2lmaWMgc2V0dGluZ3Mgc3RydWN0dXJlXG5cdC8vIE5vdGU6IFRoZSBpbmRpcmVjdGlvbiBhbGxvd3MgY2VudHJhbCBjb250cm9sIG9mIG1hbnkgaW50ZXJwb2xhbnRzLlxuXG5cdC8vIC0tLSBQcm90ZWN0ZWQgaW50ZXJmYWNlXG5cblx0RGVmYXVsdFNldHRpbmdzXzoge30sXG5cblx0Z2V0U2V0dGluZ3NfOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5zZXR0aW5ncyB8fCB0aGlzLkRlZmF1bHRTZXR0aW5nc187XG5cblx0fSxcblxuXHRjb3B5U2FtcGxlVmFsdWVfOiBmdW5jdGlvbiAoIGluZGV4ICkge1xuXG5cdFx0Ly8gY29waWVzIGEgc2FtcGxlIHZhbHVlIHRvIHRoZSByZXN1bHQgYnVmZmVyXG5cblx0XHR2YXIgcmVzdWx0ID0gdGhpcy5yZXN1bHRCdWZmZXIsXG5cdFx0XHR2YWx1ZXMgPSB0aGlzLnNhbXBsZVZhbHVlcyxcblx0XHRcdHN0cmlkZSA9IHRoaXMudmFsdWVTaXplLFxuXHRcdFx0b2Zmc2V0ID0gaW5kZXggKiBzdHJpZGU7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgIT09IHN0cmlkZTsgKysgaSApIHtcblxuXHRcdFx0cmVzdWx0WyBpIF0gPSB2YWx1ZXNbIG9mZnNldCArIGkgXTtcblxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cblx0fSxcblxuXHQvLyBUZW1wbGF0ZSBtZXRob2RzIGZvciBkZXJpdmVkIGNsYXNzZXM6XG5cblx0aW50ZXJwb2xhdGVfOiBmdW5jdGlvbiAoIC8qIGkxLCB0MCwgdCwgdDEgKi8gKSB7XG5cblx0XHR0aHJvdyBuZXcgRXJyb3IoICdjYWxsIHRvIGFic3RyYWN0IG1ldGhvZCcgKTtcblx0XHQvLyBpbXBsZW1lbnRhdGlvbnMgc2hhbGwgcmV0dXJuIHRoaXMucmVzdWx0QnVmZmVyXG5cblx0fSxcblxuXHRpbnRlcnZhbENoYW5nZWRfOiBmdW5jdGlvbiAoIC8qIGkxLCB0MCwgdDEgKi8gKSB7XG5cblx0XHQvLyBlbXB0eVxuXG5cdH1cblxufSApO1xuXG4vLyFcXCBERUNMQVJFIEFMSUFTIEFGVEVSIGFzc2lnbiBwcm90b3R5cGUgIVxuT2JqZWN0LmFzc2lnbiggSW50ZXJwb2xhbnQucHJvdG90eXBlLCB7XG5cblx0Ly8oIDAsIHQsIHQwICksIHJldHVybnMgdGhpcy5yZXN1bHRCdWZmZXJcblx0YmVmb3JlU3RhcnRfOiBJbnRlcnBvbGFudC5wcm90b3R5cGUuY29weVNhbXBsZVZhbHVlXyxcblxuXHQvLyggTi0xLCB0Ti0xLCB0ICksIHJldHVybnMgdGhpcy5yZXN1bHRCdWZmZXJcblx0YWZ0ZXJFbmRfOiBJbnRlcnBvbGFudC5wcm90b3R5cGUuY29weVNhbXBsZVZhbHVlXyxcblxufSApO1xuXG4vKipcbiAqIFNwaGVyaWNhbCBsaW5lYXIgdW5pdCBxdWF0ZXJuaW9uIGludGVycG9sYW50LlxuICpcbiAqIEBhdXRob3IgdHNjaHdcbiAqL1xuXG5mdW5jdGlvbiBRdWF0ZXJuaW9uTGluZWFySW50ZXJwb2xhbnQoIHBhcmFtZXRlclBvc2l0aW9ucywgc2FtcGxlVmFsdWVzLCBzYW1wbGVTaXplLCByZXN1bHRCdWZmZXIgKSB7XG5cblx0SW50ZXJwb2xhbnQuY2FsbCggdGhpcywgcGFyYW1ldGVyUG9zaXRpb25zLCBzYW1wbGVWYWx1ZXMsIHNhbXBsZVNpemUsIHJlc3VsdEJ1ZmZlciApO1xuXG59XG5cblF1YXRlcm5pb25MaW5lYXJJbnRlcnBvbGFudC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBJbnRlcnBvbGFudC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBRdWF0ZXJuaW9uTGluZWFySW50ZXJwb2xhbnQsXG5cblx0aW50ZXJwb2xhdGVfOiBmdW5jdGlvbiAoIGkxLCB0MCwgdCwgdDEgKSB7XG5cblx0XHR2YXIgcmVzdWx0ID0gdGhpcy5yZXN1bHRCdWZmZXIsXG5cdFx0XHR2YWx1ZXMgPSB0aGlzLnNhbXBsZVZhbHVlcyxcblx0XHRcdHN0cmlkZSA9IHRoaXMudmFsdWVTaXplLFxuXG5cdFx0XHRvZmZzZXQgPSBpMSAqIHN0cmlkZSxcblxuXHRcdFx0YWxwaGEgPSAoIHQgLSB0MCApIC8gKCB0MSAtIHQwICk7XG5cblx0XHRmb3IgKCB2YXIgZW5kID0gb2Zmc2V0ICsgc3RyaWRlOyBvZmZzZXQgIT09IGVuZDsgb2Zmc2V0ICs9IDQgKSB7XG5cblx0XHRcdFF1YXRlcm5pb24uc2xlcnBGbGF0KCByZXN1bHQsIDAsIHZhbHVlcywgb2Zmc2V0IC0gc3RyaWRlLCB2YWx1ZXMsIG9mZnNldCwgYWxwaGEgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICpcbiAqIEEgVHJhY2sgb2YgcXVhdGVybmlvbiBrZXlmcmFtZSB2YWx1ZXMuXG4gKlxuICogQGF1dGhvciBCZW4gSG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pby9cbiAqIEBhdXRob3IgRGF2aWQgU2Fybm8gLyBodHRwOi8vbGlnaHRoYXVzLnVzL1xuICogQGF1dGhvciB0c2Nod1xuICovXG5cbmZ1bmN0aW9uIFF1YXRlcm5pb25LZXlmcmFtZVRyYWNrKCBuYW1lLCB0aW1lcywgdmFsdWVzLCBpbnRlcnBvbGF0aW9uICkge1xuXG5cdEtleWZyYW1lVHJhY2suY2FsbCggdGhpcywgbmFtZSwgdGltZXMsIHZhbHVlcywgaW50ZXJwb2xhdGlvbiApO1xuXG59XG5cblF1YXRlcm5pb25LZXlmcmFtZVRyYWNrLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEtleWZyYW1lVHJhY2sucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogUXVhdGVybmlvbktleWZyYW1lVHJhY2ssXG5cblx0VmFsdWVUeXBlTmFtZTogJ3F1YXRlcm5pb24nLFxuXG5cdC8vIFZhbHVlQnVmZmVyVHlwZSBpcyBpbmhlcml0ZWRcblxuXHREZWZhdWx0SW50ZXJwb2xhdGlvbjogSW50ZXJwb2xhdGVMaW5lYXIsXG5cblx0SW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kTGluZWFyOiBmdW5jdGlvbiAoIHJlc3VsdCApIHtcblxuXHRcdHJldHVybiBuZXcgUXVhdGVybmlvbkxpbmVhckludGVycG9sYW50KCB0aGlzLnRpbWVzLCB0aGlzLnZhbHVlcywgdGhpcy5nZXRWYWx1ZVNpemUoKSwgcmVzdWx0ICk7XG5cblx0fSxcblxuXHRJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGg6IHVuZGVmaW5lZCAvLyBub3QgeWV0IGltcGxlbWVudGVkXG5cbn0gKTtcblxuLyoqXG4gKlxuICogQSBUcmFjayBvZiBrZXlmcmFtZSB2YWx1ZXMgdGhhdCByZXByZXNlbnQgY29sb3IuXG4gKlxuICpcbiAqIEBhdXRob3IgQmVuIEhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW8vXG4gKiBAYXV0aG9yIERhdmlkIFNhcm5vIC8gaHR0cDovL2xpZ2h0aGF1cy51cy9cbiAqIEBhdXRob3IgdHNjaHdcbiAqL1xuXG5mdW5jdGlvbiBDb2xvcktleWZyYW1lVHJhY2soIG5hbWUsIHRpbWVzLCB2YWx1ZXMsIGludGVycG9sYXRpb24gKSB7XG5cblx0S2V5ZnJhbWVUcmFjay5jYWxsKCB0aGlzLCBuYW1lLCB0aW1lcywgdmFsdWVzLCBpbnRlcnBvbGF0aW9uICk7XG5cbn1cblxuQ29sb3JLZXlmcmFtZVRyYWNrLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEtleWZyYW1lVHJhY2sucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogQ29sb3JLZXlmcmFtZVRyYWNrLFxuXG5cdFZhbHVlVHlwZU5hbWU6ICdjb2xvcidcblxuXHQvLyBWYWx1ZUJ1ZmZlclR5cGUgaXMgaW5oZXJpdGVkXG5cblx0Ly8gRGVmYXVsdEludGVycG9sYXRpb24gaXMgaW5oZXJpdGVkXG5cblx0Ly8gTm90ZTogVmVyeSBiYXNpYyBpbXBsZW1lbnRhdGlvbiBhbmQgbm90aGluZyBzcGVjaWFsIHlldC5cblx0Ly8gSG93ZXZlciwgdGhpcyBpcyB0aGUgcGxhY2UgZm9yIGNvbG9yIHNwYWNlIHBhcmFtZXRlcml6YXRpb24uXG5cbn0gKTtcblxuLyoqXG4gKlxuICogQSBUcmFjayBvZiBudW1lcmljIGtleWZyYW1lIHZhbHVlcy5cbiAqXG4gKiBAYXV0aG9yIEJlbiBIb3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvL1xuICogQGF1dGhvciBEYXZpZCBTYXJubyAvIGh0dHA6Ly9saWdodGhhdXMudXMvXG4gKiBAYXV0aG9yIHRzY2h3XG4gKi9cblxuZnVuY3Rpb24gTnVtYmVyS2V5ZnJhbWVUcmFjayggbmFtZSwgdGltZXMsIHZhbHVlcywgaW50ZXJwb2xhdGlvbiApIHtcblxuXHRLZXlmcmFtZVRyYWNrLmNhbGwoIHRoaXMsIG5hbWUsIHRpbWVzLCB2YWx1ZXMsIGludGVycG9sYXRpb24gKTtcblxufVxuXG5OdW1iZXJLZXlmcmFtZVRyYWNrLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEtleWZyYW1lVHJhY2sucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogTnVtYmVyS2V5ZnJhbWVUcmFjayxcblxuXHRWYWx1ZVR5cGVOYW1lOiAnbnVtYmVyJ1xuXG5cdC8vIFZhbHVlQnVmZmVyVHlwZSBpcyBpbmhlcml0ZWRcblxuXHQvLyBEZWZhdWx0SW50ZXJwb2xhdGlvbiBpcyBpbmhlcml0ZWRcblxufSApO1xuXG4vKipcbiAqIEZhc3QgYW5kIHNpbXBsZSBjdWJpYyBzcGxpbmUgaW50ZXJwb2xhbnQuXG4gKlxuICogSXQgd2FzIGRlcml2ZWQgZnJvbSBhIEhlcm1pdGlhbiBjb25zdHJ1Y3Rpb24gc2V0dGluZyB0aGUgZmlyc3QgZGVyaXZhdGl2ZVxuICogYXQgZWFjaCBzYW1wbGUgcG9zaXRpb24gdG8gdGhlIGxpbmVhciBzbG9wZSBiZXR3ZWVuIG5laWdoYm9yaW5nIHBvc2l0aW9uc1xuICogb3ZlciB0aGVpciBwYXJhbWV0ZXIgaW50ZXJ2YWwuXG4gKlxuICogQGF1dGhvciB0c2Nod1xuICovXG5cbmZ1bmN0aW9uIEN1YmljSW50ZXJwb2xhbnQoIHBhcmFtZXRlclBvc2l0aW9ucywgc2FtcGxlVmFsdWVzLCBzYW1wbGVTaXplLCByZXN1bHRCdWZmZXIgKSB7XG5cblx0SW50ZXJwb2xhbnQuY2FsbCggdGhpcywgcGFyYW1ldGVyUG9zaXRpb25zLCBzYW1wbGVWYWx1ZXMsIHNhbXBsZVNpemUsIHJlc3VsdEJ1ZmZlciApO1xuXG5cdHRoaXMuX3dlaWdodFByZXYgPSAtIDA7XG5cdHRoaXMuX29mZnNldFByZXYgPSAtIDA7XG5cdHRoaXMuX3dlaWdodE5leHQgPSAtIDA7XG5cdHRoaXMuX29mZnNldE5leHQgPSAtIDA7XG5cbn1cblxuQ3ViaWNJbnRlcnBvbGFudC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBJbnRlcnBvbGFudC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBDdWJpY0ludGVycG9sYW50LFxuXG5cdERlZmF1bHRTZXR0aW5nc186IHtcblxuXHRcdGVuZGluZ1N0YXJ0OiBaZXJvQ3VydmF0dXJlRW5kaW5nLFxuXHRcdGVuZGluZ0VuZDogWmVyb0N1cnZhdHVyZUVuZGluZ1xuXG5cdH0sXG5cblx0aW50ZXJ2YWxDaGFuZ2VkXzogZnVuY3Rpb24gKCBpMSwgdDAsIHQxICkge1xuXG5cdFx0dmFyIHBwID0gdGhpcy5wYXJhbWV0ZXJQb3NpdGlvbnMsXG5cdFx0XHRpUHJldiA9IGkxIC0gMixcblx0XHRcdGlOZXh0ID0gaTEgKyAxLFxuXG5cdFx0XHR0UHJldiA9IHBwWyBpUHJldiBdLFxuXHRcdFx0dE5leHQgPSBwcFsgaU5leHQgXTtcblxuXHRcdGlmICggdFByZXYgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0c3dpdGNoICggdGhpcy5nZXRTZXR0aW5nc18oKS5lbmRpbmdTdGFydCApIHtcblxuXHRcdFx0XHRjYXNlIFplcm9TbG9wZUVuZGluZzpcblxuXHRcdFx0XHRcdC8vIGYnKHQwKSA9IDBcblx0XHRcdFx0XHRpUHJldiA9IGkxO1xuXHRcdFx0XHRcdHRQcmV2ID0gMiAqIHQwIC0gdDE7XG5cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlIFdyYXBBcm91bmRFbmRpbmc6XG5cblx0XHRcdFx0XHQvLyB1c2UgdGhlIG90aGVyIGVuZCBvZiB0aGUgY3VydmVcblx0XHRcdFx0XHRpUHJldiA9IHBwLmxlbmd0aCAtIDI7XG5cdFx0XHRcdFx0dFByZXYgPSB0MCArIHBwWyBpUHJldiBdIC0gcHBbIGlQcmV2ICsgMSBdO1xuXG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0ZGVmYXVsdDogLy8gWmVyb0N1cnZhdHVyZUVuZGluZ1xuXG5cdFx0XHRcdFx0Ly8gZicnKHQwKSA9IDAgYS5rLmEuIE5hdHVyYWwgU3BsaW5lXG5cdFx0XHRcdFx0aVByZXYgPSBpMTtcblx0XHRcdFx0XHR0UHJldiA9IHQxO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIHROZXh0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHN3aXRjaCAoIHRoaXMuZ2V0U2V0dGluZ3NfKCkuZW5kaW5nRW5kICkge1xuXG5cdFx0XHRcdGNhc2UgWmVyb1Nsb3BlRW5kaW5nOlxuXG5cdFx0XHRcdFx0Ly8gZicodE4pID0gMFxuXHRcdFx0XHRcdGlOZXh0ID0gaTE7XG5cdFx0XHRcdFx0dE5leHQgPSAyICogdDEgLSB0MDtcblxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgV3JhcEFyb3VuZEVuZGluZzpcblxuXHRcdFx0XHRcdC8vIHVzZSB0aGUgb3RoZXIgZW5kIG9mIHRoZSBjdXJ2ZVxuXHRcdFx0XHRcdGlOZXh0ID0gMTtcblx0XHRcdFx0XHR0TmV4dCA9IHQxICsgcHBbIDEgXSAtIHBwWyAwIF07XG5cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRkZWZhdWx0OiAvLyBaZXJvQ3VydmF0dXJlRW5kaW5nXG5cblx0XHRcdFx0XHQvLyBmJycodE4pID0gMCwgYS5rLmEuIE5hdHVyYWwgU3BsaW5lXG5cdFx0XHRcdFx0aU5leHQgPSBpMSAtIDE7XG5cdFx0XHRcdFx0dE5leHQgPSB0MDtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0dmFyIGhhbGZEdCA9ICggdDEgLSB0MCApICogMC41LFxuXHRcdFx0c3RyaWRlID0gdGhpcy52YWx1ZVNpemU7XG5cblx0XHR0aGlzLl93ZWlnaHRQcmV2ID0gaGFsZkR0IC8gKCB0MCAtIHRQcmV2ICk7XG5cdFx0dGhpcy5fd2VpZ2h0TmV4dCA9IGhhbGZEdCAvICggdE5leHQgLSB0MSApO1xuXHRcdHRoaXMuX29mZnNldFByZXYgPSBpUHJldiAqIHN0cmlkZTtcblx0XHR0aGlzLl9vZmZzZXROZXh0ID0gaU5leHQgKiBzdHJpZGU7XG5cblx0fSxcblxuXHRpbnRlcnBvbGF0ZV86IGZ1bmN0aW9uICggaTEsIHQwLCB0LCB0MSApIHtcblxuXHRcdHZhciByZXN1bHQgPSB0aGlzLnJlc3VsdEJ1ZmZlcixcblx0XHRcdHZhbHVlcyA9IHRoaXMuc2FtcGxlVmFsdWVzLFxuXHRcdFx0c3RyaWRlID0gdGhpcy52YWx1ZVNpemUsXG5cblx0XHRcdG8xID0gaTEgKiBzdHJpZGUsXHRcdG8wID0gbzEgLSBzdHJpZGUsXG5cdFx0XHRvUCA9IHRoaXMuX29mZnNldFByZXYsIFx0b04gPSB0aGlzLl9vZmZzZXROZXh0LFxuXHRcdFx0d1AgPSB0aGlzLl93ZWlnaHRQcmV2LFx0d04gPSB0aGlzLl93ZWlnaHROZXh0LFxuXG5cdFx0XHRwID0gKCB0IC0gdDAgKSAvICggdDEgLSB0MCApLFxuXHRcdFx0cHAgPSBwICogcCxcblx0XHRcdHBwcCA9IHBwICogcDtcblxuXHRcdC8vIGV2YWx1YXRlIHBvbHlub21pYWxzXG5cblx0XHR2YXIgc1AgPSAtIHdQICogcHBwICsgMiAqIHdQICogcHAgLSB3UCAqIHA7XG5cdFx0dmFyIHMwID0gKCAxICsgd1AgKSAqIHBwcCArICggLSAxLjUgLSAyICogd1AgKSAqIHBwICsgKCAtIDAuNSArIHdQICkgKiBwICsgMTtcblx0XHR2YXIgczEgPSAoIC0gMSAtIHdOICkgKiBwcHAgKyAoIDEuNSArIHdOICkgKiBwcCArIDAuNSAqIHA7XG5cdFx0dmFyIHNOID0gd04gKiBwcHAgLSB3TiAqIHBwO1xuXG5cdFx0Ly8gY29tYmluZSBkYXRhIGxpbmVhcmx5XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgIT09IHN0cmlkZTsgKysgaSApIHtcblxuXHRcdFx0cmVzdWx0WyBpIF0gPVxuXHRcdFx0XHRcdHNQICogdmFsdWVzWyBvUCArIGkgXSArXG5cdFx0XHRcdFx0czAgKiB2YWx1ZXNbIG8wICsgaSBdICtcblx0XHRcdFx0XHRzMSAqIHZhbHVlc1sgbzEgKyBpIF0gK1xuXHRcdFx0XHRcdHNOICogdmFsdWVzWyBvTiArIGkgXTtcblxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciB0c2Nod1xuICovXG5cbmZ1bmN0aW9uIExpbmVhckludGVycG9sYW50KCBwYXJhbWV0ZXJQb3NpdGlvbnMsIHNhbXBsZVZhbHVlcywgc2FtcGxlU2l6ZSwgcmVzdWx0QnVmZmVyICkge1xuXG5cdEludGVycG9sYW50LmNhbGwoIHRoaXMsIHBhcmFtZXRlclBvc2l0aW9ucywgc2FtcGxlVmFsdWVzLCBzYW1wbGVTaXplLCByZXN1bHRCdWZmZXIgKTtcblxufVxuXG5MaW5lYXJJbnRlcnBvbGFudC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBJbnRlcnBvbGFudC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBMaW5lYXJJbnRlcnBvbGFudCxcblxuXHRpbnRlcnBvbGF0ZV86IGZ1bmN0aW9uICggaTEsIHQwLCB0LCB0MSApIHtcblxuXHRcdHZhciByZXN1bHQgPSB0aGlzLnJlc3VsdEJ1ZmZlcixcblx0XHRcdHZhbHVlcyA9IHRoaXMuc2FtcGxlVmFsdWVzLFxuXHRcdFx0c3RyaWRlID0gdGhpcy52YWx1ZVNpemUsXG5cblx0XHRcdG9mZnNldDEgPSBpMSAqIHN0cmlkZSxcblx0XHRcdG9mZnNldDAgPSBvZmZzZXQxIC0gc3RyaWRlLFxuXG5cdFx0XHR3ZWlnaHQxID0gKCB0IC0gdDAgKSAvICggdDEgLSB0MCApLFxuXHRcdFx0d2VpZ2h0MCA9IDEgLSB3ZWlnaHQxO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpICE9PSBzdHJpZGU7ICsrIGkgKSB7XG5cblx0XHRcdHJlc3VsdFsgaSBdID1cblx0XHRcdFx0XHR2YWx1ZXNbIG9mZnNldDAgKyBpIF0gKiB3ZWlnaHQwICtcblx0XHRcdFx0XHR2YWx1ZXNbIG9mZnNldDEgKyBpIF0gKiB3ZWlnaHQxO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKlxuICogSW50ZXJwb2xhbnQgdGhhdCBldmFsdWF0ZXMgdG8gdGhlIHNhbXBsZSB2YWx1ZSBhdCB0aGUgcG9zaXRpb24gcHJlY2VlZGluZ1xuICogdGhlIHBhcmFtZXRlci5cbiAqXG4gKiBAYXV0aG9yIHRzY2h3XG4gKi9cblxuZnVuY3Rpb24gRGlzY3JldGVJbnRlcnBvbGFudCggcGFyYW1ldGVyUG9zaXRpb25zLCBzYW1wbGVWYWx1ZXMsIHNhbXBsZVNpemUsIHJlc3VsdEJ1ZmZlciApIHtcblxuXHRJbnRlcnBvbGFudC5jYWxsKCB0aGlzLCBwYXJhbWV0ZXJQb3NpdGlvbnMsIHNhbXBsZVZhbHVlcywgc2FtcGxlU2l6ZSwgcmVzdWx0QnVmZmVyICk7XG5cbn1cblxuRGlzY3JldGVJbnRlcnBvbGFudC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBJbnRlcnBvbGFudC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBEaXNjcmV0ZUludGVycG9sYW50LFxuXG5cdGludGVycG9sYXRlXzogZnVuY3Rpb24gKCBpMSAvKiwgdDAsIHQsIHQxICovICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuY29weVNhbXBsZVZhbHVlXyggaTEgLSAxICk7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciB0c2Nod1xuICogQGF1dGhvciBCZW4gSG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pby9cbiAqIEBhdXRob3IgRGF2aWQgU2Fybm8gLyBodHRwOi8vbGlnaHRoYXVzLnVzL1xuICovXG5cbnZhciBBbmltYXRpb25VdGlscyA9IHtcblxuXHQvLyBzYW1lIGFzIEFycmF5LnByb3RvdHlwZS5zbGljZSwgYnV0IGFsc28gd29ya3Mgb24gdHlwZWQgYXJyYXlzXG5cdGFycmF5U2xpY2U6IGZ1bmN0aW9uICggYXJyYXksIGZyb20sIHRvICkge1xuXG5cdFx0aWYgKCBBbmltYXRpb25VdGlscy5pc1R5cGVkQXJyYXkoIGFycmF5ICkgKSB7XG5cblx0XHRcdC8vIGluIGlvczkgYXJyYXkuc3ViYXJyYXkoZnJvbSwgdW5kZWZpbmVkKSB3aWxsIHJldHVybiBlbXB0eSBhcnJheVxuXHRcdFx0Ly8gYnV0IGFycmF5LnN1YmFycmF5KGZyb20pIG9yIGFycmF5LnN1YmFycmF5KGZyb20sIGxlbikgaXMgY29ycmVjdFxuXHRcdFx0cmV0dXJuIG5ldyBhcnJheS5jb25zdHJ1Y3RvciggYXJyYXkuc3ViYXJyYXkoIGZyb20sIHRvICE9PSB1bmRlZmluZWQgPyB0byA6IGFycmF5Lmxlbmd0aCApICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gYXJyYXkuc2xpY2UoIGZyb20sIHRvICk7XG5cblx0fSxcblxuXHQvLyBjb252ZXJ0cyBhbiBhcnJheSB0byBhIHNwZWNpZmljIHR5cGVcblx0Y29udmVydEFycmF5OiBmdW5jdGlvbiAoIGFycmF5LCB0eXBlLCBmb3JjZUNsb25lICkge1xuXG5cdFx0aWYgKCAhIGFycmF5IHx8IC8vIGxldCAndW5kZWZpbmVkJyBhbmQgJ251bGwnIHBhc3Ncblx0XHRcdFx0ISBmb3JjZUNsb25lICYmIGFycmF5LmNvbnN0cnVjdG9yID09PSB0eXBlICkgcmV0dXJuIGFycmF5O1xuXG5cdFx0aWYgKCB0eXBlb2YgdHlwZS5CWVRFU19QRVJfRUxFTUVOVCA9PT0gJ251bWJlcicgKSB7XG5cblx0XHRcdHJldHVybiBuZXcgdHlwZSggYXJyYXkgKTsgLy8gY3JlYXRlIHR5cGVkIGFycmF5XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoIGFycmF5ICk7IC8vIGNyZWF0ZSBBcnJheVxuXG5cdH0sXG5cblx0aXNUeXBlZEFycmF5OiBmdW5jdGlvbiAoIG9iamVjdCApIHtcblxuXHRcdHJldHVybiBBcnJheUJ1ZmZlci5pc1ZpZXcoIG9iamVjdCApICYmXG5cdFx0XHRcdCEgKCBvYmplY3QgaW5zdGFuY2VvZiBEYXRhVmlldyApO1xuXG5cdH0sXG5cblx0Ly8gcmV0dXJucyBhbiBhcnJheSBieSB3aGljaCB0aW1lcyBhbmQgdmFsdWVzIGNhbiBiZSBzb3J0ZWRcblx0Z2V0S2V5ZnJhbWVPcmRlcjogZnVuY3Rpb24gKCB0aW1lcyApIHtcblxuXHRcdGZ1bmN0aW9uIGNvbXBhcmVUaW1lKCBpLCBqICkge1xuXG5cdFx0XHRyZXR1cm4gdGltZXNbIGkgXSAtIHRpbWVzWyBqIF07XG5cblx0XHR9XG5cblx0XHR2YXIgbiA9IHRpbWVzLmxlbmd0aDtcblx0XHR2YXIgcmVzdWx0ID0gbmV3IEFycmF5KCBuICk7XG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpICE9PSBuOyArKyBpICkgcmVzdWx0WyBpIF0gPSBpO1xuXG5cdFx0cmVzdWx0LnNvcnQoIGNvbXBhcmVUaW1lICk7XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXG5cdH0sXG5cblx0Ly8gdXNlcyB0aGUgYXJyYXkgcHJldmlvdXNseSByZXR1cm5lZCBieSAnZ2V0S2V5ZnJhbWVPcmRlcicgdG8gc29ydCBkYXRhXG5cdHNvcnRlZEFycmF5OiBmdW5jdGlvbiAoIHZhbHVlcywgc3RyaWRlLCBvcmRlciApIHtcblxuXHRcdHZhciBuVmFsdWVzID0gdmFsdWVzLmxlbmd0aDtcblx0XHR2YXIgcmVzdWx0ID0gbmV3IHZhbHVlcy5jb25zdHJ1Y3RvciggblZhbHVlcyApO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBkc3RPZmZzZXQgPSAwOyBkc3RPZmZzZXQgIT09IG5WYWx1ZXM7ICsrIGkgKSB7XG5cblx0XHRcdHZhciBzcmNPZmZzZXQgPSBvcmRlclsgaSBdICogc3RyaWRlO1xuXG5cdFx0XHRmb3IgKCB2YXIgaiA9IDA7IGogIT09IHN0cmlkZTsgKysgaiApIHtcblxuXHRcdFx0XHRyZXN1bHRbIGRzdE9mZnNldCArKyBdID0gdmFsdWVzWyBzcmNPZmZzZXQgKyBqIF07XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cblx0fSxcblxuXHQvLyBmdW5jdGlvbiBmb3IgcGFyc2luZyBBT1Mga2V5ZnJhbWUgZm9ybWF0c1xuXHRmbGF0dGVuSlNPTjogZnVuY3Rpb24gKCBqc29uS2V5cywgdGltZXMsIHZhbHVlcywgdmFsdWVQcm9wZXJ0eU5hbWUgKSB7XG5cblx0XHR2YXIgaSA9IDEsIGtleSA9IGpzb25LZXlzWyAwIF07XG5cblx0XHR3aGlsZSAoIGtleSAhPT0gdW5kZWZpbmVkICYmIGtleVsgdmFsdWVQcm9wZXJ0eU5hbWUgXSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRrZXkgPSBqc29uS2V5c1sgaSArKyBdO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBrZXkgPT09IHVuZGVmaW5lZCApIHJldHVybjsgLy8gbm8gZGF0YVxuXG5cdFx0dmFyIHZhbHVlID0ga2V5WyB2YWx1ZVByb3BlcnR5TmFtZSBdO1xuXHRcdGlmICggdmFsdWUgPT09IHVuZGVmaW5lZCApIHJldHVybjsgLy8gbm8gZGF0YVxuXG5cdFx0aWYgKCBBcnJheS5pc0FycmF5KCB2YWx1ZSApICkge1xuXG5cdFx0XHRkbyB7XG5cblx0XHRcdFx0dmFsdWUgPSBrZXlbIHZhbHVlUHJvcGVydHlOYW1lIF07XG5cblx0XHRcdFx0aWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0dGltZXMucHVzaCgga2V5LnRpbWUgKTtcblx0XHRcdFx0XHR2YWx1ZXMucHVzaC5hcHBseSggdmFsdWVzLCB2YWx1ZSApOyAvLyBwdXNoIGFsbCBlbGVtZW50c1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRrZXkgPSBqc29uS2V5c1sgaSArKyBdO1xuXG5cdFx0XHR9IHdoaWxlICgga2V5ICE9PSB1bmRlZmluZWQgKTtcblxuXHRcdH0gZWxzZSBpZiAoIHZhbHVlLnRvQXJyYXkgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Ly8gLi4uYXNzdW1lIFRIUkVFLk1hdGgtaXNoXG5cblx0XHRcdGRvIHtcblxuXHRcdFx0XHR2YWx1ZSA9IGtleVsgdmFsdWVQcm9wZXJ0eU5hbWUgXTtcblxuXHRcdFx0XHRpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHR0aW1lcy5wdXNoKCBrZXkudGltZSApO1xuXHRcdFx0XHRcdHZhbHVlLnRvQXJyYXkoIHZhbHVlcywgdmFsdWVzLmxlbmd0aCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRrZXkgPSBqc29uS2V5c1sgaSArKyBdO1xuXG5cdFx0XHR9IHdoaWxlICgga2V5ICE9PSB1bmRlZmluZWQgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIG90aGVyd2lzZSBwdXNoIGFzLWlzXG5cblx0XHRcdGRvIHtcblxuXHRcdFx0XHR2YWx1ZSA9IGtleVsgdmFsdWVQcm9wZXJ0eU5hbWUgXTtcblxuXHRcdFx0XHRpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHR0aW1lcy5wdXNoKCBrZXkudGltZSApO1xuXHRcdFx0XHRcdHZhbHVlcy5wdXNoKCB2YWx1ZSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRrZXkgPSBqc29uS2V5c1sgaSArKyBdO1xuXG5cdFx0XHR9IHdoaWxlICgga2V5ICE9PSB1bmRlZmluZWQgKTtcblxuXHRcdH1cblxuXHR9XG5cbn07XG5cbi8qKlxuICpcbiAqIEEgdGltZWQgc2VxdWVuY2Ugb2Yga2V5ZnJhbWVzIGZvciBhIHNwZWNpZmljIHByb3BlcnR5LlxuICpcbiAqXG4gKiBAYXV0aG9yIEJlbiBIb3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvL1xuICogQGF1dGhvciBEYXZpZCBTYXJubyAvIGh0dHA6Ly9saWdodGhhdXMudXMvXG4gKiBAYXV0aG9yIHRzY2h3XG4gKi9cblxuZnVuY3Rpb24gS2V5ZnJhbWVUcmFjayggbmFtZSwgdGltZXMsIHZhbHVlcywgaW50ZXJwb2xhdGlvbiApIHtcblxuXHRpZiAoIG5hbWUgPT09IHVuZGVmaW5lZCApIHRocm93IG5ldyBFcnJvciggJ1RIUkVFLktleWZyYW1lVHJhY2s6IHRyYWNrIG5hbWUgaXMgdW5kZWZpbmVkJyApO1xuXHRpZiAoIHRpbWVzID09PSB1bmRlZmluZWQgfHwgdGltZXMubGVuZ3RoID09PSAwICkgdGhyb3cgbmV3IEVycm9yKCAnVEhSRUUuS2V5ZnJhbWVUcmFjazogbm8ga2V5ZnJhbWVzIGluIHRyYWNrIG5hbWVkICcgKyBuYW1lICk7XG5cblx0dGhpcy5uYW1lID0gbmFtZTtcblxuXHR0aGlzLnRpbWVzID0gQW5pbWF0aW9uVXRpbHMuY29udmVydEFycmF5KCB0aW1lcywgdGhpcy5UaW1lQnVmZmVyVHlwZSApO1xuXHR0aGlzLnZhbHVlcyA9IEFuaW1hdGlvblV0aWxzLmNvbnZlcnRBcnJheSggdmFsdWVzLCB0aGlzLlZhbHVlQnVmZmVyVHlwZSApO1xuXG5cdHRoaXMuc2V0SW50ZXJwb2xhdGlvbiggaW50ZXJwb2xhdGlvbiB8fCB0aGlzLkRlZmF1bHRJbnRlcnBvbGF0aW9uICk7XG5cblx0dGhpcy52YWxpZGF0ZSgpO1xuXHR0aGlzLm9wdGltaXplKCk7XG5cbn1cblxuLy8gU3RhdGljIG1ldGhvZHM6XG5cbk9iamVjdC5hc3NpZ24oIEtleWZyYW1lVHJhY2ssIHtcblxuXHQvLyBTZXJpYWxpemF0aW9uIChpbiBzdGF0aWMgY29udGV4dCwgYmVjYXVzZSBvZiBjb25zdHJ1Y3RvciBpbnZvY2F0aW9uXG5cdC8vIGFuZCBhdXRvbWF0aWMgaW52b2NhdGlvbiBvZiAudG9KU09OKTpcblxuXHRwYXJzZTogZnVuY3Rpb24gKCBqc29uICkge1xuXG5cdFx0aWYgKCBqc29uLnR5cGUgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCAnVEhSRUUuS2V5ZnJhbWVUcmFjazogdHJhY2sgdHlwZSB1bmRlZmluZWQsIGNhbiBub3QgcGFyc2UnICk7XG5cblx0XHR9XG5cblx0XHR2YXIgdHJhY2tUeXBlID0gS2V5ZnJhbWVUcmFjay5fZ2V0VHJhY2tUeXBlRm9yVmFsdWVUeXBlTmFtZSgganNvbi50eXBlICk7XG5cblx0XHRpZiAoIGpzb24udGltZXMgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dmFyIHRpbWVzID0gW10sIHZhbHVlcyA9IFtdO1xuXG5cdFx0XHRBbmltYXRpb25VdGlscy5mbGF0dGVuSlNPTigganNvbi5rZXlzLCB0aW1lcywgdmFsdWVzLCAndmFsdWUnICk7XG5cblx0XHRcdGpzb24udGltZXMgPSB0aW1lcztcblx0XHRcdGpzb24udmFsdWVzID0gdmFsdWVzO1xuXG5cdFx0fVxuXG5cdFx0Ly8gZGVyaXZlZCBjbGFzc2VzIGNhbiBkZWZpbmUgYSBzdGF0aWMgcGFyc2UgbWV0aG9kXG5cdFx0aWYgKCB0cmFja1R5cGUucGFyc2UgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0cmV0dXJuIHRyYWNrVHlwZS5wYXJzZSgganNvbiApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gYnkgZGVmYXVsdCwgd2UgYXNzdW1lIGEgY29uc3RydWN0b3IgY29tcGF0aWJsZSB3aXRoIHRoZSBiYXNlXG5cdFx0XHRyZXR1cm4gbmV3IHRyYWNrVHlwZSgganNvbi5uYW1lLCBqc29uLnRpbWVzLCBqc29uLnZhbHVlcywganNvbi5pbnRlcnBvbGF0aW9uICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHR0b0pTT046IGZ1bmN0aW9uICggdHJhY2sgKSB7XG5cblx0XHR2YXIgdHJhY2tUeXBlID0gdHJhY2suY29uc3RydWN0b3I7XG5cblx0XHR2YXIganNvbjtcblxuXHRcdC8vIGRlcml2ZWQgY2xhc3NlcyBjYW4gZGVmaW5lIGEgc3RhdGljIHRvSlNPTiBtZXRob2Rcblx0XHRpZiAoIHRyYWNrVHlwZS50b0pTT04gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0anNvbiA9IHRyYWNrVHlwZS50b0pTT04oIHRyYWNrICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBieSBkZWZhdWx0LCB3ZSBhc3N1bWUgdGhlIGRhdGEgY2FuIGJlIHNlcmlhbGl6ZWQgYXMtaXNcblx0XHRcdGpzb24gPSB7XG5cblx0XHRcdFx0J25hbWUnOiB0cmFjay5uYW1lLFxuXHRcdFx0XHQndGltZXMnOiBBbmltYXRpb25VdGlscy5jb252ZXJ0QXJyYXkoIHRyYWNrLnRpbWVzLCBBcnJheSApLFxuXHRcdFx0XHQndmFsdWVzJzogQW5pbWF0aW9uVXRpbHMuY29udmVydEFycmF5KCB0cmFjay52YWx1ZXMsIEFycmF5IClcblxuXHRcdFx0fTtcblxuXHRcdFx0dmFyIGludGVycG9sYXRpb24gPSB0cmFjay5nZXRJbnRlcnBvbGF0aW9uKCk7XG5cblx0XHRcdGlmICggaW50ZXJwb2xhdGlvbiAhPT0gdHJhY2suRGVmYXVsdEludGVycG9sYXRpb24gKSB7XG5cblx0XHRcdFx0anNvbi5pbnRlcnBvbGF0aW9uID0gaW50ZXJwb2xhdGlvbjtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0anNvbi50eXBlID0gdHJhY2suVmFsdWVUeXBlTmFtZTsgLy8gbWFuZGF0b3J5XG5cblx0XHRyZXR1cm4ganNvbjtcblxuXHR9LFxuXG5cdF9nZXRUcmFja1R5cGVGb3JWYWx1ZVR5cGVOYW1lOiBmdW5jdGlvbiAoIHR5cGVOYW1lICkge1xuXG5cdFx0c3dpdGNoICggdHlwZU5hbWUudG9Mb3dlckNhc2UoKSApIHtcblxuXHRcdFx0Y2FzZSAnc2NhbGFyJzpcblx0XHRcdGNhc2UgJ2RvdWJsZSc6XG5cdFx0XHRjYXNlICdmbG9hdCc6XG5cdFx0XHRjYXNlICdudW1iZXInOlxuXHRcdFx0Y2FzZSAnaW50ZWdlcic6XG5cblx0XHRcdFx0cmV0dXJuIE51bWJlcktleWZyYW1lVHJhY2s7XG5cblx0XHRcdGNhc2UgJ3ZlY3Rvcic6XG5cdFx0XHRjYXNlICd2ZWN0b3IyJzpcblx0XHRcdGNhc2UgJ3ZlY3RvcjMnOlxuXHRcdFx0Y2FzZSAndmVjdG9yNCc6XG5cblx0XHRcdFx0cmV0dXJuIFZlY3RvcktleWZyYW1lVHJhY2s7XG5cblx0XHRcdGNhc2UgJ2NvbG9yJzpcblxuXHRcdFx0XHRyZXR1cm4gQ29sb3JLZXlmcmFtZVRyYWNrO1xuXG5cdFx0XHRjYXNlICdxdWF0ZXJuaW9uJzpcblxuXHRcdFx0XHRyZXR1cm4gUXVhdGVybmlvbktleWZyYW1lVHJhY2s7XG5cblx0XHRcdGNhc2UgJ2Jvb2wnOlxuXHRcdFx0Y2FzZSAnYm9vbGVhbic6XG5cblx0XHRcdFx0cmV0dXJuIEJvb2xlYW5LZXlmcmFtZVRyYWNrO1xuXG5cdFx0XHRjYXNlICdzdHJpbmcnOlxuXG5cdFx0XHRcdHJldHVybiBTdHJpbmdLZXlmcmFtZVRyYWNrO1xuXG5cdFx0fVxuXG5cdFx0dGhyb3cgbmV3IEVycm9yKCAnVEhSRUUuS2V5ZnJhbWVUcmFjazogVW5zdXBwb3J0ZWQgdHlwZU5hbWU6ICcgKyB0eXBlTmFtZSApO1xuXG5cdH1cblxufSApO1xuXG5PYmplY3QuYXNzaWduKCBLZXlmcmFtZVRyYWNrLnByb3RvdHlwZSwge1xuXG5cdGNvbnN0cnVjdG9yOiBLZXlmcmFtZVRyYWNrLFxuXG5cdFRpbWVCdWZmZXJUeXBlOiBGbG9hdDMyQXJyYXksXG5cblx0VmFsdWVCdWZmZXJUeXBlOiBGbG9hdDMyQXJyYXksXG5cblx0RGVmYXVsdEludGVycG9sYXRpb246IEludGVycG9sYXRlTGluZWFyLFxuXG5cdEludGVycG9sYW50RmFjdG9yeU1ldGhvZERpc2NyZXRlOiBmdW5jdGlvbiAoIHJlc3VsdCApIHtcblxuXHRcdHJldHVybiBuZXcgRGlzY3JldGVJbnRlcnBvbGFudCggdGhpcy50aW1lcywgdGhpcy52YWx1ZXMsIHRoaXMuZ2V0VmFsdWVTaXplKCksIHJlc3VsdCApO1xuXG5cdH0sXG5cblx0SW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kTGluZWFyOiBmdW5jdGlvbiAoIHJlc3VsdCApIHtcblxuXHRcdHJldHVybiBuZXcgTGluZWFySW50ZXJwb2xhbnQoIHRoaXMudGltZXMsIHRoaXMudmFsdWVzLCB0aGlzLmdldFZhbHVlU2l6ZSgpLCByZXN1bHQgKTtcblxuXHR9LFxuXG5cdEludGVycG9sYW50RmFjdG9yeU1ldGhvZFNtb290aDogZnVuY3Rpb24gKCByZXN1bHQgKSB7XG5cblx0XHRyZXR1cm4gbmV3IEN1YmljSW50ZXJwb2xhbnQoIHRoaXMudGltZXMsIHRoaXMudmFsdWVzLCB0aGlzLmdldFZhbHVlU2l6ZSgpLCByZXN1bHQgKTtcblxuXHR9LFxuXG5cdHNldEludGVycG9sYXRpb246IGZ1bmN0aW9uICggaW50ZXJwb2xhdGlvbiApIHtcblxuXHRcdHZhciBmYWN0b3J5TWV0aG9kO1xuXG5cdFx0c3dpdGNoICggaW50ZXJwb2xhdGlvbiApIHtcblxuXHRcdFx0Y2FzZSBJbnRlcnBvbGF0ZURpc2NyZXRlOlxuXG5cdFx0XHRcdGZhY3RvcnlNZXRob2QgPSB0aGlzLkludGVycG9sYW50RmFjdG9yeU1ldGhvZERpc2NyZXRlO1xuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIEludGVycG9sYXRlTGluZWFyOlxuXG5cdFx0XHRcdGZhY3RvcnlNZXRob2QgPSB0aGlzLkludGVycG9sYW50RmFjdG9yeU1ldGhvZExpbmVhcjtcblxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBJbnRlcnBvbGF0ZVNtb290aDpcblxuXHRcdFx0XHRmYWN0b3J5TWV0aG9kID0gdGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGg7XG5cblx0XHRcdFx0YnJlYWs7XG5cblx0XHR9XG5cblx0XHRpZiAoIGZhY3RvcnlNZXRob2QgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dmFyIG1lc3NhZ2UgPSBcInVuc3VwcG9ydGVkIGludGVycG9sYXRpb24gZm9yIFwiICtcblx0XHRcdFx0dGhpcy5WYWx1ZVR5cGVOYW1lICsgXCIga2V5ZnJhbWUgdHJhY2sgbmFtZWQgXCIgKyB0aGlzLm5hbWU7XG5cblx0XHRcdGlmICggdGhpcy5jcmVhdGVJbnRlcnBvbGFudCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdC8vIGZhbGwgYmFjayB0byBkZWZhdWx0LCB1bmxlc3MgdGhlIGRlZmF1bHQgaXRzZWxmIGlzIG1lc3NlZCB1cFxuXHRcdFx0XHRpZiAoIGludGVycG9sYXRpb24gIT09IHRoaXMuRGVmYXVsdEludGVycG9sYXRpb24gKSB7XG5cblx0XHRcdFx0XHR0aGlzLnNldEludGVycG9sYXRpb24oIHRoaXMuRGVmYXVsdEludGVycG9sYXRpb24gKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCBtZXNzYWdlICk7IC8vIGZhdGFsLCBpbiB0aGlzIGNhc2VcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuS2V5ZnJhbWVUcmFjazonLCBtZXNzYWdlICk7XG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHR0aGlzLmNyZWF0ZUludGVycG9sYW50ID0gZmFjdG9yeU1ldGhvZDtcblxuXHR9LFxuXG5cdGdldEludGVycG9sYXRpb246IGZ1bmN0aW9uICgpIHtcblxuXHRcdHN3aXRjaCAoIHRoaXMuY3JlYXRlSW50ZXJwb2xhbnQgKSB7XG5cblx0XHRcdGNhc2UgdGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2REaXNjcmV0ZTpcblxuXHRcdFx0XHRyZXR1cm4gSW50ZXJwb2xhdGVEaXNjcmV0ZTtcblxuXHRcdFx0Y2FzZSB0aGlzLkludGVycG9sYW50RmFjdG9yeU1ldGhvZExpbmVhcjpcblxuXHRcdFx0XHRyZXR1cm4gSW50ZXJwb2xhdGVMaW5lYXI7XG5cblx0XHRcdGNhc2UgdGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGg6XG5cblx0XHRcdFx0cmV0dXJuIEludGVycG9sYXRlU21vb3RoO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0Z2V0VmFsdWVTaXplOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy52YWx1ZXMubGVuZ3RoIC8gdGhpcy50aW1lcy5sZW5ndGg7XG5cblx0fSxcblxuXHQvLyBtb3ZlIGFsbCBrZXlmcmFtZXMgZWl0aGVyIGZvcndhcmRzIG9yIGJhY2t3YXJkcyBpbiB0aW1lXG5cdHNoaWZ0OiBmdW5jdGlvbiAoIHRpbWVPZmZzZXQgKSB7XG5cblx0XHRpZiAoIHRpbWVPZmZzZXQgIT09IDAuMCApIHtcblxuXHRcdFx0dmFyIHRpbWVzID0gdGhpcy50aW1lcztcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBuID0gdGltZXMubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHRcdHRpbWVzWyBpIF0gKz0gdGltZU9mZnNldDtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHQvLyBzY2FsZSBhbGwga2V5ZnJhbWUgdGltZXMgYnkgYSBmYWN0b3IgKHVzZWZ1bCBmb3IgZnJhbWUgPC0+IHNlY29uZHMgY29udmVyc2lvbnMpXG5cdHNjYWxlOiBmdW5jdGlvbiAoIHRpbWVTY2FsZSApIHtcblxuXHRcdGlmICggdGltZVNjYWxlICE9PSAxLjAgKSB7XG5cblx0XHRcdHZhciB0aW1lcyA9IHRoaXMudGltZXM7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgbiA9IHRpbWVzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0XHR0aW1lc1sgaSBdICo9IHRpbWVTY2FsZTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHQvLyByZW1vdmVzIGtleWZyYW1lcyBiZWZvcmUgYW5kIGFmdGVyIGFuaW1hdGlvbiB3aXRob3V0IGNoYW5naW5nIGFueSB2YWx1ZXMgd2l0aGluIHRoZSByYW5nZSBbc3RhcnRUaW1lLCBlbmRUaW1lXS5cblx0Ly8gSU1QT1JUQU5UOiBXZSBkbyBub3Qgc2hpZnQgYXJvdW5kIGtleXMgdG8gdGhlIHN0YXJ0IG9mIHRoZSB0cmFjayB0aW1lLCBiZWNhdXNlIGZvciBpbnRlcnBvbGF0ZWQga2V5cyB0aGlzIHdpbGwgY2hhbmdlIHRoZWlyIHZhbHVlc1xuXHR0cmltOiBmdW5jdGlvbiAoIHN0YXJ0VGltZSwgZW5kVGltZSApIHtcblxuXHRcdHZhciB0aW1lcyA9IHRoaXMudGltZXMsXG5cdFx0XHRuS2V5cyA9IHRpbWVzLmxlbmd0aCxcblx0XHRcdGZyb20gPSAwLFxuXHRcdFx0dG8gPSBuS2V5cyAtIDE7XG5cblx0XHR3aGlsZSAoIGZyb20gIT09IG5LZXlzICYmIHRpbWVzWyBmcm9tIF0gPCBzdGFydFRpbWUgKSB7XG5cblx0XHRcdCsrIGZyb207XG5cblx0XHR9XG5cblx0XHR3aGlsZSAoIHRvICE9PSAtIDEgJiYgdGltZXNbIHRvIF0gPiBlbmRUaW1lICkge1xuXG5cdFx0XHQtLSB0bztcblxuXHRcdH1cblxuXHRcdCsrIHRvOyAvLyBpbmNsdXNpdmUgLT4gZXhjbHVzaXZlIGJvdW5kXG5cblx0XHRpZiAoIGZyb20gIT09IDAgfHwgdG8gIT09IG5LZXlzICkge1xuXG5cdFx0XHQvLyBlbXB0eSB0cmFja3MgYXJlIGZvcmJpZGRlbiwgc28ga2VlcCBhdCBsZWFzdCBvbmUga2V5ZnJhbWVcblx0XHRcdGlmICggZnJvbSA+PSB0byApIHRvID0gTWF0aC5tYXgoIHRvLCAxICksIGZyb20gPSB0byAtIDE7XG5cblx0XHRcdHZhciBzdHJpZGUgPSB0aGlzLmdldFZhbHVlU2l6ZSgpO1xuXHRcdFx0dGhpcy50aW1lcyA9IEFuaW1hdGlvblV0aWxzLmFycmF5U2xpY2UoIHRpbWVzLCBmcm9tLCB0byApO1xuXHRcdFx0dGhpcy52YWx1ZXMgPSBBbmltYXRpb25VdGlscy5hcnJheVNsaWNlKCB0aGlzLnZhbHVlcywgZnJvbSAqIHN0cmlkZSwgdG8gKiBzdHJpZGUgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Ly8gZW5zdXJlIHdlIGRvIG5vdCBnZXQgYSBHYXJiYWdlSW5HYXJiYWdlT3V0IHNpdHVhdGlvbiwgbWFrZSBzdXJlIHRyYWNrcyBhcmUgYXQgbGVhc3QgbWluaW1hbGx5IHZpYWJsZVxuXHR2YWxpZGF0ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHZhbGlkID0gdHJ1ZTtcblxuXHRcdHZhciB2YWx1ZVNpemUgPSB0aGlzLmdldFZhbHVlU2l6ZSgpO1xuXHRcdGlmICggdmFsdWVTaXplIC0gTWF0aC5mbG9vciggdmFsdWVTaXplICkgIT09IDAgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5LZXlmcmFtZVRyYWNrOiBJbnZhbGlkIHZhbHVlIHNpemUgaW4gdHJhY2suJywgdGhpcyApO1xuXHRcdFx0dmFsaWQgPSBmYWxzZTtcblxuXHRcdH1cblxuXHRcdHZhciB0aW1lcyA9IHRoaXMudGltZXMsXG5cdFx0XHR2YWx1ZXMgPSB0aGlzLnZhbHVlcyxcblxuXHRcdFx0bktleXMgPSB0aW1lcy5sZW5ndGg7XG5cblx0XHRpZiAoIG5LZXlzID09PSAwICkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuS2V5ZnJhbWVUcmFjazogVHJhY2sgaXMgZW1wdHkuJywgdGhpcyApO1xuXHRcdFx0dmFsaWQgPSBmYWxzZTtcblxuXHRcdH1cblxuXHRcdHZhciBwcmV2VGltZSA9IG51bGw7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgIT09IG5LZXlzOyBpICsrICkge1xuXG5cdFx0XHR2YXIgY3VyclRpbWUgPSB0aW1lc1sgaSBdO1xuXG5cdFx0XHRpZiAoIHR5cGVvZiBjdXJyVGltZSA9PT0gJ251bWJlcicgJiYgaXNOYU4oIGN1cnJUaW1lICkgKSB7XG5cblx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLktleWZyYW1lVHJhY2s6IFRpbWUgaXMgbm90IGEgdmFsaWQgbnVtYmVyLicsIHRoaXMsIGksIGN1cnJUaW1lICk7XG5cdFx0XHRcdHZhbGlkID0gZmFsc2U7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggcHJldlRpbWUgIT09IG51bGwgJiYgcHJldlRpbWUgPiBjdXJyVGltZSApIHtcblxuXHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuS2V5ZnJhbWVUcmFjazogT3V0IG9mIG9yZGVyIGtleXMuJywgdGhpcywgaSwgY3VyclRpbWUsIHByZXZUaW1lICk7XG5cdFx0XHRcdHZhbGlkID0gZmFsc2U7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHR9XG5cblx0XHRcdHByZXZUaW1lID0gY3VyclRpbWU7XG5cblx0XHR9XG5cblx0XHRpZiAoIHZhbHVlcyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRpZiAoIEFuaW1hdGlvblV0aWxzLmlzVHlwZWRBcnJheSggdmFsdWVzICkgKSB7XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBuID0gdmFsdWVzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0XHRcdHZhciB2YWx1ZSA9IHZhbHVlc1sgaSBdO1xuXG5cdFx0XHRcdFx0aWYgKCBpc05hTiggdmFsdWUgKSApIHtcblxuXHRcdFx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLktleWZyYW1lVHJhY2s6IFZhbHVlIGlzIG5vdCBhIHZhbGlkIG51bWJlci4nLCB0aGlzLCBpLCB2YWx1ZSApO1xuXHRcdFx0XHRcdFx0dmFsaWQgPSBmYWxzZTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHZhbGlkO1xuXG5cdH0sXG5cblx0Ly8gcmVtb3ZlcyBlcXVpdmFsZW50IHNlcXVlbnRpYWwga2V5cyBhcyBjb21tb24gaW4gbW9ycGggdGFyZ2V0IHNlcXVlbmNlc1xuXHQvLyAoMCwwLDAsMCwxLDEsMSwwLDAsMCwwLDAsMCwwKSAtLT4gKDAsMCwxLDEsMCwwKVxuXHRvcHRpbWl6ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHRpbWVzID0gdGhpcy50aW1lcyxcblx0XHRcdHZhbHVlcyA9IHRoaXMudmFsdWVzLFxuXHRcdFx0c3RyaWRlID0gdGhpcy5nZXRWYWx1ZVNpemUoKSxcblxuXHRcdFx0c21vb3RoSW50ZXJwb2xhdGlvbiA9IHRoaXMuZ2V0SW50ZXJwb2xhdGlvbigpID09PSBJbnRlcnBvbGF0ZVNtb290aCxcblxuXHRcdFx0d3JpdGVJbmRleCA9IDEsXG5cdFx0XHRsYXN0SW5kZXggPSB0aW1lcy5sZW5ndGggLSAxO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAxOyBpIDwgbGFzdEluZGV4OyArKyBpICkge1xuXG5cdFx0XHR2YXIga2VlcCA9IGZhbHNlO1xuXG5cdFx0XHR2YXIgdGltZSA9IHRpbWVzWyBpIF07XG5cdFx0XHR2YXIgdGltZU5leHQgPSB0aW1lc1sgaSArIDEgXTtcblxuXHRcdFx0Ly8gcmVtb3ZlIGFkamFjZW50IGtleWZyYW1lcyBzY2hlZHVsZWQgYXQgdGhlIHNhbWUgdGltZVxuXG5cdFx0XHRpZiAoIHRpbWUgIT09IHRpbWVOZXh0ICYmICggaSAhPT0gMSB8fCB0aW1lICE9PSB0aW1lWyAwIF0gKSApIHtcblxuXHRcdFx0XHRpZiAoICEgc21vb3RoSW50ZXJwb2xhdGlvbiApIHtcblxuXHRcdFx0XHRcdC8vIHJlbW92ZSB1bm5lY2Vzc2FyeSBrZXlmcmFtZXMgc2FtZSBhcyB0aGVpciBuZWlnaGJvcnNcblxuXHRcdFx0XHRcdHZhciBvZmZzZXQgPSBpICogc3RyaWRlLFxuXHRcdFx0XHRcdFx0b2Zmc2V0UCA9IG9mZnNldCAtIHN0cmlkZSxcblx0XHRcdFx0XHRcdG9mZnNldE4gPSBvZmZzZXQgKyBzdHJpZGU7XG5cblx0XHRcdFx0XHRmb3IgKCB2YXIgaiA9IDA7IGogIT09IHN0cmlkZTsgKysgaiApIHtcblxuXHRcdFx0XHRcdFx0dmFyIHZhbHVlID0gdmFsdWVzWyBvZmZzZXQgKyBqIF07XG5cblx0XHRcdFx0XHRcdGlmICggdmFsdWUgIT09IHZhbHVlc1sgb2Zmc2V0UCArIGogXSB8fFxuXHRcdFx0XHRcdFx0XHR2YWx1ZSAhPT0gdmFsdWVzWyBvZmZzZXROICsgaiBdICkge1xuXG5cdFx0XHRcdFx0XHRcdGtlZXAgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRrZWVwID0gdHJ1ZTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gaW4tcGxhY2UgY29tcGFjdGlvblxuXG5cdFx0XHRpZiAoIGtlZXAgKSB7XG5cblx0XHRcdFx0aWYgKCBpICE9PSB3cml0ZUluZGV4ICkge1xuXG5cdFx0XHRcdFx0dGltZXNbIHdyaXRlSW5kZXggXSA9IHRpbWVzWyBpIF07XG5cblx0XHRcdFx0XHR2YXIgcmVhZE9mZnNldCA9IGkgKiBzdHJpZGUsXG5cdFx0XHRcdFx0XHR3cml0ZU9mZnNldCA9IHdyaXRlSW5kZXggKiBzdHJpZGU7XG5cblx0XHRcdFx0XHRmb3IgKCB2YXIgaiA9IDA7IGogIT09IHN0cmlkZTsgKysgaiApIHtcblxuXHRcdFx0XHRcdFx0dmFsdWVzWyB3cml0ZU9mZnNldCArIGogXSA9IHZhbHVlc1sgcmVhZE9mZnNldCArIGogXTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Kysgd3JpdGVJbmRleDtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gZmx1c2ggbGFzdCBrZXlmcmFtZSAoY29tcGFjdGlvbiBsb29rcyBhaGVhZClcblxuXHRcdGlmICggbGFzdEluZGV4ID4gMCApIHtcblxuXHRcdFx0dGltZXNbIHdyaXRlSW5kZXggXSA9IHRpbWVzWyBsYXN0SW5kZXggXTtcblxuXHRcdFx0Zm9yICggdmFyIHJlYWRPZmZzZXQgPSBsYXN0SW5kZXggKiBzdHJpZGUsIHdyaXRlT2Zmc2V0ID0gd3JpdGVJbmRleCAqIHN0cmlkZSwgaiA9IDA7IGogIT09IHN0cmlkZTsgKysgaiApIHtcblxuXHRcdFx0XHR2YWx1ZXNbIHdyaXRlT2Zmc2V0ICsgaiBdID0gdmFsdWVzWyByZWFkT2Zmc2V0ICsgaiBdO1xuXG5cdFx0XHR9XG5cblx0XHRcdCsrIHdyaXRlSW5kZXg7XG5cblx0XHR9XG5cblx0XHRpZiAoIHdyaXRlSW5kZXggIT09IHRpbWVzLmxlbmd0aCApIHtcblxuXHRcdFx0dGhpcy50aW1lcyA9IEFuaW1hdGlvblV0aWxzLmFycmF5U2xpY2UoIHRpbWVzLCAwLCB3cml0ZUluZGV4ICk7XG5cdFx0XHR0aGlzLnZhbHVlcyA9IEFuaW1hdGlvblV0aWxzLmFycmF5U2xpY2UoIHZhbHVlcywgMCwgd3JpdGVJbmRleCAqIHN0cmlkZSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICpcbiAqIEEgVHJhY2sgb2YgdmVjdG9yZWQga2V5ZnJhbWUgdmFsdWVzLlxuICpcbiAqXG4gKiBAYXV0aG9yIEJlbiBIb3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvL1xuICogQGF1dGhvciBEYXZpZCBTYXJubyAvIGh0dHA6Ly9saWdodGhhdXMudXMvXG4gKiBAYXV0aG9yIHRzY2h3XG4gKi9cblxuZnVuY3Rpb24gVmVjdG9yS2V5ZnJhbWVUcmFjayggbmFtZSwgdGltZXMsIHZhbHVlcywgaW50ZXJwb2xhdGlvbiApIHtcblxuXHRLZXlmcmFtZVRyYWNrLmNhbGwoIHRoaXMsIG5hbWUsIHRpbWVzLCB2YWx1ZXMsIGludGVycG9sYXRpb24gKTtcblxufVxuXG5WZWN0b3JLZXlmcmFtZVRyYWNrLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEtleWZyYW1lVHJhY2sucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogVmVjdG9yS2V5ZnJhbWVUcmFjayxcblxuXHRWYWx1ZVR5cGVOYW1lOiAndmVjdG9yJ1xuXG5cdC8vIFZhbHVlQnVmZmVyVHlwZSBpcyBpbmhlcml0ZWRcblxuXHQvLyBEZWZhdWx0SW50ZXJwb2xhdGlvbiBpcyBpbmhlcml0ZWRcblxufSApO1xuXG4vKipcbiAqXG4gKiBSZXVzYWJsZSBzZXQgb2YgVHJhY2tzIHRoYXQgcmVwcmVzZW50IGFuIGFuaW1hdGlvbi5cbiAqXG4gKiBAYXV0aG9yIEJlbiBIb3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvL1xuICogQGF1dGhvciBEYXZpZCBTYXJubyAvIGh0dHA6Ly9saWdodGhhdXMudXMvXG4gKi9cblxuZnVuY3Rpb24gQW5pbWF0aW9uQ2xpcCggbmFtZSwgZHVyYXRpb24sIHRyYWNrcyApIHtcblxuXHR0aGlzLm5hbWUgPSBuYW1lO1xuXHR0aGlzLnRyYWNrcyA9IHRyYWNrcztcblx0dGhpcy5kdXJhdGlvbiA9ICggZHVyYXRpb24gIT09IHVuZGVmaW5lZCApID8gZHVyYXRpb24gOiAtIDE7XG5cblx0dGhpcy51dWlkID0gX01hdGguZ2VuZXJhdGVVVUlEKCk7XG5cblx0Ly8gdGhpcyBtZWFucyBpdCBzaG91bGQgZmlndXJlIG91dCBpdHMgZHVyYXRpb24gYnkgc2Nhbm5pbmcgdGhlIHRyYWNrc1xuXHRpZiAoIHRoaXMuZHVyYXRpb24gPCAwICkge1xuXG5cdFx0dGhpcy5yZXNldER1cmF0aW9uKCk7XG5cblx0fVxuXG5cdHRoaXMub3B0aW1pemUoKTtcblxufVxuXG5PYmplY3QuYXNzaWduKCBBbmltYXRpb25DbGlwLCB7XG5cblx0cGFyc2U6IGZ1bmN0aW9uICgganNvbiApIHtcblxuXHRcdHZhciB0cmFja3MgPSBbXSxcblx0XHRcdGpzb25UcmFja3MgPSBqc29uLnRyYWNrcyxcblx0XHRcdGZyYW1lVGltZSA9IDEuMCAvICgganNvbi5mcHMgfHwgMS4wICk7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIG4gPSBqc29uVHJhY2tzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0dHJhY2tzLnB1c2goIEtleWZyYW1lVHJhY2sucGFyc2UoIGpzb25UcmFja3NbIGkgXSApLnNjYWxlKCBmcmFtZVRpbWUgKSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIG5ldyBBbmltYXRpb25DbGlwKCBqc29uLm5hbWUsIGpzb24uZHVyYXRpb24sIHRyYWNrcyApO1xuXG5cdH0sXG5cblx0dG9KU09OOiBmdW5jdGlvbiAoIGNsaXAgKSB7XG5cblx0XHR2YXIgdHJhY2tzID0gW10sXG5cdFx0XHRjbGlwVHJhY2tzID0gY2xpcC50cmFja3M7XG5cblx0XHR2YXIganNvbiA9IHtcblxuXHRcdFx0J25hbWUnOiBjbGlwLm5hbWUsXG5cdFx0XHQnZHVyYXRpb24nOiBjbGlwLmR1cmF0aW9uLFxuXHRcdFx0J3RyYWNrcyc6IHRyYWNrc1xuXG5cdFx0fTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbiA9IGNsaXBUcmFja3MubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHR0cmFja3MucHVzaCggS2V5ZnJhbWVUcmFjay50b0pTT04oIGNsaXBUcmFja3NbIGkgXSApICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4ganNvbjtcblxuXHR9LFxuXG5cdENyZWF0ZUZyb21Nb3JwaFRhcmdldFNlcXVlbmNlOiBmdW5jdGlvbiAoIG5hbWUsIG1vcnBoVGFyZ2V0U2VxdWVuY2UsIGZwcywgbm9Mb29wICkge1xuXG5cdFx0dmFyIG51bU1vcnBoVGFyZ2V0cyA9IG1vcnBoVGFyZ2V0U2VxdWVuY2UubGVuZ3RoO1xuXHRcdHZhciB0cmFja3MgPSBbXTtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IG51bU1vcnBoVGFyZ2V0czsgaSArKyApIHtcblxuXHRcdFx0dmFyIHRpbWVzID0gW107XG5cdFx0XHR2YXIgdmFsdWVzID0gW107XG5cblx0XHRcdHRpbWVzLnB1c2goXG5cdFx0XHRcdCggaSArIG51bU1vcnBoVGFyZ2V0cyAtIDEgKSAlIG51bU1vcnBoVGFyZ2V0cyxcblx0XHRcdFx0aSxcblx0XHRcdFx0KCBpICsgMSApICUgbnVtTW9ycGhUYXJnZXRzICk7XG5cblx0XHRcdHZhbHVlcy5wdXNoKCAwLCAxLCAwICk7XG5cblx0XHRcdHZhciBvcmRlciA9IEFuaW1hdGlvblV0aWxzLmdldEtleWZyYW1lT3JkZXIoIHRpbWVzICk7XG5cdFx0XHR0aW1lcyA9IEFuaW1hdGlvblV0aWxzLnNvcnRlZEFycmF5KCB0aW1lcywgMSwgb3JkZXIgKTtcblx0XHRcdHZhbHVlcyA9IEFuaW1hdGlvblV0aWxzLnNvcnRlZEFycmF5KCB2YWx1ZXMsIDEsIG9yZGVyICk7XG5cblx0XHRcdC8vIGlmIHRoZXJlIGlzIGEga2V5IGF0IHRoZSBmaXJzdCBmcmFtZSwgZHVwbGljYXRlIGl0IGFzIHRoZVxuXHRcdFx0Ly8gbGFzdCBmcmFtZSBhcyB3ZWxsIGZvciBwZXJmZWN0IGxvb3AuXG5cdFx0XHRpZiAoICEgbm9Mb29wICYmIHRpbWVzWyAwIF0gPT09IDAgKSB7XG5cblx0XHRcdFx0dGltZXMucHVzaCggbnVtTW9ycGhUYXJnZXRzICk7XG5cdFx0XHRcdHZhbHVlcy5wdXNoKCB2YWx1ZXNbIDAgXSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHRyYWNrcy5wdXNoKFxuXHRcdFx0XHRuZXcgTnVtYmVyS2V5ZnJhbWVUcmFjayhcblx0XHRcdFx0XHQnLm1vcnBoVGFyZ2V0SW5mbHVlbmNlc1snICsgbW9ycGhUYXJnZXRTZXF1ZW5jZVsgaSBdLm5hbWUgKyAnXScsXG5cdFx0XHRcdFx0dGltZXMsIHZhbHVlc1xuXHRcdFx0XHQpLnNjYWxlKCAxLjAgLyBmcHMgKSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIG5ldyBBbmltYXRpb25DbGlwKCBuYW1lLCAtIDEsIHRyYWNrcyApO1xuXG5cdH0sXG5cblx0ZmluZEJ5TmFtZTogZnVuY3Rpb24gKCBvYmplY3RPckNsaXBBcnJheSwgbmFtZSApIHtcblxuXHRcdHZhciBjbGlwQXJyYXkgPSBvYmplY3RPckNsaXBBcnJheTtcblxuXHRcdGlmICggISBBcnJheS5pc0FycmF5KCBvYmplY3RPckNsaXBBcnJheSApICkge1xuXG5cdFx0XHR2YXIgbyA9IG9iamVjdE9yQ2xpcEFycmF5O1xuXHRcdFx0Y2xpcEFycmF5ID0gby5nZW9tZXRyeSAmJiBvLmdlb21ldHJ5LmFuaW1hdGlvbnMgfHwgby5hbmltYXRpb25zO1xuXG5cdFx0fVxuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgY2xpcEFycmF5Lmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0aWYgKCBjbGlwQXJyYXlbIGkgXS5uYW1lID09PSBuYW1lICkge1xuXG5cdFx0XHRcdHJldHVybiBjbGlwQXJyYXlbIGkgXTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIG51bGw7XG5cblx0fSxcblxuXHRDcmVhdGVDbGlwc0Zyb21Nb3JwaFRhcmdldFNlcXVlbmNlczogZnVuY3Rpb24gKCBtb3JwaFRhcmdldHMsIGZwcywgbm9Mb29wICkge1xuXG5cdFx0dmFyIGFuaW1hdGlvblRvTW9ycGhUYXJnZXRzID0ge307XG5cblx0XHQvLyB0ZXN0ZWQgd2l0aCBodHRwczovL3JlZ2V4MTAxLmNvbS8gb24gdHJpY2sgc2VxdWVuY2VzXG5cdFx0Ly8gc3VjaCBmbGFtaW5nb19mbHlBXzAwMywgZmxhbWluZ29fcnVuMV8wMDMsIGNyZGVhdGgwMDU5XG5cdFx0dmFyIHBhdHRlcm4gPSAvXihbXFx3LV0qPykoW1xcZF0rKSQvO1xuXG5cdFx0Ly8gc29ydCBtb3JwaCB0YXJnZXQgbmFtZXMgaW50byBhbmltYXRpb24gZ3JvdXBzIGJhc2VkXG5cdFx0Ly8gcGF0dGVybnMgbGlrZSBXYWxrXzAwMSwgV2Fsa18wMDIsIFJ1bl8wMDEsIFJ1bl8wMDJcblx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gbW9ycGhUYXJnZXRzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgbW9ycGhUYXJnZXQgPSBtb3JwaFRhcmdldHNbIGkgXTtcblx0XHRcdHZhciBwYXJ0cyA9IG1vcnBoVGFyZ2V0Lm5hbWUubWF0Y2goIHBhdHRlcm4gKTtcblxuXHRcdFx0aWYgKCBwYXJ0cyAmJiBwYXJ0cy5sZW5ndGggPiAxICkge1xuXG5cdFx0XHRcdHZhciBuYW1lID0gcGFydHNbIDEgXTtcblxuXHRcdFx0XHR2YXIgYW5pbWF0aW9uTW9ycGhUYXJnZXRzID0gYW5pbWF0aW9uVG9Nb3JwaFRhcmdldHNbIG5hbWUgXTtcblx0XHRcdFx0aWYgKCAhIGFuaW1hdGlvbk1vcnBoVGFyZ2V0cyApIHtcblxuXHRcdFx0XHRcdGFuaW1hdGlvblRvTW9ycGhUYXJnZXRzWyBuYW1lIF0gPSBhbmltYXRpb25Nb3JwaFRhcmdldHMgPSBbXTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0YW5pbWF0aW9uTW9ycGhUYXJnZXRzLnB1c2goIG1vcnBoVGFyZ2V0ICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHZhciBjbGlwcyA9IFtdO1xuXG5cdFx0Zm9yICggdmFyIG5hbWUgaW4gYW5pbWF0aW9uVG9Nb3JwaFRhcmdldHMgKSB7XG5cblx0XHRcdGNsaXBzLnB1c2goIEFuaW1hdGlvbkNsaXAuQ3JlYXRlRnJvbU1vcnBoVGFyZ2V0U2VxdWVuY2UoIG5hbWUsIGFuaW1hdGlvblRvTW9ycGhUYXJnZXRzWyBuYW1lIF0sIGZwcywgbm9Mb29wICkgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBjbGlwcztcblxuXHR9LFxuXG5cdC8vIHBhcnNlIHRoZSBhbmltYXRpb24uaGllcmFyY2h5IGZvcm1hdFxuXHRwYXJzZUFuaW1hdGlvbjogZnVuY3Rpb24gKCBhbmltYXRpb24sIGJvbmVzICkge1xuXG5cdFx0aWYgKCAhIGFuaW1hdGlvbiApIHtcblxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLkFuaW1hdGlvbkNsaXA6IE5vIGFuaW1hdGlvbiBpbiBKU09OTG9hZGVyIGRhdGEuJyApO1xuXHRcdFx0cmV0dXJuIG51bGw7XG5cblx0XHR9XG5cblx0XHR2YXIgYWRkTm9uZW1wdHlUcmFjayA9IGZ1bmN0aW9uICggdHJhY2tUeXBlLCB0cmFja05hbWUsIGFuaW1hdGlvbktleXMsIHByb3BlcnR5TmFtZSwgZGVzdFRyYWNrcyApIHtcblxuXHRcdFx0Ly8gb25seSByZXR1cm4gdHJhY2sgaWYgdGhlcmUgYXJlIGFjdHVhbGx5IGtleXMuXG5cdFx0XHRpZiAoIGFuaW1hdGlvbktleXMubGVuZ3RoICE9PSAwICkge1xuXG5cdFx0XHRcdHZhciB0aW1lcyA9IFtdO1xuXHRcdFx0XHR2YXIgdmFsdWVzID0gW107XG5cblx0XHRcdFx0QW5pbWF0aW9uVXRpbHMuZmxhdHRlbkpTT04oIGFuaW1hdGlvbktleXMsIHRpbWVzLCB2YWx1ZXMsIHByb3BlcnR5TmFtZSApO1xuXG5cdFx0XHRcdC8vIGVtcHR5IGtleXMgYXJlIGZpbHRlcmVkIG91dCwgc28gY2hlY2sgYWdhaW5cblx0XHRcdFx0aWYgKCB0aW1lcy5sZW5ndGggIT09IDAgKSB7XG5cblx0XHRcdFx0XHRkZXN0VHJhY2tzLnB1c2goIG5ldyB0cmFja1R5cGUoIHRyYWNrTmFtZSwgdGltZXMsIHZhbHVlcyApICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9O1xuXG5cdFx0dmFyIHRyYWNrcyA9IFtdO1xuXG5cdFx0dmFyIGNsaXBOYW1lID0gYW5pbWF0aW9uLm5hbWUgfHwgJ2RlZmF1bHQnO1xuXHRcdC8vIGF1dG9tYXRpYyBsZW5ndGggZGV0ZXJtaW5hdGlvbiBpbiBBbmltYXRpb25DbGlwLlxuXHRcdHZhciBkdXJhdGlvbiA9IGFuaW1hdGlvbi5sZW5ndGggfHwgLSAxO1xuXHRcdHZhciBmcHMgPSBhbmltYXRpb24uZnBzIHx8IDMwO1xuXG5cdFx0dmFyIGhpZXJhcmNoeVRyYWNrcyA9IGFuaW1hdGlvbi5oaWVyYXJjaHkgfHwgW107XG5cblx0XHRmb3IgKCB2YXIgaCA9IDA7IGggPCBoaWVyYXJjaHlUcmFja3MubGVuZ3RoOyBoICsrICkge1xuXG5cdFx0XHR2YXIgYW5pbWF0aW9uS2V5cyA9IGhpZXJhcmNoeVRyYWNrc1sgaCBdLmtleXM7XG5cblx0XHRcdC8vIHNraXAgZW1wdHkgdHJhY2tzXG5cdFx0XHRpZiAoICEgYW5pbWF0aW9uS2V5cyB8fCBhbmltYXRpb25LZXlzLmxlbmd0aCA9PT0gMCApIGNvbnRpbnVlO1xuXG5cdFx0XHQvLyBwcm9jZXNzIG1vcnBoIHRhcmdldHNcblx0XHRcdGlmICggYW5pbWF0aW9uS2V5c1sgMCBdLm1vcnBoVGFyZ2V0cyApIHtcblxuXHRcdFx0XHQvLyBmaWd1cmUgb3V0IGFsbCBtb3JwaCB0YXJnZXRzIHVzZWQgaW4gdGhpcyB0cmFja1xuXHRcdFx0XHR2YXIgbW9ycGhUYXJnZXROYW1lcyA9IHt9O1xuXG5cdFx0XHRcdGZvciAoIHZhciBrID0gMDsgayA8IGFuaW1hdGlvbktleXMubGVuZ3RoOyBrICsrICkge1xuXG5cdFx0XHRcdFx0aWYgKCBhbmltYXRpb25LZXlzWyBrIF0ubW9ycGhUYXJnZXRzICkge1xuXG5cdFx0XHRcdFx0XHRmb3IgKCB2YXIgbSA9IDA7IG0gPCBhbmltYXRpb25LZXlzWyBrIF0ubW9ycGhUYXJnZXRzLmxlbmd0aDsgbSArKyApIHtcblxuXHRcdFx0XHRcdFx0XHRtb3JwaFRhcmdldE5hbWVzWyBhbmltYXRpb25LZXlzWyBrIF0ubW9ycGhUYXJnZXRzWyBtIF0gXSA9IC0gMTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBjcmVhdGUgYSB0cmFjayBmb3IgZWFjaCBtb3JwaCB0YXJnZXQgd2l0aCBhbGwgemVyb1xuXHRcdFx0XHQvLyBtb3JwaFRhcmdldEluZmx1ZW5jZXMgZXhjZXB0IGZvciB0aGUga2V5cyBpbiB3aGljaFxuXHRcdFx0XHQvLyB0aGUgbW9ycGhUYXJnZXQgaXMgbmFtZWQuXG5cdFx0XHRcdGZvciAoIHZhciBtb3JwaFRhcmdldE5hbWUgaW4gbW9ycGhUYXJnZXROYW1lcyApIHtcblxuXHRcdFx0XHRcdHZhciB0aW1lcyA9IFtdO1xuXHRcdFx0XHRcdHZhciB2YWx1ZXMgPSBbXTtcblxuXHRcdFx0XHRcdGZvciAoIHZhciBtID0gMDsgbSAhPT0gYW5pbWF0aW9uS2V5c1sgayBdLm1vcnBoVGFyZ2V0cy5sZW5ndGg7ICsrIG0gKSB7XG5cblx0XHRcdFx0XHRcdHZhciBhbmltYXRpb25LZXkgPSBhbmltYXRpb25LZXlzWyBrIF07XG5cblx0XHRcdFx0XHRcdHRpbWVzLnB1c2goIGFuaW1hdGlvbktleS50aW1lICk7XG5cdFx0XHRcdFx0XHR2YWx1ZXMucHVzaCggKCBhbmltYXRpb25LZXkubW9ycGhUYXJnZXQgPT09IG1vcnBoVGFyZ2V0TmFtZSApID8gMSA6IDAgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHRyYWNrcy5wdXNoKCBuZXcgTnVtYmVyS2V5ZnJhbWVUcmFjayggJy5tb3JwaFRhcmdldEluZmx1ZW5jZVsnICsgbW9ycGhUYXJnZXROYW1lICsgJ10nLCB0aW1lcywgdmFsdWVzICkgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0ZHVyYXRpb24gPSBtb3JwaFRhcmdldE5hbWVzLmxlbmd0aCAqICggZnBzIHx8IDEuMCApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdC8vIC4uLmFzc3VtZSBza2VsZXRhbCBhbmltYXRpb25cblxuXHRcdFx0XHR2YXIgYm9uZU5hbWUgPSAnLmJvbmVzWycgKyBib25lc1sgaCBdLm5hbWUgKyAnXSc7XG5cblx0XHRcdFx0YWRkTm9uZW1wdHlUcmFjayhcblx0XHRcdFx0XHRWZWN0b3JLZXlmcmFtZVRyYWNrLCBib25lTmFtZSArICcucG9zaXRpb24nLFxuXHRcdFx0XHRcdGFuaW1hdGlvbktleXMsICdwb3MnLCB0cmFja3MgKTtcblxuXHRcdFx0XHRhZGROb25lbXB0eVRyYWNrKFxuXHRcdFx0XHRcdFF1YXRlcm5pb25LZXlmcmFtZVRyYWNrLCBib25lTmFtZSArICcucXVhdGVybmlvbicsXG5cdFx0XHRcdFx0YW5pbWF0aW9uS2V5cywgJ3JvdCcsIHRyYWNrcyApO1xuXG5cdFx0XHRcdGFkZE5vbmVtcHR5VHJhY2soXG5cdFx0XHRcdFx0VmVjdG9yS2V5ZnJhbWVUcmFjaywgYm9uZU5hbWUgKyAnLnNjYWxlJyxcblx0XHRcdFx0XHRhbmltYXRpb25LZXlzLCAnc2NsJywgdHJhY2tzICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggdHJhY2tzLmxlbmd0aCA9PT0gMCApIHtcblxuXHRcdFx0cmV0dXJuIG51bGw7XG5cblx0XHR9XG5cblx0XHR2YXIgY2xpcCA9IG5ldyBBbmltYXRpb25DbGlwKCBjbGlwTmFtZSwgZHVyYXRpb24sIHRyYWNrcyApO1xuXG5cdFx0cmV0dXJuIGNsaXA7XG5cblx0fVxuXG59ICk7XG5cbk9iamVjdC5hc3NpZ24oIEFuaW1hdGlvbkNsaXAucHJvdG90eXBlLCB7XG5cblx0cmVzZXREdXJhdGlvbjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHRyYWNrcyA9IHRoaXMudHJhY2tzLCBkdXJhdGlvbiA9IDA7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIG4gPSB0cmFja3MubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHR2YXIgdHJhY2sgPSB0aGlzLnRyYWNrc1sgaSBdO1xuXG5cdFx0XHRkdXJhdGlvbiA9IE1hdGgubWF4KCBkdXJhdGlvbiwgdHJhY2sudGltZXNbIHRyYWNrLnRpbWVzLmxlbmd0aCAtIDEgXSApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5kdXJhdGlvbiA9IGR1cmF0aW9uO1xuXG5cdH0sXG5cblx0dHJpbTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgdGhpcy50cmFja3MubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHR0aGlzLnRyYWNrc1sgaSBdLnRyaW0oIDAsIHRoaXMuZHVyYXRpb24gKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0b3B0aW1pemU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IHRoaXMudHJhY2tzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0dGhpcy50cmFja3NbIGkgXS5vcHRpbWl6ZSgpO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBNYXRlcmlhbExvYWRlciggbWFuYWdlciApIHtcblxuXHR0aGlzLm1hbmFnZXIgPSAoIG1hbmFnZXIgIT09IHVuZGVmaW5lZCApID8gbWFuYWdlciA6IERlZmF1bHRMb2FkaW5nTWFuYWdlcjtcblx0dGhpcy50ZXh0dXJlcyA9IHt9O1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIE1hdGVyaWFsTG9hZGVyLnByb3RvdHlwZSwge1xuXG5cdGxvYWQ6IGZ1bmN0aW9uICggdXJsLCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKSB7XG5cblx0XHR2YXIgc2NvcGUgPSB0aGlzO1xuXG5cdFx0dmFyIGxvYWRlciA9IG5ldyBGaWxlTG9hZGVyKCBzY29wZS5tYW5hZ2VyICk7XG5cdFx0bG9hZGVyLmxvYWQoIHVybCwgZnVuY3Rpb24gKCB0ZXh0ICkge1xuXG5cdFx0XHRvbkxvYWQoIHNjb3BlLnBhcnNlKCBKU09OLnBhcnNlKCB0ZXh0ICkgKSApO1xuXG5cdFx0fSwgb25Qcm9ncmVzcywgb25FcnJvciApO1xuXG5cdH0sXG5cblx0c2V0VGV4dHVyZXM6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLnRleHR1cmVzID0gdmFsdWU7XG5cblx0fSxcblxuXHRwYXJzZTogZnVuY3Rpb24gKCBqc29uICkge1xuXG5cdFx0dmFyIHRleHR1cmVzID0gdGhpcy50ZXh0dXJlcztcblxuXHRcdGZ1bmN0aW9uIGdldFRleHR1cmUoIG5hbWUgKSB7XG5cblx0XHRcdGlmICggdGV4dHVyZXNbIG5hbWUgXSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdGVyaWFsTG9hZGVyOiBVbmRlZmluZWQgdGV4dHVyZScsIG5hbWUgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdGV4dHVyZXNbIG5hbWUgXTtcblxuXHRcdH1cblxuXHRcdHZhciBtYXRlcmlhbCA9IG5ldyBNYXRlcmlhbHNbIGpzb24udHlwZSBdKCk7XG5cblx0XHRpZiAoIGpzb24udXVpZCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwudXVpZCA9IGpzb24udXVpZDtcblx0XHRpZiAoIGpzb24ubmFtZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwubmFtZSA9IGpzb24ubmFtZTtcblx0XHRpZiAoIGpzb24uY29sb3IgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmNvbG9yLnNldEhleCgganNvbi5jb2xvciApO1xuXHRcdGlmICgganNvbi5yb3VnaG5lc3MgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnJvdWdobmVzcyA9IGpzb24ucm91Z2huZXNzO1xuXHRcdGlmICgganNvbi5tZXRhbG5lc3MgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLm1ldGFsbmVzcyA9IGpzb24ubWV0YWxuZXNzO1xuXHRcdGlmICgganNvbi5lbWlzc2l2ZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZW1pc3NpdmUuc2V0SGV4KCBqc29uLmVtaXNzaXZlICk7XG5cdFx0aWYgKCBqc29uLnNwZWN1bGFyICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5zcGVjdWxhci5zZXRIZXgoIGpzb24uc3BlY3VsYXIgKTtcblx0XHRpZiAoIGpzb24uc2hpbmluZXNzICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5zaGluaW5lc3MgPSBqc29uLnNoaW5pbmVzcztcblx0XHRpZiAoIGpzb24uY2xlYXJDb2F0ICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5jbGVhckNvYXQgPSBqc29uLmNsZWFyQ29hdDtcblx0XHRpZiAoIGpzb24uY2xlYXJDb2F0Um91Z2huZXNzICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5jbGVhckNvYXRSb3VnaG5lc3MgPSBqc29uLmNsZWFyQ29hdFJvdWdobmVzcztcblx0XHRpZiAoIGpzb24udW5pZm9ybXMgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnVuaWZvcm1zID0ganNvbi51bmlmb3Jtcztcblx0XHRpZiAoIGpzb24udmVydGV4U2hhZGVyICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC52ZXJ0ZXhTaGFkZXIgPSBqc29uLnZlcnRleFNoYWRlcjtcblx0XHRpZiAoIGpzb24uZnJhZ21lbnRTaGFkZXIgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmZyYWdtZW50U2hhZGVyID0ganNvbi5mcmFnbWVudFNoYWRlcjtcblx0XHRpZiAoIGpzb24udmVydGV4Q29sb3JzICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC52ZXJ0ZXhDb2xvcnMgPSBqc29uLnZlcnRleENvbG9ycztcblx0XHRpZiAoIGpzb24uZm9nICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5mb2cgPSBqc29uLmZvZztcblx0XHRpZiAoIGpzb24uZmxhdFNoYWRpbmcgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmZsYXRTaGFkaW5nID0ganNvbi5mbGF0U2hhZGluZztcblx0XHRpZiAoIGpzb24uYmxlbmRpbmcgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmJsZW5kaW5nID0ganNvbi5ibGVuZGluZztcblx0XHRpZiAoIGpzb24uc2lkZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuc2lkZSA9IGpzb24uc2lkZTtcblx0XHRpZiAoIGpzb24ub3BhY2l0eSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwub3BhY2l0eSA9IGpzb24ub3BhY2l0eTtcblx0XHRpZiAoIGpzb24udHJhbnNwYXJlbnQgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnRyYW5zcGFyZW50ID0ganNvbi50cmFuc3BhcmVudDtcblx0XHRpZiAoIGpzb24uYWxwaGFUZXN0ICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5hbHBoYVRlc3QgPSBqc29uLmFscGhhVGVzdDtcblx0XHRpZiAoIGpzb24uZGVwdGhUZXN0ICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5kZXB0aFRlc3QgPSBqc29uLmRlcHRoVGVzdDtcblx0XHRpZiAoIGpzb24uZGVwdGhXcml0ZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZGVwdGhXcml0ZSA9IGpzb24uZGVwdGhXcml0ZTtcblx0XHRpZiAoIGpzb24uY29sb3JXcml0ZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuY29sb3JXcml0ZSA9IGpzb24uY29sb3JXcml0ZTtcblx0XHRpZiAoIGpzb24ud2lyZWZyYW1lICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC53aXJlZnJhbWUgPSBqc29uLndpcmVmcmFtZTtcblx0XHRpZiAoIGpzb24ud2lyZWZyYW1lTGluZXdpZHRoICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC53aXJlZnJhbWVMaW5ld2lkdGggPSBqc29uLndpcmVmcmFtZUxpbmV3aWR0aDtcblx0XHRpZiAoIGpzb24ud2lyZWZyYW1lTGluZWNhcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwud2lyZWZyYW1lTGluZWNhcCA9IGpzb24ud2lyZWZyYW1lTGluZWNhcDtcblx0XHRpZiAoIGpzb24ud2lyZWZyYW1lTGluZWpvaW4gIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLndpcmVmcmFtZUxpbmVqb2luID0ganNvbi53aXJlZnJhbWVMaW5lam9pbjtcblxuXHRcdGlmICgganNvbi5yb3RhdGlvbiAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwucm90YXRpb24gPSBqc29uLnJvdGF0aW9uO1xuXG5cdFx0aWYgKCBqc29uLmxpbmV3aWR0aCAhPT0gMSApIG1hdGVyaWFsLmxpbmV3aWR0aCA9IGpzb24ubGluZXdpZHRoO1xuXHRcdGlmICgganNvbi5kYXNoU2l6ZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZGFzaFNpemUgPSBqc29uLmRhc2hTaXplO1xuXHRcdGlmICgganNvbi5nYXBTaXplICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5nYXBTaXplID0ganNvbi5nYXBTaXplO1xuXHRcdGlmICgganNvbi5zY2FsZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuc2NhbGUgPSBqc29uLnNjYWxlO1xuXG5cdFx0aWYgKCBqc29uLnBvbHlnb25PZmZzZXQgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnBvbHlnb25PZmZzZXQgPSBqc29uLnBvbHlnb25PZmZzZXQ7XG5cdFx0aWYgKCBqc29uLnBvbHlnb25PZmZzZXRGYWN0b3IgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnBvbHlnb25PZmZzZXRGYWN0b3IgPSBqc29uLnBvbHlnb25PZmZzZXRGYWN0b3I7XG5cdFx0aWYgKCBqc29uLnBvbHlnb25PZmZzZXRVbml0cyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwucG9seWdvbk9mZnNldFVuaXRzID0ganNvbi5wb2x5Z29uT2Zmc2V0VW5pdHM7XG5cblx0XHRpZiAoIGpzb24uc2tpbm5pbmcgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnNraW5uaW5nID0ganNvbi5za2lubmluZztcblx0XHRpZiAoIGpzb24ubW9ycGhUYXJnZXRzICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5tb3JwaFRhcmdldHMgPSBqc29uLm1vcnBoVGFyZ2V0cztcblx0XHRpZiAoIGpzb24uZGl0aGVyaW5nICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5kaXRoZXJpbmcgPSBqc29uLmRpdGhlcmluZztcblxuXHRcdGlmICgganNvbi52aXNpYmxlICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC52aXNpYmxlID0ganNvbi52aXNpYmxlO1xuXHRcdGlmICgganNvbi51c2VyRGF0YSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwudXNlckRhdGEgPSBqc29uLnVzZXJEYXRhO1xuXG5cdFx0Ly8gRGVwcmVjYXRlZFxuXG5cdFx0aWYgKCBqc29uLnNoYWRpbmcgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmZsYXRTaGFkaW5nID0ganNvbi5zaGFkaW5nID09PSAxOyAvLyBUSFJFRS5GbGF0U2hhZGluZ1xuXG5cdFx0Ly8gZm9yIFBvaW50c01hdGVyaWFsXG5cblx0XHRpZiAoIGpzb24uc2l6ZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuc2l6ZSA9IGpzb24uc2l6ZTtcblx0XHRpZiAoIGpzb24uc2l6ZUF0dGVudWF0aW9uICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5zaXplQXR0ZW51YXRpb24gPSBqc29uLnNpemVBdHRlbnVhdGlvbjtcblxuXHRcdC8vIG1hcHNcblxuXHRcdGlmICgganNvbi5tYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLm1hcCA9IGdldFRleHR1cmUoIGpzb24ubWFwICk7XG5cblx0XHRpZiAoIGpzb24uYWxwaGFNYXAgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0bWF0ZXJpYWwuYWxwaGFNYXAgPSBnZXRUZXh0dXJlKCBqc29uLmFscGhhTWFwICk7XG5cdFx0XHRtYXRlcmlhbC50cmFuc3BhcmVudCA9IHRydWU7XG5cblx0XHR9XG5cblx0XHRpZiAoIGpzb24uYnVtcE1hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuYnVtcE1hcCA9IGdldFRleHR1cmUoIGpzb24uYnVtcE1hcCApO1xuXHRcdGlmICgganNvbi5idW1wU2NhbGUgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmJ1bXBTY2FsZSA9IGpzb24uYnVtcFNjYWxlO1xuXG5cdFx0aWYgKCBqc29uLm5vcm1hbE1hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwubm9ybWFsTWFwID0gZ2V0VGV4dHVyZSgganNvbi5ub3JtYWxNYXAgKTtcblx0XHRpZiAoIGpzb24ubm9ybWFsU2NhbGUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dmFyIG5vcm1hbFNjYWxlID0ganNvbi5ub3JtYWxTY2FsZTtcblxuXHRcdFx0aWYgKCBBcnJheS5pc0FycmF5KCBub3JtYWxTY2FsZSApID09PSBmYWxzZSApIHtcblxuXHRcdFx0XHQvLyBCbGVuZGVyIGV4cG9ydGVyIHVzZWQgdG8gZXhwb3J0IGEgc2NhbGFyLiBTZWUgIzc0NTlcblxuXHRcdFx0XHRub3JtYWxTY2FsZSA9IFsgbm9ybWFsU2NhbGUsIG5vcm1hbFNjYWxlIF07XG5cblx0XHRcdH1cblxuXHRcdFx0bWF0ZXJpYWwubm9ybWFsU2NhbGUgPSBuZXcgVmVjdG9yMigpLmZyb21BcnJheSggbm9ybWFsU2NhbGUgKTtcblxuXHRcdH1cblxuXHRcdGlmICgganNvbi5kaXNwbGFjZW1lbnRNYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcCA9IGdldFRleHR1cmUoIGpzb24uZGlzcGxhY2VtZW50TWFwICk7XG5cdFx0aWYgKCBqc29uLmRpc3BsYWNlbWVudFNjYWxlICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRTY2FsZSA9IGpzb24uZGlzcGxhY2VtZW50U2NhbGU7XG5cdFx0aWYgKCBqc29uLmRpc3BsYWNlbWVudEJpYXMgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmRpc3BsYWNlbWVudEJpYXMgPSBqc29uLmRpc3BsYWNlbWVudEJpYXM7XG5cblx0XHRpZiAoIGpzb24ucm91Z2huZXNzTWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5yb3VnaG5lc3NNYXAgPSBnZXRUZXh0dXJlKCBqc29uLnJvdWdobmVzc01hcCApO1xuXHRcdGlmICgganNvbi5tZXRhbG5lc3NNYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLm1ldGFsbmVzc01hcCA9IGdldFRleHR1cmUoIGpzb24ubWV0YWxuZXNzTWFwICk7XG5cblx0XHRpZiAoIGpzb24uZW1pc3NpdmVNYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmVtaXNzaXZlTWFwID0gZ2V0VGV4dHVyZSgganNvbi5lbWlzc2l2ZU1hcCApO1xuXHRcdGlmICgganNvbi5lbWlzc2l2ZUludGVuc2l0eSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZW1pc3NpdmVJbnRlbnNpdHkgPSBqc29uLmVtaXNzaXZlSW50ZW5zaXR5O1xuXG5cdFx0aWYgKCBqc29uLnNwZWN1bGFyTWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5zcGVjdWxhck1hcCA9IGdldFRleHR1cmUoIGpzb24uc3BlY3VsYXJNYXAgKTtcblxuXHRcdGlmICgganNvbi5lbnZNYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmVudk1hcCA9IGdldFRleHR1cmUoIGpzb24uZW52TWFwICk7XG5cblx0XHRpZiAoIGpzb24ucmVmbGVjdGl2aXR5ICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5yZWZsZWN0aXZpdHkgPSBqc29uLnJlZmxlY3Rpdml0eTtcblxuXHRcdGlmICgganNvbi5saWdodE1hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwubGlnaHRNYXAgPSBnZXRUZXh0dXJlKCBqc29uLmxpZ2h0TWFwICk7XG5cdFx0aWYgKCBqc29uLmxpZ2h0TWFwSW50ZW5zaXR5ICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5saWdodE1hcEludGVuc2l0eSA9IGpzb24ubGlnaHRNYXBJbnRlbnNpdHk7XG5cblx0XHRpZiAoIGpzb24uYW9NYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmFvTWFwID0gZ2V0VGV4dHVyZSgganNvbi5hb01hcCApO1xuXHRcdGlmICgganNvbi5hb01hcEludGVuc2l0eSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuYW9NYXBJbnRlbnNpdHkgPSBqc29uLmFvTWFwSW50ZW5zaXR5O1xuXG5cdFx0aWYgKCBqc29uLmdyYWRpZW50TWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5ncmFkaWVudE1hcCA9IGdldFRleHR1cmUoIGpzb24uZ3JhZGllbnRNYXAgKTtcblxuXHRcdHJldHVybiBtYXRlcmlhbDtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIEJ1ZmZlckdlb21ldHJ5TG9hZGVyKCBtYW5hZ2VyICkge1xuXG5cdHRoaXMubWFuYWdlciA9ICggbWFuYWdlciAhPT0gdW5kZWZpbmVkICkgPyBtYW5hZ2VyIDogRGVmYXVsdExvYWRpbmdNYW5hZ2VyO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIEJ1ZmZlckdlb21ldHJ5TG9hZGVyLnByb3RvdHlwZSwge1xuXG5cdGxvYWQ6IGZ1bmN0aW9uICggdXJsLCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKSB7XG5cblx0XHR2YXIgc2NvcGUgPSB0aGlzO1xuXG5cdFx0dmFyIGxvYWRlciA9IG5ldyBGaWxlTG9hZGVyKCBzY29wZS5tYW5hZ2VyICk7XG5cdFx0bG9hZGVyLmxvYWQoIHVybCwgZnVuY3Rpb24gKCB0ZXh0ICkge1xuXG5cdFx0XHRvbkxvYWQoIHNjb3BlLnBhcnNlKCBKU09OLnBhcnNlKCB0ZXh0ICkgKSApO1xuXG5cdFx0fSwgb25Qcm9ncmVzcywgb25FcnJvciApO1xuXG5cdH0sXG5cblx0cGFyc2U6IGZ1bmN0aW9uICgganNvbiApIHtcblxuXHRcdHZhciBnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXG5cdFx0dmFyIGluZGV4ID0ganNvbi5kYXRhLmluZGV4O1xuXG5cdFx0aWYgKCBpbmRleCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR2YXIgdHlwZWRBcnJheSA9IG5ldyBUWVBFRF9BUlJBWVNbIGluZGV4LnR5cGUgXSggaW5kZXguYXJyYXkgKTtcblx0XHRcdGdlb21ldHJ5LnNldEluZGV4KCBuZXcgQnVmZmVyQXR0cmlidXRlKCB0eXBlZEFycmF5LCAxICkgKTtcblxuXHRcdH1cblxuXHRcdHZhciBhdHRyaWJ1dGVzID0ganNvbi5kYXRhLmF0dHJpYnV0ZXM7XG5cblx0XHRmb3IgKCB2YXIga2V5IGluIGF0dHJpYnV0ZXMgKSB7XG5cblx0XHRcdHZhciBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzWyBrZXkgXTtcblx0XHRcdHZhciB0eXBlZEFycmF5ID0gbmV3IFRZUEVEX0FSUkFZU1sgYXR0cmlidXRlLnR5cGUgXSggYXR0cmlidXRlLmFycmF5ICk7XG5cblx0XHRcdGdlb21ldHJ5LmFkZEF0dHJpYnV0ZSgga2V5LCBuZXcgQnVmZmVyQXR0cmlidXRlKCB0eXBlZEFycmF5LCBhdHRyaWJ1dGUuaXRlbVNpemUsIGF0dHJpYnV0ZS5ub3JtYWxpemVkICkgKTtcblxuXHRcdH1cblxuXHRcdHZhciBncm91cHMgPSBqc29uLmRhdGEuZ3JvdXBzIHx8IGpzb24uZGF0YS5kcmF3Y2FsbHMgfHwganNvbi5kYXRhLm9mZnNldHM7XG5cblx0XHRpZiAoIGdyb3VwcyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIG4gPSBncm91cHMubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHRcdHZhciBncm91cCA9IGdyb3Vwc1sgaSBdO1xuXG5cdFx0XHRcdGdlb21ldHJ5LmFkZEdyb3VwKCBncm91cC5zdGFydCwgZ3JvdXAuY291bnQsIGdyb3VwLm1hdGVyaWFsSW5kZXggKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0dmFyIGJvdW5kaW5nU3BoZXJlID0ganNvbi5kYXRhLmJvdW5kaW5nU3BoZXJlO1xuXG5cdFx0aWYgKCBib3VuZGluZ1NwaGVyZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR2YXIgY2VudGVyID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdFx0aWYgKCBib3VuZGluZ1NwaGVyZS5jZW50ZXIgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRjZW50ZXIuZnJvbUFycmF5KCBib3VuZGluZ1NwaGVyZS5jZW50ZXIgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSA9IG5ldyBTcGhlcmUoIGNlbnRlciwgYm91bmRpbmdTcGhlcmUucmFkaXVzICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gZ2VvbWV0cnk7XG5cblx0fVxuXG59ICk7XG5cbnZhciBUWVBFRF9BUlJBWVMgPSB7XG5cdEludDhBcnJheTogSW50OEFycmF5LFxuXHRVaW50OEFycmF5OiBVaW50OEFycmF5LFxuXHQvLyBXb3JrYXJvdW5kIGZvciBJRTExIHByZSBLQjI5Mjk0MzcuIFNlZSAjMTE0NDBcblx0VWludDhDbGFtcGVkQXJyYXk6IHR5cGVvZiBVaW50OENsYW1wZWRBcnJheSAhPT0gJ3VuZGVmaW5lZCcgPyBVaW50OENsYW1wZWRBcnJheSA6IFVpbnQ4QXJyYXksXG5cdEludDE2QXJyYXk6IEludDE2QXJyYXksXG5cdFVpbnQxNkFycmF5OiBVaW50MTZBcnJheSxcblx0SW50MzJBcnJheTogSW50MzJBcnJheSxcblx0VWludDMyQXJyYXk6IFVpbnQzMkFycmF5LFxuXHRGbG9hdDMyQXJyYXk6IEZsb2F0MzJBcnJheSxcblx0RmxvYXQ2NEFycmF5OiBGbG9hdDY0QXJyYXlcbn07XG5cbi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBMb2FkZXIoKSB7fVxuXG5Mb2FkZXIuSGFuZGxlcnMgPSB7XG5cblx0aGFuZGxlcnM6IFtdLFxuXG5cdGFkZDogZnVuY3Rpb24gKCByZWdleCwgbG9hZGVyICkge1xuXG5cdFx0dGhpcy5oYW5kbGVycy5wdXNoKCByZWdleCwgbG9hZGVyICk7XG5cblx0fSxcblxuXHRnZXQ6IGZ1bmN0aW9uICggZmlsZSApIHtcblxuXHRcdHZhciBoYW5kbGVycyA9IHRoaXMuaGFuZGxlcnM7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBoYW5kbGVycy5sZW5ndGg7IGkgPCBsOyBpICs9IDIgKSB7XG5cblx0XHRcdHZhciByZWdleCA9IGhhbmRsZXJzWyBpIF07XG5cdFx0XHR2YXIgbG9hZGVyID0gaGFuZGxlcnNbIGkgKyAxIF07XG5cblx0XHRcdGlmICggcmVnZXgudGVzdCggZmlsZSApICkge1xuXG5cdFx0XHRcdHJldHVybiBsb2FkZXI7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiBudWxsO1xuXG5cdH1cblxufTtcblxuT2JqZWN0LmFzc2lnbiggTG9hZGVyLnByb3RvdHlwZSwge1xuXG5cdGNyb3NzT3JpZ2luOiB1bmRlZmluZWQsXG5cblx0b25Mb2FkU3RhcnQ6IGZ1bmN0aW9uICgpIHt9LFxuXG5cdG9uTG9hZFByb2dyZXNzOiBmdW5jdGlvbiAoKSB7fSxcblxuXHRvbkxvYWRDb21wbGV0ZTogZnVuY3Rpb24gKCkge30sXG5cblx0aW5pdE1hdGVyaWFsczogZnVuY3Rpb24gKCBtYXRlcmlhbHMsIHRleHR1cmVQYXRoLCBjcm9zc09yaWdpbiApIHtcblxuXHRcdHZhciBhcnJheSA9IFtdO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgbWF0ZXJpYWxzLmxlbmd0aDsgKysgaSApIHtcblxuXHRcdFx0YXJyYXlbIGkgXSA9IHRoaXMuY3JlYXRlTWF0ZXJpYWwoIG1hdGVyaWFsc1sgaSBdLCB0ZXh0dXJlUGF0aCwgY3Jvc3NPcmlnaW4gKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBhcnJheTtcblxuXHR9LFxuXG5cdGNyZWF0ZU1hdGVyaWFsOiAoIGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBCbGVuZGluZ01vZGUgPSB7XG5cdFx0XHROb0JsZW5kaW5nOiBOb0JsZW5kaW5nLFxuXHRcdFx0Tm9ybWFsQmxlbmRpbmc6IE5vcm1hbEJsZW5kaW5nLFxuXHRcdFx0QWRkaXRpdmVCbGVuZGluZzogQWRkaXRpdmVCbGVuZGluZyxcblx0XHRcdFN1YnRyYWN0aXZlQmxlbmRpbmc6IFN1YnRyYWN0aXZlQmxlbmRpbmcsXG5cdFx0XHRNdWx0aXBseUJsZW5kaW5nOiBNdWx0aXBseUJsZW5kaW5nLFxuXHRcdFx0Q3VzdG9tQmxlbmRpbmc6IEN1c3RvbUJsZW5kaW5nXG5cdFx0fTtcblxuXHRcdHZhciBjb2xvciA9IG5ldyBDb2xvcigpO1xuXHRcdHZhciB0ZXh0dXJlTG9hZGVyID0gbmV3IFRleHR1cmVMb2FkZXIoKTtcblx0XHR2YXIgbWF0ZXJpYWxMb2FkZXIgPSBuZXcgTWF0ZXJpYWxMb2FkZXIoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBjcmVhdGVNYXRlcmlhbCggbSwgdGV4dHVyZVBhdGgsIGNyb3NzT3JpZ2luICkge1xuXG5cdFx0XHQvLyBjb252ZXJ0IGZyb20gb2xkIG1hdGVyaWFsIGZvcm1hdFxuXG5cdFx0XHR2YXIgdGV4dHVyZXMgPSB7fTtcblxuXHRcdFx0ZnVuY3Rpb24gbG9hZFRleHR1cmUoIHBhdGgsIHJlcGVhdCwgb2Zmc2V0LCB3cmFwLCBhbmlzb3Ryb3B5ICkge1xuXG5cdFx0XHRcdHZhciBmdWxsUGF0aCA9IHRleHR1cmVQYXRoICsgcGF0aDtcblx0XHRcdFx0dmFyIGxvYWRlciA9IExvYWRlci5IYW5kbGVycy5nZXQoIGZ1bGxQYXRoICk7XG5cblx0XHRcdFx0dmFyIHRleHR1cmU7XG5cblx0XHRcdFx0aWYgKCBsb2FkZXIgIT09IG51bGwgKSB7XG5cblx0XHRcdFx0XHR0ZXh0dXJlID0gbG9hZGVyLmxvYWQoIGZ1bGxQYXRoICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdHRleHR1cmVMb2FkZXIuc2V0Q3Jvc3NPcmlnaW4oIGNyb3NzT3JpZ2luICk7XG5cdFx0XHRcdFx0dGV4dHVyZSA9IHRleHR1cmVMb2FkZXIubG9hZCggZnVsbFBhdGggKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCByZXBlYXQgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdHRleHR1cmUucmVwZWF0LmZyb21BcnJheSggcmVwZWF0ICk7XG5cblx0XHRcdFx0XHRpZiAoIHJlcGVhdFsgMCBdICE9PSAxICkgdGV4dHVyZS53cmFwUyA9IFJlcGVhdFdyYXBwaW5nO1xuXHRcdFx0XHRcdGlmICggcmVwZWF0WyAxIF0gIT09IDEgKSB0ZXh0dXJlLndyYXBUID0gUmVwZWF0V3JhcHBpbmc7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICggb2Zmc2V0ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHR0ZXh0dXJlLm9mZnNldC5mcm9tQXJyYXkoIG9mZnNldCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIHdyYXAgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdGlmICggd3JhcFsgMCBdID09PSAncmVwZWF0JyApIHRleHR1cmUud3JhcFMgPSBSZXBlYXRXcmFwcGluZztcblx0XHRcdFx0XHRpZiAoIHdyYXBbIDAgXSA9PT0gJ21pcnJvcicgKSB0ZXh0dXJlLndyYXBTID0gTWlycm9yZWRSZXBlYXRXcmFwcGluZztcblxuXHRcdFx0XHRcdGlmICggd3JhcFsgMSBdID09PSAncmVwZWF0JyApIHRleHR1cmUud3JhcFQgPSBSZXBlYXRXcmFwcGluZztcblx0XHRcdFx0XHRpZiAoIHdyYXBbIDEgXSA9PT0gJ21pcnJvcicgKSB0ZXh0dXJlLndyYXBUID0gTWlycm9yZWRSZXBlYXRXcmFwcGluZztcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCBhbmlzb3Ryb3B5ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHR0ZXh0dXJlLmFuaXNvdHJvcHkgPSBhbmlzb3Ryb3B5O1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHR2YXIgdXVpZCA9IF9NYXRoLmdlbmVyYXRlVVVJRCgpO1xuXG5cdFx0XHRcdHRleHR1cmVzWyB1dWlkIF0gPSB0ZXh0dXJlO1xuXG5cdFx0XHRcdHJldHVybiB1dWlkO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vXG5cblx0XHRcdHZhciBqc29uID0ge1xuXHRcdFx0XHR1dWlkOiBfTWF0aC5nZW5lcmF0ZVVVSUQoKSxcblx0XHRcdFx0dHlwZTogJ01lc2hMYW1iZXJ0TWF0ZXJpYWwnXG5cdFx0XHR9O1xuXG5cdFx0XHRmb3IgKCB2YXIgbmFtZSBpbiBtICkge1xuXG5cdFx0XHRcdHZhciB2YWx1ZSA9IG1bIG5hbWUgXTtcblxuXHRcdFx0XHRzd2l0Y2ggKCBuYW1lICkge1xuXG5cdFx0XHRcdFx0Y2FzZSAnRGJnQ29sb3InOlxuXHRcdFx0XHRcdGNhc2UgJ0RiZ0luZGV4Jzpcblx0XHRcdFx0XHRjYXNlICdvcHRpY2FsRGVuc2l0eSc6XG5cdFx0XHRcdFx0Y2FzZSAnaWxsdW1pbmF0aW9uJzpcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ0RiZ05hbWUnOlxuXHRcdFx0XHRcdFx0anNvbi5uYW1lID0gdmFsdWU7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdibGVuZGluZyc6XG5cdFx0XHRcdFx0XHRqc29uLmJsZW5kaW5nID0gQmxlbmRpbmdNb2RlWyB2YWx1ZSBdO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnY29sb3JBbWJpZW50Jzpcblx0XHRcdFx0XHRjYXNlICdtYXBBbWJpZW50Jzpcblx0XHRcdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxvYWRlci5jcmVhdGVNYXRlcmlhbDonLCBuYW1lLCAnaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZC4nICk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdjb2xvckRpZmZ1c2UnOlxuXHRcdFx0XHRcdFx0anNvbi5jb2xvciA9IGNvbG9yLmZyb21BcnJheSggdmFsdWUgKS5nZXRIZXgoKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2NvbG9yU3BlY3VsYXInOlxuXHRcdFx0XHRcdFx0anNvbi5zcGVjdWxhciA9IGNvbG9yLmZyb21BcnJheSggdmFsdWUgKS5nZXRIZXgoKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2NvbG9yRW1pc3NpdmUnOlxuXHRcdFx0XHRcdFx0anNvbi5lbWlzc2l2ZSA9IGNvbG9yLmZyb21BcnJheSggdmFsdWUgKS5nZXRIZXgoKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3NwZWN1bGFyQ29lZic6XG5cdFx0XHRcdFx0XHRqc29uLnNoaW5pbmVzcyA9IHZhbHVlO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnc2hhZGluZyc6XG5cdFx0XHRcdFx0XHRpZiAoIHZhbHVlLnRvTG93ZXJDYXNlKCkgPT09ICdiYXNpYycgKSBqc29uLnR5cGUgPSAnTWVzaEJhc2ljTWF0ZXJpYWwnO1xuXHRcdFx0XHRcdFx0aWYgKCB2YWx1ZS50b0xvd2VyQ2FzZSgpID09PSAncGhvbmcnICkganNvbi50eXBlID0gJ01lc2hQaG9uZ01hdGVyaWFsJztcblx0XHRcdFx0XHRcdGlmICggdmFsdWUudG9Mb3dlckNhc2UoKSA9PT0gJ3N0YW5kYXJkJyApIGpzb24udHlwZSA9ICdNZXNoU3RhbmRhcmRNYXRlcmlhbCc7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdtYXBEaWZmdXNlJzpcblx0XHRcdFx0XHRcdGpzb24ubWFwID0gbG9hZFRleHR1cmUoIHZhbHVlLCBtLm1hcERpZmZ1c2VSZXBlYXQsIG0ubWFwRGlmZnVzZU9mZnNldCwgbS5tYXBEaWZmdXNlV3JhcCwgbS5tYXBEaWZmdXNlQW5pc290cm9weSApO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbWFwRGlmZnVzZVJlcGVhdCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwRGlmZnVzZU9mZnNldCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwRGlmZnVzZVdyYXAnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcERpZmZ1c2VBbmlzb3Ryb3B5Jzpcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ21hcEVtaXNzaXZlJzpcblx0XHRcdFx0XHRcdGpzb24uZW1pc3NpdmVNYXAgPSBsb2FkVGV4dHVyZSggdmFsdWUsIG0ubWFwRW1pc3NpdmVSZXBlYXQsIG0ubWFwRW1pc3NpdmVPZmZzZXQsIG0ubWFwRW1pc3NpdmVXcmFwLCBtLm1hcEVtaXNzaXZlQW5pc290cm9weSApO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbWFwRW1pc3NpdmVSZXBlYXQnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcEVtaXNzaXZlT2Zmc2V0Jzpcblx0XHRcdFx0XHRjYXNlICdtYXBFbWlzc2l2ZVdyYXAnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcEVtaXNzaXZlQW5pc290cm9weSc6XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdtYXBMaWdodCc6XG5cdFx0XHRcdFx0XHRqc29uLmxpZ2h0TWFwID0gbG9hZFRleHR1cmUoIHZhbHVlLCBtLm1hcExpZ2h0UmVwZWF0LCBtLm1hcExpZ2h0T2Zmc2V0LCBtLm1hcExpZ2h0V3JhcCwgbS5tYXBMaWdodEFuaXNvdHJvcHkgKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ21hcExpZ2h0UmVwZWF0Jzpcblx0XHRcdFx0XHRjYXNlICdtYXBMaWdodE9mZnNldCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwTGlnaHRXcmFwJzpcblx0XHRcdFx0XHRjYXNlICdtYXBMaWdodEFuaXNvdHJvcHknOlxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbWFwQU8nOlxuXHRcdFx0XHRcdFx0anNvbi5hb01hcCA9IGxvYWRUZXh0dXJlKCB2YWx1ZSwgbS5tYXBBT1JlcGVhdCwgbS5tYXBBT09mZnNldCwgbS5tYXBBT1dyYXAsIG0ubWFwQU9Bbmlzb3Ryb3B5ICk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdtYXBBT1JlcGVhdCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwQU9PZmZzZXQnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcEFPV3JhcCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwQU9Bbmlzb3Ryb3B5Jzpcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ21hcEJ1bXAnOlxuXHRcdFx0XHRcdFx0anNvbi5idW1wTWFwID0gbG9hZFRleHR1cmUoIHZhbHVlLCBtLm1hcEJ1bXBSZXBlYXQsIG0ubWFwQnVtcE9mZnNldCwgbS5tYXBCdW1wV3JhcCwgbS5tYXBCdW1wQW5pc290cm9weSApO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbWFwQnVtcFNjYWxlJzpcblx0XHRcdFx0XHRcdGpzb24uYnVtcFNjYWxlID0gdmFsdWU7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdtYXBCdW1wUmVwZWF0Jzpcblx0XHRcdFx0XHRjYXNlICdtYXBCdW1wT2Zmc2V0Jzpcblx0XHRcdFx0XHRjYXNlICdtYXBCdW1wV3JhcCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwQnVtcEFuaXNvdHJvcHknOlxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbWFwTm9ybWFsJzpcblx0XHRcdFx0XHRcdGpzb24ubm9ybWFsTWFwID0gbG9hZFRleHR1cmUoIHZhbHVlLCBtLm1hcE5vcm1hbFJlcGVhdCwgbS5tYXBOb3JtYWxPZmZzZXQsIG0ubWFwTm9ybWFsV3JhcCwgbS5tYXBOb3JtYWxBbmlzb3Ryb3B5ICk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdtYXBOb3JtYWxGYWN0b3InOlxuXHRcdFx0XHRcdFx0anNvbi5ub3JtYWxTY2FsZSA9IHZhbHVlO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbWFwTm9ybWFsUmVwZWF0Jzpcblx0XHRcdFx0XHRjYXNlICdtYXBOb3JtYWxPZmZzZXQnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcE5vcm1hbFdyYXAnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcE5vcm1hbEFuaXNvdHJvcHknOlxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbWFwU3BlY3VsYXInOlxuXHRcdFx0XHRcdFx0anNvbi5zcGVjdWxhck1hcCA9IGxvYWRUZXh0dXJlKCB2YWx1ZSwgbS5tYXBTcGVjdWxhclJlcGVhdCwgbS5tYXBTcGVjdWxhck9mZnNldCwgbS5tYXBTcGVjdWxhcldyYXAsIG0ubWFwU3BlY3VsYXJBbmlzb3Ryb3B5ICk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdtYXBTcGVjdWxhclJlcGVhdCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwU3BlY3VsYXJPZmZzZXQnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcFNwZWN1bGFyV3JhcCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwU3BlY3VsYXJBbmlzb3Ryb3B5Jzpcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ21hcE1ldGFsbmVzcyc6XG5cdFx0XHRcdFx0XHRqc29uLm1ldGFsbmVzc01hcCA9IGxvYWRUZXh0dXJlKCB2YWx1ZSwgbS5tYXBNZXRhbG5lc3NSZXBlYXQsIG0ubWFwTWV0YWxuZXNzT2Zmc2V0LCBtLm1hcE1ldGFsbmVzc1dyYXAsIG0ubWFwTWV0YWxuZXNzQW5pc290cm9weSApO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbWFwTWV0YWxuZXNzUmVwZWF0Jzpcblx0XHRcdFx0XHRjYXNlICdtYXBNZXRhbG5lc3NPZmZzZXQnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcE1ldGFsbmVzc1dyYXAnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcE1ldGFsbmVzc0FuaXNvdHJvcHknOlxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbWFwUm91Z2huZXNzJzpcblx0XHRcdFx0XHRcdGpzb24ucm91Z2huZXNzTWFwID0gbG9hZFRleHR1cmUoIHZhbHVlLCBtLm1hcFJvdWdobmVzc1JlcGVhdCwgbS5tYXBSb3VnaG5lc3NPZmZzZXQsIG0ubWFwUm91Z2huZXNzV3JhcCwgbS5tYXBSb3VnaG5lc3NBbmlzb3Ryb3B5ICk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdtYXBSb3VnaG5lc3NSZXBlYXQnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcFJvdWdobmVzc09mZnNldCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwUm91Z2huZXNzV3JhcCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwUm91Z2huZXNzQW5pc290cm9weSc6XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdtYXBBbHBoYSc6XG5cdFx0XHRcdFx0XHRqc29uLmFscGhhTWFwID0gbG9hZFRleHR1cmUoIHZhbHVlLCBtLm1hcEFscGhhUmVwZWF0LCBtLm1hcEFscGhhT2Zmc2V0LCBtLm1hcEFscGhhV3JhcCwgbS5tYXBBbHBoYUFuaXNvdHJvcHkgKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ21hcEFscGhhUmVwZWF0Jzpcblx0XHRcdFx0XHRjYXNlICdtYXBBbHBoYU9mZnNldCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwQWxwaGFXcmFwJzpcblx0XHRcdFx0XHRjYXNlICdtYXBBbHBoYUFuaXNvdHJvcHknOlxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnZmxpcFNpZGVkJzpcblx0XHRcdFx0XHRcdGpzb24uc2lkZSA9IEJhY2tTaWRlO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnZG91YmxlU2lkZWQnOlxuXHRcdFx0XHRcdFx0anNvbi5zaWRlID0gRG91YmxlU2lkZTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3RyYW5zcGFyZW5jeSc6XG5cdFx0XHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Mb2FkZXIuY3JlYXRlTWF0ZXJpYWw6IHRyYW5zcGFyZW5jeSBoYXMgYmVlbiByZW5hbWVkIHRvIG9wYWNpdHknICk7XG5cdFx0XHRcdFx0XHRqc29uLm9wYWNpdHkgPSB2YWx1ZTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2RlcHRoVGVzdCc6XG5cdFx0XHRcdFx0Y2FzZSAnZGVwdGhXcml0ZSc6XG5cdFx0XHRcdFx0Y2FzZSAnY29sb3JXcml0ZSc6XG5cdFx0XHRcdFx0Y2FzZSAnb3BhY2l0eSc6XG5cdFx0XHRcdFx0Y2FzZSAncmVmbGVjdGl2aXR5Jzpcblx0XHRcdFx0XHRjYXNlICd0cmFuc3BhcmVudCc6XG5cdFx0XHRcdFx0Y2FzZSAndmlzaWJsZSc6XG5cdFx0XHRcdFx0Y2FzZSAnd2lyZWZyYW1lJzpcblx0XHRcdFx0XHRcdGpzb25bIG5hbWUgXSA9IHZhbHVlO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAndmVydGV4Q29sb3JzJzpcblx0XHRcdFx0XHRcdGlmICggdmFsdWUgPT09IHRydWUgKSBqc29uLnZlcnRleENvbG9ycyA9IFZlcnRleENvbG9ycztcblx0XHRcdFx0XHRcdGlmICggdmFsdWUgPT09ICdmYWNlJyApIGpzb24udmVydGV4Q29sb3JzID0gRmFjZUNvbG9ycztcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuTG9hZGVyLmNyZWF0ZU1hdGVyaWFsOiBVbnN1cHBvcnRlZCcsIG5hbWUsIHZhbHVlICk7XG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBqc29uLnR5cGUgPT09ICdNZXNoQmFzaWNNYXRlcmlhbCcgKSBkZWxldGUganNvbi5lbWlzc2l2ZTtcblx0XHRcdGlmICgganNvbi50eXBlICE9PSAnTWVzaFBob25nTWF0ZXJpYWwnICkgZGVsZXRlIGpzb24uc3BlY3VsYXI7XG5cblx0XHRcdGlmICgganNvbi5vcGFjaXR5IDwgMSApIGpzb24udHJhbnNwYXJlbnQgPSB0cnVlO1xuXG5cdFx0XHRtYXRlcmlhbExvYWRlci5zZXRUZXh0dXJlcyggdGV4dHVyZXMgKTtcblxuXHRcdFx0cmV0dXJuIG1hdGVyaWFsTG9hZGVyLnBhcnNlKCBqc29uICk7XG5cblx0XHR9O1xuXG5cdH0gKSgpXG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIERvbiBNY0N1cmR5IC8gaHR0cHM6Ly93d3cuZG9ubWNjdXJkeS5jb21cbiAqL1xuXG52YXIgTG9hZGVyVXRpbHMgPSB7XG5cblx0ZGVjb2RlVGV4dDogZnVuY3Rpb24gKCBhcnJheSApIHtcblxuXHRcdGlmICggdHlwZW9mIFRleHREZWNvZGVyICE9PSAndW5kZWZpbmVkJyApIHtcblxuXHRcdFx0cmV0dXJuIG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZSggYXJyYXkgKTtcblxuXHRcdH1cblxuXHRcdC8vIEF2b2lkIHRoZSBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIGFycmF5KSBzaG9ydGN1dCwgd2hpY2hcblx0XHQvLyB0aHJvd3MgYSBcIm1heGltdW0gY2FsbCBzdGFjayBzaXplIGV4Y2VlZGVkXCIgZXJyb3IgZm9yIGxhcmdlIGFycmF5cy5cblxuXHRcdHZhciBzID0gJyc7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gYXJyYXkubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdC8vIEltcGxpY2l0bHkgYXNzdW1lcyBsaXR0bGUtZW5kaWFuLlxuXHRcdFx0cyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKCBhcnJheVsgaSBdICk7XG5cblx0XHR9XG5cblx0XHQvLyBNZXJnZXMgbXVsdGktYnl0ZSB1dGYtOCBjaGFyYWN0ZXJzLlxuXHRcdHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoIGVzY2FwZSggcyApICk7XG5cblx0fSxcblxuXHRleHRyYWN0VXJsQmFzZTogZnVuY3Rpb24gKCB1cmwgKSB7XG5cblx0XHR2YXIgaW5kZXggPSB1cmwubGFzdEluZGV4T2YoICcvJyApO1xuXG5cdFx0aWYgKCBpbmRleCA9PT0gLSAxICkgcmV0dXJuICcuLyc7XG5cblx0XHRyZXR1cm4gdXJsLnN1YnN0ciggMCwgaW5kZXggKyAxICk7XG5cblx0fVxuXG59O1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICovXG5cbmZ1bmN0aW9uIEpTT05Mb2FkZXIoIG1hbmFnZXIgKSB7XG5cblx0aWYgKCB0eXBlb2YgbWFuYWdlciA9PT0gJ2Jvb2xlYW4nICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuSlNPTkxvYWRlcjogc2hvd1N0YXR1cyBwYXJhbWV0ZXIgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIGNvbnN0cnVjdG9yLicgKTtcblx0XHRtYW5hZ2VyID0gdW5kZWZpbmVkO1xuXG5cdH1cblxuXHR0aGlzLm1hbmFnZXIgPSAoIG1hbmFnZXIgIT09IHVuZGVmaW5lZCApID8gbWFuYWdlciA6IERlZmF1bHRMb2FkaW5nTWFuYWdlcjtcblxuXHR0aGlzLndpdGhDcmVkZW50aWFscyA9IGZhbHNlO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIEpTT05Mb2FkZXIucHJvdG90eXBlLCB7XG5cblx0bG9hZDogZnVuY3Rpb24gKCB1cmwsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciApIHtcblxuXHRcdHZhciBzY29wZSA9IHRoaXM7XG5cblx0XHR2YXIgdGV4dHVyZVBhdGggPSB0aGlzLnRleHR1cmVQYXRoICYmICggdHlwZW9mIHRoaXMudGV4dHVyZVBhdGggPT09ICdzdHJpbmcnICkgPyB0aGlzLnRleHR1cmVQYXRoIDogTG9hZGVyVXRpbHMuZXh0cmFjdFVybEJhc2UoIHVybCApO1xuXG5cdFx0dmFyIGxvYWRlciA9IG5ldyBGaWxlTG9hZGVyKCB0aGlzLm1hbmFnZXIgKTtcblx0XHRsb2FkZXIuc2V0V2l0aENyZWRlbnRpYWxzKCB0aGlzLndpdGhDcmVkZW50aWFscyApO1xuXHRcdGxvYWRlci5sb2FkKCB1cmwsIGZ1bmN0aW9uICggdGV4dCApIHtcblxuXHRcdFx0dmFyIGpzb24gPSBKU09OLnBhcnNlKCB0ZXh0ICk7XG5cdFx0XHR2YXIgbWV0YWRhdGEgPSBqc29uLm1ldGFkYXRhO1xuXG5cdFx0XHRpZiAoIG1ldGFkYXRhICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0dmFyIHR5cGUgPSBtZXRhZGF0YS50eXBlO1xuXG5cdFx0XHRcdGlmICggdHlwZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0aWYgKCB0eXBlLnRvTG93ZXJDYXNlKCkgPT09ICdvYmplY3QnICkge1xuXG5cdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuSlNPTkxvYWRlcjogJyArIHVybCArICcgc2hvdWxkIGJlIGxvYWRlZCB3aXRoIFRIUkVFLk9iamVjdExvYWRlciBpbnN0ZWFkLicgKTtcblx0XHRcdFx0XHRcdHJldHVybjtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIG9iamVjdCA9IHNjb3BlLnBhcnNlKCBqc29uLCB0ZXh0dXJlUGF0aCApO1xuXHRcdFx0b25Mb2FkKCBvYmplY3QuZ2VvbWV0cnksIG9iamVjdC5tYXRlcmlhbHMgKTtcblxuXHRcdH0sIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKTtcblxuXHR9LFxuXG5cdHNldFRleHR1cmVQYXRoOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy50ZXh0dXJlUGF0aCA9IHZhbHVlO1xuXG5cdH0sXG5cblx0cGFyc2U6ICggZnVuY3Rpb24gKCkge1xuXG5cdFx0ZnVuY3Rpb24gcGFyc2VNb2RlbCgganNvbiwgZ2VvbWV0cnkgKSB7XG5cblx0XHRcdGZ1bmN0aW9uIGlzQml0U2V0KCB2YWx1ZSwgcG9zaXRpb24gKSB7XG5cblx0XHRcdFx0cmV0dXJuIHZhbHVlICYgKCAxIDw8IHBvc2l0aW9uICk7XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIGksIGosIGZpLFxuXG5cdFx0XHRcdG9mZnNldCwgekxlbmd0aCxcblxuXHRcdFx0XHRjb2xvckluZGV4LCBub3JtYWxJbmRleCwgdXZJbmRleCwgbWF0ZXJpYWxJbmRleCxcblxuXHRcdFx0XHR0eXBlLFxuXHRcdFx0XHRpc1F1YWQsXG5cdFx0XHRcdGhhc01hdGVyaWFsLFxuXHRcdFx0XHRoYXNGYWNlVmVydGV4VXYsXG5cdFx0XHRcdGhhc0ZhY2VOb3JtYWwsIGhhc0ZhY2VWZXJ0ZXhOb3JtYWwsXG5cdFx0XHRcdGhhc0ZhY2VDb2xvciwgaGFzRmFjZVZlcnRleENvbG9yLFxuXG5cdFx0XHRcdHZlcnRleCwgZmFjZSwgZmFjZUEsIGZhY2VCLCBoZXgsIG5vcm1hbCxcblxuXHRcdFx0XHR1dkxheWVyLCB1diwgdSwgdixcblxuXHRcdFx0XHRmYWNlcyA9IGpzb24uZmFjZXMsXG5cdFx0XHRcdHZlcnRpY2VzID0ganNvbi52ZXJ0aWNlcyxcblx0XHRcdFx0bm9ybWFscyA9IGpzb24ubm9ybWFscyxcblx0XHRcdFx0Y29sb3JzID0ganNvbi5jb2xvcnMsXG5cblx0XHRcdFx0c2NhbGUgPSBqc29uLnNjYWxlLFxuXG5cdFx0XHRcdG5VdkxheWVycyA9IDA7XG5cblxuXHRcdFx0aWYgKCBqc29uLnV2cyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdC8vIGRpc3JlZ2FyZCBlbXB0eSBhcnJheXNcblxuXHRcdFx0XHRmb3IgKCBpID0gMDsgaSA8IGpzb24udXZzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0XHRcdGlmICgganNvbi51dnNbIGkgXS5sZW5ndGggKSBuVXZMYXllcnMgKys7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGZvciAoIGkgPSAwOyBpIDwgblV2TGF5ZXJzOyBpICsrICkge1xuXG5cdFx0XHRcdFx0Z2VvbWV0cnkuZmFjZVZlcnRleFV2c1sgaSBdID0gW107XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdG9mZnNldCA9IDA7XG5cdFx0XHR6TGVuZ3RoID0gdmVydGljZXMubGVuZ3RoO1xuXG5cdFx0XHR3aGlsZSAoIG9mZnNldCA8IHpMZW5ndGggKSB7XG5cblx0XHRcdFx0dmVydGV4ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdFx0XHR2ZXJ0ZXgueCA9IHZlcnRpY2VzWyBvZmZzZXQgKysgXSAqIHNjYWxlO1xuXHRcdFx0XHR2ZXJ0ZXgueSA9IHZlcnRpY2VzWyBvZmZzZXQgKysgXSAqIHNjYWxlO1xuXHRcdFx0XHR2ZXJ0ZXgueiA9IHZlcnRpY2VzWyBvZmZzZXQgKysgXSAqIHNjYWxlO1xuXG5cdFx0XHRcdGdlb21ldHJ5LnZlcnRpY2VzLnB1c2goIHZlcnRleCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdG9mZnNldCA9IDA7XG5cdFx0XHR6TGVuZ3RoID0gZmFjZXMubGVuZ3RoO1xuXG5cdFx0XHR3aGlsZSAoIG9mZnNldCA8IHpMZW5ndGggKSB7XG5cblx0XHRcdFx0dHlwZSA9IGZhY2VzWyBvZmZzZXQgKysgXTtcblxuXHRcdFx0XHRpc1F1YWQgPSBpc0JpdFNldCggdHlwZSwgMCApO1xuXHRcdFx0XHRoYXNNYXRlcmlhbCA9IGlzQml0U2V0KCB0eXBlLCAxICk7XG5cdFx0XHRcdGhhc0ZhY2VWZXJ0ZXhVdiA9IGlzQml0U2V0KCB0eXBlLCAzICk7XG5cdFx0XHRcdGhhc0ZhY2VOb3JtYWwgPSBpc0JpdFNldCggdHlwZSwgNCApO1xuXHRcdFx0XHRoYXNGYWNlVmVydGV4Tm9ybWFsID0gaXNCaXRTZXQoIHR5cGUsIDUgKTtcblx0XHRcdFx0aGFzRmFjZUNvbG9yID0gaXNCaXRTZXQoIHR5cGUsIDYgKTtcblx0XHRcdFx0aGFzRmFjZVZlcnRleENvbG9yID0gaXNCaXRTZXQoIHR5cGUsIDcgKTtcblxuXHRcdFx0XHQvLyBjb25zb2xlLmxvZyhcInR5cGVcIiwgdHlwZSwgXCJiaXRzXCIsIGlzUXVhZCwgaGFzTWF0ZXJpYWwsIGhhc0ZhY2VWZXJ0ZXhVdiwgaGFzRmFjZU5vcm1hbCwgaGFzRmFjZVZlcnRleE5vcm1hbCwgaGFzRmFjZUNvbG9yLCBoYXNGYWNlVmVydGV4Q29sb3IpO1xuXG5cdFx0XHRcdGlmICggaXNRdWFkICkge1xuXG5cdFx0XHRcdFx0ZmFjZUEgPSBuZXcgRmFjZTMoKTtcblx0XHRcdFx0XHRmYWNlQS5hID0gZmFjZXNbIG9mZnNldCBdO1xuXHRcdFx0XHRcdGZhY2VBLmIgPSBmYWNlc1sgb2Zmc2V0ICsgMSBdO1xuXHRcdFx0XHRcdGZhY2VBLmMgPSBmYWNlc1sgb2Zmc2V0ICsgMyBdO1xuXG5cdFx0XHRcdFx0ZmFjZUIgPSBuZXcgRmFjZTMoKTtcblx0XHRcdFx0XHRmYWNlQi5hID0gZmFjZXNbIG9mZnNldCArIDEgXTtcblx0XHRcdFx0XHRmYWNlQi5iID0gZmFjZXNbIG9mZnNldCArIDIgXTtcblx0XHRcdFx0XHRmYWNlQi5jID0gZmFjZXNbIG9mZnNldCArIDMgXTtcblxuXHRcdFx0XHRcdG9mZnNldCArPSA0O1xuXG5cdFx0XHRcdFx0aWYgKCBoYXNNYXRlcmlhbCApIHtcblxuXHRcdFx0XHRcdFx0bWF0ZXJpYWxJbmRleCA9IGZhY2VzWyBvZmZzZXQgKysgXTtcblx0XHRcdFx0XHRcdGZhY2VBLm1hdGVyaWFsSW5kZXggPSBtYXRlcmlhbEluZGV4O1xuXHRcdFx0XHRcdFx0ZmFjZUIubWF0ZXJpYWxJbmRleCA9IG1hdGVyaWFsSW5kZXg7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyB0byBnZXQgZmFjZSA8PT4gdXYgaW5kZXggY29ycmVzcG9uZGVuY2VcblxuXHRcdFx0XHRcdGZpID0gZ2VvbWV0cnkuZmFjZXMubGVuZ3RoO1xuXG5cdFx0XHRcdFx0aWYgKCBoYXNGYWNlVmVydGV4VXYgKSB7XG5cblx0XHRcdFx0XHRcdGZvciAoIGkgPSAwOyBpIDwgblV2TGF5ZXJzOyBpICsrICkge1xuXG5cdFx0XHRcdFx0XHRcdHV2TGF5ZXIgPSBqc29uLnV2c1sgaSBdO1xuXG5cdFx0XHRcdFx0XHRcdGdlb21ldHJ5LmZhY2VWZXJ0ZXhVdnNbIGkgXVsgZmkgXSA9IFtdO1xuXHRcdFx0XHRcdFx0XHRnZW9tZXRyeS5mYWNlVmVydGV4VXZzWyBpIF1bIGZpICsgMSBdID0gW107XG5cblx0XHRcdFx0XHRcdFx0Zm9yICggaiA9IDA7IGogPCA0OyBqICsrICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0dXZJbmRleCA9IGZhY2VzWyBvZmZzZXQgKysgXTtcblxuXHRcdFx0XHRcdFx0XHRcdHUgPSB1dkxheWVyWyB1dkluZGV4ICogMiBdO1xuXHRcdFx0XHRcdFx0XHRcdHYgPSB1dkxheWVyWyB1dkluZGV4ICogMiArIDEgXTtcblxuXHRcdFx0XHRcdFx0XHRcdHV2ID0gbmV3IFZlY3RvcjIoIHUsIHYgKTtcblxuXHRcdFx0XHRcdFx0XHRcdGlmICggaiAhPT0gMiApIGdlb21ldHJ5LmZhY2VWZXJ0ZXhVdnNbIGkgXVsgZmkgXS5wdXNoKCB1diApO1xuXHRcdFx0XHRcdFx0XHRcdGlmICggaiAhPT0gMCApIGdlb21ldHJ5LmZhY2VWZXJ0ZXhVdnNbIGkgXVsgZmkgKyAxIF0ucHVzaCggdXYgKTtcblxuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmICggaGFzRmFjZU5vcm1hbCApIHtcblxuXHRcdFx0XHRcdFx0bm9ybWFsSW5kZXggPSBmYWNlc1sgb2Zmc2V0ICsrIF0gKiAzO1xuXG5cdFx0XHRcdFx0XHRmYWNlQS5ub3JtYWwuc2V0KFxuXHRcdFx0XHRcdFx0XHRub3JtYWxzWyBub3JtYWxJbmRleCArKyBdLFxuXHRcdFx0XHRcdFx0XHRub3JtYWxzWyBub3JtYWxJbmRleCArKyBdLFxuXHRcdFx0XHRcdFx0XHRub3JtYWxzWyBub3JtYWxJbmRleCBdXG5cdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRmYWNlQi5ub3JtYWwuY29weSggZmFjZUEubm9ybWFsICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoIGhhc0ZhY2VWZXJ0ZXhOb3JtYWwgKSB7XG5cblx0XHRcdFx0XHRcdGZvciAoIGkgPSAwOyBpIDwgNDsgaSArKyApIHtcblxuXHRcdFx0XHRcdFx0XHRub3JtYWxJbmRleCA9IGZhY2VzWyBvZmZzZXQgKysgXSAqIDM7XG5cblx0XHRcdFx0XHRcdFx0bm9ybWFsID0gbmV3IFZlY3RvcjMoXG5cdFx0XHRcdFx0XHRcdFx0bm9ybWFsc1sgbm9ybWFsSW5kZXggKysgXSxcblx0XHRcdFx0XHRcdFx0XHRub3JtYWxzWyBub3JtYWxJbmRleCArKyBdLFxuXHRcdFx0XHRcdFx0XHRcdG5vcm1hbHNbIG5vcm1hbEluZGV4IF1cblx0XHRcdFx0XHRcdFx0KTtcblxuXG5cdFx0XHRcdFx0XHRcdGlmICggaSAhPT0gMiApIGZhY2VBLnZlcnRleE5vcm1hbHMucHVzaCggbm9ybWFsICk7XG5cdFx0XHRcdFx0XHRcdGlmICggaSAhPT0gMCApIGZhY2VCLnZlcnRleE5vcm1hbHMucHVzaCggbm9ybWFsICk7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblxuXG5cdFx0XHRcdFx0aWYgKCBoYXNGYWNlQ29sb3IgKSB7XG5cblx0XHRcdFx0XHRcdGNvbG9ySW5kZXggPSBmYWNlc1sgb2Zmc2V0ICsrIF07XG5cdFx0XHRcdFx0XHRoZXggPSBjb2xvcnNbIGNvbG9ySW5kZXggXTtcblxuXHRcdFx0XHRcdFx0ZmFjZUEuY29sb3Iuc2V0SGV4KCBoZXggKTtcblx0XHRcdFx0XHRcdGZhY2VCLmNvbG9yLnNldEhleCggaGV4ICk7XG5cblx0XHRcdFx0XHR9XG5cblxuXHRcdFx0XHRcdGlmICggaGFzRmFjZVZlcnRleENvbG9yICkge1xuXG5cdFx0XHRcdFx0XHRmb3IgKCBpID0gMDsgaSA8IDQ7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdFx0Y29sb3JJbmRleCA9IGZhY2VzWyBvZmZzZXQgKysgXTtcblx0XHRcdFx0XHRcdFx0aGV4ID0gY29sb3JzWyBjb2xvckluZGV4IF07XG5cblx0XHRcdFx0XHRcdFx0aWYgKCBpICE9PSAyICkgZmFjZUEudmVydGV4Q29sb3JzLnB1c2goIG5ldyBDb2xvciggaGV4ICkgKTtcblx0XHRcdFx0XHRcdFx0aWYgKCBpICE9PSAwICkgZmFjZUIudmVydGV4Q29sb3JzLnB1c2goIG5ldyBDb2xvciggaGV4ICkgKTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Z2VvbWV0cnkuZmFjZXMucHVzaCggZmFjZUEgKTtcblx0XHRcdFx0XHRnZW9tZXRyeS5mYWNlcy5wdXNoKCBmYWNlQiApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRmYWNlID0gbmV3IEZhY2UzKCk7XG5cdFx0XHRcdFx0ZmFjZS5hID0gZmFjZXNbIG9mZnNldCArKyBdO1xuXHRcdFx0XHRcdGZhY2UuYiA9IGZhY2VzWyBvZmZzZXQgKysgXTtcblx0XHRcdFx0XHRmYWNlLmMgPSBmYWNlc1sgb2Zmc2V0ICsrIF07XG5cblx0XHRcdFx0XHRpZiAoIGhhc01hdGVyaWFsICkge1xuXG5cdFx0XHRcdFx0XHRtYXRlcmlhbEluZGV4ID0gZmFjZXNbIG9mZnNldCArKyBdO1xuXHRcdFx0XHRcdFx0ZmFjZS5tYXRlcmlhbEluZGV4ID0gbWF0ZXJpYWxJbmRleDtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIHRvIGdldCBmYWNlIDw9PiB1diBpbmRleCBjb3JyZXNwb25kZW5jZVxuXG5cdFx0XHRcdFx0ZmkgPSBnZW9tZXRyeS5mYWNlcy5sZW5ndGg7XG5cblx0XHRcdFx0XHRpZiAoIGhhc0ZhY2VWZXJ0ZXhVdiApIHtcblxuXHRcdFx0XHRcdFx0Zm9yICggaSA9IDA7IGkgPCBuVXZMYXllcnM7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdFx0dXZMYXllciA9IGpzb24udXZzWyBpIF07XG5cblx0XHRcdFx0XHRcdFx0Z2VvbWV0cnkuZmFjZVZlcnRleFV2c1sgaSBdWyBmaSBdID0gW107XG5cblx0XHRcdFx0XHRcdFx0Zm9yICggaiA9IDA7IGogPCAzOyBqICsrICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0dXZJbmRleCA9IGZhY2VzWyBvZmZzZXQgKysgXTtcblxuXHRcdFx0XHRcdFx0XHRcdHUgPSB1dkxheWVyWyB1dkluZGV4ICogMiBdO1xuXHRcdFx0XHRcdFx0XHRcdHYgPSB1dkxheWVyWyB1dkluZGV4ICogMiArIDEgXTtcblxuXHRcdFx0XHRcdFx0XHRcdHV2ID0gbmV3IFZlY3RvcjIoIHUsIHYgKTtcblxuXHRcdFx0XHRcdFx0XHRcdGdlb21ldHJ5LmZhY2VWZXJ0ZXhVdnNbIGkgXVsgZmkgXS5wdXNoKCB1diApO1xuXG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKCBoYXNGYWNlTm9ybWFsICkge1xuXG5cdFx0XHRcdFx0XHRub3JtYWxJbmRleCA9IGZhY2VzWyBvZmZzZXQgKysgXSAqIDM7XG5cblx0XHRcdFx0XHRcdGZhY2Uubm9ybWFsLnNldChcblx0XHRcdFx0XHRcdFx0bm9ybWFsc1sgbm9ybWFsSW5kZXggKysgXSxcblx0XHRcdFx0XHRcdFx0bm9ybWFsc1sgbm9ybWFsSW5kZXggKysgXSxcblx0XHRcdFx0XHRcdFx0bm9ybWFsc1sgbm9ybWFsSW5kZXggXVxuXHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmICggaGFzRmFjZVZlcnRleE5vcm1hbCApIHtcblxuXHRcdFx0XHRcdFx0Zm9yICggaSA9IDA7IGkgPCAzOyBpICsrICkge1xuXG5cdFx0XHRcdFx0XHRcdG5vcm1hbEluZGV4ID0gZmFjZXNbIG9mZnNldCArKyBdICogMztcblxuXHRcdFx0XHRcdFx0XHRub3JtYWwgPSBuZXcgVmVjdG9yMyhcblx0XHRcdFx0XHRcdFx0XHRub3JtYWxzWyBub3JtYWxJbmRleCArKyBdLFxuXHRcdFx0XHRcdFx0XHRcdG5vcm1hbHNbIG5vcm1hbEluZGV4ICsrIF0sXG5cdFx0XHRcdFx0XHRcdFx0bm9ybWFsc1sgbm9ybWFsSW5kZXggXVxuXHRcdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRcdGZhY2UudmVydGV4Tm9ybWFscy5wdXNoKCBub3JtYWwgKTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXG5cblx0XHRcdFx0XHRpZiAoIGhhc0ZhY2VDb2xvciApIHtcblxuXHRcdFx0XHRcdFx0Y29sb3JJbmRleCA9IGZhY2VzWyBvZmZzZXQgKysgXTtcblx0XHRcdFx0XHRcdGZhY2UuY29sb3Iuc2V0SGV4KCBjb2xvcnNbIGNvbG9ySW5kZXggXSApO1xuXG5cdFx0XHRcdFx0fVxuXG5cblx0XHRcdFx0XHRpZiAoIGhhc0ZhY2VWZXJ0ZXhDb2xvciApIHtcblxuXHRcdFx0XHRcdFx0Zm9yICggaSA9IDA7IGkgPCAzOyBpICsrICkge1xuXG5cdFx0XHRcdFx0XHRcdGNvbG9ySW5kZXggPSBmYWNlc1sgb2Zmc2V0ICsrIF07XG5cdFx0XHRcdFx0XHRcdGZhY2UudmVydGV4Q29sb3JzLnB1c2goIG5ldyBDb2xvciggY29sb3JzWyBjb2xvckluZGV4IF0gKSApO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRnZW9tZXRyeS5mYWNlcy5wdXNoKCBmYWNlICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBwYXJzZVNraW4oIGpzb24sIGdlb21ldHJ5ICkge1xuXG5cdFx0XHR2YXIgaW5mbHVlbmNlc1BlclZlcnRleCA9ICgganNvbi5pbmZsdWVuY2VzUGVyVmVydGV4ICE9PSB1bmRlZmluZWQgKSA/IGpzb24uaW5mbHVlbmNlc1BlclZlcnRleCA6IDI7XG5cblx0XHRcdGlmICgganNvbi5za2luV2VpZ2h0cyApIHtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBqc29uLnNraW5XZWlnaHRzLmxlbmd0aDsgaSA8IGw7IGkgKz0gaW5mbHVlbmNlc1BlclZlcnRleCApIHtcblxuXHRcdFx0XHRcdHZhciB4ID0ganNvbi5za2luV2VpZ2h0c1sgaSBdO1xuXHRcdFx0XHRcdHZhciB5ID0gKCBpbmZsdWVuY2VzUGVyVmVydGV4ID4gMSApID8ganNvbi5za2luV2VpZ2h0c1sgaSArIDEgXSA6IDA7XG5cdFx0XHRcdFx0dmFyIHogPSAoIGluZmx1ZW5jZXNQZXJWZXJ0ZXggPiAyICkgPyBqc29uLnNraW5XZWlnaHRzWyBpICsgMiBdIDogMDtcblx0XHRcdFx0XHR2YXIgdyA9ICggaW5mbHVlbmNlc1BlclZlcnRleCA+IDMgKSA/IGpzb24uc2tpbldlaWdodHNbIGkgKyAzIF0gOiAwO1xuXG5cdFx0XHRcdFx0Z2VvbWV0cnkuc2tpbldlaWdodHMucHVzaCggbmV3IFZlY3RvcjQoIHgsIHksIHosIHcgKSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGpzb24uc2tpbkluZGljZXMgKSB7XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0ganNvbi5za2luSW5kaWNlcy5sZW5ndGg7IGkgPCBsOyBpICs9IGluZmx1ZW5jZXNQZXJWZXJ0ZXggKSB7XG5cblx0XHRcdFx0XHR2YXIgYSA9IGpzb24uc2tpbkluZGljZXNbIGkgXTtcblx0XHRcdFx0XHR2YXIgYiA9ICggaW5mbHVlbmNlc1BlclZlcnRleCA+IDEgKSA/IGpzb24uc2tpbkluZGljZXNbIGkgKyAxIF0gOiAwO1xuXHRcdFx0XHRcdHZhciBjID0gKCBpbmZsdWVuY2VzUGVyVmVydGV4ID4gMiApID8ganNvbi5za2luSW5kaWNlc1sgaSArIDIgXSA6IDA7XG5cdFx0XHRcdFx0dmFyIGQgPSAoIGluZmx1ZW5jZXNQZXJWZXJ0ZXggPiAzICkgPyBqc29uLnNraW5JbmRpY2VzWyBpICsgMyBdIDogMDtcblxuXHRcdFx0XHRcdGdlb21ldHJ5LnNraW5JbmRpY2VzLnB1c2goIG5ldyBWZWN0b3I0KCBhLCBiLCBjLCBkICkgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0Z2VvbWV0cnkuYm9uZXMgPSBqc29uLmJvbmVzO1xuXG5cdFx0XHRpZiAoIGdlb21ldHJ5LmJvbmVzICYmIGdlb21ldHJ5LmJvbmVzLmxlbmd0aCA+IDAgJiYgKCBnZW9tZXRyeS5za2luV2VpZ2h0cy5sZW5ndGggIT09IGdlb21ldHJ5LnNraW5JbmRpY2VzLmxlbmd0aCB8fCBnZW9tZXRyeS5za2luSW5kaWNlcy5sZW5ndGggIT09IGdlb21ldHJ5LnZlcnRpY2VzLmxlbmd0aCApICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1doZW4gc2tpbm5pbmcsIG51bWJlciBvZiB2ZXJ0aWNlcyAoJyArIGdlb21ldHJ5LnZlcnRpY2VzLmxlbmd0aCArICcpLCBza2luSW5kaWNlcyAoJyArXG5cdFx0XHRcdFx0Z2VvbWV0cnkuc2tpbkluZGljZXMubGVuZ3RoICsgJyksIGFuZCBza2luV2VpZ2h0cyAoJyArIGdlb21ldHJ5LnNraW5XZWlnaHRzLmxlbmd0aCArICcpIHNob3VsZCBtYXRjaC4nICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIHBhcnNlTW9ycGhpbmcoIGpzb24sIGdlb21ldHJ5ICkge1xuXG5cdFx0XHR2YXIgc2NhbGUgPSBqc29uLnNjYWxlO1xuXG5cdFx0XHRpZiAoIGpzb24ubW9ycGhUYXJnZXRzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0ganNvbi5tb3JwaFRhcmdldHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdGdlb21ldHJ5Lm1vcnBoVGFyZ2V0c1sgaSBdID0ge307XG5cdFx0XHRcdFx0Z2VvbWV0cnkubW9ycGhUYXJnZXRzWyBpIF0ubmFtZSA9IGpzb24ubW9ycGhUYXJnZXRzWyBpIF0ubmFtZTtcblx0XHRcdFx0XHRnZW9tZXRyeS5tb3JwaFRhcmdldHNbIGkgXS52ZXJ0aWNlcyA9IFtdO1xuXG5cdFx0XHRcdFx0dmFyIGRzdFZlcnRpY2VzID0gZ2VvbWV0cnkubW9ycGhUYXJnZXRzWyBpIF0udmVydGljZXM7XG5cdFx0XHRcdFx0dmFyIHNyY1ZlcnRpY2VzID0ganNvbi5tb3JwaFRhcmdldHNbIGkgXS52ZXJ0aWNlcztcblxuXHRcdFx0XHRcdGZvciAoIHZhciB2ID0gMCwgdmwgPSBzcmNWZXJ0aWNlcy5sZW5ndGg7IHYgPCB2bDsgdiArPSAzICkge1xuXG5cdFx0XHRcdFx0XHR2YXIgdmVydGV4ID0gbmV3IFZlY3RvcjMoKTtcblx0XHRcdFx0XHRcdHZlcnRleC54ID0gc3JjVmVydGljZXNbIHYgXSAqIHNjYWxlO1xuXHRcdFx0XHRcdFx0dmVydGV4LnkgPSBzcmNWZXJ0aWNlc1sgdiArIDEgXSAqIHNjYWxlO1xuXHRcdFx0XHRcdFx0dmVydGV4LnogPSBzcmNWZXJ0aWNlc1sgdiArIDIgXSAqIHNjYWxlO1xuXG5cdFx0XHRcdFx0XHRkc3RWZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXggKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBqc29uLm1vcnBoQ29sb3JzICE9PSB1bmRlZmluZWQgJiYganNvbi5tb3JwaENvbG9ycy5sZW5ndGggPiAwICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkpTT05Mb2FkZXI6IFwibW9ycGhDb2xvcnNcIiBubyBsb25nZXIgc3VwcG9ydGVkLiBVc2luZyB0aGVtIGFzIGZhY2UgY29sb3JzLicgKTtcblxuXHRcdFx0XHR2YXIgZmFjZXMgPSBnZW9tZXRyeS5mYWNlcztcblx0XHRcdFx0dmFyIG1vcnBoQ29sb3JzID0ganNvbi5tb3JwaENvbG9yc1sgMCBdLmNvbG9ycztcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBmYWNlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0ZmFjZXNbIGkgXS5jb2xvci5mcm9tQXJyYXkoIG1vcnBoQ29sb3JzLCBpICogMyApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gcGFyc2VBbmltYXRpb25zKCBqc29uLCBnZW9tZXRyeSApIHtcblxuXHRcdFx0dmFyIG91dHB1dEFuaW1hdGlvbnMgPSBbXTtcblxuXHRcdFx0Ly8gcGFyc2Ugb2xkIHN0eWxlIEJvbmUvSGllcmFyY2h5IGFuaW1hdGlvbnNcblx0XHRcdHZhciBhbmltYXRpb25zID0gW107XG5cblx0XHRcdGlmICgganNvbi5hbmltYXRpb24gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRhbmltYXRpb25zLnB1c2goIGpzb24uYW5pbWF0aW9uICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBqc29uLmFuaW1hdGlvbnMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRpZiAoIGpzb24uYW5pbWF0aW9ucy5sZW5ndGggKSB7XG5cblx0XHRcdFx0XHRhbmltYXRpb25zID0gYW5pbWF0aW9ucy5jb25jYXQoIGpzb24uYW5pbWF0aW9ucyApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRhbmltYXRpb25zLnB1c2goIGpzb24uYW5pbWF0aW9ucyApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBhbmltYXRpb25zLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0XHR2YXIgY2xpcCA9IEFuaW1hdGlvbkNsaXAucGFyc2VBbmltYXRpb24oIGFuaW1hdGlvbnNbIGkgXSwgZ2VvbWV0cnkuYm9uZXMgKTtcblx0XHRcdFx0aWYgKCBjbGlwICkgb3V0cHV0QW5pbWF0aW9ucy5wdXNoKCBjbGlwICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gcGFyc2UgaW1wbGljaXQgbW9ycGggYW5pbWF0aW9uc1xuXHRcdFx0aWYgKCBnZW9tZXRyeS5tb3JwaFRhcmdldHMgKSB7XG5cblx0XHRcdFx0Ly8gVE9ETzogRmlndXJlIG91dCB3aGF0IGFuIGFwcHJvcHJhaXRlIEZQUyBpcyBmb3IgbW9ycGggdGFyZ2V0IGFuaW1hdGlvbnMgLS0gZGVmYXVsdGluZyB0byAxMCwgYnV0IHJlYWxseSBpdCBpcyBjb21wbGV0ZWx5IGFyYml0cmFyeS5cblx0XHRcdFx0dmFyIG1vcnBoQW5pbWF0aW9uQ2xpcHMgPSBBbmltYXRpb25DbGlwLkNyZWF0ZUNsaXBzRnJvbU1vcnBoVGFyZ2V0U2VxdWVuY2VzKCBnZW9tZXRyeS5tb3JwaFRhcmdldHMsIDEwICk7XG5cdFx0XHRcdG91dHB1dEFuaW1hdGlvbnMgPSBvdXRwdXRBbmltYXRpb25zLmNvbmNhdCggbW9ycGhBbmltYXRpb25DbGlwcyApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggb3V0cHV0QW5pbWF0aW9ucy5sZW5ndGggPiAwICkgZ2VvbWV0cnkuYW5pbWF0aW9ucyA9IG91dHB1dEFuaW1hdGlvbnM7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gcGFyc2UoIGpzb24sIHRleHR1cmVQYXRoICkge1xuXG5cdFx0XHRpZiAoIGpzb24uZGF0YSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdC8vIEdlb21ldHJ5IDQuMCBzcGVjXG5cdFx0XHRcdGpzb24gPSBqc29uLmRhdGE7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBqc29uLnNjYWxlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0anNvbi5zY2FsZSA9IDEuMCAvIGpzb24uc2NhbGU7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0anNvbi5zY2FsZSA9IDEuMDtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgZ2VvbWV0cnkgPSBuZXcgR2VvbWV0cnkoKTtcblxuXHRcdFx0cGFyc2VNb2RlbCgganNvbiwgZ2VvbWV0cnkgKTtcblx0XHRcdHBhcnNlU2tpbigganNvbiwgZ2VvbWV0cnkgKTtcblx0XHRcdHBhcnNlTW9ycGhpbmcoIGpzb24sIGdlb21ldHJ5ICk7XG5cdFx0XHRwYXJzZUFuaW1hdGlvbnMoIGpzb24sIGdlb21ldHJ5ICk7XG5cblx0XHRcdGdlb21ldHJ5LmNvbXB1dGVGYWNlTm9ybWFscygpO1xuXHRcdFx0Z2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7XG5cblx0XHRcdGlmICgganNvbi5tYXRlcmlhbHMgPT09IHVuZGVmaW5lZCB8fCBqc29uLm1hdGVyaWFscy5sZW5ndGggPT09IDAgKSB7XG5cblx0XHRcdFx0cmV0dXJuIHsgZ2VvbWV0cnk6IGdlb21ldHJ5IH07XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0dmFyIG1hdGVyaWFscyA9IExvYWRlci5wcm90b3R5cGUuaW5pdE1hdGVyaWFscygganNvbi5tYXRlcmlhbHMsIHRleHR1cmVQYXRoLCB0aGlzLmNyb3NzT3JpZ2luICk7XG5cblx0XHRcdFx0cmV0dXJuIHsgZ2VvbWV0cnk6IGdlb21ldHJ5LCBtYXRlcmlhbHM6IG1hdGVyaWFscyB9O1xuXG5cdFx0XHR9XG5cblx0XHR9O1xuXG5cdH0gKSgpXG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIE9iamVjdExvYWRlciggbWFuYWdlciApIHtcblxuXHR0aGlzLm1hbmFnZXIgPSAoIG1hbmFnZXIgIT09IHVuZGVmaW5lZCApID8gbWFuYWdlciA6IERlZmF1bHRMb2FkaW5nTWFuYWdlcjtcblx0dGhpcy50ZXh0dXJlUGF0aCA9ICcnO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIE9iamVjdExvYWRlci5wcm90b3R5cGUsIHtcblxuXHRsb2FkOiBmdW5jdGlvbiAoIHVybCwgb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkge1xuXG5cdFx0aWYgKCB0aGlzLnRleHR1cmVQYXRoID09PSAnJyApIHtcblxuXHRcdFx0dGhpcy50ZXh0dXJlUGF0aCA9IHVybC5zdWJzdHJpbmcoIDAsIHVybC5sYXN0SW5kZXhPZiggJy8nICkgKyAxICk7XG5cblx0XHR9XG5cblx0XHR2YXIgc2NvcGUgPSB0aGlzO1xuXG5cdFx0dmFyIGxvYWRlciA9IG5ldyBGaWxlTG9hZGVyKCBzY29wZS5tYW5hZ2VyICk7XG5cdFx0bG9hZGVyLmxvYWQoIHVybCwgZnVuY3Rpb24gKCB0ZXh0ICkge1xuXG5cdFx0XHR2YXIganNvbiA9IG51bGw7XG5cblx0XHRcdHRyeSB7XG5cblx0XHRcdFx0anNvbiA9IEpTT04ucGFyc2UoIHRleHQgKTtcblxuXHRcdFx0fSBjYXRjaCAoIGVycm9yICkge1xuXG5cdFx0XHRcdGlmICggb25FcnJvciAhPT0gdW5kZWZpbmVkICkgb25FcnJvciggZXJyb3IgKTtcblxuXHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUU6T2JqZWN0TG9hZGVyOiBDYW5cXCd0IHBhcnNlICcgKyB1cmwgKyAnLicsIGVycm9yLm1lc3NhZ2UgKTtcblxuXHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIG1ldGFkYXRhID0ganNvbi5tZXRhZGF0YTtcblxuXHRcdFx0aWYgKCBtZXRhZGF0YSA9PT0gdW5kZWZpbmVkIHx8IG1ldGFkYXRhLnR5cGUgPT09IHVuZGVmaW5lZCB8fCBtZXRhZGF0YS50eXBlLnRvTG93ZXJDYXNlKCkgPT09ICdnZW9tZXRyeScgKSB7XG5cblx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLk9iamVjdExvYWRlcjogQ2FuXFwndCBsb2FkICcgKyB1cmwgKyAnLiBVc2UgVEhSRUUuSlNPTkxvYWRlciBpbnN0ZWFkLicgKTtcblx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHR9XG5cblx0XHRcdHNjb3BlLnBhcnNlKCBqc29uLCBvbkxvYWQgKTtcblxuXHRcdH0sIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKTtcblxuXHR9LFxuXG5cdHNldFRleHR1cmVQYXRoOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy50ZXh0dXJlUGF0aCA9IHZhbHVlO1xuXG5cdH0sXG5cblx0c2V0Q3Jvc3NPcmlnaW46IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLmNyb3NzT3JpZ2luID0gdmFsdWU7XG5cblx0fSxcblxuXHRwYXJzZTogZnVuY3Rpb24gKCBqc29uLCBvbkxvYWQgKSB7XG5cblx0XHR2YXIgc2hhcGVzID0gdGhpcy5wYXJzZVNoYXBlKCBqc29uLnNoYXBlcyApO1xuXHRcdHZhciBnZW9tZXRyaWVzID0gdGhpcy5wYXJzZUdlb21ldHJpZXMoIGpzb24uZ2VvbWV0cmllcywgc2hhcGVzICk7XG5cblx0XHR2YXIgaW1hZ2VzID0gdGhpcy5wYXJzZUltYWdlcygganNvbi5pbWFnZXMsIGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0aWYgKCBvbkxvYWQgIT09IHVuZGVmaW5lZCApIG9uTG9hZCggb2JqZWN0ICk7XG5cblx0XHR9ICk7XG5cblx0XHR2YXIgdGV4dHVyZXMgPSB0aGlzLnBhcnNlVGV4dHVyZXMoIGpzb24udGV4dHVyZXMsIGltYWdlcyApO1xuXHRcdHZhciBtYXRlcmlhbHMgPSB0aGlzLnBhcnNlTWF0ZXJpYWxzKCBqc29uLm1hdGVyaWFscywgdGV4dHVyZXMgKTtcblxuXHRcdHZhciBvYmplY3QgPSB0aGlzLnBhcnNlT2JqZWN0KCBqc29uLm9iamVjdCwgZ2VvbWV0cmllcywgbWF0ZXJpYWxzICk7XG5cblx0XHRpZiAoIGpzb24uYW5pbWF0aW9ucyApIHtcblxuXHRcdFx0b2JqZWN0LmFuaW1hdGlvbnMgPSB0aGlzLnBhcnNlQW5pbWF0aW9ucygganNvbi5hbmltYXRpb25zICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIGpzb24uaW1hZ2VzID09PSB1bmRlZmluZWQgfHwganNvbi5pbWFnZXMubGVuZ3RoID09PSAwICkge1xuXG5cdFx0XHRpZiAoIG9uTG9hZCAhPT0gdW5kZWZpbmVkICkgb25Mb2FkKCBvYmplY3QgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBvYmplY3Q7XG5cblx0fSxcblxuXHRwYXJzZVNoYXBlOiBmdW5jdGlvbiAoIGpzb24gKSB7XG5cblx0XHR2YXIgc2hhcGVzID0ge307XG5cblx0XHRpZiAoIGpzb24gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0ganNvbi5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdHZhciBzaGFwZSA9IG5ldyBTaGFwZSgpLmZyb21KU09OKCBqc29uWyBpIF0gKTtcblxuXHRcdFx0XHRzaGFwZXNbIHNoYXBlLnV1aWQgXSA9IHNoYXBlO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gc2hhcGVzO1xuXG5cdH0sXG5cblx0cGFyc2VHZW9tZXRyaWVzOiBmdW5jdGlvbiAoIGpzb24sIHNoYXBlcyApIHtcblxuXHRcdHZhciBnZW9tZXRyaWVzID0ge307XG5cblx0XHRpZiAoIGpzb24gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dmFyIGdlb21ldHJ5TG9hZGVyID0gbmV3IEpTT05Mb2FkZXIoKTtcblx0XHRcdHZhciBidWZmZXJHZW9tZXRyeUxvYWRlciA9IG5ldyBCdWZmZXJHZW9tZXRyeUxvYWRlcigpO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBqc29uLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0dmFyIGdlb21ldHJ5O1xuXHRcdFx0XHR2YXIgZGF0YSA9IGpzb25bIGkgXTtcblxuXHRcdFx0XHRzd2l0Y2ggKCBkYXRhLnR5cGUgKSB7XG5cblx0XHRcdFx0XHRjYXNlICdQbGFuZUdlb21ldHJ5Jzpcblx0XHRcdFx0XHRjYXNlICdQbGFuZUJ1ZmZlckdlb21ldHJ5JzpcblxuXHRcdFx0XHRcdFx0Z2VvbWV0cnkgPSBuZXcgR2VvbWV0cmllc1sgZGF0YS50eXBlIF0oXG5cdFx0XHRcdFx0XHRcdGRhdGEud2lkdGgsXG5cdFx0XHRcdFx0XHRcdGRhdGEuaGVpZ2h0LFxuXHRcdFx0XHRcdFx0XHRkYXRhLndpZHRoU2VnbWVudHMsXG5cdFx0XHRcdFx0XHRcdGRhdGEuaGVpZ2h0U2VnbWVudHNcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSAnQm94R2VvbWV0cnknOlxuXHRcdFx0XHRcdGNhc2UgJ0JveEJ1ZmZlckdlb21ldHJ5Jzpcblx0XHRcdFx0XHRjYXNlICdDdWJlR2VvbWV0cnknOiAvLyBiYWNrd2FyZHMgY29tcGF0aWJsZVxuXG5cdFx0XHRcdFx0XHRnZW9tZXRyeSA9IG5ldyBHZW9tZXRyaWVzWyBkYXRhLnR5cGUgXShcblx0XHRcdFx0XHRcdFx0ZGF0YS53aWR0aCxcblx0XHRcdFx0XHRcdFx0ZGF0YS5oZWlnaHQsXG5cdFx0XHRcdFx0XHRcdGRhdGEuZGVwdGgsXG5cdFx0XHRcdFx0XHRcdGRhdGEud2lkdGhTZWdtZW50cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5oZWlnaHRTZWdtZW50cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5kZXB0aFNlZ21lbnRzXG5cdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgJ0NpcmNsZUdlb21ldHJ5Jzpcblx0XHRcdFx0XHRjYXNlICdDaXJjbGVCdWZmZXJHZW9tZXRyeSc6XG5cblx0XHRcdFx0XHRcdGdlb21ldHJ5ID0gbmV3IEdlb21ldHJpZXNbIGRhdGEudHlwZSBdKFxuXHRcdFx0XHRcdFx0XHRkYXRhLnJhZGl1cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5zZWdtZW50cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS50aGV0YVN0YXJ0LFxuXHRcdFx0XHRcdFx0XHRkYXRhLnRoZXRhTGVuZ3RoXG5cdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgJ0N5bGluZGVyR2VvbWV0cnknOlxuXHRcdFx0XHRcdGNhc2UgJ0N5bGluZGVyQnVmZmVyR2VvbWV0cnknOlxuXG5cdFx0XHRcdFx0XHRnZW9tZXRyeSA9IG5ldyBHZW9tZXRyaWVzWyBkYXRhLnR5cGUgXShcblx0XHRcdFx0XHRcdFx0ZGF0YS5yYWRpdXNUb3AsXG5cdFx0XHRcdFx0XHRcdGRhdGEucmFkaXVzQm90dG9tLFxuXHRcdFx0XHRcdFx0XHRkYXRhLmhlaWdodCxcblx0XHRcdFx0XHRcdFx0ZGF0YS5yYWRpYWxTZWdtZW50cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5oZWlnaHRTZWdtZW50cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5vcGVuRW5kZWQsXG5cdFx0XHRcdFx0XHRcdGRhdGEudGhldGFTdGFydCxcblx0XHRcdFx0XHRcdFx0ZGF0YS50aGV0YUxlbmd0aFxuXHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlICdDb25lR2VvbWV0cnknOlxuXHRcdFx0XHRcdGNhc2UgJ0NvbmVCdWZmZXJHZW9tZXRyeSc6XG5cblx0XHRcdFx0XHRcdGdlb21ldHJ5ID0gbmV3IEdlb21ldHJpZXNbIGRhdGEudHlwZSBdKFxuXHRcdFx0XHRcdFx0XHRkYXRhLnJhZGl1cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5oZWlnaHQsXG5cdFx0XHRcdFx0XHRcdGRhdGEucmFkaWFsU2VnbWVudHMsXG5cdFx0XHRcdFx0XHRcdGRhdGEuaGVpZ2h0U2VnbWVudHMsXG5cdFx0XHRcdFx0XHRcdGRhdGEub3BlbkVuZGVkLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnRoZXRhU3RhcnQsXG5cdFx0XHRcdFx0XHRcdGRhdGEudGhldGFMZW5ndGhcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSAnU3BoZXJlR2VvbWV0cnknOlxuXHRcdFx0XHRcdGNhc2UgJ1NwaGVyZUJ1ZmZlckdlb21ldHJ5JzpcblxuXHRcdFx0XHRcdFx0Z2VvbWV0cnkgPSBuZXcgR2VvbWV0cmllc1sgZGF0YS50eXBlIF0oXG5cdFx0XHRcdFx0XHRcdGRhdGEucmFkaXVzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLndpZHRoU2VnbWVudHMsXG5cdFx0XHRcdFx0XHRcdGRhdGEuaGVpZ2h0U2VnbWVudHMsXG5cdFx0XHRcdFx0XHRcdGRhdGEucGhpU3RhcnQsXG5cdFx0XHRcdFx0XHRcdGRhdGEucGhpTGVuZ3RoLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnRoZXRhU3RhcnQsXG5cdFx0XHRcdFx0XHRcdGRhdGEudGhldGFMZW5ndGhcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSAnRG9kZWNhaGVkcm9uR2VvbWV0cnknOlxuXHRcdFx0XHRcdGNhc2UgJ0RvZGVjYWhlZHJvbkJ1ZmZlckdlb21ldHJ5Jzpcblx0XHRcdFx0XHRjYXNlICdJY29zYWhlZHJvbkdlb21ldHJ5Jzpcblx0XHRcdFx0XHRjYXNlICdJY29zYWhlZHJvbkJ1ZmZlckdlb21ldHJ5Jzpcblx0XHRcdFx0XHRjYXNlICdPY3RhaGVkcm9uR2VvbWV0cnknOlxuXHRcdFx0XHRcdGNhc2UgJ09jdGFoZWRyb25CdWZmZXJHZW9tZXRyeSc6XG5cdFx0XHRcdFx0Y2FzZSAnVGV0cmFoZWRyb25HZW9tZXRyeSc6XG5cdFx0XHRcdFx0Y2FzZSAnVGV0cmFoZWRyb25CdWZmZXJHZW9tZXRyeSc6XG5cblx0XHRcdFx0XHRcdGdlb21ldHJ5ID0gbmV3IEdlb21ldHJpZXNbIGRhdGEudHlwZSBdKFxuXHRcdFx0XHRcdFx0XHRkYXRhLnJhZGl1cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5kZXRhaWxcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSAnUmluZ0dlb21ldHJ5Jzpcblx0XHRcdFx0XHRjYXNlICdSaW5nQnVmZmVyR2VvbWV0cnknOlxuXG5cdFx0XHRcdFx0XHRnZW9tZXRyeSA9IG5ldyBHZW9tZXRyaWVzWyBkYXRhLnR5cGUgXShcblx0XHRcdFx0XHRcdFx0ZGF0YS5pbm5lclJhZGl1cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5vdXRlclJhZGl1cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS50aGV0YVNlZ21lbnRzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnBoaVNlZ21lbnRzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnRoZXRhU3RhcnQsXG5cdFx0XHRcdFx0XHRcdGRhdGEudGhldGFMZW5ndGhcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSAnVG9ydXNHZW9tZXRyeSc6XG5cdFx0XHRcdFx0Y2FzZSAnVG9ydXNCdWZmZXJHZW9tZXRyeSc6XG5cblx0XHRcdFx0XHRcdGdlb21ldHJ5ID0gbmV3IEdlb21ldHJpZXNbIGRhdGEudHlwZSBdKFxuXHRcdFx0XHRcdFx0XHRkYXRhLnJhZGl1cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS50dWJlLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnJhZGlhbFNlZ21lbnRzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnR1YnVsYXJTZWdtZW50cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5hcmNcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSAnVG9ydXNLbm90R2VvbWV0cnknOlxuXHRcdFx0XHRcdGNhc2UgJ1RvcnVzS25vdEJ1ZmZlckdlb21ldHJ5JzpcblxuXHRcdFx0XHRcdFx0Z2VvbWV0cnkgPSBuZXcgR2VvbWV0cmllc1sgZGF0YS50eXBlIF0oXG5cdFx0XHRcdFx0XHRcdGRhdGEucmFkaXVzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnR1YmUsXG5cdFx0XHRcdFx0XHRcdGRhdGEudHVidWxhclNlZ21lbnRzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnJhZGlhbFNlZ21lbnRzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnAsXG5cdFx0XHRcdFx0XHRcdGRhdGEucVxuXHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlICdMYXRoZUdlb21ldHJ5Jzpcblx0XHRcdFx0XHRjYXNlICdMYXRoZUJ1ZmZlckdlb21ldHJ5JzpcblxuXHRcdFx0XHRcdFx0Z2VvbWV0cnkgPSBuZXcgR2VvbWV0cmllc1sgZGF0YS50eXBlIF0oXG5cdFx0XHRcdFx0XHRcdGRhdGEucG9pbnRzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnNlZ21lbnRzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnBoaVN0YXJ0LFxuXHRcdFx0XHRcdFx0XHRkYXRhLnBoaUxlbmd0aFxuXHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlICdQb2x5aGVkcm9uR2VvbWV0cnknOlxuXHRcdFx0XHRcdGNhc2UgJ1BvbHloZWRyb25CdWZmZXJHZW9tZXRyeSc6XG5cblx0XHRcdFx0XHRcdGdlb21ldHJ5ID0gbmV3IEdlb21ldHJpZXNbIGRhdGEudHlwZSBdKFxuXHRcdFx0XHRcdFx0XHRkYXRhLnZlcnRpY2VzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLmluZGljZXMsXG5cdFx0XHRcdFx0XHRcdGRhdGEucmFkaXVzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLmRldGFpbHNcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSAnU2hhcGVHZW9tZXRyeSc6XG5cdFx0XHRcdFx0Y2FzZSAnU2hhcGVCdWZmZXJHZW9tZXRyeSc6XG5cblx0XHRcdFx0XHRcdHZhciBnZW9tZXRyeVNoYXBlcyA9IFtdO1xuXG5cdFx0XHRcdFx0XHRmb3IgKCB2YXIgaiA9IDAsIGpsID0gZGF0YS5zaGFwZXMubGVuZ3RoOyBqIDwgamw7IGogKysgKSB7XG5cblx0XHRcdFx0XHRcdFx0dmFyIHNoYXBlID0gc2hhcGVzWyBkYXRhLnNoYXBlc1sgaiBdIF07XG5cblx0XHRcdFx0XHRcdFx0Z2VvbWV0cnlTaGFwZXMucHVzaCggc2hhcGUgKTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRnZW9tZXRyeSA9IG5ldyBHZW9tZXRyaWVzWyBkYXRhLnR5cGUgXShcblx0XHRcdFx0XHRcdFx0Z2VvbWV0cnlTaGFwZXMsXG5cdFx0XHRcdFx0XHRcdGRhdGEuY3VydmVTZWdtZW50c1xuXHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlICdCdWZmZXJHZW9tZXRyeSc6XG5cblx0XHRcdFx0XHRcdGdlb21ldHJ5ID0gYnVmZmVyR2VvbWV0cnlMb2FkZXIucGFyc2UoIGRhdGEgKTtcblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlICdHZW9tZXRyeSc6XG5cblx0XHRcdFx0XHRcdGdlb21ldHJ5ID0gZ2VvbWV0cnlMb2FkZXIucGFyc2UoIGRhdGEsIHRoaXMudGV4dHVyZVBhdGggKS5nZW9tZXRyeTtcblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRkZWZhdWx0OlxuXG5cdFx0XHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3RMb2FkZXI6IFVuc3VwcG9ydGVkIGdlb21ldHJ5IHR5cGUgXCInICsgZGF0YS50eXBlICsgJ1wiJyApO1xuXG5cdFx0XHRcdFx0XHRjb250aW51ZTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Z2VvbWV0cnkudXVpZCA9IGRhdGEudXVpZDtcblxuXHRcdFx0XHRpZiAoIGRhdGEubmFtZSAhPT0gdW5kZWZpbmVkICkgZ2VvbWV0cnkubmFtZSA9IGRhdGEubmFtZTtcblxuXHRcdFx0XHRnZW9tZXRyaWVzWyBkYXRhLnV1aWQgXSA9IGdlb21ldHJ5O1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gZ2VvbWV0cmllcztcblxuXHR9LFxuXG5cdHBhcnNlTWF0ZXJpYWxzOiBmdW5jdGlvbiAoIGpzb24sIHRleHR1cmVzICkge1xuXG5cdFx0dmFyIG1hdGVyaWFscyA9IHt9O1xuXG5cdFx0aWYgKCBqc29uICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHZhciBsb2FkZXIgPSBuZXcgTWF0ZXJpYWxMb2FkZXIoKTtcblx0XHRcdGxvYWRlci5zZXRUZXh0dXJlcyggdGV4dHVyZXMgKTtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0ganNvbi5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdHZhciBkYXRhID0ganNvblsgaSBdO1xuXG5cdFx0XHRcdGlmICggZGF0YS50eXBlID09PSAnTXVsdGlNYXRlcmlhbCcgKSB7XG5cblx0XHRcdFx0XHQvLyBEZXByZWNhdGVkXG5cblx0XHRcdFx0XHR2YXIgYXJyYXkgPSBbXTtcblxuXHRcdFx0XHRcdGZvciAoIHZhciBqID0gMDsgaiA8IGRhdGEubWF0ZXJpYWxzLmxlbmd0aDsgaiArKyApIHtcblxuXHRcdFx0XHRcdFx0YXJyYXkucHVzaCggbG9hZGVyLnBhcnNlKCBkYXRhLm1hdGVyaWFsc1sgaiBdICkgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdG1hdGVyaWFsc1sgZGF0YS51dWlkIF0gPSBhcnJheTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0bWF0ZXJpYWxzWyBkYXRhLnV1aWQgXSA9IGxvYWRlci5wYXJzZSggZGF0YSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIG1hdGVyaWFscztcblxuXHR9LFxuXG5cdHBhcnNlQW5pbWF0aW9uczogZnVuY3Rpb24gKCBqc29uICkge1xuXG5cdFx0dmFyIGFuaW1hdGlvbnMgPSBbXTtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGpzb24ubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHR2YXIgY2xpcCA9IEFuaW1hdGlvbkNsaXAucGFyc2UoIGpzb25bIGkgXSApO1xuXG5cdFx0XHRhbmltYXRpb25zLnB1c2goIGNsaXAgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBhbmltYXRpb25zO1xuXG5cdH0sXG5cblx0cGFyc2VJbWFnZXM6IGZ1bmN0aW9uICgganNvbiwgb25Mb2FkICkge1xuXG5cdFx0dmFyIHNjb3BlID0gdGhpcztcblx0XHR2YXIgaW1hZ2VzID0ge307XG5cblx0XHRmdW5jdGlvbiBsb2FkSW1hZ2UoIHVybCApIHtcblxuXHRcdFx0c2NvcGUubWFuYWdlci5pdGVtU3RhcnQoIHVybCApO1xuXG5cdFx0XHRyZXR1cm4gbG9hZGVyLmxvYWQoIHVybCwgZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7XG5cblx0XHRcdH0sIHVuZGVmaW5lZCwgZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7XG5cdFx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVycm9yKCB1cmwgKTtcblxuXHRcdFx0fSApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBqc29uICE9PSB1bmRlZmluZWQgJiYganNvbi5sZW5ndGggPiAwICkge1xuXG5cdFx0XHR2YXIgbWFuYWdlciA9IG5ldyBMb2FkaW5nTWFuYWdlciggb25Mb2FkICk7XG5cblx0XHRcdHZhciBsb2FkZXIgPSBuZXcgSW1hZ2VMb2FkZXIoIG1hbmFnZXIgKTtcblx0XHRcdGxvYWRlci5zZXRDcm9zc09yaWdpbiggdGhpcy5jcm9zc09yaWdpbiApO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBqc29uLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0dmFyIGltYWdlID0ganNvblsgaSBdO1xuXHRcdFx0XHR2YXIgcGF0aCA9IC9eKFxcL1xcLyl8KFthLXpdKzooXFwvXFwvKT8pL2kudGVzdCggaW1hZ2UudXJsICkgPyBpbWFnZS51cmwgOiBzY29wZS50ZXh0dXJlUGF0aCArIGltYWdlLnVybDtcblxuXHRcdFx0XHRpbWFnZXNbIGltYWdlLnV1aWQgXSA9IGxvYWRJbWFnZSggcGF0aCApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gaW1hZ2VzO1xuXG5cdH0sXG5cblx0cGFyc2VUZXh0dXJlczogZnVuY3Rpb24gKCBqc29uLCBpbWFnZXMgKSB7XG5cblx0XHRmdW5jdGlvbiBwYXJzZUNvbnN0YW50KCB2YWx1ZSwgdHlwZSApIHtcblxuXHRcdFx0aWYgKCB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICkgcmV0dXJuIHZhbHVlO1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3RMb2FkZXIucGFyc2VUZXh0dXJlOiBDb25zdGFudCBzaG91bGQgYmUgaW4gbnVtZXJpYyBmb3JtLicsIHZhbHVlICk7XG5cblx0XHRcdHJldHVybiB0eXBlWyB2YWx1ZSBdO1xuXG5cdFx0fVxuXG5cdFx0dmFyIHRleHR1cmVzID0ge307XG5cblx0XHRpZiAoIGpzb24gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0ganNvbi5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdHZhciBkYXRhID0ganNvblsgaSBdO1xuXG5cdFx0XHRcdGlmICggZGF0YS5pbWFnZSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0TG9hZGVyOiBObyBcImltYWdlXCIgc3BlY2lmaWVkIGZvcicsIGRhdGEudXVpZCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIGltYWdlc1sgZGF0YS5pbWFnZSBdID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3RMb2FkZXI6IFVuZGVmaW5lZCBpbWFnZScsIGRhdGEuaW1hZ2UgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dmFyIHRleHR1cmUgPSBuZXcgVGV4dHVyZSggaW1hZ2VzWyBkYXRhLmltYWdlIF0gKTtcblx0XHRcdFx0dGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdFx0dGV4dHVyZS51dWlkID0gZGF0YS51dWlkO1xuXG5cdFx0XHRcdGlmICggZGF0YS5uYW1lICE9PSB1bmRlZmluZWQgKSB0ZXh0dXJlLm5hbWUgPSBkYXRhLm5hbWU7XG5cblx0XHRcdFx0aWYgKCBkYXRhLm1hcHBpbmcgIT09IHVuZGVmaW5lZCApIHRleHR1cmUubWFwcGluZyA9IHBhcnNlQ29uc3RhbnQoIGRhdGEubWFwcGluZywgVEVYVFVSRV9NQVBQSU5HICk7XG5cblx0XHRcdFx0aWYgKCBkYXRhLm9mZnNldCAhPT0gdW5kZWZpbmVkICkgdGV4dHVyZS5vZmZzZXQuZnJvbUFycmF5KCBkYXRhLm9mZnNldCApO1xuXHRcdFx0XHRpZiAoIGRhdGEucmVwZWF0ICE9PSB1bmRlZmluZWQgKSB0ZXh0dXJlLnJlcGVhdC5mcm9tQXJyYXkoIGRhdGEucmVwZWF0ICk7XG5cdFx0XHRcdGlmICggZGF0YS5jZW50ZXIgIT09IHVuZGVmaW5lZCApIHRleHR1cmUuY2VudGVyLmZyb21BcnJheSggZGF0YS5jZW50ZXIgKTtcblx0XHRcdFx0aWYgKCBkYXRhLnJvdGF0aW9uICE9PSB1bmRlZmluZWQgKSB0ZXh0dXJlLnJvdGF0aW9uID0gZGF0YS5yb3RhdGlvbjtcblxuXHRcdFx0XHRpZiAoIGRhdGEud3JhcCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0dGV4dHVyZS53cmFwUyA9IHBhcnNlQ29uc3RhbnQoIGRhdGEud3JhcFsgMCBdLCBURVhUVVJFX1dSQVBQSU5HICk7XG5cdFx0XHRcdFx0dGV4dHVyZS53cmFwVCA9IHBhcnNlQ29uc3RhbnQoIGRhdGEud3JhcFsgMSBdLCBURVhUVVJFX1dSQVBQSU5HICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICggZGF0YS5mb3JtYXQgIT09IHVuZGVmaW5lZCApIHRleHR1cmUuZm9ybWF0ID0gZGF0YS5mb3JtYXQ7XG5cblx0XHRcdFx0aWYgKCBkYXRhLm1pbkZpbHRlciAhPT0gdW5kZWZpbmVkICkgdGV4dHVyZS5taW5GaWx0ZXIgPSBwYXJzZUNvbnN0YW50KCBkYXRhLm1pbkZpbHRlciwgVEVYVFVSRV9GSUxURVIgKTtcblx0XHRcdFx0aWYgKCBkYXRhLm1hZ0ZpbHRlciAhPT0gdW5kZWZpbmVkICkgdGV4dHVyZS5tYWdGaWx0ZXIgPSBwYXJzZUNvbnN0YW50KCBkYXRhLm1hZ0ZpbHRlciwgVEVYVFVSRV9GSUxURVIgKTtcblx0XHRcdFx0aWYgKCBkYXRhLmFuaXNvdHJvcHkgIT09IHVuZGVmaW5lZCApIHRleHR1cmUuYW5pc290cm9weSA9IGRhdGEuYW5pc290cm9weTtcblxuXHRcdFx0XHRpZiAoIGRhdGEuZmxpcFkgIT09IHVuZGVmaW5lZCApIHRleHR1cmUuZmxpcFkgPSBkYXRhLmZsaXBZO1xuXG5cdFx0XHRcdHRleHR1cmVzWyBkYXRhLnV1aWQgXSA9IHRleHR1cmU7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiB0ZXh0dXJlcztcblxuXHR9LFxuXG5cdHBhcnNlT2JqZWN0OiBmdW5jdGlvbiAoIGRhdGEsIGdlb21ldHJpZXMsIG1hdGVyaWFscyApIHtcblxuXHRcdHZhciBvYmplY3Q7XG5cblx0XHRmdW5jdGlvbiBnZXRHZW9tZXRyeSggbmFtZSApIHtcblxuXHRcdFx0aWYgKCBnZW9tZXRyaWVzWyBuYW1lIF0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3RMb2FkZXI6IFVuZGVmaW5lZCBnZW9tZXRyeScsIG5hbWUgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZ2VvbWV0cmllc1sgbmFtZSBdO1xuXG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gZ2V0TWF0ZXJpYWwoIG5hbWUgKSB7XG5cblx0XHRcdGlmICggbmFtZSA9PT0gdW5kZWZpbmVkICkgcmV0dXJuIHVuZGVmaW5lZDtcblxuXHRcdFx0aWYgKCBBcnJheS5pc0FycmF5KCBuYW1lICkgKSB7XG5cblx0XHRcdFx0dmFyIGFycmF5ID0gW107XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gbmFtZS5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0dmFyIHV1aWQgPSBuYW1lWyBpIF07XG5cblx0XHRcdFx0XHRpZiAoIG1hdGVyaWFsc1sgdXVpZCBdID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdExvYWRlcjogVW5kZWZpbmVkIG1hdGVyaWFsJywgdXVpZCApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0YXJyYXkucHVzaCggbWF0ZXJpYWxzWyB1dWlkIF0gKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIGFycmF5O1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggbWF0ZXJpYWxzWyBuYW1lIF0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3RMb2FkZXI6IFVuZGVmaW5lZCBtYXRlcmlhbCcsIG5hbWUgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gbWF0ZXJpYWxzWyBuYW1lIF07XG5cblx0XHR9XG5cblx0XHRzd2l0Y2ggKCBkYXRhLnR5cGUgKSB7XG5cblx0XHRcdGNhc2UgJ1NjZW5lJzpcblxuXHRcdFx0XHRvYmplY3QgPSBuZXcgU2NlbmUoKTtcblxuXHRcdFx0XHRpZiAoIGRhdGEuYmFja2dyb3VuZCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0aWYgKCBOdW1iZXIuaXNJbnRlZ2VyKCBkYXRhLmJhY2tncm91bmQgKSApIHtcblxuXHRcdFx0XHRcdFx0b2JqZWN0LmJhY2tncm91bmQgPSBuZXcgQ29sb3IoIGRhdGEuYmFja2dyb3VuZCApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIGRhdGEuZm9nICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRpZiAoIGRhdGEuZm9nLnR5cGUgPT09ICdGb2cnICkge1xuXG5cdFx0XHRcdFx0XHRvYmplY3QuZm9nID0gbmV3IEZvZyggZGF0YS5mb2cuY29sb3IsIGRhdGEuZm9nLm5lYXIsIGRhdGEuZm9nLmZhciApO1xuXG5cdFx0XHRcdFx0fSBlbHNlIGlmICggZGF0YS5mb2cudHlwZSA9PT0gJ0ZvZ0V4cDInICkge1xuXG5cdFx0XHRcdFx0XHRvYmplY3QuZm9nID0gbmV3IEZvZ0V4cDIoIGRhdGEuZm9nLmNvbG9yLCBkYXRhLmZvZy5kZW5zaXR5ICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdQZXJzcGVjdGl2ZUNhbWVyYSc6XG5cblx0XHRcdFx0b2JqZWN0ID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCBkYXRhLmZvdiwgZGF0YS5hc3BlY3QsIGRhdGEubmVhciwgZGF0YS5mYXIgKTtcblxuXHRcdFx0XHRpZiAoIGRhdGEuZm9jdXMgIT09IHVuZGVmaW5lZCApIG9iamVjdC5mb2N1cyA9IGRhdGEuZm9jdXM7XG5cdFx0XHRcdGlmICggZGF0YS56b29tICE9PSB1bmRlZmluZWQgKSBvYmplY3Quem9vbSA9IGRhdGEuem9vbTtcblx0XHRcdFx0aWYgKCBkYXRhLmZpbG1HYXVnZSAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LmZpbG1HYXVnZSA9IGRhdGEuZmlsbUdhdWdlO1xuXHRcdFx0XHRpZiAoIGRhdGEuZmlsbU9mZnNldCAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LmZpbG1PZmZzZXQgPSBkYXRhLmZpbG1PZmZzZXQ7XG5cdFx0XHRcdGlmICggZGF0YS52aWV3ICE9PSB1bmRlZmluZWQgKSBvYmplY3QudmlldyA9IE9iamVjdC5hc3NpZ24oIHt9LCBkYXRhLnZpZXcgKTtcblxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnT3J0aG9ncmFwaGljQ2FtZXJhJzpcblxuXHRcdFx0XHRvYmplY3QgPSBuZXcgT3J0aG9ncmFwaGljQ2FtZXJhKCBkYXRhLmxlZnQsIGRhdGEucmlnaHQsIGRhdGEudG9wLCBkYXRhLmJvdHRvbSwgZGF0YS5uZWFyLCBkYXRhLmZhciApO1xuXG5cdFx0XHRcdGlmICggZGF0YS56b29tICE9PSB1bmRlZmluZWQgKSBvYmplY3Quem9vbSA9IGRhdGEuem9vbTtcblx0XHRcdFx0aWYgKCBkYXRhLnZpZXcgIT09IHVuZGVmaW5lZCApIG9iamVjdC52aWV3ID0gT2JqZWN0LmFzc2lnbigge30sIGRhdGEudmlldyApO1xuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdBbWJpZW50TGlnaHQnOlxuXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBBbWJpZW50TGlnaHQoIGRhdGEuY29sb3IsIGRhdGEuaW50ZW5zaXR5ICk7XG5cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgJ0RpcmVjdGlvbmFsTGlnaHQnOlxuXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBEaXJlY3Rpb25hbExpZ2h0KCBkYXRhLmNvbG9yLCBkYXRhLmludGVuc2l0eSApO1xuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdQb2ludExpZ2h0JzpcblxuXHRcdFx0XHRvYmplY3QgPSBuZXcgUG9pbnRMaWdodCggZGF0YS5jb2xvciwgZGF0YS5pbnRlbnNpdHksIGRhdGEuZGlzdGFuY2UsIGRhdGEuZGVjYXkgKTtcblxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnUmVjdEFyZWFMaWdodCc6XG5cblx0XHRcdFx0b2JqZWN0ID0gbmV3IFJlY3RBcmVhTGlnaHQoIGRhdGEuY29sb3IsIGRhdGEuaW50ZW5zaXR5LCBkYXRhLndpZHRoLCBkYXRhLmhlaWdodCApO1xuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdTcG90TGlnaHQnOlxuXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBTcG90TGlnaHQoIGRhdGEuY29sb3IsIGRhdGEuaW50ZW5zaXR5LCBkYXRhLmRpc3RhbmNlLCBkYXRhLmFuZ2xlLCBkYXRhLnBlbnVtYnJhLCBkYXRhLmRlY2F5ICk7XG5cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgJ0hlbWlzcGhlcmVMaWdodCc6XG5cblx0XHRcdFx0b2JqZWN0ID0gbmV3IEhlbWlzcGhlcmVMaWdodCggZGF0YS5jb2xvciwgZGF0YS5ncm91bmRDb2xvciwgZGF0YS5pbnRlbnNpdHkgKTtcblxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnU2tpbm5lZE1lc2gnOlxuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdExvYWRlci5wYXJzZU9iamVjdCgpIGRvZXMgbm90IHN1cHBvcnQgU2tpbm5lZE1lc2ggeWV0LicgKTtcblxuXHRcdFx0Y2FzZSAnTWVzaCc6XG5cblx0XHRcdFx0dmFyIGdlb21ldHJ5ID0gZ2V0R2VvbWV0cnkoIGRhdGEuZ2VvbWV0cnkgKTtcblx0XHRcdFx0dmFyIG1hdGVyaWFsID0gZ2V0TWF0ZXJpYWwoIGRhdGEubWF0ZXJpYWwgKTtcblxuXHRcdFx0XHRpZiAoIGdlb21ldHJ5LmJvbmVzICYmIGdlb21ldHJ5LmJvbmVzLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdFx0XHRvYmplY3QgPSBuZXcgU2tpbm5lZE1lc2goIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRvYmplY3QgPSBuZXcgTWVzaCggZ2VvbWV0cnksIG1hdGVyaWFsICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdMT0QnOlxuXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBMT0QoKTtcblxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnTGluZSc6XG5cblx0XHRcdFx0b2JqZWN0ID0gbmV3IExpbmUoIGdldEdlb21ldHJ5KCBkYXRhLmdlb21ldHJ5ICksIGdldE1hdGVyaWFsKCBkYXRhLm1hdGVyaWFsICksIGRhdGEubW9kZSApO1xuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdMaW5lTG9vcCc6XG5cblx0XHRcdFx0b2JqZWN0ID0gbmV3IExpbmVMb29wKCBnZXRHZW9tZXRyeSggZGF0YS5nZW9tZXRyeSApLCBnZXRNYXRlcmlhbCggZGF0YS5tYXRlcmlhbCApICk7XG5cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgJ0xpbmVTZWdtZW50cyc6XG5cblx0XHRcdFx0b2JqZWN0ID0gbmV3IExpbmVTZWdtZW50cyggZ2V0R2VvbWV0cnkoIGRhdGEuZ2VvbWV0cnkgKSwgZ2V0TWF0ZXJpYWwoIGRhdGEubWF0ZXJpYWwgKSApO1xuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdQb2ludENsb3VkJzpcblx0XHRcdGNhc2UgJ1BvaW50cyc6XG5cblx0XHRcdFx0b2JqZWN0ID0gbmV3IFBvaW50cyggZ2V0R2VvbWV0cnkoIGRhdGEuZ2VvbWV0cnkgKSwgZ2V0TWF0ZXJpYWwoIGRhdGEubWF0ZXJpYWwgKSApO1xuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdTcHJpdGUnOlxuXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBTcHJpdGUoIGdldE1hdGVyaWFsKCBkYXRhLm1hdGVyaWFsICkgKTtcblxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnR3JvdXAnOlxuXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBHcm91cCgpO1xuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRkZWZhdWx0OlxuXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBPYmplY3QzRCgpO1xuXG5cdFx0fVxuXG5cdFx0b2JqZWN0LnV1aWQgPSBkYXRhLnV1aWQ7XG5cblx0XHRpZiAoIGRhdGEubmFtZSAhPT0gdW5kZWZpbmVkICkgb2JqZWN0Lm5hbWUgPSBkYXRhLm5hbWU7XG5cblx0XHRpZiAoIGRhdGEubWF0cml4ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdG9iamVjdC5tYXRyaXguZnJvbUFycmF5KCBkYXRhLm1hdHJpeCApO1xuXG5cdFx0XHRpZiAoIGRhdGEubWF0cml4QXV0b1VwZGF0ZSAhPT0gdW5kZWZpbmVkICkgb2JqZWN0Lm1hdHJpeEF1dG9VcGRhdGUgPSBkYXRhLm1hdHJpeEF1dG9VcGRhdGU7XG5cdFx0XHRpZiAoIG9iamVjdC5tYXRyaXhBdXRvVXBkYXRlICkgb2JqZWN0Lm1hdHJpeC5kZWNvbXBvc2UoIG9iamVjdC5wb3NpdGlvbiwgb2JqZWN0LnF1YXRlcm5pb24sIG9iamVjdC5zY2FsZSApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0aWYgKCBkYXRhLnBvc2l0aW9uICE9PSB1bmRlZmluZWQgKSBvYmplY3QucG9zaXRpb24uZnJvbUFycmF5KCBkYXRhLnBvc2l0aW9uICk7XG5cdFx0XHRpZiAoIGRhdGEucm90YXRpb24gIT09IHVuZGVmaW5lZCApIG9iamVjdC5yb3RhdGlvbi5mcm9tQXJyYXkoIGRhdGEucm90YXRpb24gKTtcblx0XHRcdGlmICggZGF0YS5xdWF0ZXJuaW9uICE9PSB1bmRlZmluZWQgKSBvYmplY3QucXVhdGVybmlvbi5mcm9tQXJyYXkoIGRhdGEucXVhdGVybmlvbiApO1xuXHRcdFx0aWYgKCBkYXRhLnNjYWxlICE9PSB1bmRlZmluZWQgKSBvYmplY3Quc2NhbGUuZnJvbUFycmF5KCBkYXRhLnNjYWxlICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIGRhdGEuY2FzdFNoYWRvdyAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LmNhc3RTaGFkb3cgPSBkYXRhLmNhc3RTaGFkb3c7XG5cdFx0aWYgKCBkYXRhLnJlY2VpdmVTaGFkb3cgIT09IHVuZGVmaW5lZCApIG9iamVjdC5yZWNlaXZlU2hhZG93ID0gZGF0YS5yZWNlaXZlU2hhZG93O1xuXG5cdFx0aWYgKCBkYXRhLnNoYWRvdyApIHtcblxuXHRcdFx0aWYgKCBkYXRhLnNoYWRvdy5iaWFzICE9PSB1bmRlZmluZWQgKSBvYmplY3Quc2hhZG93LmJpYXMgPSBkYXRhLnNoYWRvdy5iaWFzO1xuXHRcdFx0aWYgKCBkYXRhLnNoYWRvdy5yYWRpdXMgIT09IHVuZGVmaW5lZCApIG9iamVjdC5zaGFkb3cucmFkaXVzID0gZGF0YS5zaGFkb3cucmFkaXVzO1xuXHRcdFx0aWYgKCBkYXRhLnNoYWRvdy5tYXBTaXplICE9PSB1bmRlZmluZWQgKSBvYmplY3Quc2hhZG93Lm1hcFNpemUuZnJvbUFycmF5KCBkYXRhLnNoYWRvdy5tYXBTaXplICk7XG5cdFx0XHRpZiAoIGRhdGEuc2hhZG93LmNhbWVyYSAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LnNoYWRvdy5jYW1lcmEgPSB0aGlzLnBhcnNlT2JqZWN0KCBkYXRhLnNoYWRvdy5jYW1lcmEgKTtcblxuXHRcdH1cblxuXHRcdGlmICggZGF0YS52aXNpYmxlICE9PSB1bmRlZmluZWQgKSBvYmplY3QudmlzaWJsZSA9IGRhdGEudmlzaWJsZTtcblx0XHRpZiAoIGRhdGEuZnJ1c3R1bUN1bGxlZCAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LmZydXN0dW1DdWxsZWQgPSBkYXRhLmZydXN0dW1DdWxsZWQ7XG5cdFx0aWYgKCBkYXRhLnJlbmRlck9yZGVyICE9PSB1bmRlZmluZWQgKSBvYmplY3QucmVuZGVyT3JkZXIgPSBkYXRhLnJlbmRlck9yZGVyO1xuXHRcdGlmICggZGF0YS51c2VyRGF0YSAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LnVzZXJEYXRhID0gZGF0YS51c2VyRGF0YTtcblxuXHRcdGlmICggZGF0YS5jaGlsZHJlbiAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR2YXIgY2hpbGRyZW4gPSBkYXRhLmNoaWxkcmVuO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdFx0b2JqZWN0LmFkZCggdGhpcy5wYXJzZU9iamVjdCggY2hpbGRyZW5bIGkgXSwgZ2VvbWV0cmllcywgbWF0ZXJpYWxzICkgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCBkYXRhLnR5cGUgPT09ICdMT0QnICkge1xuXG5cdFx0XHR2YXIgbGV2ZWxzID0gZGF0YS5sZXZlbHM7XG5cblx0XHRcdGZvciAoIHZhciBsID0gMDsgbCA8IGxldmVscy5sZW5ndGg7IGwgKysgKSB7XG5cblx0XHRcdFx0dmFyIGxldmVsID0gbGV2ZWxzWyBsIF07XG5cdFx0XHRcdHZhciBjaGlsZCA9IG9iamVjdC5nZXRPYmplY3RCeVByb3BlcnR5KCAndXVpZCcsIGxldmVsLm9iamVjdCApO1xuXG5cdFx0XHRcdGlmICggY2hpbGQgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdG9iamVjdC5hZGRMZXZlbCggY2hpbGQsIGxldmVsLmRpc3RhbmNlICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gb2JqZWN0O1xuXG5cdH1cblxufSApO1xuXG52YXIgVEVYVFVSRV9NQVBQSU5HID0ge1xuXHRVVk1hcHBpbmc6IFVWTWFwcGluZyxcblx0Q3ViZVJlZmxlY3Rpb25NYXBwaW5nOiBDdWJlUmVmbGVjdGlvbk1hcHBpbmcsXG5cdEN1YmVSZWZyYWN0aW9uTWFwcGluZzogQ3ViZVJlZnJhY3Rpb25NYXBwaW5nLFxuXHRFcXVpcmVjdGFuZ3VsYXJSZWZsZWN0aW9uTWFwcGluZzogRXF1aXJlY3Rhbmd1bGFyUmVmbGVjdGlvbk1hcHBpbmcsXG5cdEVxdWlyZWN0YW5ndWxhclJlZnJhY3Rpb25NYXBwaW5nOiBFcXVpcmVjdGFuZ3VsYXJSZWZyYWN0aW9uTWFwcGluZyxcblx0U3BoZXJpY2FsUmVmbGVjdGlvbk1hcHBpbmc6IFNwaGVyaWNhbFJlZmxlY3Rpb25NYXBwaW5nLFxuXHRDdWJlVVZSZWZsZWN0aW9uTWFwcGluZzogQ3ViZVVWUmVmbGVjdGlvbk1hcHBpbmcsXG5cdEN1YmVVVlJlZnJhY3Rpb25NYXBwaW5nOiBDdWJlVVZSZWZyYWN0aW9uTWFwcGluZ1xufTtcblxudmFyIFRFWFRVUkVfV1JBUFBJTkcgPSB7XG5cdFJlcGVhdFdyYXBwaW5nOiBSZXBlYXRXcmFwcGluZyxcblx0Q2xhbXBUb0VkZ2VXcmFwcGluZzogQ2xhbXBUb0VkZ2VXcmFwcGluZyxcblx0TWlycm9yZWRSZXBlYXRXcmFwcGluZzogTWlycm9yZWRSZXBlYXRXcmFwcGluZ1xufTtcblxudmFyIFRFWFRVUkVfRklMVEVSID0ge1xuXHROZWFyZXN0RmlsdGVyOiBOZWFyZXN0RmlsdGVyLFxuXHROZWFyZXN0TWlwTWFwTmVhcmVzdEZpbHRlcjogTmVhcmVzdE1pcE1hcE5lYXJlc3RGaWx0ZXIsXG5cdE5lYXJlc3RNaXBNYXBMaW5lYXJGaWx0ZXI6IE5lYXJlc3RNaXBNYXBMaW5lYXJGaWx0ZXIsXG5cdExpbmVhckZpbHRlcjogTGluZWFyRmlsdGVyLFxuXHRMaW5lYXJNaXBNYXBOZWFyZXN0RmlsdGVyOiBMaW5lYXJNaXBNYXBOZWFyZXN0RmlsdGVyLFxuXHRMaW5lYXJNaXBNYXBMaW5lYXJGaWx0ZXI6IExpbmVhck1pcE1hcExpbmVhckZpbHRlclxufTtcblxuLyoqXG4gKiBAYXV0aG9yIHRoZXNwaXRlIC8gaHR0cDovL2NsaWNrdG9yZWxlYXNlLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBJbWFnZUJpdG1hcExvYWRlciggbWFuYWdlciApIHtcblxuXHRpZiAoIHR5cGVvZiBjcmVhdGVJbWFnZUJpdG1hcCA9PT0gJ3VuZGVmaW5lZCcgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5JbWFnZUJpdG1hcExvYWRlcjogY3JlYXRlSW1hZ2VCaXRtYXAoKSBub3Qgc3VwcG9ydGVkLicgKTtcblxuXHR9XG5cblx0aWYgKCB0eXBlb2YgZmV0Y2ggPT09ICd1bmRlZmluZWQnICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuSW1hZ2VCaXRtYXBMb2FkZXI6IGZldGNoKCkgbm90IHN1cHBvcnRlZC4nICk7XG5cblx0fVxuXG5cdHRoaXMubWFuYWdlciA9IG1hbmFnZXIgIT09IHVuZGVmaW5lZCA/IG1hbmFnZXIgOiBEZWZhdWx0TG9hZGluZ01hbmFnZXI7XG5cdHRoaXMub3B0aW9ucyA9IHVuZGVmaW5lZDtcblxufVxuXG5JbWFnZUJpdG1hcExvYWRlci5wcm90b3R5cGUgPSB7XG5cblx0Y29uc3RydWN0b3I6IEltYWdlQml0bWFwTG9hZGVyLFxuXG5cdHNldE9wdGlvbnM6IGZ1bmN0aW9uIHNldE9wdGlvbnMoIG9wdGlvbnMgKSB7XG5cblx0XHR0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRsb2FkOiBmdW5jdGlvbiBsb2FkKCB1cmwsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciApIHtcblxuXHRcdGlmICggdXJsID09PSB1bmRlZmluZWQgKSB1cmwgPSAnJztcblxuXHRcdGlmICggdGhpcy5wYXRoICE9PSB1bmRlZmluZWQgKSB1cmwgPSB0aGlzLnBhdGggKyB1cmw7XG5cblx0XHR2YXIgc2NvcGUgPSB0aGlzO1xuXG5cdFx0dmFyIGNhY2hlZCA9IENhY2hlLmdldCggdXJsICk7XG5cblx0XHRpZiAoIGNhY2hlZCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1TdGFydCggdXJsICk7XG5cblx0XHRcdHNldFRpbWVvdXQoIGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0XHRpZiAoIG9uTG9hZCApIG9uTG9hZCggY2FjaGVkICk7XG5cblx0XHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRW5kKCB1cmwgKTtcblxuXHRcdFx0fSwgMCApO1xuXG5cdFx0XHRyZXR1cm4gY2FjaGVkO1xuXG5cdFx0fVxuXG5cdFx0ZmV0Y2goIHVybCApLnRoZW4oIGZ1bmN0aW9uICggcmVzICkge1xuXG5cdFx0XHRyZXR1cm4gcmVzLmJsb2IoKTtcblxuXHRcdH0gKS50aGVuKCBmdW5jdGlvbiAoIGJsb2IgKSB7XG5cblx0XHRcdHJldHVybiBjcmVhdGVJbWFnZUJpdG1hcCggYmxvYiwgc2NvcGUub3B0aW9ucyApO1xuXG5cdFx0fSApLnRoZW4oIGZ1bmN0aW9uICggaW1hZ2VCaXRtYXAgKSB7XG5cblx0XHRcdENhY2hlLmFkZCggdXJsLCBpbWFnZUJpdG1hcCApO1xuXG5cdFx0XHRpZiAoIG9uTG9hZCApIG9uTG9hZCggaW1hZ2VCaXRtYXAgKTtcblxuXHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRW5kKCB1cmwgKTtcblxuXHRcdH0gKS5jYXRjaCggZnVuY3Rpb24gKCBlICkge1xuXG5cdFx0XHRpZiAoIG9uRXJyb3IgKSBvbkVycm9yKCBlICk7XG5cblx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7XG5cdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1FcnJvciggdXJsICk7XG5cblx0XHR9ICk7XG5cblx0fSxcblxuXHRzZXRDcm9zc09yaWdpbjogZnVuY3Rpb24gKCAvKiB2YWx1ZSAqLyApIHtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0UGF0aDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMucGF0aCA9IHZhbHVlO1xuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIHp6ODUgLyBodHRwOi8vd3d3LmxhYjRnYW1lcy5uZXQveno4NS9ibG9nXG4gKiBtaW5pbWFsIGNsYXNzIGZvciBwcm94aW5nIGZ1bmN0aW9ucyB0byBQYXRoLiBSZXBsYWNlcyBvbGQgXCJleHRyYWN0U3VicGF0aHMoKVwiXG4gKiovXG5cbmZ1bmN0aW9uIFNoYXBlUGF0aCgpIHtcblxuXHR0aGlzLnR5cGUgPSAnU2hhcGVQYXRoJztcblxuXHR0aGlzLmNvbG9yID0gbmV3IENvbG9yKCk7XG5cblx0dGhpcy5zdWJQYXRocyA9IFtdO1xuXHR0aGlzLmN1cnJlbnRQYXRoID0gbnVsbDtcblxufVxuXG5PYmplY3QuYXNzaWduKCBTaGFwZVBhdGgucHJvdG90eXBlLCB7XG5cblx0bW92ZVRvOiBmdW5jdGlvbiAoIHgsIHkgKSB7XG5cblx0XHR0aGlzLmN1cnJlbnRQYXRoID0gbmV3IFBhdGgoKTtcblx0XHR0aGlzLnN1YlBhdGhzLnB1c2goIHRoaXMuY3VycmVudFBhdGggKTtcblx0XHR0aGlzLmN1cnJlbnRQYXRoLm1vdmVUbyggeCwgeSApO1xuXG5cdH0sXG5cblx0bGluZVRvOiBmdW5jdGlvbiAoIHgsIHkgKSB7XG5cblx0XHR0aGlzLmN1cnJlbnRQYXRoLmxpbmVUbyggeCwgeSApO1xuXG5cdH0sXG5cblx0cXVhZHJhdGljQ3VydmVUbzogZnVuY3Rpb24gKCBhQ1B4LCBhQ1B5LCBhWCwgYVkgKSB7XG5cblx0XHR0aGlzLmN1cnJlbnRQYXRoLnF1YWRyYXRpY0N1cnZlVG8oIGFDUHgsIGFDUHksIGFYLCBhWSApO1xuXG5cdH0sXG5cblx0YmV6aWVyQ3VydmVUbzogZnVuY3Rpb24gKCBhQ1AxeCwgYUNQMXksIGFDUDJ4LCBhQ1AyeSwgYVgsIGFZICkge1xuXG5cdFx0dGhpcy5jdXJyZW50UGF0aC5iZXppZXJDdXJ2ZVRvKCBhQ1AxeCwgYUNQMXksIGFDUDJ4LCBhQ1AyeSwgYVgsIGFZICk7XG5cblx0fSxcblxuXHRzcGxpbmVUaHJ1OiBmdW5jdGlvbiAoIHB0cyApIHtcblxuXHRcdHRoaXMuY3VycmVudFBhdGguc3BsaW5lVGhydSggcHRzICk7XG5cblx0fSxcblxuXHR0b1NoYXBlczogZnVuY3Rpb24gKCBpc0NDVywgbm9Ib2xlcyApIHtcblxuXHRcdGZ1bmN0aW9uIHRvU2hhcGVzTm9Ib2xlcyggaW5TdWJwYXRocyApIHtcblxuXHRcdFx0dmFyIHNoYXBlcyA9IFtdO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBpblN1YnBhdGhzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0dmFyIHRtcFBhdGggPSBpblN1YnBhdGhzWyBpIF07XG5cblx0XHRcdFx0dmFyIHRtcFNoYXBlID0gbmV3IFNoYXBlKCk7XG5cdFx0XHRcdHRtcFNoYXBlLmN1cnZlcyA9IHRtcFBhdGguY3VydmVzO1xuXG5cdFx0XHRcdHNoYXBlcy5wdXNoKCB0bXBTaGFwZSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBzaGFwZXM7XG5cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBpc1BvaW50SW5zaWRlUG9seWdvbiggaW5QdCwgaW5Qb2x5Z29uICkge1xuXG5cdFx0XHR2YXIgcG9seUxlbiA9IGluUG9seWdvbi5sZW5ndGg7XG5cblx0XHRcdC8vIGluUHQgb24gcG9seWdvbiBjb250b3VyID0+IGltbWVkaWF0ZSBzdWNjZXNzICAgIG9yXG5cdFx0XHQvLyB0b2dnbGluZyBvZiBpbnNpZGUvb3V0c2lkZSBhdCBldmVyeSBzaW5nbGUhIGludGVyc2VjdGlvbiBwb2ludCBvZiBhbiBlZGdlXG5cdFx0XHQvLyAgd2l0aCB0aGUgaG9yaXpvbnRhbCBsaW5lIHRocm91Z2ggaW5QdCwgbGVmdCBvZiBpblB0XG5cdFx0XHQvLyAgbm90IGNvdW50aW5nIGxvd2VyWSBlbmRwb2ludHMgb2YgZWRnZXMgYW5kIHdob2xlIGVkZ2VzIG9uIHRoYXQgbGluZVxuXHRcdFx0dmFyIGluc2lkZSA9IGZhbHNlO1xuXHRcdFx0Zm9yICggdmFyIHAgPSBwb2x5TGVuIC0gMSwgcSA9IDA7IHEgPCBwb2x5TGVuOyBwID0gcSArKyApIHtcblxuXHRcdFx0XHR2YXIgZWRnZUxvd1B0ID0gaW5Qb2x5Z29uWyBwIF07XG5cdFx0XHRcdHZhciBlZGdlSGlnaFB0ID0gaW5Qb2x5Z29uWyBxIF07XG5cblx0XHRcdFx0dmFyIGVkZ2VEeCA9IGVkZ2VIaWdoUHQueCAtIGVkZ2VMb3dQdC54O1xuXHRcdFx0XHR2YXIgZWRnZUR5ID0gZWRnZUhpZ2hQdC55IC0gZWRnZUxvd1B0Lnk7XG5cblx0XHRcdFx0aWYgKCBNYXRoLmFicyggZWRnZUR5ICkgPiBOdW1iZXIuRVBTSUxPTiApIHtcblxuXHRcdFx0XHRcdC8vIG5vdCBwYXJhbGxlbFxuXHRcdFx0XHRcdGlmICggZWRnZUR5IDwgMCApIHtcblxuXHRcdFx0XHRcdFx0ZWRnZUxvd1B0ID0gaW5Qb2x5Z29uWyBxIF07IGVkZ2VEeCA9IC0gZWRnZUR4O1xuXHRcdFx0XHRcdFx0ZWRnZUhpZ2hQdCA9IGluUG9seWdvblsgcCBdOyBlZGdlRHkgPSAtIGVkZ2VEeTtcblxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoICggaW5QdC55IDwgZWRnZUxvd1B0LnkgKSB8fCAoIGluUHQueSA+IGVkZ2VIaWdoUHQueSApICkgXHRcdGNvbnRpbnVlO1xuXG5cdFx0XHRcdFx0aWYgKCBpblB0LnkgPT09IGVkZ2VMb3dQdC55ICkge1xuXG5cdFx0XHRcdFx0XHRpZiAoIGluUHQueCA9PT0gZWRnZUxvd1B0LnggKVx0XHRyZXR1cm5cdHRydWU7XHRcdC8vIGluUHQgaXMgb24gY29udG91ciA/XG5cdFx0XHRcdFx0XHQvLyBjb250aW51ZTtcdFx0XHRcdC8vIG5vIGludGVyc2VjdGlvbiBvciBlZGdlTG93UHQgPT4gZG9lc24ndCBjb3VudCAhISFcblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdHZhciBwZXJwRWRnZSA9IGVkZ2VEeSAqICggaW5QdC54IC0gZWRnZUxvd1B0LnggKSAtIGVkZ2VEeCAqICggaW5QdC55IC0gZWRnZUxvd1B0LnkgKTtcblx0XHRcdFx0XHRcdGlmICggcGVycEVkZ2UgPT09IDAgKVx0XHRcdFx0cmV0dXJuXHR0cnVlO1x0XHQvLyBpblB0IGlzIG9uIGNvbnRvdXIgP1xuXHRcdFx0XHRcdFx0aWYgKCBwZXJwRWRnZSA8IDAgKSBcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHRcdFx0aW5zaWRlID0gISBpbnNpZGU7XHRcdC8vIHRydWUgaW50ZXJzZWN0aW9uIGxlZnQgb2YgaW5QdFxuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHQvLyBwYXJhbGxlbCBvciBjb2xsaW5lYXJcblx0XHRcdFx0XHRpZiAoIGluUHQueSAhPT0gZWRnZUxvd1B0LnkgKSBcdFx0Y29udGludWU7XHRcdFx0Ly8gcGFyYWxsZWxcblx0XHRcdFx0XHQvLyBlZGdlIGxpZXMgb24gdGhlIHNhbWUgaG9yaXpvbnRhbCBsaW5lIGFzIGluUHRcblx0XHRcdFx0XHRpZiAoICggKCBlZGdlSGlnaFB0LnggPD0gaW5QdC54ICkgJiYgKCBpblB0LnggPD0gZWRnZUxvd1B0LnggKSApIHx8XG5cdFx0XHRcdFx0XHQgKCAoIGVkZ2VMb3dQdC54IDw9IGluUHQueCApICYmICggaW5QdC54IDw9IGVkZ2VIaWdoUHQueCApICkgKVx0XHRyZXR1cm5cdHRydWU7XHQvLyBpblB0OiBQb2ludCBvbiBjb250b3VyICFcblx0XHRcdFx0XHQvLyBjb250aW51ZTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuXHRpbnNpZGU7XG5cblx0XHR9XG5cblx0XHR2YXIgaXNDbG9ja1dpc2UgPSBTaGFwZVV0aWxzLmlzQ2xvY2tXaXNlO1xuXG5cdFx0dmFyIHN1YlBhdGhzID0gdGhpcy5zdWJQYXRocztcblx0XHRpZiAoIHN1YlBhdGhzLmxlbmd0aCA9PT0gMCApIHJldHVybiBbXTtcblxuXHRcdGlmICggbm9Ib2xlcyA9PT0gdHJ1ZSApXHRyZXR1cm5cdHRvU2hhcGVzTm9Ib2xlcyggc3ViUGF0aHMgKTtcblxuXG5cdFx0dmFyIHNvbGlkLCB0bXBQYXRoLCB0bXBTaGFwZSwgc2hhcGVzID0gW107XG5cblx0XHRpZiAoIHN1YlBhdGhzLmxlbmd0aCA9PT0gMSApIHtcblxuXHRcdFx0dG1wUGF0aCA9IHN1YlBhdGhzWyAwIF07XG5cdFx0XHR0bXBTaGFwZSA9IG5ldyBTaGFwZSgpO1xuXHRcdFx0dG1wU2hhcGUuY3VydmVzID0gdG1wUGF0aC5jdXJ2ZXM7XG5cdFx0XHRzaGFwZXMucHVzaCggdG1wU2hhcGUgKTtcblx0XHRcdHJldHVybiBzaGFwZXM7XG5cblx0XHR9XG5cblx0XHR2YXIgaG9sZXNGaXJzdCA9ICEgaXNDbG9ja1dpc2UoIHN1YlBhdGhzWyAwIF0uZ2V0UG9pbnRzKCkgKTtcblx0XHRob2xlc0ZpcnN0ID0gaXNDQ1cgPyAhIGhvbGVzRmlyc3QgOiBob2xlc0ZpcnN0O1xuXG5cdFx0Ly8gY29uc29sZS5sb2coXCJIb2xlcyBmaXJzdFwiLCBob2xlc0ZpcnN0KTtcblxuXHRcdHZhciBiZXR0ZXJTaGFwZUhvbGVzID0gW107XG5cdFx0dmFyIG5ld1NoYXBlcyA9IFtdO1xuXHRcdHZhciBuZXdTaGFwZUhvbGVzID0gW107XG5cdFx0dmFyIG1haW5JZHggPSAwO1xuXHRcdHZhciB0bXBQb2ludHM7XG5cblx0XHRuZXdTaGFwZXNbIG1haW5JZHggXSA9IHVuZGVmaW5lZDtcblx0XHRuZXdTaGFwZUhvbGVzWyBtYWluSWR4IF0gPSBbXTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHN1YlBhdGhzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHRtcFBhdGggPSBzdWJQYXRoc1sgaSBdO1xuXHRcdFx0dG1wUG9pbnRzID0gdG1wUGF0aC5nZXRQb2ludHMoKTtcblx0XHRcdHNvbGlkID0gaXNDbG9ja1dpc2UoIHRtcFBvaW50cyApO1xuXHRcdFx0c29saWQgPSBpc0NDVyA/ICEgc29saWQgOiBzb2xpZDtcblxuXHRcdFx0aWYgKCBzb2xpZCApIHtcblxuXHRcdFx0XHRpZiAoICggISBob2xlc0ZpcnN0ICkgJiYgKCBuZXdTaGFwZXNbIG1haW5JZHggXSApIClcdG1haW5JZHggKys7XG5cblx0XHRcdFx0bmV3U2hhcGVzWyBtYWluSWR4IF0gPSB7IHM6IG5ldyBTaGFwZSgpLCBwOiB0bXBQb2ludHMgfTtcblx0XHRcdFx0bmV3U2hhcGVzWyBtYWluSWR4IF0ucy5jdXJ2ZXMgPSB0bXBQYXRoLmN1cnZlcztcblxuXHRcdFx0XHRpZiAoIGhvbGVzRmlyc3QgKVx0bWFpbklkeCArKztcblx0XHRcdFx0bmV3U2hhcGVIb2xlc1sgbWFpbklkeCBdID0gW107XG5cblx0XHRcdFx0Ly9jb25zb2xlLmxvZygnY3cnLCBpKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRuZXdTaGFwZUhvbGVzWyBtYWluSWR4IF0ucHVzaCggeyBoOiB0bXBQYXRoLCBwOiB0bXBQb2ludHNbIDAgXSB9ICk7XG5cblx0XHRcdFx0Ly9jb25zb2xlLmxvZygnY2N3JywgaSk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIG9ubHkgSG9sZXM/IC0+IHByb2JhYmx5IGFsbCBTaGFwZXMgd2l0aCB3cm9uZyBvcmllbnRhdGlvblxuXHRcdGlmICggISBuZXdTaGFwZXNbIDAgXSApXHRyZXR1cm5cdHRvU2hhcGVzTm9Ib2xlcyggc3ViUGF0aHMgKTtcblxuXG5cdFx0aWYgKCBuZXdTaGFwZXMubGVuZ3RoID4gMSApIHtcblxuXHRcdFx0dmFyIGFtYmlndW91cyA9IGZhbHNlO1xuXHRcdFx0dmFyIHRvQ2hhbmdlID0gW107XG5cblx0XHRcdGZvciAoIHZhciBzSWR4ID0gMCwgc0xlbiA9IG5ld1NoYXBlcy5sZW5ndGg7IHNJZHggPCBzTGVuOyBzSWR4ICsrICkge1xuXG5cdFx0XHRcdGJldHRlclNoYXBlSG9sZXNbIHNJZHggXSA9IFtdO1xuXG5cdFx0XHR9XG5cblx0XHRcdGZvciAoIHZhciBzSWR4ID0gMCwgc0xlbiA9IG5ld1NoYXBlcy5sZW5ndGg7IHNJZHggPCBzTGVuOyBzSWR4ICsrICkge1xuXG5cdFx0XHRcdHZhciBzaG8gPSBuZXdTaGFwZUhvbGVzWyBzSWR4IF07XG5cblx0XHRcdFx0Zm9yICggdmFyIGhJZHggPSAwOyBoSWR4IDwgc2hvLmxlbmd0aDsgaElkeCArKyApIHtcblxuXHRcdFx0XHRcdHZhciBobyA9IHNob1sgaElkeCBdO1xuXHRcdFx0XHRcdHZhciBob2xlX3VuYXNzaWduZWQgPSB0cnVlO1xuXG5cdFx0XHRcdFx0Zm9yICggdmFyIHMySWR4ID0gMDsgczJJZHggPCBuZXdTaGFwZXMubGVuZ3RoOyBzMklkeCArKyApIHtcblxuXHRcdFx0XHRcdFx0aWYgKCBpc1BvaW50SW5zaWRlUG9seWdvbiggaG8ucCwgbmV3U2hhcGVzWyBzMklkeCBdLnAgKSApIHtcblxuXHRcdFx0XHRcdFx0XHRpZiAoIHNJZHggIT09IHMySWR4IClcdHRvQ2hhbmdlLnB1c2goIHsgZnJvbXM6IHNJZHgsIHRvczogczJJZHgsIGhvbGU6IGhJZHggfSApO1xuXHRcdFx0XHRcdFx0XHRpZiAoIGhvbGVfdW5hc3NpZ25lZCApIHtcblxuXHRcdFx0XHRcdFx0XHRcdGhvbGVfdW5hc3NpZ25lZCA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0XHRcdGJldHRlclNoYXBlSG9sZXNbIHMySWR4IF0ucHVzaCggaG8gKTtcblxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdFx0YW1iaWd1b3VzID0gdHJ1ZTtcblxuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoIGhvbGVfdW5hc3NpZ25lZCApIHtcblxuXHRcdFx0XHRcdFx0YmV0dGVyU2hhcGVIb2xlc1sgc0lkeCBdLnB1c2goIGhvICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cdFx0XHQvLyBjb25zb2xlLmxvZyhcImFtYmlndW91czogXCIsIGFtYmlndW91cyk7XG5cdFx0XHRpZiAoIHRvQ2hhbmdlLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdFx0Ly8gY29uc29sZS5sb2coXCJ0byBjaGFuZ2U6IFwiLCB0b0NoYW5nZSk7XG5cdFx0XHRcdGlmICggISBhbWJpZ3VvdXMgKVx0bmV3U2hhcGVIb2xlcyA9IGJldHRlclNoYXBlSG9sZXM7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHZhciB0bXBIb2xlcztcblxuXHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBuZXdTaGFwZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHRtcFNoYXBlID0gbmV3U2hhcGVzWyBpIF0ucztcblx0XHRcdHNoYXBlcy5wdXNoKCB0bXBTaGFwZSApO1xuXHRcdFx0dG1wSG9sZXMgPSBuZXdTaGFwZUhvbGVzWyBpIF07XG5cblx0XHRcdGZvciAoIHZhciBqID0gMCwgamwgPSB0bXBIb2xlcy5sZW5ndGg7IGogPCBqbDsgaiArKyApIHtcblxuXHRcdFx0XHR0bXBTaGFwZS5ob2xlcy5wdXNoKCB0bXBIb2xlc1sgaiBdLmggKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly9jb25zb2xlLmxvZyhcInNoYXBlXCIsIHNoYXBlcyk7XG5cblx0XHRyZXR1cm4gc2hhcGVzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3Igeno4NSAvIGh0dHA6Ly93d3cubGFiNGdhbWVzLm5ldC96ejg1L2Jsb2dcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gRm9udCggZGF0YSApIHtcblxuXHR0aGlzLnR5cGUgPSAnRm9udCc7XG5cblx0dGhpcy5kYXRhID0gZGF0YTtcblxufVxuXG5PYmplY3QuYXNzaWduKCBGb250LnByb3RvdHlwZSwge1xuXG5cdGlzRm9udDogdHJ1ZSxcblxuXHRnZW5lcmF0ZVNoYXBlczogZnVuY3Rpb24gKCB0ZXh0LCBzaXplLCBkaXZpc2lvbnMgKSB7XG5cblx0XHRpZiAoIHNpemUgPT09IHVuZGVmaW5lZCApIHNpemUgPSAxMDA7XG5cdFx0aWYgKCBkaXZpc2lvbnMgPT09IHVuZGVmaW5lZCApIGRpdmlzaW9ucyA9IDQ7XG5cblx0XHR2YXIgc2hhcGVzID0gW107XG5cdFx0dmFyIHBhdGhzID0gY3JlYXRlUGF0aHMoIHRleHQsIHNpemUsIGRpdmlzaW9ucywgdGhpcy5kYXRhICk7XG5cblx0XHRmb3IgKCB2YXIgcCA9IDAsIHBsID0gcGF0aHMubGVuZ3RoOyBwIDwgcGw7IHAgKysgKSB7XG5cblx0XHRcdEFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KCBzaGFwZXMsIHBhdGhzWyBwIF0udG9TaGFwZXMoKSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHNoYXBlcztcblxuXHR9XG5cbn0gKTtcblxuZnVuY3Rpb24gY3JlYXRlUGF0aHMoIHRleHQsIHNpemUsIGRpdmlzaW9ucywgZGF0YSApIHtcblxuXHR2YXIgY2hhcnMgPSBTdHJpbmcoIHRleHQgKS5zcGxpdCggJycgKTtcblx0dmFyIHNjYWxlID0gc2l6ZSAvIGRhdGEucmVzb2x1dGlvbjtcblx0dmFyIGxpbmVfaGVpZ2h0ID0gKCBkYXRhLmJvdW5kaW5nQm94LnlNYXggLSBkYXRhLmJvdW5kaW5nQm94LnlNaW4gKyBkYXRhLnVuZGVybGluZVRoaWNrbmVzcyApICogc2NhbGU7XG5cblx0dmFyIHBhdGhzID0gW107XG5cblx0dmFyIG9mZnNldFggPSAwLCBvZmZzZXRZID0gMDtcblxuXHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBjaGFycy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHR2YXIgY2hhciA9IGNoYXJzWyBpIF07XG5cblx0XHRpZiAoIGNoYXIgPT09ICdcXG4nICkge1xuXG5cdFx0XHRvZmZzZXRYID0gMDtcblx0XHRcdG9mZnNldFkgLT0gbGluZV9oZWlnaHQ7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR2YXIgcmV0ID0gY3JlYXRlUGF0aCggY2hhciwgZGl2aXNpb25zLCBzY2FsZSwgb2Zmc2V0WCwgb2Zmc2V0WSwgZGF0YSApO1xuXHRcdFx0b2Zmc2V0WCArPSByZXQub2Zmc2V0WDtcblx0XHRcdHBhdGhzLnB1c2goIHJldC5wYXRoICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdHJldHVybiBwYXRocztcblxufVxuXG5mdW5jdGlvbiBjcmVhdGVQYXRoKCBjaGFyLCBkaXZpc2lvbnMsIHNjYWxlLCBvZmZzZXRYLCBvZmZzZXRZLCBkYXRhICkge1xuXG5cdHZhciBnbHlwaCA9IGRhdGEuZ2x5cGhzWyBjaGFyIF0gfHwgZGF0YS5nbHlwaHNbICc/JyBdO1xuXG5cdGlmICggISBnbHlwaCApIHJldHVybjtcblxuXHR2YXIgcGF0aCA9IG5ldyBTaGFwZVBhdGgoKTtcblxuXHR2YXIgeCwgeSwgY3B4LCBjcHksIGNweDEsIGNweTEsIGNweDIsIGNweTI7XG5cblx0aWYgKCBnbHlwaC5vICkge1xuXG5cdFx0dmFyIG91dGxpbmUgPSBnbHlwaC5fY2FjaGVkT3V0bGluZSB8fCAoIGdseXBoLl9jYWNoZWRPdXRsaW5lID0gZ2x5cGguby5zcGxpdCggJyAnICkgKTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IG91dGxpbmUubGVuZ3RoOyBpIDwgbDsgKSB7XG5cblx0XHRcdHZhciBhY3Rpb24gPSBvdXRsaW5lWyBpICsrIF07XG5cblx0XHRcdHN3aXRjaCAoIGFjdGlvbiApIHtcblxuXHRcdFx0XHRjYXNlICdtJzogLy8gbW92ZVRvXG5cblx0XHRcdFx0XHR4ID0gb3V0bGluZVsgaSArKyBdICogc2NhbGUgKyBvZmZzZXRYO1xuXHRcdFx0XHRcdHkgPSBvdXRsaW5lWyBpICsrIF0gKiBzY2FsZSArIG9mZnNldFk7XG5cblx0XHRcdFx0XHRwYXRoLm1vdmVUbyggeCwgeSApO1xuXG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSAnbCc6IC8vIGxpbmVUb1xuXG5cdFx0XHRcdFx0eCA9IG91dGxpbmVbIGkgKysgXSAqIHNjYWxlICsgb2Zmc2V0WDtcblx0XHRcdFx0XHR5ID0gb3V0bGluZVsgaSArKyBdICogc2NhbGUgKyBvZmZzZXRZO1xuXG5cdFx0XHRcdFx0cGF0aC5saW5lVG8oIHgsIHkgKTtcblxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgJ3EnOiAvLyBxdWFkcmF0aWNDdXJ2ZVRvXG5cblx0XHRcdFx0XHRjcHggPSBvdXRsaW5lWyBpICsrIF0gKiBzY2FsZSArIG9mZnNldFg7XG5cdFx0XHRcdFx0Y3B5ID0gb3V0bGluZVsgaSArKyBdICogc2NhbGUgKyBvZmZzZXRZO1xuXHRcdFx0XHRcdGNweDEgPSBvdXRsaW5lWyBpICsrIF0gKiBzY2FsZSArIG9mZnNldFg7XG5cdFx0XHRcdFx0Y3B5MSA9IG91dGxpbmVbIGkgKysgXSAqIHNjYWxlICsgb2Zmc2V0WTtcblxuXHRcdFx0XHRcdHBhdGgucXVhZHJhdGljQ3VydmVUbyggY3B4MSwgY3B5MSwgY3B4LCBjcHkgKTtcblxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgJ2InOiAvLyBiZXppZXJDdXJ2ZVRvXG5cblx0XHRcdFx0XHRjcHggPSBvdXRsaW5lWyBpICsrIF0gKiBzY2FsZSArIG9mZnNldFg7XG5cdFx0XHRcdFx0Y3B5ID0gb3V0bGluZVsgaSArKyBdICogc2NhbGUgKyBvZmZzZXRZO1xuXHRcdFx0XHRcdGNweDEgPSBvdXRsaW5lWyBpICsrIF0gKiBzY2FsZSArIG9mZnNldFg7XG5cdFx0XHRcdFx0Y3B5MSA9IG91dGxpbmVbIGkgKysgXSAqIHNjYWxlICsgb2Zmc2V0WTtcblx0XHRcdFx0XHRjcHgyID0gb3V0bGluZVsgaSArKyBdICogc2NhbGUgKyBvZmZzZXRYO1xuXHRcdFx0XHRcdGNweTIgPSBvdXRsaW5lWyBpICsrIF0gKiBzY2FsZSArIG9mZnNldFk7XG5cblx0XHRcdFx0XHRwYXRoLmJlemllckN1cnZlVG8oIGNweDEsIGNweTEsIGNweDIsIGNweTIsIGNweCwgY3B5ICk7XG5cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH1cblxuXHRyZXR1cm4geyBvZmZzZXRYOiBnbHlwaC5oYSAqIHNjYWxlLCBwYXRoOiBwYXRoIH07XG5cbn1cblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIEZvbnRMb2FkZXIoIG1hbmFnZXIgKSB7XG5cblx0dGhpcy5tYW5hZ2VyID0gKCBtYW5hZ2VyICE9PSB1bmRlZmluZWQgKSA/IG1hbmFnZXIgOiBEZWZhdWx0TG9hZGluZ01hbmFnZXI7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggRm9udExvYWRlci5wcm90b3R5cGUsIHtcblxuXHRsb2FkOiBmdW5jdGlvbiAoIHVybCwgb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkge1xuXG5cdFx0dmFyIHNjb3BlID0gdGhpcztcblxuXHRcdHZhciBsb2FkZXIgPSBuZXcgRmlsZUxvYWRlciggdGhpcy5tYW5hZ2VyICk7XG5cdFx0bG9hZGVyLnNldFBhdGgoIHRoaXMucGF0aCApO1xuXHRcdGxvYWRlci5sb2FkKCB1cmwsIGZ1bmN0aW9uICggdGV4dCApIHtcblxuXHRcdFx0dmFyIGpzb247XG5cblx0XHRcdHRyeSB7XG5cblx0XHRcdFx0anNvbiA9IEpTT04ucGFyc2UoIHRleHQgKTtcblxuXHRcdFx0fSBjYXRjaCAoIGUgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuRm9udExvYWRlcjogdHlwZWZhY2UuanMgc3VwcG9ydCBpcyBiZWluZyBkZXByZWNhdGVkLiBVc2UgdHlwZWZhY2UuanNvbiBpbnN0ZWFkLicgKTtcblx0XHRcdFx0anNvbiA9IEpTT04ucGFyc2UoIHRleHQuc3Vic3RyaW5nKCA2NSwgdGV4dC5sZW5ndGggLSAyICkgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgZm9udCA9IHNjb3BlLnBhcnNlKCBqc29uICk7XG5cblx0XHRcdGlmICggb25Mb2FkICkgb25Mb2FkKCBmb250ICk7XG5cblx0XHR9LCBvblByb2dyZXNzLCBvbkVycm9yICk7XG5cblx0fSxcblxuXHRwYXJzZTogZnVuY3Rpb24gKCBqc29uICkge1xuXG5cdFx0cmV0dXJuIG5ldyBGb250KCBqc29uICk7XG5cblx0fSxcblxuXHRzZXRQYXRoOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5wYXRoID0gdmFsdWU7XG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG52YXIgY29udGV4dDtcblxudmFyIEF1ZGlvQ29udGV4dCA9IHtcblxuXHRnZXRDb250ZXh0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRpZiAoIGNvbnRleHQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29udGV4dCA9IG5ldyAoIHdpbmRvdy5BdWRpb0NvbnRleHQgfHwgd2luZG93LndlYmtpdEF1ZGlvQ29udGV4dCApKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gY29udGV4dDtcblxuXHR9LFxuXG5cdHNldENvbnRleHQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRjb250ZXh0ID0gdmFsdWU7XG5cblx0fVxuXG59O1xuXG4vKipcbiAqIEBhdXRob3IgUmVlY2UgQWFyb24gTGVjcml2YWluIC8gaHR0cDovL3JlZWNlbm90ZXMuY29tL1xuICovXG5cbmZ1bmN0aW9uIEF1ZGlvTG9hZGVyKCBtYW5hZ2VyICkge1xuXG5cdHRoaXMubWFuYWdlciA9ICggbWFuYWdlciAhPT0gdW5kZWZpbmVkICkgPyBtYW5hZ2VyIDogRGVmYXVsdExvYWRpbmdNYW5hZ2VyO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIEF1ZGlvTG9hZGVyLnByb3RvdHlwZSwge1xuXG5cdGxvYWQ6IGZ1bmN0aW9uICggdXJsLCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKSB7XG5cblx0XHR2YXIgbG9hZGVyID0gbmV3IEZpbGVMb2FkZXIoIHRoaXMubWFuYWdlciApO1xuXHRcdGxvYWRlci5zZXRSZXNwb25zZVR5cGUoICdhcnJheWJ1ZmZlcicgKTtcblx0XHRsb2FkZXIubG9hZCggdXJsLCBmdW5jdGlvbiAoIGJ1ZmZlciApIHtcblxuXHRcdFx0dmFyIGNvbnRleHQgPSBBdWRpb0NvbnRleHQuZ2V0Q29udGV4dCgpO1xuXG5cdFx0XHRjb250ZXh0LmRlY29kZUF1ZGlvRGF0YSggYnVmZmVyLCBmdW5jdGlvbiAoIGF1ZGlvQnVmZmVyICkge1xuXG5cdFx0XHRcdG9uTG9hZCggYXVkaW9CdWZmZXIgKTtcblxuXHRcdFx0fSApO1xuXG5cdFx0fSwgb25Qcm9ncmVzcywgb25FcnJvciApO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gU3RlcmVvQ2FtZXJhKCkge1xuXG5cdHRoaXMudHlwZSA9ICdTdGVyZW9DYW1lcmEnO1xuXG5cdHRoaXMuYXNwZWN0ID0gMTtcblxuXHR0aGlzLmV5ZVNlcCA9IDAuMDY0O1xuXG5cdHRoaXMuY2FtZXJhTCA9IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSgpO1xuXHR0aGlzLmNhbWVyYUwubGF5ZXJzLmVuYWJsZSggMSApO1xuXHR0aGlzLmNhbWVyYUwubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xuXG5cdHRoaXMuY2FtZXJhUiA9IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSgpO1xuXHR0aGlzLmNhbWVyYVIubGF5ZXJzLmVuYWJsZSggMiApO1xuXHR0aGlzLmNhbWVyYVIubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIFN0ZXJlb0NhbWVyYS5wcm90b3R5cGUsIHtcblxuXHR1cGRhdGU6ICggZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGluc3RhbmNlLCBmb2N1cywgZm92LCBhc3BlY3QsIG5lYXIsIGZhciwgem9vbSwgZXllU2VwO1xuXG5cdFx0dmFyIGV5ZVJpZ2h0ID0gbmV3IE1hdHJpeDQoKTtcblx0XHR2YXIgZXllTGVmdCA9IG5ldyBNYXRyaXg0KCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gdXBkYXRlKCBjYW1lcmEgKSB7XG5cblx0XHRcdHZhciBuZWVkc1VwZGF0ZSA9IGluc3RhbmNlICE9PSB0aGlzIHx8IGZvY3VzICE9PSBjYW1lcmEuZm9jdXMgfHwgZm92ICE9PSBjYW1lcmEuZm92IHx8XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhc3BlY3QgIT09IGNhbWVyYS5hc3BlY3QgKiB0aGlzLmFzcGVjdCB8fCBuZWFyICE9PSBjYW1lcmEubmVhciB8fFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZmFyICE9PSBjYW1lcmEuZmFyIHx8IHpvb20gIT09IGNhbWVyYS56b29tIHx8IGV5ZVNlcCAhPT0gdGhpcy5leWVTZXA7XG5cblx0XHRcdGlmICggbmVlZHNVcGRhdGUgKSB7XG5cblx0XHRcdFx0aW5zdGFuY2UgPSB0aGlzO1xuXHRcdFx0XHRmb2N1cyA9IGNhbWVyYS5mb2N1cztcblx0XHRcdFx0Zm92ID0gY2FtZXJhLmZvdjtcblx0XHRcdFx0YXNwZWN0ID0gY2FtZXJhLmFzcGVjdCAqIHRoaXMuYXNwZWN0O1xuXHRcdFx0XHRuZWFyID0gY2FtZXJhLm5lYXI7XG5cdFx0XHRcdGZhciA9IGNhbWVyYS5mYXI7XG5cdFx0XHRcdHpvb20gPSBjYW1lcmEuem9vbTtcblxuXHRcdFx0XHQvLyBPZmYtYXhpcyBzdGVyZW9zY29waWMgZWZmZWN0IGJhc2VkIG9uXG5cdFx0XHRcdC8vIGh0dHA6Ly9wYXVsYm91cmtlLm5ldC9zdGVyZW9ncmFwaGljcy9zdGVyZW9yZW5kZXIvXG5cblx0XHRcdFx0dmFyIHByb2plY3Rpb25NYXRyaXggPSBjYW1lcmEucHJvamVjdGlvbk1hdHJpeC5jbG9uZSgpO1xuXHRcdFx0XHRleWVTZXAgPSB0aGlzLmV5ZVNlcCAvIDI7XG5cdFx0XHRcdHZhciBleWVTZXBPblByb2plY3Rpb24gPSBleWVTZXAgKiBuZWFyIC8gZm9jdXM7XG5cdFx0XHRcdHZhciB5bWF4ID0gKCBuZWFyICogTWF0aC50YW4oIF9NYXRoLkRFRzJSQUQgKiBmb3YgKiAwLjUgKSApIC8gem9vbTtcblx0XHRcdFx0dmFyIHhtaW4sIHhtYXg7XG5cblx0XHRcdFx0Ly8gdHJhbnNsYXRlIHhPZmZzZXRcblxuXHRcdFx0XHRleWVMZWZ0LmVsZW1lbnRzWyAxMiBdID0gLSBleWVTZXA7XG5cdFx0XHRcdGV5ZVJpZ2h0LmVsZW1lbnRzWyAxMiBdID0gZXllU2VwO1xuXG5cdFx0XHRcdC8vIGZvciBsZWZ0IGV5ZVxuXG5cdFx0XHRcdHhtaW4gPSAtIHltYXggKiBhc3BlY3QgKyBleWVTZXBPblByb2plY3Rpb247XG5cdFx0XHRcdHhtYXggPSB5bWF4ICogYXNwZWN0ICsgZXllU2VwT25Qcm9qZWN0aW9uO1xuXG5cdFx0XHRcdHByb2plY3Rpb25NYXRyaXguZWxlbWVudHNbIDAgXSA9IDIgKiBuZWFyIC8gKCB4bWF4IC0geG1pbiApO1xuXHRcdFx0XHRwcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzWyA4IF0gPSAoIHhtYXggKyB4bWluICkgLyAoIHhtYXggLSB4bWluICk7XG5cblx0XHRcdFx0dGhpcy5jYW1lcmFMLnByb2plY3Rpb25NYXRyaXguY29weSggcHJvamVjdGlvbk1hdHJpeCApO1xuXG5cdFx0XHRcdC8vIGZvciByaWdodCBleWVcblxuXHRcdFx0XHR4bWluID0gLSB5bWF4ICogYXNwZWN0IC0gZXllU2VwT25Qcm9qZWN0aW9uO1xuXHRcdFx0XHR4bWF4ID0geW1heCAqIGFzcGVjdCAtIGV5ZVNlcE9uUHJvamVjdGlvbjtcblxuXHRcdFx0XHRwcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzWyAwIF0gPSAyICogbmVhciAvICggeG1heCAtIHhtaW4gKTtcblx0XHRcdFx0cHJvamVjdGlvbk1hdHJpeC5lbGVtZW50c1sgOCBdID0gKCB4bWF4ICsgeG1pbiApIC8gKCB4bWF4IC0geG1pbiApO1xuXG5cdFx0XHRcdHRoaXMuY2FtZXJhUi5wcm9qZWN0aW9uTWF0cml4LmNvcHkoIHByb2plY3Rpb25NYXRyaXggKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmNhbWVyYUwubWF0cml4V29ybGQuY29weSggY2FtZXJhLm1hdHJpeFdvcmxkICkubXVsdGlwbHkoIGV5ZUxlZnQgKTtcblx0XHRcdHRoaXMuY2FtZXJhUi5tYXRyaXhXb3JsZC5jb3B5KCBjYW1lcmEubWF0cml4V29ybGQgKS5tdWx0aXBseSggZXllUmlnaHQgKTtcblxuXHRcdH07XG5cblx0fSApKClcblxufSApO1xuXG4vKipcbiAqIENhbWVyYSBmb3IgcmVuZGVyaW5nIGN1YmUgbWFwc1xuICpcdC0gcmVuZGVycyBzY2VuZSBpbnRvIGF4aXMtYWxpZ25lZCBjdWJlXG4gKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBDdWJlQ2FtZXJhKCBuZWFyLCBmYXIsIGN1YmVSZXNvbHV0aW9uICkge1xuXG5cdE9iamVjdDNELmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnQ3ViZUNhbWVyYSc7XG5cblx0dmFyIGZvdiA9IDkwLCBhc3BlY3QgPSAxO1xuXG5cdHZhciBjYW1lcmFQWCA9IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSggZm92LCBhc3BlY3QsIG5lYXIsIGZhciApO1xuXHRjYW1lcmFQWC51cC5zZXQoIDAsIC0gMSwgMCApO1xuXHRjYW1lcmFQWC5sb29rQXQoIG5ldyBWZWN0b3IzKCAxLCAwLCAwICkgKTtcblx0dGhpcy5hZGQoIGNhbWVyYVBYICk7XG5cblx0dmFyIGNhbWVyYU5YID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCBmb3YsIGFzcGVjdCwgbmVhciwgZmFyICk7XG5cdGNhbWVyYU5YLnVwLnNldCggMCwgLSAxLCAwICk7XG5cdGNhbWVyYU5YLmxvb2tBdCggbmV3IFZlY3RvcjMoIC0gMSwgMCwgMCApICk7XG5cdHRoaXMuYWRkKCBjYW1lcmFOWCApO1xuXG5cdHZhciBjYW1lcmFQWSA9IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSggZm92LCBhc3BlY3QsIG5lYXIsIGZhciApO1xuXHRjYW1lcmFQWS51cC5zZXQoIDAsIDAsIDEgKTtcblx0Y2FtZXJhUFkubG9va0F0KCBuZXcgVmVjdG9yMyggMCwgMSwgMCApICk7XG5cdHRoaXMuYWRkKCBjYW1lcmFQWSApO1xuXG5cdHZhciBjYW1lcmFOWSA9IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSggZm92LCBhc3BlY3QsIG5lYXIsIGZhciApO1xuXHRjYW1lcmFOWS51cC5zZXQoIDAsIDAsIC0gMSApO1xuXHRjYW1lcmFOWS5sb29rQXQoIG5ldyBWZWN0b3IzKCAwLCAtIDEsIDAgKSApO1xuXHR0aGlzLmFkZCggY2FtZXJhTlkgKTtcblxuXHR2YXIgY2FtZXJhUFogPSBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoIGZvdiwgYXNwZWN0LCBuZWFyLCBmYXIgKTtcblx0Y2FtZXJhUFoudXAuc2V0KCAwLCAtIDEsIDAgKTtcblx0Y2FtZXJhUFoubG9va0F0KCBuZXcgVmVjdG9yMyggMCwgMCwgMSApICk7XG5cdHRoaXMuYWRkKCBjYW1lcmFQWiApO1xuXG5cdHZhciBjYW1lcmFOWiA9IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSggZm92LCBhc3BlY3QsIG5lYXIsIGZhciApO1xuXHRjYW1lcmFOWi51cC5zZXQoIDAsIC0gMSwgMCApO1xuXHRjYW1lcmFOWi5sb29rQXQoIG5ldyBWZWN0b3IzKCAwLCAwLCAtIDEgKSApO1xuXHR0aGlzLmFkZCggY2FtZXJhTlogKTtcblxuXHR2YXIgb3B0aW9ucyA9IHsgZm9ybWF0OiBSR0JGb3JtYXQsIG1hZ0ZpbHRlcjogTGluZWFyRmlsdGVyLCBtaW5GaWx0ZXI6IExpbmVhckZpbHRlciB9O1xuXG5cdHRoaXMucmVuZGVyVGFyZ2V0ID0gbmV3IFdlYkdMUmVuZGVyVGFyZ2V0Q3ViZSggY3ViZVJlc29sdXRpb24sIGN1YmVSZXNvbHV0aW9uLCBvcHRpb25zICk7XG5cdHRoaXMucmVuZGVyVGFyZ2V0LnRleHR1cmUubmFtZSA9IFwiQ3ViZUNhbWVyYVwiO1xuXG5cdHRoaXMudXBkYXRlID0gZnVuY3Rpb24gKCByZW5kZXJlciwgc2NlbmUgKSB7XG5cblx0XHRpZiAoIHRoaXMucGFyZW50ID09PSBudWxsICkgdGhpcy51cGRhdGVNYXRyaXhXb3JsZCgpO1xuXG5cdFx0dmFyIHJlbmRlclRhcmdldCA9IHRoaXMucmVuZGVyVGFyZ2V0O1xuXHRcdHZhciBnZW5lcmF0ZU1pcG1hcHMgPSByZW5kZXJUYXJnZXQudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHM7XG5cblx0XHRyZW5kZXJUYXJnZXQudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgPSBmYWxzZTtcblxuXHRcdHJlbmRlclRhcmdldC5hY3RpdmVDdWJlRmFjZSA9IDA7XG5cdFx0cmVuZGVyZXIucmVuZGVyKCBzY2VuZSwgY2FtZXJhUFgsIHJlbmRlclRhcmdldCApO1xuXG5cdFx0cmVuZGVyVGFyZ2V0LmFjdGl2ZUN1YmVGYWNlID0gMTtcblx0XHRyZW5kZXJlci5yZW5kZXIoIHNjZW5lLCBjYW1lcmFOWCwgcmVuZGVyVGFyZ2V0ICk7XG5cblx0XHRyZW5kZXJUYXJnZXQuYWN0aXZlQ3ViZUZhY2UgPSAyO1xuXHRcdHJlbmRlcmVyLnJlbmRlciggc2NlbmUsIGNhbWVyYVBZLCByZW5kZXJUYXJnZXQgKTtcblxuXHRcdHJlbmRlclRhcmdldC5hY3RpdmVDdWJlRmFjZSA9IDM7XG5cdFx0cmVuZGVyZXIucmVuZGVyKCBzY2VuZSwgY2FtZXJhTlksIHJlbmRlclRhcmdldCApO1xuXG5cdFx0cmVuZGVyVGFyZ2V0LmFjdGl2ZUN1YmVGYWNlID0gNDtcblx0XHRyZW5kZXJlci5yZW5kZXIoIHNjZW5lLCBjYW1lcmFQWiwgcmVuZGVyVGFyZ2V0ICk7XG5cblx0XHRyZW5kZXJUYXJnZXQudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgPSBnZW5lcmF0ZU1pcG1hcHM7XG5cblx0XHRyZW5kZXJUYXJnZXQuYWN0aXZlQ3ViZUZhY2UgPSA1O1xuXHRcdHJlbmRlcmVyLnJlbmRlciggc2NlbmUsIGNhbWVyYU5aLCByZW5kZXJUYXJnZXQgKTtcblxuXHRcdHJlbmRlcmVyLnNldFJlbmRlclRhcmdldCggbnVsbCApO1xuXG5cdH07XG5cblx0dGhpcy5jbGVhciA9IGZ1bmN0aW9uICggcmVuZGVyZXIsIGNvbG9yLCBkZXB0aCwgc3RlbmNpbCApIHtcblxuXHRcdHZhciByZW5kZXJUYXJnZXQgPSB0aGlzLnJlbmRlclRhcmdldDtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IDY7IGkgKysgKSB7XG5cblx0XHRcdHJlbmRlclRhcmdldC5hY3RpdmVDdWJlRmFjZSA9IGk7XG5cdFx0XHRyZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoIHJlbmRlclRhcmdldCApO1xuXG5cdFx0XHRyZW5kZXJlci5jbGVhciggY29sb3IsIGRlcHRoLCBzdGVuY2lsICk7XG5cblx0XHR9XG5cblx0XHRyZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoIG51bGwgKTtcblxuXHR9O1xuXG59XG5cbkN1YmVDYW1lcmEucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICk7XG5DdWJlQ2FtZXJhLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEN1YmVDYW1lcmE7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBBdWRpb0xpc3RlbmVyKCkge1xuXG5cdE9iamVjdDNELmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnQXVkaW9MaXN0ZW5lcic7XG5cblx0dGhpcy5jb250ZXh0ID0gQXVkaW9Db250ZXh0LmdldENvbnRleHQoKTtcblxuXHR0aGlzLmdhaW4gPSB0aGlzLmNvbnRleHQuY3JlYXRlR2FpbigpO1xuXHR0aGlzLmdhaW4uY29ubmVjdCggdGhpcy5jb250ZXh0LmRlc3RpbmF0aW9uICk7XG5cblx0dGhpcy5maWx0ZXIgPSBudWxsO1xuXG59XG5cbkF1ZGlvTGlzdGVuZXIucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogQXVkaW9MaXN0ZW5lcixcblxuXHRnZXRJbnB1dDogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZ2FpbjtcblxuXHR9LFxuXG5cdHJlbW92ZUZpbHRlcjogZnVuY3Rpb24gKCApIHtcblxuXHRcdGlmICggdGhpcy5maWx0ZXIgIT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuZ2Fpbi5kaXNjb25uZWN0KCB0aGlzLmZpbHRlciApO1xuXHRcdFx0dGhpcy5maWx0ZXIuZGlzY29ubmVjdCggdGhpcy5jb250ZXh0LmRlc3RpbmF0aW9uICk7XG5cdFx0XHR0aGlzLmdhaW4uY29ubmVjdCggdGhpcy5jb250ZXh0LmRlc3RpbmF0aW9uICk7XG5cdFx0XHR0aGlzLmZpbHRlciA9IG51bGw7XG5cblx0XHR9XG5cblx0fSxcblxuXHRnZXRGaWx0ZXI6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLmZpbHRlcjtcblxuXHR9LFxuXG5cdHNldEZpbHRlcjogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdGlmICggdGhpcy5maWx0ZXIgIT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuZ2Fpbi5kaXNjb25uZWN0KCB0aGlzLmZpbHRlciApO1xuXHRcdFx0dGhpcy5maWx0ZXIuZGlzY29ubmVjdCggdGhpcy5jb250ZXh0LmRlc3RpbmF0aW9uICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR0aGlzLmdhaW4uZGlzY29ubmVjdCggdGhpcy5jb250ZXh0LmRlc3RpbmF0aW9uICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLmZpbHRlciA9IHZhbHVlO1xuXHRcdHRoaXMuZ2Fpbi5jb25uZWN0KCB0aGlzLmZpbHRlciApO1xuXHRcdHRoaXMuZmlsdGVyLmNvbm5lY3QoIHRoaXMuY29udGV4dC5kZXN0aW5hdGlvbiApO1xuXG5cdH0sXG5cblx0Z2V0TWFzdGVyVm9sdW1lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5nYWluLmdhaW4udmFsdWU7XG5cblx0fSxcblxuXHRzZXRNYXN0ZXJWb2x1bWU6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLmdhaW4uZ2Fpbi5zZXRUYXJnZXRBdFRpbWUoIHZhbHVlLCB0aGlzLmNvbnRleHQuY3VycmVudFRpbWUsIDAuMDEgKTtcblxuXHR9LFxuXG5cdHVwZGF0ZU1hdHJpeFdvcmxkOiAoIGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBwb3NpdGlvbiA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIHF1YXRlcm5pb24gPSBuZXcgUXVhdGVybmlvbigpO1xuXHRcdHZhciBzY2FsZSA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR2YXIgb3JpZW50YXRpb24gPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZU1hdHJpeFdvcmxkKCBmb3JjZSApIHtcblxuXHRcdFx0T2JqZWN0M0QucHJvdG90eXBlLnVwZGF0ZU1hdHJpeFdvcmxkLmNhbGwoIHRoaXMsIGZvcmNlICk7XG5cblx0XHRcdHZhciBsaXN0ZW5lciA9IHRoaXMuY29udGV4dC5saXN0ZW5lcjtcblx0XHRcdHZhciB1cCA9IHRoaXMudXA7XG5cblx0XHRcdHRoaXMubWF0cml4V29ybGQuZGVjb21wb3NlKCBwb3NpdGlvbiwgcXVhdGVybmlvbiwgc2NhbGUgKTtcblxuXHRcdFx0b3JpZW50YXRpb24uc2V0KCAwLCAwLCAtIDEgKS5hcHBseVF1YXRlcm5pb24oIHF1YXRlcm5pb24gKTtcblxuXHRcdFx0aWYgKCBsaXN0ZW5lci5wb3NpdGlvblggKSB7XG5cblx0XHRcdFx0bGlzdGVuZXIucG9zaXRpb25YLnNldFZhbHVlQXRUaW1lKCBwb3NpdGlvbi54LCB0aGlzLmNvbnRleHQuY3VycmVudFRpbWUgKTtcblx0XHRcdFx0bGlzdGVuZXIucG9zaXRpb25ZLnNldFZhbHVlQXRUaW1lKCBwb3NpdGlvbi55LCB0aGlzLmNvbnRleHQuY3VycmVudFRpbWUgKTtcblx0XHRcdFx0bGlzdGVuZXIucG9zaXRpb25aLnNldFZhbHVlQXRUaW1lKCBwb3NpdGlvbi56LCB0aGlzLmNvbnRleHQuY3VycmVudFRpbWUgKTtcblx0XHRcdFx0bGlzdGVuZXIuZm9yd2FyZFguc2V0VmFsdWVBdFRpbWUoIG9yaWVudGF0aW9uLngsIHRoaXMuY29udGV4dC5jdXJyZW50VGltZSApO1xuXHRcdFx0XHRsaXN0ZW5lci5mb3J3YXJkWS5zZXRWYWx1ZUF0VGltZSggb3JpZW50YXRpb24ueSwgdGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lICk7XG5cdFx0XHRcdGxpc3RlbmVyLmZvcndhcmRaLnNldFZhbHVlQXRUaW1lKCBvcmllbnRhdGlvbi56LCB0aGlzLmNvbnRleHQuY3VycmVudFRpbWUgKTtcblx0XHRcdFx0bGlzdGVuZXIudXBYLnNldFZhbHVlQXRUaW1lKCB1cC54LCB0aGlzLmNvbnRleHQuY3VycmVudFRpbWUgKTtcblx0XHRcdFx0bGlzdGVuZXIudXBZLnNldFZhbHVlQXRUaW1lKCB1cC55LCB0aGlzLmNvbnRleHQuY3VycmVudFRpbWUgKTtcblx0XHRcdFx0bGlzdGVuZXIudXBaLnNldFZhbHVlQXRUaW1lKCB1cC56LCB0aGlzLmNvbnRleHQuY3VycmVudFRpbWUgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRsaXN0ZW5lci5zZXRQb3NpdGlvbiggcG9zaXRpb24ueCwgcG9zaXRpb24ueSwgcG9zaXRpb24ueiApO1xuXHRcdFx0XHRsaXN0ZW5lci5zZXRPcmllbnRhdGlvbiggb3JpZW50YXRpb24ueCwgb3JpZW50YXRpb24ueSwgb3JpZW50YXRpb24ueiwgdXAueCwgdXAueSwgdXAueiApO1xuXG5cdFx0XHR9XG5cblx0XHR9O1xuXG5cdH0gKSgpXG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBSZWVjZSBBYXJvbiBMZWNyaXZhaW4gLyBodHRwOi8vcmVlY2Vub3Rlcy5jb20vXG4gKi9cblxuZnVuY3Rpb24gQXVkaW8oIGxpc3RlbmVyICkge1xuXG5cdE9iamVjdDNELmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnQXVkaW8nO1xuXG5cdHRoaXMuY29udGV4dCA9IGxpc3RlbmVyLmNvbnRleHQ7XG5cblx0dGhpcy5nYWluID0gdGhpcy5jb250ZXh0LmNyZWF0ZUdhaW4oKTtcblx0dGhpcy5nYWluLmNvbm5lY3QoIGxpc3RlbmVyLmdldElucHV0KCkgKTtcblxuXHR0aGlzLmF1dG9wbGF5ID0gZmFsc2U7XG5cblx0dGhpcy5idWZmZXIgPSBudWxsO1xuXHR0aGlzLmxvb3AgPSBmYWxzZTtcblx0dGhpcy5zdGFydFRpbWUgPSAwO1xuXHR0aGlzLm9mZnNldCA9IDA7XG5cdHRoaXMucGxheWJhY2tSYXRlID0gMTtcblx0dGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcblx0dGhpcy5oYXNQbGF5YmFja0NvbnRyb2wgPSB0cnVlO1xuXHR0aGlzLnNvdXJjZVR5cGUgPSAnZW1wdHknO1xuXG5cdHRoaXMuZmlsdGVycyA9IFtdO1xuXG59XG5cbkF1ZGlvLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IEF1ZGlvLFxuXG5cdGdldE91dHB1dDogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZ2FpbjtcblxuXHR9LFxuXG5cdHNldE5vZGVTb3VyY2U6IGZ1bmN0aW9uICggYXVkaW9Ob2RlICkge1xuXG5cdFx0dGhpcy5oYXNQbGF5YmFja0NvbnRyb2wgPSBmYWxzZTtcblx0XHR0aGlzLnNvdXJjZVR5cGUgPSAnYXVkaW9Ob2RlJztcblx0XHR0aGlzLnNvdXJjZSA9IGF1ZGlvTm9kZTtcblx0XHR0aGlzLmNvbm5lY3QoKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0QnVmZmVyOiBmdW5jdGlvbiAoIGF1ZGlvQnVmZmVyICkge1xuXG5cdFx0dGhpcy5idWZmZXIgPSBhdWRpb0J1ZmZlcjtcblx0XHR0aGlzLnNvdXJjZVR5cGUgPSAnYnVmZmVyJztcblxuXHRcdGlmICggdGhpcy5hdXRvcGxheSApIHRoaXMucGxheSgpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRwbGF5OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRpZiAoIHRoaXMuaXNQbGF5aW5nID09PSB0cnVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5BdWRpbzogQXVkaW8gaXMgYWxyZWFkeSBwbGF5aW5nLicgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5oYXNQbGF5YmFja0NvbnRyb2wgPT09IGZhbHNlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5BdWRpbzogdGhpcyBBdWRpbyBoYXMgbm8gcGxheWJhY2sgY29udHJvbC4nICk7XG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHR2YXIgc291cmNlID0gdGhpcy5jb250ZXh0LmNyZWF0ZUJ1ZmZlclNvdXJjZSgpO1xuXG5cdFx0c291cmNlLmJ1ZmZlciA9IHRoaXMuYnVmZmVyO1xuXHRcdHNvdXJjZS5sb29wID0gdGhpcy5sb29wO1xuXHRcdHNvdXJjZS5vbmVuZGVkID0gdGhpcy5vbkVuZGVkLmJpbmQoIHRoaXMgKTtcblx0XHRzb3VyY2UucGxheWJhY2tSYXRlLnNldFZhbHVlQXRUaW1lKCB0aGlzLnBsYXliYWNrUmF0ZSwgdGhpcy5zdGFydFRpbWUgKTtcblx0XHR0aGlzLnN0YXJ0VGltZSA9IHRoaXMuY29udGV4dC5jdXJyZW50VGltZTtcblx0XHRzb3VyY2Uuc3RhcnQoIHRoaXMuc3RhcnRUaW1lLCB0aGlzLm9mZnNldCApO1xuXG5cdFx0dGhpcy5pc1BsYXlpbmcgPSB0cnVlO1xuXG5cdFx0dGhpcy5zb3VyY2UgPSBzb3VyY2U7XG5cblx0XHRyZXR1cm4gdGhpcy5jb25uZWN0KCk7XG5cblx0fSxcblxuXHRwYXVzZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0aWYgKCB0aGlzLmhhc1BsYXliYWNrQ29udHJvbCA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLicgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5pc1BsYXlpbmcgPT09IHRydWUgKSB7XG5cblx0XHRcdHRoaXMuc291cmNlLnN0b3AoKTtcblx0XHRcdHRoaXMub2Zmc2V0ICs9ICggdGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lIC0gdGhpcy5zdGFydFRpbWUgKSAqIHRoaXMucGxheWJhY2tSYXRlO1xuXHRcdFx0dGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c3RvcDogZnVuY3Rpb24gKCkge1xuXG5cdFx0aWYgKCB0aGlzLmhhc1BsYXliYWNrQ29udHJvbCA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLicgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdHRoaXMuc291cmNlLnN0b3AoKTtcblx0XHR0aGlzLm9mZnNldCA9IDA7XG5cdFx0dGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y29ubmVjdDogZnVuY3Rpb24gKCkge1xuXG5cdFx0aWYgKCB0aGlzLmZpbHRlcnMubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0dGhpcy5zb3VyY2UuY29ubmVjdCggdGhpcy5maWx0ZXJzWyAwIF0gKTtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAxLCBsID0gdGhpcy5maWx0ZXJzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0dGhpcy5maWx0ZXJzWyBpIC0gMSBdLmNvbm5lY3QoIHRoaXMuZmlsdGVyc1sgaSBdICk7XG5cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5maWx0ZXJzWyB0aGlzLmZpbHRlcnMubGVuZ3RoIC0gMSBdLmNvbm5lY3QoIHRoaXMuZ2V0T3V0cHV0KCkgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHRoaXMuc291cmNlLmNvbm5lY3QoIHRoaXMuZ2V0T3V0cHV0KCkgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZGlzY29ubmVjdDogZnVuY3Rpb24gKCkge1xuXG5cdFx0aWYgKCB0aGlzLmZpbHRlcnMubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0dGhpcy5zb3VyY2UuZGlzY29ubmVjdCggdGhpcy5maWx0ZXJzWyAwIF0gKTtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAxLCBsID0gdGhpcy5maWx0ZXJzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0dGhpcy5maWx0ZXJzWyBpIC0gMSBdLmRpc2Nvbm5lY3QoIHRoaXMuZmlsdGVyc1sgaSBdICk7XG5cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5maWx0ZXJzWyB0aGlzLmZpbHRlcnMubGVuZ3RoIC0gMSBdLmRpc2Nvbm5lY3QoIHRoaXMuZ2V0T3V0cHV0KCkgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHRoaXMuc291cmNlLmRpc2Nvbm5lY3QoIHRoaXMuZ2V0T3V0cHV0KCkgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Z2V0RmlsdGVyczogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZmlsdGVycztcblxuXHR9LFxuXG5cdHNldEZpbHRlcnM6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRpZiAoICEgdmFsdWUgKSB2YWx1ZSA9IFtdO1xuXG5cdFx0aWYgKCB0aGlzLmlzUGxheWluZyA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0dGhpcy5kaXNjb25uZWN0KCk7XG5cdFx0XHR0aGlzLmZpbHRlcnMgPSB2YWx1ZTtcblx0XHRcdHRoaXMuY29ubmVjdCgpO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dGhpcy5maWx0ZXJzID0gdmFsdWU7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGdldEZpbHRlcjogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZ2V0RmlsdGVycygpWyAwIF07XG5cblx0fSxcblxuXHRzZXRGaWx0ZXI6IGZ1bmN0aW9uICggZmlsdGVyICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuc2V0RmlsdGVycyggZmlsdGVyID8gWyBmaWx0ZXIgXSA6IFtdICk7XG5cblx0fSxcblxuXHRzZXRQbGF5YmFja1JhdGU6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRpZiAoIHRoaXMuaGFzUGxheWJhY2tDb250cm9sID09PSBmYWxzZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQXVkaW86IHRoaXMgQXVkaW8gaGFzIG5vIHBsYXliYWNrIGNvbnRyb2wuJyApO1xuXHRcdFx0cmV0dXJuO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5wbGF5YmFja1JhdGUgPSB2YWx1ZTtcblxuXHRcdGlmICggdGhpcy5pc1BsYXlpbmcgPT09IHRydWUgKSB7XG5cblx0XHRcdHRoaXMuc291cmNlLnBsYXliYWNrUmF0ZS5zZXRWYWx1ZUF0VGltZSggdGhpcy5wbGF5YmFja1JhdGUsIHRoaXMuY29udGV4dC5jdXJyZW50VGltZSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRnZXRQbGF5YmFja1JhdGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLnBsYXliYWNrUmF0ZTtcblxuXHR9LFxuXG5cdG9uRW5kZWQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XG5cblx0fSxcblxuXHRnZXRMb29wOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRpZiAoIHRoaXMuaGFzUGxheWJhY2tDb250cm9sID09PSBmYWxzZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQXVkaW86IHRoaXMgQXVkaW8gaGFzIG5vIHBsYXliYWNrIGNvbnRyb2wuJyApO1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMubG9vcDtcblxuXHR9LFxuXG5cdHNldExvb3A6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRpZiAoIHRoaXMuaGFzUGxheWJhY2tDb250cm9sID09PSBmYWxzZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQXVkaW86IHRoaXMgQXVkaW8gaGFzIG5vIHBsYXliYWNrIGNvbnRyb2wuJyApO1xuXHRcdFx0cmV0dXJuO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5sb29wID0gdmFsdWU7XG5cblx0XHRpZiAoIHRoaXMuaXNQbGF5aW5nID09PSB0cnVlICkge1xuXG5cdFx0XHR0aGlzLnNvdXJjZS5sb29wID0gdGhpcy5sb29wO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRnZXRWb2x1bWU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLmdhaW4uZ2Fpbi52YWx1ZTtcblxuXHR9LFxuXG5cdHNldFZvbHVtZTogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMuZ2Fpbi5nYWluLnNldFRhcmdldEF0VGltZSggdmFsdWUsIHRoaXMuY29udGV4dC5jdXJyZW50VGltZSwgMC4wMSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBQb3NpdGlvbmFsQXVkaW8oIGxpc3RlbmVyICkge1xuXG5cdEF1ZGlvLmNhbGwoIHRoaXMsIGxpc3RlbmVyICk7XG5cblx0dGhpcy5wYW5uZXIgPSB0aGlzLmNvbnRleHQuY3JlYXRlUGFubmVyKCk7XG5cdHRoaXMucGFubmVyLmNvbm5lY3QoIHRoaXMuZ2FpbiApO1xuXG59XG5cblBvc2l0aW9uYWxBdWRpby5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBBdWRpby5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBQb3NpdGlvbmFsQXVkaW8sXG5cblx0Z2V0T3V0cHV0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5wYW5uZXI7XG5cblx0fSxcblxuXHRnZXRSZWZEaXN0YW5jZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMucGFubmVyLnJlZkRpc3RhbmNlO1xuXG5cdH0sXG5cblx0c2V0UmVmRGlzdGFuY2U6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLnBhbm5lci5yZWZEaXN0YW5jZSA9IHZhbHVlO1xuXG5cdH0sXG5cblx0Z2V0Um9sbG9mZkZhY3RvcjogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMucGFubmVyLnJvbGxvZmZGYWN0b3I7XG5cblx0fSxcblxuXHRzZXRSb2xsb2ZmRmFjdG9yOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5wYW5uZXIucm9sbG9mZkZhY3RvciA9IHZhbHVlO1xuXG5cdH0sXG5cblx0Z2V0RGlzdGFuY2VNb2RlbDogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMucGFubmVyLmRpc3RhbmNlTW9kZWw7XG5cblx0fSxcblxuXHRzZXREaXN0YW5jZU1vZGVsOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5wYW5uZXIuZGlzdGFuY2VNb2RlbCA9IHZhbHVlO1xuXG5cdH0sXG5cblx0Z2V0TWF4RGlzdGFuY2U6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLnBhbm5lci5tYXhEaXN0YW5jZTtcblxuXHR9LFxuXG5cdHNldE1heERpc3RhbmNlOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5wYW5uZXIubWF4RGlzdGFuY2UgPSB2YWx1ZTtcblxuXHR9LFxuXG5cdHVwZGF0ZU1hdHJpeFdvcmxkOiAoIGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBwb3NpdGlvbiA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gdXBkYXRlTWF0cml4V29ybGQoIGZvcmNlICkge1xuXG5cdFx0XHRPYmplY3QzRC5wcm90b3R5cGUudXBkYXRlTWF0cml4V29ybGQuY2FsbCggdGhpcywgZm9yY2UgKTtcblxuXHRcdFx0cG9zaXRpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCB0aGlzLm1hdHJpeFdvcmxkICk7XG5cblx0XHRcdHRoaXMucGFubmVyLnNldFBvc2l0aW9uKCBwb3NpdGlvbi54LCBwb3NpdGlvbi55LCBwb3NpdGlvbi56ICk7XG5cblx0XHR9O1xuXG5cdH0gKSgpXG5cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gQXVkaW9BbmFseXNlciggYXVkaW8sIGZmdFNpemUgKSB7XG5cblx0dGhpcy5hbmFseXNlciA9IGF1ZGlvLmNvbnRleHQuY3JlYXRlQW5hbHlzZXIoKTtcblx0dGhpcy5hbmFseXNlci5mZnRTaXplID0gZmZ0U2l6ZSAhPT0gdW5kZWZpbmVkID8gZmZ0U2l6ZSA6IDIwNDg7XG5cblx0dGhpcy5kYXRhID0gbmV3IFVpbnQ4QXJyYXkoIHRoaXMuYW5hbHlzZXIuZnJlcXVlbmN5QmluQ291bnQgKTtcblxuXHRhdWRpby5nZXRPdXRwdXQoKS5jb25uZWN0KCB0aGlzLmFuYWx5c2VyICk7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggQXVkaW9BbmFseXNlci5wcm90b3R5cGUsIHtcblxuXHRnZXRGcmVxdWVuY3lEYXRhOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLmFuYWx5c2VyLmdldEJ5dGVGcmVxdWVuY3lEYXRhKCB0aGlzLmRhdGEgKTtcblxuXHRcdHJldHVybiB0aGlzLmRhdGE7XG5cblx0fSxcblxuXHRnZXRBdmVyYWdlRnJlcXVlbmN5OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdmFsdWUgPSAwLCBkYXRhID0gdGhpcy5nZXRGcmVxdWVuY3lEYXRhKCk7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0dmFsdWUgKz0gZGF0YVsgaSBdO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHZhbHVlIC8gZGF0YS5sZW5ndGg7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICpcbiAqIEJ1ZmZlcmVkIHNjZW5lIGdyYXBoIHByb3BlcnR5IHRoYXQgYWxsb3dzIHdlaWdodGVkIGFjY3VtdWxhdGlvbi5cbiAqXG4gKlxuICogQGF1dGhvciBCZW4gSG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pby9cbiAqIEBhdXRob3IgRGF2aWQgU2Fybm8gLyBodHRwOi8vbGlnaHRoYXVzLnVzL1xuICogQGF1dGhvciB0c2Nod1xuICovXG5cbmZ1bmN0aW9uIFByb3BlcnR5TWl4ZXIoIGJpbmRpbmcsIHR5cGVOYW1lLCB2YWx1ZVNpemUgKSB7XG5cblx0dGhpcy5iaW5kaW5nID0gYmluZGluZztcblx0dGhpcy52YWx1ZVNpemUgPSB2YWx1ZVNpemU7XG5cblx0dmFyIGJ1ZmZlclR5cGUgPSBGbG9hdDY0QXJyYXksXG5cdFx0bWl4RnVuY3Rpb247XG5cblx0c3dpdGNoICggdHlwZU5hbWUgKSB7XG5cblx0XHRjYXNlICdxdWF0ZXJuaW9uJzpcblx0XHRcdG1peEZ1bmN0aW9uID0gdGhpcy5fc2xlcnA7XG5cdFx0XHRicmVhaztcblxuXHRcdGNhc2UgJ3N0cmluZyc6XG5cdFx0Y2FzZSAnYm9vbCc6XG5cdFx0XHRidWZmZXJUeXBlID0gQXJyYXk7XG5cdFx0XHRtaXhGdW5jdGlvbiA9IHRoaXMuX3NlbGVjdDtcblx0XHRcdGJyZWFrO1xuXG5cdFx0ZGVmYXVsdDpcblx0XHRcdG1peEZ1bmN0aW9uID0gdGhpcy5fbGVycDtcblxuXHR9XG5cblx0dGhpcy5idWZmZXIgPSBuZXcgYnVmZmVyVHlwZSggdmFsdWVTaXplICogNCApO1xuXHQvLyBsYXlvdXQ6IFsgaW5jb21pbmcgfCBhY2N1MCB8IGFjY3UxIHwgb3JpZyBdXG5cdC8vXG5cdC8vIGludGVycG9sYXRvcnMgY2FuIHVzZSAuYnVmZmVyIGFzIHRoZWlyIC5yZXN1bHRcblx0Ly8gdGhlIGRhdGEgdGhlbiBnb2VzIHRvICdpbmNvbWluZydcblx0Ly9cblx0Ly8gJ2FjY3UwJyBhbmQgJ2FjY3UxJyBhcmUgdXNlZCBmcmFtZS1pbnRlcmxlYXZlZCBmb3Jcblx0Ly8gdGhlIGN1bXVsYXRpdmUgcmVzdWx0IGFuZCBhcmUgY29tcGFyZWQgdG8gZGV0ZWN0XG5cdC8vIGNoYW5nZXNcblx0Ly9cblx0Ly8gJ29yaWcnIHN0b3JlcyB0aGUgb3JpZ2luYWwgc3RhdGUgb2YgdGhlIHByb3BlcnR5XG5cblx0dGhpcy5fbWl4QnVmZmVyUmVnaW9uID0gbWl4RnVuY3Rpb247XG5cblx0dGhpcy5jdW11bGF0aXZlV2VpZ2h0ID0gMDtcblxuXHR0aGlzLnVzZUNvdW50ID0gMDtcblx0dGhpcy5yZWZlcmVuY2VDb3VudCA9IDA7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggUHJvcGVydHlNaXhlci5wcm90b3R5cGUsIHtcblxuXHQvLyBhY2N1bXVsYXRlIGRhdGEgaW4gdGhlICdpbmNvbWluZycgcmVnaW9uIGludG8gJ2FjY3U8aT4nXG5cdGFjY3VtdWxhdGU6IGZ1bmN0aW9uICggYWNjdUluZGV4LCB3ZWlnaHQgKSB7XG5cblx0XHQvLyBub3RlOiBoYXBwaWx5IGFjY3VtdWxhdGluZyBub3RoaW5nIHdoZW4gd2VpZ2h0ID0gMCwgdGhlIGNhbGxlciBrbm93c1xuXHRcdC8vIHRoZSB3ZWlnaHQgYW5kIHNob3VsZG4ndCBoYXZlIG1hZGUgdGhlIGNhbGwgaW4gdGhlIGZpcnN0IHBsYWNlXG5cblx0XHR2YXIgYnVmZmVyID0gdGhpcy5idWZmZXIsXG5cdFx0XHRzdHJpZGUgPSB0aGlzLnZhbHVlU2l6ZSxcblx0XHRcdG9mZnNldCA9IGFjY3VJbmRleCAqIHN0cmlkZSArIHN0cmlkZSxcblxuXHRcdFx0Y3VycmVudFdlaWdodCA9IHRoaXMuY3VtdWxhdGl2ZVdlaWdodDtcblxuXHRcdGlmICggY3VycmVudFdlaWdodCA9PT0gMCApIHtcblxuXHRcdFx0Ly8gYWNjdU4gOj0gaW5jb21pbmcgKiB3ZWlnaHRcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpICE9PSBzdHJpZGU7ICsrIGkgKSB7XG5cblx0XHRcdFx0YnVmZmVyWyBvZmZzZXQgKyBpIF0gPSBidWZmZXJbIGkgXTtcblxuXHRcdFx0fVxuXG5cdFx0XHRjdXJyZW50V2VpZ2h0ID0gd2VpZ2h0O1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gYWNjdU4gOj0gYWNjdU4gKyBpbmNvbWluZyAqIHdlaWdodFxuXG5cdFx0XHRjdXJyZW50V2VpZ2h0ICs9IHdlaWdodDtcblx0XHRcdHZhciBtaXggPSB3ZWlnaHQgLyBjdXJyZW50V2VpZ2h0O1xuXHRcdFx0dGhpcy5fbWl4QnVmZmVyUmVnaW9uKCBidWZmZXIsIG9mZnNldCwgMCwgbWl4LCBzdHJpZGUgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMuY3VtdWxhdGl2ZVdlaWdodCA9IGN1cnJlbnRXZWlnaHQ7XG5cblx0fSxcblxuXHQvLyBhcHBseSB0aGUgc3RhdGUgb2YgJ2FjY3U8aT4nIHRvIHRoZSBiaW5kaW5nIHdoZW4gYWNjdXMgZGlmZmVyXG5cdGFwcGx5OiBmdW5jdGlvbiAoIGFjY3VJbmRleCApIHtcblxuXHRcdHZhciBzdHJpZGUgPSB0aGlzLnZhbHVlU2l6ZSxcblx0XHRcdGJ1ZmZlciA9IHRoaXMuYnVmZmVyLFxuXHRcdFx0b2Zmc2V0ID0gYWNjdUluZGV4ICogc3RyaWRlICsgc3RyaWRlLFxuXG5cdFx0XHR3ZWlnaHQgPSB0aGlzLmN1bXVsYXRpdmVXZWlnaHQsXG5cblx0XHRcdGJpbmRpbmcgPSB0aGlzLmJpbmRpbmc7XG5cblx0XHR0aGlzLmN1bXVsYXRpdmVXZWlnaHQgPSAwO1xuXG5cdFx0aWYgKCB3ZWlnaHQgPCAxICkge1xuXG5cdFx0XHQvLyBhY2N1TiA6PSBhY2N1TiArIG9yaWdpbmFsICogKCAxIC0gY3VtdWxhdGl2ZVdlaWdodCApXG5cblx0XHRcdHZhciBvcmlnaW5hbFZhbHVlT2Zmc2V0ID0gc3RyaWRlICogMztcblxuXHRcdFx0dGhpcy5fbWl4QnVmZmVyUmVnaW9uKFxuXHRcdFx0XHRidWZmZXIsIG9mZnNldCwgb3JpZ2luYWxWYWx1ZU9mZnNldCwgMSAtIHdlaWdodCwgc3RyaWRlICk7XG5cblx0XHR9XG5cblx0XHRmb3IgKCB2YXIgaSA9IHN0cmlkZSwgZSA9IHN0cmlkZSArIHN0cmlkZTsgaSAhPT0gZTsgKysgaSApIHtcblxuXHRcdFx0aWYgKCBidWZmZXJbIGkgXSAhPT0gYnVmZmVyWyBpICsgc3RyaWRlIF0gKSB7XG5cblx0XHRcdFx0Ly8gdmFsdWUgaGFzIGNoYW5nZWQgLT4gdXBkYXRlIHNjZW5lIGdyYXBoXG5cblx0XHRcdFx0YmluZGluZy5zZXRWYWx1ZSggYnVmZmVyLCBvZmZzZXQgKTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9LFxuXG5cdC8vIHJlbWVtYmVyIHRoZSBzdGF0ZSBvZiB0aGUgYm91bmQgcHJvcGVydHkgYW5kIGNvcHkgaXQgdG8gYm90aCBhY2N1c1xuXHRzYXZlT3JpZ2luYWxTdGF0ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGJpbmRpbmcgPSB0aGlzLmJpbmRpbmc7XG5cblx0XHR2YXIgYnVmZmVyID0gdGhpcy5idWZmZXIsXG5cdFx0XHRzdHJpZGUgPSB0aGlzLnZhbHVlU2l6ZSxcblxuXHRcdFx0b3JpZ2luYWxWYWx1ZU9mZnNldCA9IHN0cmlkZSAqIDM7XG5cblx0XHRiaW5kaW5nLmdldFZhbHVlKCBidWZmZXIsIG9yaWdpbmFsVmFsdWVPZmZzZXQgKTtcblxuXHRcdC8vIGFjY3VbMC4uMV0gOj0gb3JpZyAtLSBpbml0aWFsbHkgZGV0ZWN0IGNoYW5nZXMgYWdhaW5zdCB0aGUgb3JpZ2luYWxcblx0XHRmb3IgKCB2YXIgaSA9IHN0cmlkZSwgZSA9IG9yaWdpbmFsVmFsdWVPZmZzZXQ7IGkgIT09IGU7ICsrIGkgKSB7XG5cblx0XHRcdGJ1ZmZlclsgaSBdID0gYnVmZmVyWyBvcmlnaW5hbFZhbHVlT2Zmc2V0ICsgKCBpICUgc3RyaWRlICkgXTtcblxuXHRcdH1cblxuXHRcdHRoaXMuY3VtdWxhdGl2ZVdlaWdodCA9IDA7XG5cblx0fSxcblxuXHQvLyBhcHBseSB0aGUgc3RhdGUgcHJldmlvdXNseSB0YWtlbiB2aWEgJ3NhdmVPcmlnaW5hbFN0YXRlJyB0byB0aGUgYmluZGluZ1xuXHRyZXN0b3JlT3JpZ2luYWxTdGF0ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIG9yaWdpbmFsVmFsdWVPZmZzZXQgPSB0aGlzLnZhbHVlU2l6ZSAqIDM7XG5cdFx0dGhpcy5iaW5kaW5nLnNldFZhbHVlKCB0aGlzLmJ1ZmZlciwgb3JpZ2luYWxWYWx1ZU9mZnNldCApO1xuXG5cdH0sXG5cblxuXHQvLyBtaXggZnVuY3Rpb25zXG5cblx0X3NlbGVjdDogZnVuY3Rpb24gKCBidWZmZXIsIGRzdE9mZnNldCwgc3JjT2Zmc2V0LCB0LCBzdHJpZGUgKSB7XG5cblx0XHRpZiAoIHQgPj0gMC41ICkge1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgIT09IHN0cmlkZTsgKysgaSApIHtcblxuXHRcdFx0XHRidWZmZXJbIGRzdE9mZnNldCArIGkgXSA9IGJ1ZmZlclsgc3JjT2Zmc2V0ICsgaSBdO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fSxcblxuXHRfc2xlcnA6IGZ1bmN0aW9uICggYnVmZmVyLCBkc3RPZmZzZXQsIHNyY09mZnNldCwgdCApIHtcblxuXHRcdFF1YXRlcm5pb24uc2xlcnBGbGF0KCBidWZmZXIsIGRzdE9mZnNldCwgYnVmZmVyLCBkc3RPZmZzZXQsIGJ1ZmZlciwgc3JjT2Zmc2V0LCB0ICk7XG5cblx0fSxcblxuXHRfbGVycDogZnVuY3Rpb24gKCBidWZmZXIsIGRzdE9mZnNldCwgc3JjT2Zmc2V0LCB0LCBzdHJpZGUgKSB7XG5cblx0XHR2YXIgcyA9IDEgLSB0O1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpICE9PSBzdHJpZGU7ICsrIGkgKSB7XG5cblx0XHRcdHZhciBqID0gZHN0T2Zmc2V0ICsgaTtcblxuXHRcdFx0YnVmZmVyWyBqIF0gPSBidWZmZXJbIGogXSAqIHMgKyBidWZmZXJbIHNyY09mZnNldCArIGkgXSAqIHQ7XG5cblx0XHR9XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICpcbiAqIEEgcmVmZXJlbmNlIHRvIGEgcmVhbCBwcm9wZXJ0eSBpbiB0aGUgc2NlbmUgZ3JhcGguXG4gKlxuICpcbiAqIEBhdXRob3IgQmVuIEhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW8vXG4gKiBAYXV0aG9yIERhdmlkIFNhcm5vIC8gaHR0cDovL2xpZ2h0aGF1cy51cy9cbiAqIEBhdXRob3IgdHNjaHdcbiAqL1xuXG4vLyBDaGFyYWN0ZXJzIFtdLjovIGFyZSByZXNlcnZlZCBmb3IgdHJhY2sgYmluZGluZyBzeW50YXguXG52YXIgUkVTRVJWRURfQ0hBUlNfUkUgPSAnXFxcXFtcXFxcXVxcXFwuOlxcXFwvJztcblxuZnVuY3Rpb24gQ29tcG9zaXRlKCB0YXJnZXRHcm91cCwgcGF0aCwgb3B0aW9uYWxQYXJzZWRQYXRoICkge1xuXG5cdHZhciBwYXJzZWRQYXRoID0gb3B0aW9uYWxQYXJzZWRQYXRoIHx8IFByb3BlcnR5QmluZGluZy5wYXJzZVRyYWNrTmFtZSggcGF0aCApO1xuXG5cdHRoaXMuX3RhcmdldEdyb3VwID0gdGFyZ2V0R3JvdXA7XG5cdHRoaXMuX2JpbmRpbmdzID0gdGFyZ2V0R3JvdXAuc3Vic2NyaWJlXyggcGF0aCwgcGFyc2VkUGF0aCApO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIENvbXBvc2l0ZS5wcm90b3R5cGUsIHtcblxuXHRnZXRWYWx1ZTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkge1xuXG5cdFx0dGhpcy5iaW5kKCk7IC8vIGJpbmQgYWxsIGJpbmRpbmdcblxuXHRcdHZhciBmaXJzdFZhbGlkSW5kZXggPSB0aGlzLl90YXJnZXRHcm91cC5uQ2FjaGVkT2JqZWN0c18sXG5cdFx0XHRiaW5kaW5nID0gdGhpcy5fYmluZGluZ3NbIGZpcnN0VmFsaWRJbmRleCBdO1xuXG5cdFx0Ly8gYW5kIG9ubHkgY2FsbCAuZ2V0VmFsdWUgb24gdGhlIGZpcnN0XG5cdFx0aWYgKCBiaW5kaW5nICE9PSB1bmRlZmluZWQgKSBiaW5kaW5nLmdldFZhbHVlKCBhcnJheSwgb2Zmc2V0ICk7XG5cblx0fSxcblxuXHRzZXRWYWx1ZTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkge1xuXG5cdFx0dmFyIGJpbmRpbmdzID0gdGhpcy5fYmluZGluZ3M7XG5cblx0XHRmb3IgKCB2YXIgaSA9IHRoaXMuX3RhcmdldEdyb3VwLm5DYWNoZWRPYmplY3RzXyxcblx0XHRcdFx0ICBuID0gYmluZGluZ3MubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHRiaW5kaW5nc1sgaSBdLnNldFZhbHVlKCBhcnJheSwgb2Zmc2V0ICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHRiaW5kOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgYmluZGluZ3MgPSB0aGlzLl9iaW5kaW5ncztcblxuXHRcdGZvciAoIHZhciBpID0gdGhpcy5fdGFyZ2V0R3JvdXAubkNhY2hlZE9iamVjdHNfLFxuXHRcdFx0XHQgIG4gPSBiaW5kaW5ncy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRcdGJpbmRpbmdzWyBpIF0uYmluZCgpO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0dW5iaW5kOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgYmluZGluZ3MgPSB0aGlzLl9iaW5kaW5ncztcblxuXHRcdGZvciAoIHZhciBpID0gdGhpcy5fdGFyZ2V0R3JvdXAubkNhY2hlZE9iamVjdHNfLFxuXHRcdFx0XHQgIG4gPSBiaW5kaW5ncy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRcdGJpbmRpbmdzWyBpIF0udW5iaW5kKCk7XG5cblx0XHR9XG5cblx0fVxuXG59ICk7XG5cblxuZnVuY3Rpb24gUHJvcGVydHlCaW5kaW5nKCByb290Tm9kZSwgcGF0aCwgcGFyc2VkUGF0aCApIHtcblxuXHR0aGlzLnBhdGggPSBwYXRoO1xuXHR0aGlzLnBhcnNlZFBhdGggPSBwYXJzZWRQYXRoIHx8IFByb3BlcnR5QmluZGluZy5wYXJzZVRyYWNrTmFtZSggcGF0aCApO1xuXG5cdHRoaXMubm9kZSA9IFByb3BlcnR5QmluZGluZy5maW5kTm9kZSggcm9vdE5vZGUsIHRoaXMucGFyc2VkUGF0aC5ub2RlTmFtZSApIHx8IHJvb3ROb2RlO1xuXG5cdHRoaXMucm9vdE5vZGUgPSByb290Tm9kZTtcblxufVxuXG5PYmplY3QuYXNzaWduKCBQcm9wZXJ0eUJpbmRpbmcsIHtcblxuXHRDb21wb3NpdGU6IENvbXBvc2l0ZSxcblxuXHRjcmVhdGU6IGZ1bmN0aW9uICggcm9vdCwgcGF0aCwgcGFyc2VkUGF0aCApIHtcblxuXHRcdGlmICggISAoIHJvb3QgJiYgcm9vdC5pc0FuaW1hdGlvbk9iamVjdEdyb3VwICkgKSB7XG5cblx0XHRcdHJldHVybiBuZXcgUHJvcGVydHlCaW5kaW5nKCByb290LCBwYXRoLCBwYXJzZWRQYXRoICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRyZXR1cm4gbmV3IFByb3BlcnR5QmluZGluZy5Db21wb3NpdGUoIHJvb3QsIHBhdGgsIHBhcnNlZFBhdGggKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdC8qKlxuXHQgKiBSZXBsYWNlcyBzcGFjZXMgd2l0aCB1bmRlcnNjb3JlcyBhbmQgcmVtb3ZlcyB1bnN1cHBvcnRlZCBjaGFyYWN0ZXJzIGZyb21cblx0ICogbm9kZSBuYW1lcywgdG8gZW5zdXJlIGNvbXBhdGliaWxpdHkgd2l0aCBwYXJzZVRyYWNrTmFtZSgpLlxuXHQgKlxuXHQgKiBAcGFyYW0gIHtzdHJpbmd9IG5hbWUgTm9kZSBuYW1lIHRvIGJlIHNhbml0aXplZC5cblx0ICogQHJldHVybiB7c3RyaW5nfVxuXHQgKi9cblx0c2FuaXRpemVOb2RlTmFtZTogKCBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgcmVzZXJ2ZWRSZSA9IG5ldyBSZWdFeHAoICdbJyArIFJFU0VSVkVEX0NIQVJTX1JFICsgJ10nLCAnZycgKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBzYW5pdGl6ZU5vZGVOYW1lKCBuYW1lICkge1xuXG5cdFx0XHRyZXR1cm4gbmFtZS5yZXBsYWNlKCAvXFxzL2csICdfJyApLnJlcGxhY2UoIHJlc2VydmVkUmUsICcnICk7XG5cblx0XHR9O1xuXG5cdH0oKSApLFxuXG5cdHBhcnNlVHJhY2tOYW1lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyBBdHRlbXB0cyB0byBhbGxvdyBub2RlIG5hbWVzIGZyb20gYW55IGxhbmd1YWdlLiBFUzUncyBgXFx3YCByZWdleHAgbWF0Y2hlc1xuXHRcdC8vIG9ubHkgbGF0aW4gY2hhcmFjdGVycywgYW5kIHRoZSB1bmljb2RlIFxccHtMfSBpcyBub3QgeWV0IHN1cHBvcnRlZC4gU29cblx0XHQvLyBpbnN0ZWFkLCB3ZSBleGNsdWRlIHJlc2VydmVkIGNoYXJhY3RlcnMgYW5kIG1hdGNoIGV2ZXJ5dGhpbmcgZWxzZS5cblx0XHR2YXIgd29yZENoYXIgPSAnW14nICsgUkVTRVJWRURfQ0hBUlNfUkUgKyAnXSc7XG5cdFx0dmFyIHdvcmRDaGFyT3JEb3QgPSAnW14nICsgUkVTRVJWRURfQ0hBUlNfUkUucmVwbGFjZSggJ1xcXFwuJywgJycgKSArICddJztcblxuXHRcdC8vIFBhcmVudCBkaXJlY3RvcmllcywgZGVsaW1pdGVkIGJ5ICcvJyBvciAnOicuIEN1cnJlbnRseSB1bnVzZWQsIGJ1dCBtdXN0XG5cdFx0Ly8gYmUgbWF0Y2hlZCB0byBwYXJzZSB0aGUgcmVzdCBvZiB0aGUgdHJhY2sgbmFtZS5cblx0XHR2YXIgZGlyZWN0b3J5UmUgPSAvKCg/OldDK1tcXC86XSkqKS8uc291cmNlLnJlcGxhY2UoICdXQycsIHdvcmRDaGFyICk7XG5cblx0XHQvLyBUYXJnZXQgbm9kZS4gTWF5IGNvbnRhaW4gd29yZCBjaGFyYWN0ZXJzIChhLXpBLVowLTlfKSBhbmQgJy4nIG9yICctJy5cblx0XHR2YXIgbm9kZVJlID0gLyhXQ09EKyk/Ly5zb3VyY2UucmVwbGFjZSggJ1dDT0QnLCB3b3JkQ2hhck9yRG90ICk7XG5cblx0XHQvLyBPYmplY3Qgb24gdGFyZ2V0IG5vZGUsIGFuZCBhY2Nlc3Nvci4gTWF5IG5vdCBjb250YWluIHJlc2VydmVkXG5cdFx0Ly8gY2hhcmFjdGVycy4gQWNjZXNzb3IgbWF5IGNvbnRhaW4gYW55IGNoYXJhY3RlciBleGNlcHQgY2xvc2luZyBicmFja2V0LlxuXHRcdHZhciBvYmplY3RSZSA9IC8oPzpcXC4oV0MrKSg/OlxcWyguKylcXF0pPyk/Ly5zb3VyY2UucmVwbGFjZSggJ1dDJywgd29yZENoYXIgKTtcblxuXHRcdC8vIFByb3BlcnR5IGFuZCBhY2Nlc3Nvci4gTWF5IG5vdCBjb250YWluIHJlc2VydmVkIGNoYXJhY3RlcnMuIEFjY2Vzc29yIG1heVxuXHRcdC8vIGNvbnRhaW4gYW55IG5vbi1icmFja2V0IGNoYXJhY3RlcnMuXG5cdFx0dmFyIHByb3BlcnR5UmUgPSAvXFwuKFdDKykoPzpcXFsoLispXFxdKT8vLnNvdXJjZS5yZXBsYWNlKCAnV0MnLCB3b3JkQ2hhciApO1xuXG5cdFx0dmFyIHRyYWNrUmUgPSBuZXcgUmVnRXhwKCAnJ1xuXHRcdFx0KyAnXidcblx0XHRcdCsgZGlyZWN0b3J5UmVcblx0XHRcdCsgbm9kZVJlXG5cdFx0XHQrIG9iamVjdFJlXG5cdFx0XHQrIHByb3BlcnR5UmVcblx0XHRcdCsgJyQnXG5cdFx0KTtcblxuXHRcdHZhciBzdXBwb3J0ZWRPYmplY3ROYW1lcyA9IFsgJ21hdGVyaWFsJywgJ21hdGVyaWFscycsICdib25lcycgXTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBwYXJzZVRyYWNrTmFtZSggdHJhY2tOYW1lICkge1xuXG5cdFx0XHR2YXIgbWF0Y2hlcyA9IHRyYWNrUmUuZXhlYyggdHJhY2tOYW1lICk7XG5cblx0XHRcdGlmICggISBtYXRjaGVzICkge1xuXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvciggJ1Byb3BlcnR5QmluZGluZzogQ2Fubm90IHBhcnNlIHRyYWNrTmFtZTogJyArIHRyYWNrTmFtZSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHZhciByZXN1bHRzID0ge1xuXHRcdFx0XHQvLyBkaXJlY3RvcnlOYW1lOiBtYXRjaGVzWyAxIF0sIC8vICh0c2NodykgY3VycmVudGx5IHVudXNlZFxuXHRcdFx0XHRub2RlTmFtZTogbWF0Y2hlc1sgMiBdLFxuXHRcdFx0XHRvYmplY3ROYW1lOiBtYXRjaGVzWyAzIF0sXG5cdFx0XHRcdG9iamVjdEluZGV4OiBtYXRjaGVzWyA0IF0sXG5cdFx0XHRcdHByb3BlcnR5TmFtZTogbWF0Y2hlc1sgNSBdLCAvLyByZXF1aXJlZFxuXHRcdFx0XHRwcm9wZXJ0eUluZGV4OiBtYXRjaGVzWyA2IF1cblx0XHRcdH07XG5cblx0XHRcdHZhciBsYXN0RG90ID0gcmVzdWx0cy5ub2RlTmFtZSAmJiByZXN1bHRzLm5vZGVOYW1lLmxhc3RJbmRleE9mKCAnLicgKTtcblxuXHRcdFx0aWYgKCBsYXN0RG90ICE9PSB1bmRlZmluZWQgJiYgbGFzdERvdCAhPT0gLSAxICkge1xuXG5cdFx0XHRcdHZhciBvYmplY3ROYW1lID0gcmVzdWx0cy5ub2RlTmFtZS5zdWJzdHJpbmcoIGxhc3REb3QgKyAxICk7XG5cblx0XHRcdFx0Ly8gT2JqZWN0IG5hbWVzIG11c3QgYmUgY2hlY2tlZCBhZ2FpbnN0IGEgd2hpdGVsaXN0LiBPdGhlcndpc2UsIHRoZXJlXG5cdFx0XHRcdC8vIGlzIG5vIHdheSB0byBwYXJzZSAnZm9vLmJhci5iYXonOiAnYmF6JyBtdXN0IGJlIGEgcHJvcGVydHksIGJ1dFxuXHRcdFx0XHQvLyAnYmFyJyBjb3VsZCBiZSB0aGUgb2JqZWN0TmFtZSwgb3IgcGFydCBvZiBhIG5vZGVOYW1lICh3aGljaCBjYW5cblx0XHRcdFx0Ly8gaW5jbHVkZSAnLicgY2hhcmFjdGVycykuXG5cdFx0XHRcdGlmICggc3VwcG9ydGVkT2JqZWN0TmFtZXMuaW5kZXhPZiggb2JqZWN0TmFtZSApICE9PSAtIDEgKSB7XG5cblx0XHRcdFx0XHRyZXN1bHRzLm5vZGVOYW1lID0gcmVzdWx0cy5ub2RlTmFtZS5zdWJzdHJpbmcoIDAsIGxhc3REb3QgKTtcblx0XHRcdFx0XHRyZXN1bHRzLm9iamVjdE5hbWUgPSBvYmplY3ROYW1lO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHJlc3VsdHMucHJvcGVydHlOYW1lID09PSBudWxsIHx8IHJlc3VsdHMucHJvcGVydHlOYW1lLmxlbmd0aCA9PT0gMCApIHtcblxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoICdQcm9wZXJ0eUJpbmRpbmc6IGNhbiBub3QgcGFyc2UgcHJvcGVydHlOYW1lIGZyb20gdHJhY2tOYW1lOiAnICsgdHJhY2tOYW1lICk7XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRmaW5kTm9kZTogZnVuY3Rpb24gKCByb290LCBub2RlTmFtZSApIHtcblxuXHRcdGlmICggISBub2RlTmFtZSB8fCBub2RlTmFtZSA9PT0gXCJcIiB8fCBub2RlTmFtZSA9PT0gXCJyb290XCIgfHwgbm9kZU5hbWUgPT09IFwiLlwiIHx8IG5vZGVOYW1lID09PSAtIDEgfHwgbm9kZU5hbWUgPT09IHJvb3QubmFtZSB8fCBub2RlTmFtZSA9PT0gcm9vdC51dWlkICkge1xuXG5cdFx0XHRyZXR1cm4gcm9vdDtcblxuXHRcdH1cblxuXHRcdC8vIHNlYXJjaCBpbnRvIHNrZWxldG9uIGJvbmVzLlxuXHRcdGlmICggcm9vdC5za2VsZXRvbiApIHtcblxuXHRcdFx0dmFyIGJvbmUgPSByb290LnNrZWxldG9uLmdldEJvbmVCeU5hbWUoIG5vZGVOYW1lICk7XG5cblx0XHRcdGlmICggYm9uZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHJldHVybiBib25lO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvLyBzZWFyY2ggaW50byBub2RlIHN1YnRyZWUuXG5cdFx0aWYgKCByb290LmNoaWxkcmVuICkge1xuXG5cdFx0XHR2YXIgc2VhcmNoTm9kZVN1YnRyZWUgPSBmdW5jdGlvbiAoIGNoaWxkcmVuICkge1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0XHRcdHZhciBjaGlsZE5vZGUgPSBjaGlsZHJlblsgaSBdO1xuXG5cdFx0XHRcdFx0aWYgKCBjaGlsZE5vZGUubmFtZSA9PT0gbm9kZU5hbWUgfHwgY2hpbGROb2RlLnV1aWQgPT09IG5vZGVOYW1lICkge1xuXG5cdFx0XHRcdFx0XHRyZXR1cm4gY2hpbGROb2RlO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0dmFyIHJlc3VsdCA9IHNlYXJjaE5vZGVTdWJ0cmVlKCBjaGlsZE5vZGUuY2hpbGRyZW4gKTtcblxuXHRcdFx0XHRcdGlmICggcmVzdWx0ICkgcmV0dXJuIHJlc3VsdDtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cblx0XHRcdH07XG5cblx0XHRcdHZhciBzdWJUcmVlTm9kZSA9IHNlYXJjaE5vZGVTdWJ0cmVlKCByb290LmNoaWxkcmVuICk7XG5cblx0XHRcdGlmICggc3ViVHJlZU5vZGUgKSB7XG5cblx0XHRcdFx0cmV0dXJuIHN1YlRyZWVOb2RlO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gbnVsbDtcblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmFzc2lnbiggUHJvcGVydHlCaW5kaW5nLnByb3RvdHlwZSwgeyAvLyBwcm90b3R5cGUsIGNvbnRpbnVlZFxuXG5cdC8vIHRoZXNlIGFyZSB1c2VkIHRvIFwiYmluZFwiIGEgbm9uZXhpc3RlbnQgcHJvcGVydHlcblx0X2dldFZhbHVlX3VuYXZhaWxhYmxlOiBmdW5jdGlvbiAoKSB7fSxcblx0X3NldFZhbHVlX3VuYXZhaWxhYmxlOiBmdW5jdGlvbiAoKSB7fSxcblxuXHRCaW5kaW5nVHlwZToge1xuXHRcdERpcmVjdDogMCxcblx0XHRFbnRpcmVBcnJheTogMSxcblx0XHRBcnJheUVsZW1lbnQ6IDIsXG5cdFx0SGFzRnJvbVRvQXJyYXk6IDNcblx0fSxcblxuXHRWZXJzaW9uaW5nOiB7XG5cdFx0Tm9uZTogMCxcblx0XHROZWVkc1VwZGF0ZTogMSxcblx0XHRNYXRyaXhXb3JsZE5lZWRzVXBkYXRlOiAyXG5cdH0sXG5cblx0R2V0dGVyQnlCaW5kaW5nVHlwZTogW1xuXG5cdFx0ZnVuY3Rpb24gZ2V0VmFsdWVfZGlyZWN0KCBidWZmZXIsIG9mZnNldCApIHtcblxuXHRcdFx0YnVmZmVyWyBvZmZzZXQgXSA9IHRoaXMubm9kZVsgdGhpcy5wcm9wZXJ0eU5hbWUgXTtcblxuXHRcdH0sXG5cblx0XHRmdW5jdGlvbiBnZXRWYWx1ZV9hcnJheSggYnVmZmVyLCBvZmZzZXQgKSB7XG5cblx0XHRcdHZhciBzb3VyY2UgPSB0aGlzLnJlc29sdmVkUHJvcGVydHk7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgbiA9IHNvdXJjZS5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRcdFx0YnVmZmVyWyBvZmZzZXQgKysgXSA9IHNvdXJjZVsgaSBdO1xuXG5cdFx0XHR9XG5cblx0XHR9LFxuXG5cdFx0ZnVuY3Rpb24gZ2V0VmFsdWVfYXJyYXlFbGVtZW50KCBidWZmZXIsIG9mZnNldCApIHtcblxuXHRcdFx0YnVmZmVyWyBvZmZzZXQgXSA9IHRoaXMucmVzb2x2ZWRQcm9wZXJ0eVsgdGhpcy5wcm9wZXJ0eUluZGV4IF07XG5cblx0XHR9LFxuXG5cdFx0ZnVuY3Rpb24gZ2V0VmFsdWVfdG9BcnJheSggYnVmZmVyLCBvZmZzZXQgKSB7XG5cblx0XHRcdHRoaXMucmVzb2x2ZWRQcm9wZXJ0eS50b0FycmF5KCBidWZmZXIsIG9mZnNldCApO1xuXG5cdFx0fVxuXG5cdF0sXG5cblx0U2V0dGVyQnlCaW5kaW5nVHlwZUFuZFZlcnNpb25pbmc6IFtcblxuXHRcdFtcblx0XHRcdC8vIERpcmVjdFxuXG5cdFx0XHRmdW5jdGlvbiBzZXRWYWx1ZV9kaXJlY3QoIGJ1ZmZlciwgb2Zmc2V0ICkge1xuXG5cdFx0XHRcdHRoaXMudGFyZ2V0T2JqZWN0WyB0aGlzLnByb3BlcnR5TmFtZSBdID0gYnVmZmVyWyBvZmZzZXQgXTtcblxuXHRcdFx0fSxcblxuXHRcdFx0ZnVuY3Rpb24gc2V0VmFsdWVfZGlyZWN0X3NldE5lZWRzVXBkYXRlKCBidWZmZXIsIG9mZnNldCApIHtcblxuXHRcdFx0XHR0aGlzLnRhcmdldE9iamVjdFsgdGhpcy5wcm9wZXJ0eU5hbWUgXSA9IGJ1ZmZlclsgb2Zmc2V0IF07XG5cdFx0XHRcdHRoaXMudGFyZ2V0T2JqZWN0Lm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0fSxcblxuXHRcdFx0ZnVuY3Rpb24gc2V0VmFsdWVfZGlyZWN0X3NldE1hdHJpeFdvcmxkTmVlZHNVcGRhdGUoIGJ1ZmZlciwgb2Zmc2V0ICkge1xuXG5cdFx0XHRcdHRoaXMudGFyZ2V0T2JqZWN0WyB0aGlzLnByb3BlcnR5TmFtZSBdID0gYnVmZmVyWyBvZmZzZXQgXTtcblx0XHRcdFx0dGhpcy50YXJnZXRPYmplY3QubWF0cml4V29ybGROZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdH1cblxuXHRcdF0sIFtcblxuXHRcdFx0Ly8gRW50aXJlQXJyYXlcblxuXHRcdFx0ZnVuY3Rpb24gc2V0VmFsdWVfYXJyYXkoIGJ1ZmZlciwgb2Zmc2V0ICkge1xuXG5cdFx0XHRcdHZhciBkZXN0ID0gdGhpcy5yZXNvbHZlZFByb3BlcnR5O1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMCwgbiA9IGRlc3QubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHRcdFx0ZGVzdFsgaSBdID0gYnVmZmVyWyBvZmZzZXQgKysgXTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0sXG5cblx0XHRcdGZ1bmN0aW9uIHNldFZhbHVlX2FycmF5X3NldE5lZWRzVXBkYXRlKCBidWZmZXIsIG9mZnNldCApIHtcblxuXHRcdFx0XHR2YXIgZGVzdCA9IHRoaXMucmVzb2x2ZWRQcm9wZXJ0eTtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIG4gPSBkZXN0Lmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0XHRcdGRlc3RbIGkgXSA9IGJ1ZmZlclsgb2Zmc2V0ICsrIF07XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoaXMudGFyZ2V0T2JqZWN0Lm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0fSxcblxuXHRcdFx0ZnVuY3Rpb24gc2V0VmFsdWVfYXJyYXlfc2V0TWF0cml4V29ybGROZWVkc1VwZGF0ZSggYnVmZmVyLCBvZmZzZXQgKSB7XG5cblx0XHRcdFx0dmFyIGRlc3QgPSB0aGlzLnJlc29sdmVkUHJvcGVydHk7XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBuID0gZGVzdC5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRcdFx0XHRkZXN0WyBpIF0gPSBidWZmZXJbIG9mZnNldCArKyBdO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0aGlzLnRhcmdldE9iamVjdC5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0fVxuXG5cdFx0XSwgW1xuXG5cdFx0XHQvLyBBcnJheUVsZW1lbnRcblxuXHRcdFx0ZnVuY3Rpb24gc2V0VmFsdWVfYXJyYXlFbGVtZW50KCBidWZmZXIsIG9mZnNldCApIHtcblxuXHRcdFx0XHR0aGlzLnJlc29sdmVkUHJvcGVydHlbIHRoaXMucHJvcGVydHlJbmRleCBdID0gYnVmZmVyWyBvZmZzZXQgXTtcblxuXHRcdFx0fSxcblxuXHRcdFx0ZnVuY3Rpb24gc2V0VmFsdWVfYXJyYXlFbGVtZW50X3NldE5lZWRzVXBkYXRlKCBidWZmZXIsIG9mZnNldCApIHtcblxuXHRcdFx0XHR0aGlzLnJlc29sdmVkUHJvcGVydHlbIHRoaXMucHJvcGVydHlJbmRleCBdID0gYnVmZmVyWyBvZmZzZXQgXTtcblx0XHRcdFx0dGhpcy50YXJnZXRPYmplY3QubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHR9LFxuXG5cdFx0XHRmdW5jdGlvbiBzZXRWYWx1ZV9hcnJheUVsZW1lbnRfc2V0TWF0cml4V29ybGROZWVkc1VwZGF0ZSggYnVmZmVyLCBvZmZzZXQgKSB7XG5cblx0XHRcdFx0dGhpcy5yZXNvbHZlZFByb3BlcnR5WyB0aGlzLnByb3BlcnR5SW5kZXggXSA9IGJ1ZmZlclsgb2Zmc2V0IF07XG5cdFx0XHRcdHRoaXMudGFyZ2V0T2JqZWN0Lm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHR9XG5cblx0XHRdLCBbXG5cblx0XHRcdC8vIEhhc1RvRnJvbUFycmF5XG5cblx0XHRcdGZ1bmN0aW9uIHNldFZhbHVlX2Zyb21BcnJheSggYnVmZmVyLCBvZmZzZXQgKSB7XG5cblx0XHRcdFx0dGhpcy5yZXNvbHZlZFByb3BlcnR5LmZyb21BcnJheSggYnVmZmVyLCBvZmZzZXQgKTtcblxuXHRcdFx0fSxcblxuXHRcdFx0ZnVuY3Rpb24gc2V0VmFsdWVfZnJvbUFycmF5X3NldE5lZWRzVXBkYXRlKCBidWZmZXIsIG9mZnNldCApIHtcblxuXHRcdFx0XHR0aGlzLnJlc29sdmVkUHJvcGVydHkuZnJvbUFycmF5KCBidWZmZXIsIG9mZnNldCApO1xuXHRcdFx0XHR0aGlzLnRhcmdldE9iamVjdC5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdH0sXG5cblx0XHRcdGZ1bmN0aW9uIHNldFZhbHVlX2Zyb21BcnJheV9zZXRNYXRyaXhXb3JsZE5lZWRzVXBkYXRlKCBidWZmZXIsIG9mZnNldCApIHtcblxuXHRcdFx0XHR0aGlzLnJlc29sdmVkUHJvcGVydHkuZnJvbUFycmF5KCBidWZmZXIsIG9mZnNldCApO1xuXHRcdFx0XHR0aGlzLnRhcmdldE9iamVjdC5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0fVxuXG5cdFx0XVxuXG5cdF0sXG5cblx0Z2V0VmFsdWU6IGZ1bmN0aW9uIGdldFZhbHVlX3VuYm91bmQoIHRhcmdldEFycmF5LCBvZmZzZXQgKSB7XG5cblx0XHR0aGlzLmJpbmQoKTtcblx0XHR0aGlzLmdldFZhbHVlKCB0YXJnZXRBcnJheSwgb2Zmc2V0ICk7XG5cblx0XHQvLyBOb3RlOiBUaGlzIGNsYXNzIHVzZXMgYSBTdGF0ZSBwYXR0ZXJuIG9uIGEgcGVyLW1ldGhvZCBiYXNpczpcblx0XHQvLyAnYmluZCcgc2V0cyAndGhpcy5nZXRWYWx1ZScgLyAnc2V0VmFsdWUnIGFuZCBzaGFkb3dzIHRoZVxuXHRcdC8vIHByb3RvdHlwZSB2ZXJzaW9uIG9mIHRoZXNlIG1ldGhvZHMgd2l0aCBvbmUgdGhhdCByZXByZXNlbnRzXG5cdFx0Ly8gdGhlIGJvdW5kIHN0YXRlLiBXaGVuIHRoZSBwcm9wZXJ0eSBpcyBub3QgZm91bmQsIHRoZSBtZXRob2RzXG5cdFx0Ly8gYmVjb21lIG5vLW9wcy5cblxuXHR9LFxuXG5cdHNldFZhbHVlOiBmdW5jdGlvbiBnZXRWYWx1ZV91bmJvdW5kKCBzb3VyY2VBcnJheSwgb2Zmc2V0ICkge1xuXG5cdFx0dGhpcy5iaW5kKCk7XG5cdFx0dGhpcy5zZXRWYWx1ZSggc291cmNlQXJyYXksIG9mZnNldCApO1xuXG5cdH0sXG5cblx0Ly8gY3JlYXRlIGdldHRlciAvIHNldHRlciBwYWlyIGZvciBhIHByb3BlcnR5IGluIHRoZSBzY2VuZSBncmFwaFxuXHRiaW5kOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdGFyZ2V0T2JqZWN0ID0gdGhpcy5ub2RlLFxuXHRcdFx0cGFyc2VkUGF0aCA9IHRoaXMucGFyc2VkUGF0aCxcblxuXHRcdFx0b2JqZWN0TmFtZSA9IHBhcnNlZFBhdGgub2JqZWN0TmFtZSxcblx0XHRcdHByb3BlcnR5TmFtZSA9IHBhcnNlZFBhdGgucHJvcGVydHlOYW1lLFxuXHRcdFx0cHJvcGVydHlJbmRleCA9IHBhcnNlZFBhdGgucHJvcGVydHlJbmRleDtcblxuXHRcdGlmICggISB0YXJnZXRPYmplY3QgKSB7XG5cblx0XHRcdHRhcmdldE9iamVjdCA9IFByb3BlcnR5QmluZGluZy5maW5kTm9kZSggdGhpcy5yb290Tm9kZSwgcGFyc2VkUGF0aC5ub2RlTmFtZSApIHx8IHRoaXMucm9vdE5vZGU7XG5cblx0XHRcdHRoaXMubm9kZSA9IHRhcmdldE9iamVjdDtcblxuXHRcdH1cblxuXHRcdC8vIHNldCBmYWlsIHN0YXRlIHNvIHdlIGNhbiBqdXN0ICdyZXR1cm4nIG9uIGVycm9yXG5cdFx0dGhpcy5nZXRWYWx1ZSA9IHRoaXMuX2dldFZhbHVlX3VuYXZhaWxhYmxlO1xuXHRcdHRoaXMuc2V0VmFsdWUgPSB0aGlzLl9zZXRWYWx1ZV91bmF2YWlsYWJsZTtcblxuXHRcdC8vIGVuc3VyZSB0aGVyZSBpcyBhIHZhbHVlIG5vZGVcblx0XHRpZiAoICEgdGFyZ2V0T2JqZWN0ICkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBUcnlpbmcgdG8gdXBkYXRlIG5vZGUgZm9yIHRyYWNrOiAnICsgdGhpcy5wYXRoICsgJyBidXQgaXQgd2FzblxcJ3QgZm91bmQuJyApO1xuXHRcdFx0cmV0dXJuO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBvYmplY3ROYW1lICkge1xuXG5cdFx0XHR2YXIgb2JqZWN0SW5kZXggPSBwYXJzZWRQYXRoLm9iamVjdEluZGV4O1xuXG5cdFx0XHQvLyBzcGVjaWFsIGNhc2VzIHdlcmUgd2UgbmVlZCB0byByZWFjaCBkZWVwZXIgaW50byB0aGUgaGllcmFyY2h5IHRvIGdldCB0aGUgZmFjZSBtYXRlcmlhbHMuLi4uXG5cdFx0XHRzd2l0Y2ggKCBvYmplY3ROYW1lICkge1xuXG5cdFx0XHRcdGNhc2UgJ21hdGVyaWFscyc6XG5cblx0XHRcdFx0XHRpZiAoICEgdGFyZ2V0T2JqZWN0Lm1hdGVyaWFsICkge1xuXG5cdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBDYW4gbm90IGJpbmQgdG8gbWF0ZXJpYWwgYXMgbm9kZSBkb2VzIG5vdCBoYXZlIGEgbWF0ZXJpYWwuJywgdGhpcyApO1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKCAhIHRhcmdldE9iamVjdC5tYXRlcmlhbC5tYXRlcmlhbHMgKSB7XG5cblx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBtYXRlcmlhbC5tYXRlcmlhbHMgYXMgbm9kZS5tYXRlcmlhbCBkb2VzIG5vdCBoYXZlIGEgbWF0ZXJpYWxzIGFycmF5LicsIHRoaXMgKTtcblx0XHRcdFx0XHRcdHJldHVybjtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHRhcmdldE9iamVjdCA9IHRhcmdldE9iamVjdC5tYXRlcmlhbC5tYXRlcmlhbHM7XG5cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlICdib25lcyc6XG5cblx0XHRcdFx0XHRpZiAoICEgdGFyZ2V0T2JqZWN0LnNrZWxldG9uICkge1xuXG5cdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBDYW4gbm90IGJpbmQgdG8gYm9uZXMgYXMgbm9kZSBkb2VzIG5vdCBoYXZlIGEgc2tlbGV0b24uJywgdGhpcyApO1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gcG90ZW50aWFsIGZ1dHVyZSBvcHRpbWl6YXRpb246IHNraXAgdGhpcyBpZiBwcm9wZXJ0eUluZGV4IGlzIGFscmVhZHkgYW4gaW50ZWdlclxuXHRcdFx0XHRcdC8vIGFuZCBjb252ZXJ0IHRoZSBpbnRlZ2VyIHN0cmluZyB0byBhIHRydWUgaW50ZWdlci5cblxuXHRcdFx0XHRcdHRhcmdldE9iamVjdCA9IHRhcmdldE9iamVjdC5za2VsZXRvbi5ib25lcztcblxuXHRcdFx0XHRcdC8vIHN1cHBvcnQgcmVzb2x2aW5nIG1vcnBoVGFyZ2V0IG5hbWVzIGludG8gaW5kaWNlcy5cblx0XHRcdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCB0YXJnZXRPYmplY3QubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRcdFx0XHRpZiAoIHRhcmdldE9iamVjdFsgaSBdLm5hbWUgPT09IG9iamVjdEluZGV4ICkge1xuXG5cdFx0XHRcdFx0XHRcdG9iamVjdEluZGV4ID0gaTtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGRlZmF1bHQ6XG5cblx0XHRcdFx0XHRpZiAoIHRhcmdldE9iamVjdFsgb2JqZWN0TmFtZSBdID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBvYmplY3ROYW1lIG9mIG5vZGUgdW5kZWZpbmVkLicsIHRoaXMgKTtcblx0XHRcdFx0XHRcdHJldHVybjtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHRhcmdldE9iamVjdCA9IHRhcmdldE9iamVjdFsgb2JqZWN0TmFtZSBdO1xuXG5cdFx0XHR9XG5cblxuXHRcdFx0aWYgKCBvYmplY3RJbmRleCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGlmICggdGFyZ2V0T2JqZWN0WyBvYmplY3RJbmRleCBdID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBUcnlpbmcgdG8gYmluZCB0byBvYmplY3RJbmRleCBvZiBvYmplY3ROYW1lLCBidXQgaXMgdW5kZWZpbmVkLicsIHRoaXMsIHRhcmdldE9iamVjdCApO1xuXHRcdFx0XHRcdHJldHVybjtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGFyZ2V0T2JqZWN0ID0gdGFyZ2V0T2JqZWN0WyBvYmplY3RJbmRleCBdO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvLyByZXNvbHZlIHByb3BlcnR5XG5cdFx0dmFyIG5vZGVQcm9wZXJ0eSA9IHRhcmdldE9iamVjdFsgcHJvcGVydHlOYW1lIF07XG5cblx0XHRpZiAoIG5vZGVQcm9wZXJ0eSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR2YXIgbm9kZU5hbWUgPSBwYXJzZWRQYXRoLm5vZGVOYW1lO1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBUcnlpbmcgdG8gdXBkYXRlIHByb3BlcnR5IGZvciB0cmFjazogJyArIG5vZGVOYW1lICtcblx0XHRcdFx0Jy4nICsgcHJvcGVydHlOYW1lICsgJyBidXQgaXQgd2FzblxcJ3QgZm91bmQuJywgdGFyZ2V0T2JqZWN0ICk7XG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHQvLyBkZXRlcm1pbmUgdmVyc2lvbmluZyBzY2hlbWVcblx0XHR2YXIgdmVyc2lvbmluZyA9IHRoaXMuVmVyc2lvbmluZy5Ob25lO1xuXG5cdFx0aWYgKCB0YXJnZXRPYmplY3QubmVlZHNVcGRhdGUgIT09IHVuZGVmaW5lZCApIHsgLy8gbWF0ZXJpYWxcblxuXHRcdFx0dmVyc2lvbmluZyA9IHRoaXMuVmVyc2lvbmluZy5OZWVkc1VwZGF0ZTtcblx0XHRcdHRoaXMudGFyZ2V0T2JqZWN0ID0gdGFyZ2V0T2JqZWN0O1xuXG5cdFx0fSBlbHNlIGlmICggdGFyZ2V0T2JqZWN0Lm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUgIT09IHVuZGVmaW5lZCApIHsgLy8gbm9kZSB0cmFuc2Zvcm1cblxuXHRcdFx0dmVyc2lvbmluZyA9IHRoaXMuVmVyc2lvbmluZy5NYXRyaXhXb3JsZE5lZWRzVXBkYXRlO1xuXHRcdFx0dGhpcy50YXJnZXRPYmplY3QgPSB0YXJnZXRPYmplY3Q7XG5cblx0XHR9XG5cblx0XHQvLyBkZXRlcm1pbmUgaG93IHRoZSBwcm9wZXJ0eSBnZXRzIGJvdW5kXG5cdFx0dmFyIGJpbmRpbmdUeXBlID0gdGhpcy5CaW5kaW5nVHlwZS5EaXJlY3Q7XG5cblx0XHRpZiAoIHByb3BlcnR5SW5kZXggIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Ly8gYWNjZXNzIGEgc3ViIGVsZW1lbnQgb2YgdGhlIHByb3BlcnR5IGFycmF5IChvbmx5IHByaW1pdGl2ZXMgYXJlIHN1cHBvcnRlZCByaWdodCBub3cpXG5cblx0XHRcdGlmICggcHJvcGVydHlOYW1lID09PSBcIm1vcnBoVGFyZ2V0SW5mbHVlbmNlc1wiICkge1xuXG5cdFx0XHRcdC8vIHBvdGVudGlhbCBvcHRpbWl6YXRpb24sIHNraXAgdGhpcyBpZiBwcm9wZXJ0eUluZGV4IGlzIGFscmVhZHkgYW4gaW50ZWdlciwgYW5kIGNvbnZlcnQgdGhlIGludGVnZXIgc3RyaW5nIHRvIGEgdHJ1ZSBpbnRlZ2VyLlxuXG5cdFx0XHRcdC8vIHN1cHBvcnQgcmVzb2x2aW5nIG1vcnBoVGFyZ2V0IG5hbWVzIGludG8gaW5kaWNlcy5cblx0XHRcdFx0aWYgKCAhIHRhcmdldE9iamVjdC5nZW9tZXRyeSApIHtcblxuXHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBtb3JwaFRhcmdldEluZmx1ZW5jZXMgYmVjYXVzZSBub2RlIGRvZXMgbm90IGhhdmUgYSBnZW9tZXRyeS4nLCB0aGlzICk7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIHRhcmdldE9iamVjdC5nZW9tZXRyeS5pc0J1ZmZlckdlb21ldHJ5ICkge1xuXG5cdFx0XHRcdFx0aWYgKCAhIHRhcmdldE9iamVjdC5nZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMgKSB7XG5cblx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBtb3JwaFRhcmdldEluZmx1ZW5jZXMgYmVjYXVzZSBub2RlIGRvZXMgbm90IGhhdmUgYSBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMuJywgdGhpcyApO1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgdGhpcy5ub2RlLmdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbi5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdGlmICggdGFyZ2V0T2JqZWN0Lmdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvblsgaSBdLm5hbWUgPT09IHByb3BlcnR5SW5kZXggKSB7XG5cblx0XHRcdFx0XHRcdFx0cHJvcGVydHlJbmRleCA9IGk7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9XG5cblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0aWYgKCAhIHRhcmdldE9iamVjdC5nZW9tZXRyeS5tb3JwaFRhcmdldHMgKSB7XG5cblx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBtb3JwaFRhcmdldEluZmx1ZW5jZXMgYmVjYXVzZSBub2RlIGRvZXMgbm90IGhhdmUgYSBnZW9tZXRyeS5tb3JwaFRhcmdldHMuJywgdGhpcyApO1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgdGhpcy5ub2RlLmdlb21ldHJ5Lm1vcnBoVGFyZ2V0cy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdGlmICggdGFyZ2V0T2JqZWN0Lmdlb21ldHJ5Lm1vcnBoVGFyZ2V0c1sgaSBdLm5hbWUgPT09IHByb3BlcnR5SW5kZXggKSB7XG5cblx0XHRcdFx0XHRcdFx0cHJvcGVydHlJbmRleCA9IGk7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdGJpbmRpbmdUeXBlID0gdGhpcy5CaW5kaW5nVHlwZS5BcnJheUVsZW1lbnQ7XG5cblx0XHRcdHRoaXMucmVzb2x2ZWRQcm9wZXJ0eSA9IG5vZGVQcm9wZXJ0eTtcblx0XHRcdHRoaXMucHJvcGVydHlJbmRleCA9IHByb3BlcnR5SW5kZXg7XG5cblx0XHR9IGVsc2UgaWYgKCBub2RlUHJvcGVydHkuZnJvbUFycmF5ICE9PSB1bmRlZmluZWQgJiYgbm9kZVByb3BlcnR5LnRvQXJyYXkgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Ly8gbXVzdCB1c2UgY29weSBmb3IgT2JqZWN0M0QuRXVsZXIvUXVhdGVybmlvblxuXG5cdFx0XHRiaW5kaW5nVHlwZSA9IHRoaXMuQmluZGluZ1R5cGUuSGFzRnJvbVRvQXJyYXk7XG5cblx0XHRcdHRoaXMucmVzb2x2ZWRQcm9wZXJ0eSA9IG5vZGVQcm9wZXJ0eTtcblxuXHRcdH0gZWxzZSBpZiAoIEFycmF5LmlzQXJyYXkoIG5vZGVQcm9wZXJ0eSApICkge1xuXG5cdFx0XHRiaW5kaW5nVHlwZSA9IHRoaXMuQmluZGluZ1R5cGUuRW50aXJlQXJyYXk7XG5cblx0XHRcdHRoaXMucmVzb2x2ZWRQcm9wZXJ0eSA9IG5vZGVQcm9wZXJ0eTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHRoaXMucHJvcGVydHlOYW1lID0gcHJvcGVydHlOYW1lO1xuXG5cdFx0fVxuXG5cdFx0Ly8gc2VsZWN0IGdldHRlciAvIHNldHRlclxuXHRcdHRoaXMuZ2V0VmFsdWUgPSB0aGlzLkdldHRlckJ5QmluZGluZ1R5cGVbIGJpbmRpbmdUeXBlIF07XG5cdFx0dGhpcy5zZXRWYWx1ZSA9IHRoaXMuU2V0dGVyQnlCaW5kaW5nVHlwZUFuZFZlcnNpb25pbmdbIGJpbmRpbmdUeXBlIF1bIHZlcnNpb25pbmcgXTtcblxuXHR9LFxuXG5cdHVuYmluZDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5ub2RlID0gbnVsbDtcblxuXHRcdC8vIGJhY2sgdG8gdGhlIHByb3RvdHlwZSB2ZXJzaW9uIG9mIGdldFZhbHVlIC8gc2V0VmFsdWVcblx0XHQvLyBub3RlOiBhdm9pZGluZyB0byBtdXRhdGUgdGhlIHNoYXBlIG9mICd0aGlzJyB2aWEgJ2RlbGV0ZSdcblx0XHR0aGlzLmdldFZhbHVlID0gdGhpcy5fZ2V0VmFsdWVfdW5ib3VuZDtcblx0XHR0aGlzLnNldFZhbHVlID0gdGhpcy5fc2V0VmFsdWVfdW5ib3VuZDtcblxuXHR9XG5cbn0gKTtcblxuLy8hXFwgREVDTEFSRSBBTElBUyBBRlRFUiBhc3NpZ24gcHJvdG90eXBlICFcbk9iamVjdC5hc3NpZ24oIFByb3BlcnR5QmluZGluZy5wcm90b3R5cGUsIHtcblxuXHQvLyBpbml0aWFsIHN0YXRlIG9mIHRoZXNlIG1ldGhvZHMgdGhhdCBjYWxscyAnYmluZCdcblx0X2dldFZhbHVlX3VuYm91bmQ6IFByb3BlcnR5QmluZGluZy5wcm90b3R5cGUuZ2V0VmFsdWUsXG5cdF9zZXRWYWx1ZV91bmJvdW5kOiBQcm9wZXJ0eUJpbmRpbmcucHJvdG90eXBlLnNldFZhbHVlLFxuXG59ICk7XG5cbi8qKlxuICpcbiAqIEEgZ3JvdXAgb2Ygb2JqZWN0cyB0aGF0IHJlY2VpdmVzIGEgc2hhcmVkIGFuaW1hdGlvbiBzdGF0ZS5cbiAqXG4gKiBVc2FnZTpcbiAqXG4gKiBcdC1cdEFkZCBvYmplY3RzIHlvdSB3b3VsZCBvdGhlcndpc2UgcGFzcyBhcyAncm9vdCcgdG8gdGhlXG4gKiBcdFx0Y29uc3RydWN0b3Igb3IgdGhlIC5jbGlwQWN0aW9uIG1ldGhvZCBvZiBBbmltYXRpb25NaXhlci5cbiAqXG4gKiBcdC1cdEluc3RlYWQgcGFzcyB0aGlzIG9iamVjdCBhcyAncm9vdCcuXG4gKlxuICogXHQtXHRZb3UgY2FuIGFsc28gYWRkIGFuZCByZW1vdmUgb2JqZWN0cyBsYXRlciB3aGVuIHRoZSBtaXhlclxuICogXHRcdGlzIHJ1bm5pbmcuXG4gKlxuICogTm90ZTpcbiAqXG4gKiAgXHRPYmplY3RzIG9mIHRoaXMgY2xhc3MgYXBwZWFyIGFzIG9uZSBvYmplY3QgdG8gdGhlIG1peGVyLFxuICogIFx0c28gY2FjaGUgY29udHJvbCBvZiB0aGUgaW5kaXZpZHVhbCBvYmplY3RzIG11c3QgYmUgZG9uZVxuICogIFx0b24gdGhlIGdyb3VwLlxuICpcbiAqIExpbWl0YXRpb246XG4gKlxuICogXHQtIFx0VGhlIGFuaW1hdGVkIHByb3BlcnRpZXMgbXVzdCBiZSBjb21wYXRpYmxlIGFtb25nIHRoZVxuICogXHRcdGFsbCBvYmplY3RzIGluIHRoZSBncm91cC5cbiAqXG4gKiAgLVx0QSBzaW5nbGUgcHJvcGVydHkgY2FuIGVpdGhlciBiZSBjb250cm9sbGVkIHRocm91Z2ggYVxuICogIFx0dGFyZ2V0IGdyb3VwIG9yIGRpcmVjdGx5LCBidXQgbm90IGJvdGguXG4gKlxuICogQGF1dGhvciB0c2Nod1xuICovXG5cbmZ1bmN0aW9uIEFuaW1hdGlvbk9iamVjdEdyb3VwKCkge1xuXG5cdHRoaXMudXVpZCA9IF9NYXRoLmdlbmVyYXRlVVVJRCgpO1xuXG5cdC8vIGNhY2hlZCBvYmplY3RzIGZvbGxvd2VkIGJ5IHRoZSBhY3RpdmUgb25lc1xuXHR0aGlzLl9vYmplY3RzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoIGFyZ3VtZW50cyApO1xuXG5cdHRoaXMubkNhY2hlZE9iamVjdHNfID0gMDtcdFx0XHQvLyB0aHJlc2hvbGRcblx0Ly8gbm90ZTogcmVhZCBieSBQcm9wZXJ0eUJpbmRpbmcuQ29tcG9zaXRlXG5cblx0dmFyIGluZGljZXMgPSB7fTtcblx0dGhpcy5faW5kaWNlc0J5VVVJRCA9IGluZGljZXM7XHRcdC8vIGZvciBib29ra2VlcGluZ1xuXG5cdGZvciAoIHZhciBpID0gMCwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRpbmRpY2VzWyBhcmd1bWVudHNbIGkgXS51dWlkIF0gPSBpO1xuXG5cdH1cblxuXHR0aGlzLl9wYXRocyA9IFtdO1x0XHRcdFx0XHQvLyBpbnNpZGU6IHN0cmluZ1xuXHR0aGlzLl9wYXJzZWRQYXRocyA9IFtdO1x0XHRcdFx0Ly8gaW5zaWRlOiB7IHdlIGRvbid0IGNhcmUsIGhlcmUgfVxuXHR0aGlzLl9iaW5kaW5ncyA9IFtdOyBcdFx0XHRcdC8vIGluc2lkZTogQXJyYXk8IFByb3BlcnR5QmluZGluZyA+XG5cdHRoaXMuX2JpbmRpbmdzSW5kaWNlc0J5UGF0aCA9IHt9OyBcdC8vIGluc2lkZTogaW5kaWNlcyBpbiB0aGVzZSBhcnJheXNcblxuXHR2YXIgc2NvcGUgPSB0aGlzO1xuXG5cdHRoaXMuc3RhdHMgPSB7XG5cblx0XHRvYmplY3RzOiB7XG5cdFx0XHRnZXQgdG90YWwoKSB7XG5cblx0XHRcdFx0cmV0dXJuIHNjb3BlLl9vYmplY3RzLmxlbmd0aDtcblxuXHRcdFx0fSxcblx0XHRcdGdldCBpblVzZSgpIHtcblxuXHRcdFx0XHRyZXR1cm4gdGhpcy50b3RhbCAtIHNjb3BlLm5DYWNoZWRPYmplY3RzXztcblxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0Z2V0IGJpbmRpbmdzUGVyT2JqZWN0KCkge1xuXG5cdFx0XHRyZXR1cm4gc2NvcGUuX2JpbmRpbmdzLmxlbmd0aDtcblxuXHRcdH1cblxuXHR9O1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIEFuaW1hdGlvbk9iamVjdEdyb3VwLnByb3RvdHlwZSwge1xuXG5cdGlzQW5pbWF0aW9uT2JqZWN0R3JvdXA6IHRydWUsXG5cblx0YWRkOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgb2JqZWN0cyA9IHRoaXMuX29iamVjdHMsXG5cdFx0XHRuT2JqZWN0cyA9IG9iamVjdHMubGVuZ3RoLFxuXHRcdFx0bkNhY2hlZE9iamVjdHMgPSB0aGlzLm5DYWNoZWRPYmplY3RzXyxcblx0XHRcdGluZGljZXNCeVVVSUQgPSB0aGlzLl9pbmRpY2VzQnlVVUlELFxuXHRcdFx0cGF0aHMgPSB0aGlzLl9wYXRocyxcblx0XHRcdHBhcnNlZFBhdGhzID0gdGhpcy5fcGFyc2VkUGF0aHMsXG5cdFx0XHRiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzLFxuXHRcdFx0bkJpbmRpbmdzID0gYmluZGluZ3MubGVuZ3RoLFxuXHRcdFx0a25vd25PYmplY3QgPSB1bmRlZmluZWQ7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHR2YXIgb2JqZWN0ID0gYXJndW1lbnRzWyBpIF0sXG5cdFx0XHRcdHV1aWQgPSBvYmplY3QudXVpZCxcblx0XHRcdFx0aW5kZXggPSBpbmRpY2VzQnlVVUlEWyB1dWlkIF07XG5cblx0XHRcdGlmICggaW5kZXggPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHQvLyB1bmtub3duIG9iamVjdCAtPiBhZGQgaXQgdG8gdGhlIEFDVElWRSByZWdpb25cblxuXHRcdFx0XHRpbmRleCA9IG5PYmplY3RzICsrO1xuXHRcdFx0XHRpbmRpY2VzQnlVVUlEWyB1dWlkIF0gPSBpbmRleDtcblx0XHRcdFx0b2JqZWN0cy5wdXNoKCBvYmplY3QgKTtcblxuXHRcdFx0XHQvLyBhY2NvdW50aW5nIGlzIGRvbmUsIG5vdyBkbyB0aGUgc2FtZSBmb3IgYWxsIGJpbmRpbmdzXG5cblx0XHRcdFx0Zm9yICggdmFyIGogPSAwLCBtID0gbkJpbmRpbmdzOyBqICE9PSBtOyArKyBqICkge1xuXG5cdFx0XHRcdFx0YmluZGluZ3NbIGogXS5wdXNoKCBuZXcgUHJvcGVydHlCaW5kaW5nKCBvYmplY3QsIHBhdGhzWyBqIF0sIHBhcnNlZFBhdGhzWyBqIF0gKSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIGlmICggaW5kZXggPCBuQ2FjaGVkT2JqZWN0cyApIHtcblxuXHRcdFx0XHRrbm93bk9iamVjdCA9IG9iamVjdHNbIGluZGV4IF07XG5cblx0XHRcdFx0Ly8gbW92ZSBleGlzdGluZyBvYmplY3QgdG8gdGhlIEFDVElWRSByZWdpb25cblxuXHRcdFx0XHR2YXIgZmlyc3RBY3RpdmVJbmRleCA9IC0tIG5DYWNoZWRPYmplY3RzLFxuXHRcdFx0XHRcdGxhc3RDYWNoZWRPYmplY3QgPSBvYmplY3RzWyBmaXJzdEFjdGl2ZUluZGV4IF07XG5cblx0XHRcdFx0aW5kaWNlc0J5VVVJRFsgbGFzdENhY2hlZE9iamVjdC51dWlkIF0gPSBpbmRleDtcblx0XHRcdFx0b2JqZWN0c1sgaW5kZXggXSA9IGxhc3RDYWNoZWRPYmplY3Q7XG5cblx0XHRcdFx0aW5kaWNlc0J5VVVJRFsgdXVpZCBdID0gZmlyc3RBY3RpdmVJbmRleDtcblx0XHRcdFx0b2JqZWN0c1sgZmlyc3RBY3RpdmVJbmRleCBdID0gb2JqZWN0O1xuXG5cdFx0XHRcdC8vIGFjY291bnRpbmcgaXMgZG9uZSwgbm93IGRvIHRoZSBzYW1lIGZvciBhbGwgYmluZGluZ3NcblxuXHRcdFx0XHRmb3IgKCB2YXIgaiA9IDAsIG0gPSBuQmluZGluZ3M7IGogIT09IG07ICsrIGogKSB7XG5cblx0XHRcdFx0XHR2YXIgYmluZGluZ3NGb3JQYXRoID0gYmluZGluZ3NbIGogXSxcblx0XHRcdFx0XHRcdGxhc3RDYWNoZWQgPSBiaW5kaW5nc0ZvclBhdGhbIGZpcnN0QWN0aXZlSW5kZXggXSxcblx0XHRcdFx0XHRcdGJpbmRpbmcgPSBiaW5kaW5nc0ZvclBhdGhbIGluZGV4IF07XG5cblx0XHRcdFx0XHRiaW5kaW5nc0ZvclBhdGhbIGluZGV4IF0gPSBsYXN0Q2FjaGVkO1xuXG5cdFx0XHRcdFx0aWYgKCBiaW5kaW5nID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRcdC8vIHNpbmNlIHdlIGRvIG5vdCBib3RoZXIgdG8gY3JlYXRlIG5ldyBiaW5kaW5nc1xuXHRcdFx0XHRcdFx0Ly8gZm9yIG9iamVjdHMgdGhhdCBhcmUgY2FjaGVkLCB0aGUgYmluZGluZyBtYXlcblx0XHRcdFx0XHRcdC8vIG9yIG1heSBub3QgZXhpc3RcblxuXHRcdFx0XHRcdFx0YmluZGluZyA9IG5ldyBQcm9wZXJ0eUJpbmRpbmcoIG9iamVjdCwgcGF0aHNbIGogXSwgcGFyc2VkUGF0aHNbIGogXSApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0YmluZGluZ3NGb3JQYXRoWyBmaXJzdEFjdGl2ZUluZGV4IF0gPSBiaW5kaW5nO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIGlmICggb2JqZWN0c1sgaW5kZXggXSAhPT0ga25vd25PYmplY3QgKSB7XG5cblx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLkFuaW1hdGlvbk9iamVjdEdyb3VwOiBEaWZmZXJlbnQgb2JqZWN0cyB3aXRoIHRoZSBzYW1lIFVVSUQgJyArXG5cdFx0XHRcdFx0XHQnZGV0ZWN0ZWQuIENsZWFuIHRoZSBjYWNoZXMgb3IgcmVjcmVhdGUgeW91ciBpbmZyYXN0cnVjdHVyZSB3aGVuIHJlbG9hZGluZyBzY2VuZXMuJyApO1xuXG5cdFx0XHR9IC8vIGVsc2UgdGhlIG9iamVjdCBpcyBhbHJlYWR5IHdoZXJlIHdlIHdhbnQgaXQgdG8gYmVcblxuXHRcdH0gLy8gZm9yIGFyZ3VtZW50c1xuXG5cdFx0dGhpcy5uQ2FjaGVkT2JqZWN0c18gPSBuQ2FjaGVkT2JqZWN0cztcblxuXHR9LFxuXG5cdHJlbW92ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIG9iamVjdHMgPSB0aGlzLl9vYmplY3RzLFxuXHRcdFx0bkNhY2hlZE9iamVjdHMgPSB0aGlzLm5DYWNoZWRPYmplY3RzXyxcblx0XHRcdGluZGljZXNCeVVVSUQgPSB0aGlzLl9pbmRpY2VzQnlVVUlELFxuXHRcdFx0YmluZGluZ3MgPSB0aGlzLl9iaW5kaW5ncyxcblx0XHRcdG5CaW5kaW5ncyA9IGJpbmRpbmdzLmxlbmd0aDtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRcdHZhciBvYmplY3QgPSBhcmd1bWVudHNbIGkgXSxcblx0XHRcdFx0dXVpZCA9IG9iamVjdC51dWlkLFxuXHRcdFx0XHRpbmRleCA9IGluZGljZXNCeVVVSURbIHV1aWQgXTtcblxuXHRcdFx0aWYgKCBpbmRleCAhPT0gdW5kZWZpbmVkICYmIGluZGV4ID49IG5DYWNoZWRPYmplY3RzICkge1xuXG5cdFx0XHRcdC8vIG1vdmUgZXhpc3Rpbmcgb2JqZWN0IGludG8gdGhlIENBQ0hFRCByZWdpb25cblxuXHRcdFx0XHR2YXIgbGFzdENhY2hlZEluZGV4ID0gbkNhY2hlZE9iamVjdHMgKyssXG5cdFx0XHRcdFx0Zmlyc3RBY3RpdmVPYmplY3QgPSBvYmplY3RzWyBsYXN0Q2FjaGVkSW5kZXggXTtcblxuXHRcdFx0XHRpbmRpY2VzQnlVVUlEWyBmaXJzdEFjdGl2ZU9iamVjdC51dWlkIF0gPSBpbmRleDtcblx0XHRcdFx0b2JqZWN0c1sgaW5kZXggXSA9IGZpcnN0QWN0aXZlT2JqZWN0O1xuXG5cdFx0XHRcdGluZGljZXNCeVVVSURbIHV1aWQgXSA9IGxhc3RDYWNoZWRJbmRleDtcblx0XHRcdFx0b2JqZWN0c1sgbGFzdENhY2hlZEluZGV4IF0gPSBvYmplY3Q7XG5cblx0XHRcdFx0Ly8gYWNjb3VudGluZyBpcyBkb25lLCBub3cgZG8gdGhlIHNhbWUgZm9yIGFsbCBiaW5kaW5nc1xuXG5cdFx0XHRcdGZvciAoIHZhciBqID0gMCwgbSA9IG5CaW5kaW5nczsgaiAhPT0gbTsgKysgaiApIHtcblxuXHRcdFx0XHRcdHZhciBiaW5kaW5nc0ZvclBhdGggPSBiaW5kaW5nc1sgaiBdLFxuXHRcdFx0XHRcdFx0Zmlyc3RBY3RpdmUgPSBiaW5kaW5nc0ZvclBhdGhbIGxhc3RDYWNoZWRJbmRleCBdLFxuXHRcdFx0XHRcdFx0YmluZGluZyA9IGJpbmRpbmdzRm9yUGF0aFsgaW5kZXggXTtcblxuXHRcdFx0XHRcdGJpbmRpbmdzRm9yUGF0aFsgaW5kZXggXSA9IGZpcnN0QWN0aXZlO1xuXHRcdFx0XHRcdGJpbmRpbmdzRm9yUGF0aFsgbGFzdENhY2hlZEluZGV4IF0gPSBiaW5kaW5nO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fSAvLyBmb3IgYXJndW1lbnRzXG5cblx0XHR0aGlzLm5DYWNoZWRPYmplY3RzXyA9IG5DYWNoZWRPYmplY3RzO1xuXG5cdH0sXG5cblx0Ly8gcmVtb3ZlICYgZm9yZ2V0XG5cdHVuY2FjaGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBvYmplY3RzID0gdGhpcy5fb2JqZWN0cyxcblx0XHRcdG5PYmplY3RzID0gb2JqZWN0cy5sZW5ndGgsXG5cdFx0XHRuQ2FjaGVkT2JqZWN0cyA9IHRoaXMubkNhY2hlZE9iamVjdHNfLFxuXHRcdFx0aW5kaWNlc0J5VVVJRCA9IHRoaXMuX2luZGljZXNCeVVVSUQsXG5cdFx0XHRiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzLFxuXHRcdFx0bkJpbmRpbmdzID0gYmluZGluZ3MubGVuZ3RoO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0dmFyIG9iamVjdCA9IGFyZ3VtZW50c1sgaSBdLFxuXHRcdFx0XHR1dWlkID0gb2JqZWN0LnV1aWQsXG5cdFx0XHRcdGluZGV4ID0gaW5kaWNlc0J5VVVJRFsgdXVpZCBdO1xuXG5cdFx0XHRpZiAoIGluZGV4ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0ZGVsZXRlIGluZGljZXNCeVVVSURbIHV1aWQgXTtcblxuXHRcdFx0XHRpZiAoIGluZGV4IDwgbkNhY2hlZE9iamVjdHMgKSB7XG5cblx0XHRcdFx0XHQvLyBvYmplY3QgaXMgY2FjaGVkLCBzaHJpbmsgdGhlIENBQ0hFRCByZWdpb25cblxuXHRcdFx0XHRcdHZhciBmaXJzdEFjdGl2ZUluZGV4ID0gLS0gbkNhY2hlZE9iamVjdHMsXG5cdFx0XHRcdFx0XHRsYXN0Q2FjaGVkT2JqZWN0ID0gb2JqZWN0c1sgZmlyc3RBY3RpdmVJbmRleCBdLFxuXHRcdFx0XHRcdFx0bGFzdEluZGV4ID0gLS0gbk9iamVjdHMsXG5cdFx0XHRcdFx0XHRsYXN0T2JqZWN0ID0gb2JqZWN0c1sgbGFzdEluZGV4IF07XG5cblx0XHRcdFx0XHQvLyBsYXN0IGNhY2hlZCBvYmplY3QgdGFrZXMgdGhpcyBvYmplY3QncyBwbGFjZVxuXHRcdFx0XHRcdGluZGljZXNCeVVVSURbIGxhc3RDYWNoZWRPYmplY3QudXVpZCBdID0gaW5kZXg7XG5cdFx0XHRcdFx0b2JqZWN0c1sgaW5kZXggXSA9IGxhc3RDYWNoZWRPYmplY3Q7XG5cblx0XHRcdFx0XHQvLyBsYXN0IG9iamVjdCBnb2VzIHRvIHRoZSBhY3RpdmF0ZWQgc2xvdCBhbmQgcG9wXG5cdFx0XHRcdFx0aW5kaWNlc0J5VVVJRFsgbGFzdE9iamVjdC51dWlkIF0gPSBmaXJzdEFjdGl2ZUluZGV4O1xuXHRcdFx0XHRcdG9iamVjdHNbIGZpcnN0QWN0aXZlSW5kZXggXSA9IGxhc3RPYmplY3Q7XG5cdFx0XHRcdFx0b2JqZWN0cy5wb3AoKTtcblxuXHRcdFx0XHRcdC8vIGFjY291bnRpbmcgaXMgZG9uZSwgbm93IGRvIHRoZSBzYW1lIGZvciBhbGwgYmluZGluZ3NcblxuXHRcdFx0XHRcdGZvciAoIHZhciBqID0gMCwgbSA9IG5CaW5kaW5nczsgaiAhPT0gbTsgKysgaiApIHtcblxuXHRcdFx0XHRcdFx0dmFyIGJpbmRpbmdzRm9yUGF0aCA9IGJpbmRpbmdzWyBqIF0sXG5cdFx0XHRcdFx0XHRcdGxhc3RDYWNoZWQgPSBiaW5kaW5nc0ZvclBhdGhbIGZpcnN0QWN0aXZlSW5kZXggXSxcblx0XHRcdFx0XHRcdFx0bGFzdCA9IGJpbmRpbmdzRm9yUGF0aFsgbGFzdEluZGV4IF07XG5cblx0XHRcdFx0XHRcdGJpbmRpbmdzRm9yUGF0aFsgaW5kZXggXSA9IGxhc3RDYWNoZWQ7XG5cdFx0XHRcdFx0XHRiaW5kaW5nc0ZvclBhdGhbIGZpcnN0QWN0aXZlSW5kZXggXSA9IGxhc3Q7XG5cdFx0XHRcdFx0XHRiaW5kaW5nc0ZvclBhdGgucG9wKCk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdC8vIG9iamVjdCBpcyBhY3RpdmUsIGp1c3Qgc3dhcCB3aXRoIHRoZSBsYXN0IGFuZCBwb3BcblxuXHRcdFx0XHRcdHZhciBsYXN0SW5kZXggPSAtLSBuT2JqZWN0cyxcblx0XHRcdFx0XHRcdGxhc3RPYmplY3QgPSBvYmplY3RzWyBsYXN0SW5kZXggXTtcblxuXHRcdFx0XHRcdGluZGljZXNCeVVVSURbIGxhc3RPYmplY3QudXVpZCBdID0gaW5kZXg7XG5cdFx0XHRcdFx0b2JqZWN0c1sgaW5kZXggXSA9IGxhc3RPYmplY3Q7XG5cdFx0XHRcdFx0b2JqZWN0cy5wb3AoKTtcblxuXHRcdFx0XHRcdC8vIGFjY291bnRpbmcgaXMgZG9uZSwgbm93IGRvIHRoZSBzYW1lIGZvciBhbGwgYmluZGluZ3NcblxuXHRcdFx0XHRcdGZvciAoIHZhciBqID0gMCwgbSA9IG5CaW5kaW5nczsgaiAhPT0gbTsgKysgaiApIHtcblxuXHRcdFx0XHRcdFx0dmFyIGJpbmRpbmdzRm9yUGF0aCA9IGJpbmRpbmdzWyBqIF07XG5cblx0XHRcdFx0XHRcdGJpbmRpbmdzRm9yUGF0aFsgaW5kZXggXSA9IGJpbmRpbmdzRm9yUGF0aFsgbGFzdEluZGV4IF07XG5cdFx0XHRcdFx0XHRiaW5kaW5nc0ZvclBhdGgucG9wKCk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSAvLyBjYWNoZWQgb3IgYWN0aXZlXG5cblx0XHRcdH0gLy8gaWYgb2JqZWN0IGlzIGtub3duXG5cblx0XHR9IC8vIGZvciBhcmd1bWVudHNcblxuXHRcdHRoaXMubkNhY2hlZE9iamVjdHNfID0gbkNhY2hlZE9iamVjdHM7XG5cblx0fSxcblxuXHQvLyBJbnRlcm5hbCBpbnRlcmZhY2UgdXNlZCBieSBiZWZyaWVuZGVkIFByb3BlcnR5QmluZGluZy5Db21wb3NpdGU6XG5cblx0c3Vic2NyaWJlXzogZnVuY3Rpb24gKCBwYXRoLCBwYXJzZWRQYXRoICkge1xuXG5cdFx0Ly8gcmV0dXJucyBhbiBhcnJheSBvZiBiaW5kaW5ncyBmb3IgdGhlIGdpdmVuIHBhdGggdGhhdCBpcyBjaGFuZ2VkXG5cdFx0Ly8gYWNjb3JkaW5nIHRvIHRoZSBjb250YWluZWQgb2JqZWN0cyBpbiB0aGUgZ3JvdXBcblxuXHRcdHZhciBpbmRpY2VzQnlQYXRoID0gdGhpcy5fYmluZGluZ3NJbmRpY2VzQnlQYXRoLFxuXHRcdFx0aW5kZXggPSBpbmRpY2VzQnlQYXRoWyBwYXRoIF0sXG5cdFx0XHRiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzO1xuXG5cdFx0aWYgKCBpbmRleCAhPT0gdW5kZWZpbmVkICkgcmV0dXJuIGJpbmRpbmdzWyBpbmRleCBdO1xuXG5cdFx0dmFyIHBhdGhzID0gdGhpcy5fcGF0aHMsXG5cdFx0XHRwYXJzZWRQYXRocyA9IHRoaXMuX3BhcnNlZFBhdGhzLFxuXHRcdFx0b2JqZWN0cyA9IHRoaXMuX29iamVjdHMsXG5cdFx0XHRuT2JqZWN0cyA9IG9iamVjdHMubGVuZ3RoLFxuXHRcdFx0bkNhY2hlZE9iamVjdHMgPSB0aGlzLm5DYWNoZWRPYmplY3RzXyxcblx0XHRcdGJpbmRpbmdzRm9yUGF0aCA9IG5ldyBBcnJheSggbk9iamVjdHMgKTtcblxuXHRcdGluZGV4ID0gYmluZGluZ3MubGVuZ3RoO1xuXG5cdFx0aW5kaWNlc0J5UGF0aFsgcGF0aCBdID0gaW5kZXg7XG5cblx0XHRwYXRocy5wdXNoKCBwYXRoICk7XG5cdFx0cGFyc2VkUGF0aHMucHVzaCggcGFyc2VkUGF0aCApO1xuXHRcdGJpbmRpbmdzLnB1c2goIGJpbmRpbmdzRm9yUGF0aCApO1xuXG5cdFx0Zm9yICggdmFyIGkgPSBuQ2FjaGVkT2JqZWN0cywgbiA9IG9iamVjdHMubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHR2YXIgb2JqZWN0ID0gb2JqZWN0c1sgaSBdO1xuXHRcdFx0YmluZGluZ3NGb3JQYXRoWyBpIF0gPSBuZXcgUHJvcGVydHlCaW5kaW5nKCBvYmplY3QsIHBhdGgsIHBhcnNlZFBhdGggKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBiaW5kaW5nc0ZvclBhdGg7XG5cblx0fSxcblxuXHR1bnN1YnNjcmliZV86IGZ1bmN0aW9uICggcGF0aCApIHtcblxuXHRcdC8vIHRlbGxzIHRoZSBncm91cCB0byBmb3JnZXQgYWJvdXQgYSBwcm9wZXJ0eSBwYXRoIGFuZCBubyBsb25nZXJcblx0XHQvLyB1cGRhdGUgdGhlIGFycmF5IHByZXZpb3VzbHkgb2J0YWluZWQgd2l0aCAnc3Vic2NyaWJlXydcblxuXHRcdHZhciBpbmRpY2VzQnlQYXRoID0gdGhpcy5fYmluZGluZ3NJbmRpY2VzQnlQYXRoLFxuXHRcdFx0aW5kZXggPSBpbmRpY2VzQnlQYXRoWyBwYXRoIF07XG5cblx0XHRpZiAoIGluZGV4ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHZhciBwYXRocyA9IHRoaXMuX3BhdGhzLFxuXHRcdFx0XHRwYXJzZWRQYXRocyA9IHRoaXMuX3BhcnNlZFBhdGhzLFxuXHRcdFx0XHRiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzLFxuXHRcdFx0XHRsYXN0QmluZGluZ3NJbmRleCA9IGJpbmRpbmdzLmxlbmd0aCAtIDEsXG5cdFx0XHRcdGxhc3RCaW5kaW5ncyA9IGJpbmRpbmdzWyBsYXN0QmluZGluZ3NJbmRleCBdLFxuXHRcdFx0XHRsYXN0QmluZGluZ3NQYXRoID0gcGF0aFsgbGFzdEJpbmRpbmdzSW5kZXggXTtcblxuXHRcdFx0aW5kaWNlc0J5UGF0aFsgbGFzdEJpbmRpbmdzUGF0aCBdID0gaW5kZXg7XG5cblx0XHRcdGJpbmRpbmdzWyBpbmRleCBdID0gbGFzdEJpbmRpbmdzO1xuXHRcdFx0YmluZGluZ3MucG9wKCk7XG5cblx0XHRcdHBhcnNlZFBhdGhzWyBpbmRleCBdID0gcGFyc2VkUGF0aHNbIGxhc3RCaW5kaW5nc0luZGV4IF07XG5cdFx0XHRwYXJzZWRQYXRocy5wb3AoKTtcblxuXHRcdFx0cGF0aHNbIGluZGV4IF0gPSBwYXRoc1sgbGFzdEJpbmRpbmdzSW5kZXggXTtcblx0XHRcdHBhdGhzLnBvcCgpO1xuXG5cdFx0fVxuXG5cdH1cblxufSApO1xuXG4vKipcbiAqXG4gKiBBY3Rpb24gcHJvdmlkZWQgYnkgQW5pbWF0aW9uTWl4ZXIgZm9yIHNjaGVkdWxpbmcgY2xpcCBwbGF5YmFjayBvbiBzcGVjaWZpY1xuICogb2JqZWN0cy5cbiAqXG4gKiBAYXV0aG9yIEJlbiBIb3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvL1xuICogQGF1dGhvciBEYXZpZCBTYXJubyAvIGh0dHA6Ly9saWdodGhhdXMudXMvXG4gKiBAYXV0aG9yIHRzY2h3XG4gKlxuICovXG5cbmZ1bmN0aW9uIEFuaW1hdGlvbkFjdGlvbiggbWl4ZXIsIGNsaXAsIGxvY2FsUm9vdCApIHtcblxuXHR0aGlzLl9taXhlciA9IG1peGVyO1xuXHR0aGlzLl9jbGlwID0gY2xpcDtcblx0dGhpcy5fbG9jYWxSb290ID0gbG9jYWxSb290IHx8IG51bGw7XG5cblx0dmFyIHRyYWNrcyA9IGNsaXAudHJhY2tzLFxuXHRcdG5UcmFja3MgPSB0cmFja3MubGVuZ3RoLFxuXHRcdGludGVycG9sYW50cyA9IG5ldyBBcnJheSggblRyYWNrcyApO1xuXG5cdHZhciBpbnRlcnBvbGFudFNldHRpbmdzID0ge1xuXHRcdGVuZGluZ1N0YXJ0OiBaZXJvQ3VydmF0dXJlRW5kaW5nLFxuXHRcdGVuZGluZ0VuZDogWmVyb0N1cnZhdHVyZUVuZGluZ1xuXHR9O1xuXG5cdGZvciAoIHZhciBpID0gMDsgaSAhPT0gblRyYWNrczsgKysgaSApIHtcblxuXHRcdHZhciBpbnRlcnBvbGFudCA9IHRyYWNrc1sgaSBdLmNyZWF0ZUludGVycG9sYW50KCBudWxsICk7XG5cdFx0aW50ZXJwb2xhbnRzWyBpIF0gPSBpbnRlcnBvbGFudDtcblx0XHRpbnRlcnBvbGFudC5zZXR0aW5ncyA9IGludGVycG9sYW50U2V0dGluZ3M7XG5cblx0fVxuXG5cdHRoaXMuX2ludGVycG9sYW50U2V0dGluZ3MgPSBpbnRlcnBvbGFudFNldHRpbmdzO1xuXG5cdHRoaXMuX2ludGVycG9sYW50cyA9IGludGVycG9sYW50cztcdC8vIGJvdW5kIGJ5IHRoZSBtaXhlclxuXG5cdC8vIGluc2lkZTogUHJvcGVydHlNaXhlciAobWFuYWdlZCBieSB0aGUgbWl4ZXIpXG5cdHRoaXMuX3Byb3BlcnR5QmluZGluZ3MgPSBuZXcgQXJyYXkoIG5UcmFja3MgKTtcblxuXHR0aGlzLl9jYWNoZUluZGV4ID0gbnVsbDtcdFx0XHQvLyBmb3IgdGhlIG1lbW9yeSBtYW5hZ2VyXG5cdHRoaXMuX2J5Q2xpcENhY2hlSW5kZXggPSBudWxsO1x0XHQvLyBmb3IgdGhlIG1lbW9yeSBtYW5hZ2VyXG5cblx0dGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQgPSBudWxsO1xuXHR0aGlzLl93ZWlnaHRJbnRlcnBvbGFudCA9IG51bGw7XG5cblx0dGhpcy5sb29wID0gTG9vcFJlcGVhdDtcblx0dGhpcy5fbG9vcENvdW50ID0gLSAxO1xuXG5cdC8vIGdsb2JhbCBtaXhlciB0aW1lIHdoZW4gdGhlIGFjdGlvbiBpcyB0byBiZSBzdGFydGVkXG5cdC8vIGl0J3Mgc2V0IGJhY2sgdG8gJ251bGwnIHVwb24gc3RhcnQgb2YgdGhlIGFjdGlvblxuXHR0aGlzLl9zdGFydFRpbWUgPSBudWxsO1xuXG5cdC8vIHNjYWxlZCBsb2NhbCB0aW1lIG9mIHRoZSBhY3Rpb25cblx0Ly8gZ2V0cyBjbGFtcGVkIG9yIHdyYXBwZWQgdG8gMC4uY2xpcC5kdXJhdGlvbiBhY2NvcmRpbmcgdG8gbG9vcFxuXHR0aGlzLnRpbWUgPSAwO1xuXG5cdHRoaXMudGltZVNjYWxlID0gMTtcblx0dGhpcy5fZWZmZWN0aXZlVGltZVNjYWxlID0gMTtcblxuXHR0aGlzLndlaWdodCA9IDE7XG5cdHRoaXMuX2VmZmVjdGl2ZVdlaWdodCA9IDE7XG5cblx0dGhpcy5yZXBldGl0aW9ucyA9IEluZmluaXR5OyBcdFx0Ly8gbm8uIG9mIHJlcGV0aXRpb25zIHdoZW4gbG9vcGluZ1xuXG5cdHRoaXMucGF1c2VkID0gZmFsc2U7XHRcdFx0XHQvLyB0cnVlIC0+IHplcm8gZWZmZWN0aXZlIHRpbWUgc2NhbGVcblx0dGhpcy5lbmFibGVkID0gdHJ1ZTtcdFx0XHRcdC8vIGZhbHNlIC0+IHplcm8gZWZmZWN0aXZlIHdlaWdodFxuXG5cdHRoaXMuY2xhbXBXaGVuRmluaXNoZWQgXHQ9IGZhbHNlO1x0Ly8ga2VlcCBmZWVkaW5nIHRoZSBsYXN0IGZyYW1lP1xuXG5cdHRoaXMuemVyb1Nsb3BlQXRTdGFydCBcdD0gdHJ1ZTtcdFx0Ly8gZm9yIHNtb290aCBpbnRlcnBvbGF0aW9uIHcvbyBzZXBhcmF0ZVxuXHR0aGlzLnplcm9TbG9wZUF0RW5kXHRcdD0gdHJ1ZTtcdFx0Ly8gY2xpcHMgZm9yIHN0YXJ0LCBsb29wIGFuZCBlbmRcblxufVxuXG5PYmplY3QuYXNzaWduKCBBbmltYXRpb25BY3Rpb24ucHJvdG90eXBlLCB7XG5cblx0Ly8gU3RhdGUgJiBTY2hlZHVsaW5nXG5cblx0cGxheTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5fbWl4ZXIuX2FjdGl2YXRlQWN0aW9uKCB0aGlzICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHN0b3A6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuX21peGVyLl9kZWFjdGl2YXRlQWN0aW9uKCB0aGlzICk7XG5cblx0XHRyZXR1cm4gdGhpcy5yZXNldCgpO1xuXG5cdH0sXG5cblx0cmVzZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMucGF1c2VkID0gZmFsc2U7XG5cdFx0dGhpcy5lbmFibGVkID0gdHJ1ZTtcblxuXHRcdHRoaXMudGltZSA9IDA7XHRcdFx0Ly8gcmVzdGFydCBjbGlwXG5cdFx0dGhpcy5fbG9vcENvdW50ID0gLSAxO1x0Ly8gZm9yZ2V0IHByZXZpb3VzIGxvb3BzXG5cdFx0dGhpcy5fc3RhcnRUaW1lID0gbnVsbDtcdC8vIGZvcmdldCBzY2hlZHVsaW5nXG5cblx0XHRyZXR1cm4gdGhpcy5zdG9wRmFkaW5nKCkuc3RvcFdhcnBpbmcoKTtcblxuXHR9LFxuXG5cdGlzUnVubmluZzogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZW5hYmxlZCAmJiAhIHRoaXMucGF1c2VkICYmIHRoaXMudGltZVNjYWxlICE9PSAwICYmXG5cdFx0XHRcdHRoaXMuX3N0YXJ0VGltZSA9PT0gbnVsbCAmJiB0aGlzLl9taXhlci5faXNBY3RpdmVBY3Rpb24oIHRoaXMgKTtcblxuXHR9LFxuXG5cdC8vIHJldHVybiB0cnVlIHdoZW4gcGxheSBoYXMgYmVlbiBjYWxsZWRcblx0aXNTY2hlZHVsZWQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLl9taXhlci5faXNBY3RpdmVBY3Rpb24oIHRoaXMgKTtcblxuXHR9LFxuXG5cdHN0YXJ0QXQ6IGZ1bmN0aW9uICggdGltZSApIHtcblxuXHRcdHRoaXMuX3N0YXJ0VGltZSA9IHRpbWU7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldExvb3A6IGZ1bmN0aW9uICggbW9kZSwgcmVwZXRpdGlvbnMgKSB7XG5cblx0XHR0aGlzLmxvb3AgPSBtb2RlO1xuXHRcdHRoaXMucmVwZXRpdGlvbnMgPSByZXBldGl0aW9ucztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Ly8gV2VpZ2h0XG5cblx0Ly8gc2V0IHRoZSB3ZWlnaHQgc3RvcHBpbmcgYW55IHNjaGVkdWxlZCBmYWRpbmdcblx0Ly8gYWx0aG91Z2ggLmVuYWJsZWQgPSBmYWxzZSB5aWVsZHMgYW4gZWZmZWN0aXZlIHdlaWdodCBvZiB6ZXJvLCB0aGlzXG5cdC8vIG1ldGhvZCBkb2VzICpub3QqIGNoYW5nZSAuZW5hYmxlZCwgYmVjYXVzZSBpdCB3b3VsZCBiZSBjb25mdXNpbmdcblx0c2V0RWZmZWN0aXZlV2VpZ2h0OiBmdW5jdGlvbiAoIHdlaWdodCApIHtcblxuXHRcdHRoaXMud2VpZ2h0ID0gd2VpZ2h0O1xuXG5cdFx0Ly8gbm90ZTogc2FtZSBsb2dpYyBhcyB3aGVuIHVwZGF0ZWQgYXQgcnVudGltZVxuXHRcdHRoaXMuX2VmZmVjdGl2ZVdlaWdodCA9IHRoaXMuZW5hYmxlZCA/IHdlaWdodCA6IDA7XG5cblx0XHRyZXR1cm4gdGhpcy5zdG9wRmFkaW5nKCk7XG5cblx0fSxcblxuXHQvLyByZXR1cm4gdGhlIHdlaWdodCBjb25zaWRlcmluZyBmYWRpbmcgYW5kIC5lbmFibGVkXG5cdGdldEVmZmVjdGl2ZVdlaWdodDogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuX2VmZmVjdGl2ZVdlaWdodDtcblxuXHR9LFxuXG5cdGZhZGVJbjogZnVuY3Rpb24gKCBkdXJhdGlvbiApIHtcblxuXHRcdHJldHVybiB0aGlzLl9zY2hlZHVsZUZhZGluZyggZHVyYXRpb24sIDAsIDEgKTtcblxuXHR9LFxuXG5cdGZhZGVPdXQ6IGZ1bmN0aW9uICggZHVyYXRpb24gKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5fc2NoZWR1bGVGYWRpbmcoIGR1cmF0aW9uLCAxLCAwICk7XG5cblx0fSxcblxuXHRjcm9zc0ZhZGVGcm9tOiBmdW5jdGlvbiAoIGZhZGVPdXRBY3Rpb24sIGR1cmF0aW9uLCB3YXJwICkge1xuXG5cdFx0ZmFkZU91dEFjdGlvbi5mYWRlT3V0KCBkdXJhdGlvbiApO1xuXHRcdHRoaXMuZmFkZUluKCBkdXJhdGlvbiApO1xuXG5cdFx0aWYgKCB3YXJwICkge1xuXG5cdFx0XHR2YXIgZmFkZUluRHVyYXRpb24gPSB0aGlzLl9jbGlwLmR1cmF0aW9uLFxuXHRcdFx0XHRmYWRlT3V0RHVyYXRpb24gPSBmYWRlT3V0QWN0aW9uLl9jbGlwLmR1cmF0aW9uLFxuXG5cdFx0XHRcdHN0YXJ0RW5kUmF0aW8gPSBmYWRlT3V0RHVyYXRpb24gLyBmYWRlSW5EdXJhdGlvbixcblx0XHRcdFx0ZW5kU3RhcnRSYXRpbyA9IGZhZGVJbkR1cmF0aW9uIC8gZmFkZU91dER1cmF0aW9uO1xuXG5cdFx0XHRmYWRlT3V0QWN0aW9uLndhcnAoIDEuMCwgc3RhcnRFbmRSYXRpbywgZHVyYXRpb24gKTtcblx0XHRcdHRoaXMud2FycCggZW5kU3RhcnRSYXRpbywgMS4wLCBkdXJhdGlvbiApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjcm9zc0ZhZGVUbzogZnVuY3Rpb24gKCBmYWRlSW5BY3Rpb24sIGR1cmF0aW9uLCB3YXJwICkge1xuXG5cdFx0cmV0dXJuIGZhZGVJbkFjdGlvbi5jcm9zc0ZhZGVGcm9tKCB0aGlzLCBkdXJhdGlvbiwgd2FycCApO1xuXG5cdH0sXG5cblx0c3RvcEZhZGluZzogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHdlaWdodEludGVycG9sYW50ID0gdGhpcy5fd2VpZ2h0SW50ZXJwb2xhbnQ7XG5cblx0XHRpZiAoIHdlaWdodEludGVycG9sYW50ICE9PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLl93ZWlnaHRJbnRlcnBvbGFudCA9IG51bGw7XG5cdFx0XHR0aGlzLl9taXhlci5fdGFrZUJhY2tDb250cm9sSW50ZXJwb2xhbnQoIHdlaWdodEludGVycG9sYW50ICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdC8vIFRpbWUgU2NhbGUgQ29udHJvbFxuXG5cdC8vIHNldCB0aGUgdGltZSBzY2FsZSBzdG9wcGluZyBhbnkgc2NoZWR1bGVkIHdhcnBpbmdcblx0Ly8gYWx0aG91Z2ggLnBhdXNlZCA9IHRydWUgeWllbGRzIGFuIGVmZmVjdGl2ZSB0aW1lIHNjYWxlIG9mIHplcm8sIHRoaXNcblx0Ly8gbWV0aG9kIGRvZXMgKm5vdCogY2hhbmdlIC5wYXVzZWQsIGJlY2F1c2UgaXQgd291bGQgYmUgY29uZnVzaW5nXG5cdHNldEVmZmVjdGl2ZVRpbWVTY2FsZTogZnVuY3Rpb24gKCB0aW1lU2NhbGUgKSB7XG5cblx0XHR0aGlzLnRpbWVTY2FsZSA9IHRpbWVTY2FsZTtcblx0XHR0aGlzLl9lZmZlY3RpdmVUaW1lU2NhbGUgPSB0aGlzLnBhdXNlZCA/IDAgOiB0aW1lU2NhbGU7XG5cblx0XHRyZXR1cm4gdGhpcy5zdG9wV2FycGluZygpO1xuXG5cdH0sXG5cblx0Ly8gcmV0dXJuIHRoZSB0aW1lIHNjYWxlIGNvbnNpZGVyaW5nIHdhcnBpbmcgYW5kIC5wYXVzZWRcblx0Z2V0RWZmZWN0aXZlVGltZVNjYWxlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5fZWZmZWN0aXZlVGltZVNjYWxlO1xuXG5cdH0sXG5cblx0c2V0RHVyYXRpb246IGZ1bmN0aW9uICggZHVyYXRpb24gKSB7XG5cblx0XHR0aGlzLnRpbWVTY2FsZSA9IHRoaXMuX2NsaXAuZHVyYXRpb24gLyBkdXJhdGlvbjtcblxuXHRcdHJldHVybiB0aGlzLnN0b3BXYXJwaW5nKCk7XG5cblx0fSxcblxuXHRzeW5jV2l0aDogZnVuY3Rpb24gKCBhY3Rpb24gKSB7XG5cblx0XHR0aGlzLnRpbWUgPSBhY3Rpb24udGltZTtcblx0XHR0aGlzLnRpbWVTY2FsZSA9IGFjdGlvbi50aW1lU2NhbGU7XG5cblx0XHRyZXR1cm4gdGhpcy5zdG9wV2FycGluZygpO1xuXG5cdH0sXG5cblx0aGFsdDogZnVuY3Rpb24gKCBkdXJhdGlvbiApIHtcblxuXHRcdHJldHVybiB0aGlzLndhcnAoIHRoaXMuX2VmZmVjdGl2ZVRpbWVTY2FsZSwgMCwgZHVyYXRpb24gKTtcblxuXHR9LFxuXG5cdHdhcnA6IGZ1bmN0aW9uICggc3RhcnRUaW1lU2NhbGUsIGVuZFRpbWVTY2FsZSwgZHVyYXRpb24gKSB7XG5cblx0XHR2YXIgbWl4ZXIgPSB0aGlzLl9taXhlciwgbm93ID0gbWl4ZXIudGltZSxcblx0XHRcdGludGVycG9sYW50ID0gdGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQsXG5cblx0XHRcdHRpbWVTY2FsZSA9IHRoaXMudGltZVNjYWxlO1xuXG5cdFx0aWYgKCBpbnRlcnBvbGFudCA9PT0gbnVsbCApIHtcblxuXHRcdFx0aW50ZXJwb2xhbnQgPSBtaXhlci5fbGVuZENvbnRyb2xJbnRlcnBvbGFudCgpO1xuXHRcdFx0dGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQgPSBpbnRlcnBvbGFudDtcblxuXHRcdH1cblxuXHRcdHZhciB0aW1lcyA9IGludGVycG9sYW50LnBhcmFtZXRlclBvc2l0aW9ucyxcblx0XHRcdHZhbHVlcyA9IGludGVycG9sYW50LnNhbXBsZVZhbHVlcztcblxuXHRcdHRpbWVzWyAwIF0gPSBub3c7XG5cdFx0dGltZXNbIDEgXSA9IG5vdyArIGR1cmF0aW9uO1xuXG5cdFx0dmFsdWVzWyAwIF0gPSBzdGFydFRpbWVTY2FsZSAvIHRpbWVTY2FsZTtcblx0XHR2YWx1ZXNbIDEgXSA9IGVuZFRpbWVTY2FsZSAvIHRpbWVTY2FsZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c3RvcFdhcnBpbmc6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB0aW1lU2NhbGVJbnRlcnBvbGFudCA9IHRoaXMuX3RpbWVTY2FsZUludGVycG9sYW50O1xuXG5cdFx0aWYgKCB0aW1lU2NhbGVJbnRlcnBvbGFudCAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQgPSBudWxsO1xuXHRcdFx0dGhpcy5fbWl4ZXIuX3Rha2VCYWNrQ29udHJvbEludGVycG9sYW50KCB0aW1lU2NhbGVJbnRlcnBvbGFudCApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHQvLyBPYmplY3QgQWNjZXNzb3JzXG5cblx0Z2V0TWl4ZXI6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLl9taXhlcjtcblxuXHR9LFxuXG5cdGdldENsaXA6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLl9jbGlwO1xuXG5cdH0sXG5cblx0Z2V0Um9vdDogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuX2xvY2FsUm9vdCB8fCB0aGlzLl9taXhlci5fcm9vdDtcblxuXHR9LFxuXG5cdC8vIEludGVybmFcblxuXHRfdXBkYXRlOiBmdW5jdGlvbiAoIHRpbWUsIGRlbHRhVGltZSwgdGltZURpcmVjdGlvbiwgYWNjdUluZGV4ICkge1xuXG5cdFx0Ly8gY2FsbGVkIGJ5IHRoZSBtaXhlclxuXG5cdFx0aWYgKCAhIHRoaXMuZW5hYmxlZCApIHtcblxuXHRcdFx0Ly8gY2FsbCAuX3VwZGF0ZVdlaWdodCgpIHRvIHVwZGF0ZSAuX2VmZmVjdGl2ZVdlaWdodFxuXG5cdFx0XHR0aGlzLl91cGRhdGVXZWlnaHQoIHRpbWUgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdHZhciBzdGFydFRpbWUgPSB0aGlzLl9zdGFydFRpbWU7XG5cblx0XHRpZiAoIHN0YXJ0VGltZSAhPT0gbnVsbCApIHtcblxuXHRcdFx0Ly8gY2hlY2sgZm9yIHNjaGVkdWxlZCBzdGFydCBvZiBhY3Rpb25cblxuXHRcdFx0dmFyIHRpbWVSdW5uaW5nID0gKCB0aW1lIC0gc3RhcnRUaW1lICkgKiB0aW1lRGlyZWN0aW9uO1xuXHRcdFx0aWYgKCB0aW1lUnVubmluZyA8IDAgfHwgdGltZURpcmVjdGlvbiA9PT0gMCApIHtcblxuXHRcdFx0XHRyZXR1cm47IC8vIHlldCB0byBjb21lIC8gZG9uJ3QgZGVjaWRlIHdoZW4gZGVsdGEgPSAwXG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gc3RhcnRcblxuXHRcdFx0dGhpcy5fc3RhcnRUaW1lID0gbnVsbDsgLy8gdW5zY2hlZHVsZVxuXHRcdFx0ZGVsdGFUaW1lID0gdGltZURpcmVjdGlvbiAqIHRpbWVSdW5uaW5nO1xuXG5cdFx0fVxuXG5cdFx0Ly8gYXBwbHkgdGltZSBzY2FsZSBhbmQgYWR2YW5jZSB0aW1lXG5cblx0XHRkZWx0YVRpbWUgKj0gdGhpcy5fdXBkYXRlVGltZVNjYWxlKCB0aW1lICk7XG5cdFx0dmFyIGNsaXBUaW1lID0gdGhpcy5fdXBkYXRlVGltZSggZGVsdGFUaW1lICk7XG5cblx0XHQvLyBub3RlOiBfdXBkYXRlVGltZSBtYXkgZGlzYWJsZSB0aGUgYWN0aW9uIHJlc3VsdGluZyBpblxuXHRcdC8vIGFuIGVmZmVjdGl2ZSB3ZWlnaHQgb2YgMFxuXG5cdFx0dmFyIHdlaWdodCA9IHRoaXMuX3VwZGF0ZVdlaWdodCggdGltZSApO1xuXG5cdFx0aWYgKCB3ZWlnaHQgPiAwICkge1xuXG5cdFx0XHR2YXIgaW50ZXJwb2xhbnRzID0gdGhpcy5faW50ZXJwb2xhbnRzO1xuXHRcdFx0dmFyIHByb3BlcnR5TWl4ZXJzID0gdGhpcy5fcHJvcGVydHlCaW5kaW5ncztcblxuXHRcdFx0Zm9yICggdmFyIGogPSAwLCBtID0gaW50ZXJwb2xhbnRzLmxlbmd0aDsgaiAhPT0gbTsgKysgaiApIHtcblxuXHRcdFx0XHRpbnRlcnBvbGFudHNbIGogXS5ldmFsdWF0ZSggY2xpcFRpbWUgKTtcblx0XHRcdFx0cHJvcGVydHlNaXhlcnNbIGogXS5hY2N1bXVsYXRlKCBhY2N1SW5kZXgsIHdlaWdodCApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fSxcblxuXHRfdXBkYXRlV2VpZ2h0OiBmdW5jdGlvbiAoIHRpbWUgKSB7XG5cblx0XHR2YXIgd2VpZ2h0ID0gMDtcblxuXHRcdGlmICggdGhpcy5lbmFibGVkICkge1xuXG5cdFx0XHR3ZWlnaHQgPSB0aGlzLndlaWdodDtcblx0XHRcdHZhciBpbnRlcnBvbGFudCA9IHRoaXMuX3dlaWdodEludGVycG9sYW50O1xuXG5cdFx0XHRpZiAoIGludGVycG9sYW50ICE9PSBudWxsICkge1xuXG5cdFx0XHRcdHZhciBpbnRlcnBvbGFudFZhbHVlID0gaW50ZXJwb2xhbnQuZXZhbHVhdGUoIHRpbWUgKVsgMCBdO1xuXG5cdFx0XHRcdHdlaWdodCAqPSBpbnRlcnBvbGFudFZhbHVlO1xuXG5cdFx0XHRcdGlmICggdGltZSA+IGludGVycG9sYW50LnBhcmFtZXRlclBvc2l0aW9uc1sgMSBdICkge1xuXG5cdFx0XHRcdFx0dGhpcy5zdG9wRmFkaW5nKCk7XG5cblx0XHRcdFx0XHRpZiAoIGludGVycG9sYW50VmFsdWUgPT09IDAgKSB7XG5cblx0XHRcdFx0XHRcdC8vIGZhZGVkIG91dCwgZGlzYWJsZVxuXHRcdFx0XHRcdFx0dGhpcy5lbmFibGVkID0gZmFsc2U7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHR0aGlzLl9lZmZlY3RpdmVXZWlnaHQgPSB3ZWlnaHQ7XG5cdFx0cmV0dXJuIHdlaWdodDtcblxuXHR9LFxuXG5cdF91cGRhdGVUaW1lU2NhbGU6IGZ1bmN0aW9uICggdGltZSApIHtcblxuXHRcdHZhciB0aW1lU2NhbGUgPSAwO1xuXG5cdFx0aWYgKCAhIHRoaXMucGF1c2VkICkge1xuXG5cdFx0XHR0aW1lU2NhbGUgPSB0aGlzLnRpbWVTY2FsZTtcblxuXHRcdFx0dmFyIGludGVycG9sYW50ID0gdGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQ7XG5cblx0XHRcdGlmICggaW50ZXJwb2xhbnQgIT09IG51bGwgKSB7XG5cblx0XHRcdFx0dmFyIGludGVycG9sYW50VmFsdWUgPSBpbnRlcnBvbGFudC5ldmFsdWF0ZSggdGltZSApWyAwIF07XG5cblx0XHRcdFx0dGltZVNjYWxlICo9IGludGVycG9sYW50VmFsdWU7XG5cblx0XHRcdFx0aWYgKCB0aW1lID4gaW50ZXJwb2xhbnQucGFyYW1ldGVyUG9zaXRpb25zWyAxIF0gKSB7XG5cblx0XHRcdFx0XHR0aGlzLnN0b3BXYXJwaW5nKCk7XG5cblx0XHRcdFx0XHRpZiAoIHRpbWVTY2FsZSA9PT0gMCApIHtcblxuXHRcdFx0XHRcdFx0Ly8gbW90aW9uIGhhcyBoYWx0ZWQsIHBhdXNlXG5cdFx0XHRcdFx0XHR0aGlzLnBhdXNlZCA9IHRydWU7XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHQvLyB3YXJwIGRvbmUgLSBhcHBseSBmaW5hbCB0aW1lIHNjYWxlXG5cdFx0XHRcdFx0XHR0aGlzLnRpbWVTY2FsZSA9IHRpbWVTY2FsZTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHRoaXMuX2VmZmVjdGl2ZVRpbWVTY2FsZSA9IHRpbWVTY2FsZTtcblx0XHRyZXR1cm4gdGltZVNjYWxlO1xuXG5cdH0sXG5cblx0X3VwZGF0ZVRpbWU6IGZ1bmN0aW9uICggZGVsdGFUaW1lICkge1xuXG5cdFx0dmFyIHRpbWUgPSB0aGlzLnRpbWUgKyBkZWx0YVRpbWU7XG5cblx0XHRpZiAoIGRlbHRhVGltZSA9PT0gMCApIHJldHVybiB0aW1lO1xuXG5cdFx0dmFyIGR1cmF0aW9uID0gdGhpcy5fY2xpcC5kdXJhdGlvbixcblxuXHRcdFx0bG9vcCA9IHRoaXMubG9vcCxcblx0XHRcdGxvb3BDb3VudCA9IHRoaXMuX2xvb3BDb3VudDtcblxuXHRcdGlmICggbG9vcCA9PT0gTG9vcE9uY2UgKSB7XG5cblx0XHRcdGlmICggbG9vcENvdW50ID09PSAtIDEgKSB7XG5cblx0XHRcdFx0Ly8ganVzdCBzdGFydGVkXG5cblx0XHRcdFx0dGhpcy5fbG9vcENvdW50ID0gMDtcblx0XHRcdFx0dGhpcy5fc2V0RW5kaW5ncyggdHJ1ZSwgdHJ1ZSwgZmFsc2UgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRoYW5kbGVfc3RvcDoge1xuXG5cdFx0XHRcdGlmICggdGltZSA+PSBkdXJhdGlvbiApIHtcblxuXHRcdFx0XHRcdHRpbWUgPSBkdXJhdGlvbjtcblxuXHRcdFx0XHR9IGVsc2UgaWYgKCB0aW1lIDwgMCApIHtcblxuXHRcdFx0XHRcdHRpbWUgPSAwO1xuXG5cdFx0XHRcdH0gZWxzZSBicmVhayBoYW5kbGVfc3RvcDtcblxuXHRcdFx0XHRpZiAoIHRoaXMuY2xhbXBXaGVuRmluaXNoZWQgKSB0aGlzLnBhdXNlZCA9IHRydWU7XG5cdFx0XHRcdGVsc2UgdGhpcy5lbmFibGVkID0gZmFsc2U7XG5cblx0XHRcdFx0dGhpcy5fbWl4ZXIuZGlzcGF0Y2hFdmVudCgge1xuXHRcdFx0XHRcdHR5cGU6ICdmaW5pc2hlZCcsIGFjdGlvbjogdGhpcyxcblx0XHRcdFx0XHRkaXJlY3Rpb246IGRlbHRhVGltZSA8IDAgPyAtIDEgOiAxXG5cdFx0XHRcdH0gKTtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHsgLy8gcmVwZXRpdGl2ZSBSZXBlYXQgb3IgUGluZ1BvbmdcblxuXHRcdFx0dmFyIHBpbmdQb25nID0gKCBsb29wID09PSBMb29wUGluZ1BvbmcgKTtcblxuXHRcdFx0aWYgKCBsb29wQ291bnQgPT09IC0gMSApIHtcblxuXHRcdFx0XHQvLyBqdXN0IHN0YXJ0ZWRcblxuXHRcdFx0XHRpZiAoIGRlbHRhVGltZSA+PSAwICkge1xuXG5cdFx0XHRcdFx0bG9vcENvdW50ID0gMDtcblxuXHRcdFx0XHRcdHRoaXMuX3NldEVuZGluZ3MoIHRydWUsIHRoaXMucmVwZXRpdGlvbnMgPT09IDAsIHBpbmdQb25nICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdC8vIHdoZW4gbG9vcGluZyBpbiByZXZlcnNlIGRpcmVjdGlvbiwgdGhlIGluaXRpYWxcblx0XHRcdFx0XHQvLyB0cmFuc2l0aW9uIHRocm91Z2ggemVybyBjb3VudHMgYXMgYSByZXBldGl0aW9uLFxuXHRcdFx0XHRcdC8vIHNvIGxlYXZlIGxvb3BDb3VudCBhdCAtMVxuXG5cdFx0XHRcdFx0dGhpcy5fc2V0RW5kaW5ncyggdGhpcy5yZXBldGl0aW9ucyA9PT0gMCwgdHJ1ZSwgcGluZ1BvbmcgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCB0aW1lID49IGR1cmF0aW9uIHx8IHRpbWUgPCAwICkge1xuXG5cdFx0XHRcdC8vIHdyYXAgYXJvdW5kXG5cblx0XHRcdFx0dmFyIGxvb3BEZWx0YSA9IE1hdGguZmxvb3IoIHRpbWUgLyBkdXJhdGlvbiApOyAvLyBzaWduZWRcblx0XHRcdFx0dGltZSAtPSBkdXJhdGlvbiAqIGxvb3BEZWx0YTtcblxuXHRcdFx0XHRsb29wQ291bnQgKz0gTWF0aC5hYnMoIGxvb3BEZWx0YSApO1xuXG5cdFx0XHRcdHZhciBwZW5kaW5nID0gdGhpcy5yZXBldGl0aW9ucyAtIGxvb3BDb3VudDtcblxuXHRcdFx0XHRpZiAoIHBlbmRpbmcgPD0gMCApIHtcblxuXHRcdFx0XHRcdC8vIGhhdmUgdG8gc3RvcCAoc3dpdGNoIHN0YXRlLCBjbGFtcCB0aW1lLCBmaXJlIGV2ZW50KVxuXG5cdFx0XHRcdFx0aWYgKCB0aGlzLmNsYW1wV2hlbkZpbmlzaGVkICkgdGhpcy5wYXVzZWQgPSB0cnVlO1xuXHRcdFx0XHRcdGVsc2UgdGhpcy5lbmFibGVkID0gZmFsc2U7XG5cblx0XHRcdFx0XHR0aW1lID0gZGVsdGFUaW1lID4gMCA/IGR1cmF0aW9uIDogMDtcblxuXHRcdFx0XHRcdHRoaXMuX21peGVyLmRpc3BhdGNoRXZlbnQoIHtcblx0XHRcdFx0XHRcdHR5cGU6ICdmaW5pc2hlZCcsIGFjdGlvbjogdGhpcyxcblx0XHRcdFx0XHRcdGRpcmVjdGlvbjogZGVsdGFUaW1lID4gMCA/IDEgOiAtIDFcblx0XHRcdFx0XHR9ICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdC8vIGtlZXAgcnVubmluZ1xuXG5cdFx0XHRcdFx0aWYgKCBwZW5kaW5nID09PSAxICkge1xuXG5cdFx0XHRcdFx0XHQvLyBlbnRlcmluZyB0aGUgbGFzdCByb3VuZFxuXG5cdFx0XHRcdFx0XHR2YXIgYXRTdGFydCA9IGRlbHRhVGltZSA8IDA7XG5cdFx0XHRcdFx0XHR0aGlzLl9zZXRFbmRpbmdzKCBhdFN0YXJ0LCAhIGF0U3RhcnQsIHBpbmdQb25nICk7XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHR0aGlzLl9zZXRFbmRpbmdzKCBmYWxzZSwgZmFsc2UsIHBpbmdQb25nICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR0aGlzLl9sb29wQ291bnQgPSBsb29wQ291bnQ7XG5cblx0XHRcdFx0XHR0aGlzLl9taXhlci5kaXNwYXRjaEV2ZW50KCB7XG5cdFx0XHRcdFx0XHR0eXBlOiAnbG9vcCcsIGFjdGlvbjogdGhpcywgbG9vcERlbHRhOiBsb29wRGVsdGFcblx0XHRcdFx0XHR9ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggcGluZ1BvbmcgJiYgKCBsb29wQ291bnQgJiAxICkgPT09IDEgKSB7XG5cblx0XHRcdFx0Ly8gaW52ZXJ0IHRpbWUgZm9yIHRoZSBcInBvbmcgcm91bmRcIlxuXG5cdFx0XHRcdHRoaXMudGltZSA9IHRpbWU7XG5cdFx0XHRcdHJldHVybiBkdXJhdGlvbiAtIHRpbWU7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHRoaXMudGltZSA9IHRpbWU7XG5cdFx0cmV0dXJuIHRpbWU7XG5cblx0fSxcblxuXHRfc2V0RW5kaW5nczogZnVuY3Rpb24gKCBhdFN0YXJ0LCBhdEVuZCwgcGluZ1BvbmcgKSB7XG5cblx0XHR2YXIgc2V0dGluZ3MgPSB0aGlzLl9pbnRlcnBvbGFudFNldHRpbmdzO1xuXG5cdFx0aWYgKCBwaW5nUG9uZyApIHtcblxuXHRcdFx0c2V0dGluZ3MuZW5kaW5nU3RhcnQgXHQ9IFplcm9TbG9wZUVuZGluZztcblx0XHRcdHNldHRpbmdzLmVuZGluZ0VuZFx0XHQ9IFplcm9TbG9wZUVuZGluZztcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIGFzc3VtaW5nIGZvciBMb29wT25jZSBhdFN0YXJ0ID09IGF0RW5kID09IHRydWVcblxuXHRcdFx0aWYgKCBhdFN0YXJ0ICkge1xuXG5cdFx0XHRcdHNldHRpbmdzLmVuZGluZ1N0YXJ0ID0gdGhpcy56ZXJvU2xvcGVBdFN0YXJ0ID8gWmVyb1Nsb3BlRW5kaW5nIDogWmVyb0N1cnZhdHVyZUVuZGluZztcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRzZXR0aW5ncy5lbmRpbmdTdGFydCA9IFdyYXBBcm91bmRFbmRpbmc7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBhdEVuZCApIHtcblxuXHRcdFx0XHRzZXR0aW5ncy5lbmRpbmdFbmQgPSB0aGlzLnplcm9TbG9wZUF0RW5kID8gWmVyb1Nsb3BlRW5kaW5nIDogWmVyb0N1cnZhdHVyZUVuZGluZztcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRzZXR0aW5ncy5lbmRpbmdFbmQgXHQgPSBXcmFwQXJvdW5kRW5kaW5nO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fSxcblxuXHRfc2NoZWR1bGVGYWRpbmc6IGZ1bmN0aW9uICggZHVyYXRpb24sIHdlaWdodE5vdywgd2VpZ2h0VGhlbiApIHtcblxuXHRcdHZhciBtaXhlciA9IHRoaXMuX21peGVyLCBub3cgPSBtaXhlci50aW1lLFxuXHRcdFx0aW50ZXJwb2xhbnQgPSB0aGlzLl93ZWlnaHRJbnRlcnBvbGFudDtcblxuXHRcdGlmICggaW50ZXJwb2xhbnQgPT09IG51bGwgKSB7XG5cblx0XHRcdGludGVycG9sYW50ID0gbWl4ZXIuX2xlbmRDb250cm9sSW50ZXJwb2xhbnQoKTtcblx0XHRcdHRoaXMuX3dlaWdodEludGVycG9sYW50ID0gaW50ZXJwb2xhbnQ7XG5cblx0XHR9XG5cblx0XHR2YXIgdGltZXMgPSBpbnRlcnBvbGFudC5wYXJhbWV0ZXJQb3NpdGlvbnMsXG5cdFx0XHR2YWx1ZXMgPSBpbnRlcnBvbGFudC5zYW1wbGVWYWx1ZXM7XG5cblx0XHR0aW1lc1sgMCBdID0gbm93OyBcdFx0XHRcdHZhbHVlc1sgMCBdID0gd2VpZ2h0Tm93O1xuXHRcdHRpbWVzWyAxIF0gPSBub3cgKyBkdXJhdGlvbjtcdHZhbHVlc1sgMSBdID0gd2VpZ2h0VGhlbjtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqXG4gKiBQbGF5ZXIgZm9yIEFuaW1hdGlvbkNsaXBzLlxuICpcbiAqXG4gKiBAYXV0aG9yIEJlbiBIb3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvL1xuICogQGF1dGhvciBEYXZpZCBTYXJubyAvIGh0dHA6Ly9saWdodGhhdXMudXMvXG4gKiBAYXV0aG9yIHRzY2h3XG4gKi9cblxuZnVuY3Rpb24gQW5pbWF0aW9uTWl4ZXIoIHJvb3QgKSB7XG5cblx0dGhpcy5fcm9vdCA9IHJvb3Q7XG5cdHRoaXMuX2luaXRNZW1vcnlNYW5hZ2VyKCk7XG5cdHRoaXMuX2FjY3VJbmRleCA9IDA7XG5cblx0dGhpcy50aW1lID0gMDtcblxuXHR0aGlzLnRpbWVTY2FsZSA9IDEuMDtcblxufVxuXG5BbmltYXRpb25NaXhlci5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBFdmVudERpc3BhdGNoZXIucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogQW5pbWF0aW9uTWl4ZXIsXG5cblx0X2JpbmRBY3Rpb246IGZ1bmN0aW9uICggYWN0aW9uLCBwcm90b3R5cGVBY3Rpb24gKSB7XG5cblx0XHR2YXIgcm9vdCA9IGFjdGlvbi5fbG9jYWxSb290IHx8IHRoaXMuX3Jvb3QsXG5cdFx0XHR0cmFja3MgPSBhY3Rpb24uX2NsaXAudHJhY2tzLFxuXHRcdFx0blRyYWNrcyA9IHRyYWNrcy5sZW5ndGgsXG5cdFx0XHRiaW5kaW5ncyA9IGFjdGlvbi5fcHJvcGVydHlCaW5kaW5ncyxcblx0XHRcdGludGVycG9sYW50cyA9IGFjdGlvbi5faW50ZXJwb2xhbnRzLFxuXHRcdFx0cm9vdFV1aWQgPSByb290LnV1aWQsXG5cdFx0XHRiaW5kaW5nc0J5Um9vdCA9IHRoaXMuX2JpbmRpbmdzQnlSb290QW5kTmFtZSxcblx0XHRcdGJpbmRpbmdzQnlOYW1lID0gYmluZGluZ3NCeVJvb3RbIHJvb3RVdWlkIF07XG5cblx0XHRpZiAoIGJpbmRpbmdzQnlOYW1lID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGJpbmRpbmdzQnlOYW1lID0ge307XG5cdFx0XHRiaW5kaW5nc0J5Um9vdFsgcm9vdFV1aWQgXSA9IGJpbmRpbmdzQnlOYW1lO1xuXG5cdFx0fVxuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpICE9PSBuVHJhY2tzOyArKyBpICkge1xuXG5cdFx0XHR2YXIgdHJhY2sgPSB0cmFja3NbIGkgXSxcblx0XHRcdFx0dHJhY2tOYW1lID0gdHJhY2submFtZSxcblx0XHRcdFx0YmluZGluZyA9IGJpbmRpbmdzQnlOYW1lWyB0cmFja05hbWUgXTtcblxuXHRcdFx0aWYgKCBiaW5kaW5nICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0YmluZGluZ3NbIGkgXSA9IGJpbmRpbmc7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0YmluZGluZyA9IGJpbmRpbmdzWyBpIF07XG5cblx0XHRcdFx0aWYgKCBiaW5kaW5nICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHQvLyBleGlzdGluZyBiaW5kaW5nLCBtYWtlIHN1cmUgdGhlIGNhY2hlIGtub3dzXG5cblx0XHRcdFx0XHRpZiAoIGJpbmRpbmcuX2NhY2hlSW5kZXggPT09IG51bGwgKSB7XG5cblx0XHRcdFx0XHRcdCsrIGJpbmRpbmcucmVmZXJlbmNlQ291bnQ7XG5cdFx0XHRcdFx0XHR0aGlzLl9hZGRJbmFjdGl2ZUJpbmRpbmcoIGJpbmRpbmcsIHJvb3RVdWlkLCB0cmFja05hbWUgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHR2YXIgcGF0aCA9IHByb3RvdHlwZUFjdGlvbiAmJiBwcm90b3R5cGVBY3Rpb24uXG5cdFx0XHRcdFx0X3Byb3BlcnR5QmluZGluZ3NbIGkgXS5iaW5kaW5nLnBhcnNlZFBhdGg7XG5cblx0XHRcdFx0YmluZGluZyA9IG5ldyBQcm9wZXJ0eU1peGVyKFxuXHRcdFx0XHRcdFByb3BlcnR5QmluZGluZy5jcmVhdGUoIHJvb3QsIHRyYWNrTmFtZSwgcGF0aCApLFxuXHRcdFx0XHRcdHRyYWNrLlZhbHVlVHlwZU5hbWUsIHRyYWNrLmdldFZhbHVlU2l6ZSgpICk7XG5cblx0XHRcdFx0KysgYmluZGluZy5yZWZlcmVuY2VDb3VudDtcblx0XHRcdFx0dGhpcy5fYWRkSW5hY3RpdmVCaW5kaW5nKCBiaW5kaW5nLCByb290VXVpZCwgdHJhY2tOYW1lICk7XG5cblx0XHRcdFx0YmluZGluZ3NbIGkgXSA9IGJpbmRpbmc7XG5cblx0XHRcdH1cblxuXHRcdFx0aW50ZXJwb2xhbnRzWyBpIF0ucmVzdWx0QnVmZmVyID0gYmluZGluZy5idWZmZXI7XG5cblx0XHR9XG5cblx0fSxcblxuXHRfYWN0aXZhdGVBY3Rpb246IGZ1bmN0aW9uICggYWN0aW9uICkge1xuXG5cdFx0aWYgKCAhIHRoaXMuX2lzQWN0aXZlQWN0aW9uKCBhY3Rpb24gKSApIHtcblxuXHRcdFx0aWYgKCBhY3Rpb24uX2NhY2hlSW5kZXggPT09IG51bGwgKSB7XG5cblx0XHRcdFx0Ly8gdGhpcyBhY3Rpb24gaGFzIGJlZW4gZm9yZ290dGVuIGJ5IHRoZSBjYWNoZSwgYnV0IHRoZSB1c2VyXG5cdFx0XHRcdC8vIGFwcGVhcnMgdG8gYmUgc3RpbGwgdXNpbmcgaXQgLT4gcmViaW5kXG5cblx0XHRcdFx0dmFyIHJvb3RVdWlkID0gKCBhY3Rpb24uX2xvY2FsUm9vdCB8fCB0aGlzLl9yb290ICkudXVpZCxcblx0XHRcdFx0XHRjbGlwVXVpZCA9IGFjdGlvbi5fY2xpcC51dWlkLFxuXHRcdFx0XHRcdGFjdGlvbnNGb3JDbGlwID0gdGhpcy5fYWN0aW9uc0J5Q2xpcFsgY2xpcFV1aWQgXTtcblxuXHRcdFx0XHR0aGlzLl9iaW5kQWN0aW9uKCBhY3Rpb24sXG5cdFx0XHRcdFx0YWN0aW9uc0ZvckNsaXAgJiYgYWN0aW9uc0ZvckNsaXAua25vd25BY3Rpb25zWyAwIF0gKTtcblxuXHRcdFx0XHR0aGlzLl9hZGRJbmFjdGl2ZUFjdGlvbiggYWN0aW9uLCBjbGlwVXVpZCwgcm9vdFV1aWQgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgYmluZGluZ3MgPSBhY3Rpb24uX3Byb3BlcnR5QmluZGluZ3M7XG5cblx0XHRcdC8vIGluY3JlbWVudCByZWZlcmVuY2UgY291bnRzIC8gc29ydCBvdXQgc3RhdGVcblx0XHRcdGZvciAoIHZhciBpID0gMCwgbiA9IGJpbmRpbmdzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0XHR2YXIgYmluZGluZyA9IGJpbmRpbmdzWyBpIF07XG5cblx0XHRcdFx0aWYgKCBiaW5kaW5nLnVzZUNvdW50ICsrID09PSAwICkge1xuXG5cdFx0XHRcdFx0dGhpcy5fbGVuZEJpbmRpbmcoIGJpbmRpbmcgKTtcblx0XHRcdFx0XHRiaW5kaW5nLnNhdmVPcmlnaW5hbFN0YXRlKCk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuX2xlbmRBY3Rpb24oIGFjdGlvbiApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0X2RlYWN0aXZhdGVBY3Rpb246IGZ1bmN0aW9uICggYWN0aW9uICkge1xuXG5cdFx0aWYgKCB0aGlzLl9pc0FjdGl2ZUFjdGlvbiggYWN0aW9uICkgKSB7XG5cblx0XHRcdHZhciBiaW5kaW5ncyA9IGFjdGlvbi5fcHJvcGVydHlCaW5kaW5ncztcblxuXHRcdFx0Ly8gZGVjcmVtZW50IHJlZmVyZW5jZSBjb3VudHMgLyBzb3J0IG91dCBzdGF0ZVxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBuID0gYmluZGluZ3MubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHRcdHZhciBiaW5kaW5nID0gYmluZGluZ3NbIGkgXTtcblxuXHRcdFx0XHRpZiAoIC0tIGJpbmRpbmcudXNlQ291bnQgPT09IDAgKSB7XG5cblx0XHRcdFx0XHRiaW5kaW5nLnJlc3RvcmVPcmlnaW5hbFN0YXRlKCk7XG5cdFx0XHRcdFx0dGhpcy5fdGFrZUJhY2tCaW5kaW5nKCBiaW5kaW5nICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuX3Rha2VCYWNrQWN0aW9uKCBhY3Rpb24gKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdC8vIE1lbW9yeSBtYW5hZ2VyXG5cblx0X2luaXRNZW1vcnlNYW5hZ2VyOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLl9hY3Rpb25zID0gW107IC8vICduQWN0aXZlQWN0aW9ucycgZm9sbG93ZWQgYnkgaW5hY3RpdmUgb25lc1xuXHRcdHRoaXMuX25BY3RpdmVBY3Rpb25zID0gMDtcblxuXHRcdHRoaXMuX2FjdGlvbnNCeUNsaXAgPSB7fTtcblx0XHQvLyBpbnNpZGU6XG5cdFx0Ly8ge1xuXHRcdC8vIFx0XHRrbm93bkFjdGlvbnM6IEFycmF5PCBBbmltYXRpb25BY3Rpb24gPlx0LSB1c2VkIGFzIHByb3RvdHlwZXNcblx0XHQvLyBcdFx0YWN0aW9uQnlSb290OiBBbmltYXRpb25BY3Rpb25cdFx0XHQtIGxvb2t1cFxuXHRcdC8vIH1cblxuXG5cdFx0dGhpcy5fYmluZGluZ3MgPSBbXTsgLy8gJ25BY3RpdmVCaW5kaW5ncycgZm9sbG93ZWQgYnkgaW5hY3RpdmUgb25lc1xuXHRcdHRoaXMuX25BY3RpdmVCaW5kaW5ncyA9IDA7XG5cblx0XHR0aGlzLl9iaW5kaW5nc0J5Um9vdEFuZE5hbWUgPSB7fTsgLy8gaW5zaWRlOiBNYXA8IG5hbWUsIFByb3BlcnR5TWl4ZXIgPlxuXG5cblx0XHR0aGlzLl9jb250cm9sSW50ZXJwb2xhbnRzID0gW107IC8vIHNhbWUgZ2FtZSBhcyBhYm92ZVxuXHRcdHRoaXMuX25BY3RpdmVDb250cm9sSW50ZXJwb2xhbnRzID0gMDtcblxuXHRcdHZhciBzY29wZSA9IHRoaXM7XG5cblx0XHR0aGlzLnN0YXRzID0ge1xuXG5cdFx0XHRhY3Rpb25zOiB7XG5cdFx0XHRcdGdldCB0b3RhbCgpIHtcblxuXHRcdFx0XHRcdHJldHVybiBzY29wZS5fYWN0aW9ucy5sZW5ndGg7XG5cblx0XHRcdFx0fSxcblx0XHRcdFx0Z2V0IGluVXNlKCkge1xuXG5cdFx0XHRcdFx0cmV0dXJuIHNjb3BlLl9uQWN0aXZlQWN0aW9ucztcblxuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0YmluZGluZ3M6IHtcblx0XHRcdFx0Z2V0IHRvdGFsKCkge1xuXG5cdFx0XHRcdFx0cmV0dXJuIHNjb3BlLl9iaW5kaW5ncy5sZW5ndGg7XG5cblx0XHRcdFx0fSxcblx0XHRcdFx0Z2V0IGluVXNlKCkge1xuXG5cdFx0XHRcdFx0cmV0dXJuIHNjb3BlLl9uQWN0aXZlQmluZGluZ3M7XG5cblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdGNvbnRyb2xJbnRlcnBvbGFudHM6IHtcblx0XHRcdFx0Z2V0IHRvdGFsKCkge1xuXG5cdFx0XHRcdFx0cmV0dXJuIHNjb3BlLl9jb250cm9sSW50ZXJwb2xhbnRzLmxlbmd0aDtcblxuXHRcdFx0XHR9LFxuXHRcdFx0XHRnZXQgaW5Vc2UoKSB7XG5cblx0XHRcdFx0XHRyZXR1cm4gc2NvcGUuX25BY3RpdmVDb250cm9sSW50ZXJwb2xhbnRzO1xuXG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdH07XG5cblx0fSxcblxuXHQvLyBNZW1vcnkgbWFuYWdlbWVudCBmb3IgQW5pbWF0aW9uQWN0aW9uIG9iamVjdHNcblxuXHRfaXNBY3RpdmVBY3Rpb246IGZ1bmN0aW9uICggYWN0aW9uICkge1xuXG5cdFx0dmFyIGluZGV4ID0gYWN0aW9uLl9jYWNoZUluZGV4O1xuXHRcdHJldHVybiBpbmRleCAhPT0gbnVsbCAmJiBpbmRleCA8IHRoaXMuX25BY3RpdmVBY3Rpb25zO1xuXG5cdH0sXG5cblx0X2FkZEluYWN0aXZlQWN0aW9uOiBmdW5jdGlvbiAoIGFjdGlvbiwgY2xpcFV1aWQsIHJvb3RVdWlkICkge1xuXG5cdFx0dmFyIGFjdGlvbnMgPSB0aGlzLl9hY3Rpb25zLFxuXHRcdFx0YWN0aW9uc0J5Q2xpcCA9IHRoaXMuX2FjdGlvbnNCeUNsaXAsXG5cdFx0XHRhY3Rpb25zRm9yQ2xpcCA9IGFjdGlvbnNCeUNsaXBbIGNsaXBVdWlkIF07XG5cblx0XHRpZiAoIGFjdGlvbnNGb3JDbGlwID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGFjdGlvbnNGb3JDbGlwID0ge1xuXG5cdFx0XHRcdGtub3duQWN0aW9uczogWyBhY3Rpb24gXSxcblx0XHRcdFx0YWN0aW9uQnlSb290OiB7fVxuXG5cdFx0XHR9O1xuXG5cdFx0XHRhY3Rpb24uX2J5Q2xpcENhY2hlSW5kZXggPSAwO1xuXG5cdFx0XHRhY3Rpb25zQnlDbGlwWyBjbGlwVXVpZCBdID0gYWN0aW9uc0ZvckNsaXA7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR2YXIga25vd25BY3Rpb25zID0gYWN0aW9uc0ZvckNsaXAua25vd25BY3Rpb25zO1xuXG5cdFx0XHRhY3Rpb24uX2J5Q2xpcENhY2hlSW5kZXggPSBrbm93bkFjdGlvbnMubGVuZ3RoO1xuXHRcdFx0a25vd25BY3Rpb25zLnB1c2goIGFjdGlvbiApO1xuXG5cdFx0fVxuXG5cdFx0YWN0aW9uLl9jYWNoZUluZGV4ID0gYWN0aW9ucy5sZW5ndGg7XG5cdFx0YWN0aW9ucy5wdXNoKCBhY3Rpb24gKTtcblxuXHRcdGFjdGlvbnNGb3JDbGlwLmFjdGlvbkJ5Um9vdFsgcm9vdFV1aWQgXSA9IGFjdGlvbjtcblxuXHR9LFxuXG5cdF9yZW1vdmVJbmFjdGl2ZUFjdGlvbjogZnVuY3Rpb24gKCBhY3Rpb24gKSB7XG5cblx0XHR2YXIgYWN0aW9ucyA9IHRoaXMuX2FjdGlvbnMsXG5cdFx0XHRsYXN0SW5hY3RpdmVBY3Rpb24gPSBhY3Rpb25zWyBhY3Rpb25zLmxlbmd0aCAtIDEgXSxcblx0XHRcdGNhY2hlSW5kZXggPSBhY3Rpb24uX2NhY2hlSW5kZXg7XG5cblx0XHRsYXN0SW5hY3RpdmVBY3Rpb24uX2NhY2hlSW5kZXggPSBjYWNoZUluZGV4O1xuXHRcdGFjdGlvbnNbIGNhY2hlSW5kZXggXSA9IGxhc3RJbmFjdGl2ZUFjdGlvbjtcblx0XHRhY3Rpb25zLnBvcCgpO1xuXG5cdFx0YWN0aW9uLl9jYWNoZUluZGV4ID0gbnVsbDtcblxuXG5cdFx0dmFyIGNsaXBVdWlkID0gYWN0aW9uLl9jbGlwLnV1aWQsXG5cdFx0XHRhY3Rpb25zQnlDbGlwID0gdGhpcy5fYWN0aW9uc0J5Q2xpcCxcblx0XHRcdGFjdGlvbnNGb3JDbGlwID0gYWN0aW9uc0J5Q2xpcFsgY2xpcFV1aWQgXSxcblx0XHRcdGtub3duQWN0aW9uc0ZvckNsaXAgPSBhY3Rpb25zRm9yQ2xpcC5rbm93bkFjdGlvbnMsXG5cblx0XHRcdGxhc3RLbm93bkFjdGlvbiA9XG5cdFx0XHRcdGtub3duQWN0aW9uc0ZvckNsaXBbIGtub3duQWN0aW9uc0ZvckNsaXAubGVuZ3RoIC0gMSBdLFxuXG5cdFx0XHRieUNsaXBDYWNoZUluZGV4ID0gYWN0aW9uLl9ieUNsaXBDYWNoZUluZGV4O1xuXG5cdFx0bGFzdEtub3duQWN0aW9uLl9ieUNsaXBDYWNoZUluZGV4ID0gYnlDbGlwQ2FjaGVJbmRleDtcblx0XHRrbm93bkFjdGlvbnNGb3JDbGlwWyBieUNsaXBDYWNoZUluZGV4IF0gPSBsYXN0S25vd25BY3Rpb247XG5cdFx0a25vd25BY3Rpb25zRm9yQ2xpcC5wb3AoKTtcblxuXHRcdGFjdGlvbi5fYnlDbGlwQ2FjaGVJbmRleCA9IG51bGw7XG5cblxuXHRcdHZhciBhY3Rpb25CeVJvb3QgPSBhY3Rpb25zRm9yQ2xpcC5hY3Rpb25CeVJvb3QsXG5cdFx0XHRyb290VXVpZCA9ICggYWN0aW9uLl9sb2NhbFJvb3QgfHwgdGhpcy5fcm9vdCApLnV1aWQ7XG5cblx0XHRkZWxldGUgYWN0aW9uQnlSb290WyByb290VXVpZCBdO1xuXG5cdFx0aWYgKCBrbm93bkFjdGlvbnNGb3JDbGlwLmxlbmd0aCA9PT0gMCApIHtcblxuXHRcdFx0ZGVsZXRlIGFjdGlvbnNCeUNsaXBbIGNsaXBVdWlkIF07XG5cblx0XHR9XG5cblx0XHR0aGlzLl9yZW1vdmVJbmFjdGl2ZUJpbmRpbmdzRm9yQWN0aW9uKCBhY3Rpb24gKTtcblxuXHR9LFxuXG5cdF9yZW1vdmVJbmFjdGl2ZUJpbmRpbmdzRm9yQWN0aW9uOiBmdW5jdGlvbiAoIGFjdGlvbiApIHtcblxuXHRcdHZhciBiaW5kaW5ncyA9IGFjdGlvbi5fcHJvcGVydHlCaW5kaW5ncztcblx0XHRmb3IgKCB2YXIgaSA9IDAsIG4gPSBiaW5kaW5ncy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRcdHZhciBiaW5kaW5nID0gYmluZGluZ3NbIGkgXTtcblxuXHRcdFx0aWYgKCAtLSBiaW5kaW5nLnJlZmVyZW5jZUNvdW50ID09PSAwICkge1xuXG5cdFx0XHRcdHRoaXMuX3JlbW92ZUluYWN0aXZlQmluZGluZyggYmluZGluZyApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fSxcblxuXHRfbGVuZEFjdGlvbjogZnVuY3Rpb24gKCBhY3Rpb24gKSB7XG5cblx0XHQvLyBbIGFjdGl2ZSBhY3Rpb25zIHwgIGluYWN0aXZlIGFjdGlvbnMgIF1cblx0XHQvLyBbICBhY3RpdmUgYWN0aW9ucyA+fCBpbmFjdGl2ZSBhY3Rpb25zIF1cblx0XHQvLyAgICAgICAgICAgICAgICAgcyAgICAgICAgYVxuXHRcdC8vICAgICAgICAgICAgICAgICAgPC1zd2FwLT5cblx0XHQvLyAgICAgICAgICAgICAgICAgYSAgICAgICAgc1xuXG5cdFx0dmFyIGFjdGlvbnMgPSB0aGlzLl9hY3Rpb25zLFxuXHRcdFx0cHJldkluZGV4ID0gYWN0aW9uLl9jYWNoZUluZGV4LFxuXG5cdFx0XHRsYXN0QWN0aXZlSW5kZXggPSB0aGlzLl9uQWN0aXZlQWN0aW9ucyArKyxcblxuXHRcdFx0Zmlyc3RJbmFjdGl2ZUFjdGlvbiA9IGFjdGlvbnNbIGxhc3RBY3RpdmVJbmRleCBdO1xuXG5cdFx0YWN0aW9uLl9jYWNoZUluZGV4ID0gbGFzdEFjdGl2ZUluZGV4O1xuXHRcdGFjdGlvbnNbIGxhc3RBY3RpdmVJbmRleCBdID0gYWN0aW9uO1xuXG5cdFx0Zmlyc3RJbmFjdGl2ZUFjdGlvbi5fY2FjaGVJbmRleCA9IHByZXZJbmRleDtcblx0XHRhY3Rpb25zWyBwcmV2SW5kZXggXSA9IGZpcnN0SW5hY3RpdmVBY3Rpb247XG5cblx0fSxcblxuXHRfdGFrZUJhY2tBY3Rpb246IGZ1bmN0aW9uICggYWN0aW9uICkge1xuXG5cdFx0Ly8gWyAgYWN0aXZlIGFjdGlvbnMgIHwgaW5hY3RpdmUgYWN0aW9ucyBdXG5cdFx0Ly8gWyBhY3RpdmUgYWN0aW9ucyB8PCBpbmFjdGl2ZSBhY3Rpb25zICBdXG5cdFx0Ly8gICAgICAgIGEgICAgICAgIHNcblx0XHQvLyAgICAgICAgIDwtc3dhcC0+XG5cdFx0Ly8gICAgICAgIHMgICAgICAgIGFcblxuXHRcdHZhciBhY3Rpb25zID0gdGhpcy5fYWN0aW9ucyxcblx0XHRcdHByZXZJbmRleCA9IGFjdGlvbi5fY2FjaGVJbmRleCxcblxuXHRcdFx0Zmlyc3RJbmFjdGl2ZUluZGV4ID0gLS0gdGhpcy5fbkFjdGl2ZUFjdGlvbnMsXG5cblx0XHRcdGxhc3RBY3RpdmVBY3Rpb24gPSBhY3Rpb25zWyBmaXJzdEluYWN0aXZlSW5kZXggXTtcblxuXHRcdGFjdGlvbi5fY2FjaGVJbmRleCA9IGZpcnN0SW5hY3RpdmVJbmRleDtcblx0XHRhY3Rpb25zWyBmaXJzdEluYWN0aXZlSW5kZXggXSA9IGFjdGlvbjtcblxuXHRcdGxhc3RBY3RpdmVBY3Rpb24uX2NhY2hlSW5kZXggPSBwcmV2SW5kZXg7XG5cdFx0YWN0aW9uc1sgcHJldkluZGV4IF0gPSBsYXN0QWN0aXZlQWN0aW9uO1xuXG5cdH0sXG5cblx0Ly8gTWVtb3J5IG1hbmFnZW1lbnQgZm9yIFByb3BlcnR5TWl4ZXIgb2JqZWN0c1xuXG5cdF9hZGRJbmFjdGl2ZUJpbmRpbmc6IGZ1bmN0aW9uICggYmluZGluZywgcm9vdFV1aWQsIHRyYWNrTmFtZSApIHtcblxuXHRcdHZhciBiaW5kaW5nc0J5Um9vdCA9IHRoaXMuX2JpbmRpbmdzQnlSb290QW5kTmFtZSxcblx0XHRcdGJpbmRpbmdCeU5hbWUgPSBiaW5kaW5nc0J5Um9vdFsgcm9vdFV1aWQgXSxcblxuXHRcdFx0YmluZGluZ3MgPSB0aGlzLl9iaW5kaW5ncztcblxuXHRcdGlmICggYmluZGluZ0J5TmFtZSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRiaW5kaW5nQnlOYW1lID0ge307XG5cdFx0XHRiaW5kaW5nc0J5Um9vdFsgcm9vdFV1aWQgXSA9IGJpbmRpbmdCeU5hbWU7XG5cblx0XHR9XG5cblx0XHRiaW5kaW5nQnlOYW1lWyB0cmFja05hbWUgXSA9IGJpbmRpbmc7XG5cblx0XHRiaW5kaW5nLl9jYWNoZUluZGV4ID0gYmluZGluZ3MubGVuZ3RoO1xuXHRcdGJpbmRpbmdzLnB1c2goIGJpbmRpbmcgKTtcblxuXHR9LFxuXG5cdF9yZW1vdmVJbmFjdGl2ZUJpbmRpbmc6IGZ1bmN0aW9uICggYmluZGluZyApIHtcblxuXHRcdHZhciBiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzLFxuXHRcdFx0cHJvcEJpbmRpbmcgPSBiaW5kaW5nLmJpbmRpbmcsXG5cdFx0XHRyb290VXVpZCA9IHByb3BCaW5kaW5nLnJvb3ROb2RlLnV1aWQsXG5cdFx0XHR0cmFja05hbWUgPSBwcm9wQmluZGluZy5wYXRoLFxuXHRcdFx0YmluZGluZ3NCeVJvb3QgPSB0aGlzLl9iaW5kaW5nc0J5Um9vdEFuZE5hbWUsXG5cdFx0XHRiaW5kaW5nQnlOYW1lID0gYmluZGluZ3NCeVJvb3RbIHJvb3RVdWlkIF0sXG5cblx0XHRcdGxhc3RJbmFjdGl2ZUJpbmRpbmcgPSBiaW5kaW5nc1sgYmluZGluZ3MubGVuZ3RoIC0gMSBdLFxuXHRcdFx0Y2FjaGVJbmRleCA9IGJpbmRpbmcuX2NhY2hlSW5kZXg7XG5cblx0XHRsYXN0SW5hY3RpdmVCaW5kaW5nLl9jYWNoZUluZGV4ID0gY2FjaGVJbmRleDtcblx0XHRiaW5kaW5nc1sgY2FjaGVJbmRleCBdID0gbGFzdEluYWN0aXZlQmluZGluZztcblx0XHRiaW5kaW5ncy5wb3AoKTtcblxuXHRcdGRlbGV0ZSBiaW5kaW5nQnlOYW1lWyB0cmFja05hbWUgXTtcblxuXHRcdHJlbW92ZV9lbXB0eV9tYXA6IHtcblxuXHRcdFx0Zm9yICggdmFyIF8gaW4gYmluZGluZ0J5TmFtZSApIGJyZWFrIHJlbW92ZV9lbXB0eV9tYXA7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcblxuXHRcdFx0ZGVsZXRlIGJpbmRpbmdzQnlSb290WyByb290VXVpZCBdO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0X2xlbmRCaW5kaW5nOiBmdW5jdGlvbiAoIGJpbmRpbmcgKSB7XG5cblx0XHR2YXIgYmluZGluZ3MgPSB0aGlzLl9iaW5kaW5ncyxcblx0XHRcdHByZXZJbmRleCA9IGJpbmRpbmcuX2NhY2hlSW5kZXgsXG5cblx0XHRcdGxhc3RBY3RpdmVJbmRleCA9IHRoaXMuX25BY3RpdmVCaW5kaW5ncyArKyxcblxuXHRcdFx0Zmlyc3RJbmFjdGl2ZUJpbmRpbmcgPSBiaW5kaW5nc1sgbGFzdEFjdGl2ZUluZGV4IF07XG5cblx0XHRiaW5kaW5nLl9jYWNoZUluZGV4ID0gbGFzdEFjdGl2ZUluZGV4O1xuXHRcdGJpbmRpbmdzWyBsYXN0QWN0aXZlSW5kZXggXSA9IGJpbmRpbmc7XG5cblx0XHRmaXJzdEluYWN0aXZlQmluZGluZy5fY2FjaGVJbmRleCA9IHByZXZJbmRleDtcblx0XHRiaW5kaW5nc1sgcHJldkluZGV4IF0gPSBmaXJzdEluYWN0aXZlQmluZGluZztcblxuXHR9LFxuXG5cdF90YWtlQmFja0JpbmRpbmc6IGZ1bmN0aW9uICggYmluZGluZyApIHtcblxuXHRcdHZhciBiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzLFxuXHRcdFx0cHJldkluZGV4ID0gYmluZGluZy5fY2FjaGVJbmRleCxcblxuXHRcdFx0Zmlyc3RJbmFjdGl2ZUluZGV4ID0gLS0gdGhpcy5fbkFjdGl2ZUJpbmRpbmdzLFxuXG5cdFx0XHRsYXN0QWN0aXZlQmluZGluZyA9IGJpbmRpbmdzWyBmaXJzdEluYWN0aXZlSW5kZXggXTtcblxuXHRcdGJpbmRpbmcuX2NhY2hlSW5kZXggPSBmaXJzdEluYWN0aXZlSW5kZXg7XG5cdFx0YmluZGluZ3NbIGZpcnN0SW5hY3RpdmVJbmRleCBdID0gYmluZGluZztcblxuXHRcdGxhc3RBY3RpdmVCaW5kaW5nLl9jYWNoZUluZGV4ID0gcHJldkluZGV4O1xuXHRcdGJpbmRpbmdzWyBwcmV2SW5kZXggXSA9IGxhc3RBY3RpdmVCaW5kaW5nO1xuXG5cdH0sXG5cblxuXHQvLyBNZW1vcnkgbWFuYWdlbWVudCBvZiBJbnRlcnBvbGFudHMgZm9yIHdlaWdodCBhbmQgdGltZSBzY2FsZVxuXG5cdF9sZW5kQ29udHJvbEludGVycG9sYW50OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgaW50ZXJwb2xhbnRzID0gdGhpcy5fY29udHJvbEludGVycG9sYW50cyxcblx0XHRcdGxhc3RBY3RpdmVJbmRleCA9IHRoaXMuX25BY3RpdmVDb250cm9sSW50ZXJwb2xhbnRzICsrLFxuXHRcdFx0aW50ZXJwb2xhbnQgPSBpbnRlcnBvbGFudHNbIGxhc3RBY3RpdmVJbmRleCBdO1xuXG5cdFx0aWYgKCBpbnRlcnBvbGFudCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRpbnRlcnBvbGFudCA9IG5ldyBMaW5lYXJJbnRlcnBvbGFudChcblx0XHRcdFx0bmV3IEZsb2F0MzJBcnJheSggMiApLCBuZXcgRmxvYXQzMkFycmF5KCAyICksXG5cdFx0XHRcdDEsIHRoaXMuX2NvbnRyb2xJbnRlcnBvbGFudHNSZXN1bHRCdWZmZXIgKTtcblxuXHRcdFx0aW50ZXJwb2xhbnQuX19jYWNoZUluZGV4ID0gbGFzdEFjdGl2ZUluZGV4O1xuXHRcdFx0aW50ZXJwb2xhbnRzWyBsYXN0QWN0aXZlSW5kZXggXSA9IGludGVycG9sYW50O1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGludGVycG9sYW50O1xuXG5cdH0sXG5cblx0X3Rha2VCYWNrQ29udHJvbEludGVycG9sYW50OiBmdW5jdGlvbiAoIGludGVycG9sYW50ICkge1xuXG5cdFx0dmFyIGludGVycG9sYW50cyA9IHRoaXMuX2NvbnRyb2xJbnRlcnBvbGFudHMsXG5cdFx0XHRwcmV2SW5kZXggPSBpbnRlcnBvbGFudC5fX2NhY2hlSW5kZXgsXG5cblx0XHRcdGZpcnN0SW5hY3RpdmVJbmRleCA9IC0tIHRoaXMuX25BY3RpdmVDb250cm9sSW50ZXJwb2xhbnRzLFxuXG5cdFx0XHRsYXN0QWN0aXZlSW50ZXJwb2xhbnQgPSBpbnRlcnBvbGFudHNbIGZpcnN0SW5hY3RpdmVJbmRleCBdO1xuXG5cdFx0aW50ZXJwb2xhbnQuX19jYWNoZUluZGV4ID0gZmlyc3RJbmFjdGl2ZUluZGV4O1xuXHRcdGludGVycG9sYW50c1sgZmlyc3RJbmFjdGl2ZUluZGV4IF0gPSBpbnRlcnBvbGFudDtcblxuXHRcdGxhc3RBY3RpdmVJbnRlcnBvbGFudC5fX2NhY2hlSW5kZXggPSBwcmV2SW5kZXg7XG5cdFx0aW50ZXJwb2xhbnRzWyBwcmV2SW5kZXggXSA9IGxhc3RBY3RpdmVJbnRlcnBvbGFudDtcblxuXHR9LFxuXG5cdF9jb250cm9sSW50ZXJwb2xhbnRzUmVzdWx0QnVmZmVyOiBuZXcgRmxvYXQzMkFycmF5KCAxICksXG5cblx0Ly8gcmV0dXJuIGFuIGFjdGlvbiBmb3IgYSBjbGlwIG9wdGlvbmFsbHkgdXNpbmcgYSBjdXN0b20gcm9vdCB0YXJnZXRcblx0Ly8gb2JqZWN0ICh0aGlzIG1ldGhvZCBhbGxvY2F0ZXMgYSBsb3Qgb2YgZHluYW1pYyBtZW1vcnkgaW4gY2FzZSBhXG5cdC8vIHByZXZpb3VzbHkgdW5rbm93biBjbGlwL3Jvb3QgY29tYmluYXRpb24gaXMgc3BlY2lmaWVkKVxuXHRjbGlwQWN0aW9uOiBmdW5jdGlvbiAoIGNsaXAsIG9wdGlvbmFsUm9vdCApIHtcblxuXHRcdHZhciByb290ID0gb3B0aW9uYWxSb290IHx8IHRoaXMuX3Jvb3QsXG5cdFx0XHRyb290VXVpZCA9IHJvb3QudXVpZCxcblxuXHRcdFx0Y2xpcE9iamVjdCA9IHR5cGVvZiBjbGlwID09PSAnc3RyaW5nJyA/XG5cdFx0XHRcdEFuaW1hdGlvbkNsaXAuZmluZEJ5TmFtZSggcm9vdCwgY2xpcCApIDogY2xpcCxcblxuXHRcdFx0Y2xpcFV1aWQgPSBjbGlwT2JqZWN0ICE9PSBudWxsID8gY2xpcE9iamVjdC51dWlkIDogY2xpcCxcblxuXHRcdFx0YWN0aW9uc0ZvckNsaXAgPSB0aGlzLl9hY3Rpb25zQnlDbGlwWyBjbGlwVXVpZCBdLFxuXHRcdFx0cHJvdG90eXBlQWN0aW9uID0gbnVsbDtcblxuXHRcdGlmICggYWN0aW9uc0ZvckNsaXAgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dmFyIGV4aXN0aW5nQWN0aW9uID1cblx0XHRcdFx0XHRhY3Rpb25zRm9yQ2xpcC5hY3Rpb25CeVJvb3RbIHJvb3RVdWlkIF07XG5cblx0XHRcdGlmICggZXhpc3RpbmdBY3Rpb24gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRyZXR1cm4gZXhpc3RpbmdBY3Rpb247XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gd2Uga25vdyB0aGUgY2xpcCwgc28gd2UgZG9uJ3QgaGF2ZSB0byBwYXJzZSBhbGxcblx0XHRcdC8vIHRoZSBiaW5kaW5ncyBhZ2FpbiBidXQgY2FuIGp1c3QgY29weVxuXHRcdFx0cHJvdG90eXBlQWN0aW9uID0gYWN0aW9uc0ZvckNsaXAua25vd25BY3Rpb25zWyAwIF07XG5cblx0XHRcdC8vIGFsc28sIHRha2UgdGhlIGNsaXAgZnJvbSB0aGUgcHJvdG90eXBlIGFjdGlvblxuXHRcdFx0aWYgKCBjbGlwT2JqZWN0ID09PSBudWxsIClcblx0XHRcdFx0Y2xpcE9iamVjdCA9IHByb3RvdHlwZUFjdGlvbi5fY2xpcDtcblxuXHRcdH1cblxuXHRcdC8vIGNsaXAgbXVzdCBiZSBrbm93biB3aGVuIHNwZWNpZmllZCB2aWEgc3RyaW5nXG5cdFx0aWYgKCBjbGlwT2JqZWN0ID09PSBudWxsICkgcmV0dXJuIG51bGw7XG5cblx0XHQvLyBhbGxvY2F0ZSBhbGwgcmVzb3VyY2VzIHJlcXVpcmVkIHRvIHJ1biBpdFxuXHRcdHZhciBuZXdBY3Rpb24gPSBuZXcgQW5pbWF0aW9uQWN0aW9uKCB0aGlzLCBjbGlwT2JqZWN0LCBvcHRpb25hbFJvb3QgKTtcblxuXHRcdHRoaXMuX2JpbmRBY3Rpb24oIG5ld0FjdGlvbiwgcHJvdG90eXBlQWN0aW9uICk7XG5cblx0XHQvLyBhbmQgbWFrZSB0aGUgYWN0aW9uIGtub3duIHRvIHRoZSBtZW1vcnkgbWFuYWdlclxuXHRcdHRoaXMuX2FkZEluYWN0aXZlQWN0aW9uKCBuZXdBY3Rpb24sIGNsaXBVdWlkLCByb290VXVpZCApO1xuXG5cdFx0cmV0dXJuIG5ld0FjdGlvbjtcblxuXHR9LFxuXG5cdC8vIGdldCBhbiBleGlzdGluZyBhY3Rpb25cblx0ZXhpc3RpbmdBY3Rpb246IGZ1bmN0aW9uICggY2xpcCwgb3B0aW9uYWxSb290ICkge1xuXG5cdFx0dmFyIHJvb3QgPSBvcHRpb25hbFJvb3QgfHwgdGhpcy5fcm9vdCxcblx0XHRcdHJvb3RVdWlkID0gcm9vdC51dWlkLFxuXG5cdFx0XHRjbGlwT2JqZWN0ID0gdHlwZW9mIGNsaXAgPT09ICdzdHJpbmcnID9cblx0XHRcdFx0QW5pbWF0aW9uQ2xpcC5maW5kQnlOYW1lKCByb290LCBjbGlwICkgOiBjbGlwLFxuXG5cdFx0XHRjbGlwVXVpZCA9IGNsaXBPYmplY3QgPyBjbGlwT2JqZWN0LnV1aWQgOiBjbGlwLFxuXG5cdFx0XHRhY3Rpb25zRm9yQ2xpcCA9IHRoaXMuX2FjdGlvbnNCeUNsaXBbIGNsaXBVdWlkIF07XG5cblx0XHRpZiAoIGFjdGlvbnNGb3JDbGlwICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHJldHVybiBhY3Rpb25zRm9yQ2xpcC5hY3Rpb25CeVJvb3RbIHJvb3RVdWlkIF0gfHwgbnVsbDtcblxuXHRcdH1cblxuXHRcdHJldHVybiBudWxsO1xuXG5cdH0sXG5cblx0Ly8gZGVhY3RpdmF0ZXMgYWxsIHByZXZpb3VzbHkgc2NoZWR1bGVkIGFjdGlvbnNcblx0c3RvcEFsbEFjdGlvbjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGFjdGlvbnMgPSB0aGlzLl9hY3Rpb25zLFxuXHRcdFx0bkFjdGlvbnMgPSB0aGlzLl9uQWN0aXZlQWN0aW9ucyxcblx0XHRcdGJpbmRpbmdzID0gdGhpcy5fYmluZGluZ3MsXG5cdFx0XHRuQmluZGluZ3MgPSB0aGlzLl9uQWN0aXZlQmluZGluZ3M7XG5cblx0XHR0aGlzLl9uQWN0aXZlQWN0aW9ucyA9IDA7XG5cdFx0dGhpcy5fbkFjdGl2ZUJpbmRpbmdzID0gMDtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSAhPT0gbkFjdGlvbnM7ICsrIGkgKSB7XG5cblx0XHRcdGFjdGlvbnNbIGkgXS5yZXNldCgpO1xuXG5cdFx0fVxuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpICE9PSBuQmluZGluZ3M7ICsrIGkgKSB7XG5cblx0XHRcdGJpbmRpbmdzWyBpIF0udXNlQ291bnQgPSAwO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHQvLyBhZHZhbmNlIHRoZSB0aW1lIGFuZCB1cGRhdGUgYXBwbHkgdGhlIGFuaW1hdGlvblxuXHR1cGRhdGU6IGZ1bmN0aW9uICggZGVsdGFUaW1lICkge1xuXG5cdFx0ZGVsdGFUaW1lICo9IHRoaXMudGltZVNjYWxlO1xuXG5cdFx0dmFyIGFjdGlvbnMgPSB0aGlzLl9hY3Rpb25zLFxuXHRcdFx0bkFjdGlvbnMgPSB0aGlzLl9uQWN0aXZlQWN0aW9ucyxcblxuXHRcdFx0dGltZSA9IHRoaXMudGltZSArPSBkZWx0YVRpbWUsXG5cdFx0XHR0aW1lRGlyZWN0aW9uID0gTWF0aC5zaWduKCBkZWx0YVRpbWUgKSxcblxuXHRcdFx0YWNjdUluZGV4ID0gdGhpcy5fYWNjdUluZGV4IF49IDE7XG5cblx0XHQvLyBydW4gYWN0aXZlIGFjdGlvbnNcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSAhPT0gbkFjdGlvbnM7ICsrIGkgKSB7XG5cblx0XHRcdHZhciBhY3Rpb24gPSBhY3Rpb25zWyBpIF07XG5cblx0XHRcdGFjdGlvbi5fdXBkYXRlKCB0aW1lLCBkZWx0YVRpbWUsIHRpbWVEaXJlY3Rpb24sIGFjY3VJbmRleCApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gdXBkYXRlIHNjZW5lIGdyYXBoXG5cblx0XHR2YXIgYmluZGluZ3MgPSB0aGlzLl9iaW5kaW5ncyxcblx0XHRcdG5CaW5kaW5ncyA9IHRoaXMuX25BY3RpdmVCaW5kaW5ncztcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSAhPT0gbkJpbmRpbmdzOyArKyBpICkge1xuXG5cdFx0XHRiaW5kaW5nc1sgaSBdLmFwcGx5KCBhY2N1SW5kZXggKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Ly8gcmV0dXJuIHRoaXMgbWl4ZXIncyByb290IHRhcmdldCBvYmplY3Rcblx0Z2V0Um9vdDogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuX3Jvb3Q7XG5cblx0fSxcblxuXHQvLyBmcmVlIGFsbCByZXNvdXJjZXMgc3BlY2lmaWMgdG8gYSBwYXJ0aWN1bGFyIGNsaXBcblx0dW5jYWNoZUNsaXA6IGZ1bmN0aW9uICggY2xpcCApIHtcblxuXHRcdHZhciBhY3Rpb25zID0gdGhpcy5fYWN0aW9ucyxcblx0XHRcdGNsaXBVdWlkID0gY2xpcC51dWlkLFxuXHRcdFx0YWN0aW9uc0J5Q2xpcCA9IHRoaXMuX2FjdGlvbnNCeUNsaXAsXG5cdFx0XHRhY3Rpb25zRm9yQ2xpcCA9IGFjdGlvbnNCeUNsaXBbIGNsaXBVdWlkIF07XG5cblx0XHRpZiAoIGFjdGlvbnNGb3JDbGlwICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdC8vIG5vdGU6IGp1c3QgY2FsbGluZyBfcmVtb3ZlSW5hY3RpdmVBY3Rpb24gd291bGQgbWVzcyB1cCB0aGVcblx0XHRcdC8vIGl0ZXJhdGlvbiBzdGF0ZSBhbmQgYWxzbyByZXF1aXJlIHVwZGF0aW5nIHRoZSBzdGF0ZSB3ZSBjYW5cblx0XHRcdC8vIGp1c3QgdGhyb3cgYXdheVxuXG5cdFx0XHR2YXIgYWN0aW9uc1RvUmVtb3ZlID0gYWN0aW9uc0ZvckNsaXAua25vd25BY3Rpb25zO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIG4gPSBhY3Rpb25zVG9SZW1vdmUubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHRcdHZhciBhY3Rpb24gPSBhY3Rpb25zVG9SZW1vdmVbIGkgXTtcblxuXHRcdFx0XHR0aGlzLl9kZWFjdGl2YXRlQWN0aW9uKCBhY3Rpb24gKTtcblxuXHRcdFx0XHR2YXIgY2FjaGVJbmRleCA9IGFjdGlvbi5fY2FjaGVJbmRleCxcblx0XHRcdFx0XHRsYXN0SW5hY3RpdmVBY3Rpb24gPSBhY3Rpb25zWyBhY3Rpb25zLmxlbmd0aCAtIDEgXTtcblxuXHRcdFx0XHRhY3Rpb24uX2NhY2hlSW5kZXggPSBudWxsO1xuXHRcdFx0XHRhY3Rpb24uX2J5Q2xpcENhY2hlSW5kZXggPSBudWxsO1xuXG5cdFx0XHRcdGxhc3RJbmFjdGl2ZUFjdGlvbi5fY2FjaGVJbmRleCA9IGNhY2hlSW5kZXg7XG5cdFx0XHRcdGFjdGlvbnNbIGNhY2hlSW5kZXggXSA9IGxhc3RJbmFjdGl2ZUFjdGlvbjtcblx0XHRcdFx0YWN0aW9ucy5wb3AoKTtcblxuXHRcdFx0XHR0aGlzLl9yZW1vdmVJbmFjdGl2ZUJpbmRpbmdzRm9yQWN0aW9uKCBhY3Rpb24gKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRkZWxldGUgYWN0aW9uc0J5Q2xpcFsgY2xpcFV1aWQgXTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdC8vIGZyZWUgYWxsIHJlc291cmNlcyBzcGVjaWZpYyB0byBhIHBhcnRpY3VsYXIgcm9vdCB0YXJnZXQgb2JqZWN0XG5cdHVuY2FjaGVSb290OiBmdW5jdGlvbiAoIHJvb3QgKSB7XG5cblx0XHR2YXIgcm9vdFV1aWQgPSByb290LnV1aWQsXG5cdFx0XHRhY3Rpb25zQnlDbGlwID0gdGhpcy5fYWN0aW9uc0J5Q2xpcDtcblxuXHRcdGZvciAoIHZhciBjbGlwVXVpZCBpbiBhY3Rpb25zQnlDbGlwICkge1xuXG5cdFx0XHR2YXIgYWN0aW9uQnlSb290ID0gYWN0aW9uc0J5Q2xpcFsgY2xpcFV1aWQgXS5hY3Rpb25CeVJvb3QsXG5cdFx0XHRcdGFjdGlvbiA9IGFjdGlvbkJ5Um9vdFsgcm9vdFV1aWQgXTtcblxuXHRcdFx0aWYgKCBhY3Rpb24gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHR0aGlzLl9kZWFjdGl2YXRlQWN0aW9uKCBhY3Rpb24gKTtcblx0XHRcdFx0dGhpcy5fcmVtb3ZlSW5hY3RpdmVBY3Rpb24oIGFjdGlvbiApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHR2YXIgYmluZGluZ3NCeVJvb3QgPSB0aGlzLl9iaW5kaW5nc0J5Um9vdEFuZE5hbWUsXG5cdFx0XHRiaW5kaW5nQnlOYW1lID0gYmluZGluZ3NCeVJvb3RbIHJvb3RVdWlkIF07XG5cblx0XHRpZiAoIGJpbmRpbmdCeU5hbWUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Zm9yICggdmFyIHRyYWNrTmFtZSBpbiBiaW5kaW5nQnlOYW1lICkge1xuXG5cdFx0XHRcdHZhciBiaW5kaW5nID0gYmluZGluZ0J5TmFtZVsgdHJhY2tOYW1lIF07XG5cdFx0XHRcdGJpbmRpbmcucmVzdG9yZU9yaWdpbmFsU3RhdGUoKTtcblx0XHRcdFx0dGhpcy5fcmVtb3ZlSW5hY3RpdmVCaW5kaW5nKCBiaW5kaW5nICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9LFxuXG5cdC8vIHJlbW92ZSBhIHRhcmdldGVkIGNsaXAgZnJvbSB0aGUgY2FjaGVcblx0dW5jYWNoZUFjdGlvbjogZnVuY3Rpb24gKCBjbGlwLCBvcHRpb25hbFJvb3QgKSB7XG5cblx0XHR2YXIgYWN0aW9uID0gdGhpcy5leGlzdGluZ0FjdGlvbiggY2xpcCwgb3B0aW9uYWxSb290ICk7XG5cblx0XHRpZiAoIGFjdGlvbiAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5fZGVhY3RpdmF0ZUFjdGlvbiggYWN0aW9uICk7XG5cdFx0XHR0aGlzLl9yZW1vdmVJbmFjdGl2ZUFjdGlvbiggYWN0aW9uICk7XG5cblx0XHR9XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBVbmlmb3JtKCB2YWx1ZSApIHtcblxuXHRpZiAoIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Vbmlmb3JtOiBUeXBlIHBhcmFtZXRlciBpcyBubyBsb25nZXIgbmVlZGVkLicgKTtcblx0XHR2YWx1ZSA9IGFyZ3VtZW50c1sgMSBdO1xuXG5cdH1cblxuXHR0aGlzLnZhbHVlID0gdmFsdWU7XG5cbn1cblxuVW5pZm9ybS5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiAoKSB7XG5cblx0cmV0dXJuIG5ldyBVbmlmb3JtKCB0aGlzLnZhbHVlLmNsb25lID09PSB1bmRlZmluZWQgPyB0aGlzLnZhbHVlIDogdGhpcy52YWx1ZS5jbG9uZSgpICk7XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBiZW5hYWRhbXMgLyBodHRwczovL3R3aXR0ZXIuY29tL2Jlbl9hX2FkYW1zXG4gKi9cblxuZnVuY3Rpb24gSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkoKSB7XG5cblx0QnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSc7XG5cdHRoaXMubWF4SW5zdGFuY2VkQ291bnQgPSB1bmRlZmluZWQ7XG5cbn1cblxuSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnksXG5cblx0aXNJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeTogdHJ1ZSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRcdEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdFx0dGhpcy5tYXhJbnN0YW5jZWRDb3VudCA9IHNvdXJjZS5tYXhJbnN0YW5jZWRDb3VudDtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIGJlbmFhZGFtcyAvIGh0dHBzOi8vdHdpdHRlci5jb20vYmVuX2FfYWRhbXNcbiAqL1xuXG5mdW5jdGlvbiBJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSggaW50ZXJsZWF2ZWRCdWZmZXIsIGl0ZW1TaXplLCBvZmZzZXQsIG5vcm1hbGl6ZWQgKSB7XG5cblx0dGhpcy5kYXRhID0gaW50ZXJsZWF2ZWRCdWZmZXI7XG5cdHRoaXMuaXRlbVNpemUgPSBpdGVtU2l6ZTtcblx0dGhpcy5vZmZzZXQgPSBvZmZzZXQ7XG5cblx0dGhpcy5ub3JtYWxpemVkID0gbm9ybWFsaXplZCA9PT0gdHJ1ZTtcblxufVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyggSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLCB7XG5cblx0Y291bnQ6IHtcblxuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5kYXRhLmNvdW50O1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0YXJyYXk6IHtcblxuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5kYXRhLmFycmF5O1xuXG5cdFx0fVxuXG5cdH1cblxufSApO1xuXG5PYmplY3QuYXNzaWduKCBJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUsIHtcblxuXHRpc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlOiB0cnVlLFxuXG5cdHNldFg6IGZ1bmN0aW9uICggaW5kZXgsIHggKSB7XG5cblx0XHR0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0IF0gPSB4O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRZOiBmdW5jdGlvbiAoIGluZGV4LCB5ICkge1xuXG5cdFx0dGhpcy5kYXRhLmFycmF5WyBpbmRleCAqIHRoaXMuZGF0YS5zdHJpZGUgKyB0aGlzLm9mZnNldCArIDEgXSA9IHk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFo6IGZ1bmN0aW9uICggaW5kZXgsIHogKSB7XG5cblx0XHR0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0ICsgMiBdID0gejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0VzogZnVuY3Rpb24gKCBpbmRleCwgdyApIHtcblxuXHRcdHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKiB0aGlzLmRhdGEuc3RyaWRlICsgdGhpcy5vZmZzZXQgKyAzIF0gPSB3O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRnZXRYOiBmdW5jdGlvbiAoIGluZGV4ICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKiB0aGlzLmRhdGEuc3RyaWRlICsgdGhpcy5vZmZzZXQgXTtcblxuXHR9LFxuXG5cdGdldFk6IGZ1bmN0aW9uICggaW5kZXggKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5kYXRhLmFycmF5WyBpbmRleCAqIHRoaXMuZGF0YS5zdHJpZGUgKyB0aGlzLm9mZnNldCArIDEgXTtcblxuXHR9LFxuXG5cdGdldFo6IGZ1bmN0aW9uICggaW5kZXggKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5kYXRhLmFycmF5WyBpbmRleCAqIHRoaXMuZGF0YS5zdHJpZGUgKyB0aGlzLm9mZnNldCArIDIgXTtcblxuXHR9LFxuXG5cdGdldFc6IGZ1bmN0aW9uICggaW5kZXggKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5kYXRhLmFycmF5WyBpbmRleCAqIHRoaXMuZGF0YS5zdHJpZGUgKyB0aGlzLm9mZnNldCArIDMgXTtcblxuXHR9LFxuXG5cdHNldFhZOiBmdW5jdGlvbiAoIGluZGV4LCB4LCB5ICkge1xuXG5cdFx0aW5kZXggPSBpbmRleCAqIHRoaXMuZGF0YS5zdHJpZGUgKyB0aGlzLm9mZnNldDtcblxuXHRcdHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKyAwIF0gPSB4O1xuXHRcdHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKyAxIF0gPSB5O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRYWVo6IGZ1bmN0aW9uICggaW5kZXgsIHgsIHksIHogKSB7XG5cblx0XHRpbmRleCA9IGluZGV4ICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0O1xuXG5cdFx0dGhpcy5kYXRhLmFycmF5WyBpbmRleCArIDAgXSA9IHg7XG5cdFx0dGhpcy5kYXRhLmFycmF5WyBpbmRleCArIDEgXSA9IHk7XG5cdFx0dGhpcy5kYXRhLmFycmF5WyBpbmRleCArIDIgXSA9IHo7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFhZWlc6IGZ1bmN0aW9uICggaW5kZXgsIHgsIHksIHosIHcgKSB7XG5cblx0XHRpbmRleCA9IGluZGV4ICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0O1xuXG5cdFx0dGhpcy5kYXRhLmFycmF5WyBpbmRleCArIDAgXSA9IHg7XG5cdFx0dGhpcy5kYXRhLmFycmF5WyBpbmRleCArIDEgXSA9IHk7XG5cdFx0dGhpcy5kYXRhLmFycmF5WyBpbmRleCArIDIgXSA9IHo7XG5cdFx0dGhpcy5kYXRhLmFycmF5WyBpbmRleCArIDMgXSA9IHc7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIGJlbmFhZGFtcyAvIGh0dHBzOi8vdHdpdHRlci5jb20vYmVuX2FfYWRhbXNcbiAqL1xuXG5mdW5jdGlvbiBJbnRlcmxlYXZlZEJ1ZmZlciggYXJyYXksIHN0cmlkZSApIHtcblxuXHR0aGlzLmFycmF5ID0gYXJyYXk7XG5cdHRoaXMuc3RyaWRlID0gc3RyaWRlO1xuXHR0aGlzLmNvdW50ID0gYXJyYXkgIT09IHVuZGVmaW5lZCA/IGFycmF5Lmxlbmd0aCAvIHN0cmlkZSA6IDA7XG5cblx0dGhpcy5keW5hbWljID0gZmFsc2U7XG5cdHRoaXMudXBkYXRlUmFuZ2UgPSB7IG9mZnNldDogMCwgY291bnQ6IC0gMSB9O1xuXG5cdHRoaXMudmVyc2lvbiA9IDA7XG5cbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KCBJbnRlcmxlYXZlZEJ1ZmZlci5wcm90b3R5cGUsICduZWVkc1VwZGF0ZScsIHtcblxuXHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRpZiAoIHZhbHVlID09PSB0cnVlICkgdGhpcy52ZXJzaW9uICsrO1xuXG5cdH1cblxufSApO1xuXG5PYmplY3QuYXNzaWduKCBJbnRlcmxlYXZlZEJ1ZmZlci5wcm90b3R5cGUsIHtcblxuXHRpc0ludGVybGVhdmVkQnVmZmVyOiB0cnVlLFxuXG5cdG9uVXBsb2FkQ2FsbGJhY2s6IGZ1bmN0aW9uICgpIHt9LFxuXG5cdHNldEFycmF5OiBmdW5jdGlvbiAoIGFycmF5ICkge1xuXG5cdFx0aWYgKCBBcnJheS5pc0FycmF5KCBhcnJheSApICkge1xuXG5cdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCAnVEhSRUUuQnVmZmVyQXR0cmlidXRlOiBhcnJheSBzaG91bGQgYmUgYSBUeXBlZCBBcnJheS4nICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLmNvdW50ID0gYXJyYXkgIT09IHVuZGVmaW5lZCA/IGFycmF5Lmxlbmd0aCAvIHRoaXMuc3RyaWRlIDogMDtcblx0XHR0aGlzLmFycmF5ID0gYXJyYXk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldER5bmFtaWM6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLmR5bmFtaWMgPSB2YWx1ZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHR0aGlzLmFycmF5ID0gbmV3IHNvdXJjZS5hcnJheS5jb25zdHJ1Y3Rvciggc291cmNlLmFycmF5ICk7XG5cdFx0dGhpcy5jb3VudCA9IHNvdXJjZS5jb3VudDtcblx0XHR0aGlzLnN0cmlkZSA9IHNvdXJjZS5zdHJpZGU7XG5cdFx0dGhpcy5keW5hbWljID0gc291cmNlLmR5bmFtaWM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvcHlBdDogZnVuY3Rpb24gKCBpbmRleDEsIGF0dHJpYnV0ZSwgaW5kZXgyICkge1xuXG5cdFx0aW5kZXgxICo9IHRoaXMuc3RyaWRlO1xuXHRcdGluZGV4MiAqPSBhdHRyaWJ1dGUuc3RyaWRlO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gdGhpcy5zdHJpZGU7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR0aGlzLmFycmF5WyBpbmRleDEgKyBpIF0gPSBhdHRyaWJ1dGUuYXJyYXlbIGluZGV4MiArIGkgXTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlLCBvZmZzZXQgKSB7XG5cblx0XHRpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkgb2Zmc2V0ID0gMDtcblxuXHRcdHRoaXMuYXJyYXkuc2V0KCB2YWx1ZSwgb2Zmc2V0ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XG5cblx0fSxcblxuXHRvblVwbG9hZDogZnVuY3Rpb24gKCBjYWxsYmFjayApIHtcblxuXHRcdHRoaXMub25VcGxvYWRDYWxsYmFjayA9IGNhbGxiYWNrO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBiZW5hYWRhbXMgLyBodHRwczovL3R3aXR0ZXIuY29tL2Jlbl9hX2FkYW1zXG4gKi9cblxuZnVuY3Rpb24gSW5zdGFuY2VkSW50ZXJsZWF2ZWRCdWZmZXIoIGFycmF5LCBzdHJpZGUsIG1lc2hQZXJBdHRyaWJ1dGUgKSB7XG5cblx0SW50ZXJsZWF2ZWRCdWZmZXIuY2FsbCggdGhpcywgYXJyYXksIHN0cmlkZSApO1xuXG5cdHRoaXMubWVzaFBlckF0dHJpYnV0ZSA9IG1lc2hQZXJBdHRyaWJ1dGUgfHwgMTtcblxufVxuXG5JbnN0YW5jZWRJbnRlcmxlYXZlZEJ1ZmZlci5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBJbnRlcmxlYXZlZEJ1ZmZlci5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBJbnN0YW5jZWRJbnRlcmxlYXZlZEJ1ZmZlcixcblxuXHRpc0luc3RhbmNlZEludGVybGVhdmVkQnVmZmVyOiB0cnVlLFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0SW50ZXJsZWF2ZWRCdWZmZXIucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0XHR0aGlzLm1lc2hQZXJBdHRyaWJ1dGUgPSBzb3VyY2UubWVzaFBlckF0dHJpYnV0ZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgYmVuYWFkYW1zIC8gaHR0cHM6Ly90d2l0dGVyLmNvbS9iZW5fYV9hZGFtc1xuICovXG5cbmZ1bmN0aW9uIEluc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplLCBtZXNoUGVyQXR0cmlidXRlICkge1xuXG5cdEJ1ZmZlckF0dHJpYnV0ZS5jYWxsKCB0aGlzLCBhcnJheSwgaXRlbVNpemUgKTtcblxuXHR0aGlzLm1lc2hQZXJBdHRyaWJ1dGUgPSBtZXNoUGVyQXR0cmlidXRlIHx8IDE7XG5cbn1cblxuSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUsXG5cblx0aXNJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGU6IHRydWUsXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHRCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0XHR0aGlzLm1lc2hQZXJBdHRyaWJ1dGUgPSBzb3VyY2UubWVzaFBlckF0dHJpYnV0ZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvL1xuICogQGF1dGhvciBzdGVwaG9taSAvIGh0dHA6Ly9zdGVwaGFuZWdpbmllci5jb20vXG4gKi9cblxuZnVuY3Rpb24gUmF5Y2FzdGVyKCBvcmlnaW4sIGRpcmVjdGlvbiwgbmVhciwgZmFyICkge1xuXG5cdHRoaXMucmF5ID0gbmV3IFJheSggb3JpZ2luLCBkaXJlY3Rpb24gKTtcblx0Ly8gZGlyZWN0aW9uIGlzIGFzc3VtZWQgdG8gYmUgbm9ybWFsaXplZCAoZm9yIGFjY3VyYXRlIGRpc3RhbmNlIGNhbGN1bGF0aW9ucylcblxuXHR0aGlzLm5lYXIgPSBuZWFyIHx8IDA7XG5cdHRoaXMuZmFyID0gZmFyIHx8IEluZmluaXR5O1xuXG5cdHRoaXMucGFyYW1zID0ge1xuXHRcdE1lc2g6IHt9LFxuXHRcdExpbmU6IHt9LFxuXHRcdExPRDoge30sXG5cdFx0UG9pbnRzOiB7IHRocmVzaG9sZDogMSB9LFxuXHRcdFNwcml0ZToge31cblx0fTtcblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydGllcyggdGhpcy5wYXJhbXMsIHtcblx0XHRQb2ludENsb3VkOiB7XG5cdFx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5SYXljYXN0ZXI6IHBhcmFtcy5Qb2ludENsb3VkIGhhcyBiZWVuIHJlbmFtZWQgdG8gcGFyYW1zLlBvaW50cy4nICk7XG5cdFx0XHRcdHJldHVybiB0aGlzLlBvaW50cztcblxuXHRcdFx0fVxuXHRcdH1cblx0fSApO1xuXG59XG5cbmZ1bmN0aW9uIGFzY1NvcnQoIGEsIGIgKSB7XG5cblx0cmV0dXJuIGEuZGlzdGFuY2UgLSBiLmRpc3RhbmNlO1xuXG59XG5cbmZ1bmN0aW9uIGludGVyc2VjdE9iamVjdCggb2JqZWN0LCByYXljYXN0ZXIsIGludGVyc2VjdHMsIHJlY3Vyc2l2ZSApIHtcblxuXHRpZiAoIG9iamVjdC52aXNpYmxlID09PSBmYWxzZSApIHJldHVybjtcblxuXHRvYmplY3QucmF5Y2FzdCggcmF5Y2FzdGVyLCBpbnRlcnNlY3RzICk7XG5cblx0aWYgKCByZWN1cnNpdmUgPT09IHRydWUgKSB7XG5cblx0XHR2YXIgY2hpbGRyZW4gPSBvYmplY3QuY2hpbGRyZW47XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRpbnRlcnNlY3RPYmplY3QoIGNoaWxkcmVuWyBpIF0sIHJheWNhc3RlciwgaW50ZXJzZWN0cywgdHJ1ZSApO1xuXG5cdFx0fVxuXG5cdH1cblxufVxuXG5PYmplY3QuYXNzaWduKCBSYXljYXN0ZXIucHJvdG90eXBlLCB7XG5cblx0bGluZVByZWNpc2lvbjogMSxcblxuXHRzZXQ6IGZ1bmN0aW9uICggb3JpZ2luLCBkaXJlY3Rpb24gKSB7XG5cblx0XHQvLyBkaXJlY3Rpb24gaXMgYXNzdW1lZCB0byBiZSBub3JtYWxpemVkIChmb3IgYWNjdXJhdGUgZGlzdGFuY2UgY2FsY3VsYXRpb25zKVxuXG5cdFx0dGhpcy5yYXkuc2V0KCBvcmlnaW4sIGRpcmVjdGlvbiApO1xuXG5cdH0sXG5cblx0c2V0RnJvbUNhbWVyYTogZnVuY3Rpb24gKCBjb29yZHMsIGNhbWVyYSApIHtcblxuXHRcdGlmICggKCBjYW1lcmEgJiYgY2FtZXJhLmlzUGVyc3BlY3RpdmVDYW1lcmEgKSApIHtcblxuXHRcdFx0dGhpcy5yYXkub3JpZ2luLnNldEZyb21NYXRyaXhQb3NpdGlvbiggY2FtZXJhLm1hdHJpeFdvcmxkICk7XG5cdFx0XHR0aGlzLnJheS5kaXJlY3Rpb24uc2V0KCBjb29yZHMueCwgY29vcmRzLnksIDAuNSApLnVucHJvamVjdCggY2FtZXJhICkuc3ViKCB0aGlzLnJheS5vcmlnaW4gKS5ub3JtYWxpemUoKTtcblxuXHRcdH0gZWxzZSBpZiAoICggY2FtZXJhICYmIGNhbWVyYS5pc09ydGhvZ3JhcGhpY0NhbWVyYSApICkge1xuXG5cdFx0XHR0aGlzLnJheS5vcmlnaW4uc2V0KCBjb29yZHMueCwgY29vcmRzLnksICggY2FtZXJhLm5lYXIgKyBjYW1lcmEuZmFyICkgLyAoIGNhbWVyYS5uZWFyIC0gY2FtZXJhLmZhciApICkudW5wcm9qZWN0KCBjYW1lcmEgKTsgLy8gc2V0IG9yaWdpbiBpbiBwbGFuZSBvZiBjYW1lcmFcblx0XHRcdHRoaXMucmF5LmRpcmVjdGlvbi5zZXQoIDAsIDAsIC0gMSApLnRyYW5zZm9ybURpcmVjdGlvbiggY2FtZXJhLm1hdHJpeFdvcmxkICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuUmF5Y2FzdGVyOiBVbnN1cHBvcnRlZCBjYW1lcmEgdHlwZS4nICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHRpbnRlcnNlY3RPYmplY3Q6IGZ1bmN0aW9uICggb2JqZWN0LCByZWN1cnNpdmUsIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdFx0dmFyIGludGVyc2VjdHMgPSBvcHRpb25hbFRhcmdldCB8fCBbXTtcblxuXHRcdGludGVyc2VjdE9iamVjdCggb2JqZWN0LCB0aGlzLCBpbnRlcnNlY3RzLCByZWN1cnNpdmUgKTtcblxuXHRcdGludGVyc2VjdHMuc29ydCggYXNjU29ydCApO1xuXG5cdFx0cmV0dXJuIGludGVyc2VjdHM7XG5cblx0fSxcblxuXHRpbnRlcnNlY3RPYmplY3RzOiBmdW5jdGlvbiAoIG9iamVjdHMsIHJlY3Vyc2l2ZSwgb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0XHR2YXIgaW50ZXJzZWN0cyA9IG9wdGlvbmFsVGFyZ2V0IHx8IFtdO1xuXG5cdFx0aWYgKCBBcnJheS5pc0FycmF5KCBvYmplY3RzICkgPT09IGZhbHNlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5SYXljYXN0ZXIuaW50ZXJzZWN0T2JqZWN0czogb2JqZWN0cyBpcyBub3QgYW4gQXJyYXkuJyApO1xuXHRcdFx0cmV0dXJuIGludGVyc2VjdHM7XG5cblx0XHR9XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBvYmplY3RzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdGludGVyc2VjdE9iamVjdCggb2JqZWN0c1sgaSBdLCB0aGlzLCBpbnRlcnNlY3RzLCByZWN1cnNpdmUgKTtcblxuXHRcdH1cblxuXHRcdGludGVyc2VjdHMuc29ydCggYXNjU29ydCApO1xuXG5cdFx0cmV0dXJuIGludGVyc2VjdHM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBDbG9jayggYXV0b1N0YXJ0ICkge1xuXG5cdHRoaXMuYXV0b1N0YXJ0ID0gKCBhdXRvU3RhcnQgIT09IHVuZGVmaW5lZCApID8gYXV0b1N0YXJ0IDogdHJ1ZTtcblxuXHR0aGlzLnN0YXJ0VGltZSA9IDA7XG5cdHRoaXMub2xkVGltZSA9IDA7XG5cdHRoaXMuZWxhcHNlZFRpbWUgPSAwO1xuXG5cdHRoaXMucnVubmluZyA9IGZhbHNlO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIENsb2NrLnByb3RvdHlwZSwge1xuXG5cdHN0YXJ0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLnN0YXJ0VGltZSA9ICggdHlwZW9mIHBlcmZvcm1hbmNlID09PSAndW5kZWZpbmVkJyA/IERhdGUgOiBwZXJmb3JtYW5jZSApLm5vdygpOyAvLyBzZWUgIzEwNzMyXG5cblx0XHR0aGlzLm9sZFRpbWUgPSB0aGlzLnN0YXJ0VGltZTtcblx0XHR0aGlzLmVsYXBzZWRUaW1lID0gMDtcblx0XHR0aGlzLnJ1bm5pbmcgPSB0cnVlO1xuXG5cdH0sXG5cblx0c3RvcDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5nZXRFbGFwc2VkVGltZSgpO1xuXHRcdHRoaXMucnVubmluZyA9IGZhbHNlO1xuXHRcdHRoaXMuYXV0b1N0YXJ0ID0gZmFsc2U7XG5cblx0fSxcblxuXHRnZXRFbGFwc2VkVGltZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5nZXREZWx0YSgpO1xuXHRcdHJldHVybiB0aGlzLmVsYXBzZWRUaW1lO1xuXG5cdH0sXG5cblx0Z2V0RGVsdGE6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBkaWZmID0gMDtcblxuXHRcdGlmICggdGhpcy5hdXRvU3RhcnQgJiYgISB0aGlzLnJ1bm5pbmcgKSB7XG5cblx0XHRcdHRoaXMuc3RhcnQoKTtcblx0XHRcdHJldHVybiAwO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLnJ1bm5pbmcgKSB7XG5cblx0XHRcdHZhciBuZXdUaW1lID0gKCB0eXBlb2YgcGVyZm9ybWFuY2UgPT09ICd1bmRlZmluZWQnID8gRGF0ZSA6IHBlcmZvcm1hbmNlICkubm93KCk7XG5cblx0XHRcdGRpZmYgPSAoIG5ld1RpbWUgLSB0aGlzLm9sZFRpbWUgKSAvIDEwMDA7XG5cdFx0XHR0aGlzLm9sZFRpbWUgPSBuZXdUaW1lO1xuXG5cdFx0XHR0aGlzLmVsYXBzZWRUaW1lICs9IGRpZmY7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gZGlmZjtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqXG4gKiBSZWY6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1NwaGVyaWNhbF9jb29yZGluYXRlX3N5c3RlbVxuICpcbiAqIFRoZSBwb2xlcyAocGhpKSBhcmUgYXQgdGhlIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSB5IGF4aXMuXG4gKiBUaGUgZXF1YXRvciBzdGFydHMgYXQgcG9zaXRpdmUgei5cbiAqL1xuXG5mdW5jdGlvbiBTcGhlcmljYWwoIHJhZGl1cywgcGhpLCB0aGV0YSApIHtcblxuXHR0aGlzLnJhZGl1cyA9ICggcmFkaXVzICE9PSB1bmRlZmluZWQgKSA/IHJhZGl1cyA6IDEuMDtcblx0dGhpcy5waGkgPSAoIHBoaSAhPT0gdW5kZWZpbmVkICkgPyBwaGkgOiAwOyAvLyB1cCAvIGRvd24gdG93YXJkcyB0b3AgYW5kIGJvdHRvbSBwb2xlXG5cdHRoaXMudGhldGEgPSAoIHRoZXRhICE9PSB1bmRlZmluZWQgKSA/IHRoZXRhIDogMDsgLy8gYXJvdW5kIHRoZSBlcXVhdG9yIG9mIHRoZSBzcGhlcmVcblxuXHRyZXR1cm4gdGhpcztcblxufVxuXG5PYmplY3QuYXNzaWduKCBTcGhlcmljYWwucHJvdG90eXBlLCB7XG5cblx0c2V0OiBmdW5jdGlvbiAoIHJhZGl1cywgcGhpLCB0aGV0YSApIHtcblxuXHRcdHRoaXMucmFkaXVzID0gcmFkaXVzO1xuXHRcdHRoaXMucGhpID0gcGhpO1xuXHRcdHRoaXMudGhldGEgPSB0aGV0YTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggb3RoZXIgKSB7XG5cblx0XHR0aGlzLnJhZGl1cyA9IG90aGVyLnJhZGl1cztcblx0XHR0aGlzLnBoaSA9IG90aGVyLnBoaTtcblx0XHR0aGlzLnRoZXRhID0gb3RoZXIudGhldGE7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdC8vIHJlc3RyaWN0IHBoaSB0byBiZSBiZXR3ZWUgRVBTIGFuZCBQSS1FUFNcblx0bWFrZVNhZmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBFUFMgPSAwLjAwMDAwMTtcblx0XHR0aGlzLnBoaSA9IE1hdGgubWF4KCBFUFMsIE1hdGgubWluKCBNYXRoLlBJIC0gRVBTLCB0aGlzLnBoaSApICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21WZWN0b3IzOiBmdW5jdGlvbiAoIHZlYzMgKSB7XG5cblx0XHR0aGlzLnJhZGl1cyA9IHZlYzMubGVuZ3RoKCk7XG5cblx0XHRpZiAoIHRoaXMucmFkaXVzID09PSAwICkge1xuXG5cdFx0XHR0aGlzLnRoZXRhID0gMDtcblx0XHRcdHRoaXMucGhpID0gMDtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHRoaXMudGhldGEgPSBNYXRoLmF0YW4yKCB2ZWMzLngsIHZlYzMueiApOyAvLyBlcXVhdG9yIGFuZ2xlIGFyb3VuZCB5LXVwIGF4aXNcblx0XHRcdHRoaXMucGhpID0gTWF0aC5hY29zKCBfTWF0aC5jbGFtcCggdmVjMy55IC8gdGhpcy5yYWRpdXMsIC0gMSwgMSApICk7IC8vIHBvbGFyIGFuZ2xlXG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44N1xuICpcbiAqIFJlZjogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQ3lsaW5kcmljYWxfY29vcmRpbmF0ZV9zeXN0ZW1cbiAqXG4gKi9cblxuZnVuY3Rpb24gQ3lsaW5kcmljYWwoIHJhZGl1cywgdGhldGEsIHkgKSB7XG5cblx0dGhpcy5yYWRpdXMgPSAoIHJhZGl1cyAhPT0gdW5kZWZpbmVkICkgPyByYWRpdXMgOiAxLjA7IC8vIGRpc3RhbmNlIGZyb20gdGhlIG9yaWdpbiB0byBhIHBvaW50IGluIHRoZSB4LXogcGxhbmVcblx0dGhpcy50aGV0YSA9ICggdGhldGEgIT09IHVuZGVmaW5lZCApID8gdGhldGEgOiAwOyAvLyBjb3VudGVyY2xvY2t3aXNlIGFuZ2xlIGluIHRoZSB4LXogcGxhbmUgbWVhc3VyZWQgaW4gcmFkaWFucyBmcm9tIHRoZSBwb3NpdGl2ZSB6LWF4aXNcblx0dGhpcy55ID0gKCB5ICE9PSB1bmRlZmluZWQgKSA/IHkgOiAwOyAvLyBoZWlnaHQgYWJvdmUgdGhlIHgteiBwbGFuZVxuXG5cdHJldHVybiB0aGlzO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIEN5bGluZHJpY2FsLnByb3RvdHlwZSwge1xuXG5cdHNldDogZnVuY3Rpb24gKCByYWRpdXMsIHRoZXRhLCB5ICkge1xuXG5cdFx0dGhpcy5yYWRpdXMgPSByYWRpdXM7XG5cdFx0dGhpcy50aGV0YSA9IHRoZXRhO1xuXHRcdHRoaXMueSA9IHk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIG90aGVyICkge1xuXG5cdFx0dGhpcy5yYWRpdXMgPSBvdGhlci5yYWRpdXM7XG5cdFx0dGhpcy50aGV0YSA9IG90aGVyLnRoZXRhO1xuXHRcdHRoaXMueSA9IG90aGVyLnk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21WZWN0b3IzOiBmdW5jdGlvbiAoIHZlYzMgKSB7XG5cblx0XHR0aGlzLnJhZGl1cyA9IE1hdGguc3FydCggdmVjMy54ICogdmVjMy54ICsgdmVjMy56ICogdmVjMy56ICk7XG5cdFx0dGhpcy50aGV0YSA9IE1hdGguYXRhbjIoIHZlYzMueCwgdmVjMy56ICk7XG5cdFx0dGhpcy55ID0gdmVjMy55O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBiaG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pb1xuICovXG5cbmZ1bmN0aW9uIEJveDIoIG1pbiwgbWF4ICkge1xuXG5cdHRoaXMubWluID0gKCBtaW4gIT09IHVuZGVmaW5lZCApID8gbWluIDogbmV3IFZlY3RvcjIoICsgSW5maW5pdHksICsgSW5maW5pdHkgKTtcblx0dGhpcy5tYXggPSAoIG1heCAhPT0gdW5kZWZpbmVkICkgPyBtYXggOiBuZXcgVmVjdG9yMiggLSBJbmZpbml0eSwgLSBJbmZpbml0eSApO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIEJveDIucHJvdG90eXBlLCB7XG5cblx0c2V0OiBmdW5jdGlvbiAoIG1pbiwgbWF4ICkge1xuXG5cdFx0dGhpcy5taW4uY29weSggbWluICk7XG5cdFx0dGhpcy5tYXguY29weSggbWF4ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21Qb2ludHM6IGZ1bmN0aW9uICggcG9pbnRzICkge1xuXG5cdFx0dGhpcy5tYWtlRW1wdHkoKTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBwb2ludHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHRoaXMuZXhwYW5kQnlQb2ludCggcG9pbnRzWyBpIF0gKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbUNlbnRlckFuZFNpemU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IyKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gc2V0RnJvbUNlbnRlckFuZFNpemUoIGNlbnRlciwgc2l6ZSApIHtcblxuXHRcdFx0dmFyIGhhbGZTaXplID0gdjEuY29weSggc2l6ZSApLm11bHRpcGx5U2NhbGFyKCAwLjUgKTtcblx0XHRcdHRoaXMubWluLmNvcHkoIGNlbnRlciApLnN1YiggaGFsZlNpemUgKTtcblx0XHRcdHRoaXMubWF4LmNvcHkoIGNlbnRlciApLmFkZCggaGFsZlNpemUgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBib3ggKSB7XG5cblx0XHR0aGlzLm1pbi5jb3B5KCBib3gubWluICk7XG5cdFx0dGhpcy5tYXguY29weSggYm94Lm1heCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtYWtlRW1wdHk6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMubWluLnggPSB0aGlzLm1pbi55ID0gKyBJbmZpbml0eTtcblx0XHR0aGlzLm1heC54ID0gdGhpcy5tYXgueSA9IC0gSW5maW5pdHk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGlzRW1wdHk6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIHRoaXMgaXMgYSBtb3JlIHJvYnVzdCBjaGVjayBmb3IgZW1wdHkgdGhhbiAoIHZvbHVtZSA8PSAwICkgYmVjYXVzZSB2b2x1bWUgY2FuIGdldCBwb3NpdGl2ZSB3aXRoIHR3byBuZWdhdGl2ZSBheGVzXG5cblx0XHRyZXR1cm4gKCB0aGlzLm1heC54IDwgdGhpcy5taW4ueCApIHx8ICggdGhpcy5tYXgueSA8IHRoaXMubWluLnkgKTtcblxuXHR9LFxuXG5cdGdldENlbnRlcjogZnVuY3Rpb24gKCB0YXJnZXQgKSB7XG5cblx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Cb3gyOiAuZ2V0Q2VudGVyKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IyKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5pc0VtcHR5KCkgPyB0YXJnZXQuc2V0KCAwLCAwICkgOiB0YXJnZXQuYWRkVmVjdG9ycyggdGhpcy5taW4sIHRoaXMubWF4ICkubXVsdGlwbHlTY2FsYXIoIDAuNSApO1xuXG5cdH0sXG5cblx0Z2V0U2l6ZTogZnVuY3Rpb24gKCB0YXJnZXQgKSB7XG5cblx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Cb3gyOiAuZ2V0U2l6ZSgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHR0YXJnZXQgPSBuZXcgVmVjdG9yMigpO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuaXNFbXB0eSgpID8gdGFyZ2V0LnNldCggMCwgMCApIDogdGFyZ2V0LnN1YlZlY3RvcnMoIHRoaXMubWF4LCB0aGlzLm1pbiApO1xuXG5cdH0sXG5cblx0ZXhwYW5kQnlQb2ludDogZnVuY3Rpb24gKCBwb2ludCApIHtcblxuXHRcdHRoaXMubWluLm1pbiggcG9pbnQgKTtcblx0XHR0aGlzLm1heC5tYXgoIHBvaW50ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGV4cGFuZEJ5VmVjdG9yOiBmdW5jdGlvbiAoIHZlY3RvciApIHtcblxuXHRcdHRoaXMubWluLnN1YiggdmVjdG9yICk7XG5cdFx0dGhpcy5tYXguYWRkKCB2ZWN0b3IgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZXhwYW5kQnlTY2FsYXI6IGZ1bmN0aW9uICggc2NhbGFyICkge1xuXG5cdFx0dGhpcy5taW4uYWRkU2NhbGFyKCAtIHNjYWxhciApO1xuXHRcdHRoaXMubWF4LmFkZFNjYWxhciggc2NhbGFyICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvbnRhaW5zUG9pbnQ6IGZ1bmN0aW9uICggcG9pbnQgKSB7XG5cblx0XHRyZXR1cm4gcG9pbnQueCA8IHRoaXMubWluLnggfHwgcG9pbnQueCA+IHRoaXMubWF4LnggfHxcblx0XHRcdHBvaW50LnkgPCB0aGlzLm1pbi55IHx8IHBvaW50LnkgPiB0aGlzLm1heC55ID8gZmFsc2UgOiB0cnVlO1xuXG5cdH0sXG5cblx0Y29udGFpbnNCb3g6IGZ1bmN0aW9uICggYm94ICkge1xuXG5cdFx0cmV0dXJuIHRoaXMubWluLnggPD0gYm94Lm1pbi54ICYmIGJveC5tYXgueCA8PSB0aGlzLm1heC54ICYmXG5cdFx0XHR0aGlzLm1pbi55IDw9IGJveC5taW4ueSAmJiBib3gubWF4LnkgPD0gdGhpcy5tYXgueTtcblxuXHR9LFxuXG5cdGdldFBhcmFtZXRlcjogZnVuY3Rpb24gKCBwb2ludCwgdGFyZ2V0ICkge1xuXG5cdFx0Ly8gVGhpcyBjYW4gcG90ZW50aWFsbHkgaGF2ZSBhIGRpdmlkZSBieSB6ZXJvIGlmIHRoZSBib3hcblx0XHQvLyBoYXMgYSBzaXplIGRpbWVuc2lvbiBvZiAwLlxuXG5cdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQm94MjogLmdldFBhcmFtZXRlcigpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHR0YXJnZXQgPSBuZXcgVmVjdG9yMigpO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRhcmdldC5zZXQoXG5cdFx0XHQoIHBvaW50LnggLSB0aGlzLm1pbi54ICkgLyAoIHRoaXMubWF4LnggLSB0aGlzLm1pbi54ICksXG5cdFx0XHQoIHBvaW50LnkgLSB0aGlzLm1pbi55ICkgLyAoIHRoaXMubWF4LnkgLSB0aGlzLm1pbi55IClcblx0XHQpO1xuXG5cdH0sXG5cblx0aW50ZXJzZWN0c0JveDogZnVuY3Rpb24gKCBib3ggKSB7XG5cblx0XHQvLyB1c2luZyA0IHNwbGl0dGluZyBwbGFuZXMgdG8gcnVsZSBvdXQgaW50ZXJzZWN0aW9uc1xuXG5cdFx0cmV0dXJuIGJveC5tYXgueCA8IHRoaXMubWluLnggfHwgYm94Lm1pbi54ID4gdGhpcy5tYXgueCB8fFxuXHRcdFx0Ym94Lm1heC55IDwgdGhpcy5taW4ueSB8fCBib3gubWluLnkgPiB0aGlzLm1heC55ID8gZmFsc2UgOiB0cnVlO1xuXG5cdH0sXG5cblx0Y2xhbXBQb2ludDogZnVuY3Rpb24gKCBwb2ludCwgdGFyZ2V0ICkge1xuXG5cdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQm94MjogLmNsYW1wUG9pbnQoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApO1xuXHRcdFx0dGFyZ2V0ID0gbmV3IFZlY3RvcjIoKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0YXJnZXQuY29weSggcG9pbnQgKS5jbGFtcCggdGhpcy5taW4sIHRoaXMubWF4ICk7XG5cblx0fSxcblxuXHRkaXN0YW5jZVRvUG9pbnQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IyKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gZGlzdGFuY2VUb1BvaW50KCBwb2ludCApIHtcblxuXHRcdFx0dmFyIGNsYW1wZWRQb2ludCA9IHYxLmNvcHkoIHBvaW50ICkuY2xhbXAoIHRoaXMubWluLCB0aGlzLm1heCApO1xuXHRcdFx0cmV0dXJuIGNsYW1wZWRQb2ludC5zdWIoIHBvaW50ICkubGVuZ3RoKCk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRpbnRlcnNlY3Q6IGZ1bmN0aW9uICggYm94ICkge1xuXG5cdFx0dGhpcy5taW4ubWF4KCBib3gubWluICk7XG5cdFx0dGhpcy5tYXgubWluKCBib3gubWF4ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHVuaW9uOiBmdW5jdGlvbiAoIGJveCApIHtcblxuXHRcdHRoaXMubWluLm1pbiggYm94Lm1pbiApO1xuXHRcdHRoaXMubWF4Lm1heCggYm94Lm1heCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHR0cmFuc2xhdGU6IGZ1bmN0aW9uICggb2Zmc2V0ICkge1xuXG5cdFx0dGhpcy5taW4uYWRkKCBvZmZzZXQgKTtcblx0XHR0aGlzLm1heC5hZGQoIG9mZnNldCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRlcXVhbHM6IGZ1bmN0aW9uICggYm94ICkge1xuXG5cdFx0cmV0dXJuIGJveC5taW4uZXF1YWxzKCB0aGlzLm1pbiApICYmIGJveC5tYXguZXF1YWxzKCB0aGlzLm1heCApO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKi9cblxuZnVuY3Rpb24gSW1tZWRpYXRlUmVuZGVyT2JqZWN0KCBtYXRlcmlhbCApIHtcblxuXHRPYmplY3QzRC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy5tYXRlcmlhbCA9IG1hdGVyaWFsO1xuXHR0aGlzLnJlbmRlciA9IGZ1bmN0aW9uICggLyogcmVuZGVyQ2FsbGJhY2sgKi8gKSB7fTtcblxufVxuXG5JbW1lZGlhdGVSZW5kZXJPYmplY3QucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICk7XG5JbW1lZGlhdGVSZW5kZXJPYmplY3QucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gSW1tZWRpYXRlUmVuZGVyT2JqZWN0O1xuXG5JbW1lZGlhdGVSZW5kZXJPYmplY3QucHJvdG90eXBlLmlzSW1tZWRpYXRlUmVuZGVyT2JqZWN0ID0gdHJ1ZTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKi9cblxuZnVuY3Rpb24gVmVydGV4Tm9ybWFsc0hlbHBlciggb2JqZWN0LCBzaXplLCBoZXgsIGxpbmV3aWR0aCApIHtcblxuXHR0aGlzLm9iamVjdCA9IG9iamVjdDtcblxuXHR0aGlzLnNpemUgPSAoIHNpemUgIT09IHVuZGVmaW5lZCApID8gc2l6ZSA6IDE7XG5cblx0dmFyIGNvbG9yID0gKCBoZXggIT09IHVuZGVmaW5lZCApID8gaGV4IDogMHhmZjAwMDA7XG5cblx0dmFyIHdpZHRoID0gKCBsaW5ld2lkdGggIT09IHVuZGVmaW5lZCApID8gbGluZXdpZHRoIDogMTtcblxuXHQvL1xuXG5cdHZhciBuTm9ybWFscyA9IDA7XG5cblx0dmFyIG9iakdlb21ldHJ5ID0gdGhpcy5vYmplY3QuZ2VvbWV0cnk7XG5cblx0aWYgKCBvYmpHZW9tZXRyeSAmJiBvYmpHZW9tZXRyeS5pc0dlb21ldHJ5ICkge1xuXG5cdFx0bk5vcm1hbHMgPSBvYmpHZW9tZXRyeS5mYWNlcy5sZW5ndGggKiAzO1xuXG5cdH0gZWxzZSBpZiAoIG9iakdlb21ldHJ5ICYmIG9iakdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkgKSB7XG5cblx0XHRuTm9ybWFscyA9IG9iakdlb21ldHJ5LmF0dHJpYnV0ZXMubm9ybWFsLmNvdW50O1xuXG5cdH1cblxuXHQvL1xuXG5cdHZhciBnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXG5cdHZhciBwb3NpdGlvbnMgPSBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbk5vcm1hbHMgKiAyICogMywgMyApO1xuXG5cdGdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgcG9zaXRpb25zICk7XG5cblx0TGluZVNlZ21lbnRzLmNhbGwoIHRoaXMsIGdlb21ldHJ5LCBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IGNvbG9yLCBsaW5ld2lkdGg6IHdpZHRoIH0gKSApO1xuXG5cdC8vXG5cblx0dGhpcy5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7XG5cblx0dGhpcy51cGRhdGUoKTtcblxufVxuXG5WZXJ0ZXhOb3JtYWxzSGVscGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIExpbmVTZWdtZW50cy5wcm90b3R5cGUgKTtcblZlcnRleE5vcm1hbHNIZWxwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVmVydGV4Tm9ybWFsc0hlbHBlcjtcblxuVmVydGV4Tm9ybWFsc0hlbHBlci5wcm90b3R5cGUudXBkYXRlID0gKCBmdW5jdGlvbiAoKSB7XG5cblx0dmFyIHYxID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIHYyID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIG5vcm1hbE1hdHJpeCA9IG5ldyBNYXRyaXgzKCk7XG5cblx0cmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZSgpIHtcblxuXHRcdHZhciBrZXlzID0gWyAnYScsICdiJywgJ2MnIF07XG5cblx0XHR0aGlzLm9iamVjdC51cGRhdGVNYXRyaXhXb3JsZCggdHJ1ZSApO1xuXG5cdFx0bm9ybWFsTWF0cml4LmdldE5vcm1hbE1hdHJpeCggdGhpcy5vYmplY3QubWF0cml4V29ybGQgKTtcblxuXHRcdHZhciBtYXRyaXhXb3JsZCA9IHRoaXMub2JqZWN0Lm1hdHJpeFdvcmxkO1xuXG5cdFx0dmFyIHBvc2l0aW9uID0gdGhpcy5nZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uO1xuXG5cdFx0Ly9cblxuXHRcdHZhciBvYmpHZW9tZXRyeSA9IHRoaXMub2JqZWN0Lmdlb21ldHJ5O1xuXG5cdFx0aWYgKCBvYmpHZW9tZXRyeSAmJiBvYmpHZW9tZXRyeS5pc0dlb21ldHJ5ICkge1xuXG5cdFx0XHR2YXIgdmVydGljZXMgPSBvYmpHZW9tZXRyeS52ZXJ0aWNlcztcblxuXHRcdFx0dmFyIGZhY2VzID0gb2JqR2VvbWV0cnkuZmFjZXM7XG5cblx0XHRcdHZhciBpZHggPSAwO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBmYWNlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdHZhciBmYWNlID0gZmFjZXNbIGkgXTtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaiA9IDAsIGpsID0gZmFjZS52ZXJ0ZXhOb3JtYWxzLmxlbmd0aDsgaiA8IGpsOyBqICsrICkge1xuXG5cdFx0XHRcdFx0dmFyIHZlcnRleCA9IHZlcnRpY2VzWyBmYWNlWyBrZXlzWyBqIF0gXSBdO1xuXG5cdFx0XHRcdFx0dmFyIG5vcm1hbCA9IGZhY2UudmVydGV4Tm9ybWFsc1sgaiBdO1xuXG5cdFx0XHRcdFx0djEuY29weSggdmVydGV4ICkuYXBwbHlNYXRyaXg0KCBtYXRyaXhXb3JsZCApO1xuXG5cdFx0XHRcdFx0djIuY29weSggbm9ybWFsICkuYXBwbHlNYXRyaXgzKCBub3JtYWxNYXRyaXggKS5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhciggdGhpcy5zaXplICkuYWRkKCB2MSApO1xuXG5cdFx0XHRcdFx0cG9zaXRpb24uc2V0WFlaKCBpZHgsIHYxLngsIHYxLnksIHYxLnogKTtcblxuXHRcdFx0XHRcdGlkeCA9IGlkeCArIDE7XG5cblx0XHRcdFx0XHRwb3NpdGlvbi5zZXRYWVooIGlkeCwgdjIueCwgdjIueSwgdjIueiApO1xuXG5cdFx0XHRcdFx0aWR4ID0gaWR4ICsgMTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSBpZiAoIG9iakdlb21ldHJ5ICYmIG9iakdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkgKSB7XG5cblx0XHRcdHZhciBvYmpQb3MgPSBvYmpHZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uO1xuXG5cdFx0XHR2YXIgb2JqTm9ybSA9IG9iakdlb21ldHJ5LmF0dHJpYnV0ZXMubm9ybWFsO1xuXG5cdFx0XHR2YXIgaWR4ID0gMDtcblxuXHRcdFx0Ly8gZm9yIHNpbXBsaWNpdHksIGlnbm9yZSBpbmRleCBhbmQgZHJhd2NhbGxzLCBhbmQgcmVuZGVyIGV2ZXJ5IG5vcm1hbFxuXG5cdFx0XHRmb3IgKCB2YXIgaiA9IDAsIGpsID0gb2JqUG9zLmNvdW50OyBqIDwgamw7IGogKysgKSB7XG5cblx0XHRcdFx0djEuc2V0KCBvYmpQb3MuZ2V0WCggaiApLCBvYmpQb3MuZ2V0WSggaiApLCBvYmpQb3MuZ2V0WiggaiApICkuYXBwbHlNYXRyaXg0KCBtYXRyaXhXb3JsZCApO1xuXG5cdFx0XHRcdHYyLnNldCggb2JqTm9ybS5nZXRYKCBqICksIG9iak5vcm0uZ2V0WSggaiApLCBvYmpOb3JtLmdldFooIGogKSApO1xuXG5cdFx0XHRcdHYyLmFwcGx5TWF0cml4Myggbm9ybWFsTWF0cml4ICkubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIoIHRoaXMuc2l6ZSApLmFkZCggdjEgKTtcblxuXHRcdFx0XHRwb3NpdGlvbi5zZXRYWVooIGlkeCwgdjEueCwgdjEueSwgdjEueiApO1xuXG5cdFx0XHRcdGlkeCA9IGlkeCArIDE7XG5cblx0XHRcdFx0cG9zaXRpb24uc2V0WFlaKCBpZHgsIHYyLngsIHYyLnksIHYyLnogKTtcblxuXHRcdFx0XHRpZHggPSBpZHggKyAxO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRwb3NpdGlvbi5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0fTtcblxufSgpICk7XG5cbi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqL1xuXG5mdW5jdGlvbiBTcG90TGlnaHRIZWxwZXIoIGxpZ2h0LCBjb2xvciApIHtcblxuXHRPYmplY3QzRC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy5saWdodCA9IGxpZ2h0O1xuXHR0aGlzLmxpZ2h0LnVwZGF0ZU1hdHJpeFdvcmxkKCk7XG5cblx0dGhpcy5tYXRyaXggPSBsaWdodC5tYXRyaXhXb3JsZDtcblx0dGhpcy5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7XG5cblx0dGhpcy5jb2xvciA9IGNvbG9yO1xuXG5cdHZhciBnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXG5cdHZhciBwb3NpdGlvbnMgPSBbXG5cdFx0MCwgMCwgMCwgXHQwLCAwLCAxLFxuXHRcdDAsIDAsIDAsIFx0MSwgMCwgMSxcblx0XHQwLCAwLCAwLFx0LSAxLCAwLCAxLFxuXHRcdDAsIDAsIDAsIFx0MCwgMSwgMSxcblx0XHQwLCAwLCAwLCBcdDAsIC0gMSwgMVxuXHRdO1xuXG5cdGZvciAoIHZhciBpID0gMCwgaiA9IDEsIGwgPSAzMjsgaSA8IGw7IGkgKyssIGogKysgKSB7XG5cblx0XHR2YXIgcDEgPSAoIGkgLyBsICkgKiBNYXRoLlBJICogMjtcblx0XHR2YXIgcDIgPSAoIGogLyBsICkgKiBNYXRoLlBJICogMjtcblxuXHRcdHBvc2l0aW9ucy5wdXNoKFxuXHRcdFx0TWF0aC5jb3MoIHAxICksIE1hdGguc2luKCBwMSApLCAxLFxuXHRcdFx0TWF0aC5jb3MoIHAyICksIE1hdGguc2luKCBwMiApLCAxXG5cdFx0KTtcblxuXHR9XG5cblx0Z2VvbWV0cnkuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25zLCAzICkgKTtcblxuXHR2YXIgbWF0ZXJpYWwgPSBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgZm9nOiBmYWxzZSB9ICk7XG5cblx0dGhpcy5jb25lID0gbmV3IExpbmVTZWdtZW50cyggZ2VvbWV0cnksIG1hdGVyaWFsICk7XG5cdHRoaXMuYWRkKCB0aGlzLmNvbmUgKTtcblxuXHR0aGlzLnVwZGF0ZSgpO1xuXG59XG5cblNwb3RMaWdodEhlbHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKTtcblNwb3RMaWdodEhlbHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBTcG90TGlnaHRIZWxwZXI7XG5cblNwb3RMaWdodEhlbHBlci5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcblxuXHR0aGlzLmNvbmUuZ2VvbWV0cnkuZGlzcG9zZSgpO1xuXHR0aGlzLmNvbmUubWF0ZXJpYWwuZGlzcG9zZSgpO1xuXG59O1xuXG5TcG90TGlnaHRIZWxwZXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uICgpIHtcblxuXHR2YXIgdmVjdG9yID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIHZlY3RvcjIgPSBuZXcgVmVjdG9yMygpO1xuXG5cdHJldHVybiBmdW5jdGlvbiB1cGRhdGUoKSB7XG5cblx0XHR0aGlzLmxpZ2h0LnVwZGF0ZU1hdHJpeFdvcmxkKCk7XG5cblx0XHR2YXIgY29uZUxlbmd0aCA9IHRoaXMubGlnaHQuZGlzdGFuY2UgPyB0aGlzLmxpZ2h0LmRpc3RhbmNlIDogMTAwMDtcblx0XHR2YXIgY29uZVdpZHRoID0gY29uZUxlbmd0aCAqIE1hdGgudGFuKCB0aGlzLmxpZ2h0LmFuZ2xlICk7XG5cblx0XHR0aGlzLmNvbmUuc2NhbGUuc2V0KCBjb25lV2lkdGgsIGNvbmVXaWR0aCwgY29uZUxlbmd0aCApO1xuXG5cdFx0dmVjdG9yLnNldEZyb21NYXRyaXhQb3NpdGlvbiggdGhpcy5saWdodC5tYXRyaXhXb3JsZCApO1xuXHRcdHZlY3RvcjIuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCB0aGlzLmxpZ2h0LnRhcmdldC5tYXRyaXhXb3JsZCApO1xuXG5cdFx0dGhpcy5jb25lLmxvb2tBdCggdmVjdG9yMi5zdWIoIHZlY3RvciApICk7XG5cblx0XHRpZiAoIHRoaXMuY29sb3IgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dGhpcy5jb25lLm1hdGVyaWFsLmNvbG9yLnNldCggdGhpcy5jb2xvciApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dGhpcy5jb25lLm1hdGVyaWFsLmNvbG9yLmNvcHkoIHRoaXMubGlnaHQuY29sb3IgKTtcblxuXHRcdH1cblxuXHR9O1xuXG59KCk7XG5cbi8qKlxuICogQGF1dGhvciBTZWFuIEdyaWZmaW4gLyBodHRwOi8vdHdpdHRlci5jb20vc2dyaWZcbiAqIEBhdXRob3IgTWljaGFlbCBHdWVycmVybyAvIGh0dHA6Ly9yZWFsaXR5bWVsdGRvd24uY29tXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBpa2VyciAvIGh0dHA6Ly92ZXJvbGQuY29tXG4gKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44N1xuICovXG5cbmZ1bmN0aW9uIGdldEJvbmVMaXN0KCBvYmplY3QgKSB7XG5cblx0dmFyIGJvbmVMaXN0ID0gW107XG5cblx0aWYgKCBvYmplY3QgJiYgb2JqZWN0LmlzQm9uZSApIHtcblxuXHRcdGJvbmVMaXN0LnB1c2goIG9iamVjdCApO1xuXG5cdH1cblxuXHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBvYmplY3QuY2hpbGRyZW4ubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0Ym9uZUxpc3QucHVzaC5hcHBseSggYm9uZUxpc3QsIGdldEJvbmVMaXN0KCBvYmplY3QuY2hpbGRyZW5bIGkgXSApICk7XG5cblx0fVxuXG5cdHJldHVybiBib25lTGlzdDtcblxufVxuXG5mdW5jdGlvbiBTa2VsZXRvbkhlbHBlciggb2JqZWN0ICkge1xuXG5cdHZhciBib25lcyA9IGdldEJvbmVMaXN0KCBvYmplY3QgKTtcblxuXHR2YXIgZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcblxuXHR2YXIgdmVydGljZXMgPSBbXTtcblx0dmFyIGNvbG9ycyA9IFtdO1xuXG5cdHZhciBjb2xvcjEgPSBuZXcgQ29sb3IoIDAsIDAsIDEgKTtcblx0dmFyIGNvbG9yMiA9IG5ldyBDb2xvciggMCwgMSwgMCApO1xuXG5cdGZvciAoIHZhciBpID0gMDsgaSA8IGJvbmVzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdHZhciBib25lID0gYm9uZXNbIGkgXTtcblxuXHRcdGlmICggYm9uZS5wYXJlbnQgJiYgYm9uZS5wYXJlbnQuaXNCb25lICkge1xuXG5cdFx0XHR2ZXJ0aWNlcy5wdXNoKCAwLCAwLCAwICk7XG5cdFx0XHR2ZXJ0aWNlcy5wdXNoKCAwLCAwLCAwICk7XG5cdFx0XHRjb2xvcnMucHVzaCggY29sb3IxLnIsIGNvbG9yMS5nLCBjb2xvcjEuYiApO1xuXHRcdFx0Y29sb3JzLnB1c2goIGNvbG9yMi5yLCBjb2xvcjIuZywgY29sb3IyLmIgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0Z2VvbWV0cnkuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xuXHRnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdjb2xvcicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBjb2xvcnMsIDMgKSApO1xuXG5cdHZhciBtYXRlcmlhbCA9IG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyB2ZXJ0ZXhDb2xvcnM6IFZlcnRleENvbG9ycywgZGVwdGhUZXN0OiBmYWxzZSwgZGVwdGhXcml0ZTogZmFsc2UsIHRyYW5zcGFyZW50OiB0cnVlIH0gKTtcblxuXHRMaW5lU2VnbWVudHMuY2FsbCggdGhpcywgZ2VvbWV0cnksIG1hdGVyaWFsICk7XG5cblx0dGhpcy5yb290ID0gb2JqZWN0O1xuXHR0aGlzLmJvbmVzID0gYm9uZXM7XG5cblx0dGhpcy5tYXRyaXggPSBvYmplY3QubWF0cml4V29ybGQ7XG5cdHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xuXG59XG5cblNrZWxldG9uSGVscGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIExpbmVTZWdtZW50cy5wcm90b3R5cGUgKTtcblNrZWxldG9uSGVscGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFNrZWxldG9uSGVscGVyO1xuXG5Ta2VsZXRvbkhlbHBlci5wcm90b3R5cGUudXBkYXRlTWF0cml4V29ybGQgPSBmdW5jdGlvbiAoKSB7XG5cblx0dmFyIHZlY3RvciA9IG5ldyBWZWN0b3IzKCk7XG5cblx0dmFyIGJvbmVNYXRyaXggPSBuZXcgTWF0cml4NCgpO1xuXHR2YXIgbWF0cml4V29ybGRJbnYgPSBuZXcgTWF0cml4NCgpO1xuXG5cdHJldHVybiBmdW5jdGlvbiB1cGRhdGVNYXRyaXhXb3JsZCggZm9yY2UgKSB7XG5cblx0XHR2YXIgYm9uZXMgPSB0aGlzLmJvbmVzO1xuXG5cdFx0dmFyIGdlb21ldHJ5ID0gdGhpcy5nZW9tZXRyeTtcblx0XHR2YXIgcG9zaXRpb24gPSBnZW9tZXRyeS5nZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicgKTtcblxuXHRcdG1hdHJpeFdvcmxkSW52LmdldEludmVyc2UoIHRoaXMucm9vdC5tYXRyaXhXb3JsZCApO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBqID0gMDsgaSA8IGJvbmVzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGJvbmUgPSBib25lc1sgaSBdO1xuXG5cdFx0XHRpZiAoIGJvbmUucGFyZW50ICYmIGJvbmUucGFyZW50LmlzQm9uZSApIHtcblxuXHRcdFx0XHRib25lTWF0cml4Lm11bHRpcGx5TWF0cmljZXMoIG1hdHJpeFdvcmxkSW52LCBib25lLm1hdHJpeFdvcmxkICk7XG5cdFx0XHRcdHZlY3Rvci5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGJvbmVNYXRyaXggKTtcblx0XHRcdFx0cG9zaXRpb24uc2V0WFlaKCBqLCB2ZWN0b3IueCwgdmVjdG9yLnksIHZlY3Rvci56ICk7XG5cblx0XHRcdFx0Ym9uZU1hdHJpeC5tdWx0aXBseU1hdHJpY2VzKCBtYXRyaXhXb3JsZEludiwgYm9uZS5wYXJlbnQubWF0cml4V29ybGQgKTtcblx0XHRcdFx0dmVjdG9yLnNldEZyb21NYXRyaXhQb3NpdGlvbiggYm9uZU1hdHJpeCApO1xuXHRcdFx0XHRwb3NpdGlvbi5zZXRYWVooIGogKyAxLCB2ZWN0b3IueCwgdmVjdG9yLnksIHZlY3Rvci56ICk7XG5cblx0XHRcdFx0aiArPSAyO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRnZW9tZXRyeS5nZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicgKS5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRPYmplY3QzRC5wcm90b3R5cGUudXBkYXRlTWF0cml4V29ybGQuY2FsbCggdGhpcywgZm9yY2UgKTtcblxuXHR9O1xuXG59KCk7XG5cbi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gUG9pbnRMaWdodEhlbHBlciggbGlnaHQsIHNwaGVyZVNpemUsIGNvbG9yICkge1xuXG5cdHRoaXMubGlnaHQgPSBsaWdodDtcblx0dGhpcy5saWdodC51cGRhdGVNYXRyaXhXb3JsZCgpO1xuXG5cdHRoaXMuY29sb3IgPSBjb2xvcjtcblxuXHR2YXIgZ2VvbWV0cnkgPSBuZXcgU3BoZXJlQnVmZmVyR2VvbWV0cnkoIHNwaGVyZVNpemUsIDQsIDIgKTtcblx0dmFyIG1hdGVyaWFsID0gbmV3IE1lc2hCYXNpY01hdGVyaWFsKCB7IHdpcmVmcmFtZTogdHJ1ZSwgZm9nOiBmYWxzZSB9ICk7XG5cblx0TWVzaC5jYWxsKCB0aGlzLCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcblxuXHR0aGlzLm1hdHJpeCA9IHRoaXMubGlnaHQubWF0cml4V29ybGQ7XG5cdHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xuXG5cdHRoaXMudXBkYXRlKCk7XG5cblxuXHQvKlxuXHR2YXIgZGlzdGFuY2VHZW9tZXRyeSA9IG5ldyBUSFJFRS5JY29zYWhlZHJvbkdlb21ldHJ5KCAxLCAyICk7XG5cdHZhciBkaXN0YW5jZU1hdGVyaWFsID0gbmV3IFRIUkVFLk1lc2hCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiBoZXhDb2xvciwgZm9nOiBmYWxzZSwgd2lyZWZyYW1lOiB0cnVlLCBvcGFjaXR5OiAwLjEsIHRyYW5zcGFyZW50OiB0cnVlIH0gKTtcblxuXHR0aGlzLmxpZ2h0U3BoZXJlID0gbmV3IFRIUkVFLk1lc2goIGJ1bGJHZW9tZXRyeSwgYnVsYk1hdGVyaWFsICk7XG5cdHRoaXMubGlnaHREaXN0YW5jZSA9IG5ldyBUSFJFRS5NZXNoKCBkaXN0YW5jZUdlb21ldHJ5LCBkaXN0YW5jZU1hdGVyaWFsICk7XG5cblx0dmFyIGQgPSBsaWdodC5kaXN0YW5jZTtcblxuXHRpZiAoIGQgPT09IDAuMCApIHtcblxuXHRcdHRoaXMubGlnaHREaXN0YW5jZS52aXNpYmxlID0gZmFsc2U7XG5cblx0fSBlbHNlIHtcblxuXHRcdHRoaXMubGlnaHREaXN0YW5jZS5zY2FsZS5zZXQoIGQsIGQsIGQgKTtcblxuXHR9XG5cblx0dGhpcy5hZGQoIHRoaXMubGlnaHREaXN0YW5jZSApO1xuXHQqL1xuXG59XG5cblBvaW50TGlnaHRIZWxwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTWVzaC5wcm90b3R5cGUgKTtcblBvaW50TGlnaHRIZWxwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUG9pbnRMaWdodEhlbHBlcjtcblxuUG9pbnRMaWdodEhlbHBlci5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcblxuXHR0aGlzLmdlb21ldHJ5LmRpc3Bvc2UoKTtcblx0dGhpcy5tYXRlcmlhbC5kaXNwb3NlKCk7XG5cbn07XG5cblBvaW50TGlnaHRIZWxwZXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uICgpIHtcblxuXHRpZiAoIHRoaXMuY29sb3IgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdHRoaXMubWF0ZXJpYWwuY29sb3Iuc2V0KCB0aGlzLmNvbG9yICk7XG5cblx0fSBlbHNlIHtcblxuXHRcdHRoaXMubWF0ZXJpYWwuY29sb3IuY29weSggdGhpcy5saWdodC5jb2xvciApO1xuXG5cdH1cblxuXHQvKlxuXHR2YXIgZCA9IHRoaXMubGlnaHQuZGlzdGFuY2U7XG5cblx0aWYgKCBkID09PSAwLjAgKSB7XG5cblx0XHR0aGlzLmxpZ2h0RGlzdGFuY2UudmlzaWJsZSA9IGZhbHNlO1xuXG5cdH0gZWxzZSB7XG5cblx0XHR0aGlzLmxpZ2h0RGlzdGFuY2UudmlzaWJsZSA9IHRydWU7XG5cdFx0dGhpcy5saWdodERpc3RhbmNlLnNjYWxlLnNldCggZCwgZCwgZCApO1xuXG5cdH1cblx0Ki9cblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIGFiZWxuYXRpb24gLyBodHRwOi8vZ2l0aHViLmNvbS9hYmVsbmF0aW9uXG4gKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqL1xuXG5mdW5jdGlvbiBSZWN0QXJlYUxpZ2h0SGVscGVyKCBsaWdodCwgY29sb3IgKSB7XG5cblx0T2JqZWN0M0QuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMubGlnaHQgPSBsaWdodDtcblx0dGhpcy5saWdodC51cGRhdGVNYXRyaXhXb3JsZCgpO1xuXG5cdHRoaXMubWF0cml4ID0gbGlnaHQubWF0cml4V29ybGQ7XG5cdHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xuXG5cdHRoaXMuY29sb3IgPSBjb2xvcjtcblxuXHR2YXIgbWF0ZXJpYWwgPSBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgZm9nOiBmYWxzZSB9ICk7XG5cblx0dmFyIGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cblx0Z2VvbWV0cnkuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgQnVmZmVyQXR0cmlidXRlKCBuZXcgRmxvYXQzMkFycmF5KCA1ICogMyApLCAzICkgKTtcblxuXHR0aGlzLmxpbmUgPSBuZXcgTGluZSggZ2VvbWV0cnksIG1hdGVyaWFsICk7XG5cdHRoaXMuYWRkKCB0aGlzLmxpbmUgKTtcblxuXG5cdHRoaXMudXBkYXRlKCk7XG5cbn1cblxuUmVjdEFyZWFMaWdodEhlbHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKTtcblJlY3RBcmVhTGlnaHRIZWxwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUmVjdEFyZWFMaWdodEhlbHBlcjtcblxuUmVjdEFyZWFMaWdodEhlbHBlci5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcblxuXHR0aGlzLmNoaWxkcmVuWyAwIF0uZ2VvbWV0cnkuZGlzcG9zZSgpO1xuXHR0aGlzLmNoaWxkcmVuWyAwIF0ubWF0ZXJpYWwuZGlzcG9zZSgpO1xuXG59O1xuXG5SZWN0QXJlYUxpZ2h0SGVscGVyLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAoKSB7XG5cblx0Ly8gY2FsY3VsYXRlIG5ldyBkaW1lbnNpb25zIG9mIHRoZSBoZWxwZXJcblxuXHR2YXIgaHggPSB0aGlzLmxpZ2h0LndpZHRoICogMC41O1xuXHR2YXIgaHkgPSB0aGlzLmxpZ2h0LmhlaWdodCAqIDAuNTtcblxuXHR2YXIgcG9zaXRpb24gPSB0aGlzLmxpbmUuZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbjtcblx0dmFyIGFycmF5ID0gcG9zaXRpb24uYXJyYXk7XG5cblx0Ly8gdXBkYXRlIHZlcnRpY2VzXG5cblx0YXJyYXlbIDAgXSA9IGh4OyBhcnJheVsgMSBdID0gLSBoeTsgYXJyYXlbIDIgXSA9IDA7XG5cdGFycmF5WyAzIF0gPSBoeDsgYXJyYXlbIDQgXSA9IGh5OyBhcnJheVsgNSBdID0gMDtcblx0YXJyYXlbIDYgXSA9IC0gaHg7IGFycmF5WyA3IF0gPSBoeTsgYXJyYXlbIDggXSA9IDA7XG5cdGFycmF5WyA5IF0gPSAtIGh4OyBhcnJheVsgMTAgXSA9IC0gaHk7IGFycmF5WyAxMSBdID0gMDtcblx0YXJyYXlbIDEyIF0gPSBoeDsgYXJyYXlbIDEzIF0gPSAtIGh5OyBhcnJheVsgMTQgXSA9IDA7XG5cblx0cG9zaXRpb24ubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdGlmICggdGhpcy5jb2xvciAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0dGhpcy5saW5lLm1hdGVyaWFsLmNvbG9yLnNldCggdGhpcy5jb2xvciApO1xuXG5cdH0gZWxzZSB7XG5cblx0XHR0aGlzLmxpbmUubWF0ZXJpYWwuY29sb3IuY29weSggdGhpcy5saWdodC5jb2xvciApO1xuXG5cdH1cblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKi9cblxuZnVuY3Rpb24gSGVtaXNwaGVyZUxpZ2h0SGVscGVyKCBsaWdodCwgc2l6ZSwgY29sb3IgKSB7XG5cblx0T2JqZWN0M0QuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMubGlnaHQgPSBsaWdodDtcblx0dGhpcy5saWdodC51cGRhdGVNYXRyaXhXb3JsZCgpO1xuXG5cdHRoaXMubWF0cml4ID0gbGlnaHQubWF0cml4V29ybGQ7XG5cdHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xuXG5cdHRoaXMuY29sb3IgPSBjb2xvcjtcblxuXHR2YXIgZ2VvbWV0cnkgPSBuZXcgT2N0YWhlZHJvbkJ1ZmZlckdlb21ldHJ5KCBzaXplICk7XG5cdGdlb21ldHJ5LnJvdGF0ZVkoIE1hdGguUEkgKiAwLjUgKTtcblxuXHR0aGlzLm1hdGVyaWFsID0gbmV3IE1lc2hCYXNpY01hdGVyaWFsKCB7IHdpcmVmcmFtZTogdHJ1ZSwgZm9nOiBmYWxzZSB9ICk7XG5cdGlmICggdGhpcy5jb2xvciA9PT0gdW5kZWZpbmVkICkgdGhpcy5tYXRlcmlhbC52ZXJ0ZXhDb2xvcnMgPSBWZXJ0ZXhDb2xvcnM7XG5cblx0dmFyIHBvc2l0aW9uID0gZ2VvbWV0cnkuZ2V0QXR0cmlidXRlKCAncG9zaXRpb24nICk7XG5cdHZhciBjb2xvcnMgPSBuZXcgRmxvYXQzMkFycmF5KCBwb3NpdGlvbi5jb3VudCAqIDMgKTtcblxuXHRnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdjb2xvcicsIG5ldyBCdWZmZXJBdHRyaWJ1dGUoIGNvbG9ycywgMyApICk7XG5cblx0dGhpcy5hZGQoIG5ldyBNZXNoKCBnZW9tZXRyeSwgdGhpcy5tYXRlcmlhbCApICk7XG5cblx0dGhpcy51cGRhdGUoKTtcblxufVxuXG5IZW1pc3BoZXJlTGlnaHRIZWxwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICk7XG5IZW1pc3BoZXJlTGlnaHRIZWxwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gSGVtaXNwaGVyZUxpZ2h0SGVscGVyO1xuXG5IZW1pc3BoZXJlTGlnaHRIZWxwZXIucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG5cblx0dGhpcy5jaGlsZHJlblsgMCBdLmdlb21ldHJ5LmRpc3Bvc2UoKTtcblx0dGhpcy5jaGlsZHJlblsgMCBdLm1hdGVyaWFsLmRpc3Bvc2UoKTtcblxufTtcblxuSGVtaXNwaGVyZUxpZ2h0SGVscGVyLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAoKSB7XG5cblx0dmFyIHZlY3RvciA9IG5ldyBWZWN0b3IzKCk7XG5cblx0dmFyIGNvbG9yMSA9IG5ldyBDb2xvcigpO1xuXHR2YXIgY29sb3IyID0gbmV3IENvbG9yKCk7XG5cblx0cmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZSgpIHtcblxuXHRcdHZhciBtZXNoID0gdGhpcy5jaGlsZHJlblsgMCBdO1xuXG5cdFx0aWYgKCB0aGlzLmNvbG9yICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHRoaXMubWF0ZXJpYWwuY29sb3Iuc2V0KCB0aGlzLmNvbG9yICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR2YXIgY29sb3JzID0gbWVzaC5nZW9tZXRyeS5nZXRBdHRyaWJ1dGUoICdjb2xvcicgKTtcblxuXHRcdFx0Y29sb3IxLmNvcHkoIHRoaXMubGlnaHQuY29sb3IgKTtcblx0XHRcdGNvbG9yMi5jb3B5KCB0aGlzLmxpZ2h0Lmdyb3VuZENvbG9yICk7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGNvbG9ycy5jb3VudDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0dmFyIGNvbG9yID0gKCBpIDwgKCBsIC8gMiApICkgPyBjb2xvcjEgOiBjb2xvcjI7XG5cblx0XHRcdFx0Y29sb3JzLnNldFhZWiggaSwgY29sb3IuciwgY29sb3IuZywgY29sb3IuYiApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGNvbG9ycy5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHR9XG5cblx0XHRtZXNoLmxvb2tBdCggdmVjdG9yLnNldEZyb21NYXRyaXhQb3NpdGlvbiggdGhpcy5saWdodC5tYXRyaXhXb3JsZCApLm5lZ2F0ZSgpICk7XG5cblx0fTtcblxufSgpO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gR3JpZEhlbHBlciggc2l6ZSwgZGl2aXNpb25zLCBjb2xvcjEsIGNvbG9yMiApIHtcblxuXHRzaXplID0gc2l6ZSB8fCAxMDtcblx0ZGl2aXNpb25zID0gZGl2aXNpb25zIHx8IDEwO1xuXHRjb2xvcjEgPSBuZXcgQ29sb3IoIGNvbG9yMSAhPT0gdW5kZWZpbmVkID8gY29sb3IxIDogMHg0NDQ0NDQgKTtcblx0Y29sb3IyID0gbmV3IENvbG9yKCBjb2xvcjIgIT09IHVuZGVmaW5lZCA/IGNvbG9yMiA6IDB4ODg4ODg4ICk7XG5cblx0dmFyIGNlbnRlciA9IGRpdmlzaW9ucyAvIDI7XG5cdHZhciBzdGVwID0gc2l6ZSAvIGRpdmlzaW9ucztcblx0dmFyIGhhbGZTaXplID0gc2l6ZSAvIDI7XG5cblx0dmFyIHZlcnRpY2VzID0gW10sIGNvbG9ycyA9IFtdO1xuXG5cdGZvciAoIHZhciBpID0gMCwgaiA9IDAsIGsgPSAtIGhhbGZTaXplOyBpIDw9IGRpdmlzaW9uczsgaSArKywgayArPSBzdGVwICkge1xuXG5cdFx0dmVydGljZXMucHVzaCggLSBoYWxmU2l6ZSwgMCwgaywgaGFsZlNpemUsIDAsIGsgKTtcblx0XHR2ZXJ0aWNlcy5wdXNoKCBrLCAwLCAtIGhhbGZTaXplLCBrLCAwLCBoYWxmU2l6ZSApO1xuXG5cdFx0dmFyIGNvbG9yID0gaSA9PT0gY2VudGVyID8gY29sb3IxIDogY29sb3IyO1xuXG5cdFx0Y29sb3IudG9BcnJheSggY29sb3JzLCBqICk7IGogKz0gMztcblx0XHRjb2xvci50b0FycmF5KCBjb2xvcnMsIGogKTsgaiArPSAzO1xuXHRcdGNvbG9yLnRvQXJyYXkoIGNvbG9ycywgaiApOyBqICs9IDM7XG5cdFx0Y29sb3IudG9BcnJheSggY29sb3JzLCBqICk7IGogKz0gMztcblxuXHR9XG5cblx0dmFyIGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cdGdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcblx0Z2VvbWV0cnkuYWRkQXR0cmlidXRlKCAnY29sb3InLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggY29sb3JzLCAzICkgKTtcblxuXHR2YXIgbWF0ZXJpYWwgPSBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgdmVydGV4Q29sb3JzOiBWZXJ0ZXhDb2xvcnMgfSApO1xuXG5cdExpbmVTZWdtZW50cy5jYWxsKCB0aGlzLCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcblxufVxuXG5HcmlkSGVscGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIExpbmVTZWdtZW50cy5wcm90b3R5cGUgKTtcbkdyaWRIZWxwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gR3JpZEhlbHBlcjtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cDovL2dpdGh1Yi5jb20vTXVnZW44N1xuICogQGF1dGhvciBIZWN0YXRlIC8gaHR0cDovL3d3dy5naXRodWIuY29tL0hlY3RhdGVcbiAqL1xuXG5mdW5jdGlvbiBQb2xhckdyaWRIZWxwZXIoIHJhZGl1cywgcmFkaWFscywgY2lyY2xlcywgZGl2aXNpb25zLCBjb2xvcjEsIGNvbG9yMiApIHtcblxuXHRyYWRpdXMgPSByYWRpdXMgfHwgMTA7XG5cdHJhZGlhbHMgPSByYWRpYWxzIHx8IDE2O1xuXHRjaXJjbGVzID0gY2lyY2xlcyB8fCA4O1xuXHRkaXZpc2lvbnMgPSBkaXZpc2lvbnMgfHwgNjQ7XG5cdGNvbG9yMSA9IG5ldyBDb2xvciggY29sb3IxICE9PSB1bmRlZmluZWQgPyBjb2xvcjEgOiAweDQ0NDQ0NCApO1xuXHRjb2xvcjIgPSBuZXcgQ29sb3IoIGNvbG9yMiAhPT0gdW5kZWZpbmVkID8gY29sb3IyIDogMHg4ODg4ODggKTtcblxuXHR2YXIgdmVydGljZXMgPSBbXTtcblx0dmFyIGNvbG9ycyA9IFtdO1xuXG5cdHZhciB4LCB6O1xuXHR2YXIgdiwgaSwgaiwgciwgY29sb3I7XG5cblx0Ly8gY3JlYXRlIHRoZSByYWRpYWxzXG5cblx0Zm9yICggaSA9IDA7IGkgPD0gcmFkaWFsczsgaSArKyApIHtcblxuXHRcdHYgPSAoIGkgLyByYWRpYWxzICkgKiAoIE1hdGguUEkgKiAyICk7XG5cblx0XHR4ID0gTWF0aC5zaW4oIHYgKSAqIHJhZGl1cztcblx0XHR6ID0gTWF0aC5jb3MoIHYgKSAqIHJhZGl1cztcblxuXHRcdHZlcnRpY2VzLnB1c2goIDAsIDAsIDAgKTtcblx0XHR2ZXJ0aWNlcy5wdXNoKCB4LCAwLCB6ICk7XG5cblx0XHRjb2xvciA9ICggaSAmIDEgKSA/IGNvbG9yMSA6IGNvbG9yMjtcblxuXHRcdGNvbG9ycy5wdXNoKCBjb2xvci5yLCBjb2xvci5nLCBjb2xvci5iICk7XG5cdFx0Y29sb3JzLnB1c2goIGNvbG9yLnIsIGNvbG9yLmcsIGNvbG9yLmIgKTtcblxuXHR9XG5cblx0Ly8gY3JlYXRlIHRoZSBjaXJjbGVzXG5cblx0Zm9yICggaSA9IDA7IGkgPD0gY2lyY2xlczsgaSArKyApIHtcblxuXHRcdGNvbG9yID0gKCBpICYgMSApID8gY29sb3IxIDogY29sb3IyO1xuXG5cdFx0ciA9IHJhZGl1cyAtICggcmFkaXVzIC8gY2lyY2xlcyAqIGkgKTtcblxuXHRcdGZvciAoIGogPSAwOyBqIDwgZGl2aXNpb25zOyBqICsrICkge1xuXG5cdFx0XHQvLyBmaXJzdCB2ZXJ0ZXhcblxuXHRcdFx0diA9ICggaiAvIGRpdmlzaW9ucyApICogKCBNYXRoLlBJICogMiApO1xuXG5cdFx0XHR4ID0gTWF0aC5zaW4oIHYgKSAqIHI7XG5cdFx0XHR6ID0gTWF0aC5jb3MoIHYgKSAqIHI7XG5cblx0XHRcdHZlcnRpY2VzLnB1c2goIHgsIDAsIHogKTtcblx0XHRcdGNvbG9ycy5wdXNoKCBjb2xvci5yLCBjb2xvci5nLCBjb2xvci5iICk7XG5cblx0XHRcdC8vIHNlY29uZCB2ZXJ0ZXhcblxuXHRcdFx0diA9ICggKCBqICsgMSApIC8gZGl2aXNpb25zICkgKiAoIE1hdGguUEkgKiAyICk7XG5cblx0XHRcdHggPSBNYXRoLnNpbiggdiApICogcjtcblx0XHRcdHogPSBNYXRoLmNvcyggdiApICogcjtcblxuXHRcdFx0dmVydGljZXMucHVzaCggeCwgMCwgeiApO1xuXHRcdFx0Y29sb3JzLnB1c2goIGNvbG9yLnIsIGNvbG9yLmcsIGNvbG9yLmIgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0dmFyIGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cdGdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcblx0Z2VvbWV0cnkuYWRkQXR0cmlidXRlKCAnY29sb3InLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggY29sb3JzLCAzICkgKTtcblxuXHR2YXIgbWF0ZXJpYWwgPSBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgdmVydGV4Q29sb3JzOiBWZXJ0ZXhDb2xvcnMgfSApO1xuXG5cdExpbmVTZWdtZW50cy5jYWxsKCB0aGlzLCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcblxufVxuXG5Qb2xhckdyaWRIZWxwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTGluZVNlZ21lbnRzLnByb3RvdHlwZSApO1xuUG9sYXJHcmlkSGVscGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFBvbGFyR3JpZEhlbHBlcjtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKi9cblxuZnVuY3Rpb24gRmFjZU5vcm1hbHNIZWxwZXIoIG9iamVjdCwgc2l6ZSwgaGV4LCBsaW5ld2lkdGggKSB7XG5cblx0Ly8gRmFjZU5vcm1hbHNIZWxwZXIgb25seSBzdXBwb3J0cyBUSFJFRS5HZW9tZXRyeVxuXG5cdHRoaXMub2JqZWN0ID0gb2JqZWN0O1xuXG5cdHRoaXMuc2l6ZSA9ICggc2l6ZSAhPT0gdW5kZWZpbmVkICkgPyBzaXplIDogMTtcblxuXHR2YXIgY29sb3IgPSAoIGhleCAhPT0gdW5kZWZpbmVkICkgPyBoZXggOiAweGZmZmYwMDtcblxuXHR2YXIgd2lkdGggPSAoIGxpbmV3aWR0aCAhPT0gdW5kZWZpbmVkICkgPyBsaW5ld2lkdGggOiAxO1xuXG5cdC8vXG5cblx0dmFyIG5Ob3JtYWxzID0gMDtcblxuXHR2YXIgb2JqR2VvbWV0cnkgPSB0aGlzLm9iamVjdC5nZW9tZXRyeTtcblxuXHRpZiAoIG9iakdlb21ldHJ5ICYmIG9iakdlb21ldHJ5LmlzR2VvbWV0cnkgKSB7XG5cblx0XHRuTm9ybWFscyA9IG9iakdlb21ldHJ5LmZhY2VzLmxlbmd0aDtcblxuXHR9IGVsc2Uge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuRmFjZU5vcm1hbHNIZWxwZXI6IG9ubHkgVEhSRUUuR2VvbWV0cnkgaXMgc3VwcG9ydGVkLiBVc2UgVEhSRUUuVmVydGV4Tm9ybWFsc0hlbHBlciwgaW5zdGVhZC4nICk7XG5cblx0fVxuXG5cdC8vXG5cblx0dmFyIGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cblx0dmFyIHBvc2l0aW9ucyA9IG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBuTm9ybWFscyAqIDIgKiAzLCAzICk7XG5cblx0Z2VvbWV0cnkuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBwb3NpdGlvbnMgKTtcblxuXHRMaW5lU2VnbWVudHMuY2FsbCggdGhpcywgZ2VvbWV0cnksIG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogY29sb3IsIGxpbmV3aWR0aDogd2lkdGggfSApICk7XG5cblx0Ly9cblxuXHR0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTtcblx0dGhpcy51cGRhdGUoKTtcblxufVxuXG5GYWNlTm9ybWFsc0hlbHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBMaW5lU2VnbWVudHMucHJvdG90eXBlICk7XG5GYWNlTm9ybWFsc0hlbHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBGYWNlTm9ybWFsc0hlbHBlcjtcblxuRmFjZU5vcm1hbHNIZWxwZXIucHJvdG90eXBlLnVwZGF0ZSA9ICggZnVuY3Rpb24gKCkge1xuXG5cdHZhciB2MSA9IG5ldyBWZWN0b3IzKCk7XG5cdHZhciB2MiA9IG5ldyBWZWN0b3IzKCk7XG5cdHZhciBub3JtYWxNYXRyaXggPSBuZXcgTWF0cml4MygpO1xuXG5cdHJldHVybiBmdW5jdGlvbiB1cGRhdGUoKSB7XG5cblx0XHR0aGlzLm9iamVjdC51cGRhdGVNYXRyaXhXb3JsZCggdHJ1ZSApO1xuXG5cdFx0bm9ybWFsTWF0cml4LmdldE5vcm1hbE1hdHJpeCggdGhpcy5vYmplY3QubWF0cml4V29ybGQgKTtcblxuXHRcdHZhciBtYXRyaXhXb3JsZCA9IHRoaXMub2JqZWN0Lm1hdHJpeFdvcmxkO1xuXG5cdFx0dmFyIHBvc2l0aW9uID0gdGhpcy5nZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uO1xuXG5cdFx0Ly9cblxuXHRcdHZhciBvYmpHZW9tZXRyeSA9IHRoaXMub2JqZWN0Lmdlb21ldHJ5O1xuXG5cdFx0dmFyIHZlcnRpY2VzID0gb2JqR2VvbWV0cnkudmVydGljZXM7XG5cblx0XHR2YXIgZmFjZXMgPSBvYmpHZW9tZXRyeS5mYWNlcztcblxuXHRcdHZhciBpZHggPSAwO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gZmFjZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGZhY2UgPSBmYWNlc1sgaSBdO1xuXG5cdFx0XHR2YXIgbm9ybWFsID0gZmFjZS5ub3JtYWw7XG5cblx0XHRcdHYxLmNvcHkoIHZlcnRpY2VzWyBmYWNlLmEgXSApXG5cdFx0XHRcdC5hZGQoIHZlcnRpY2VzWyBmYWNlLmIgXSApXG5cdFx0XHRcdC5hZGQoIHZlcnRpY2VzWyBmYWNlLmMgXSApXG5cdFx0XHRcdC5kaXZpZGVTY2FsYXIoIDMgKVxuXHRcdFx0XHQuYXBwbHlNYXRyaXg0KCBtYXRyaXhXb3JsZCApO1xuXG5cdFx0XHR2Mi5jb3B5KCBub3JtYWwgKS5hcHBseU1hdHJpeDMoIG5vcm1hbE1hdHJpeCApLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKCB0aGlzLnNpemUgKS5hZGQoIHYxICk7XG5cblx0XHRcdHBvc2l0aW9uLnNldFhZWiggaWR4LCB2MS54LCB2MS55LCB2MS56ICk7XG5cblx0XHRcdGlkeCA9IGlkeCArIDE7XG5cblx0XHRcdHBvc2l0aW9uLnNldFhZWiggaWR4LCB2Mi54LCB2Mi55LCB2Mi56ICk7XG5cblx0XHRcdGlkeCA9IGlkeCArIDE7XG5cblx0XHR9XG5cblx0XHRwb3NpdGlvbi5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0fTtcblxufSgpICk7XG5cbi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqL1xuXG5mdW5jdGlvbiBEaXJlY3Rpb25hbExpZ2h0SGVscGVyKCBsaWdodCwgc2l6ZSwgY29sb3IgKSB7XG5cblx0T2JqZWN0M0QuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMubGlnaHQgPSBsaWdodDtcblx0dGhpcy5saWdodC51cGRhdGVNYXRyaXhXb3JsZCgpO1xuXG5cdHRoaXMubWF0cml4ID0gbGlnaHQubWF0cml4V29ybGQ7XG5cdHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xuXG5cdHRoaXMuY29sb3IgPSBjb2xvcjtcblxuXHRpZiAoIHNpemUgPT09IHVuZGVmaW5lZCApIHNpemUgPSAxO1xuXG5cdHZhciBnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXHRnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBbXG5cdFx0LSBzaXplLCBzaXplLCAwLFxuXHRcdHNpemUsIHNpemUsIDAsXG5cdFx0c2l6ZSwgLSBzaXplLCAwLFxuXHRcdC0gc2l6ZSwgLSBzaXplLCAwLFxuXHRcdC0gc2l6ZSwgc2l6ZSwgMFxuXHRdLCAzICkgKTtcblxuXHR2YXIgbWF0ZXJpYWwgPSBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgZm9nOiBmYWxzZSB9ICk7XG5cblx0dGhpcy5saWdodFBsYW5lID0gbmV3IExpbmUoIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xuXHR0aGlzLmFkZCggdGhpcy5saWdodFBsYW5lICk7XG5cblx0Z2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcblx0Z2VvbWV0cnkuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggWyAwLCAwLCAwLCAwLCAwLCAxIF0sIDMgKSApO1xuXG5cdHRoaXMudGFyZ2V0TGluZSA9IG5ldyBMaW5lKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcblx0dGhpcy5hZGQoIHRoaXMudGFyZ2V0TGluZSApO1xuXG5cdHRoaXMudXBkYXRlKCk7XG5cbn1cblxuRGlyZWN0aW9uYWxMaWdodEhlbHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKTtcbkRpcmVjdGlvbmFsTGlnaHRIZWxwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gRGlyZWN0aW9uYWxMaWdodEhlbHBlcjtcblxuRGlyZWN0aW9uYWxMaWdodEhlbHBlci5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcblxuXHR0aGlzLmxpZ2h0UGxhbmUuZ2VvbWV0cnkuZGlzcG9zZSgpO1xuXHR0aGlzLmxpZ2h0UGxhbmUubWF0ZXJpYWwuZGlzcG9zZSgpO1xuXHR0aGlzLnRhcmdldExpbmUuZ2VvbWV0cnkuZGlzcG9zZSgpO1xuXHR0aGlzLnRhcmdldExpbmUubWF0ZXJpYWwuZGlzcG9zZSgpO1xuXG59O1xuXG5EaXJlY3Rpb25hbExpZ2h0SGVscGVyLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAoKSB7XG5cblx0dmFyIHYxID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIHYyID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIHYzID0gbmV3IFZlY3RvcjMoKTtcblxuXHRyZXR1cm4gZnVuY3Rpb24gdXBkYXRlKCkge1xuXG5cdFx0djEuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCB0aGlzLmxpZ2h0Lm1hdHJpeFdvcmxkICk7XG5cdFx0djIuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCB0aGlzLmxpZ2h0LnRhcmdldC5tYXRyaXhXb3JsZCApO1xuXHRcdHYzLnN1YlZlY3RvcnMoIHYyLCB2MSApO1xuXG5cdFx0dGhpcy5saWdodFBsYW5lLmxvb2tBdCggdjMgKTtcblxuXHRcdGlmICggdGhpcy5jb2xvciAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR0aGlzLmxpZ2h0UGxhbmUubWF0ZXJpYWwuY29sb3Iuc2V0KCB0aGlzLmNvbG9yICk7XG5cdFx0XHR0aGlzLnRhcmdldExpbmUubWF0ZXJpYWwuY29sb3Iuc2V0KCB0aGlzLmNvbG9yICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR0aGlzLmxpZ2h0UGxhbmUubWF0ZXJpYWwuY29sb3IuY29weSggdGhpcy5saWdodC5jb2xvciApO1xuXHRcdFx0dGhpcy50YXJnZXRMaW5lLm1hdGVyaWFsLmNvbG9yLmNvcHkoIHRoaXMubGlnaHQuY29sb3IgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMudGFyZ2V0TGluZS5sb29rQXQoIHYzICk7XG5cdFx0dGhpcy50YXJnZXRMaW5lLnNjYWxlLnogPSB2My5sZW5ndGgoKTtcblxuXHR9O1xuXG59KCk7XG5cbi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKlxuICpcdC0gc2hvd3MgZnJ1c3R1bSwgbGluZSBvZiBzaWdodCBhbmQgdXAgb2YgdGhlIGNhbWVyYVxuICpcdC0gc3VpdGFibGUgZm9yIGZhc3QgdXBkYXRlc1xuICogXHQtIGJhc2VkIG9uIGZydXN0dW0gdmlzdWFsaXphdGlvbiBpbiBsaWdodGdsLmpzIHNoYWRvd21hcCBleGFtcGxlXG4gKlx0XHRodHRwOi8vZXZhbncuZ2l0aHViLmNvbS9saWdodGdsLmpzL3Rlc3RzL3NoYWRvd21hcC5odG1sXG4gKi9cblxuZnVuY3Rpb24gQ2FtZXJhSGVscGVyKCBjYW1lcmEgKSB7XG5cblx0dmFyIGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cdHZhciBtYXRlcmlhbCA9IG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogMHhmZmZmZmYsIHZlcnRleENvbG9yczogRmFjZUNvbG9ycyB9ICk7XG5cblx0dmFyIHZlcnRpY2VzID0gW107XG5cdHZhciBjb2xvcnMgPSBbXTtcblxuXHR2YXIgcG9pbnRNYXAgPSB7fTtcblxuXHQvLyBjb2xvcnNcblxuXHR2YXIgY29sb3JGcnVzdHVtID0gbmV3IENvbG9yKCAweGZmYWEwMCApO1xuXHR2YXIgY29sb3JDb25lID0gbmV3IENvbG9yKCAweGZmMDAwMCApO1xuXHR2YXIgY29sb3JVcCA9IG5ldyBDb2xvciggMHgwMGFhZmYgKTtcblx0dmFyIGNvbG9yVGFyZ2V0ID0gbmV3IENvbG9yKCAweGZmZmZmZiApO1xuXHR2YXIgY29sb3JDcm9zcyA9IG5ldyBDb2xvciggMHgzMzMzMzMgKTtcblxuXHQvLyBuZWFyXG5cblx0YWRkTGluZSggJ24xJywgJ24yJywgY29sb3JGcnVzdHVtICk7XG5cdGFkZExpbmUoICduMicsICduNCcsIGNvbG9yRnJ1c3R1bSApO1xuXHRhZGRMaW5lKCAnbjQnLCAnbjMnLCBjb2xvckZydXN0dW0gKTtcblx0YWRkTGluZSggJ24zJywgJ24xJywgY29sb3JGcnVzdHVtICk7XG5cblx0Ly8gZmFyXG5cblx0YWRkTGluZSggJ2YxJywgJ2YyJywgY29sb3JGcnVzdHVtICk7XG5cdGFkZExpbmUoICdmMicsICdmNCcsIGNvbG9yRnJ1c3R1bSApO1xuXHRhZGRMaW5lKCAnZjQnLCAnZjMnLCBjb2xvckZydXN0dW0gKTtcblx0YWRkTGluZSggJ2YzJywgJ2YxJywgY29sb3JGcnVzdHVtICk7XG5cblx0Ly8gc2lkZXNcblxuXHRhZGRMaW5lKCAnbjEnLCAnZjEnLCBjb2xvckZydXN0dW0gKTtcblx0YWRkTGluZSggJ24yJywgJ2YyJywgY29sb3JGcnVzdHVtICk7XG5cdGFkZExpbmUoICduMycsICdmMycsIGNvbG9yRnJ1c3R1bSApO1xuXHRhZGRMaW5lKCAnbjQnLCAnZjQnLCBjb2xvckZydXN0dW0gKTtcblxuXHQvLyBjb25lXG5cblx0YWRkTGluZSggJ3AnLCAnbjEnLCBjb2xvckNvbmUgKTtcblx0YWRkTGluZSggJ3AnLCAnbjInLCBjb2xvckNvbmUgKTtcblx0YWRkTGluZSggJ3AnLCAnbjMnLCBjb2xvckNvbmUgKTtcblx0YWRkTGluZSggJ3AnLCAnbjQnLCBjb2xvckNvbmUgKTtcblxuXHQvLyB1cFxuXG5cdGFkZExpbmUoICd1MScsICd1MicsIGNvbG9yVXAgKTtcblx0YWRkTGluZSggJ3UyJywgJ3UzJywgY29sb3JVcCApO1xuXHRhZGRMaW5lKCAndTMnLCAndTEnLCBjb2xvclVwICk7XG5cblx0Ly8gdGFyZ2V0XG5cblx0YWRkTGluZSggJ2MnLCAndCcsIGNvbG9yVGFyZ2V0ICk7XG5cdGFkZExpbmUoICdwJywgJ2MnLCBjb2xvckNyb3NzICk7XG5cblx0Ly8gY3Jvc3NcblxuXHRhZGRMaW5lKCAnY24xJywgJ2NuMicsIGNvbG9yQ3Jvc3MgKTtcblx0YWRkTGluZSggJ2NuMycsICdjbjQnLCBjb2xvckNyb3NzICk7XG5cblx0YWRkTGluZSggJ2NmMScsICdjZjInLCBjb2xvckNyb3NzICk7XG5cdGFkZExpbmUoICdjZjMnLCAnY2Y0JywgY29sb3JDcm9zcyApO1xuXG5cdGZ1bmN0aW9uIGFkZExpbmUoIGEsIGIsIGNvbG9yICkge1xuXG5cdFx0YWRkUG9pbnQoIGEsIGNvbG9yICk7XG5cdFx0YWRkUG9pbnQoIGIsIGNvbG9yICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGFkZFBvaW50KCBpZCwgY29sb3IgKSB7XG5cblx0XHR2ZXJ0aWNlcy5wdXNoKCAwLCAwLCAwICk7XG5cdFx0Y29sb3JzLnB1c2goIGNvbG9yLnIsIGNvbG9yLmcsIGNvbG9yLmIgKTtcblxuXHRcdGlmICggcG9pbnRNYXBbIGlkIF0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0cG9pbnRNYXBbIGlkIF0gPSBbXTtcblxuXHRcdH1cblxuXHRcdHBvaW50TWFwWyBpZCBdLnB1c2goICggdmVydGljZXMubGVuZ3RoIC8gMyApIC0gMSApO1xuXG5cdH1cblxuXHRnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XG5cdGdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ2NvbG9yJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIGNvbG9ycywgMyApICk7XG5cblx0TGluZVNlZ21lbnRzLmNhbGwoIHRoaXMsIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xuXG5cdHRoaXMuY2FtZXJhID0gY2FtZXJhO1xuXHRpZiAoIHRoaXMuY2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXggKSB0aGlzLmNhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XG5cblx0dGhpcy5tYXRyaXggPSBjYW1lcmEubWF0cml4V29ybGQ7XG5cdHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xuXG5cdHRoaXMucG9pbnRNYXAgPSBwb2ludE1hcDtcblxuXHR0aGlzLnVwZGF0ZSgpO1xuXG59XG5cbkNhbWVyYUhlbHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBMaW5lU2VnbWVudHMucHJvdG90eXBlICk7XG5DYW1lcmFIZWxwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ2FtZXJhSGVscGVyO1xuXG5DYW1lcmFIZWxwZXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uICgpIHtcblxuXHR2YXIgZ2VvbWV0cnksIHBvaW50TWFwO1xuXG5cdHZhciB2ZWN0b3IgPSBuZXcgVmVjdG9yMygpO1xuXHR2YXIgY2FtZXJhID0gbmV3IENhbWVyYSgpO1xuXG5cdGZ1bmN0aW9uIHNldFBvaW50KCBwb2ludCwgeCwgeSwgeiApIHtcblxuXHRcdHZlY3Rvci5zZXQoIHgsIHksIHogKS51bnByb2plY3QoIGNhbWVyYSApO1xuXG5cdFx0dmFyIHBvaW50cyA9IHBvaW50TWFwWyBwb2ludCBdO1xuXG5cdFx0aWYgKCBwb2ludHMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dmFyIHBvc2l0aW9uID0gZ2VvbWV0cnkuZ2V0QXR0cmlidXRlKCAncG9zaXRpb24nICk7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHBvaW50cy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdHBvc2l0aW9uLnNldFhZWiggcG9pbnRzWyBpIF0sIHZlY3Rvci54LCB2ZWN0b3IueSwgdmVjdG9yLnogKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH1cblxuXHRyZXR1cm4gZnVuY3Rpb24gdXBkYXRlKCkge1xuXG5cdFx0Z2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5O1xuXHRcdHBvaW50TWFwID0gdGhpcy5wb2ludE1hcDtcblxuXHRcdHZhciB3ID0gMSwgaCA9IDE7XG5cblx0XHQvLyB3ZSBuZWVkIGp1c3QgY2FtZXJhIHByb2plY3Rpb24gbWF0cml4XG5cdFx0Ly8gd29ybGQgbWF0cml4IG11c3QgYmUgaWRlbnRpdHlcblxuXHRcdGNhbWVyYS5wcm9qZWN0aW9uTWF0cml4LmNvcHkoIHRoaXMuY2FtZXJhLnByb2plY3Rpb25NYXRyaXggKTtcblxuXHRcdC8vIGNlbnRlciAvIHRhcmdldFxuXG5cdFx0c2V0UG9pbnQoICdjJywgMCwgMCwgLSAxICk7XG5cdFx0c2V0UG9pbnQoICd0JywgMCwgMCwgMSApO1xuXG5cdFx0Ly8gbmVhclxuXG5cdFx0c2V0UG9pbnQoICduMScsIC0gdywgLSBoLCAtIDEgKTtcblx0XHRzZXRQb2ludCggJ24yJywgdywgLSBoLCAtIDEgKTtcblx0XHRzZXRQb2ludCggJ24zJywgLSB3LCBoLCAtIDEgKTtcblx0XHRzZXRQb2ludCggJ240JywgdywgaCwgLSAxICk7XG5cblx0XHQvLyBmYXJcblxuXHRcdHNldFBvaW50KCAnZjEnLCAtIHcsIC0gaCwgMSApO1xuXHRcdHNldFBvaW50KCAnZjInLCB3LCAtIGgsIDEgKTtcblx0XHRzZXRQb2ludCggJ2YzJywgLSB3LCBoLCAxICk7XG5cdFx0c2V0UG9pbnQoICdmNCcsIHcsIGgsIDEgKTtcblxuXHRcdC8vIHVwXG5cblx0XHRzZXRQb2ludCggJ3UxJywgdyAqIDAuNywgaCAqIDEuMSwgLSAxICk7XG5cdFx0c2V0UG9pbnQoICd1MicsIC0gdyAqIDAuNywgaCAqIDEuMSwgLSAxICk7XG5cdFx0c2V0UG9pbnQoICd1MycsIDAsIGggKiAyLCAtIDEgKTtcblxuXHRcdC8vIGNyb3NzXG5cblx0XHRzZXRQb2ludCggJ2NmMScsIC0gdywgMCwgMSApO1xuXHRcdHNldFBvaW50KCAnY2YyJywgdywgMCwgMSApO1xuXHRcdHNldFBvaW50KCAnY2YzJywgMCwgLSBoLCAxICk7XG5cdFx0c2V0UG9pbnQoICdjZjQnLCAwLCBoLCAxICk7XG5cblx0XHRzZXRQb2ludCggJ2NuMScsIC0gdywgMCwgLSAxICk7XG5cdFx0c2V0UG9pbnQoICdjbjInLCB3LCAwLCAtIDEgKTtcblx0XHRzZXRQb2ludCggJ2NuMycsIDAsIC0gaCwgLSAxICk7XG5cdFx0c2V0UG9pbnQoICdjbjQnLCAwLCBoLCAtIDEgKTtcblxuXHRcdGdlb21ldHJ5LmdldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJyApLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHR9O1xuXG59KCk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHA6Ly9naXRodWIuY29tL011Z2VuODdcbiAqL1xuXG5mdW5jdGlvbiBCb3hIZWxwZXIoIG9iamVjdCwgY29sb3IgKSB7XG5cblx0dGhpcy5vYmplY3QgPSBvYmplY3Q7XG5cblx0aWYgKCBjb2xvciA9PT0gdW5kZWZpbmVkICkgY29sb3IgPSAweGZmZmYwMDtcblxuXHR2YXIgaW5kaWNlcyA9IG5ldyBVaW50MTZBcnJheSggWyAwLCAxLCAxLCAyLCAyLCAzLCAzLCAwLCA0LCA1LCA1LCA2LCA2LCA3LCA3LCA0LCAwLCA0LCAxLCA1LCAyLCA2LCAzLCA3IF0gKTtcblx0dmFyIHBvc2l0aW9ucyA9IG5ldyBGbG9hdDMyQXJyYXkoIDggKiAzICk7XG5cblx0dmFyIGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cdGdlb21ldHJ5LnNldEluZGV4KCBuZXcgQnVmZmVyQXR0cmlidXRlKCBpbmRpY2VzLCAxICkgKTtcblx0Z2VvbWV0cnkuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbnMsIDMgKSApO1xuXG5cdExpbmVTZWdtZW50cy5jYWxsKCB0aGlzLCBnZW9tZXRyeSwgbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiBjb2xvciB9ICkgKTtcblxuXHR0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTtcblxuXHR0aGlzLnVwZGF0ZSgpO1xuXG59XG5cbkJveEhlbHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBMaW5lU2VnbWVudHMucHJvdG90eXBlICk7XG5Cb3hIZWxwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQm94SGVscGVyO1xuXG5Cb3hIZWxwZXIucHJvdG90eXBlLnVwZGF0ZSA9ICggZnVuY3Rpb24gKCkge1xuXG5cdHZhciBib3ggPSBuZXcgQm94MygpO1xuXG5cdHJldHVybiBmdW5jdGlvbiB1cGRhdGUoIG9iamVjdCApIHtcblxuXHRcdGlmICggb2JqZWN0ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJveEhlbHBlcjogLnVwZGF0ZSgpIGhhcyBubyBsb25nZXIgYXJndW1lbnRzLicgKTtcblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5vYmplY3QgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Ym94LnNldEZyb21PYmplY3QoIHRoaXMub2JqZWN0ICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIGJveC5pc0VtcHR5KCkgKSByZXR1cm47XG5cblx0XHR2YXIgbWluID0gYm94Lm1pbjtcblx0XHR2YXIgbWF4ID0gYm94Lm1heDtcblxuXHRcdC8qXG5cdFx0ICA1X19fXzRcblx0XHQxL19fXzAvfFxuXHRcdHwgNl9ffF83XG5cdFx0Mi9fX18zL1xuXG5cdFx0MDogbWF4LngsIG1heC55LCBtYXguelxuXHRcdDE6IG1pbi54LCBtYXgueSwgbWF4Lnpcblx0XHQyOiBtaW4ueCwgbWluLnksIG1heC56XG5cdFx0MzogbWF4LngsIG1pbi55LCBtYXguelxuXHRcdDQ6IG1heC54LCBtYXgueSwgbWluLnpcblx0XHQ1OiBtaW4ueCwgbWF4LnksIG1pbi56XG5cdFx0NjogbWluLngsIG1pbi55LCBtaW4uelxuXHRcdDc6IG1heC54LCBtaW4ueSwgbWluLnpcblx0XHQqL1xuXG5cdFx0dmFyIHBvc2l0aW9uID0gdGhpcy5nZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uO1xuXHRcdHZhciBhcnJheSA9IHBvc2l0aW9uLmFycmF5O1xuXG5cdFx0YXJyYXlbIDAgXSA9IG1heC54OyBhcnJheVsgMSBdID0gbWF4Lnk7IGFycmF5WyAyIF0gPSBtYXguejtcblx0XHRhcnJheVsgMyBdID0gbWluLng7IGFycmF5WyA0IF0gPSBtYXgueTsgYXJyYXlbIDUgXSA9IG1heC56O1xuXHRcdGFycmF5WyA2IF0gPSBtaW4ueDsgYXJyYXlbIDcgXSA9IG1pbi55OyBhcnJheVsgOCBdID0gbWF4Lno7XG5cdFx0YXJyYXlbIDkgXSA9IG1heC54OyBhcnJheVsgMTAgXSA9IG1pbi55OyBhcnJheVsgMTEgXSA9IG1heC56O1xuXHRcdGFycmF5WyAxMiBdID0gbWF4Lng7IGFycmF5WyAxMyBdID0gbWF4Lnk7IGFycmF5WyAxNCBdID0gbWluLno7XG5cdFx0YXJyYXlbIDE1IF0gPSBtaW4ueDsgYXJyYXlbIDE2IF0gPSBtYXgueTsgYXJyYXlbIDE3IF0gPSBtaW4uejtcblx0XHRhcnJheVsgMTggXSA9IG1pbi54OyBhcnJheVsgMTkgXSA9IG1pbi55OyBhcnJheVsgMjAgXSA9IG1pbi56O1xuXHRcdGFycmF5WyAyMSBdID0gbWF4Lng7IGFycmF5WyAyMiBdID0gbWluLnk7IGFycmF5WyAyMyBdID0gbWluLno7XG5cblx0XHRwb3NpdGlvbi5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHR0aGlzLmdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO1xuXG5cdH07XG5cbn0gKSgpO1xuXG5Cb3hIZWxwZXIucHJvdG90eXBlLnNldEZyb21PYmplY3QgPSBmdW5jdGlvbiAoIG9iamVjdCApIHtcblxuXHR0aGlzLm9iamVjdCA9IG9iamVjdDtcblx0dGhpcy51cGRhdGUoKTtcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqL1xuXG5mdW5jdGlvbiBCb3gzSGVscGVyKCBib3gsIGhleCApIHtcblxuXHR0aGlzLnR5cGUgPSAnQm94M0hlbHBlcic7XG5cblx0dGhpcy5ib3ggPSBib3g7XG5cblx0dmFyIGNvbG9yID0gKCBoZXggIT09IHVuZGVmaW5lZCApID8gaGV4IDogMHhmZmZmMDA7XG5cblx0dmFyIGluZGljZXMgPSBuZXcgVWludDE2QXJyYXkoIFsgMCwgMSwgMSwgMiwgMiwgMywgMywgMCwgNCwgNSwgNSwgNiwgNiwgNywgNywgNCwgMCwgNCwgMSwgNSwgMiwgNiwgMywgNyBdICk7XG5cblx0dmFyIHBvc2l0aW9ucyA9IFsgMSwgMSwgMSwgLSAxLCAxLCAxLCAtIDEsIC0gMSwgMSwgMSwgLSAxLCAxLCAxLCAxLCAtIDEsIC0gMSwgMSwgLSAxLCAtIDEsIC0gMSwgLSAxLCAxLCAtIDEsIC0gMSBdO1xuXG5cdHZhciBnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXG5cdGdlb21ldHJ5LnNldEluZGV4KCBuZXcgQnVmZmVyQXR0cmlidXRlKCBpbmRpY2VzLCAxICkgKTtcblxuXHRnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbnMsIDMgKSApO1xuXG5cdExpbmVTZWdtZW50cy5jYWxsKCB0aGlzLCBnZW9tZXRyeSwgbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiBjb2xvciB9ICkgKTtcblxuXHR0aGlzLmdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO1xuXG59XG5cbkJveDNIZWxwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTGluZVNlZ21lbnRzLnByb3RvdHlwZSApO1xuQm94M0hlbHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBCb3gzSGVscGVyO1xuXG5Cb3gzSGVscGVyLnByb3RvdHlwZS51cGRhdGVNYXRyaXhXb3JsZCA9IGZ1bmN0aW9uICggZm9yY2UgKSB7XG5cblx0dmFyIGJveCA9IHRoaXMuYm94O1xuXG5cdGlmICggYm94LmlzRW1wdHkoKSApIHJldHVybjtcblxuXHRib3guZ2V0Q2VudGVyKCB0aGlzLnBvc2l0aW9uICk7XG5cblx0Ym94LmdldFNpemUoIHRoaXMuc2NhbGUgKTtcblxuXHR0aGlzLnNjYWxlLm11bHRpcGx5U2NhbGFyKCAwLjUgKTtcblxuXHRPYmplY3QzRC5wcm90b3R5cGUudXBkYXRlTWF0cml4V29ybGQuY2FsbCggdGhpcywgZm9yY2UgKTtcblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqL1xuXG5mdW5jdGlvbiBQbGFuZUhlbHBlciggcGxhbmUsIHNpemUsIGhleCApIHtcblxuXHR0aGlzLnR5cGUgPSAnUGxhbmVIZWxwZXInO1xuXG5cdHRoaXMucGxhbmUgPSBwbGFuZTtcblxuXHR0aGlzLnNpemUgPSAoIHNpemUgPT09IHVuZGVmaW5lZCApID8gMSA6IHNpemU7XG5cblx0dmFyIGNvbG9yID0gKCBoZXggIT09IHVuZGVmaW5lZCApID8gaGV4IDogMHhmZmZmMDA7XG5cblx0dmFyIHBvc2l0aW9ucyA9IFsgMSwgLSAxLCAxLCAtIDEsIDEsIDEsIC0gMSwgLSAxLCAxLCAxLCAxLCAxLCAtIDEsIDEsIDEsIC0gMSwgLSAxLCAxLCAxLCAtIDEsIDEsIDEsIDEsIDEsIDAsIDAsIDEsIDAsIDAsIDAgXTtcblxuXHR2YXIgZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcblx0Z2VvbWV0cnkuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25zLCAzICkgKTtcblx0Z2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7XG5cblx0TGluZS5jYWxsKCB0aGlzLCBnZW9tZXRyeSwgbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiBjb2xvciB9ICkgKTtcblxuXHQvL1xuXG5cdHZhciBwb3NpdGlvbnMyID0gWyAxLCAxLCAxLCAtIDEsIDEsIDEsIC0gMSwgLSAxLCAxLCAxLCAxLCAxLCAtIDEsIC0gMSwgMSwgMSwgLSAxLCAxIF07XG5cblx0dmFyIGdlb21ldHJ5MiA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXHRnZW9tZXRyeTIuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25zMiwgMyApICk7XG5cdGdlb21ldHJ5Mi5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtcblxuXHR0aGlzLmFkZCggbmV3IE1lc2goIGdlb21ldHJ5MiwgbmV3IE1lc2hCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiBjb2xvciwgb3BhY2l0eTogMC4yLCB0cmFuc3BhcmVudDogdHJ1ZSwgZGVwdGhXcml0ZTogZmFsc2UgfSApICkgKTtcblxufVxuXG5QbGFuZUhlbHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBMaW5lLnByb3RvdHlwZSApO1xuUGxhbmVIZWxwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUGxhbmVIZWxwZXI7XG5cblBsYW5lSGVscGVyLnByb3RvdHlwZS51cGRhdGVNYXRyaXhXb3JsZCA9IGZ1bmN0aW9uICggZm9yY2UgKSB7XG5cblx0dmFyIHNjYWxlID0gLSB0aGlzLnBsYW5lLmNvbnN0YW50O1xuXG5cdGlmICggTWF0aC5hYnMoIHNjYWxlICkgPCAxZS04ICkgc2NhbGUgPSAxZS04OyAvLyBzaWduIGRvZXMgbm90IG1hdHRlclxuXG5cdHRoaXMuc2NhbGUuc2V0KCAwLjUgKiB0aGlzLnNpemUsIDAuNSAqIHRoaXMuc2l6ZSwgc2NhbGUgKTtcblxuXHR0aGlzLmxvb2tBdCggdGhpcy5wbGFuZS5ub3JtYWwgKTtcblxuXHRPYmplY3QzRC5wcm90b3R5cGUudXBkYXRlTWF0cml4V29ybGQuY2FsbCggdGhpcywgZm9yY2UgKTtcblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqIEBhdXRob3Igeno4NSAvIGh0dHA6Ly9naXRodWIuY29tL3p6ODVcbiAqIEBhdXRob3IgYmhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW9cbiAqXG4gKiBDcmVhdGVzIGFuIGFycm93IGZvciB2aXN1YWxpemluZyBkaXJlY3Rpb25zXG4gKlxuICogUGFyYW1ldGVyczpcbiAqICBkaXIgLSBWZWN0b3IzXG4gKiAgb3JpZ2luIC0gVmVjdG9yM1xuICogIGxlbmd0aCAtIE51bWJlclxuICogIGNvbG9yIC0gY29sb3IgaW4gaGV4IHZhbHVlXG4gKiAgaGVhZExlbmd0aCAtIE51bWJlclxuICogIGhlYWRXaWR0aCAtIE51bWJlclxuICovXG5cbnZhciBsaW5lR2VvbWV0cnk7XG52YXIgY29uZUdlb21ldHJ5O1xuXG5mdW5jdGlvbiBBcnJvd0hlbHBlciggZGlyLCBvcmlnaW4sIGxlbmd0aCwgY29sb3IsIGhlYWRMZW5ndGgsIGhlYWRXaWR0aCApIHtcblxuXHQvLyBkaXIgaXMgYXNzdW1lZCB0byBiZSBub3JtYWxpemVkXG5cblx0T2JqZWN0M0QuY2FsbCggdGhpcyApO1xuXG5cdGlmICggY29sb3IgPT09IHVuZGVmaW5lZCApIGNvbG9yID0gMHhmZmZmMDA7XG5cdGlmICggbGVuZ3RoID09PSB1bmRlZmluZWQgKSBsZW5ndGggPSAxO1xuXHRpZiAoIGhlYWRMZW5ndGggPT09IHVuZGVmaW5lZCApIGhlYWRMZW5ndGggPSAwLjIgKiBsZW5ndGg7XG5cdGlmICggaGVhZFdpZHRoID09PSB1bmRlZmluZWQgKSBoZWFkV2lkdGggPSAwLjIgKiBoZWFkTGVuZ3RoO1xuXG5cdGlmICggbGluZUdlb21ldHJ5ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRsaW5lR2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcblx0XHRsaW5lR2VvbWV0cnkuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggWyAwLCAwLCAwLCAwLCAxLCAwIF0sIDMgKSApO1xuXG5cdFx0Y29uZUdlb21ldHJ5ID0gbmV3IEN5bGluZGVyQnVmZmVyR2VvbWV0cnkoIDAsIDAuNSwgMSwgNSwgMSApO1xuXHRcdGNvbmVHZW9tZXRyeS50cmFuc2xhdGUoIDAsIC0gMC41LCAwICk7XG5cblx0fVxuXG5cdHRoaXMucG9zaXRpb24uY29weSggb3JpZ2luICk7XG5cblx0dGhpcy5saW5lID0gbmV3IExpbmUoIGxpbmVHZW9tZXRyeSwgbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiBjb2xvciB9ICkgKTtcblx0dGhpcy5saW5lLm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTtcblx0dGhpcy5hZGQoIHRoaXMubGluZSApO1xuXG5cdHRoaXMuY29uZSA9IG5ldyBNZXNoKCBjb25lR2VvbWV0cnksIG5ldyBNZXNoQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogY29sb3IgfSApICk7XG5cdHRoaXMuY29uZS5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7XG5cdHRoaXMuYWRkKCB0aGlzLmNvbmUgKTtcblxuXHR0aGlzLnNldERpcmVjdGlvbiggZGlyICk7XG5cdHRoaXMuc2V0TGVuZ3RoKCBsZW5ndGgsIGhlYWRMZW5ndGgsIGhlYWRXaWR0aCApO1xuXG59XG5cbkFycm93SGVscGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApO1xuQXJyb3dIZWxwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQXJyb3dIZWxwZXI7XG5cbkFycm93SGVscGVyLnByb3RvdHlwZS5zZXREaXJlY3Rpb24gPSAoIGZ1bmN0aW9uICgpIHtcblxuXHR2YXIgYXhpcyA9IG5ldyBWZWN0b3IzKCk7XG5cdHZhciByYWRpYW5zO1xuXG5cdHJldHVybiBmdW5jdGlvbiBzZXREaXJlY3Rpb24oIGRpciApIHtcblxuXHRcdC8vIGRpciBpcyBhc3N1bWVkIHRvIGJlIG5vcm1hbGl6ZWRcblxuXHRcdGlmICggZGlyLnkgPiAwLjk5OTk5ICkge1xuXG5cdFx0XHR0aGlzLnF1YXRlcm5pb24uc2V0KCAwLCAwLCAwLCAxICk7XG5cblx0XHR9IGVsc2UgaWYgKCBkaXIueSA8IC0gMC45OTk5OSApIHtcblxuXHRcdFx0dGhpcy5xdWF0ZXJuaW9uLnNldCggMSwgMCwgMCwgMCApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0YXhpcy5zZXQoIGRpci56LCAwLCAtIGRpci54ICkubm9ybWFsaXplKCk7XG5cblx0XHRcdHJhZGlhbnMgPSBNYXRoLmFjb3MoIGRpci55ICk7XG5cblx0XHRcdHRoaXMucXVhdGVybmlvbi5zZXRGcm9tQXhpc0FuZ2xlKCBheGlzLCByYWRpYW5zICk7XG5cblx0XHR9XG5cblx0fTtcblxufSgpICk7XG5cbkFycm93SGVscGVyLnByb3RvdHlwZS5zZXRMZW5ndGggPSBmdW5jdGlvbiAoIGxlbmd0aCwgaGVhZExlbmd0aCwgaGVhZFdpZHRoICkge1xuXG5cdGlmICggaGVhZExlbmd0aCA9PT0gdW5kZWZpbmVkICkgaGVhZExlbmd0aCA9IDAuMiAqIGxlbmd0aDtcblx0aWYgKCBoZWFkV2lkdGggPT09IHVuZGVmaW5lZCApIGhlYWRXaWR0aCA9IDAuMiAqIGhlYWRMZW5ndGg7XG5cblx0dGhpcy5saW5lLnNjYWxlLnNldCggMSwgTWF0aC5tYXgoIDAsIGxlbmd0aCAtIGhlYWRMZW5ndGggKSwgMSApO1xuXHR0aGlzLmxpbmUudXBkYXRlTWF0cml4KCk7XG5cblx0dGhpcy5jb25lLnNjYWxlLnNldCggaGVhZFdpZHRoLCBoZWFkTGVuZ3RoLCBoZWFkV2lkdGggKTtcblx0dGhpcy5jb25lLnBvc2l0aW9uLnkgPSBsZW5ndGg7XG5cdHRoaXMuY29uZS51cGRhdGVNYXRyaXgoKTtcblxufTtcblxuQXJyb3dIZWxwZXIucHJvdG90eXBlLnNldENvbG9yID0gZnVuY3Rpb24gKCBjb2xvciApIHtcblxuXHR0aGlzLmxpbmUubWF0ZXJpYWwuY29sb3IuY29weSggY29sb3IgKTtcblx0dGhpcy5jb25lLm1hdGVyaWFsLmNvbG9yLmNvcHkoIGNvbG9yICk7XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBzcm91Y2hlcmF5IC8gaHR0cDovL3Nyb3VjaGVyYXkub3JnL1xuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBBeGVzSGVscGVyKCBzaXplICkge1xuXG5cdHNpemUgPSBzaXplIHx8IDE7XG5cblx0dmFyIHZlcnRpY2VzID0gW1xuXHRcdDAsIDAsIDAsXHRzaXplLCAwLCAwLFxuXHRcdDAsIDAsIDAsXHQwLCBzaXplLCAwLFxuXHRcdDAsIDAsIDAsXHQwLCAwLCBzaXplXG5cdF07XG5cblx0dmFyIGNvbG9ycyA9IFtcblx0XHQxLCAwLCAwLFx0MSwgMC42LCAwLFxuXHRcdDAsIDEsIDAsXHQwLjYsIDEsIDAsXG5cdFx0MCwgMCwgMSxcdDAsIDAuNiwgMVxuXHRdO1xuXG5cdHZhciBnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXHRnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XG5cdGdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ2NvbG9yJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIGNvbG9ycywgMyApICk7XG5cblx0dmFyIG1hdGVyaWFsID0gbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IHZlcnRleENvbG9yczogVmVydGV4Q29sb3JzIH0gKTtcblxuXHRMaW5lU2VnbWVudHMuY2FsbCggdGhpcywgZ2VvbWV0cnksIG1hdGVyaWFsICk7XG5cbn1cblxuQXhlc0hlbHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBMaW5lU2VnbWVudHMucHJvdG90eXBlICk7XG5BeGVzSGVscGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEF4ZXNIZWxwZXI7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBGYWNlNCggYSwgYiwgYywgZCwgbm9ybWFsLCBjb2xvciwgbWF0ZXJpYWxJbmRleCApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5GYWNlNCBoYXMgYmVlbiByZW1vdmVkLiBBIFRIUkVFLkZhY2UzIHdpbGwgYmUgY3JlYXRlZCBpbnN0ZWFkLicgKTtcblx0cmV0dXJuIG5ldyBGYWNlMyggYSwgYiwgYywgbm9ybWFsLCBjb2xvciwgbWF0ZXJpYWxJbmRleCApO1xuXG59XG5cbnZhciBMaW5lU3RyaXAgPSAwO1xuXG52YXIgTGluZVBpZWNlcyA9IDE7XG5cbmZ1bmN0aW9uIE1lc2hGYWNlTWF0ZXJpYWwoIG1hdGVyaWFscyApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5NZXNoRmFjZU1hdGVyaWFsIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBhbiBBcnJheSBpbnN0ZWFkLicgKTtcblx0cmV0dXJuIG1hdGVyaWFscztcblxufVxuXG5mdW5jdGlvbiBNdWx0aU1hdGVyaWFsKCBtYXRlcmlhbHMgKSB7XG5cblx0aWYgKCBtYXRlcmlhbHMgPT09IHVuZGVmaW5lZCApIG1hdGVyaWFscyA9IFtdO1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLk11bHRpTWF0ZXJpYWwgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIGFuIEFycmF5IGluc3RlYWQuJyApO1xuXHRtYXRlcmlhbHMuaXNNdWx0aU1hdGVyaWFsID0gdHJ1ZTtcblx0bWF0ZXJpYWxzLm1hdGVyaWFscyA9IG1hdGVyaWFscztcblx0bWF0ZXJpYWxzLmNsb25lID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG1hdGVyaWFscy5zbGljZSgpO1xuXG5cdH07XG5cdHJldHVybiBtYXRlcmlhbHM7XG5cbn1cblxuZnVuY3Rpb24gUG9pbnRDbG91ZCggZ2VvbWV0cnksIG1hdGVyaWFsICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLlBvaW50Q2xvdWQgaGFzIGJlZW4gcmVuYW1lZCB0byBUSFJFRS5Qb2ludHMuJyApO1xuXHRyZXR1cm4gbmV3IFBvaW50cyggZ2VvbWV0cnksIG1hdGVyaWFsICk7XG5cbn1cblxuZnVuY3Rpb24gUGFydGljbGUoIG1hdGVyaWFsICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLlBhcnRpY2xlIGhhcyBiZWVuIHJlbmFtZWQgdG8gVEhSRUUuU3ByaXRlLicgKTtcblx0cmV0dXJuIG5ldyBTcHJpdGUoIG1hdGVyaWFsICk7XG5cbn1cblxuZnVuY3Rpb24gUGFydGljbGVTeXN0ZW0oIGdlb21ldHJ5LCBtYXRlcmlhbCApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5QYXJ0aWNsZVN5c3RlbSBoYXMgYmVlbiByZW5hbWVkIHRvIFRIUkVFLlBvaW50cy4nICk7XG5cdHJldHVybiBuZXcgUG9pbnRzKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcblxufVxuXG5mdW5jdGlvbiBQb2ludENsb3VkTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuUG9pbnRDbG91ZE1hdGVyaWFsIGhhcyBiZWVuIHJlbmFtZWQgdG8gVEhSRUUuUG9pbnRzTWF0ZXJpYWwuJyApO1xuXHRyZXR1cm4gbmV3IFBvaW50c01hdGVyaWFsKCBwYXJhbWV0ZXJzICk7XG5cbn1cblxuZnVuY3Rpb24gUGFydGljbGVCYXNpY01hdGVyaWFsKCBwYXJhbWV0ZXJzICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLlBhcnRpY2xlQmFzaWNNYXRlcmlhbCBoYXMgYmVlbiByZW5hbWVkIHRvIFRIUkVFLlBvaW50c01hdGVyaWFsLicgKTtcblx0cmV0dXJuIG5ldyBQb2ludHNNYXRlcmlhbCggcGFyYW1ldGVycyApO1xuXG59XG5cbmZ1bmN0aW9uIFBhcnRpY2xlU3lzdGVtTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuUGFydGljbGVTeXN0ZW1NYXRlcmlhbCBoYXMgYmVlbiByZW5hbWVkIHRvIFRIUkVFLlBvaW50c01hdGVyaWFsLicgKTtcblx0cmV0dXJuIG5ldyBQb2ludHNNYXRlcmlhbCggcGFyYW1ldGVycyApO1xuXG59XG5cbmZ1bmN0aW9uIFZlcnRleCggeCwgeSwgeiApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5WZXJ0ZXggaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFRIUkVFLlZlY3RvcjMgaW5zdGVhZC4nICk7XG5cdHJldHVybiBuZXcgVmVjdG9yMyggeCwgeSwgeiApO1xuXG59XG5cbi8vXG5cbmZ1bmN0aW9uIER5bmFtaWNCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5EeW5hbWljQnVmZmVyQXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuQnVmZmVyQXR0cmlidXRlKCkuc2V0RHluYW1pYyggdHJ1ZSApIGluc3RlYWQuJyApO1xuXHRyZXR1cm4gbmV3IEJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplICkuc2V0RHluYW1pYyggdHJ1ZSApO1xuXG59XG5cbmZ1bmN0aW9uIEludDhBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5JbnQ4QXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuSW50OEJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuJyApO1xuXHRyZXR1cm4gbmV3IEludDhCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApO1xuXG59XG5cbmZ1bmN0aW9uIFVpbnQ4QXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuVWludDhBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5VaW50OEJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuJyApO1xuXHRyZXR1cm4gbmV3IFVpbnQ4QnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKTtcblxufVxuXG5mdW5jdGlvbiBVaW50OENsYW1wZWRBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5VaW50OENsYW1wZWRBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5VaW50OENsYW1wZWRCdWZmZXJBdHRyaWJ1dGUoKSBpbnN0ZWFkLicgKTtcblx0cmV0dXJuIG5ldyBVaW50OENsYW1wZWRCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApO1xuXG59XG5cbmZ1bmN0aW9uIEludDE2QXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuSW50MTZBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5JbnQxNkJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuJyApO1xuXHRyZXR1cm4gbmV3IEludDE2QnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKTtcblxufVxuXG5mdW5jdGlvbiBVaW50MTZBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5VaW50MTZBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5VaW50MTZCdWZmZXJBdHRyaWJ1dGUoKSBpbnN0ZWFkLicgKTtcblx0cmV0dXJuIG5ldyBVaW50MTZCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApO1xuXG59XG5cbmZ1bmN0aW9uIEludDMyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuSW50MzJBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5JbnQzMkJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuJyApO1xuXHRyZXR1cm4gbmV3IEludDMyQnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKTtcblxufVxuXG5mdW5jdGlvbiBVaW50MzJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5VaW50MzJBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5VaW50MzJCdWZmZXJBdHRyaWJ1dGUoKSBpbnN0ZWFkLicgKTtcblx0cmV0dXJuIG5ldyBVaW50MzJCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApO1xuXG59XG5cbmZ1bmN0aW9uIEZsb2F0MzJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5GbG9hdDMyQXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuJyApO1xuXHRyZXR1cm4gbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApO1xuXG59XG5cbmZ1bmN0aW9uIEZsb2F0NjRBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5GbG9hdDY0QXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuRmxvYXQ2NEJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuJyApO1xuXHRyZXR1cm4gbmV3IEZsb2F0NjRCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApO1xuXG59XG5cbi8vXG5cbkN1cnZlLmNyZWF0ZSA9IGZ1bmN0aW9uICggY29uc3RydWN0LCBnZXRQb2ludCApIHtcblxuXHRjb25zb2xlLmxvZyggJ1RIUkVFLkN1cnZlLmNyZWF0ZSgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQnICk7XG5cblx0Y29uc3RydWN0LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEN1cnZlLnByb3RvdHlwZSApO1xuXHRjb25zdHJ1Y3QucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY29uc3RydWN0O1xuXHRjb25zdHJ1Y3QucHJvdG90eXBlLmdldFBvaW50ID0gZ2V0UG9pbnQ7XG5cblx0cmV0dXJuIGNvbnN0cnVjdDtcblxufTtcblxuLy9cblxuT2JqZWN0LmFzc2lnbiggQ3VydmVQYXRoLnByb3RvdHlwZSwge1xuXG5cdGNyZWF0ZVBvaW50c0dlb21ldHJ5OiBmdW5jdGlvbiAoIGRpdmlzaW9ucyApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkN1cnZlUGF0aDogLmNyZWF0ZVBvaW50c0dlb21ldHJ5KCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5HZW9tZXRyeSgpLnNldEZyb21Qb2ludHMoIHBvaW50cyApIGluc3RlYWQuJyApO1xuXG5cdFx0Ly8gZ2VuZXJhdGUgZ2VvbWV0cnkgZnJvbSBwYXRoIHBvaW50cyAoZm9yIExpbmUgb3IgUG9pbnRzIG9iamVjdHMpXG5cblx0XHR2YXIgcHRzID0gdGhpcy5nZXRQb2ludHMoIGRpdmlzaW9ucyApO1xuXHRcdHJldHVybiB0aGlzLmNyZWF0ZUdlb21ldHJ5KCBwdHMgKTtcblxuXHR9LFxuXG5cdGNyZWF0ZVNwYWNlZFBvaW50c0dlb21ldHJ5OiBmdW5jdGlvbiAoIGRpdmlzaW9ucyApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkN1cnZlUGF0aDogLmNyZWF0ZVNwYWNlZFBvaW50c0dlb21ldHJ5KCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5HZW9tZXRyeSgpLnNldEZyb21Qb2ludHMoIHBvaW50cyApIGluc3RlYWQuJyApO1xuXG5cdFx0Ly8gZ2VuZXJhdGUgZ2VvbWV0cnkgZnJvbSBlcXVpZGlzdGFudCBzYW1wbGluZyBhbG9uZyB0aGUgcGF0aFxuXG5cdFx0dmFyIHB0cyA9IHRoaXMuZ2V0U3BhY2VkUG9pbnRzKCBkaXZpc2lvbnMgKTtcblx0XHRyZXR1cm4gdGhpcy5jcmVhdGVHZW9tZXRyeSggcHRzICk7XG5cblx0fSxcblxuXHRjcmVhdGVHZW9tZXRyeTogZnVuY3Rpb24gKCBwb2ludHMgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5DdXJ2ZVBhdGg6IC5jcmVhdGVHZW9tZXRyeSgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuR2VvbWV0cnkoKS5zZXRGcm9tUG9pbnRzKCBwb2ludHMgKSBpbnN0ZWFkLicgKTtcblxuXHRcdHZhciBnZW9tZXRyeSA9IG5ldyBHZW9tZXRyeSgpO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gcG9pbnRzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBwb2ludCA9IHBvaW50c1sgaSBdO1xuXHRcdFx0Z2VvbWV0cnkudmVydGljZXMucHVzaCggbmV3IFZlY3RvcjMoIHBvaW50LngsIHBvaW50LnksIHBvaW50LnogfHwgMCApICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gZ2VvbWV0cnk7XG5cblx0fVxuXG59ICk7XG5cbi8vXG5cbk9iamVjdC5hc3NpZ24oIFBhdGgucHJvdG90eXBlLCB7XG5cblx0ZnJvbVBvaW50czogZnVuY3Rpb24gKCBwb2ludHMgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5QYXRoOiAuZnJvbVBvaW50cygpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLnNldEZyb21Qb2ludHMoKS4nICk7XG5cdFx0dGhpcy5zZXRGcm9tUG9pbnRzKCBwb2ludHMgKTtcblxuXHR9XG5cbn0gKTtcblxuLy9cblxuZnVuY3Rpb24gQ2xvc2VkU3BsaW5lQ3VydmUzKCBwb2ludHMgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuQ2xvc2VkU3BsaW5lQ3VydmUzIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSBUSFJFRS5DYXRtdWxsUm9tQ3VydmUzIGluc3RlYWQuJyApO1xuXG5cdENhdG11bGxSb21DdXJ2ZTMuY2FsbCggdGhpcywgcG9pbnRzICk7XG5cdHRoaXMudHlwZSA9ICdjYXRtdWxscm9tJztcblx0dGhpcy5jbG9zZWQgPSB0cnVlO1xuXG59XG5cbkNsb3NlZFNwbGluZUN1cnZlMy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDYXRtdWxsUm9tQ3VydmUzLnByb3RvdHlwZSApO1xuXG4vL1xuXG5mdW5jdGlvbiBTcGxpbmVDdXJ2ZTMoIHBvaW50cyApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5TcGxpbmVDdXJ2ZTMgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIFRIUkVFLkNhdG11bGxSb21DdXJ2ZTMgaW5zdGVhZC4nICk7XG5cblx0Q2F0bXVsbFJvbUN1cnZlMy5jYWxsKCB0aGlzLCBwb2ludHMgKTtcblx0dGhpcy50eXBlID0gJ2NhdG11bGxyb20nO1xuXG59XG5cblNwbGluZUN1cnZlMy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDYXRtdWxsUm9tQ3VydmUzLnByb3RvdHlwZSApO1xuXG4vL1xuXG5mdW5jdGlvbiBTcGxpbmUoIHBvaW50cyApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5TcGxpbmUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFRIUkVFLkNhdG11bGxSb21DdXJ2ZTMgaW5zdGVhZC4nICk7XG5cblx0Q2F0bXVsbFJvbUN1cnZlMy5jYWxsKCB0aGlzLCBwb2ludHMgKTtcblx0dGhpcy50eXBlID0gJ2NhdG11bGxyb20nO1xuXG59XG5cblNwbGluZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDYXRtdWxsUm9tQ3VydmUzLnByb3RvdHlwZSApO1xuXG5PYmplY3QuYXNzaWduKCBTcGxpbmUucHJvdG90eXBlLCB7XG5cblx0aW5pdEZyb21BcnJheTogZnVuY3Rpb24gKCAvKiBhICovICkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlNwbGluZTogLmluaXRGcm9tQXJyYXkoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9LFxuXHRnZXRDb250cm9sUG9pbnRzQXJyYXk6IGZ1bmN0aW9uICggLyogb3B0aW9uYWxUYXJnZXQgKi8gKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuU3BsaW5lOiAuZ2V0Q29udHJvbFBvaW50c0FycmF5KCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fSxcblx0cmVwYXJhbWV0cml6ZUJ5QXJjTGVuZ3RoOiBmdW5jdGlvbiAoIC8qIHNhbXBsaW5nQ29lZiAqLyApIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5TcGxpbmU6IC5yZXBhcmFtZXRyaXplQnlBcmNMZW5ndGgoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9XG5cbn0gKTtcblxuLy9cblxuZnVuY3Rpb24gQXhpc0hlbHBlciggc2l6ZSApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5BeGlzSGVscGVyIGhhcyBiZWVuIHJlbmFtZWQgdG8gVEhSRUUuQXhlc0hlbHBlci4nICk7XG5cdHJldHVybiBuZXcgQXhlc0hlbHBlciggc2l6ZSApO1xuXG59XG5cbmZ1bmN0aW9uIEJvdW5kaW5nQm94SGVscGVyKCBvYmplY3QsIGNvbG9yICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLkJvdW5kaW5nQm94SGVscGVyIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIENyZWF0aW5nIGEgVEhSRUUuQm94SGVscGVyIGluc3RlYWQuJyApO1xuXHRyZXR1cm4gbmV3IEJveEhlbHBlciggb2JqZWN0LCBjb2xvciApO1xuXG59XG5cbmZ1bmN0aW9uIEVkZ2VzSGVscGVyKCBvYmplY3QsIGhleCApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5FZGdlc0hlbHBlciBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuRWRnZXNHZW9tZXRyeSBpbnN0ZWFkLicgKTtcblx0cmV0dXJuIG5ldyBMaW5lU2VnbWVudHMoIG5ldyBFZGdlc0dlb21ldHJ5KCBvYmplY3QuZ2VvbWV0cnkgKSwgbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiBoZXggIT09IHVuZGVmaW5lZCA/IGhleCA6IDB4ZmZmZmZmIH0gKSApO1xuXG59XG5cbkdyaWRIZWxwZXIucHJvdG90eXBlLnNldENvbG9ycyA9IGZ1bmN0aW9uICgpIHtcblxuXHRjb25zb2xlLmVycm9yKCAnVEhSRUUuR3JpZEhlbHBlcjogc2V0Q29sb3JzKCkgaGFzIGJlZW4gZGVwcmVjYXRlZCwgcGFzcyB0aGVtIGluIHRoZSBjb25zdHJ1Y3RvciBpbnN0ZWFkLicgKTtcblxufTtcblxuU2tlbGV0b25IZWxwZXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uICgpIHtcblxuXHRjb25zb2xlLmVycm9yKCAnVEhSRUUuU2tlbGV0b25IZWxwZXI6IHVwZGF0ZSgpIG5vIGxvbmdlciBuZWVkcyB0byBiZSBjYWxsZWQuJyApO1xuXG59O1xuXG5mdW5jdGlvbiBXaXJlZnJhbWVIZWxwZXIoIG9iamVjdCwgaGV4ICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLldpcmVmcmFtZUhlbHBlciBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuV2lyZWZyYW1lR2VvbWV0cnkgaW5zdGVhZC4nICk7XG5cdHJldHVybiBuZXcgTGluZVNlZ21lbnRzKCBuZXcgV2lyZWZyYW1lR2VvbWV0cnkoIG9iamVjdC5nZW9tZXRyeSApLCBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IGhleCAhPT0gdW5kZWZpbmVkID8gaGV4IDogMHhmZmZmZmYgfSApICk7XG5cbn1cblxuLy9cblxuT2JqZWN0LmFzc2lnbiggTG9hZGVyLnByb3RvdHlwZSwge1xuXG5cdGV4dHJhY3RVcmxCYXNlOiBmdW5jdGlvbiAoIHVybCApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxvYWRlcjogLmV4dHJhY3RVcmxCYXNlKCkgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIFRIUkVFLkxvYWRlclV0aWxzLmV4dHJhY3RVcmxCYXNlKCkgaW5zdGVhZC4nICk7XG5cdFx0cmV0dXJuIExvYWRlclV0aWxzLmV4dHJhY3RVcmxCYXNlKCB1cmwgKTtcblxuXHR9XG5cbn0gKTtcblxuZnVuY3Rpb24gWEhSTG9hZGVyKCBtYW5hZ2VyICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLlhIUkxvYWRlciBoYXMgYmVlbiByZW5hbWVkIHRvIFRIUkVFLkZpbGVMb2FkZXIuJyApO1xuXHRyZXR1cm4gbmV3IEZpbGVMb2FkZXIoIG1hbmFnZXIgKTtcblxufVxuXG5mdW5jdGlvbiBCaW5hcnlUZXh0dXJlTG9hZGVyKCBtYW5hZ2VyICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLkJpbmFyeVRleHR1cmVMb2FkZXIgaGFzIGJlZW4gcmVuYW1lZCB0byBUSFJFRS5EYXRhVGV4dHVyZUxvYWRlci4nICk7XG5cdHJldHVybiBuZXcgRGF0YVRleHR1cmVMb2FkZXIoIG1hbmFnZXIgKTtcblxufVxuXG4vL1xuXG5PYmplY3QuYXNzaWduKCBCb3gyLnByb3RvdHlwZSwge1xuXG5cdGNlbnRlcjogZnVuY3Rpb24gKCBvcHRpb25hbFRhcmdldCApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJveDI6IC5jZW50ZXIoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRDZW50ZXIoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0Q2VudGVyKCBvcHRpb25hbFRhcmdldCApO1xuXG5cdH0sXG5cdGVtcHR5OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Cb3gyOiAuZW1wdHkoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pc0VtcHR5KCkuJyApO1xuXHRcdHJldHVybiB0aGlzLmlzRW1wdHkoKTtcblxuXHR9LFxuXHRpc0ludGVyc2VjdGlvbkJveDogZnVuY3Rpb24gKCBib3ggKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Cb3gyOiAuaXNJbnRlcnNlY3Rpb25Cb3goKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pbnRlcnNlY3RzQm94KCkuJyApO1xuXHRcdHJldHVybiB0aGlzLmludGVyc2VjdHNCb3goIGJveCApO1xuXG5cdH0sXG5cdHNpemU6IGZ1bmN0aW9uICggb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Cb3gyOiAuc2l6ZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldFNpemUoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0U2l6ZSggb3B0aW9uYWxUYXJnZXQgKTtcblxuXHR9XG59ICk7XG5cbk9iamVjdC5hc3NpZ24oIEJveDMucHJvdG90eXBlLCB7XG5cblx0Y2VudGVyOiBmdW5jdGlvbiAoIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQm94MzogLmNlbnRlcigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldENlbnRlcigpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5nZXRDZW50ZXIoIG9wdGlvbmFsVGFyZ2V0ICk7XG5cblx0fSxcblx0ZW1wdHk6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJveDM6IC5lbXB0eSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmlzRW1wdHkoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuaXNFbXB0eSgpO1xuXG5cdH0sXG5cdGlzSW50ZXJzZWN0aW9uQm94OiBmdW5jdGlvbiAoIGJveCApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJveDM6IC5pc0ludGVyc2VjdGlvbkJveCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmludGVyc2VjdHNCb3goKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuaW50ZXJzZWN0c0JveCggYm94ICk7XG5cblx0fSxcblx0aXNJbnRlcnNlY3Rpb25TcGhlcmU6IGZ1bmN0aW9uICggc3BoZXJlICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQm94MzogLmlzSW50ZXJzZWN0aW9uU3BoZXJlKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaW50ZXJzZWN0c1NwaGVyZSgpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5pbnRlcnNlY3RzU3BoZXJlKCBzcGhlcmUgKTtcblxuXHR9LFxuXHRzaXplOiBmdW5jdGlvbiAoIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQm94MzogLnNpemUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRTaXplKCkuJyApO1xuXHRcdHJldHVybiB0aGlzLmdldFNpemUoIG9wdGlvbmFsVGFyZ2V0ICk7XG5cblx0fVxufSApO1xuXG5MaW5lMy5wcm90b3R5cGUuY2VudGVyID0gZnVuY3Rpb24gKCBvcHRpb25hbFRhcmdldCApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5MaW5lMzogLmNlbnRlcigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldENlbnRlcigpLicgKTtcblx0cmV0dXJuIHRoaXMuZ2V0Q2VudGVyKCBvcHRpb25hbFRhcmdldCApO1xuXG59O1xuXG5PYmplY3QuYXNzaWduKCBfTWF0aCwge1xuXG5cdHJhbmRvbTE2OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5NYXRoOiAucmFuZG9tMTYoKSBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgTWF0aC5yYW5kb20oKSBpbnN0ZWFkLicgKTtcblx0XHRyZXR1cm4gTWF0aC5yYW5kb20oKTtcblxuXHR9LFxuXG5cdG5lYXJlc3RQb3dlck9mVHdvOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0aDogLm5lYXJlc3RQb3dlck9mVHdvKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZmxvb3JQb3dlck9mVHdvKCkuJyApO1xuXHRcdHJldHVybiBfTWF0aC5mbG9vclBvd2VyT2ZUd28oIHZhbHVlICk7XG5cblx0fSxcblxuXHRuZXh0UG93ZXJPZlR3bzogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdGg6IC5uZXh0UG93ZXJPZlR3bygpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmNlaWxQb3dlck9mVHdvKCkuJyApO1xuXHRcdHJldHVybiBfTWF0aC5jZWlsUG93ZXJPZlR3byggdmFsdWUgKTtcblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmFzc2lnbiggTWF0cml4My5wcm90b3R5cGUsIHtcblxuXHRmbGF0dGVuVG9BcnJheU9mZnNldDogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCBcIlRIUkVFLk1hdHJpeDM6IC5mbGF0dGVuVG9BcnJheU9mZnNldCgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAudG9BcnJheSgpIGluc3RlYWQuXCIgKTtcblx0XHRyZXR1cm4gdGhpcy50b0FycmF5KCBhcnJheSwgb2Zmc2V0ICk7XG5cblx0fSxcblx0bXVsdGlwbHlWZWN0b3IzOiBmdW5jdGlvbiAoIHZlY3RvciApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJpeDM6IC5tdWx0aXBseVZlY3RvcjMoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgdmVjdG9yLmFwcGx5TWF0cml4MyggbWF0cml4ICkgaW5zdGVhZC4nICk7XG5cdFx0cmV0dXJuIHZlY3Rvci5hcHBseU1hdHJpeDMoIHRoaXMgKTtcblxuXHR9LFxuXHRtdWx0aXBseVZlY3RvcjNBcnJheTogZnVuY3Rpb24gKCAvKiBhICovICkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLk1hdHJpeDM6IC5tdWx0aXBseVZlY3RvcjNBcnJheSgpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdH0sXG5cdGFwcGx5VG9CdWZmZXI6IGZ1bmN0aW9uICggYnVmZmVyIC8qLCBvZmZzZXQsIGxlbmd0aCAqLyApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJpeDM6IC5hcHBseVRvQnVmZmVyKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG1hdHJpeC5hcHBseVRvQnVmZmVyQXR0cmlidXRlKCBhdHRyaWJ1dGUgKSBpbnN0ZWFkLicgKTtcblx0XHRyZXR1cm4gdGhpcy5hcHBseVRvQnVmZmVyQXR0cmlidXRlKCBidWZmZXIgKTtcblxuXHR9LFxuXHRhcHBseVRvVmVjdG9yM0FycmF5OiBmdW5jdGlvbiAoIC8qIGFycmF5LCBvZmZzZXQsIGxlbmd0aCAqLyApIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5NYXRyaXgzOiAuYXBwbHlUb1ZlY3RvcjNBcnJheSgpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdH1cblxufSApO1xuXG5PYmplY3QuYXNzaWduKCBNYXRyaXg0LnByb3RvdHlwZSwge1xuXG5cdGV4dHJhY3RQb3NpdGlvbjogZnVuY3Rpb24gKCBtICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0cml4NDogLmV4dHJhY3RQb3NpdGlvbigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmNvcHlQb3NpdGlvbigpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5jb3B5UG9zaXRpb24oIG0gKTtcblxuXHR9LFxuXHRmbGF0dGVuVG9BcnJheU9mZnNldDogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCBcIlRIUkVFLk1hdHJpeDQ6IC5mbGF0dGVuVG9BcnJheU9mZnNldCgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAudG9BcnJheSgpIGluc3RlYWQuXCIgKTtcblx0XHRyZXR1cm4gdGhpcy50b0FycmF5KCBhcnJheSwgb2Zmc2V0ICk7XG5cblx0fSxcblx0Z2V0UG9zaXRpb246IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2MTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBnZXRQb3NpdGlvbigpIHtcblxuXHRcdFx0aWYgKCB2MSA9PT0gdW5kZWZpbmVkICkgdjEgPSBuZXcgVmVjdG9yMygpO1xuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0cml4NDogLmdldFBvc2l0aW9uKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFZlY3RvcjMuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBtYXRyaXggKSBpbnN0ZWFkLicgKTtcblx0XHRcdHJldHVybiB2MS5zZXRGcm9tTWF0cml4Q29sdW1uKCB0aGlzLCAzICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblx0c2V0Um90YXRpb25Gcm9tUXVhdGVybmlvbjogZnVuY3Rpb24gKCBxICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0cml4NDogLnNldFJvdGF0aW9uRnJvbVF1YXRlcm5pb24oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5tYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbigpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5tYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbiggcSApO1xuXG5cdH0sXG5cdG11bHRpcGx5VG9BcnJheTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0cml4NDogLm11bHRpcGx5VG9BcnJheSgpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdH0sXG5cdG11bHRpcGx5VmVjdG9yMzogZnVuY3Rpb24gKCB2ZWN0b3IgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5NYXRyaXg0OiAubXVsdGlwbHlWZWN0b3IzKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIHZlY3Rvci5hcHBseU1hdHJpeDQoIG1hdHJpeCApIGluc3RlYWQuJyApO1xuXHRcdHJldHVybiB2ZWN0b3IuYXBwbHlNYXRyaXg0KCB0aGlzICk7XG5cblx0fSxcblx0bXVsdGlwbHlWZWN0b3I0OiBmdW5jdGlvbiAoIHZlY3RvciApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJpeDQ6IC5tdWx0aXBseVZlY3RvcjQoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgdmVjdG9yLmFwcGx5TWF0cml4NCggbWF0cml4ICkgaW5zdGVhZC4nICk7XG5cdFx0cmV0dXJuIHZlY3Rvci5hcHBseU1hdHJpeDQoIHRoaXMgKTtcblxuXHR9LFxuXHRtdWx0aXBseVZlY3RvcjNBcnJheTogZnVuY3Rpb24gKCAvKiBhICovICkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLk1hdHJpeDQ6IC5tdWx0aXBseVZlY3RvcjNBcnJheSgpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdH0sXG5cdHJvdGF0ZUF4aXM6IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJpeDQ6IC5yb3RhdGVBeGlzKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFZlY3RvcjMudHJhbnNmb3JtRGlyZWN0aW9uKCBtYXRyaXggKSBpbnN0ZWFkLicgKTtcblx0XHR2LnRyYW5zZm9ybURpcmVjdGlvbiggdGhpcyApO1xuXG5cdH0sXG5cdGNyb3NzVmVjdG9yOiBmdW5jdGlvbiAoIHZlY3RvciApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJpeDQ6IC5jcm9zc1ZlY3RvcigpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSB2ZWN0b3IuYXBwbHlNYXRyaXg0KCBtYXRyaXggKSBpbnN0ZWFkLicgKTtcblx0XHRyZXR1cm4gdmVjdG9yLmFwcGx5TWF0cml4NCggdGhpcyApO1xuXG5cdH0sXG5cdHRyYW5zbGF0ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLk1hdHJpeDQ6IC50cmFuc2xhdGUoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9LFxuXHRyb3RhdGVYOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuTWF0cml4NDogLnJvdGF0ZVgoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9LFxuXHRyb3RhdGVZOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuTWF0cml4NDogLnJvdGF0ZVkoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9LFxuXHRyb3RhdGVaOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuTWF0cml4NDogLnJvdGF0ZVooKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9LFxuXHRyb3RhdGVCeUF4aXM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5NYXRyaXg0OiAucm90YXRlQnlBeGlzKCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fSxcblx0YXBwbHlUb0J1ZmZlcjogZnVuY3Rpb24gKCBidWZmZXIgLyosIG9mZnNldCwgbGVuZ3RoICovICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0cml4NDogLmFwcGx5VG9CdWZmZXIoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbWF0cml4LmFwcGx5VG9CdWZmZXJBdHRyaWJ1dGUoIGF0dHJpYnV0ZSApIGluc3RlYWQuJyApO1xuXHRcdHJldHVybiB0aGlzLmFwcGx5VG9CdWZmZXJBdHRyaWJ1dGUoIGJ1ZmZlciApO1xuXG5cdH0sXG5cdGFwcGx5VG9WZWN0b3IzQXJyYXk6IGZ1bmN0aW9uICggLyogYXJyYXksIG9mZnNldCwgbGVuZ3RoICovICkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLk1hdHJpeDQ6IC5hcHBseVRvVmVjdG9yM0FycmF5KCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fSxcblx0bWFrZUZydXN0dW06IGZ1bmN0aW9uICggbGVmdCwgcmlnaHQsIGJvdHRvbSwgdG9wLCBuZWFyLCBmYXIgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5NYXRyaXg0OiAubWFrZUZydXN0dW0oKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgLm1ha2VQZXJzcGVjdGl2ZSggbGVmdCwgcmlnaHQsIHRvcCwgYm90dG9tLCBuZWFyLCBmYXIgKSBpbnN0ZWFkLicgKTtcblx0XHRyZXR1cm4gdGhpcy5tYWtlUGVyc3BlY3RpdmUoIGxlZnQsIHJpZ2h0LCB0b3AsIGJvdHRvbSwgbmVhciwgZmFyICk7XG5cblx0fVxuXG59ICk7XG5cblBsYW5lLnByb3RvdHlwZS5pc0ludGVyc2VjdGlvbkxpbmUgPSBmdW5jdGlvbiAoIGxpbmUgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuUGxhbmU6IC5pc0ludGVyc2VjdGlvbkxpbmUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pbnRlcnNlY3RzTGluZSgpLicgKTtcblx0cmV0dXJuIHRoaXMuaW50ZXJzZWN0c0xpbmUoIGxpbmUgKTtcblxufTtcblxuUXVhdGVybmlvbi5wcm90b3R5cGUubXVsdGlwbHlWZWN0b3IzID0gZnVuY3Rpb24gKCB2ZWN0b3IgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuUXVhdGVybmlvbjogLm11bHRpcGx5VmVjdG9yMygpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBpcyBub3cgdmVjdG9yLmFwcGx5UXVhdGVybmlvbiggcXVhdGVybmlvbiApIGluc3RlYWQuJyApO1xuXHRyZXR1cm4gdmVjdG9yLmFwcGx5UXVhdGVybmlvbiggdGhpcyApO1xuXG59O1xuXG5PYmplY3QuYXNzaWduKCBSYXkucHJvdG90eXBlLCB7XG5cblx0aXNJbnRlcnNlY3Rpb25Cb3g6IGZ1bmN0aW9uICggYm94ICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuUmF5OiAuaXNJbnRlcnNlY3Rpb25Cb3goKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pbnRlcnNlY3RzQm94KCkuJyApO1xuXHRcdHJldHVybiB0aGlzLmludGVyc2VjdHNCb3goIGJveCApO1xuXG5cdH0sXG5cdGlzSW50ZXJzZWN0aW9uUGxhbmU6IGZ1bmN0aW9uICggcGxhbmUgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5SYXk6IC5pc0ludGVyc2VjdGlvblBsYW5lKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaW50ZXJzZWN0c1BsYW5lKCkuJyApO1xuXHRcdHJldHVybiB0aGlzLmludGVyc2VjdHNQbGFuZSggcGxhbmUgKTtcblxuXHR9LFxuXHRpc0ludGVyc2VjdGlvblNwaGVyZTogZnVuY3Rpb24gKCBzcGhlcmUgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5SYXk6IC5pc0ludGVyc2VjdGlvblNwaGVyZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmludGVyc2VjdHNTcGhlcmUoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuaW50ZXJzZWN0c1NwaGVyZSggc3BoZXJlICk7XG5cblx0fVxuXG59ICk7XG5cbk9iamVjdC5hc3NpZ24oIFRyaWFuZ2xlLnByb3RvdHlwZSwge1xuXG5cdGFyZWE6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlRyaWFuZ2xlOiAuYXJlYSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldEFyZWEoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0QXJlYSgpO1xuXG5cdH0sXG5cdGJhcnljb29yZEZyb21Qb2ludDogZnVuY3Rpb24gKCBwb2ludCwgdGFyZ2V0ICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVHJpYW5nbGU6IC5iYXJ5Y29vcmRGcm9tUG9pbnQoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRCYXJ5Y29vcmQoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0QmFyeWNvb3JkKCBwb2ludCwgdGFyZ2V0ICk7XG5cblx0fSxcblx0bWlkcG9pbnQ6IGZ1bmN0aW9uICggdGFyZ2V0ICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVHJpYW5nbGU6IC5taWRwb2ludCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldE1pZHBvaW50KCkuJyApO1xuXHRcdHJldHVybiB0aGlzLmdldE1pZHBvaW50KCB0YXJnZXQgKTtcblxuXHR9LFxuXHRub3JtYWw6IGZ1bmN0aW9uICggdGFyZ2V0ICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVHJpYW5nbGU6IC5ub3JtYWwoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXROb3JtYWwoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0Tm9ybWFsKCB0YXJnZXQgKTtcblxuXHR9LFxuXHRwbGFuZTogZnVuY3Rpb24gKCB0YXJnZXQgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5UcmlhbmdsZTogLnBsYW5lKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0UGxhbmUoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0UGxhbmUoIHRhcmdldCApO1xuXG5cdH1cblxufSApO1xuXG5PYmplY3QuYXNzaWduKCBUcmlhbmdsZSwge1xuXG5cdGJhcnljb29yZEZyb21Qb2ludDogZnVuY3Rpb24gKCBwb2ludCwgYSwgYiwgYywgdGFyZ2V0ICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVHJpYW5nbGU6IC5iYXJ5Y29vcmRGcm9tUG9pbnQoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRCYXJ5Y29vcmQoKS4nICk7XG5cdFx0cmV0dXJuIFRyaWFuZ2xlLmdldEJhcnljb29yZCggcG9pbnQsIGEsIGIsIGMsIHRhcmdldCApO1xuXG5cdH0sXG5cdG5vcm1hbDogZnVuY3Rpb24gKCBhLCBiLCBjLCB0YXJnZXQgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5UcmlhbmdsZTogLm5vcm1hbCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldE5vcm1hbCgpLicgKTtcblx0XHRyZXR1cm4gVHJpYW5nbGUuZ2V0Tm9ybWFsKCBhLCBiLCBjLCB0YXJnZXQgKTtcblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmFzc2lnbiggU2hhcGUucHJvdG90eXBlLCB7XG5cblx0ZXh0cmFjdEFsbFBvaW50czogZnVuY3Rpb24gKCBkaXZpc2lvbnMgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5TaGFwZTogLmV4dHJhY3RBbGxQb2ludHMoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgLmV4dHJhY3RQb2ludHMoKSBpbnN0ZWFkLicgKTtcblx0XHRyZXR1cm4gdGhpcy5leHRyYWN0UG9pbnRzKCBkaXZpc2lvbnMgKTtcblxuXHR9LFxuXHRleHRydWRlOiBmdW5jdGlvbiAoIG9wdGlvbnMgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5TaGFwZTogLmV4dHJ1ZGUoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgRXh0cnVkZUdlb21ldHJ5KCkgaW5zdGVhZC4nICk7XG5cdFx0cmV0dXJuIG5ldyBFeHRydWRlR2VvbWV0cnkoIHRoaXMsIG9wdGlvbnMgKTtcblxuXHR9LFxuXHRtYWtlR2VvbWV0cnk6IGZ1bmN0aW9uICggb3B0aW9ucyApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlNoYXBlOiAubWFrZUdlb21ldHJ5KCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFNoYXBlR2VvbWV0cnkoKSBpbnN0ZWFkLicgKTtcblx0XHRyZXR1cm4gbmV3IFNoYXBlR2VvbWV0cnkoIHRoaXMsIG9wdGlvbnMgKTtcblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmFzc2lnbiggVmVjdG9yMi5wcm90b3R5cGUsIHtcblxuXHRmcm9tQXR0cmlidXRlOiBmdW5jdGlvbiAoIGF0dHJpYnV0ZSwgaW5kZXgsIG9mZnNldCApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjI6IC5mcm9tQXR0cmlidXRlKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZnJvbUJ1ZmZlckF0dHJpYnV0ZSgpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5mcm9tQnVmZmVyQXR0cmlidXRlKCBhdHRyaWJ1dGUsIGluZGV4LCBvZmZzZXQgKTtcblxuXHR9LFxuXHRkaXN0YW5jZVRvTWFuaGF0dGFuOiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3IyOiAuZGlzdGFuY2VUb01hbmhhdHRhbigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLm1hbmhhdHRhbkRpc3RhbmNlVG8oKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMubWFuaGF0dGFuRGlzdGFuY2VUbyggdiApO1xuXG5cdH0sXG5cdGxlbmd0aE1hbmhhdHRhbjogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yMjogLmxlbmd0aE1hbmhhdHRhbigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLm1hbmhhdHRhbkxlbmd0aCgpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5tYW5oYXR0YW5MZW5ndGgoKTtcblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmFzc2lnbiggVmVjdG9yMy5wcm90b3R5cGUsIHtcblxuXHRzZXRFdWxlckZyb21Sb3RhdGlvbk1hdHJpeDogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlZlY3RvcjM6IC5zZXRFdWxlckZyb21Sb3RhdGlvbk1hdHJpeCgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBFdWxlci5zZXRGcm9tUm90YXRpb25NYXRyaXgoKSBpbnN0ZWFkLicgKTtcblxuXHR9LFxuXHRzZXRFdWxlckZyb21RdWF0ZXJuaW9uOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuVmVjdG9yMzogLnNldEV1bGVyRnJvbVF1YXRlcm5pb24oKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgRXVsZXIuc2V0RnJvbVF1YXRlcm5pb24oKSBpbnN0ZWFkLicgKTtcblxuXHR9LFxuXHRnZXRQb3NpdGlvbkZyb21NYXRyaXg6IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjM6IC5nZXRQb3NpdGlvbkZyb21NYXRyaXgoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5zZXRGcm9tTWF0cml4UG9zaXRpb24oKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBtICk7XG5cblx0fSxcblx0Z2V0U2NhbGVGcm9tTWF0cml4OiBmdW5jdGlvbiAoIG0gKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3IzOiAuZ2V0U2NhbGVGcm9tTWF0cml4KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuc2V0RnJvbU1hdHJpeFNjYWxlKCkuJyApO1xuXHRcdHJldHVybiB0aGlzLnNldEZyb21NYXRyaXhTY2FsZSggbSApO1xuXG5cdH0sXG5cdGdldENvbHVtbkZyb21NYXRyaXg6IGZ1bmN0aW9uICggaW5kZXgsIG1hdHJpeCApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjM6IC5nZXRDb2x1bW5Gcm9tTWF0cml4KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuc2V0RnJvbU1hdHJpeENvbHVtbigpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKCBtYXRyaXgsIGluZGV4ICk7XG5cblx0fSxcblx0YXBwbHlQcm9qZWN0aW9uOiBmdW5jdGlvbiAoIG0gKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3IzOiAuYXBwbHlQcm9qZWN0aW9uKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIC5hcHBseU1hdHJpeDQoIG0gKSBpbnN0ZWFkLicgKTtcblx0XHRyZXR1cm4gdGhpcy5hcHBseU1hdHJpeDQoIG0gKTtcblxuXHR9LFxuXHRmcm9tQXR0cmlidXRlOiBmdW5jdGlvbiAoIGF0dHJpYnV0ZSwgaW5kZXgsIG9mZnNldCApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjM6IC5mcm9tQXR0cmlidXRlKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZnJvbUJ1ZmZlckF0dHJpYnV0ZSgpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5mcm9tQnVmZmVyQXR0cmlidXRlKCBhdHRyaWJ1dGUsIGluZGV4LCBvZmZzZXQgKTtcblxuXHR9LFxuXHRkaXN0YW5jZVRvTWFuaGF0dGFuOiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3IzOiAuZGlzdGFuY2VUb01hbmhhdHRhbigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLm1hbmhhdHRhbkRpc3RhbmNlVG8oKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMubWFuaGF0dGFuRGlzdGFuY2VUbyggdiApO1xuXG5cdH0sXG5cdGxlbmd0aE1hbmhhdHRhbjogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yMzogLmxlbmd0aE1hbmhhdHRhbigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLm1hbmhhdHRhbkxlbmd0aCgpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5tYW5oYXR0YW5MZW5ndGgoKTtcblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmFzc2lnbiggVmVjdG9yNC5wcm90b3R5cGUsIHtcblxuXHRmcm9tQXR0cmlidXRlOiBmdW5jdGlvbiAoIGF0dHJpYnV0ZSwgaW5kZXgsIG9mZnNldCApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjQ6IC5mcm9tQXR0cmlidXRlKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZnJvbUJ1ZmZlckF0dHJpYnV0ZSgpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5mcm9tQnVmZmVyQXR0cmlidXRlKCBhdHRyaWJ1dGUsIGluZGV4LCBvZmZzZXQgKTtcblxuXHR9LFxuXHRsZW5ndGhNYW5oYXR0YW46IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjQ6IC5sZW5ndGhNYW5oYXR0YW4oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5tYW5oYXR0YW5MZW5ndGgoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMubWFuaGF0dGFuTGVuZ3RoKCk7XG5cblx0fVxuXG59ICk7XG5cbi8vXG5cbk9iamVjdC5hc3NpZ24oIEdlb21ldHJ5LnByb3RvdHlwZSwge1xuXG5cdGNvbXB1dGVUYW5nZW50czogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLkdlb21ldHJ5OiAuY29tcHV0ZVRhbmdlbnRzKCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fSxcblx0Y29tcHV0ZUxpbmVEaXN0YW5jZXM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5HZW9tZXRyeTogLmNvbXB1dGVMaW5lRGlzdGFuY2VzKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFRIUkVFLkxpbmUuY29tcHV0ZUxpbmVEaXN0YW5jZXMoKSBpbnN0ZWFkLicgKTtcblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmFzc2lnbiggT2JqZWN0M0QucHJvdG90eXBlLCB7XG5cblx0Z2V0Q2hpbGRCeU5hbWU6IGZ1bmN0aW9uICggbmFtZSApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdDNEOiAuZ2V0Q2hpbGRCeU5hbWUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRPYmplY3RCeU5hbWUoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0T2JqZWN0QnlOYW1lKCBuYW1lICk7XG5cblx0fSxcblx0cmVuZGVyRGVwdGg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdDNEOiAucmVuZGVyRGVwdGggaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIC5yZW5kZXJPcmRlciwgaW5zdGVhZC4nICk7XG5cblx0fSxcblx0dHJhbnNsYXRlOiBmdW5jdGlvbiAoIGRpc3RhbmNlLCBheGlzICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0M0Q6IC50cmFuc2xhdGUoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgLnRyYW5zbGF0ZU9uQXhpcyggYXhpcywgZGlzdGFuY2UgKSBpbnN0ZWFkLicgKTtcblx0XHRyZXR1cm4gdGhpcy50cmFuc2xhdGVPbkF4aXMoIGF4aXMsIGRpc3RhbmNlICk7XG5cblx0fSxcblx0Z2V0V29ybGRSb3RhdGlvbjogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLk9iamVjdDNEOiAuZ2V0V29ybGRSb3RhdGlvbigpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBUSFJFRS5PYmplY3QzRC5nZXRXb3JsZFF1YXRlcm5pb24oIHRhcmdldCApIGluc3RlYWQuJyApO1xuXG5cdH1cblxufSApO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyggT2JqZWN0M0QucHJvdG90eXBlLCB7XG5cblx0ZXVsZXJPcmRlcjoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3QzRDogLmV1bGVyT3JkZXIgaXMgbm93IC5yb3RhdGlvbi5vcmRlci4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5yb3RhdGlvbi5vcmRlcjtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3QzRDogLmV1bGVyT3JkZXIgaXMgbm93IC5yb3RhdGlvbi5vcmRlci4nICk7XG5cdFx0XHR0aGlzLnJvdGF0aW9uLm9yZGVyID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdHVzZVF1YXRlcm5pb246IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0M0Q6IC51c2VRdWF0ZXJuaW9uIGhhcyBiZWVuIHJlbW92ZWQuIFRoZSBsaWJyYXJ5IG5vdyB1c2VzIHF1YXRlcm5pb25zIGJ5IGRlZmF1bHQuJyApO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0M0Q6IC51c2VRdWF0ZXJuaW9uIGhhcyBiZWVuIHJlbW92ZWQuIFRoZSBsaWJyYXJ5IG5vdyB1c2VzIHF1YXRlcm5pb25zIGJ5IGRlZmF1bHQuJyApO1xuXG5cdFx0fVxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIExPRC5wcm90b3R5cGUsIHtcblxuXHRvYmplY3RzOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxPRDogLm9iamVjdHMgaGFzIGJlZW4gcmVuYW1lZCB0byAubGV2ZWxzLicgKTtcblx0XHRcdHJldHVybiB0aGlzLmxldmVscztcblxuXHRcdH1cblx0fVxuXG59ICk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eSggU2tlbGV0b24ucHJvdG90eXBlLCAndXNlVmVydGV4VGV4dHVyZScsIHtcblxuXHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlNrZWxldG9uOiB1c2VWZXJ0ZXhUZXh0dXJlIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdH0sXG5cdHNldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuU2tlbGV0b246IHVzZVZlcnRleFRleHR1cmUgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fVxuXG59ICk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eSggQ3VydmUucHJvdG90eXBlLCAnX19hcmNMZW5ndGhEaXZpc2lvbnMnLCB7XG5cblx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5DdXJ2ZTogLl9fYXJjTGVuZ3RoRGl2aXNpb25zIGlzIG5vdyAuYXJjTGVuZ3RoRGl2aXNpb25zLicgKTtcblx0XHRyZXR1cm4gdGhpcy5hcmNMZW5ndGhEaXZpc2lvbnM7XG5cblx0fSxcblx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQ3VydmU6IC5fX2FyY0xlbmd0aERpdmlzaW9ucyBpcyBub3cgLmFyY0xlbmd0aERpdmlzaW9ucy4nICk7XG5cdFx0dGhpcy5hcmNMZW5ndGhEaXZpc2lvbnMgPSB2YWx1ZTtcblxuXHR9XG5cbn0gKTtcblxuLy9cblxuUGVyc3BlY3RpdmVDYW1lcmEucHJvdG90eXBlLnNldExlbnMgPSBmdW5jdGlvbiAoIGZvY2FsTGVuZ3RoLCBmaWxtR2F1Z2UgKSB7XG5cblx0Y29uc29sZS53YXJuKCBcIlRIUkVFLlBlcnNwZWN0aXZlQ2FtZXJhLnNldExlbnMgaXMgZGVwcmVjYXRlZC4gXCIgK1xuXHRcdFx0XCJVc2UgLnNldEZvY2FsTGVuZ3RoIGFuZCAuZmlsbUdhdWdlIGZvciBhIHBob3RvZ3JhcGhpYyBzZXR1cC5cIiApO1xuXG5cdGlmICggZmlsbUdhdWdlICE9PSB1bmRlZmluZWQgKSB0aGlzLmZpbG1HYXVnZSA9IGZpbG1HYXVnZTtcblx0dGhpcy5zZXRGb2NhbExlbmd0aCggZm9jYWxMZW5ndGggKTtcblxufTtcblxuLy9cblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIExpZ2h0LnByb3RvdHlwZSwge1xuXHRvbmx5U2hhZG93OiB7XG5cdFx0c2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxpZ2h0OiAub25seVNoYWRvdyBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHRcdH1cblx0fSxcblx0c2hhZG93Q2FtZXJhRm92OiB7XG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5MaWdodDogLnNoYWRvd0NhbWVyYUZvdiBpcyBub3cgLnNoYWRvdy5jYW1lcmEuZm92LicgKTtcblx0XHRcdHRoaXMuc2hhZG93LmNhbWVyYS5mb3YgPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0c2hhZG93Q2FtZXJhTGVmdDoge1xuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFMZWZ0IGlzIG5vdyAuc2hhZG93LmNhbWVyYS5sZWZ0LicgKTtcblx0XHRcdHRoaXMuc2hhZG93LmNhbWVyYS5sZWZ0ID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdHNoYWRvd0NhbWVyYVJpZ2h0OiB7XG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5MaWdodDogLnNoYWRvd0NhbWVyYVJpZ2h0IGlzIG5vdyAuc2hhZG93LmNhbWVyYS5yaWdodC4nICk7XG5cdFx0XHR0aGlzLnNoYWRvdy5jYW1lcmEucmlnaHQgPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0c2hhZG93Q2FtZXJhVG9wOiB7XG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5MaWdodDogLnNoYWRvd0NhbWVyYVRvcCBpcyBub3cgLnNoYWRvdy5jYW1lcmEudG9wLicgKTtcblx0XHRcdHRoaXMuc2hhZG93LmNhbWVyYS50b3AgPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0c2hhZG93Q2FtZXJhQm90dG9tOiB7XG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5MaWdodDogLnNoYWRvd0NhbWVyYUJvdHRvbSBpcyBub3cgLnNoYWRvdy5jYW1lcmEuYm90dG9tLicgKTtcblx0XHRcdHRoaXMuc2hhZG93LmNhbWVyYS5ib3R0b20gPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0c2hhZG93Q2FtZXJhTmVhcjoge1xuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFOZWFyIGlzIG5vdyAuc2hhZG93LmNhbWVyYS5uZWFyLicgKTtcblx0XHRcdHRoaXMuc2hhZG93LmNhbWVyYS5uZWFyID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdHNoYWRvd0NhbWVyYUZhcjoge1xuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFGYXIgaXMgbm93IC5zaGFkb3cuY2FtZXJhLmZhci4nICk7XG5cdFx0XHR0aGlzLnNoYWRvdy5jYW1lcmEuZmFyID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdHNoYWRvd0NhbWVyYVZpc2libGU6IHtcblx0XHRzZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFWaXNpYmxlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuQ2FtZXJhSGVscGVyKCBsaWdodC5zaGFkb3cuY2FtZXJhICkgaW5zdGVhZC4nICk7XG5cblx0XHR9XG5cdH0sXG5cdHNoYWRvd0JpYXM6IHtcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxpZ2h0OiAuc2hhZG93QmlhcyBpcyBub3cgLnNoYWRvdy5iaWFzLicgKTtcblx0XHRcdHRoaXMuc2hhZG93LmJpYXMgPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0c2hhZG93RGFya25lc3M6IHtcblx0XHRzZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTGlnaHQ6IC5zaGFkb3dEYXJrbmVzcyBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHRcdH1cblx0fSxcblx0c2hhZG93TWFwV2lkdGg6IHtcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxpZ2h0OiAuc2hhZG93TWFwV2lkdGggaXMgbm93IC5zaGFkb3cubWFwU2l6ZS53aWR0aC4nICk7XG5cdFx0XHR0aGlzLnNoYWRvdy5tYXBTaXplLndpZHRoID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdHNoYWRvd01hcEhlaWdodDoge1xuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTGlnaHQ6IC5zaGFkb3dNYXBIZWlnaHQgaXMgbm93IC5zaGFkb3cubWFwU2l6ZS5oZWlnaHQuJyApO1xuXHRcdFx0dGhpcy5zaGFkb3cubWFwU2l6ZS5oZWlnaHQgPSB2YWx1ZTtcblxuXHRcdH1cblx0fVxufSApO1xuXG4vL1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyggQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSwge1xuXG5cdGxlbmd0aDoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJBdHRyaWJ1dGU6IC5sZW5ndGggaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIC5jb3VudCBpbnN0ZWFkLicgKTtcblx0XHRcdHJldHVybiB0aGlzLmFycmF5Lmxlbmd0aDtcblxuXHRcdH1cblx0fSxcblx0Y29weUluZGljZXNBcnJheTogZnVuY3Rpb24gKCAvKiBpbmRpY2VzICovICkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLkJ1ZmZlckF0dHJpYnV0ZTogLmNvcHlJbmRpY2VzQXJyYXkoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmFzc2lnbiggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLCB7XG5cblx0YWRkSW5kZXg6IGZ1bmN0aW9uICggaW5kZXggKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmFkZEluZGV4KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuc2V0SW5kZXgoKS4nICk7XG5cdFx0dGhpcy5zZXRJbmRleCggaW5kZXggKTtcblxuXHR9LFxuXHRhZGREcmF3Q2FsbDogZnVuY3Rpb24gKCBzdGFydCwgY291bnQsIGluZGV4T2Zmc2V0ICkge1xuXG5cdFx0aWYgKCBpbmRleE9mZnNldCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmFkZERyYXdDYWxsKCkgbm8gbG9uZ2VyIHN1cHBvcnRzIGluZGV4T2Zmc2V0LicgKTtcblxuXHRcdH1cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmFkZERyYXdDYWxsKCkgaXMgbm93IC5hZGRHcm91cCgpLicgKTtcblx0XHR0aGlzLmFkZEdyb3VwKCBzdGFydCwgY291bnQgKTtcblxuXHR9LFxuXHRjbGVhckRyYXdDYWxsczogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5jbGVhckRyYXdDYWxscygpIGlzIG5vdyAuY2xlYXJHcm91cHMoKS4nICk7XG5cdFx0dGhpcy5jbGVhckdyb3VwcygpO1xuXG5cdH0sXG5cdGNvbXB1dGVUYW5nZW50czogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5jb21wdXRlVGFuZ2VudHMoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9LFxuXHRjb21wdXRlT2Zmc2V0czogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5jb21wdXRlT2Zmc2V0cygpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdH1cblxufSApO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLCB7XG5cblx0ZHJhd2NhbGxzOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmRyYXdjYWxscyBoYXMgYmVlbiByZW5hbWVkIHRvIC5ncm91cHMuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMuZ3JvdXBzO1xuXG5cdFx0fVxuXHR9LFxuXHRvZmZzZXRzOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5OiAub2Zmc2V0cyBoYXMgYmVlbiByZW5hbWVkIHRvIC5ncm91cHMuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMuZ3JvdXBzO1xuXG5cdFx0fVxuXHR9XG5cbn0gKTtcblxuLy9cblxuT2JqZWN0LmFzc2lnbiggRXh0cnVkZUJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSwge1xuXG5cdGdldEFycmF5czogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLkV4dHJ1ZGVCdWZmZXJHZW9tZXRyeTogLmdldEFycmF5cygpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdH0sXG5cblx0YWRkU2hhcGVMaXN0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuRXh0cnVkZUJ1ZmZlckdlb21ldHJ5OiAuYWRkU2hhcGVMaXN0KCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fSxcblxuXHRhZGRTaGFwZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLkV4dHJ1ZGVCdWZmZXJHZW9tZXRyeTogLmFkZFNoYXBlKCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fVxuXG59ICk7XG5cbi8vXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBVbmlmb3JtLnByb3RvdHlwZSwge1xuXG5cdGR5bmFtaWM6IHtcblx0XHRzZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVW5pZm9ybTogLmR5bmFtaWMgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG9iamVjdC5vbkJlZm9yZVJlbmRlcigpIGluc3RlYWQuJyApO1xuXG5cdFx0fVxuXHR9LFxuXHRvblVwZGF0ZToge1xuXHRcdHZhbHVlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlVuaWZvcm06IC5vblVwZGF0ZSgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBvYmplY3Qub25CZWZvcmVSZW5kZXIoKSBpbnN0ZWFkLicgKTtcblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fVxuXHR9XG5cbn0gKTtcblxuLy9cblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIE1hdGVyaWFsLnByb3RvdHlwZSwge1xuXG5cdHdyYXBBcm91bmQ6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0ZXJpYWw6IC53cmFwQXJvdW5kIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0ZXJpYWw6IC53cmFwQXJvdW5kIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdFx0fVxuXHR9LFxuXHR3cmFwUkdCOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdGVyaWFsOiAud3JhcFJHQiBoYXMgYmVlbiByZW1vdmVkLicgKTtcblx0XHRcdHJldHVybiBuZXcgQ29sb3IoKTtcblxuXHRcdH1cblx0fSxcblxuXHRzaGFkaW5nOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS4nICsgdGhpcy50eXBlICsgJzogLnNoYWRpbmcgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIHRoZSBib29sZWFuIC5mbGF0U2hhZGluZyBpbnN0ZWFkLicgKTtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS4nICsgdGhpcy50eXBlICsgJzogLnNoYWRpbmcgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIHRoZSBib29sZWFuIC5mbGF0U2hhZGluZyBpbnN0ZWFkLicgKTtcblx0XHRcdHRoaXMuZmxhdFNoYWRpbmcgPSAoIHZhbHVlID09PSBGbGF0U2hhZGluZyApO1xuXG5cdFx0fVxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIE1lc2hQaG9uZ01hdGVyaWFsLnByb3RvdHlwZSwge1xuXG5cdG1ldGFsOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1lc2hQaG9uZ01hdGVyaWFsOiAubWV0YWwgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFRIUkVFLk1lc2hTdGFuZGFyZE1hdGVyaWFsIGluc3RlYWQuJyApO1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWVzaFBob25nTWF0ZXJpYWw6IC5tZXRhbCBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuTWVzaFN0YW5kYXJkTWF0ZXJpYWwgaW5zdGVhZCcgKTtcblxuXHRcdH1cblx0fVxuXG59ICk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBTaGFkZXJNYXRlcmlhbC5wcm90b3R5cGUsIHtcblxuXHRkZXJpdmF0aXZlczoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5TaGFkZXJNYXRlcmlhbDogLmRlcml2YXRpdmVzIGhhcyBiZWVuIG1vdmVkIHRvIC5leHRlbnNpb25zLmRlcml2YXRpdmVzLicgKTtcblx0XHRcdHJldHVybiB0aGlzLmV4dGVuc2lvbnMuZGVyaXZhdGl2ZXM7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuIFNoYWRlck1hdGVyaWFsOiAuZGVyaXZhdGl2ZXMgaGFzIGJlZW4gbW92ZWQgdG8gLmV4dGVuc2lvbnMuZGVyaXZhdGl2ZXMuJyApO1xuXHRcdFx0dGhpcy5leHRlbnNpb25zLmRlcml2YXRpdmVzID0gdmFsdWU7XG5cblx0XHR9XG5cdH1cblxufSApO1xuXG4vL1xuXG5PYmplY3QuYXNzaWduKCBXZWJHTFJlbmRlcmVyLnByb3RvdHlwZSwge1xuXG5cdGdldEN1cnJlbnRSZW5kZXJUYXJnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5nZXRDdXJyZW50UmVuZGVyVGFyZ2V0KCkgaXMgbm93IC5nZXRSZW5kZXJUYXJnZXQoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0UmVuZGVyVGFyZ2V0KCk7XG5cblx0fSxcblxuXHRnZXRNYXhBbmlzb3Ryb3B5OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuZ2V0TWF4QW5pc290cm9weSgpIGlzIG5vdyAuY2FwYWJpbGl0aWVzLmdldE1heEFuaXNvdHJvcHkoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuY2FwYWJpbGl0aWVzLmdldE1heEFuaXNvdHJvcHkoKTtcblxuXHR9LFxuXG5cdGdldFByZWNpc2lvbjogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLmdldFByZWNpc2lvbigpIGlzIG5vdyAuY2FwYWJpbGl0aWVzLnByZWNpc2lvbi4nICk7XG5cdFx0cmV0dXJuIHRoaXMuY2FwYWJpbGl0aWVzLnByZWNpc2lvbjtcblxuXHR9LFxuXG5cdHJlc2V0R0xTdGF0ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnJlc2V0R0xTdGF0ZSgpIGlzIG5vdyAuc3RhdGUucmVzZXQoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuc3RhdGUucmVzZXQoKTtcblxuXHR9LFxuXG5cdHN1cHBvcnRzRmxvYXRUZXh0dXJlczogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzRmxvYXRUZXh0dXJlcygpIGlzIG5vdyAuZXh0ZW5zaW9ucy5nZXQoIFxcJ09FU190ZXh0dXJlX2Zsb2F0XFwnICkuJyApO1xuXHRcdHJldHVybiB0aGlzLmV4dGVuc2lvbnMuZ2V0KCAnT0VTX3RleHR1cmVfZmxvYXQnICk7XG5cblx0fSxcblx0c3VwcG9ydHNIYWxmRmxvYXRUZXh0dXJlczogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzSGFsZkZsb2F0VGV4dHVyZXMoKSBpcyBub3cgLmV4dGVuc2lvbnMuZ2V0KCBcXCdPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0XFwnICkuJyApO1xuXHRcdHJldHVybiB0aGlzLmV4dGVuc2lvbnMuZ2V0KCAnT0VTX3RleHR1cmVfaGFsZl9mbG9hdCcgKTtcblxuXHR9LFxuXHRzdXBwb3J0c1N0YW5kYXJkRGVyaXZhdGl2ZXM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5zdXBwb3J0c1N0YW5kYXJkRGVyaXZhdGl2ZXMoKSBpcyBub3cgLmV4dGVuc2lvbnMuZ2V0KCBcXCdPRVNfc3RhbmRhcmRfZGVyaXZhdGl2ZXNcXCcgKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuZXh0ZW5zaW9ucy5nZXQoICdPRVNfc3RhbmRhcmRfZGVyaXZhdGl2ZXMnICk7XG5cblx0fSxcblx0c3VwcG9ydHNDb21wcmVzc2VkVGV4dHVyZVMzVEM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5zdXBwb3J0c0NvbXByZXNzZWRUZXh0dXJlUzNUQygpIGlzIG5vdyAuZXh0ZW5zaW9ucy5nZXQoIFxcJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjXFwnICkuJyApO1xuXHRcdHJldHVybiB0aGlzLmV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGMnICk7XG5cblx0fSxcblx0c3VwcG9ydHNDb21wcmVzc2VkVGV4dHVyZVBWUlRDOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc3VwcG9ydHNDb21wcmVzc2VkVGV4dHVyZVBWUlRDKCkgaXMgbm93IC5leHRlbnNpb25zLmdldCggXFwnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjXFwnICkuJyApO1xuXHRcdHJldHVybiB0aGlzLmV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjJyApO1xuXG5cdH0sXG5cdHN1cHBvcnRzQmxlbmRNaW5NYXg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5zdXBwb3J0c0JsZW5kTWluTWF4KCkgaXMgbm93IC5leHRlbnNpb25zLmdldCggXFwnRVhUX2JsZW5kX21pbm1heFxcJyApLicgKTtcblx0XHRyZXR1cm4gdGhpcy5leHRlbnNpb25zLmdldCggJ0VYVF9ibGVuZF9taW5tYXgnICk7XG5cblx0fSxcblx0c3VwcG9ydHNWZXJ0ZXhUZXh0dXJlczogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzVmVydGV4VGV4dHVyZXMoKSBpcyBub3cgLmNhcGFiaWxpdGllcy52ZXJ0ZXhUZXh0dXJlcy4nICk7XG5cdFx0cmV0dXJuIHRoaXMuY2FwYWJpbGl0aWVzLnZlcnRleFRleHR1cmVzO1xuXG5cdH0sXG5cdHN1cHBvcnRzSW5zdGFuY2VkQXJyYXlzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc3VwcG9ydHNJbnN0YW5jZWRBcnJheXMoKSBpcyBub3cgLmV4dGVuc2lvbnMuZ2V0KCBcXCdBTkdMRV9pbnN0YW5jZWRfYXJyYXlzXFwnICkuJyApO1xuXHRcdHJldHVybiB0aGlzLmV4dGVuc2lvbnMuZ2V0KCAnQU5HTEVfaW5zdGFuY2VkX2FycmF5cycgKTtcblxuXHR9LFxuXHRlbmFibGVTY2lzc29yVGVzdDogZnVuY3Rpb24gKCBib29sZWFuICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLmVuYWJsZVNjaXNzb3JUZXN0KCkgaXMgbm93IC5zZXRTY2lzc29yVGVzdCgpLicgKTtcblx0XHR0aGlzLnNldFNjaXNzb3JUZXN0KCBib29sZWFuICk7XG5cblx0fSxcblx0aW5pdE1hdGVyaWFsOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuaW5pdE1hdGVyaWFsKCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fSxcblx0YWRkUHJlUGx1Z2luOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuYWRkUHJlUGx1Z2luKCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fSxcblx0YWRkUG9zdFBsdWdpbjogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLmFkZFBvc3RQbHVnaW4oKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9LFxuXHR1cGRhdGVTaGFkb3dNYXA6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC51cGRhdGVTaGFkb3dNYXAoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9LFxuXHRzZXRGYWNlQ3VsbGluZzogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNldEZhY2VDdWxsaW5nKCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fVxuXG59ICk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBXZWJHTFJlbmRlcmVyLnByb3RvdHlwZSwge1xuXG5cdHNoYWRvd01hcEVuYWJsZWQ6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMuc2hhZG93TWFwLmVuYWJsZWQ7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcEVuYWJsZWQgaXMgbm93IC5zaGFkb3dNYXAuZW5hYmxlZC4nICk7XG5cdFx0XHR0aGlzLnNoYWRvd01hcC5lbmFibGVkID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdHNoYWRvd01hcFR5cGU6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMuc2hhZG93TWFwLnR5cGU7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcFR5cGUgaXMgbm93IC5zaGFkb3dNYXAudHlwZS4nICk7XG5cdFx0XHR0aGlzLnNoYWRvd01hcC50eXBlID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdHNoYWRvd01hcEN1bGxGYWNlOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5zaGFkb3dNYXBDdWxsRmFjZSBoYXMgYmVlbiByZW1vdmVkLiBTZXQgTWF0ZXJpYWwuc2hhZG93U2lkZSBpbnN0ZWFkLicgKTtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCAvKiB2YWx1ZSAqLyApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcEN1bGxGYWNlIGhhcyBiZWVuIHJlbW92ZWQuIFNldCBNYXRlcmlhbC5zaGFkb3dTaWRlIGluc3RlYWQuJyApO1xuXG5cdFx0fVxuXHR9XG59ICk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBXZWJHTFNoYWRvd01hcC5wcm90b3R5cGUsIHtcblxuXHRjdWxsRmFjZToge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwLmN1bGxGYWNlIGhhcyBiZWVuIHJlbW92ZWQuIFNldCBNYXRlcmlhbC5zaGFkb3dTaWRlIGluc3RlYWQuJyApO1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIC8qIGN1bGxGYWNlICovICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwLmN1bGxGYWNlIGhhcyBiZWVuIHJlbW92ZWQuIFNldCBNYXRlcmlhbC5zaGFkb3dTaWRlIGluc3RlYWQuJyApO1xuXG5cdFx0fVxuXHR9LFxuXHRyZW5kZXJSZXZlcnNlU2lkZWQ6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcC5yZW5kZXJSZXZlcnNlU2lkZWQgaGFzIGJlZW4gcmVtb3ZlZC4gU2V0IE1hdGVyaWFsLnNoYWRvd1NpZGUgaW5zdGVhZC4nICk7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcC5yZW5kZXJSZXZlcnNlU2lkZWQgaGFzIGJlZW4gcmVtb3ZlZC4gU2V0IE1hdGVyaWFsLnNoYWRvd1NpZGUgaW5zdGVhZC4nICk7XG5cblx0XHR9XG5cdH0sXG5cdHJlbmRlclNpbmdsZVNpZGVkOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5zaGFkb3dNYXAucmVuZGVyU2luZ2xlU2lkZWQgaGFzIGJlZW4gcmVtb3ZlZC4gU2V0IE1hdGVyaWFsLnNoYWRvd1NpZGUgaW5zdGVhZC4nICk7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcC5yZW5kZXJTaW5nbGVTaWRlZCBoYXMgYmVlbiByZW1vdmVkLiBTZXQgTWF0ZXJpYWwuc2hhZG93U2lkZSBpbnN0ZWFkLicgKTtcblxuXHRcdH1cblx0fVxuXG59ICk7XG5cbi8vXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBXZWJHTFJlbmRlclRhcmdldC5wcm90b3R5cGUsIHtcblxuXHR3cmFwUzoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLndyYXBTIGlzIG5vdyAudGV4dHVyZS53cmFwUy4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy50ZXh0dXJlLndyYXBTO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAud3JhcFMgaXMgbm93IC50ZXh0dXJlLndyYXBTLicgKTtcblx0XHRcdHRoaXMudGV4dHVyZS53cmFwUyA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9LFxuXHR3cmFwVDoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLndyYXBUIGlzIG5vdyAudGV4dHVyZS53cmFwVC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy50ZXh0dXJlLndyYXBUO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAud3JhcFQgaXMgbm93IC50ZXh0dXJlLndyYXBULicgKTtcblx0XHRcdHRoaXMudGV4dHVyZS53cmFwVCA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9LFxuXHRtYWdGaWx0ZXI6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5tYWdGaWx0ZXIgaXMgbm93IC50ZXh0dXJlLm1hZ0ZpbHRlci4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy50ZXh0dXJlLm1hZ0ZpbHRlcjtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLm1hZ0ZpbHRlciBpcyBub3cgLnRleHR1cmUubWFnRmlsdGVyLicgKTtcblx0XHRcdHRoaXMudGV4dHVyZS5tYWdGaWx0ZXIgPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0bWluRmlsdGVyOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAubWluRmlsdGVyIGlzIG5vdyAudGV4dHVyZS5taW5GaWx0ZXIuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMudGV4dHVyZS5taW5GaWx0ZXI7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5taW5GaWx0ZXIgaXMgbm93IC50ZXh0dXJlLm1pbkZpbHRlci4nICk7XG5cdFx0XHR0aGlzLnRleHR1cmUubWluRmlsdGVyID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdGFuaXNvdHJvcHk6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5hbmlzb3Ryb3B5IGlzIG5vdyAudGV4dHVyZS5hbmlzb3Ryb3B5LicgKTtcblx0XHRcdHJldHVybiB0aGlzLnRleHR1cmUuYW5pc290cm9weTtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLmFuaXNvdHJvcHkgaXMgbm93IC50ZXh0dXJlLmFuaXNvdHJvcHkuJyApO1xuXHRcdFx0dGhpcy50ZXh0dXJlLmFuaXNvdHJvcHkgPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0b2Zmc2V0OiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAub2Zmc2V0IGlzIG5vdyAudGV4dHVyZS5vZmZzZXQuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMudGV4dHVyZS5vZmZzZXQ7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5vZmZzZXQgaXMgbm93IC50ZXh0dXJlLm9mZnNldC4nICk7XG5cdFx0XHR0aGlzLnRleHR1cmUub2Zmc2V0ID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdHJlcGVhdDoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLnJlcGVhdCBpcyBub3cgLnRleHR1cmUucmVwZWF0LicgKTtcblx0XHRcdHJldHVybiB0aGlzLnRleHR1cmUucmVwZWF0O1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAucmVwZWF0IGlzIG5vdyAudGV4dHVyZS5yZXBlYXQuJyApO1xuXHRcdFx0dGhpcy50ZXh0dXJlLnJlcGVhdCA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9LFxuXHRmb3JtYXQ6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5mb3JtYXQgaXMgbm93IC50ZXh0dXJlLmZvcm1hdC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy50ZXh0dXJlLmZvcm1hdDtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLmZvcm1hdCBpcyBub3cgLnRleHR1cmUuZm9ybWF0LicgKTtcblx0XHRcdHRoaXMudGV4dHVyZS5mb3JtYXQgPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0dHlwZToge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLnR5cGUgaXMgbm93IC50ZXh0dXJlLnR5cGUuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMudGV4dHVyZS50eXBlO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAudHlwZSBpcyBub3cgLnRleHR1cmUudHlwZS4nICk7XG5cdFx0XHR0aGlzLnRleHR1cmUudHlwZSA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9LFxuXHRnZW5lcmF0ZU1pcG1hcHM6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5nZW5lcmF0ZU1pcG1hcHMgaXMgbm93IC50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcy4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcztcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLmdlbmVyYXRlTWlwbWFwcyBpcyBub3cgLnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzLicgKTtcblx0XHRcdHRoaXMudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgPSB2YWx1ZTtcblxuXHRcdH1cblx0fVxuXG59ICk7XG5cbi8vXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBXZWJWUk1hbmFnZXIucHJvdG90eXBlLCB7XG5cblx0c3RhbmRpbmc6IHtcblx0XHRzZXQ6IGZ1bmN0aW9uICggLyogdmFsdWUgKi8gKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYlZSTWFuYWdlcjogLnN0YW5kaW5nIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdFx0fVxuXHR9XG5cbn0gKTtcblxuLy9cblxuQXVkaW8ucHJvdG90eXBlLmxvYWQgPSBmdW5jdGlvbiAoIGZpbGUgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuQXVkaW86IC5sb2FkIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSBUSFJFRS5BdWRpb0xvYWRlciBpbnN0ZWFkLicgKTtcblx0dmFyIHNjb3BlID0gdGhpcztcblx0dmFyIGF1ZGlvTG9hZGVyID0gbmV3IEF1ZGlvTG9hZGVyKCk7XG5cdGF1ZGlvTG9hZGVyLmxvYWQoIGZpbGUsIGZ1bmN0aW9uICggYnVmZmVyICkge1xuXG5cdFx0c2NvcGUuc2V0QnVmZmVyKCBidWZmZXIgKTtcblxuXHR9ICk7XG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG5BdWRpb0FuYWx5c2VyLnByb3RvdHlwZS5nZXREYXRhID0gZnVuY3Rpb24gKCkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLkF1ZGlvQW5hbHlzZXI6IC5nZXREYXRhKCkgaXMgbm93IC5nZXRGcmVxdWVuY3lEYXRhKCkuJyApO1xuXHRyZXR1cm4gdGhpcy5nZXRGcmVxdWVuY3lEYXRhKCk7XG5cbn07XG5cbi8vXG5cbkN1YmVDYW1lcmEucHJvdG90eXBlLnVwZGF0ZUN1YmVNYXAgPSBmdW5jdGlvbiAoIHJlbmRlcmVyLCBzY2VuZSApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5DdWJlQ2FtZXJhOiAudXBkYXRlQ3ViZU1hcCgpIGlzIG5vdyAudXBkYXRlKCkuJyApO1xuXHRyZXR1cm4gdGhpcy51cGRhdGUoIHJlbmRlcmVyLCBzY2VuZSApO1xuXG59O1xuXG4vL1xuXG52YXIgR2VvbWV0cnlVdGlscyA9IHtcblxuXHRtZXJnZTogZnVuY3Rpb24gKCBnZW9tZXRyeTEsIGdlb21ldHJ5MiwgbWF0ZXJpYWxJbmRleE9mZnNldCApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkdlb21ldHJ5VXRpbHM6IC5tZXJnZSgpIGhhcyBiZWVuIG1vdmVkIHRvIEdlb21ldHJ5LiBVc2UgZ2VvbWV0cnkubWVyZ2UoIGdlb21ldHJ5MiwgbWF0cml4LCBtYXRlcmlhbEluZGV4T2Zmc2V0ICkgaW5zdGVhZC4nICk7XG5cdFx0dmFyIG1hdHJpeDtcblxuXHRcdGlmICggZ2VvbWV0cnkyLmlzTWVzaCApIHtcblxuXHRcdFx0Z2VvbWV0cnkyLm1hdHJpeEF1dG9VcGRhdGUgJiYgZ2VvbWV0cnkyLnVwZGF0ZU1hdHJpeCgpO1xuXG5cdFx0XHRtYXRyaXggPSBnZW9tZXRyeTIubWF0cml4O1xuXHRcdFx0Z2VvbWV0cnkyID0gZ2VvbWV0cnkyLmdlb21ldHJ5O1xuXG5cdFx0fVxuXG5cdFx0Z2VvbWV0cnkxLm1lcmdlKCBnZW9tZXRyeTIsIG1hdHJpeCwgbWF0ZXJpYWxJbmRleE9mZnNldCApO1xuXG5cdH0sXG5cblx0Y2VudGVyOiBmdW5jdGlvbiAoIGdlb21ldHJ5ICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuR2VvbWV0cnlVdGlsczogLmNlbnRlcigpIGhhcyBiZWVuIG1vdmVkIHRvIEdlb21ldHJ5LiBVc2UgZ2VvbWV0cnkuY2VudGVyKCkgaW5zdGVhZC4nICk7XG5cdFx0cmV0dXJuIGdlb21ldHJ5LmNlbnRlcigpO1xuXG5cdH1cblxufTtcblxudmFyIEltYWdlVXRpbHMgPSB7XG5cblx0Y3Jvc3NPcmlnaW46IHVuZGVmaW5lZCxcblxuXHRsb2FkVGV4dHVyZTogZnVuY3Rpb24gKCB1cmwsIG1hcHBpbmcsIG9uTG9hZCwgb25FcnJvciApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkltYWdlVXRpbHMubG9hZFRleHR1cmUgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIFRIUkVFLlRleHR1cmVMb2FkZXIoKSBpbnN0ZWFkLicgKTtcblxuXHRcdHZhciBsb2FkZXIgPSBuZXcgVGV4dHVyZUxvYWRlcigpO1xuXHRcdGxvYWRlci5zZXRDcm9zc09yaWdpbiggdGhpcy5jcm9zc09yaWdpbiApO1xuXG5cdFx0dmFyIHRleHR1cmUgPSBsb2FkZXIubG9hZCggdXJsLCBvbkxvYWQsIHVuZGVmaW5lZCwgb25FcnJvciApO1xuXG5cdFx0aWYgKCBtYXBwaW5nICkgdGV4dHVyZS5tYXBwaW5nID0gbWFwcGluZztcblxuXHRcdHJldHVybiB0ZXh0dXJlO1xuXG5cdH0sXG5cblx0bG9hZFRleHR1cmVDdWJlOiBmdW5jdGlvbiAoIHVybHMsIG1hcHBpbmcsIG9uTG9hZCwgb25FcnJvciApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkltYWdlVXRpbHMubG9hZFRleHR1cmVDdWJlIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSBUSFJFRS5DdWJlVGV4dHVyZUxvYWRlcigpIGluc3RlYWQuJyApO1xuXG5cdFx0dmFyIGxvYWRlciA9IG5ldyBDdWJlVGV4dHVyZUxvYWRlcigpO1xuXHRcdGxvYWRlci5zZXRDcm9zc09yaWdpbiggdGhpcy5jcm9zc09yaWdpbiApO1xuXG5cdFx0dmFyIHRleHR1cmUgPSBsb2FkZXIubG9hZCggdXJscywgb25Mb2FkLCB1bmRlZmluZWQsIG9uRXJyb3IgKTtcblxuXHRcdGlmICggbWFwcGluZyApIHRleHR1cmUubWFwcGluZyA9IG1hcHBpbmc7XG5cblx0XHRyZXR1cm4gdGV4dHVyZTtcblxuXHR9LFxuXG5cdGxvYWRDb21wcmVzc2VkVGV4dHVyZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLkltYWdlVXRpbHMubG9hZENvbXByZXNzZWRUZXh0dXJlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBUSFJFRS5ERFNMb2FkZXIgaW5zdGVhZC4nICk7XG5cblx0fSxcblxuXHRsb2FkQ29tcHJlc3NlZFRleHR1cmVDdWJlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuSW1hZ2VVdGlscy5sb2FkQ29tcHJlc3NlZFRleHR1cmVDdWJlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBUSFJFRS5ERFNMb2FkZXIgaW5zdGVhZC4nICk7XG5cblx0fVxuXG59O1xuXG4vL1xuXG5mdW5jdGlvbiBQcm9qZWN0b3IoKSB7XG5cblx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlByb2plY3RvciBoYXMgYmVlbiBtb3ZlZCB0byAvZXhhbXBsZXMvanMvcmVuZGVyZXJzL1Byb2plY3Rvci5qcy4nICk7XG5cblx0dGhpcy5wcm9qZWN0VmVjdG9yID0gZnVuY3Rpb24gKCB2ZWN0b3IsIGNhbWVyYSApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlByb2plY3RvcjogLnByb2plY3RWZWN0b3IoKSBpcyBub3cgdmVjdG9yLnByb2plY3QoKS4nICk7XG5cdFx0dmVjdG9yLnByb2plY3QoIGNhbWVyYSApO1xuXG5cdH07XG5cblx0dGhpcy51bnByb2plY3RWZWN0b3IgPSBmdW5jdGlvbiAoIHZlY3RvciwgY2FtZXJhICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuUHJvamVjdG9yOiAudW5wcm9qZWN0VmVjdG9yKCkgaXMgbm93IHZlY3Rvci51bnByb2plY3QoKS4nICk7XG5cdFx0dmVjdG9yLnVucHJvamVjdCggY2FtZXJhICk7XG5cblx0fTtcblxuXHR0aGlzLnBpY2tpbmdSYXkgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuUHJvamVjdG9yOiAucGlja2luZ1JheSgpIGlzIG5vdyByYXljYXN0ZXIuc2V0RnJvbUNhbWVyYSgpLicgKTtcblxuXHR9O1xuXG59XG5cbi8vXG5cbmZ1bmN0aW9uIENhbnZhc1JlbmRlcmVyKCkge1xuXG5cdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5DYW52YXNSZW5kZXJlciBoYXMgYmVlbiBtb3ZlZCB0byAvZXhhbXBsZXMvanMvcmVuZGVyZXJzL0NhbnZhc1JlbmRlcmVyLmpzJyApO1xuXG5cdHRoaXMuZG9tRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyggJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnLCAnY2FudmFzJyApO1xuXHR0aGlzLmNsZWFyID0gZnVuY3Rpb24gKCkge307XG5cdHRoaXMucmVuZGVyID0gZnVuY3Rpb24gKCkge307XG5cdHRoaXMuc2V0Q2xlYXJDb2xvciA9IGZ1bmN0aW9uICgpIHt9O1xuXHR0aGlzLnNldFNpemUgPSBmdW5jdGlvbiAoKSB7fTtcblxufVxuXG4vL1xuXG52YXIgU2NlbmVVdGlscyA9IHtcblxuXHRjcmVhdGVNdWx0aU1hdGVyaWFsT2JqZWN0OiBmdW5jdGlvbiAoIC8qIGdlb21ldHJ5LCBtYXRlcmlhbHMgKi8gKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuU2NlbmVVdGlscyBoYXMgYmVlbiBtb3ZlZCB0byAvZXhhbXBsZXMvanMvdXRpbHMvU2NlbmVVdGlscy5qcycgKTtcblxuXHR9LFxuXG5cdGRldGFjaDogZnVuY3Rpb24gKCAvKiBjaGlsZCwgcGFyZW50LCBzY2VuZSAqLyApIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5TY2VuZVV0aWxzIGhhcyBiZWVuIG1vdmVkIHRvIC9leGFtcGxlcy9qcy91dGlscy9TY2VuZVV0aWxzLmpzJyApO1xuXG5cdH0sXG5cblx0YXR0YWNoOiBmdW5jdGlvbiAoIC8qIGNoaWxkLCBzY2VuZSwgcGFyZW50ICovICkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlNjZW5lVXRpbHMgaGFzIGJlZW4gbW92ZWQgdG8gL2V4YW1wbGVzL2pzL3V0aWxzL1NjZW5lVXRpbHMuanMnICk7XG5cblx0fVxuXG59O1xuXG4vL1xuXG5mdW5jdGlvbiBMZW5zRmxhcmUoKSB7XG5cblx0Y29uc29sZS5lcnJvciggJ1RIUkVFLkxlbnNGbGFyZSBoYXMgYmVlbiBtb3ZlZCB0byAvZXhhbXBsZXMvanMvb2JqZWN0cy9MZW5zZmxhcmUuanMnICk7XG5cbn1cblxuZXhwb3J0IHsgV2ViR0xSZW5kZXJUYXJnZXRDdWJlLCBXZWJHTFJlbmRlclRhcmdldCwgV2ViR0xSZW5kZXJlciwgU2hhZGVyTGliLCBVbmlmb3Jtc0xpYiwgVW5pZm9ybXNVdGlscywgU2hhZGVyQ2h1bmssIEZvZ0V4cDIsIEZvZywgU2NlbmUsIFNwcml0ZSwgTE9ELCBTa2lubmVkTWVzaCwgU2tlbGV0b24sIEJvbmUsIE1lc2gsIExpbmVTZWdtZW50cywgTGluZUxvb3AsIExpbmUsIFBvaW50cywgR3JvdXAsIFZpZGVvVGV4dHVyZSwgRGF0YVRleHR1cmUsIENvbXByZXNzZWRUZXh0dXJlLCBDdWJlVGV4dHVyZSwgQ2FudmFzVGV4dHVyZSwgRGVwdGhUZXh0dXJlLCBUZXh0dXJlLCBDb21wcmVzc2VkVGV4dHVyZUxvYWRlciwgRGF0YVRleHR1cmVMb2FkZXIsIEN1YmVUZXh0dXJlTG9hZGVyLCBUZXh0dXJlTG9hZGVyLCBPYmplY3RMb2FkZXIsIE1hdGVyaWFsTG9hZGVyLCBCdWZmZXJHZW9tZXRyeUxvYWRlciwgRGVmYXVsdExvYWRpbmdNYW5hZ2VyLCBMb2FkaW5nTWFuYWdlciwgSlNPTkxvYWRlciwgSW1hZ2VMb2FkZXIsIEltYWdlQml0bWFwTG9hZGVyLCBGb250TG9hZGVyLCBGaWxlTG9hZGVyLCBMb2FkZXIsIExvYWRlclV0aWxzLCBDYWNoZSwgQXVkaW9Mb2FkZXIsIFNwb3RMaWdodFNoYWRvdywgU3BvdExpZ2h0LCBQb2ludExpZ2h0LCBSZWN0QXJlYUxpZ2h0LCBIZW1pc3BoZXJlTGlnaHQsIERpcmVjdGlvbmFsTGlnaHRTaGFkb3csIERpcmVjdGlvbmFsTGlnaHQsIEFtYmllbnRMaWdodCwgTGlnaHRTaGFkb3csIExpZ2h0LCBTdGVyZW9DYW1lcmEsIFBlcnNwZWN0aXZlQ2FtZXJhLCBPcnRob2dyYXBoaWNDYW1lcmEsIEN1YmVDYW1lcmEsIEFycmF5Q2FtZXJhLCBDYW1lcmEsIEF1ZGlvTGlzdGVuZXIsIFBvc2l0aW9uYWxBdWRpbywgQXVkaW9Db250ZXh0LCBBdWRpb0FuYWx5c2VyLCBBdWRpbywgVmVjdG9yS2V5ZnJhbWVUcmFjaywgU3RyaW5nS2V5ZnJhbWVUcmFjaywgUXVhdGVybmlvbktleWZyYW1lVHJhY2ssIE51bWJlcktleWZyYW1lVHJhY2ssIENvbG9yS2V5ZnJhbWVUcmFjaywgQm9vbGVhbktleWZyYW1lVHJhY2ssIFByb3BlcnR5TWl4ZXIsIFByb3BlcnR5QmluZGluZywgS2V5ZnJhbWVUcmFjaywgQW5pbWF0aW9uVXRpbHMsIEFuaW1hdGlvbk9iamVjdEdyb3VwLCBBbmltYXRpb25NaXhlciwgQW5pbWF0aW9uQ2xpcCwgVW5pZm9ybSwgSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnksIEJ1ZmZlckdlb21ldHJ5LCBHZW9tZXRyeSwgSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUsIEluc3RhbmNlZEludGVybGVhdmVkQnVmZmVyLCBJbnRlcmxlYXZlZEJ1ZmZlciwgSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlLCBGYWNlMywgT2JqZWN0M0QsIFJheWNhc3RlciwgTGF5ZXJzLCBFdmVudERpc3BhdGNoZXIsIENsb2NrLCBRdWF0ZXJuaW9uTGluZWFySW50ZXJwb2xhbnQsIExpbmVhckludGVycG9sYW50LCBEaXNjcmV0ZUludGVycG9sYW50LCBDdWJpY0ludGVycG9sYW50LCBJbnRlcnBvbGFudCwgVHJpYW5nbGUsIF9NYXRoIGFzIE1hdGgsIFNwaGVyaWNhbCwgQ3lsaW5kcmljYWwsIFBsYW5lLCBGcnVzdHVtLCBTcGhlcmUsIFJheSwgTWF0cml4NCwgTWF0cml4MywgQm94MywgQm94MiwgTGluZTMsIEV1bGVyLCBWZWN0b3I0LCBWZWN0b3IzLCBWZWN0b3IyLCBRdWF0ZXJuaW9uLCBDb2xvciwgSW1tZWRpYXRlUmVuZGVyT2JqZWN0LCBWZXJ0ZXhOb3JtYWxzSGVscGVyLCBTcG90TGlnaHRIZWxwZXIsIFNrZWxldG9uSGVscGVyLCBQb2ludExpZ2h0SGVscGVyLCBSZWN0QXJlYUxpZ2h0SGVscGVyLCBIZW1pc3BoZXJlTGlnaHRIZWxwZXIsIEdyaWRIZWxwZXIsIFBvbGFyR3JpZEhlbHBlciwgRmFjZU5vcm1hbHNIZWxwZXIsIERpcmVjdGlvbmFsTGlnaHRIZWxwZXIsIENhbWVyYUhlbHBlciwgQm94SGVscGVyLCBCb3gzSGVscGVyLCBQbGFuZUhlbHBlciwgQXJyb3dIZWxwZXIsIEF4ZXNIZWxwZXIsIFNoYXBlLCBQYXRoLCBTaGFwZVBhdGgsIEZvbnQsIEN1cnZlUGF0aCwgQ3VydmUsIFNoYXBlVXRpbHMsIFdlYkdMVXRpbHMsIFdpcmVmcmFtZUdlb21ldHJ5LCBQYXJhbWV0cmljR2VvbWV0cnksIFBhcmFtZXRyaWNCdWZmZXJHZW9tZXRyeSwgVGV0cmFoZWRyb25HZW9tZXRyeSwgVGV0cmFoZWRyb25CdWZmZXJHZW9tZXRyeSwgT2N0YWhlZHJvbkdlb21ldHJ5LCBPY3RhaGVkcm9uQnVmZmVyR2VvbWV0cnksIEljb3NhaGVkcm9uR2VvbWV0cnksIEljb3NhaGVkcm9uQnVmZmVyR2VvbWV0cnksIERvZGVjYWhlZHJvbkdlb21ldHJ5LCBEb2RlY2FoZWRyb25CdWZmZXJHZW9tZXRyeSwgUG9seWhlZHJvbkdlb21ldHJ5LCBQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnksIFR1YmVHZW9tZXRyeSwgVHViZUJ1ZmZlckdlb21ldHJ5LCBUb3J1c0tub3RHZW9tZXRyeSwgVG9ydXNLbm90QnVmZmVyR2VvbWV0cnksIFRvcnVzR2VvbWV0cnksIFRvcnVzQnVmZmVyR2VvbWV0cnksIFRleHRHZW9tZXRyeSwgVGV4dEJ1ZmZlckdlb21ldHJ5LCBTcGhlcmVHZW9tZXRyeSwgU3BoZXJlQnVmZmVyR2VvbWV0cnksIFJpbmdHZW9tZXRyeSwgUmluZ0J1ZmZlckdlb21ldHJ5LCBQbGFuZUdlb21ldHJ5LCBQbGFuZUJ1ZmZlckdlb21ldHJ5LCBMYXRoZUdlb21ldHJ5LCBMYXRoZUJ1ZmZlckdlb21ldHJ5LCBTaGFwZUdlb21ldHJ5LCBTaGFwZUJ1ZmZlckdlb21ldHJ5LCBFeHRydWRlR2VvbWV0cnksIEV4dHJ1ZGVCdWZmZXJHZW9tZXRyeSwgRWRnZXNHZW9tZXRyeSwgQ29uZUdlb21ldHJ5LCBDb25lQnVmZmVyR2VvbWV0cnksIEN5bGluZGVyR2VvbWV0cnksIEN5bGluZGVyQnVmZmVyR2VvbWV0cnksIENpcmNsZUdlb21ldHJ5LCBDaXJjbGVCdWZmZXJHZW9tZXRyeSwgQm94R2VvbWV0cnksIEJveEJ1ZmZlckdlb21ldHJ5LCBTaGFkb3dNYXRlcmlhbCwgU3ByaXRlTWF0ZXJpYWwsIFJhd1NoYWRlck1hdGVyaWFsLCBTaGFkZXJNYXRlcmlhbCwgUG9pbnRzTWF0ZXJpYWwsIE1lc2hQaHlzaWNhbE1hdGVyaWFsLCBNZXNoU3RhbmRhcmRNYXRlcmlhbCwgTWVzaFBob25nTWF0ZXJpYWwsIE1lc2hUb29uTWF0ZXJpYWwsIE1lc2hOb3JtYWxNYXRlcmlhbCwgTWVzaExhbWJlcnRNYXRlcmlhbCwgTWVzaERlcHRoTWF0ZXJpYWwsIE1lc2hEaXN0YW5jZU1hdGVyaWFsLCBNZXNoQmFzaWNNYXRlcmlhbCwgTGluZURhc2hlZE1hdGVyaWFsLCBMaW5lQmFzaWNNYXRlcmlhbCwgTWF0ZXJpYWwsIEZsb2F0NjRCdWZmZXJBdHRyaWJ1dGUsIEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUsIFVpbnQzMkJ1ZmZlckF0dHJpYnV0ZSwgSW50MzJCdWZmZXJBdHRyaWJ1dGUsIFVpbnQxNkJ1ZmZlckF0dHJpYnV0ZSwgSW50MTZCdWZmZXJBdHRyaWJ1dGUsIFVpbnQ4Q2xhbXBlZEJ1ZmZlckF0dHJpYnV0ZSwgVWludDhCdWZmZXJBdHRyaWJ1dGUsIEludDhCdWZmZXJBdHRyaWJ1dGUsIEJ1ZmZlckF0dHJpYnV0ZSwgQXJjQ3VydmUsIENhdG11bGxSb21DdXJ2ZTMsIEN1YmljQmV6aWVyQ3VydmUsIEN1YmljQmV6aWVyQ3VydmUzLCBFbGxpcHNlQ3VydmUsIExpbmVDdXJ2ZSwgTGluZUN1cnZlMywgUXVhZHJhdGljQmV6aWVyQ3VydmUsIFF1YWRyYXRpY0JlemllckN1cnZlMywgU3BsaW5lQ3VydmUsIFJFVklTSU9OLCBNT1VTRSwgQ3VsbEZhY2VOb25lLCBDdWxsRmFjZUJhY2ssIEN1bGxGYWNlRnJvbnQsIEN1bGxGYWNlRnJvbnRCYWNrLCBGcm9udEZhY2VEaXJlY3Rpb25DVywgRnJvbnRGYWNlRGlyZWN0aW9uQ0NXLCBCYXNpY1NoYWRvd01hcCwgUENGU2hhZG93TWFwLCBQQ0ZTb2Z0U2hhZG93TWFwLCBGcm9udFNpZGUsIEJhY2tTaWRlLCBEb3VibGVTaWRlLCBGbGF0U2hhZGluZywgU21vb3RoU2hhZGluZywgTm9Db2xvcnMsIEZhY2VDb2xvcnMsIFZlcnRleENvbG9ycywgTm9CbGVuZGluZywgTm9ybWFsQmxlbmRpbmcsIEFkZGl0aXZlQmxlbmRpbmcsIFN1YnRyYWN0aXZlQmxlbmRpbmcsIE11bHRpcGx5QmxlbmRpbmcsIEN1c3RvbUJsZW5kaW5nLCBBZGRFcXVhdGlvbiwgU3VidHJhY3RFcXVhdGlvbiwgUmV2ZXJzZVN1YnRyYWN0RXF1YXRpb24sIE1pbkVxdWF0aW9uLCBNYXhFcXVhdGlvbiwgWmVyb0ZhY3RvciwgT25lRmFjdG9yLCBTcmNDb2xvckZhY3RvciwgT25lTWludXNTcmNDb2xvckZhY3RvciwgU3JjQWxwaGFGYWN0b3IsIE9uZU1pbnVzU3JjQWxwaGFGYWN0b3IsIERzdEFscGhhRmFjdG9yLCBPbmVNaW51c0RzdEFscGhhRmFjdG9yLCBEc3RDb2xvckZhY3RvciwgT25lTWludXNEc3RDb2xvckZhY3RvciwgU3JjQWxwaGFTYXR1cmF0ZUZhY3RvciwgTmV2ZXJEZXB0aCwgQWx3YXlzRGVwdGgsIExlc3NEZXB0aCwgTGVzc0VxdWFsRGVwdGgsIEVxdWFsRGVwdGgsIEdyZWF0ZXJFcXVhbERlcHRoLCBHcmVhdGVyRGVwdGgsIE5vdEVxdWFsRGVwdGgsIE11bHRpcGx5T3BlcmF0aW9uLCBNaXhPcGVyYXRpb24sIEFkZE9wZXJhdGlvbiwgTm9Ub25lTWFwcGluZywgTGluZWFyVG9uZU1hcHBpbmcsIFJlaW5oYXJkVG9uZU1hcHBpbmcsIFVuY2hhcnRlZDJUb25lTWFwcGluZywgQ2luZW9uVG9uZU1hcHBpbmcsIFVWTWFwcGluZywgQ3ViZVJlZmxlY3Rpb25NYXBwaW5nLCBDdWJlUmVmcmFjdGlvbk1hcHBpbmcsIEVxdWlyZWN0YW5ndWxhclJlZmxlY3Rpb25NYXBwaW5nLCBFcXVpcmVjdGFuZ3VsYXJSZWZyYWN0aW9uTWFwcGluZywgU3BoZXJpY2FsUmVmbGVjdGlvbk1hcHBpbmcsIEN1YmVVVlJlZmxlY3Rpb25NYXBwaW5nLCBDdWJlVVZSZWZyYWN0aW9uTWFwcGluZywgUmVwZWF0V3JhcHBpbmcsIENsYW1wVG9FZGdlV3JhcHBpbmcsIE1pcnJvcmVkUmVwZWF0V3JhcHBpbmcsIE5lYXJlc3RGaWx0ZXIsIE5lYXJlc3RNaXBNYXBOZWFyZXN0RmlsdGVyLCBOZWFyZXN0TWlwTWFwTGluZWFyRmlsdGVyLCBMaW5lYXJGaWx0ZXIsIExpbmVhck1pcE1hcE5lYXJlc3RGaWx0ZXIsIExpbmVhck1pcE1hcExpbmVhckZpbHRlciwgVW5zaWduZWRCeXRlVHlwZSwgQnl0ZVR5cGUsIFNob3J0VHlwZSwgVW5zaWduZWRTaG9ydFR5cGUsIEludFR5cGUsIFVuc2lnbmVkSW50VHlwZSwgRmxvYXRUeXBlLCBIYWxmRmxvYXRUeXBlLCBVbnNpZ25lZFNob3J0NDQ0NFR5cGUsIFVuc2lnbmVkU2hvcnQ1NTUxVHlwZSwgVW5zaWduZWRTaG9ydDU2NVR5cGUsIFVuc2lnbmVkSW50MjQ4VHlwZSwgQWxwaGFGb3JtYXQsIFJHQkZvcm1hdCwgUkdCQUZvcm1hdCwgTHVtaW5hbmNlRm9ybWF0LCBMdW1pbmFuY2VBbHBoYUZvcm1hdCwgUkdCRUZvcm1hdCwgRGVwdGhGb3JtYXQsIERlcHRoU3RlbmNpbEZvcm1hdCwgUkdCX1MzVENfRFhUMV9Gb3JtYXQsIFJHQkFfUzNUQ19EWFQxX0Zvcm1hdCwgUkdCQV9TM1RDX0RYVDNfRm9ybWF0LCBSR0JBX1MzVENfRFhUNV9Gb3JtYXQsIFJHQl9QVlJUQ180QlBQVjFfRm9ybWF0LCBSR0JfUFZSVENfMkJQUFYxX0Zvcm1hdCwgUkdCQV9QVlJUQ180QlBQVjFfRm9ybWF0LCBSR0JBX1BWUlRDXzJCUFBWMV9Gb3JtYXQsIFJHQl9FVEMxX0Zvcm1hdCwgUkdCQV9BU1RDXzR4NF9Gb3JtYXQsIFJHQkFfQVNUQ181eDRfRm9ybWF0LCBSR0JBX0FTVENfNXg1X0Zvcm1hdCwgUkdCQV9BU1RDXzZ4NV9Gb3JtYXQsIFJHQkFfQVNUQ182eDZfRm9ybWF0LCBSR0JBX0FTVENfOHg1X0Zvcm1hdCwgUkdCQV9BU1RDXzh4Nl9Gb3JtYXQsIFJHQkFfQVNUQ184eDhfRm9ybWF0LCBSR0JBX0FTVENfMTB4NV9Gb3JtYXQsIFJHQkFfQVNUQ18xMHg2X0Zvcm1hdCwgUkdCQV9BU1RDXzEweDhfRm9ybWF0LCBSR0JBX0FTVENfMTB4MTBfRm9ybWF0LCBSR0JBX0FTVENfMTJ4MTBfRm9ybWF0LCBSR0JBX0FTVENfMTJ4MTJfRm9ybWF0LCBMb29wT25jZSwgTG9vcFJlcGVhdCwgTG9vcFBpbmdQb25nLCBJbnRlcnBvbGF0ZURpc2NyZXRlLCBJbnRlcnBvbGF0ZUxpbmVhciwgSW50ZXJwb2xhdGVTbW9vdGgsIFplcm9DdXJ2YXR1cmVFbmRpbmcsIFplcm9TbG9wZUVuZGluZywgV3JhcEFyb3VuZEVuZGluZywgVHJpYW5nbGVzRHJhd01vZGUsIFRyaWFuZ2xlU3RyaXBEcmF3TW9kZSwgVHJpYW5nbGVGYW5EcmF3TW9kZSwgTGluZWFyRW5jb2RpbmcsIHNSR0JFbmNvZGluZywgR2FtbWFFbmNvZGluZywgUkdCRUVuY29kaW5nLCBMb2dMdXZFbmNvZGluZywgUkdCTTdFbmNvZGluZywgUkdCTTE2RW5jb2RpbmcsIFJHQkRFbmNvZGluZywgQmFzaWNEZXB0aFBhY2tpbmcsIFJHQkFEZXB0aFBhY2tpbmcsIEJveEdlb21ldHJ5IGFzIEN1YmVHZW9tZXRyeSwgRmFjZTQsIExpbmVTdHJpcCwgTGluZVBpZWNlcywgTWVzaEZhY2VNYXRlcmlhbCwgTXVsdGlNYXRlcmlhbCwgUG9pbnRDbG91ZCwgUGFydGljbGUsIFBhcnRpY2xlU3lzdGVtLCBQb2ludENsb3VkTWF0ZXJpYWwsIFBhcnRpY2xlQmFzaWNNYXRlcmlhbCwgUGFydGljbGVTeXN0ZW1NYXRlcmlhbCwgVmVydGV4LCBEeW5hbWljQnVmZmVyQXR0cmlidXRlLCBJbnQ4QXR0cmlidXRlLCBVaW50OEF0dHJpYnV0ZSwgVWludDhDbGFtcGVkQXR0cmlidXRlLCBJbnQxNkF0dHJpYnV0ZSwgVWludDE2QXR0cmlidXRlLCBJbnQzMkF0dHJpYnV0ZSwgVWludDMyQXR0cmlidXRlLCBGbG9hdDMyQXR0cmlidXRlLCBGbG9hdDY0QXR0cmlidXRlLCBDbG9zZWRTcGxpbmVDdXJ2ZTMsIFNwbGluZUN1cnZlMywgU3BsaW5lLCBBeGlzSGVscGVyLCBCb3VuZGluZ0JveEhlbHBlciwgRWRnZXNIZWxwZXIsIFdpcmVmcmFtZUhlbHBlciwgWEhSTG9hZGVyLCBCaW5hcnlUZXh0dXJlTG9hZGVyLCBHZW9tZXRyeVV0aWxzLCBJbWFnZVV0aWxzLCBQcm9qZWN0b3IsIENhbnZhc1JlbmRlcmVyLCBTY2VuZVV0aWxzLCBMZW5zRmxhcmUgfTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gRXZlbnRzKHRhcmdldCl7XG4gIHZhciBldmVudHMgPSB7fSwgZW1wdHkgPSBbXTtcbiAgdGFyZ2V0ID0gdGFyZ2V0IHx8IHRoaXNcbiAgLyoqXG4gICAqICBPbjogbGlzdGVuIHRvIGV2ZW50c1xuICAgKi9cbiAgdGFyZ2V0Lm9uID0gZnVuY3Rpb24odHlwZSwgZnVuYywgY3R4KXtcbiAgICAoZXZlbnRzW3R5cGVdID0gZXZlbnRzW3R5cGVdIHx8IFtdKS5wdXNoKFtmdW5jLCBjdHhdKVxuICAgIHJldHVybiB0YXJnZXRcbiAgfVxuICAvKipcbiAgICogIE9mZjogc3RvcCBsaXN0ZW5pbmcgdG8gZXZlbnQgLyBzcGVjaWZpYyBjYWxsYmFja1xuICAgKi9cbiAgdGFyZ2V0Lm9mZiA9IGZ1bmN0aW9uKHR5cGUsIGZ1bmMpe1xuICAgIHR5cGUgfHwgKGV2ZW50cyA9IHt9KVxuICAgIHZhciBsaXN0ID0gZXZlbnRzW3R5cGVdIHx8IGVtcHR5LFxuICAgICAgICBpID0gbGlzdC5sZW5ndGggPSBmdW5jID8gbGlzdC5sZW5ndGggOiAwO1xuICAgIHdoaWxlKGktLSkgZnVuYyA9PSBsaXN0W2ldWzBdICYmIGxpc3Quc3BsaWNlKGksMSlcbiAgICByZXR1cm4gdGFyZ2V0XG4gIH1cbiAgLyoqIFxuICAgKiBFbWl0OiBzZW5kIGV2ZW50LCBjYWxsYmFja3Mgd2lsbCBiZSB0cmlnZ2VyZWRcbiAgICovXG4gIHRhcmdldC5lbWl0ID0gZnVuY3Rpb24odHlwZSl7XG4gICAgdmFyIGUgPSBldmVudHNbdHlwZV0gfHwgZW1wdHksIGxpc3QgPSBlLmxlbmd0aCA+IDAgPyBlLnNsaWNlKDAsIGUubGVuZ3RoKSA6IGUsIGk9MCwgajtcbiAgICB3aGlsZShqPWxpc3RbaSsrXSkgalswXS5hcHBseShqWzFdLCBlbXB0eS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSkpXG4gICAgcmV0dXJuIHRhcmdldFxuICB9O1xufTsiLCJ2YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuLy8gMTkuMS4yLjIgLyAxNS4yLjMuNSBPYmplY3QuY3JlYXRlKE8gWywgUHJvcGVydGllc10pXG4kZXhwb3J0KCRleHBvcnQuUywgJ09iamVjdCcsIHsgY3JlYXRlOiByZXF1aXJlKCcuL19vYmplY3QtY3JlYXRlJykgfSk7XG4iLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzNi5vYmplY3QuY3JlYXRlJyk7XG52YXIgJE9iamVjdCA9IHJlcXVpcmUoJy4uLy4uL21vZHVsZXMvX2NvcmUnKS5PYmplY3Q7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGNyZWF0ZShQLCBEKSB7XG4gIHJldHVybiAkT2JqZWN0LmNyZWF0ZShQLCBEKTtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjb3JlLWpzL2xpYnJhcnkvZm4vb2JqZWN0L2NyZWF0ZVwiKTsiLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0LCBUWVBFKSB7XG4gIGlmICghaXNPYmplY3QoaXQpIHx8IGl0Ll90ICE9PSBUWVBFKSB0aHJvdyBUeXBlRXJyb3IoJ0luY29tcGF0aWJsZSByZWNlaXZlciwgJyArIFRZUEUgKyAnIHJlcXVpcmVkIScpO1xuICByZXR1cm4gaXQ7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGRQID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJykuZjtcbnZhciBjcmVhdGUgPSByZXF1aXJlKCcuL19vYmplY3QtY3JlYXRlJyk7XG52YXIgcmVkZWZpbmVBbGwgPSByZXF1aXJlKCcuL19yZWRlZmluZS1hbGwnKTtcbnZhciBjdHggPSByZXF1aXJlKCcuL19jdHgnKTtcbnZhciBhbkluc3RhbmNlID0gcmVxdWlyZSgnLi9fYW4taW5zdGFuY2UnKTtcbnZhciBmb3JPZiA9IHJlcXVpcmUoJy4vX2Zvci1vZicpO1xudmFyICRpdGVyRGVmaW5lID0gcmVxdWlyZSgnLi9faXRlci1kZWZpbmUnKTtcbnZhciBzdGVwID0gcmVxdWlyZSgnLi9faXRlci1zdGVwJyk7XG52YXIgc2V0U3BlY2llcyA9IHJlcXVpcmUoJy4vX3NldC1zcGVjaWVzJyk7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpO1xudmFyIGZhc3RLZXkgPSByZXF1aXJlKCcuL19tZXRhJykuZmFzdEtleTtcbnZhciB2YWxpZGF0ZSA9IHJlcXVpcmUoJy4vX3ZhbGlkYXRlLWNvbGxlY3Rpb24nKTtcbnZhciBTSVpFID0gREVTQ1JJUFRPUlMgPyAnX3MnIDogJ3NpemUnO1xuXG52YXIgZ2V0RW50cnkgPSBmdW5jdGlvbiAodGhhdCwga2V5KSB7XG4gIC8vIGZhc3QgY2FzZVxuICB2YXIgaW5kZXggPSBmYXN0S2V5KGtleSk7XG4gIHZhciBlbnRyeTtcbiAgaWYgKGluZGV4ICE9PSAnRicpIHJldHVybiB0aGF0Ll9pW2luZGV4XTtcbiAgLy8gZnJvemVuIG9iamVjdCBjYXNlXG4gIGZvciAoZW50cnkgPSB0aGF0Ll9mOyBlbnRyeTsgZW50cnkgPSBlbnRyeS5uKSB7XG4gICAgaWYgKGVudHJ5LmsgPT0ga2V5KSByZXR1cm4gZW50cnk7XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBnZXRDb25zdHJ1Y3RvcjogZnVuY3Rpb24gKHdyYXBwZXIsIE5BTUUsIElTX01BUCwgQURERVIpIHtcbiAgICB2YXIgQyA9IHdyYXBwZXIoZnVuY3Rpb24gKHRoYXQsIGl0ZXJhYmxlKSB7XG4gICAgICBhbkluc3RhbmNlKHRoYXQsIEMsIE5BTUUsICdfaScpO1xuICAgICAgdGhhdC5fdCA9IE5BTUU7ICAgICAgICAgLy8gY29sbGVjdGlvbiB0eXBlXG4gICAgICB0aGF0Ll9pID0gY3JlYXRlKG51bGwpOyAvLyBpbmRleFxuICAgICAgdGhhdC5fZiA9IHVuZGVmaW5lZDsgICAgLy8gZmlyc3QgZW50cnlcbiAgICAgIHRoYXQuX2wgPSB1bmRlZmluZWQ7ICAgIC8vIGxhc3QgZW50cnlcbiAgICAgIHRoYXRbU0laRV0gPSAwOyAgICAgICAgIC8vIHNpemVcbiAgICAgIGlmIChpdGVyYWJsZSAhPSB1bmRlZmluZWQpIGZvck9mKGl0ZXJhYmxlLCBJU19NQVAsIHRoYXRbQURERVJdLCB0aGF0KTtcbiAgICB9KTtcbiAgICByZWRlZmluZUFsbChDLnByb3RvdHlwZSwge1xuICAgICAgLy8gMjMuMS4zLjEgTWFwLnByb3RvdHlwZS5jbGVhcigpXG4gICAgICAvLyAyMy4yLjMuMiBTZXQucHJvdG90eXBlLmNsZWFyKClcbiAgICAgIGNsZWFyOiBmdW5jdGlvbiBjbGVhcigpIHtcbiAgICAgICAgZm9yICh2YXIgdGhhdCA9IHZhbGlkYXRlKHRoaXMsIE5BTUUpLCBkYXRhID0gdGhhdC5faSwgZW50cnkgPSB0aGF0Ll9mOyBlbnRyeTsgZW50cnkgPSBlbnRyeS5uKSB7XG4gICAgICAgICAgZW50cnkuciA9IHRydWU7XG4gICAgICAgICAgaWYgKGVudHJ5LnApIGVudHJ5LnAgPSBlbnRyeS5wLm4gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgZGVsZXRlIGRhdGFbZW50cnkuaV07XG4gICAgICAgIH1cbiAgICAgICAgdGhhdC5fZiA9IHRoYXQuX2wgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoYXRbU0laRV0gPSAwO1xuICAgICAgfSxcbiAgICAgIC8vIDIzLjEuMy4zIE1hcC5wcm90b3R5cGUuZGVsZXRlKGtleSlcbiAgICAgIC8vIDIzLjIuMy40IFNldC5wcm90b3R5cGUuZGVsZXRlKHZhbHVlKVxuICAgICAgJ2RlbGV0ZSc6IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgdmFyIHRoYXQgPSB2YWxpZGF0ZSh0aGlzLCBOQU1FKTtcbiAgICAgICAgdmFyIGVudHJ5ID0gZ2V0RW50cnkodGhhdCwga2V5KTtcbiAgICAgICAgaWYgKGVudHJ5KSB7XG4gICAgICAgICAgdmFyIG5leHQgPSBlbnRyeS5uO1xuICAgICAgICAgIHZhciBwcmV2ID0gZW50cnkucDtcbiAgICAgICAgICBkZWxldGUgdGhhdC5faVtlbnRyeS5pXTtcbiAgICAgICAgICBlbnRyeS5yID0gdHJ1ZTtcbiAgICAgICAgICBpZiAocHJldikgcHJldi5uID0gbmV4dDtcbiAgICAgICAgICBpZiAobmV4dCkgbmV4dC5wID0gcHJldjtcbiAgICAgICAgICBpZiAodGhhdC5fZiA9PSBlbnRyeSkgdGhhdC5fZiA9IG5leHQ7XG4gICAgICAgICAgaWYgKHRoYXQuX2wgPT0gZW50cnkpIHRoYXQuX2wgPSBwcmV2O1xuICAgICAgICAgIHRoYXRbU0laRV0tLTtcbiAgICAgICAgfSByZXR1cm4gISFlbnRyeTtcbiAgICAgIH0sXG4gICAgICAvLyAyMy4yLjMuNiBTZXQucHJvdG90eXBlLmZvckVhY2goY2FsbGJhY2tmbiwgdGhpc0FyZyA9IHVuZGVmaW5lZClcbiAgICAgIC8vIDIzLjEuMy41IE1hcC5wcm90b3R5cGUuZm9yRWFjaChjYWxsYmFja2ZuLCB0aGlzQXJnID0gdW5kZWZpbmVkKVxuICAgICAgZm9yRWFjaDogZnVuY3Rpb24gZm9yRWFjaChjYWxsYmFja2ZuIC8qICwgdGhhdCA9IHVuZGVmaW5lZCAqLykge1xuICAgICAgICB2YWxpZGF0ZSh0aGlzLCBOQU1FKTtcbiAgICAgICAgdmFyIGYgPSBjdHgoY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQsIDMpO1xuICAgICAgICB2YXIgZW50cnk7XG4gICAgICAgIHdoaWxlIChlbnRyeSA9IGVudHJ5ID8gZW50cnkubiA6IHRoaXMuX2YpIHtcbiAgICAgICAgICBmKGVudHJ5LnYsIGVudHJ5LmssIHRoaXMpO1xuICAgICAgICAgIC8vIHJldmVydCB0byB0aGUgbGFzdCBleGlzdGluZyBlbnRyeVxuICAgICAgICAgIHdoaWxlIChlbnRyeSAmJiBlbnRyeS5yKSBlbnRyeSA9IGVudHJ5LnA7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAvLyAyMy4xLjMuNyBNYXAucHJvdG90eXBlLmhhcyhrZXkpXG4gICAgICAvLyAyMy4yLjMuNyBTZXQucHJvdG90eXBlLmhhcyh2YWx1ZSlcbiAgICAgIGhhczogZnVuY3Rpb24gaGFzKGtleSkge1xuICAgICAgICByZXR1cm4gISFnZXRFbnRyeSh2YWxpZGF0ZSh0aGlzLCBOQU1FKSwga2V5KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoREVTQ1JJUFRPUlMpIGRQKEMucHJvdG90eXBlLCAnc2l6ZScsIHtcbiAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdmFsaWRhdGUodGhpcywgTkFNRSlbU0laRV07XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIEM7XG4gIH0sXG4gIGRlZjogZnVuY3Rpb24gKHRoYXQsIGtleSwgdmFsdWUpIHtcbiAgICB2YXIgZW50cnkgPSBnZXRFbnRyeSh0aGF0LCBrZXkpO1xuICAgIHZhciBwcmV2LCBpbmRleDtcbiAgICAvLyBjaGFuZ2UgZXhpc3RpbmcgZW50cnlcbiAgICBpZiAoZW50cnkpIHtcbiAgICAgIGVudHJ5LnYgPSB2YWx1ZTtcbiAgICAvLyBjcmVhdGUgbmV3IGVudHJ5XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoYXQuX2wgPSBlbnRyeSA9IHtcbiAgICAgICAgaTogaW5kZXggPSBmYXN0S2V5KGtleSwgdHJ1ZSksIC8vIDwtIGluZGV4XG4gICAgICAgIGs6IGtleSwgICAgICAgICAgICAgICAgICAgICAgICAvLyA8LSBrZXlcbiAgICAgICAgdjogdmFsdWUsICAgICAgICAgICAgICAgICAgICAgIC8vIDwtIHZhbHVlXG4gICAgICAgIHA6IHByZXYgPSB0aGF0Ll9sLCAgICAgICAgICAgICAvLyA8LSBwcmV2aW91cyBlbnRyeVxuICAgICAgICBuOiB1bmRlZmluZWQsICAgICAgICAgICAgICAgICAgLy8gPC0gbmV4dCBlbnRyeVxuICAgICAgICByOiBmYWxzZSAgICAgICAgICAgICAgICAgICAgICAgLy8gPC0gcmVtb3ZlZFxuICAgICAgfTtcbiAgICAgIGlmICghdGhhdC5fZikgdGhhdC5fZiA9IGVudHJ5O1xuICAgICAgaWYgKHByZXYpIHByZXYubiA9IGVudHJ5O1xuICAgICAgdGhhdFtTSVpFXSsrO1xuICAgICAgLy8gYWRkIHRvIGluZGV4XG4gICAgICBpZiAoaW5kZXggIT09ICdGJykgdGhhdC5faVtpbmRleF0gPSBlbnRyeTtcbiAgICB9IHJldHVybiB0aGF0O1xuICB9LFxuICBnZXRFbnRyeTogZ2V0RW50cnksXG4gIHNldFN0cm9uZzogZnVuY3Rpb24gKEMsIE5BTUUsIElTX01BUCkge1xuICAgIC8vIGFkZCAua2V5cywgLnZhbHVlcywgLmVudHJpZXMsIFtAQGl0ZXJhdG9yXVxuICAgIC8vIDIzLjEuMy40LCAyMy4xLjMuOCwgMjMuMS4zLjExLCAyMy4xLjMuMTIsIDIzLjIuMy41LCAyMy4yLjMuOCwgMjMuMi4zLjEwLCAyMy4yLjMuMTFcbiAgICAkaXRlckRlZmluZShDLCBOQU1FLCBmdW5jdGlvbiAoaXRlcmF0ZWQsIGtpbmQpIHtcbiAgICAgIHRoaXMuX3QgPSB2YWxpZGF0ZShpdGVyYXRlZCwgTkFNRSk7IC8vIHRhcmdldFxuICAgICAgdGhpcy5fayA9IGtpbmQ7ICAgICAgICAgICAgICAgICAgICAgLy8ga2luZFxuICAgICAgdGhpcy5fbCA9IHVuZGVmaW5lZDsgICAgICAgICAgICAgICAgLy8gcHJldmlvdXNcbiAgICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICB2YXIga2luZCA9IHRoYXQuX2s7XG4gICAgICB2YXIgZW50cnkgPSB0aGF0Ll9sO1xuICAgICAgLy8gcmV2ZXJ0IHRvIHRoZSBsYXN0IGV4aXN0aW5nIGVudHJ5XG4gICAgICB3aGlsZSAoZW50cnkgJiYgZW50cnkucikgZW50cnkgPSBlbnRyeS5wO1xuICAgICAgLy8gZ2V0IG5leHQgZW50cnlcbiAgICAgIGlmICghdGhhdC5fdCB8fCAhKHRoYXQuX2wgPSBlbnRyeSA9IGVudHJ5ID8gZW50cnkubiA6IHRoYXQuX3QuX2YpKSB7XG4gICAgICAgIC8vIG9yIGZpbmlzaCB0aGUgaXRlcmF0aW9uXG4gICAgICAgIHRoYXQuX3QgPSB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiBzdGVwKDEpO1xuICAgICAgfVxuICAgICAgLy8gcmV0dXJuIHN0ZXAgYnkga2luZFxuICAgICAgaWYgKGtpbmQgPT0gJ2tleXMnKSByZXR1cm4gc3RlcCgwLCBlbnRyeS5rKTtcbiAgICAgIGlmIChraW5kID09ICd2YWx1ZXMnKSByZXR1cm4gc3RlcCgwLCBlbnRyeS52KTtcbiAgICAgIHJldHVybiBzdGVwKDAsIFtlbnRyeS5rLCBlbnRyeS52XSk7XG4gICAgfSwgSVNfTUFQID8gJ2VudHJpZXMnIDogJ3ZhbHVlcycsICFJU19NQVAsIHRydWUpO1xuXG4gICAgLy8gYWRkIFtAQHNwZWNpZXNdLCAyMy4xLjIuMiwgMjMuMi4yLjJcbiAgICBzZXRTcGVjaWVzKE5BTUUpO1xuICB9XG59O1xuIiwidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgaXNBcnJheSA9IHJlcXVpcmUoJy4vX2lzLWFycmF5Jyk7XG52YXIgU1BFQ0lFUyA9IHJlcXVpcmUoJy4vX3drcycpKCdzcGVjaWVzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9yaWdpbmFsKSB7XG4gIHZhciBDO1xuICBpZiAoaXNBcnJheShvcmlnaW5hbCkpIHtcbiAgICBDID0gb3JpZ2luYWwuY29uc3RydWN0b3I7XG4gICAgLy8gY3Jvc3MtcmVhbG0gZmFsbGJhY2tcbiAgICBpZiAodHlwZW9mIEMgPT0gJ2Z1bmN0aW9uJyAmJiAoQyA9PT0gQXJyYXkgfHwgaXNBcnJheShDLnByb3RvdHlwZSkpKSBDID0gdW5kZWZpbmVkO1xuICAgIGlmIChpc09iamVjdChDKSkge1xuICAgICAgQyA9IENbU1BFQ0lFU107XG4gICAgICBpZiAoQyA9PT0gbnVsbCkgQyA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH0gcmV0dXJuIEMgPT09IHVuZGVmaW5lZCA/IEFycmF5IDogQztcbn07XG4iLCIvLyA5LjQuMi4zIEFycmF5U3BlY2llc0NyZWF0ZShvcmlnaW5hbEFycmF5LCBsZW5ndGgpXG52YXIgc3BlY2llc0NvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi9fYXJyYXktc3BlY2llcy1jb25zdHJ1Y3RvcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvcmlnaW5hbCwgbGVuZ3RoKSB7XG4gIHJldHVybiBuZXcgKHNwZWNpZXNDb25zdHJ1Y3RvcihvcmlnaW5hbCkpKGxlbmd0aCk7XG59O1xuIiwiLy8gMCAtPiBBcnJheSNmb3JFYWNoXG4vLyAxIC0+IEFycmF5I21hcFxuLy8gMiAtPiBBcnJheSNmaWx0ZXJcbi8vIDMgLT4gQXJyYXkjc29tZVxuLy8gNCAtPiBBcnJheSNldmVyeVxuLy8gNSAtPiBBcnJheSNmaW5kXG4vLyA2IC0+IEFycmF5I2ZpbmRJbmRleFxudmFyIGN0eCA9IHJlcXVpcmUoJy4vX2N0eCcpO1xudmFyIElPYmplY3QgPSByZXF1aXJlKCcuL19pb2JqZWN0Jyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpO1xudmFyIGFzYyA9IHJlcXVpcmUoJy4vX2FycmF5LXNwZWNpZXMtY3JlYXRlJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChUWVBFLCAkY3JlYXRlKSB7XG4gIHZhciBJU19NQVAgPSBUWVBFID09IDE7XG4gIHZhciBJU19GSUxURVIgPSBUWVBFID09IDI7XG4gIHZhciBJU19TT01FID0gVFlQRSA9PSAzO1xuICB2YXIgSVNfRVZFUlkgPSBUWVBFID09IDQ7XG4gIHZhciBJU19GSU5EX0lOREVYID0gVFlQRSA9PSA2O1xuICB2YXIgTk9fSE9MRVMgPSBUWVBFID09IDUgfHwgSVNfRklORF9JTkRFWDtcbiAgdmFyIGNyZWF0ZSA9ICRjcmVhdGUgfHwgYXNjO1xuICByZXR1cm4gZnVuY3Rpb24gKCR0aGlzLCBjYWxsYmFja2ZuLCB0aGF0KSB7XG4gICAgdmFyIE8gPSB0b09iamVjdCgkdGhpcyk7XG4gICAgdmFyIHNlbGYgPSBJT2JqZWN0KE8pO1xuICAgIHZhciBmID0gY3R4KGNhbGxiYWNrZm4sIHRoYXQsIDMpO1xuICAgIHZhciBsZW5ndGggPSB0b0xlbmd0aChzZWxmLmxlbmd0aCk7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICB2YXIgcmVzdWx0ID0gSVNfTUFQID8gY3JlYXRlKCR0aGlzLCBsZW5ndGgpIDogSVNfRklMVEVSID8gY3JlYXRlKCR0aGlzLCAwKSA6IHVuZGVmaW5lZDtcbiAgICB2YXIgdmFsLCByZXM7XG4gICAgZm9yICg7bGVuZ3RoID4gaW5kZXg7IGluZGV4KyspIGlmIChOT19IT0xFUyB8fCBpbmRleCBpbiBzZWxmKSB7XG4gICAgICB2YWwgPSBzZWxmW2luZGV4XTtcbiAgICAgIHJlcyA9IGYodmFsLCBpbmRleCwgTyk7XG4gICAgICBpZiAoVFlQRSkge1xuICAgICAgICBpZiAoSVNfTUFQKSByZXN1bHRbaW5kZXhdID0gcmVzOyAgIC8vIG1hcFxuICAgICAgICBlbHNlIGlmIChyZXMpIHN3aXRjaCAoVFlQRSkge1xuICAgICAgICAgIGNhc2UgMzogcmV0dXJuIHRydWU7ICAgICAgICAgICAgIC8vIHNvbWVcbiAgICAgICAgICBjYXNlIDU6IHJldHVybiB2YWw7ICAgICAgICAgICAgICAvLyBmaW5kXG4gICAgICAgICAgY2FzZSA2OiByZXR1cm4gaW5kZXg7ICAgICAgICAgICAgLy8gZmluZEluZGV4XG4gICAgICAgICAgY2FzZSAyOiByZXN1bHQucHVzaCh2YWwpOyAgICAgICAgLy8gZmlsdGVyXG4gICAgICAgIH0gZWxzZSBpZiAoSVNfRVZFUlkpIHJldHVybiBmYWxzZTsgLy8gZXZlcnlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIElTX0ZJTkRfSU5ERVggPyAtMSA6IElTX1NPTUUgfHwgSVNfRVZFUlkgPyBJU19FVkVSWSA6IHJlc3VsdDtcbiAgfTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIG1ldGEgPSByZXF1aXJlKCcuL19tZXRhJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuL19mYWlscycpO1xudmFyIGhpZGUgPSByZXF1aXJlKCcuL19oaWRlJyk7XG52YXIgcmVkZWZpbmVBbGwgPSByZXF1aXJlKCcuL19yZWRlZmluZS1hbGwnKTtcbnZhciBmb3JPZiA9IHJlcXVpcmUoJy4vX2Zvci1vZicpO1xudmFyIGFuSW5zdGFuY2UgPSByZXF1aXJlKCcuL19hbi1pbnN0YW5jZScpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuL19zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIGRQID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJykuZjtcbnZhciBlYWNoID0gcmVxdWlyZSgnLi9fYXJyYXktbWV0aG9kcycpKDApO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTkFNRSwgd3JhcHBlciwgbWV0aG9kcywgY29tbW9uLCBJU19NQVAsIElTX1dFQUspIHtcbiAgdmFyIEJhc2UgPSBnbG9iYWxbTkFNRV07XG4gIHZhciBDID0gQmFzZTtcbiAgdmFyIEFEREVSID0gSVNfTUFQID8gJ3NldCcgOiAnYWRkJztcbiAgdmFyIHByb3RvID0gQyAmJiBDLnByb3RvdHlwZTtcbiAgdmFyIE8gPSB7fTtcbiAgaWYgKCFERVNDUklQVE9SUyB8fCB0eXBlb2YgQyAhPSAnZnVuY3Rpb24nIHx8ICEoSVNfV0VBSyB8fCBwcm90by5mb3JFYWNoICYmICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgbmV3IEMoKS5lbnRyaWVzKCkubmV4dCgpO1xuICB9KSkpIHtcbiAgICAvLyBjcmVhdGUgY29sbGVjdGlvbiBjb25zdHJ1Y3RvclxuICAgIEMgPSBjb21tb24uZ2V0Q29uc3RydWN0b3Iod3JhcHBlciwgTkFNRSwgSVNfTUFQLCBBRERFUik7XG4gICAgcmVkZWZpbmVBbGwoQy5wcm90b3R5cGUsIG1ldGhvZHMpO1xuICAgIG1ldGEuTkVFRCA9IHRydWU7XG4gIH0gZWxzZSB7XG4gICAgQyA9IHdyYXBwZXIoZnVuY3Rpb24gKHRhcmdldCwgaXRlcmFibGUpIHtcbiAgICAgIGFuSW5zdGFuY2UodGFyZ2V0LCBDLCBOQU1FLCAnX2MnKTtcbiAgICAgIHRhcmdldC5fYyA9IG5ldyBCYXNlKCk7XG4gICAgICBpZiAoaXRlcmFibGUgIT0gdW5kZWZpbmVkKSBmb3JPZihpdGVyYWJsZSwgSVNfTUFQLCB0YXJnZXRbQURERVJdLCB0YXJnZXQpO1xuICAgIH0pO1xuICAgIGVhY2goJ2FkZCxjbGVhcixkZWxldGUsZm9yRWFjaCxnZXQsaGFzLHNldCxrZXlzLHZhbHVlcyxlbnRyaWVzLHRvSlNPTicuc3BsaXQoJywnKSwgZnVuY3Rpb24gKEtFWSkge1xuICAgICAgdmFyIElTX0FEREVSID0gS0VZID09ICdhZGQnIHx8IEtFWSA9PSAnc2V0JztcbiAgICAgIGlmIChLRVkgaW4gcHJvdG8gJiYgIShJU19XRUFLICYmIEtFWSA9PSAnY2xlYXInKSkgaGlkZShDLnByb3RvdHlwZSwgS0VZLCBmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICBhbkluc3RhbmNlKHRoaXMsIEMsIEtFWSk7XG4gICAgICAgIGlmICghSVNfQURERVIgJiYgSVNfV0VBSyAmJiAhaXNPYmplY3QoYSkpIHJldHVybiBLRVkgPT0gJ2dldCcgPyB1bmRlZmluZWQgOiBmYWxzZTtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHRoaXMuX2NbS0VZXShhID09PSAwID8gMCA6IGEsIGIpO1xuICAgICAgICByZXR1cm4gSVNfQURERVIgPyB0aGlzIDogcmVzdWx0O1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgSVNfV0VBSyB8fCBkUChDLnByb3RvdHlwZSwgJ3NpemUnLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Muc2l6ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHNldFRvU3RyaW5nVGFnKEMsIE5BTUUpO1xuXG4gIE9bTkFNRV0gPSBDO1xuICAkZXhwb3J0KCRleHBvcnQuRyArICRleHBvcnQuVyArICRleHBvcnQuRiwgTyk7XG5cbiAgaWYgKCFJU19XRUFLKSBjb21tb24uc2V0U3Ryb25nKEMsIE5BTUUsIElTX01BUCk7XG5cbiAgcmV0dXJuIEM7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHN0cm9uZyA9IHJlcXVpcmUoJy4vX2NvbGxlY3Rpb24tc3Ryb25nJyk7XG52YXIgdmFsaWRhdGUgPSByZXF1aXJlKCcuL192YWxpZGF0ZS1jb2xsZWN0aW9uJyk7XG52YXIgTUFQID0gJ01hcCc7XG5cbi8vIDIzLjEgTWFwIE9iamVjdHNcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9fY29sbGVjdGlvbicpKE1BUCwgZnVuY3Rpb24gKGdldCkge1xuICByZXR1cm4gZnVuY3Rpb24gTWFwKCkgeyByZXR1cm4gZ2V0KHRoaXMsIGFyZ3VtZW50cy5sZW5ndGggPiAwID8gYXJndW1lbnRzWzBdIDogdW5kZWZpbmVkKTsgfTtcbn0sIHtcbiAgLy8gMjMuMS4zLjYgTWFwLnByb3RvdHlwZS5nZXQoa2V5KVxuICBnZXQ6IGZ1bmN0aW9uIGdldChrZXkpIHtcbiAgICB2YXIgZW50cnkgPSBzdHJvbmcuZ2V0RW50cnkodmFsaWRhdGUodGhpcywgTUFQKSwga2V5KTtcbiAgICByZXR1cm4gZW50cnkgJiYgZW50cnkudjtcbiAgfSxcbiAgLy8gMjMuMS4zLjkgTWFwLnByb3RvdHlwZS5zZXQoa2V5LCB2YWx1ZSlcbiAgc2V0OiBmdW5jdGlvbiBzZXQoa2V5LCB2YWx1ZSkge1xuICAgIHJldHVybiBzdHJvbmcuZGVmKHZhbGlkYXRlKHRoaXMsIE1BUCksIGtleSA9PT0gMCA/IDAgOiBrZXksIHZhbHVlKTtcbiAgfVxufSwgc3Ryb25nLCB0cnVlKTtcbiIsInZhciBmb3JPZiA9IHJlcXVpcmUoJy4vX2Zvci1vZicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdGVyLCBJVEVSQVRPUikge1xuICB2YXIgcmVzdWx0ID0gW107XG4gIGZvck9mKGl0ZXIsIGZhbHNlLCByZXN1bHQucHVzaCwgcmVzdWx0LCBJVEVSQVRPUik7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuIiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL0RhdmlkQnJ1YW50L01hcC1TZXQucHJvdG90eXBlLnRvSlNPTlxudmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuL19jbGFzc29mJyk7XG52YXIgZnJvbSA9IHJlcXVpcmUoJy4vX2FycmF5LWZyb20taXRlcmFibGUnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE5BTUUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHRvSlNPTigpIHtcbiAgICBpZiAoY2xhc3NvZih0aGlzKSAhPSBOQU1FKSB0aHJvdyBUeXBlRXJyb3IoTkFNRSArIFwiI3RvSlNPTiBpc24ndCBnZW5lcmljXCIpO1xuICAgIHJldHVybiBmcm9tKHRoaXMpO1xuICB9O1xufTtcbiIsIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9EYXZpZEJydWFudC9NYXAtU2V0LnByb3RvdHlwZS50b0pTT05cbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5SLCAnTWFwJywgeyB0b0pTT046IHJlcXVpcmUoJy4vX2NvbGxlY3Rpb24tdG8tanNvbicpKCdNYXAnKSB9KTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vcHJvcG9zYWwtc2V0bWFwLW9mZnJvbS9cbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKENPTExFQ1RJT04pIHtcbiAgJGV4cG9ydCgkZXhwb3J0LlMsIENPTExFQ1RJT04sIHsgb2Y6IGZ1bmN0aW9uIG9mKCkge1xuICAgIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIHZhciBBID0gbmV3IEFycmF5KGxlbmd0aCk7XG4gICAgd2hpbGUgKGxlbmd0aC0tKSBBW2xlbmd0aF0gPSBhcmd1bWVudHNbbGVuZ3RoXTtcbiAgICByZXR1cm4gbmV3IHRoaXMoQSk7XG4gIH0gfSk7XG59O1xuIiwiLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9wcm9wb3NhbC1zZXRtYXAtb2Zmcm9tLyNzZWMtbWFwLm9mXG5yZXF1aXJlKCcuL19zZXQtY29sbGVjdGlvbi1vZicpKCdNYXAnKTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vcHJvcG9zYWwtc2V0bWFwLW9mZnJvbS9cbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpO1xudmFyIGN0eCA9IHJlcXVpcmUoJy4vX2N0eCcpO1xudmFyIGZvck9mID0gcmVxdWlyZSgnLi9fZm9yLW9mJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKENPTExFQ1RJT04pIHtcbiAgJGV4cG9ydCgkZXhwb3J0LlMsIENPTExFQ1RJT04sIHsgZnJvbTogZnVuY3Rpb24gZnJvbShzb3VyY2UgLyogLCBtYXBGbiwgdGhpc0FyZyAqLykge1xuICAgIHZhciBtYXBGbiA9IGFyZ3VtZW50c1sxXTtcbiAgICB2YXIgbWFwcGluZywgQSwgbiwgY2I7XG4gICAgYUZ1bmN0aW9uKHRoaXMpO1xuICAgIG1hcHBpbmcgPSBtYXBGbiAhPT0gdW5kZWZpbmVkO1xuICAgIGlmIChtYXBwaW5nKSBhRnVuY3Rpb24obWFwRm4pO1xuICAgIGlmIChzb3VyY2UgPT0gdW5kZWZpbmVkKSByZXR1cm4gbmV3IHRoaXMoKTtcbiAgICBBID0gW107XG4gICAgaWYgKG1hcHBpbmcpIHtcbiAgICAgIG4gPSAwO1xuICAgICAgY2IgPSBjdHgobWFwRm4sIGFyZ3VtZW50c1syXSwgMik7XG4gICAgICBmb3JPZihzb3VyY2UsIGZhbHNlLCBmdW5jdGlvbiAobmV4dEl0ZW0pIHtcbiAgICAgICAgQS5wdXNoKGNiKG5leHRJdGVtLCBuKyspKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3JPZihzb3VyY2UsIGZhbHNlLCBBLnB1c2gsIEEpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IHRoaXMoQSk7XG4gIH0gfSk7XG59O1xuIiwiLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9wcm9wb3NhbC1zZXRtYXAtb2Zmcm9tLyNzZWMtbWFwLmZyb21cbnJlcXVpcmUoJy4vX3NldC1jb2xsZWN0aW9uLWZyb20nKSgnTWFwJyk7XG4iLCJyZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5vYmplY3QudG8tc3RyaW5nJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5zdHJpbmcuaXRlcmF0b3InKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvd2ViLmRvbS5pdGVyYWJsZScpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYubWFwJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNy5tYXAudG8tanNvbicpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczcubWFwLm9mJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNy5tYXAuZnJvbScpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9tb2R1bGVzL19jb3JlJykuTWFwO1xuIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY29yZS1qcy9saWJyYXJ5L2ZuL21hcFwiKTsiLCIndXNlIHN0cmljdCc7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgaW52b2tlID0gcmVxdWlyZSgnLi9faW52b2tlJyk7XG52YXIgYXJyYXlTbGljZSA9IFtdLnNsaWNlO1xudmFyIGZhY3RvcmllcyA9IHt9O1xuXG52YXIgY29uc3RydWN0ID0gZnVuY3Rpb24gKEYsIGxlbiwgYXJncykge1xuICBpZiAoIShsZW4gaW4gZmFjdG9yaWVzKSkge1xuICAgIGZvciAodmFyIG4gPSBbXSwgaSA9IDA7IGkgPCBsZW47IGkrKykgbltpXSA9ICdhWycgKyBpICsgJ10nO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXctZnVuY1xuICAgIGZhY3Rvcmllc1tsZW5dID0gRnVuY3Rpb24oJ0YsYScsICdyZXR1cm4gbmV3IEYoJyArIG4uam9pbignLCcpICsgJyknKTtcbiAgfSByZXR1cm4gZmFjdG9yaWVzW2xlbl0oRiwgYXJncyk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEZ1bmN0aW9uLmJpbmQgfHwgZnVuY3Rpb24gYmluZCh0aGF0IC8qICwgLi4uYXJncyAqLykge1xuICB2YXIgZm4gPSBhRnVuY3Rpb24odGhpcyk7XG4gIHZhciBwYXJ0QXJncyA9IGFycmF5U2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuICB2YXIgYm91bmQgPSBmdW5jdGlvbiAoLyogYXJncy4uLiAqLykge1xuICAgIHZhciBhcmdzID0gcGFydEFyZ3MuY29uY2F0KGFycmF5U2xpY2UuY2FsbChhcmd1bWVudHMpKTtcbiAgICByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIGJvdW5kID8gY29uc3RydWN0KGZuLCBhcmdzLmxlbmd0aCwgYXJncykgOiBpbnZva2UoZm4sIGFyZ3MsIHRoYXQpO1xuICB9O1xuICBpZiAoaXNPYmplY3QoZm4ucHJvdG90eXBlKSkgYm91bmQucHJvdG90eXBlID0gZm4ucHJvdG90eXBlO1xuICByZXR1cm4gYm91bmQ7XG59O1xuIiwiLy8gMjYuMS4yIFJlZmxlY3QuY29uc3RydWN0KHRhcmdldCwgYXJndW1lbnRzTGlzdCBbLCBuZXdUYXJnZXRdKVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBjcmVhdGUgPSByZXF1aXJlKCcuL19vYmplY3QtY3JlYXRlJyk7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4vX2ZhaWxzJyk7XG52YXIgYmluZCA9IHJlcXVpcmUoJy4vX2JpbmQnKTtcbnZhciByQ29uc3RydWN0ID0gKHJlcXVpcmUoJy4vX2dsb2JhbCcpLlJlZmxlY3QgfHwge30pLmNvbnN0cnVjdDtcblxuLy8gTVMgRWRnZSBzdXBwb3J0cyBvbmx5IDIgYXJndW1lbnRzIGFuZCBhcmd1bWVudHNMaXN0IGFyZ3VtZW50IGlzIG9wdGlvbmFsXG4vLyBGRiBOaWdodGx5IHNldHMgdGhpcmQgYXJndW1lbnQgYXMgYG5ldy50YXJnZXRgLCBidXQgZG9lcyBub3QgY3JlYXRlIGB0aGlzYCBmcm9tIGl0XG52YXIgTkVXX1RBUkdFVF9CVUcgPSBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEYoKSB7IC8qIGVtcHR5ICovIH1cbiAgcmV0dXJuICEockNvbnN0cnVjdChmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH0sIFtdLCBGKSBpbnN0YW5jZW9mIEYpO1xufSk7XG52YXIgQVJHU19CVUcgPSAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICByQ29uc3RydWN0KGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfSk7XG59KTtcblxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAoTkVXX1RBUkdFVF9CVUcgfHwgQVJHU19CVUcpLCAnUmVmbGVjdCcsIHtcbiAgY29uc3RydWN0OiBmdW5jdGlvbiBjb25zdHJ1Y3QoVGFyZ2V0LCBhcmdzIC8qICwgbmV3VGFyZ2V0ICovKSB7XG4gICAgYUZ1bmN0aW9uKFRhcmdldCk7XG4gICAgYW5PYmplY3QoYXJncyk7XG4gICAgdmFyIG5ld1RhcmdldCA9IGFyZ3VtZW50cy5sZW5ndGggPCAzID8gVGFyZ2V0IDogYUZ1bmN0aW9uKGFyZ3VtZW50c1syXSk7XG4gICAgaWYgKEFSR1NfQlVHICYmICFORVdfVEFSR0VUX0JVRykgcmV0dXJuIHJDb25zdHJ1Y3QoVGFyZ2V0LCBhcmdzLCBuZXdUYXJnZXQpO1xuICAgIGlmIChUYXJnZXQgPT0gbmV3VGFyZ2V0KSB7XG4gICAgICAvLyB3L28gYWx0ZXJlZCBuZXdUYXJnZXQsIG9wdGltaXphdGlvbiBmb3IgMC00IGFyZ3VtZW50c1xuICAgICAgc3dpdGNoIChhcmdzLmxlbmd0aCkge1xuICAgICAgICBjYXNlIDA6IHJldHVybiBuZXcgVGFyZ2V0KCk7XG4gICAgICAgIGNhc2UgMTogcmV0dXJuIG5ldyBUYXJnZXQoYXJnc1swXSk7XG4gICAgICAgIGNhc2UgMjogcmV0dXJuIG5ldyBUYXJnZXQoYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgICAgIGNhc2UgMzogcmV0dXJuIG5ldyBUYXJnZXQoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7XG4gICAgICAgIGNhc2UgNDogcmV0dXJuIG5ldyBUYXJnZXQoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSk7XG4gICAgICB9XG4gICAgICAvLyB3L28gYWx0ZXJlZCBuZXdUYXJnZXQsIGxvdCBvZiBhcmd1bWVudHMgY2FzZVxuICAgICAgdmFyICRhcmdzID0gW251bGxdO1xuICAgICAgJGFyZ3MucHVzaC5hcHBseSgkYXJncywgYXJncyk7XG4gICAgICByZXR1cm4gbmV3IChiaW5kLmFwcGx5KFRhcmdldCwgJGFyZ3MpKSgpO1xuICAgIH1cbiAgICAvLyB3aXRoIGFsdGVyZWQgbmV3VGFyZ2V0LCBub3Qgc3VwcG9ydCBidWlsdC1pbiBjb25zdHJ1Y3RvcnNcbiAgICB2YXIgcHJvdG8gPSBuZXdUYXJnZXQucHJvdG90eXBlO1xuICAgIHZhciBpbnN0YW5jZSA9IGNyZWF0ZShpc09iamVjdChwcm90bykgPyBwcm90byA6IE9iamVjdC5wcm90b3R5cGUpO1xuICAgIHZhciByZXN1bHQgPSBGdW5jdGlvbi5hcHBseS5jYWxsKFRhcmdldCwgaW5zdGFuY2UsIGFyZ3MpO1xuICAgIHJldHVybiBpc09iamVjdChyZXN1bHQpID8gcmVzdWx0IDogaW5zdGFuY2U7XG4gIH1cbn0pO1xuIiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lczYucmVmbGVjdC5jb25zdHJ1Y3QnKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9fY29yZScpLlJlZmxlY3QuY29uc3RydWN0O1xuIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY29yZS1qcy9saWJyYXJ5L2ZuL3JlZmxlY3QvY29uc3RydWN0XCIpOyIsInZhciBfUmVmbGVjdCRjb25zdHJ1Y3QgPSByZXF1aXJlKFwiLi4vY29yZS1qcy9yZWZsZWN0L2NvbnN0cnVjdFwiKTtcblxudmFyIHNldFByb3RvdHlwZU9mID0gcmVxdWlyZShcIi4vc2V0UHJvdG90eXBlT2ZcIik7XG5cbmZ1bmN0aW9uIF9jb25zdHJ1Y3QoUGFyZW50LCBhcmdzLCBDbGFzcykge1xuICBpZiAodHlwZW9mIFJlZmxlY3QgIT09IFwidW5kZWZpbmVkXCIgJiYgX1JlZmxlY3QkY29uc3RydWN0KSB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBfY29uc3RydWN0ID0gX1JlZmxlY3QkY29uc3RydWN0O1xuICB9IGVsc2Uge1xuICAgIG1vZHVsZS5leHBvcnRzID0gX2NvbnN0cnVjdCA9IGZ1bmN0aW9uIF9jb25zdHJ1Y3QoUGFyZW50LCBhcmdzLCBDbGFzcykge1xuICAgICAgdmFyIGEgPSBbbnVsbF07XG4gICAgICBhLnB1c2guYXBwbHkoYSwgYXJncyk7XG4gICAgICB2YXIgQ29uc3RydWN0b3IgPSBQYXJlbnQuYmluZC5hcHBseShQYXJlbnQsIGEpO1xuICAgICAgdmFyIGluc3RhbmNlID0gbmV3IENvbnN0cnVjdG9yKCk7XG4gICAgICBpZiAoQ2xhc3MpIHNldFByb3RvdHlwZU9mKGluc3RhbmNlLCBDbGFzcy5wcm90b3R5cGUpO1xuICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgIH07XG4gIH1cblxuICByZXR1cm4gX2NvbnN0cnVjdC5hcHBseShudWxsLCBhcmd1bWVudHMpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9jb25zdHJ1Y3Q7IiwidmFyIF9PYmplY3QkY3JlYXRlID0gcmVxdWlyZShcIi4uL2NvcmUtanMvb2JqZWN0L2NyZWF0ZVwiKTtcblxudmFyIF9NYXAgPSByZXF1aXJlKFwiLi4vY29yZS1qcy9tYXBcIik7XG5cbnZhciBnZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoXCIuL2dldFByb3RvdHlwZU9mXCIpO1xuXG52YXIgc2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKFwiLi9zZXRQcm90b3R5cGVPZlwiKTtcblxudmFyIGNvbnN0cnVjdCA9IHJlcXVpcmUoXCIuL2NvbnN0cnVjdFwiKTtcblxuZnVuY3Rpb24gX3dyYXBOYXRpdmVTdXBlcihDbGFzcykge1xuICB2YXIgX2NhY2hlID0gdHlwZW9mIF9NYXAgPT09IFwiZnVuY3Rpb25cIiA/IG5ldyBfTWFwKCkgOiB1bmRlZmluZWQ7XG5cbiAgbW9kdWxlLmV4cG9ydHMgPSBfd3JhcE5hdGl2ZVN1cGVyID0gZnVuY3Rpb24gX3dyYXBOYXRpdmVTdXBlcihDbGFzcykge1xuICAgIGlmICh0eXBlb2YgQ2xhc3MgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uXCIpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgX2NhY2hlICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBpZiAoX2NhY2hlLmhhcyhDbGFzcykpIHJldHVybiBfY2FjaGUuZ2V0KENsYXNzKTtcblxuICAgICAgX2NhY2hlLnNldChDbGFzcywgV3JhcHBlcik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gV3JhcHBlcigpIHt9XG5cbiAgICBXcmFwcGVyLnByb3RvdHlwZSA9IF9PYmplY3QkY3JlYXRlKENsYXNzLnByb3RvdHlwZSwge1xuICAgICAgY29uc3RydWN0b3I6IHtcbiAgICAgICAgdmFsdWU6IFdyYXBwZXIsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHNldFByb3RvdHlwZU9mKFdyYXBwZXIsIHNldFByb3RvdHlwZU9mKGZ1bmN0aW9uIFN1cGVyKCkge1xuICAgICAgcmV0dXJuIGNvbnN0cnVjdChDbGFzcywgYXJndW1lbnRzLCBnZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3Rvcik7XG4gICAgfSwgQ2xhc3MpKTtcbiAgfTtcblxuICByZXR1cm4gX3dyYXBOYXRpdmVTdXBlcihDbGFzcyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX3dyYXBOYXRpdmVTdXBlcjsiLCJleHBvcnQgY2xhc3MgQ29tcG9zaXRpb25FcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IoY2xhc3NJbnN0YW5jZSwgbWVzc2FnZSwgY29tcG9uZW50KSB7XG4gICAgc3VwZXIoYEAke2NsYXNzSW5zdGFuY2V9OiAke21lc3NhZ2V9YCk7XG5cbiAgICBjb25zdCBzdGFja0FycmF5ID0gdGhpcy5zdGFjay5zcGxpdCgnXFxuJyk7XG4gICAgc3RhY2tBcnJheS5zcGxpY2UoMSwgMik7XG5cbiAgICB0aGlzLnN0YWNrID0gc3RhY2tBcnJheS5qb2luKCdcXG4nKTtcblxuICAgIGlmIChjb25zb2xlKSBjb25zb2xlLmVycm9yKCdDb21wb25lbnQ6JywgY29tcG9uZW50KTtcblxuICAgIHRoaXMubmFtZSA9ICdDb21wb3NpdGlvbkVycm9yJztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRGVwZW5kZW5jeUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihjbGFzc0luc3RhbmNlLCBtZXNzYWdlLCBhY3RpdmVNb2R1bGUsIGRlcGVuZGVuY3lNb2R1bGUgPSBmYWxzZSkge1xuICAgIHN1cGVyKGBAJHtjbGFzc0luc3RhbmNlfTogJHttZXNzYWdlfWApO1xuXG4gICAgY29uc3Qgc3RhY2tBcnJheSA9IHRoaXMuc3RhY2suc3BsaXQoJ1xcbicpO1xuICAgIHN0YWNrQXJyYXkuc3BsaWNlKDEsIDIpO1xuXG4gICAgdGhpcy5zdGFjayA9IHN0YWNrQXJyYXkuam9pbignXFxuJyk7XG5cbiAgICBpZiAoY29uc29sZSkgY29uc29sZS5lcnJvcignQWN0aXZlIG1vZHVsZTonLCBhY3RpdmVNb2R1bGUpO1xuICAgIGlmIChjb25zb2xlICYmIGRlcGVuZGVuY3lNb2R1bGUpIGNvbnNvbGUuZXJyb3IoJ0RlcGVuZGVuY3kgcHVibGlzaGVkIGJ5IG1vZHVsZTonLCBkZXBlbmRlbmN5TW9kdWxlKTtcblxuICAgIHRoaXMubmFtZSA9ICdEZXBlbmRlbmN5RXJyb3InO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBNYW5hZ2VyRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKGNsYXNzSW5zdGFuY2UsIG1lc3NhZ2UsIGNvbXBvbmVudCwgYWN0aXZlTW9kdWxlID0gZmFsc2UpIHtcbiAgICBzdXBlcihgQCR7Y2xhc3NJbnN0YW5jZX06ICR7bWVzc2FnZX1gKTtcblxuICAgIGNvbnN0IHN0YWNrQXJyYXkgPSB0aGlzLnN0YWNrLnNwbGl0KCdcXG4nKTtcbiAgICBzdGFja0FycmF5LnNwbGljZSgxLCAyKTtcblxuICAgIHRoaXMuc3RhY2sgPSBzdGFja0FycmF5LmpvaW4oJ1xcbicpO1xuXG4gICAgaWYgKGNvbnNvbGUpIGNvbnNvbGUuZXJyb3IoJ0NvbXBvbmVudDonLCBjb21wb25lbnQpO1xuICAgIGlmIChjb25zb2xlICYmIGFjdGl2ZU1vZHVsZSkgY29uc29sZS5lcnJvcignQWN0aXZlIG1vZHVsZTonLCBhY3RpdmVNb2R1bGUpO1xuXG4gICAgdGhpcy5uYW1lID0gJ01hbmFnZXJFcnJvcic7XG4gIH1cbn1cbiIsImltcG9ydCB7UkVWSVNJT059IGZyb20gJ3RocmVlJztcbmltcG9ydCBFdmVudHMgZnJvbSAnbWluaXZlbnRzJztcbmltcG9ydCB7TWFuYWdlckVycm9yfSBmcm9tICcuL2Vycm9ycyc7XG5cbi8vIENoZWNrIGZvciBUaHJlZS5qc1xuY29uc3Qgd2FybkRlcHMgPSAoKSA9PiB7XG4gIHRocm93IG5ldyBFcnJvcignV2hpdGVzdG9ybUpTIEZyYW1ld29yayByZXF1IGlyZXMgVGhyZWUuanMgcjkyLiBodHRwczovL3RocmVlanMub3JnLycpO1xufTtcblxudHJ5IHtcbiAgaWYgKCFSRVZJU0lPTikgd2FybkRlcHMoKTtcbn0gY2F0Y2ggKGVycikge1xuICB3YXJuRGVwcygpO1xufVxuXG4vKipcbiAqIEBjbGFzcyBNb2R1bGVTeXN0ZW1cbiAqIEBjYXRlZ29yeSBjb3JlXG4gKiBAZGVzY3JpcHRpb24gIFByb3ZpZGVzIEFQSSBmb3IgY2xhc3NlcyB0aGF0IHdpbGwgdXNlIE1vZHVsZXMuPGJyLz5cbiAqIFRoaXMgY2xhc3MgaW5jbHVkZXMgYmFzaWMgZXZlbnQgc3lzdGVtIHdpdGggdGhvc2Ugc3VwcG9ydGVkIG1ldGhvZHM6XG4gKiA8cHJlPi5vbigpPC9wcmU+PHByZT4ub2ZmKCk8L3ByZT48cHJlPi5lbWl0KCk8L3ByZT5cbiAqIEBleHRlbmRzIEV2ZW50c1xuICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlXG4gKi9cbmV4cG9ydCBjbGFzcyBNb2R1bGVTeXN0ZW0gZXh0ZW5kcyBFdmVudHMge1xuICAvLyBJTlRFR1JBVElOR1xuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGludGVncmF0ZU1vZHVsZXNcbiAgICogQGluc3RhbmNlXG4gICAqIEBkZXNjcmlwdGlvbiBUaGlzIG1ldGhvZCBhcHBsaWVzIGFsbCBtb2R1bGVzIGZyb20gLm1vZHVsZXMgY29sbGVjdGlvbi5cbiAgICogQHBhcmFtIHtPYmplY3R9IFtzb3VyY2VdIElmIHNvdXJjZSAoc2hvdWxkIGJlIGEgY29tcG9uZW50KSBpcyBwcm92aWRlZCwgd2lsbCByZXBsYWNlIC5tb2R1bGVzIHdpdGggc291cmNlJ3Mgb25lIGJlZm9yZSBleGVjdXRpbmcgbW9kdWxlcy5cbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLk1vZHVsZVN5c3RlbVxuICAgKi9cbiAgaW50ZWdyYXRlTW9kdWxlcyhzb3VyY2UpIHtcbiAgICBpZiAoIXRoaXMubW9kdWxlcyAmJiAhc291cmNlKSByZXR1cm47XG4gICAgaWYgKHNvdXJjZSAmJiBzb3VyY2UubW9kdWxlcykgdGhpcy5tb2R1bGVzID0gc291cmNlLm1vZHVsZXMuc2xpY2UoMCk7XG5cbiAgICBpZiAodGhpcy5tb2R1bGVzKSB7XG4gICAgICBmb3IgKGxldCBpID0gMCwgbWF4ID0gdGhpcy5tb2R1bGVzLmxlbmd0aDsgaSA8IG1heDsgaSsrKVxuICAgICAgICB0aGlzLmFwcGx5TW9kdWxlKHRoaXMubW9kdWxlc1tpXSwgZmFsc2UpO1xuICAgIH1cblxuICAgIGlmIChzb3VyY2UpIHRoaXMuYXBwbHlCcmlkZ2Uoe29uQ29weTogc291cmNlfSk7XG4gIH1cblxuICAvLyBBUFBMWUlORyBNT0RVTEUgKC4uLmFuZCBhIFwiYnJpZGdlXCIgZm9yIG1vZHVsZSlcblxuICAvKipcbiAgICogQG1ldGhvZCBhcHBseUJyaWRnZVxuICAgKiBAaW5zdGFuY2VcbiAgICogQGRlc2NyaXB0aW9uIE1ha2VzIGNvbXBvbmVudC1zcGVjaWZpYyBBUEkgdG8gd29yayB3aXRoIG1vZHVsZXMuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBicmlkZ2VNYXBcbiAgICogQHJldHVybiB7T2JqZWN0fSBSZXR1cm5zIG9iamVjdCB3aXRoIG1vZGlmaWVkIHZhbHVlcy5cbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLk1vZHVsZVN5c3RlbVxuICAgKi9cbiAgYXBwbHlCcmlkZ2UoYnJpZGdlTWFwID0ge30pIHtcbiAgICBjb25zdCB7bW9kdWxlc30gPSB0aGlzO1xuICAgIGlmICghbW9kdWxlcykgcmV0dXJuIGJyaWRnZU1hcDtcblxuICAgIGZvciAobGV0IGkgPSAwLCBtYXggPSBtb2R1bGVzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBicmlkZ2VNYXApIHtcbiAgICAgICAgaWYgKGJyaWRnZU1hcFtrZXldKSB7XG4gICAgICAgICAgY29uc3QgbW9kdWxlID0gbW9kdWxlc1tpXTtcblxuICAgICAgICAgIGlmIChtb2R1bGUgJiYgbW9kdWxlLmJyaWRnZSAmJiBtb2R1bGUuYnJpZGdlW2tleV0pXG4gICAgICAgICAgICBicmlkZ2VNYXBba2V5XSA9IG1vZHVsZS5icmlkZ2Vba2V5XS5hcHBseSh0aGlzLCBbYnJpZGdlTWFwW2tleV0sIG1vZHVsZV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGJyaWRnZU1hcDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGFwcGx5Q29tbWFuZFxuICAgKiBAaW5zdGFuY2VcbiAgICogQGRlc2NyaXB0aW9uIC5hcHBseUNvbW1hbmQgcnVucyBhIG1ldGhvZCBjYWxsZWQgYG5hbWVgIG9uIGFsbCBtb2R1bGVzLlxuICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZSB0aGUgbWV0aG9kIG5hbWUuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjYj0oZnVuYywgbW9kdWxlU2NvcGUpID0+IGZ1bmMuYXBwbHkodGhpcywgW21vZHVsZVNjb3BlXSldIEhvdyB0aGUgZnVuY3Rpb24gaXMgd3JhcHBlZC9cbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLk1vZHVsZVN5c3RlbVxuICAgKi9cbiAgYXBwbHlDb21tYW5kKG5hbWUsIGNiID0gKGZ1bmMsIG1vZHVsZVNjb3BlKSA9PiBmdW5jLmFwcGx5KHRoaXMsIFttb2R1bGVTY29wZV0pKSB7XG4gICAgY29uc3Qge21vZHVsZXN9ID0gdGhpcztcbiAgICBpZiAoIW1vZHVsZXMpIHJldHVybjtcblxuICAgIGZvciAobGV0IGkgPSAwLCBtYXggPSBtb2R1bGVzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7XG4gICAgICBjb25zdCBtb2R1bGUgPSBtb2R1bGVzW2ldO1xuICAgICAgaWYgKG5hbWUgaW4gbW9kdWxlKSBjYihtb2R1bGVbbmFtZV0sIG1vZHVsZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgYXBwbHlNb2R1bGVcbiAgICogQGluc3RhbmNlXG4gICAqIEBkZXNjcmlwdGlvbiAuYXBwbHlNb2R1bGUgaXMgYWxzbyB1c2VkIGluIC5pbnRlZ3JhdGVNb2R1bGVzKCkgZnVuY3Rpb24uXG4gICAqIEl0IGRvZXMgZXhhY3RseSB3aGF0IGl0cyBuYW1lIHNheXMgKGFwcGxpZXMgbW9kdWxlIHRvIGNvbXBvbmVudCBvciBhcHApLlxuICAgKiBAcGFyYW0ge09iamVjdH0gbW9kdWxlIHRoZSBtb2R1bGUgdG8gYXBwbHlcbiAgICogQHBhcmFtIHtCb29sZWFufSBbcHVzaD10cnVlXVxuICAgKiBAcmV0dXJuIHtPYmplY3R9IFJldHVybnMgbW9kdWxlIHRoYXQgd2FzIGFwcGxpZWQuXG4gICAqIEB0aHJvd3Mge01hbmFnZXJFcnJvcn1cbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLk1vZHVsZVN5c3RlbVxuICAgKi9cbiAgYXBwbHlNb2R1bGUobW9kdWxlLCBwdXNoID0gdHJ1ZSkge1xuICAgIGlmICghbW9kdWxlKSByZXR1cm47XG4gICAgaWYgKHB1c2ggJiYgdGhpcy5tb2R1bGVzKSB0aGlzLm1vZHVsZXMucHVzaChtb2R1bGUpO1xuICAgIGVsc2UgaWYgKHB1c2gpIHRoaXMubW9kdWxlcyA9IFttb2R1bGVdO1xuXG4gICAgaWYgKHRoaXMubWFuYWdlcikgdGhpcy5tYW5hZ2VyLmFjdGl2ZShtb2R1bGUpO1xuXG4gICAgaWYgKG1vZHVsZS5tYW5hZ2VyICYmIHRoaXMubWFuYWdlcikgbW9kdWxlLm1hbmFnZXIodGhpcy5tYW5hZ2VyKTtcbiAgICBlbHNlIGlmIChtb2R1bGUubWFuYWdlcikge1xuICAgICAgdGhyb3cgbmV3IE1hbmFnZXJFcnJvcihcbiAgICAgICAgJ0NvbXBvbmVudCcsXG4gICAgICAgIGBNb2R1bGUgcmVxdWlyZXMgTW9kdWxlTWFuYWdlciB0aGF0IGlzIHR1cm5lZCBvZmYgZm9yIHRoaXMgY29tcG9uZW50YCxcbiAgICAgICAgdGhpcywgbW9kdWxlXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChtb2R1bGUuaW50ZWdyYXRlKSBtb2R1bGUuaW50ZWdyYXRlLmJpbmQodGhpcykobW9kdWxlKTtcblxuICAgIHJldHVybiBtb2R1bGU7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBkaXNwb3NlTW9kdWxlc1xuICAgKiBAaW5zdGFuY2VcbiAgICogQGRlc2NyaXB0aW9uIERpc3Bvc2VzIG9mIGFsbCBtb2R1bGVzXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZS5Nb2R1bGVTeXN0ZW1cbiAgICovXG4gIGRpc3Bvc2VNb2R1bGVzKCkge1xuICAgIHdoaWxlICh0aGlzLm1vZHVsZXMubGVuZ3RoKVxuICAgICAgdGhpcy5kaXNwb3NlTW9kdWxlKHRoaXMubW9kdWxlc1swXSk7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBkaXNwb3NlTW9kdWxlXG4gICAqIEBpbnN0YW5jZVxuICAgKiBAZGVzY3JpcHRpb24gRGlzcG9zZXMgb2YgdGhlIGdpdmVuIG1vZHVsZVxuICAgKiBAcGFyYW0ge09iamVjdH0gbW9kdWxlIHRoZSBtb2R1bGUgdG8gZGlzcG9zZVxuICAgKiBAcmV0dXJuIHtNb2R1bGV9IFJldHVybnMgbW9kdWxlIHRoYXQgd2FzIHJlbW92ZWQuXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZS5Nb2R1bGVTeXN0ZW1cbiAgICovXG4gIGRpc3Bvc2VNb2R1bGUobW9kdWxlKSB7XG4gICAgaWYgKCFtb2R1bGUpIHJldHVybjtcblxuICAgIHRoaXMubW9kdWxlcy5zcGxpY2UodGhpcy5tb2R1bGVzLmluZGV4T2YobW9kdWxlKSwgMSk7XG5cbiAgICBpZiAobW9kdWxlLmRpc3Bvc2UpIG1vZHVsZS5kaXNwb3NlLmJpbmQodGhpcykobW9kdWxlKTtcblxuICAgIHJldHVybiBtb2R1bGU7XG4gIH1cblxuICAvLyBQSVBFRCBNRVRIT0RcblxuICAvKipcbiAgICogQG1ldGhvZCBtb2R1bGVcbiAgICogQGluc3RhbmNlXG4gICAqIEBkZXNjcmlwdGlvbiBwaXBlZCB2ZXJzaW9uIG9mIC5hcHBseU1vZHVsZSgpLlxuICAgKiBAcGFyYW0ge09iamVjdH0gbW9kdWxlIHRoZSBtb2R1bGUgdG8gYXBwbHlcbiAgICogQHJldHVybiB7dGhpc30gcmV0dXJucyB0aGlzIC0gYXBwL2NvbXBvbmVudFxuICAgKiBAdGhyb3dzIHtNYW5hZ2VyRXJyb3J9XG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZS5Nb2R1bGVTeXN0ZW1cbiAgICogQGV4YW1wbGUgPGNhcHRpb24+UGlwZWQgbW9kdWxlczwvY2FwdGlvbj5cbiAgICogY29tcG9uZW50XG4gICAqICAgLm1vZHVsZShuZXcgTW9kdWxlMSgpKVxuICAgKiAgIC5tb2R1bGUobmV3IE1vZHVsZTIoKSlcbiAgICogICAubW9kdWxlKG5ldyBNb2R1bGUzKCkpXG4gICAqL1xuICBtb2R1bGUobW9kdWxlKSB7XG4gICAgdGhpcy5hcHBseU1vZHVsZShtb2R1bGUpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG59XG4iLCJmdW5jdGlvbiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGFycikpIHJldHVybiBhcnI7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2FycmF5V2l0aEhvbGVzOyIsInZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIGdldCA9IHJlcXVpcmUoJy4vY29yZS5nZXQtaXRlcmF0b3ItbWV0aG9kJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2NvcmUnKS5nZXRJdGVyYXRvciA9IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgaXRlckZuID0gZ2V0KGl0KTtcbiAgaWYgKHR5cGVvZiBpdGVyRm4gIT0gJ2Z1bmN0aW9uJykgdGhyb3cgVHlwZUVycm9yKGl0ICsgJyBpcyBub3QgaXRlcmFibGUhJyk7XG4gIHJldHVybiBhbk9iamVjdChpdGVyRm4uY2FsbChpdCkpO1xufTtcbiIsInJlcXVpcmUoJy4uL21vZHVsZXMvd2ViLmRvbS5pdGVyYWJsZScpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYuc3RyaW5nLml0ZXJhdG9yJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL21vZHVsZXMvY29yZS5nZXQtaXRlcmF0b3InKTtcbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMvbGlicmFyeS9mbi9nZXQtaXRlcmF0b3JcIik7IiwidmFyIF9nZXRJdGVyYXRvciA9IHJlcXVpcmUoXCIuLi9jb3JlLWpzL2dldC1pdGVyYXRvclwiKTtcblxuZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheUxpbWl0KGFyciwgaSkge1xuICB2YXIgX2FyciA9IFtdO1xuICB2YXIgX24gPSB0cnVlO1xuICB2YXIgX2QgPSBmYWxzZTtcbiAgdmFyIF9lID0gdW5kZWZpbmVkO1xuXG4gIHRyeSB7XG4gICAgZm9yICh2YXIgX2kgPSBfZ2V0SXRlcmF0b3IoYXJyKSwgX3M7ICEoX24gPSAoX3MgPSBfaS5uZXh0KCkpLmRvbmUpOyBfbiA9IHRydWUpIHtcbiAgICAgIF9hcnIucHVzaChfcy52YWx1ZSk7XG5cbiAgICAgIGlmIChpICYmIF9hcnIubGVuZ3RoID09PSBpKSBicmVhaztcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIF9kID0gdHJ1ZTtcbiAgICBfZSA9IGVycjtcbiAgfSBmaW5hbGx5IHtcbiAgICB0cnkge1xuICAgICAgaWYgKCFfbiAmJiBfaVtcInJldHVyblwiXSAhPSBudWxsKSBfaVtcInJldHVyblwiXSgpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAoX2QpIHRocm93IF9lO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBfYXJyO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9pdGVyYWJsZVRvQXJyYXlMaW1pdDsiLCJmdW5jdGlvbiBfbm9uSXRlcmFibGVSZXN0KCkge1xuICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZVwiKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfbm9uSXRlcmFibGVSZXN0OyIsInZhciBhcnJheVdpdGhIb2xlcyA9IHJlcXVpcmUoXCIuL2FycmF5V2l0aEhvbGVzXCIpO1xuXG52YXIgaXRlcmFibGVUb0FycmF5TGltaXQgPSByZXF1aXJlKFwiLi9pdGVyYWJsZVRvQXJyYXlMaW1pdFwiKTtcblxudmFyIG5vbkl0ZXJhYmxlUmVzdCA9IHJlcXVpcmUoXCIuL25vbkl0ZXJhYmxlUmVzdFwiKTtcblxuZnVuY3Rpb24gX3NsaWNlZFRvQXJyYXkoYXJyLCBpKSB7XG4gIHJldHVybiBhcnJheVdpdGhIb2xlcyhhcnIpIHx8IGl0ZXJhYmxlVG9BcnJheUxpbWl0KGFyciwgaSkgfHwgbm9uSXRlcmFibGVSZXN0KCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX3NsaWNlZFRvQXJyYXk7IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc3ltYm9sT2JzZXJ2YWJsZVBvbnlmaWxsKHJvb3QpIHtcblx0dmFyIHJlc3VsdDtcblx0dmFyIFN5bWJvbCA9IHJvb3QuU3ltYm9sO1xuXG5cdGlmICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0aWYgKFN5bWJvbC5vYnNlcnZhYmxlKSB7XG5cdFx0XHRyZXN1bHQgPSBTeW1ib2wub2JzZXJ2YWJsZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmVzdWx0ID0gU3ltYm9sKCdvYnNlcnZhYmxlJyk7XG5cdFx0XHRTeW1ib2wub2JzZXJ2YWJsZSA9IHJlc3VsdDtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0cmVzdWx0ID0gJ0BAb2JzZXJ2YWJsZSc7XG5cdH1cblxuXHRyZXR1cm4gcmVzdWx0O1xufTtcbiIsIi8qIGdsb2JhbCB3aW5kb3cgKi9cbmltcG9ydCBwb255ZmlsbCBmcm9tICcuL3BvbnlmaWxsLmpzJztcblxudmFyIHJvb3Q7XG5cbmlmICh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgcm9vdCA9IHNlbGY7XG59IGVsc2UgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gIHJvb3QgPSB3aW5kb3c7XG59IGVsc2UgaWYgKHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnKSB7XG4gIHJvb3QgPSBnbG9iYWw7XG59IGVsc2UgaWYgKHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnKSB7XG4gIHJvb3QgPSBtb2R1bGU7XG59IGVsc2Uge1xuICByb290ID0gRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcbn1cblxudmFyIHJlc3VsdCA9IHBvbnlmaWxsKHJvb3QpO1xuZXhwb3J0IGRlZmF1bHQgcmVzdWx0O1xuIiwiaW1wb3J0ICQkb2JzZXJ2YWJsZSBmcm9tICdzeW1ib2wtb2JzZXJ2YWJsZSc7XG5cbi8qKlxuICogVGhlc2UgYXJlIHByaXZhdGUgYWN0aW9uIHR5cGVzIHJlc2VydmVkIGJ5IFJlZHV4LlxuICogRm9yIGFueSB1bmtub3duIGFjdGlvbnMsIHlvdSBtdXN0IHJldHVybiB0aGUgY3VycmVudCBzdGF0ZS5cbiAqIElmIHRoZSBjdXJyZW50IHN0YXRlIGlzIHVuZGVmaW5lZCwgeW91IG11c3QgcmV0dXJuIHRoZSBpbml0aWFsIHN0YXRlLlxuICogRG8gbm90IHJlZmVyZW5jZSB0aGVzZSBhY3Rpb24gdHlwZXMgZGlyZWN0bHkgaW4geW91ciBjb2RlLlxuICovXG52YXIgQWN0aW9uVHlwZXMgPSB7XG4gIElOSVQ6ICdAQHJlZHV4L0lOSVQnICsgTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDcpLnNwbGl0KCcnKS5qb2luKCcuJyksXG4gIFJFUExBQ0U6ICdAQHJlZHV4L1JFUExBQ0UnICsgTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDcpLnNwbGl0KCcnKS5qb2luKCcuJylcbn07XG5cbnZhciBfdHlwZW9mID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIgPyBmdW5jdGlvbiAob2JqKSB7XG4gIHJldHVybiB0eXBlb2Ygb2JqO1xufSA6IGZ1bmN0aW9uIChvYmopIHtcbiAgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7XG59O1xuXG52YXIgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldO1xuXG4gICAgZm9yICh2YXIga2V5IGluIHNvdXJjZSkge1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHtcbiAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge2FueX0gb2JqIFRoZSBvYmplY3QgdG8gaW5zcGVjdC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSBhcmd1bWVudCBhcHBlYXJzIHRvIGJlIGEgcGxhaW4gb2JqZWN0LlxuICovXG5mdW5jdGlvbiBpc1BsYWluT2JqZWN0KG9iaikge1xuICBpZiAoKHR5cGVvZiBvYmogPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBfdHlwZW9mKG9iaikpICE9PSAnb2JqZWN0JyB8fCBvYmogPT09IG51bGwpIHJldHVybiBmYWxzZTtcblxuICB2YXIgcHJvdG8gPSBvYmo7XG4gIHdoaWxlIChPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pICE9PSBudWxsKSB7XG4gICAgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pO1xuICB9XG5cbiAgcmV0dXJuIE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopID09PSBwcm90bztcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgUmVkdXggc3RvcmUgdGhhdCBob2xkcyB0aGUgc3RhdGUgdHJlZS5cbiAqIFRoZSBvbmx5IHdheSB0byBjaGFuZ2UgdGhlIGRhdGEgaW4gdGhlIHN0b3JlIGlzIHRvIGNhbGwgYGRpc3BhdGNoKClgIG9uIGl0LlxuICpcbiAqIFRoZXJlIHNob3VsZCBvbmx5IGJlIGEgc2luZ2xlIHN0b3JlIGluIHlvdXIgYXBwLiBUbyBzcGVjaWZ5IGhvdyBkaWZmZXJlbnRcbiAqIHBhcnRzIG9mIHRoZSBzdGF0ZSB0cmVlIHJlc3BvbmQgdG8gYWN0aW9ucywgeW91IG1heSBjb21iaW5lIHNldmVyYWwgcmVkdWNlcnNcbiAqIGludG8gYSBzaW5nbGUgcmVkdWNlciBmdW5jdGlvbiBieSB1c2luZyBgY29tYmluZVJlZHVjZXJzYC5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSByZWR1Y2VyIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBuZXh0IHN0YXRlIHRyZWUsIGdpdmVuXG4gKiB0aGUgY3VycmVudCBzdGF0ZSB0cmVlIGFuZCB0aGUgYWN0aW9uIHRvIGhhbmRsZS5cbiAqXG4gKiBAcGFyYW0ge2FueX0gW3ByZWxvYWRlZFN0YXRlXSBUaGUgaW5pdGlhbCBzdGF0ZS4gWW91IG1heSBvcHRpb25hbGx5IHNwZWNpZnkgaXRcbiAqIHRvIGh5ZHJhdGUgdGhlIHN0YXRlIGZyb20gdGhlIHNlcnZlciBpbiB1bml2ZXJzYWwgYXBwcywgb3IgdG8gcmVzdG9yZSBhXG4gKiBwcmV2aW91c2x5IHNlcmlhbGl6ZWQgdXNlciBzZXNzaW9uLlxuICogSWYgeW91IHVzZSBgY29tYmluZVJlZHVjZXJzYCB0byBwcm9kdWNlIHRoZSByb290IHJlZHVjZXIgZnVuY3Rpb24sIHRoaXMgbXVzdCBiZVxuICogYW4gb2JqZWN0IHdpdGggdGhlIHNhbWUgc2hhcGUgYXMgYGNvbWJpbmVSZWR1Y2Vyc2Aga2V5cy5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbZW5oYW5jZXJdIFRoZSBzdG9yZSBlbmhhbmNlci4gWW91IG1heSBvcHRpb25hbGx5IHNwZWNpZnkgaXRcbiAqIHRvIGVuaGFuY2UgdGhlIHN0b3JlIHdpdGggdGhpcmQtcGFydHkgY2FwYWJpbGl0aWVzIHN1Y2ggYXMgbWlkZGxld2FyZSxcbiAqIHRpbWUgdHJhdmVsLCBwZXJzaXN0ZW5jZSwgZXRjLiBUaGUgb25seSBzdG9yZSBlbmhhbmNlciB0aGF0IHNoaXBzIHdpdGggUmVkdXhcbiAqIGlzIGBhcHBseU1pZGRsZXdhcmUoKWAuXG4gKlxuICogQHJldHVybnMge1N0b3JlfSBBIFJlZHV4IHN0b3JlIHRoYXQgbGV0cyB5b3UgcmVhZCB0aGUgc3RhdGUsIGRpc3BhdGNoIGFjdGlvbnNcbiAqIGFuZCBzdWJzY3JpYmUgdG8gY2hhbmdlcy5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlU3RvcmUocmVkdWNlciwgcHJlbG9hZGVkU3RhdGUsIGVuaGFuY2VyKSB7XG4gIHZhciBfcmVmMjtcblxuICBpZiAodHlwZW9mIHByZWxvYWRlZFN0YXRlID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBlbmhhbmNlciA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBlbmhhbmNlciA9IHByZWxvYWRlZFN0YXRlO1xuICAgIHByZWxvYWRlZFN0YXRlID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBlbmhhbmNlciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBpZiAodHlwZW9mIGVuaGFuY2VyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHRoZSBlbmhhbmNlciB0byBiZSBhIGZ1bmN0aW9uLicpO1xuICAgIH1cblxuICAgIHJldHVybiBlbmhhbmNlcihjcmVhdGVTdG9yZSkocmVkdWNlciwgcHJlbG9hZGVkU3RhdGUpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiByZWR1Y2VyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCB0aGUgcmVkdWNlciB0byBiZSBhIGZ1bmN0aW9uLicpO1xuICB9XG5cbiAgdmFyIGN1cnJlbnRSZWR1Y2VyID0gcmVkdWNlcjtcbiAgdmFyIGN1cnJlbnRTdGF0ZSA9IHByZWxvYWRlZFN0YXRlO1xuICB2YXIgY3VycmVudExpc3RlbmVycyA9IFtdO1xuICB2YXIgbmV4dExpc3RlbmVycyA9IGN1cnJlbnRMaXN0ZW5lcnM7XG4gIHZhciBpc0Rpc3BhdGNoaW5nID0gZmFsc2U7XG5cbiAgZnVuY3Rpb24gZW5zdXJlQ2FuTXV0YXRlTmV4dExpc3RlbmVycygpIHtcbiAgICBpZiAobmV4dExpc3RlbmVycyA9PT0gY3VycmVudExpc3RlbmVycykge1xuICAgICAgbmV4dExpc3RlbmVycyA9IGN1cnJlbnRMaXN0ZW5lcnMuc2xpY2UoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgdGhlIHN0YXRlIHRyZWUgbWFuYWdlZCBieSB0aGUgc3RvcmUuXG4gICAqXG4gICAqIEByZXR1cm5zIHthbnl9IFRoZSBjdXJyZW50IHN0YXRlIHRyZWUgb2YgeW91ciBhcHBsaWNhdGlvbi5cbiAgICovXG4gIGZ1bmN0aW9uIGdldFN0YXRlKCkge1xuICAgIGlmIChpc0Rpc3BhdGNoaW5nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBtYXkgbm90IGNhbGwgc3RvcmUuZ2V0U3RhdGUoKSB3aGlsZSB0aGUgcmVkdWNlciBpcyBleGVjdXRpbmcuICcgKyAnVGhlIHJlZHVjZXIgaGFzIGFscmVhZHkgcmVjZWl2ZWQgdGhlIHN0YXRlIGFzIGFuIGFyZ3VtZW50LiAnICsgJ1Bhc3MgaXQgZG93biBmcm9tIHRoZSB0b3AgcmVkdWNlciBpbnN0ZWFkIG9mIHJlYWRpbmcgaXQgZnJvbSB0aGUgc3RvcmUuJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGN1cnJlbnRTdGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgY2hhbmdlIGxpc3RlbmVyLiBJdCB3aWxsIGJlIGNhbGxlZCBhbnkgdGltZSBhbiBhY3Rpb24gaXMgZGlzcGF0Y2hlZCxcbiAgICogYW5kIHNvbWUgcGFydCBvZiB0aGUgc3RhdGUgdHJlZSBtYXkgcG90ZW50aWFsbHkgaGF2ZSBjaGFuZ2VkLiBZb3UgbWF5IHRoZW5cbiAgICogY2FsbCBgZ2V0U3RhdGUoKWAgdG8gcmVhZCB0aGUgY3VycmVudCBzdGF0ZSB0cmVlIGluc2lkZSB0aGUgY2FsbGJhY2suXG4gICAqXG4gICAqIFlvdSBtYXkgY2FsbCBgZGlzcGF0Y2goKWAgZnJvbSBhIGNoYW5nZSBsaXN0ZW5lciwgd2l0aCB0aGUgZm9sbG93aW5nXG4gICAqIGNhdmVhdHM6XG4gICAqXG4gICAqIDEuIFRoZSBzdWJzY3JpcHRpb25zIGFyZSBzbmFwc2hvdHRlZCBqdXN0IGJlZm9yZSBldmVyeSBgZGlzcGF0Y2goKWAgY2FsbC5cbiAgICogSWYgeW91IHN1YnNjcmliZSBvciB1bnN1YnNjcmliZSB3aGlsZSB0aGUgbGlzdGVuZXJzIGFyZSBiZWluZyBpbnZva2VkLCB0aGlzXG4gICAqIHdpbGwgbm90IGhhdmUgYW55IGVmZmVjdCBvbiB0aGUgYGRpc3BhdGNoKClgIHRoYXQgaXMgY3VycmVudGx5IGluIHByb2dyZXNzLlxuICAgKiBIb3dldmVyLCB0aGUgbmV4dCBgZGlzcGF0Y2goKWAgY2FsbCwgd2hldGhlciBuZXN0ZWQgb3Igbm90LCB3aWxsIHVzZSBhIG1vcmVcbiAgICogcmVjZW50IHNuYXBzaG90IG9mIHRoZSBzdWJzY3JpcHRpb24gbGlzdC5cbiAgICpcbiAgICogMi4gVGhlIGxpc3RlbmVyIHNob3VsZCBub3QgZXhwZWN0IHRvIHNlZSBhbGwgc3RhdGUgY2hhbmdlcywgYXMgdGhlIHN0YXRlXG4gICAqIG1pZ2h0IGhhdmUgYmVlbiB1cGRhdGVkIG11bHRpcGxlIHRpbWVzIGR1cmluZyBhIG5lc3RlZCBgZGlzcGF0Y2goKWAgYmVmb3JlXG4gICAqIHRoZSBsaXN0ZW5lciBpcyBjYWxsZWQuIEl0IGlzLCBob3dldmVyLCBndWFyYW50ZWVkIHRoYXQgYWxsIHN1YnNjcmliZXJzXG4gICAqIHJlZ2lzdGVyZWQgYmVmb3JlIHRoZSBgZGlzcGF0Y2goKWAgc3RhcnRlZCB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZSBsYXRlc3RcbiAgICogc3RhdGUgYnkgdGhlIHRpbWUgaXQgZXhpdHMuXG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGxpc3RlbmVyIEEgY2FsbGJhY2sgdG8gYmUgaW52b2tlZCBvbiBldmVyeSBkaXNwYXRjaC5cbiAgICogQHJldHVybnMge0Z1bmN0aW9ufSBBIGZ1bmN0aW9uIHRvIHJlbW92ZSB0aGlzIGNoYW5nZSBsaXN0ZW5lci5cbiAgICovXG4gIGZ1bmN0aW9uIHN1YnNjcmliZShsaXN0ZW5lcikge1xuICAgIGlmICh0eXBlb2YgbGlzdGVuZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgdGhlIGxpc3RlbmVyIHRvIGJlIGEgZnVuY3Rpb24uJyk7XG4gICAgfVxuXG4gICAgaWYgKGlzRGlzcGF0Y2hpbmcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignWW91IG1heSBub3QgY2FsbCBzdG9yZS5zdWJzY3JpYmUoKSB3aGlsZSB0aGUgcmVkdWNlciBpcyBleGVjdXRpbmcuICcgKyAnSWYgeW91IHdvdWxkIGxpa2UgdG8gYmUgbm90aWZpZWQgYWZ0ZXIgdGhlIHN0b3JlIGhhcyBiZWVuIHVwZGF0ZWQsIHN1YnNjcmliZSBmcm9tIGEgJyArICdjb21wb25lbnQgYW5kIGludm9rZSBzdG9yZS5nZXRTdGF0ZSgpIGluIHRoZSBjYWxsYmFjayB0byBhY2Nlc3MgdGhlIGxhdGVzdCBzdGF0ZS4gJyArICdTZWUgaHR0cHM6Ly9yZWR1eC5qcy5vcmcvYXBpLXJlZmVyZW5jZS9zdG9yZSNzdWJzY3JpYmUobGlzdGVuZXIpIGZvciBtb3JlIGRldGFpbHMuJyk7XG4gICAgfVxuXG4gICAgdmFyIGlzU3Vic2NyaWJlZCA9IHRydWU7XG5cbiAgICBlbnN1cmVDYW5NdXRhdGVOZXh0TGlzdGVuZXJzKCk7XG4gICAgbmV4dExpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcblxuICAgIHJldHVybiBmdW5jdGlvbiB1bnN1YnNjcmliZSgpIHtcbiAgICAgIGlmICghaXNTdWJzY3JpYmVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzRGlzcGF0Y2hpbmcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgbWF5IG5vdCB1bnN1YnNjcmliZSBmcm9tIGEgc3RvcmUgbGlzdGVuZXIgd2hpbGUgdGhlIHJlZHVjZXIgaXMgZXhlY3V0aW5nLiAnICsgJ1NlZSBodHRwczovL3JlZHV4LmpzLm9yZy9hcGktcmVmZXJlbmNlL3N0b3JlI3N1YnNjcmliZShsaXN0ZW5lcikgZm9yIG1vcmUgZGV0YWlscy4nKTtcbiAgICAgIH1cblxuICAgICAgaXNTdWJzY3JpYmVkID0gZmFsc2U7XG5cbiAgICAgIGVuc3VyZUNhbk11dGF0ZU5leHRMaXN0ZW5lcnMoKTtcbiAgICAgIHZhciBpbmRleCA9IG5leHRMaXN0ZW5lcnMuaW5kZXhPZihsaXN0ZW5lcik7XG4gICAgICBuZXh0TGlzdGVuZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwYXRjaGVzIGFuIGFjdGlvbi4gSXQgaXMgdGhlIG9ubHkgd2F5IHRvIHRyaWdnZXIgYSBzdGF0ZSBjaGFuZ2UuXG4gICAqXG4gICAqIFRoZSBgcmVkdWNlcmAgZnVuY3Rpb24sIHVzZWQgdG8gY3JlYXRlIHRoZSBzdG9yZSwgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGVcbiAgICogY3VycmVudCBzdGF0ZSB0cmVlIGFuZCB0aGUgZ2l2ZW4gYGFjdGlvbmAuIEl0cyByZXR1cm4gdmFsdWUgd2lsbFxuICAgKiBiZSBjb25zaWRlcmVkIHRoZSAqKm5leHQqKiBzdGF0ZSBvZiB0aGUgdHJlZSwgYW5kIHRoZSBjaGFuZ2UgbGlzdGVuZXJzXG4gICAqIHdpbGwgYmUgbm90aWZpZWQuXG4gICAqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9ubHkgc3VwcG9ydHMgcGxhaW4gb2JqZWN0IGFjdGlvbnMuIElmIHlvdSB3YW50IHRvXG4gICAqIGRpc3BhdGNoIGEgUHJvbWlzZSwgYW4gT2JzZXJ2YWJsZSwgYSB0aHVuaywgb3Igc29tZXRoaW5nIGVsc2UsIHlvdSBuZWVkIHRvXG4gICAqIHdyYXAgeW91ciBzdG9yZSBjcmVhdGluZyBmdW5jdGlvbiBpbnRvIHRoZSBjb3JyZXNwb25kaW5nIG1pZGRsZXdhcmUuIEZvclxuICAgKiBleGFtcGxlLCBzZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZSBgcmVkdXgtdGh1bmtgIHBhY2thZ2UuIEV2ZW4gdGhlXG4gICAqIG1pZGRsZXdhcmUgd2lsbCBldmVudHVhbGx5IGRpc3BhdGNoIHBsYWluIG9iamVjdCBhY3Rpb25zIHVzaW5nIHRoaXMgbWV0aG9kLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gYWN0aW9uIEEgcGxhaW4gb2JqZWN0IHJlcHJlc2VudGluZyDigJx3aGF0IGNoYW5nZWTigJ0uIEl0IGlzXG4gICAqIGEgZ29vZCBpZGVhIHRvIGtlZXAgYWN0aW9ucyBzZXJpYWxpemFibGUgc28geW91IGNhbiByZWNvcmQgYW5kIHJlcGxheSB1c2VyXG4gICAqIHNlc3Npb25zLCBvciB1c2UgdGhlIHRpbWUgdHJhdmVsbGluZyBgcmVkdXgtZGV2dG9vbHNgLiBBbiBhY3Rpb24gbXVzdCBoYXZlXG4gICAqIGEgYHR5cGVgIHByb3BlcnR5IHdoaWNoIG1heSBub3QgYmUgYHVuZGVmaW5lZGAuIEl0IGlzIGEgZ29vZCBpZGVhIHRvIHVzZVxuICAgKiBzdHJpbmcgY29uc3RhbnRzIGZvciBhY3Rpb24gdHlwZXMuXG4gICAqXG4gICAqIEByZXR1cm5zIHtPYmplY3R9IEZvciBjb252ZW5pZW5jZSwgdGhlIHNhbWUgYWN0aW9uIG9iamVjdCB5b3UgZGlzcGF0Y2hlZC5cbiAgICpcbiAgICogTm90ZSB0aGF0LCBpZiB5b3UgdXNlIGEgY3VzdG9tIG1pZGRsZXdhcmUsIGl0IG1heSB3cmFwIGBkaXNwYXRjaCgpYCB0b1xuICAgKiByZXR1cm4gc29tZXRoaW5nIGVsc2UgKGZvciBleGFtcGxlLCBhIFByb21pc2UgeW91IGNhbiBhd2FpdCkuXG4gICAqL1xuICBmdW5jdGlvbiBkaXNwYXRjaChhY3Rpb24pIHtcbiAgICBpZiAoIWlzUGxhaW5PYmplY3QoYWN0aW9uKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBY3Rpb25zIG11c3QgYmUgcGxhaW4gb2JqZWN0cy4gJyArICdVc2UgY3VzdG9tIG1pZGRsZXdhcmUgZm9yIGFzeW5jIGFjdGlvbnMuJyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBhY3Rpb24udHlwZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQWN0aW9ucyBtYXkgbm90IGhhdmUgYW4gdW5kZWZpbmVkIFwidHlwZVwiIHByb3BlcnR5LiAnICsgJ0hhdmUgeW91IG1pc3NwZWxsZWQgYSBjb25zdGFudD8nKTtcbiAgICB9XG5cbiAgICBpZiAoaXNEaXNwYXRjaGluZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZWR1Y2VycyBtYXkgbm90IGRpc3BhdGNoIGFjdGlvbnMuJyk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGlzRGlzcGF0Y2hpbmcgPSB0cnVlO1xuICAgICAgY3VycmVudFN0YXRlID0gY3VycmVudFJlZHVjZXIoY3VycmVudFN0YXRlLCBhY3Rpb24pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpc0Rpc3BhdGNoaW5nID0gZmFsc2U7XG4gICAgfVxuXG4gICAgdmFyIGxpc3RlbmVycyA9IGN1cnJlbnRMaXN0ZW5lcnMgPSBuZXh0TGlzdGVuZXJzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgbGlzdGVuZXIgPSBsaXN0ZW5lcnNbaV07XG4gICAgICBsaXN0ZW5lcigpO1xuICAgIH1cblxuICAgIHJldHVybiBhY3Rpb247XG4gIH1cblxuICAvKipcbiAgICogUmVwbGFjZXMgdGhlIHJlZHVjZXIgY3VycmVudGx5IHVzZWQgYnkgdGhlIHN0b3JlIHRvIGNhbGN1bGF0ZSB0aGUgc3RhdGUuXG4gICAqXG4gICAqIFlvdSBtaWdodCBuZWVkIHRoaXMgaWYgeW91ciBhcHAgaW1wbGVtZW50cyBjb2RlIHNwbGl0dGluZyBhbmQgeW91IHdhbnQgdG9cbiAgICogbG9hZCBzb21lIG9mIHRoZSByZWR1Y2VycyBkeW5hbWljYWxseS4gWW91IG1pZ2h0IGFsc28gbmVlZCB0aGlzIGlmIHlvdVxuICAgKiBpbXBsZW1lbnQgYSBob3QgcmVsb2FkaW5nIG1lY2hhbmlzbSBmb3IgUmVkdXguXG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IG5leHRSZWR1Y2VyIFRoZSByZWR1Y2VyIGZvciB0aGUgc3RvcmUgdG8gdXNlIGluc3RlYWQuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgZnVuY3Rpb24gcmVwbGFjZVJlZHVjZXIobmV4dFJlZHVjZXIpIHtcbiAgICBpZiAodHlwZW9mIG5leHRSZWR1Y2VyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHRoZSBuZXh0UmVkdWNlciB0byBiZSBhIGZ1bmN0aW9uLicpO1xuICAgIH1cblxuICAgIGN1cnJlbnRSZWR1Y2VyID0gbmV4dFJlZHVjZXI7XG4gICAgZGlzcGF0Y2goeyB0eXBlOiBBY3Rpb25UeXBlcy5SRVBMQUNFIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEludGVyb3BlcmFiaWxpdHkgcG9pbnQgZm9yIG9ic2VydmFibGUvcmVhY3RpdmUgbGlicmFyaWVzLlxuICAgKiBAcmV0dXJucyB7b2JzZXJ2YWJsZX0gQSBtaW5pbWFsIG9ic2VydmFibGUgb2Ygc3RhdGUgY2hhbmdlcy5cbiAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUgb2JzZXJ2YWJsZSBwcm9wb3NhbDpcbiAgICogaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtb2JzZXJ2YWJsZVxuICAgKi9cbiAgZnVuY3Rpb24gb2JzZXJ2YWJsZSgpIHtcbiAgICB2YXIgX3JlZjtcblxuICAgIHZhciBvdXRlclN1YnNjcmliZSA9IHN1YnNjcmliZTtcbiAgICByZXR1cm4gX3JlZiA9IHtcbiAgICAgIC8qKlxuICAgICAgICogVGhlIG1pbmltYWwgb2JzZXJ2YWJsZSBzdWJzY3JpcHRpb24gbWV0aG9kLlxuICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9ic2VydmVyIEFueSBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCBhcyBhbiBvYnNlcnZlci5cbiAgICAgICAqIFRoZSBvYnNlcnZlciBvYmplY3Qgc2hvdWxkIGhhdmUgYSBgbmV4dGAgbWV0aG9kLlxuICAgICAgICogQHJldHVybnMge3N1YnNjcmlwdGlvbn0gQW4gb2JqZWN0IHdpdGggYW4gYHVuc3Vic2NyaWJlYCBtZXRob2QgdGhhdCBjYW5cbiAgICAgICAqIGJlIHVzZWQgdG8gdW5zdWJzY3JpYmUgdGhlIG9ic2VydmFibGUgZnJvbSB0aGUgc3RvcmUsIGFuZCBwcmV2ZW50IGZ1cnRoZXJcbiAgICAgICAqIGVtaXNzaW9uIG9mIHZhbHVlcyBmcm9tIHRoZSBvYnNlcnZhYmxlLlxuICAgICAgICovXG4gICAgICBzdWJzY3JpYmU6IGZ1bmN0aW9uIHN1YnNjcmliZShvYnNlcnZlcikge1xuICAgICAgICBpZiAoKHR5cGVvZiBvYnNlcnZlciA9PT0gJ3VuZGVmaW5lZCcgPyAndW5kZWZpbmVkJyA6IF90eXBlb2Yob2JzZXJ2ZXIpKSAhPT0gJ29iamVjdCcgfHwgb2JzZXJ2ZXIgPT09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCB0aGUgb2JzZXJ2ZXIgdG8gYmUgYW4gb2JqZWN0LicpO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gb2JzZXJ2ZVN0YXRlKCkge1xuICAgICAgICAgIGlmIChvYnNlcnZlci5uZXh0KSB7XG4gICAgICAgICAgICBvYnNlcnZlci5uZXh0KGdldFN0YXRlKCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIG9ic2VydmVTdGF0ZSgpO1xuICAgICAgICB2YXIgdW5zdWJzY3JpYmUgPSBvdXRlclN1YnNjcmliZShvYnNlcnZlU3RhdGUpO1xuICAgICAgICByZXR1cm4geyB1bnN1YnNjcmliZTogdW5zdWJzY3JpYmUgfTtcbiAgICAgIH1cbiAgICB9LCBfcmVmWyQkb2JzZXJ2YWJsZV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LCBfcmVmO1xuICB9XG5cbiAgLy8gV2hlbiBhIHN0b3JlIGlzIGNyZWF0ZWQsIGFuIFwiSU5JVFwiIGFjdGlvbiBpcyBkaXNwYXRjaGVkIHNvIHRoYXQgZXZlcnlcbiAgLy8gcmVkdWNlciByZXR1cm5zIHRoZWlyIGluaXRpYWwgc3RhdGUuIFRoaXMgZWZmZWN0aXZlbHkgcG9wdWxhdGVzXG4gIC8vIHRoZSBpbml0aWFsIHN0YXRlIHRyZWUuXG4gIGRpc3BhdGNoKHsgdHlwZTogQWN0aW9uVHlwZXMuSU5JVCB9KTtcblxuICByZXR1cm4gX3JlZjIgPSB7XG4gICAgZGlzcGF0Y2g6IGRpc3BhdGNoLFxuICAgIHN1YnNjcmliZTogc3Vic2NyaWJlLFxuICAgIGdldFN0YXRlOiBnZXRTdGF0ZSxcbiAgICByZXBsYWNlUmVkdWNlcjogcmVwbGFjZVJlZHVjZXJcbiAgfSwgX3JlZjJbJCRvYnNlcnZhYmxlXSA9IG9ic2VydmFibGUsIF9yZWYyO1xufVxuXG4vKipcbiAqIFByaW50cyBhIHdhcm5pbmcgaW4gdGhlIGNvbnNvbGUgaWYgaXQgZXhpc3RzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIFRoZSB3YXJuaW5nIG1lc3NhZ2UuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gd2FybmluZyhtZXNzYWdlKSB7XG4gIC8qIGVzbGludC1kaXNhYmxlIG5vLWNvbnNvbGUgKi9cbiAgaWYgKHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgY29uc29sZS5lcnJvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSk7XG4gIH1cbiAgLyogZXNsaW50LWVuYWJsZSBuby1jb25zb2xlICovXG4gIHRyeSB7XG4gICAgLy8gVGhpcyBlcnJvciB3YXMgdGhyb3duIGFzIGEgY29udmVuaWVuY2Ugc28gdGhhdCBpZiB5b3UgZW5hYmxlXG4gICAgLy8gXCJicmVhayBvbiBhbGwgZXhjZXB0aW9uc1wiIGluIHlvdXIgY29uc29sZSxcbiAgICAvLyBpdCB3b3VsZCBwYXVzZSB0aGUgZXhlY3V0aW9uIGF0IHRoaXMgbGluZS5cbiAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gIH0gY2F0Y2ggKGUpIHt9IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tZW1wdHlcbn1cblxuZnVuY3Rpb24gZ2V0VW5kZWZpbmVkU3RhdGVFcnJvck1lc3NhZ2Uoa2V5LCBhY3Rpb24pIHtcbiAgdmFyIGFjdGlvblR5cGUgPSBhY3Rpb24gJiYgYWN0aW9uLnR5cGU7XG4gIHZhciBhY3Rpb25EZXNjcmlwdGlvbiA9IGFjdGlvblR5cGUgJiYgJ2FjdGlvbiBcIicgKyBTdHJpbmcoYWN0aW9uVHlwZSkgKyAnXCInIHx8ICdhbiBhY3Rpb24nO1xuXG4gIHJldHVybiAnR2l2ZW4gJyArIGFjdGlvbkRlc2NyaXB0aW9uICsgJywgcmVkdWNlciBcIicgKyBrZXkgKyAnXCIgcmV0dXJuZWQgdW5kZWZpbmVkLiAnICsgJ1RvIGlnbm9yZSBhbiBhY3Rpb24sIHlvdSBtdXN0IGV4cGxpY2l0bHkgcmV0dXJuIHRoZSBwcmV2aW91cyBzdGF0ZS4gJyArICdJZiB5b3Ugd2FudCB0aGlzIHJlZHVjZXIgdG8gaG9sZCBubyB2YWx1ZSwgeW91IGNhbiByZXR1cm4gbnVsbCBpbnN0ZWFkIG9mIHVuZGVmaW5lZC4nO1xufVxuXG5mdW5jdGlvbiBnZXRVbmV4cGVjdGVkU3RhdGVTaGFwZVdhcm5pbmdNZXNzYWdlKGlucHV0U3RhdGUsIHJlZHVjZXJzLCBhY3Rpb24sIHVuZXhwZWN0ZWRLZXlDYWNoZSkge1xuICB2YXIgcmVkdWNlcktleXMgPSBPYmplY3Qua2V5cyhyZWR1Y2Vycyk7XG4gIHZhciBhcmd1bWVudE5hbWUgPSBhY3Rpb24gJiYgYWN0aW9uLnR5cGUgPT09IEFjdGlvblR5cGVzLklOSVQgPyAncHJlbG9hZGVkU3RhdGUgYXJndW1lbnQgcGFzc2VkIHRvIGNyZWF0ZVN0b3JlJyA6ICdwcmV2aW91cyBzdGF0ZSByZWNlaXZlZCBieSB0aGUgcmVkdWNlcic7XG5cbiAgaWYgKHJlZHVjZXJLZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiAnU3RvcmUgZG9lcyBub3QgaGF2ZSBhIHZhbGlkIHJlZHVjZXIuIE1ha2Ugc3VyZSB0aGUgYXJndW1lbnQgcGFzc2VkICcgKyAndG8gY29tYmluZVJlZHVjZXJzIGlzIGFuIG9iamVjdCB3aG9zZSB2YWx1ZXMgYXJlIHJlZHVjZXJzLic7XG4gIH1cblxuICBpZiAoIWlzUGxhaW5PYmplY3QoaW5wdXRTdGF0ZSkpIHtcbiAgICByZXR1cm4gJ1RoZSAnICsgYXJndW1lbnROYW1lICsgJyBoYXMgdW5leHBlY3RlZCB0eXBlIG9mIFwiJyArIHt9LnRvU3RyaW5nLmNhbGwoaW5wdXRTdGF0ZSkubWF0Y2goL1xccyhbYS16fEEtWl0rKS8pWzFdICsgJ1wiLiBFeHBlY3RlZCBhcmd1bWVudCB0byBiZSBhbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nICcgKyAoJ2tleXM6IFwiJyArIHJlZHVjZXJLZXlzLmpvaW4oJ1wiLCBcIicpICsgJ1wiJyk7XG4gIH1cblxuICB2YXIgdW5leHBlY3RlZEtleXMgPSBPYmplY3Qua2V5cyhpbnB1dFN0YXRlKS5maWx0ZXIoZnVuY3Rpb24gKGtleSkge1xuICAgIHJldHVybiAhcmVkdWNlcnMuaGFzT3duUHJvcGVydHkoa2V5KSAmJiAhdW5leHBlY3RlZEtleUNhY2hlW2tleV07XG4gIH0pO1xuXG4gIHVuZXhwZWN0ZWRLZXlzLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgIHVuZXhwZWN0ZWRLZXlDYWNoZVtrZXldID0gdHJ1ZTtcbiAgfSk7XG5cbiAgaWYgKGFjdGlvbiAmJiBhY3Rpb24udHlwZSA9PT0gQWN0aW9uVHlwZXMuUkVQTEFDRSkgcmV0dXJuO1xuXG4gIGlmICh1bmV4cGVjdGVkS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuICdVbmV4cGVjdGVkICcgKyAodW5leHBlY3RlZEtleXMubGVuZ3RoID4gMSA/ICdrZXlzJyA6ICdrZXknKSArICcgJyArICgnXCInICsgdW5leHBlY3RlZEtleXMuam9pbignXCIsIFwiJykgKyAnXCIgZm91bmQgaW4gJyArIGFyZ3VtZW50TmFtZSArICcuICcpICsgJ0V4cGVjdGVkIHRvIGZpbmQgb25lIG9mIHRoZSBrbm93biByZWR1Y2VyIGtleXMgaW5zdGVhZDogJyArICgnXCInICsgcmVkdWNlcktleXMuam9pbignXCIsIFwiJykgKyAnXCIuIFVuZXhwZWN0ZWQga2V5cyB3aWxsIGJlIGlnbm9yZWQuJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYXNzZXJ0UmVkdWNlclNoYXBlKHJlZHVjZXJzKSB7XG4gIE9iamVjdC5rZXlzKHJlZHVjZXJzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICB2YXIgcmVkdWNlciA9IHJlZHVjZXJzW2tleV07XG4gICAgdmFyIGluaXRpYWxTdGF0ZSA9IHJlZHVjZXIodW5kZWZpbmVkLCB7IHR5cGU6IEFjdGlvblR5cGVzLklOSVQgfSk7XG5cbiAgICBpZiAodHlwZW9mIGluaXRpYWxTdGF0ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUmVkdWNlciBcIicgKyBrZXkgKyAnXCIgcmV0dXJuZWQgdW5kZWZpbmVkIGR1cmluZyBpbml0aWFsaXphdGlvbi4gJyArICdJZiB0aGUgc3RhdGUgcGFzc2VkIHRvIHRoZSByZWR1Y2VyIGlzIHVuZGVmaW5lZCwgeW91IG11c3QgJyArICdleHBsaWNpdGx5IHJldHVybiB0aGUgaW5pdGlhbCBzdGF0ZS4gVGhlIGluaXRpYWwgc3RhdGUgbWF5ICcgKyAnbm90IGJlIHVuZGVmaW5lZC4gSWYgeW91IGRvblxcJ3Qgd2FudCB0byBzZXQgYSB2YWx1ZSBmb3IgdGhpcyByZWR1Y2VyLCAnICsgJ3lvdSBjYW4gdXNlIG51bGwgaW5zdGVhZCBvZiB1bmRlZmluZWQuJyk7XG4gICAgfVxuXG4gICAgdmFyIHR5cGUgPSAnQEByZWR1eC9QUk9CRV9VTktOT1dOX0FDVElPTl8nICsgTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDcpLnNwbGl0KCcnKS5qb2luKCcuJyk7XG4gICAgaWYgKHR5cGVvZiByZWR1Y2VyKHVuZGVmaW5lZCwgeyB0eXBlOiB0eXBlIH0pID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZWR1Y2VyIFwiJyArIGtleSArICdcIiByZXR1cm5lZCB1bmRlZmluZWQgd2hlbiBwcm9iZWQgd2l0aCBhIHJhbmRvbSB0eXBlLiAnICsgKCdEb25cXCd0IHRyeSB0byBoYW5kbGUgJyArIEFjdGlvblR5cGVzLklOSVQgKyAnIG9yIG90aGVyIGFjdGlvbnMgaW4gXCJyZWR1eC8qXCIgJykgKyAnbmFtZXNwYWNlLiBUaGV5IGFyZSBjb25zaWRlcmVkIHByaXZhdGUuIEluc3RlYWQsIHlvdSBtdXN0IHJldHVybiB0aGUgJyArICdjdXJyZW50IHN0YXRlIGZvciBhbnkgdW5rbm93biBhY3Rpb25zLCB1bmxlc3MgaXQgaXMgdW5kZWZpbmVkLCAnICsgJ2luIHdoaWNoIGNhc2UgeW91IG11c3QgcmV0dXJuIHRoZSBpbml0aWFsIHN0YXRlLCByZWdhcmRsZXNzIG9mIHRoZSAnICsgJ2FjdGlvbiB0eXBlLiBUaGUgaW5pdGlhbCBzdGF0ZSBtYXkgbm90IGJlIHVuZGVmaW5lZCwgYnV0IGNhbiBiZSBudWxsLicpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogVHVybnMgYW4gb2JqZWN0IHdob3NlIHZhbHVlcyBhcmUgZGlmZmVyZW50IHJlZHVjZXIgZnVuY3Rpb25zLCBpbnRvIGEgc2luZ2xlXG4gKiByZWR1Y2VyIGZ1bmN0aW9uLiBJdCB3aWxsIGNhbGwgZXZlcnkgY2hpbGQgcmVkdWNlciwgYW5kIGdhdGhlciB0aGVpciByZXN1bHRzXG4gKiBpbnRvIGEgc2luZ2xlIHN0YXRlIG9iamVjdCwgd2hvc2Uga2V5cyBjb3JyZXNwb25kIHRvIHRoZSBrZXlzIG9mIHRoZSBwYXNzZWRcbiAqIHJlZHVjZXIgZnVuY3Rpb25zLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSByZWR1Y2VycyBBbiBvYmplY3Qgd2hvc2UgdmFsdWVzIGNvcnJlc3BvbmQgdG8gZGlmZmVyZW50XG4gKiByZWR1Y2VyIGZ1bmN0aW9ucyB0aGF0IG5lZWQgdG8gYmUgY29tYmluZWQgaW50byBvbmUuIE9uZSBoYW5keSB3YXkgdG8gb2J0YWluXG4gKiBpdCBpcyB0byB1c2UgRVM2IGBpbXBvcnQgKiBhcyByZWR1Y2Vyc2Agc3ludGF4LiBUaGUgcmVkdWNlcnMgbWF5IG5ldmVyIHJldHVyblxuICogdW5kZWZpbmVkIGZvciBhbnkgYWN0aW9uLiBJbnN0ZWFkLCB0aGV5IHNob3VsZCByZXR1cm4gdGhlaXIgaW5pdGlhbCBzdGF0ZVxuICogaWYgdGhlIHN0YXRlIHBhc3NlZCB0byB0aGVtIHdhcyB1bmRlZmluZWQsIGFuZCB0aGUgY3VycmVudCBzdGF0ZSBmb3IgYW55XG4gKiB1bnJlY29nbml6ZWQgYWN0aW9uLlxuICpcbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gQSByZWR1Y2VyIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBldmVyeSByZWR1Y2VyIGluc2lkZSB0aGVcbiAqIHBhc3NlZCBvYmplY3QsIGFuZCBidWlsZHMgYSBzdGF0ZSBvYmplY3Qgd2l0aCB0aGUgc2FtZSBzaGFwZS5cbiAqL1xuZnVuY3Rpb24gY29tYmluZVJlZHVjZXJzKHJlZHVjZXJzKSB7XG4gIHZhciByZWR1Y2VyS2V5cyA9IE9iamVjdC5rZXlzKHJlZHVjZXJzKTtcbiAgdmFyIGZpbmFsUmVkdWNlcnMgPSB7fTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCByZWR1Y2VyS2V5cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBrZXkgPSByZWR1Y2VyS2V5c1tpXTtcblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBpZiAodHlwZW9mIHJlZHVjZXJzW2tleV0gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHdhcm5pbmcoJ05vIHJlZHVjZXIgcHJvdmlkZWQgZm9yIGtleSBcIicgKyBrZXkgKyAnXCInKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHJlZHVjZXJzW2tleV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGZpbmFsUmVkdWNlcnNba2V5XSA9IHJlZHVjZXJzW2tleV07XG4gICAgfVxuICB9XG4gIHZhciBmaW5hbFJlZHVjZXJLZXlzID0gT2JqZWN0LmtleXMoZmluYWxSZWR1Y2Vycyk7XG5cbiAgdmFyIHVuZXhwZWN0ZWRLZXlDYWNoZSA9IHZvaWQgMDtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICB1bmV4cGVjdGVkS2V5Q2FjaGUgPSB7fTtcbiAgfVxuXG4gIHZhciBzaGFwZUFzc2VydGlvbkVycm9yID0gdm9pZCAwO1xuICB0cnkge1xuICAgIGFzc2VydFJlZHVjZXJTaGFwZShmaW5hbFJlZHVjZXJzKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHNoYXBlQXNzZXJ0aW9uRXJyb3IgPSBlO1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIGNvbWJpbmF0aW9uKCkge1xuICAgIHZhciBzdGF0ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgdmFyIGFjdGlvbiA9IGFyZ3VtZW50c1sxXTtcblxuICAgIGlmIChzaGFwZUFzc2VydGlvbkVycm9yKSB7XG4gICAgICB0aHJvdyBzaGFwZUFzc2VydGlvbkVycm9yO1xuICAgIH1cblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICB2YXIgd2FybmluZ01lc3NhZ2UgPSBnZXRVbmV4cGVjdGVkU3RhdGVTaGFwZVdhcm5pbmdNZXNzYWdlKHN0YXRlLCBmaW5hbFJlZHVjZXJzLCBhY3Rpb24sIHVuZXhwZWN0ZWRLZXlDYWNoZSk7XG4gICAgICBpZiAod2FybmluZ01lc3NhZ2UpIHtcbiAgICAgICAgd2FybmluZyh3YXJuaW5nTWVzc2FnZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGhhc0NoYW5nZWQgPSBmYWxzZTtcbiAgICB2YXIgbmV4dFN0YXRlID0ge307XG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGZpbmFsUmVkdWNlcktleXMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICB2YXIgX2tleSA9IGZpbmFsUmVkdWNlcktleXNbX2ldO1xuICAgICAgdmFyIHJlZHVjZXIgPSBmaW5hbFJlZHVjZXJzW19rZXldO1xuICAgICAgdmFyIHByZXZpb3VzU3RhdGVGb3JLZXkgPSBzdGF0ZVtfa2V5XTtcbiAgICAgIHZhciBuZXh0U3RhdGVGb3JLZXkgPSByZWR1Y2VyKHByZXZpb3VzU3RhdGVGb3JLZXksIGFjdGlvbik7XG4gICAgICBpZiAodHlwZW9mIG5leHRTdGF0ZUZvcktleSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdmFyIGVycm9yTWVzc2FnZSA9IGdldFVuZGVmaW5lZFN0YXRlRXJyb3JNZXNzYWdlKF9rZXksIGFjdGlvbik7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpO1xuICAgICAgfVxuICAgICAgbmV4dFN0YXRlW19rZXldID0gbmV4dFN0YXRlRm9yS2V5O1xuICAgICAgaGFzQ2hhbmdlZCA9IGhhc0NoYW5nZWQgfHwgbmV4dFN0YXRlRm9yS2V5ICE9PSBwcmV2aW91c1N0YXRlRm9yS2V5O1xuICAgIH1cbiAgICByZXR1cm4gaGFzQ2hhbmdlZCA/IG5leHRTdGF0ZSA6IHN0YXRlO1xuICB9O1xufVxuXG5mdW5jdGlvbiBiaW5kQWN0aW9uQ3JlYXRvcihhY3Rpb25DcmVhdG9yLCBkaXNwYXRjaCkge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBkaXNwYXRjaChhY3Rpb25DcmVhdG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9O1xufVxuXG4vKipcbiAqIFR1cm5zIGFuIG9iamVjdCB3aG9zZSB2YWx1ZXMgYXJlIGFjdGlvbiBjcmVhdG9ycywgaW50byBhbiBvYmplY3Qgd2l0aCB0aGVcbiAqIHNhbWUga2V5cywgYnV0IHdpdGggZXZlcnkgZnVuY3Rpb24gd3JhcHBlZCBpbnRvIGEgYGRpc3BhdGNoYCBjYWxsIHNvIHRoZXlcbiAqIG1heSBiZSBpbnZva2VkIGRpcmVjdGx5LiBUaGlzIGlzIGp1c3QgYSBjb252ZW5pZW5jZSBtZXRob2QsIGFzIHlvdSBjYW4gY2FsbFxuICogYHN0b3JlLmRpc3BhdGNoKE15QWN0aW9uQ3JlYXRvcnMuZG9Tb21ldGhpbmcoKSlgIHlvdXJzZWxmIGp1c3QgZmluZS5cbiAqXG4gKiBGb3IgY29udmVuaWVuY2UsIHlvdSBjYW4gYWxzbyBwYXNzIGEgc2luZ2xlIGZ1bmN0aW9uIGFzIHRoZSBmaXJzdCBhcmd1bWVudCxcbiAqIGFuZCBnZXQgYSBmdW5jdGlvbiBpbiByZXR1cm4uXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbnxPYmplY3R9IGFjdGlvbkNyZWF0b3JzIEFuIG9iamVjdCB3aG9zZSB2YWx1ZXMgYXJlIGFjdGlvblxuICogY3JlYXRvciBmdW5jdGlvbnMuIE9uZSBoYW5keSB3YXkgdG8gb2J0YWluIGl0IGlzIHRvIHVzZSBFUzYgYGltcG9ydCAqIGFzYFxuICogc3ludGF4LiBZb3UgbWF5IGFsc28gcGFzcyBhIHNpbmdsZSBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBkaXNwYXRjaCBUaGUgYGRpc3BhdGNoYCBmdW5jdGlvbiBhdmFpbGFibGUgb24geW91ciBSZWR1eFxuICogc3RvcmUuXG4gKlxuICogQHJldHVybnMge0Z1bmN0aW9ufE9iamVjdH0gVGhlIG9iamVjdCBtaW1pY2tpbmcgdGhlIG9yaWdpbmFsIG9iamVjdCwgYnV0IHdpdGhcbiAqIGV2ZXJ5IGFjdGlvbiBjcmVhdG9yIHdyYXBwZWQgaW50byB0aGUgYGRpc3BhdGNoYCBjYWxsLiBJZiB5b3UgcGFzc2VkIGFcbiAqIGZ1bmN0aW9uIGFzIGBhY3Rpb25DcmVhdG9yc2AsIHRoZSByZXR1cm4gdmFsdWUgd2lsbCBhbHNvIGJlIGEgc2luZ2xlXG4gKiBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gYmluZEFjdGlvbkNyZWF0b3JzKGFjdGlvbkNyZWF0b3JzLCBkaXNwYXRjaCkge1xuICBpZiAodHlwZW9mIGFjdGlvbkNyZWF0b3JzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGJpbmRBY3Rpb25DcmVhdG9yKGFjdGlvbkNyZWF0b3JzLCBkaXNwYXRjaCk7XG4gIH1cblxuICBpZiAoKHR5cGVvZiBhY3Rpb25DcmVhdG9ycyA9PT0gJ3VuZGVmaW5lZCcgPyAndW5kZWZpbmVkJyA6IF90eXBlb2YoYWN0aW9uQ3JlYXRvcnMpKSAhPT0gJ29iamVjdCcgfHwgYWN0aW9uQ3JlYXRvcnMgPT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2JpbmRBY3Rpb25DcmVhdG9ycyBleHBlY3RlZCBhbiBvYmplY3Qgb3IgYSBmdW5jdGlvbiwgaW5zdGVhZCByZWNlaXZlZCAnICsgKGFjdGlvbkNyZWF0b3JzID09PSBudWxsID8gJ251bGwnIDogdHlwZW9mIGFjdGlvbkNyZWF0b3JzID09PSAndW5kZWZpbmVkJyA/ICd1bmRlZmluZWQnIDogX3R5cGVvZihhY3Rpb25DcmVhdG9ycykpICsgJy4gJyArICdEaWQgeW91IHdyaXRlIFwiaW1wb3J0IEFjdGlvbkNyZWF0b3JzIGZyb21cIiBpbnN0ZWFkIG9mIFwiaW1wb3J0ICogYXMgQWN0aW9uQ3JlYXRvcnMgZnJvbVwiPycpO1xuICB9XG5cbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhhY3Rpb25DcmVhdG9ycyk7XG4gIHZhciBib3VuZEFjdGlvbkNyZWF0b3JzID0ge307XG4gIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuICAgIHZhciBhY3Rpb25DcmVhdG9yID0gYWN0aW9uQ3JlYXRvcnNba2V5XTtcbiAgICBpZiAodHlwZW9mIGFjdGlvbkNyZWF0b3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGJvdW5kQWN0aW9uQ3JlYXRvcnNba2V5XSA9IGJpbmRBY3Rpb25DcmVhdG9yKGFjdGlvbkNyZWF0b3IsIGRpc3BhdGNoKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGJvdW5kQWN0aW9uQ3JlYXRvcnM7XG59XG5cbi8qKlxuICogQ29tcG9zZXMgc2luZ2xlLWFyZ3VtZW50IGZ1bmN0aW9ucyBmcm9tIHJpZ2h0IHRvIGxlZnQuIFRoZSByaWdodG1vc3RcbiAqIGZ1bmN0aW9uIGNhbiB0YWtlIG11bHRpcGxlIGFyZ3VtZW50cyBhcyBpdCBwcm92aWRlcyB0aGUgc2lnbmF0dXJlIGZvclxuICogdGhlIHJlc3VsdGluZyBjb21wb3NpdGUgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIHsuLi5GdW5jdGlvbn0gZnVuY3MgVGhlIGZ1bmN0aW9ucyB0byBjb21wb3NlLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBBIGZ1bmN0aW9uIG9idGFpbmVkIGJ5IGNvbXBvc2luZyB0aGUgYXJndW1lbnQgZnVuY3Rpb25zXG4gKiBmcm9tIHJpZ2h0IHRvIGxlZnQuIEZvciBleGFtcGxlLCBjb21wb3NlKGYsIGcsIGgpIGlzIGlkZW50aWNhbCB0byBkb2luZ1xuICogKC4uLmFyZ3MpID0+IGYoZyhoKC4uLmFyZ3MpKSkuXG4gKi9cblxuZnVuY3Rpb24gY29tcG9zZSgpIHtcbiAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGZ1bmNzID0gQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgZnVuY3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cblxuICBpZiAoZnVuY3MubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChhcmcpIHtcbiAgICAgIHJldHVybiBhcmc7XG4gICAgfTtcbiAgfVxuXG4gIGlmIChmdW5jcy5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gZnVuY3NbMF07XG4gIH1cblxuICByZXR1cm4gZnVuY3MucmVkdWNlKGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBhKGIuYXBwbHkodW5kZWZpbmVkLCBhcmd1bWVudHMpKTtcbiAgICB9O1xuICB9KTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgc3RvcmUgZW5oYW5jZXIgdGhhdCBhcHBsaWVzIG1pZGRsZXdhcmUgdG8gdGhlIGRpc3BhdGNoIG1ldGhvZFxuICogb2YgdGhlIFJlZHV4IHN0b3JlLiBUaGlzIGlzIGhhbmR5IGZvciBhIHZhcmlldHkgb2YgdGFza3MsIHN1Y2ggYXMgZXhwcmVzc2luZ1xuICogYXN5bmNocm9ub3VzIGFjdGlvbnMgaW4gYSBjb25jaXNlIG1hbm5lciwgb3IgbG9nZ2luZyBldmVyeSBhY3Rpb24gcGF5bG9hZC5cbiAqXG4gKiBTZWUgYHJlZHV4LXRodW5rYCBwYWNrYWdlIGFzIGFuIGV4YW1wbGUgb2YgdGhlIFJlZHV4IG1pZGRsZXdhcmUuXG4gKlxuICogQmVjYXVzZSBtaWRkbGV3YXJlIGlzIHBvdGVudGlhbGx5IGFzeW5jaHJvbm91cywgdGhpcyBzaG91bGQgYmUgdGhlIGZpcnN0XG4gKiBzdG9yZSBlbmhhbmNlciBpbiB0aGUgY29tcG9zaXRpb24gY2hhaW4uXG4gKlxuICogTm90ZSB0aGF0IGVhY2ggbWlkZGxld2FyZSB3aWxsIGJlIGdpdmVuIHRoZSBgZGlzcGF0Y2hgIGFuZCBgZ2V0U3RhdGVgIGZ1bmN0aW9uc1xuICogYXMgbmFtZWQgYXJndW1lbnRzLlxuICpcbiAqIEBwYXJhbSB7Li4uRnVuY3Rpb259IG1pZGRsZXdhcmVzIFRoZSBtaWRkbGV3YXJlIGNoYWluIHRvIGJlIGFwcGxpZWQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IEEgc3RvcmUgZW5oYW5jZXIgYXBwbHlpbmcgdGhlIG1pZGRsZXdhcmUuXG4gKi9cbmZ1bmN0aW9uIGFwcGx5TWlkZGxld2FyZSgpIHtcbiAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIG1pZGRsZXdhcmVzID0gQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgbWlkZGxld2FyZXNbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKGNyZWF0ZVN0b3JlKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW4yKSwgX2tleTIgPSAwOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgICAgIGFyZ3NbX2tleTJdID0gYXJndW1lbnRzW19rZXkyXTtcbiAgICAgIH1cblxuICAgICAgdmFyIHN0b3JlID0gY3JlYXRlU3RvcmUuYXBwbHkodW5kZWZpbmVkLCBhcmdzKTtcbiAgICAgIHZhciBfZGlzcGF0Y2ggPSBmdW5jdGlvbiBkaXNwYXRjaCgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdEaXNwYXRjaGluZyB3aGlsZSBjb25zdHJ1Y3RpbmcgeW91ciBtaWRkbGV3YXJlIGlzIG5vdCBhbGxvd2VkLiAnICsgJ090aGVyIG1pZGRsZXdhcmUgd291bGQgbm90IGJlIGFwcGxpZWQgdG8gdGhpcyBkaXNwYXRjaC4nKTtcbiAgICAgIH07XG5cbiAgICAgIHZhciBtaWRkbGV3YXJlQVBJID0ge1xuICAgICAgICBnZXRTdGF0ZTogc3RvcmUuZ2V0U3RhdGUsXG4gICAgICAgIGRpc3BhdGNoOiBmdW5jdGlvbiBkaXNwYXRjaCgpIHtcbiAgICAgICAgICByZXR1cm4gX2Rpc3BhdGNoLmFwcGx5KHVuZGVmaW5lZCwgYXJndW1lbnRzKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHZhciBjaGFpbiA9IG1pZGRsZXdhcmVzLm1hcChmdW5jdGlvbiAobWlkZGxld2FyZSkge1xuICAgICAgICByZXR1cm4gbWlkZGxld2FyZShtaWRkbGV3YXJlQVBJKTtcbiAgICAgIH0pO1xuICAgICAgX2Rpc3BhdGNoID0gY29tcG9zZS5hcHBseSh1bmRlZmluZWQsIGNoYWluKShzdG9yZS5kaXNwYXRjaCk7XG5cbiAgICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgc3RvcmUsIHtcbiAgICAgICAgZGlzcGF0Y2g6IF9kaXNwYXRjaFxuICAgICAgfSk7XG4gICAgfTtcbiAgfTtcbn1cblxuLypcbiAqIFRoaXMgaXMgYSBkdW1teSBmdW5jdGlvbiB0byBjaGVjayBpZiB0aGUgZnVuY3Rpb24gbmFtZSBoYXMgYmVlbiBhbHRlcmVkIGJ5IG1pbmlmaWNhdGlvbi5cbiAqIElmIHRoZSBmdW5jdGlvbiBoYXMgYmVlbiBtaW5pZmllZCBhbmQgTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJywgd2FybiB0aGUgdXNlci5cbiAqL1xuZnVuY3Rpb24gaXNDcnVzaGVkKCkge31cblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgdHlwZW9mIGlzQ3J1c2hlZC5uYW1lID09PSAnc3RyaW5nJyAmJiBpc0NydXNoZWQubmFtZSAhPT0gJ2lzQ3J1c2hlZCcpIHtcbiAgd2FybmluZyhcIllvdSBhcmUgY3VycmVudGx5IHVzaW5nIG1pbmlmaWVkIGNvZGUgb3V0c2lkZSBvZiBOT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nLiBcIiArICdUaGlzIG1lYW5zIHRoYXQgeW91IGFyZSBydW5uaW5nIGEgc2xvd2VyIGRldmVsb3BtZW50IGJ1aWxkIG9mIFJlZHV4LiAnICsgJ1lvdSBjYW4gdXNlIGxvb3NlLWVudmlmeSAoaHR0cHM6Ly9naXRodWIuY29tL3plcnRvc2gvbG9vc2UtZW52aWZ5KSBmb3IgYnJvd3NlcmlmeSAnICsgJ29yIERlZmluZVBsdWdpbiBmb3Igd2VicGFjayAoaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8zMDAzMDAzMSkgJyArICd0byBlbnN1cmUgeW91IGhhdmUgdGhlIGNvcnJlY3QgY29kZSBmb3IgeW91ciBwcm9kdWN0aW9uIGJ1aWxkLicpO1xufVxuXG5leHBvcnQgeyBjcmVhdGVTdG9yZSwgY29tYmluZVJlZHVjZXJzLCBiaW5kQWN0aW9uQ3JlYXRvcnMsIGFwcGx5TWlkZGxld2FyZSwgY29tcG9zZSwgQWN0aW9uVHlwZXMgYXMgX19ET19OT1RfVVNFX19BY3Rpb25UeXBlcyB9O1xuIiwiaW1wb3J0IHtjcmVhdGVTdG9yZX0gZnJvbSAncmVkdXgnO1xuaW1wb3J0IHtEZXBlbmRlbmN5RXJyb3J9IGZyb20gJy4vZXJyb3JzJztcblxuLyoqXG4gKiBAY2xhc3MgTW9kdWxlTWFuYWdlclxuICogQGNhdGVnb3J5IGNvcmVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgaGFuZGxlclxuICogQGRlc2NyaXB0aW9uICBTb2x2ZXMgbW9kdWxlcyBkZXBlbmRlbmNpZXNcbiAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZVxuICovXG5leHBvcnQgY2xhc3MgTW9kdWxlTWFuYWdlciB7XG4gIGNvbnN0cnVjdG9yKG9iamVjdCkge1xuICAgIHRoaXMuaGFuZGxlciA9IG9iamVjdDtcbiAgICB0aGlzLmN1cnJlbnRNb2R1bGUgPSBudWxsO1xuXG4gICAgdGhpcy5zdG9yZSA9IGNyZWF0ZVN0b3JlKChzdGF0ZSA9IFt7fSwgJyddLCBhY3Rpb24pID0+IHtcbiAgICAgIHN0YXRlWzBdW2FjdGlvbi5rZXldID0gYWN0aW9uLmRhdGE7XG4gICAgICBzdGF0ZVsxXSA9IGFjdGlvbi5rZXk7XG5cbiAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9KTtcblxuICAgIHRoaXMubW9kdWxlcyA9IHt9O1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgYWN0aXZlXG4gICAqIEBpbnN0YW5jZVxuICAgKiBAZGVzY3JpcHRpb24gU2V0cyAuY3VycmVudE1vZHVsZSB0byBwcm92aWRlZCBtb2R1bGUuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBtb2R1bGUgdGhlIG1vZHVsZSB0byBtYWtlIGN1cnJlbnRcbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLk1vZHVsZU1hbmFnZXJcbiAgICovXG4gIGFjdGl2ZShtb2R1bGUpIHtcbiAgICB0aGlzLmN1cnJlbnRNb2R1bGUgPSBtb2R1bGU7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCByZXNldFxuICAgKiBAaW5zdGFuY2VcbiAgICogQGRlc2NyaXB0aW9uIFNldCdzIC5jdXJyZW50TW9kdWxlIHRvIG51bGwuXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZS5Nb2R1bGVNYW5hZ2VyXG4gICAqL1xuICByZXNldCgpIHtcbiAgICB0aGlzLmN1cnJlbnRNb2R1bGUgPSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgZGVmaW5lXG4gICAqIEBpbnN0YW5jZVxuICAgKiBAZGVzY3JpcHRpb24gRGVmaW5lIHRoZSBtb2R1bGUgaW4gbWFuYWdlclxuICAgKiBAcGFyYW0gbmFtZSBUaGUgbW9kdWxlIG5hbWVcbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLk1vZHVsZU1hbmFnZXJcbiAgICovXG4gIGRlZmluZShuYW1lKSB7XG4gICAgdGhpcy5tb2R1bGVzW25hbWVdID0gdGhpcy5jdXJyZW50TW9kdWxlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgdXNlXG4gICAqIEBpbnN0YW5jZVxuICAgKiBAZGVzY3JpcHRpb24gR2V0IHRoZSBkZWZpbmVkIG1vZHVsZSBmcm9tIG1hbmFnZXJcbiAgICogQHBhcmFtIG5hbWUgVGhlIG1vZHVsZSBuYW1lXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZS5Nb2R1bGVNYW5hZ2VyXG4gICAqL1xuICB1c2UobmFtZSkge1xuICAgIHJldHVybiB0aGlzLm1vZHVsZXNbbmFtZV07XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBzZXRcbiAgICogQGluc3RhbmNlXG4gICAqIEBkZXNjcmlwdGlvbiBBbiBhbGlhcyBmb3IgLmFkZCgpIDxici8+PGJyLz5cbiAgICogVXNlIHRoaXMgbWV0aG9kIGlmIHlvdSBrbm93IHRoYXQgeW91IHdpbGwgb3ZlcndyaXRlIGV4aXN0aW5nIGRlcGVuZGVuY3kuPGJyLz5cbiAgICogVXNlIGl0IGluIHlvdXIgYXBwLCBidXQgbm90IGluIG1vZHVsZSB0aGF0IHlvdSBwcm92aWRlIHRvIG90aGVyIHBlb3BsZS5cbiAgICogQHBhcmFtIHtTdHJpbmd9IGtleSB0aGUga2V5IG9mIHRoZSBkZXBlbmRlbmN5XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIHRoZSB2YWx1ZSBvZiB0aGUgZGVwZW5kZW5jeVxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmUuTW9kdWxlTWFuYWdlclxuICAgKi9cbiAgc2V0KGtleSwgZGF0YSkge1xuICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goe1xuICAgICAgdHlwZTogJ0FERCcsXG4gICAgICBrZXksXG4gICAgICBkYXRhXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBnZXRcbiAgICogQGluc3RhbmNlXG4gICAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIGRlcGVuZGVuY3kgaW4gc3RvcmUgb2JqZWN0LCBieSBrZXkuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBrZXkgdGhlIGtleSBvZiB0aGUgZGVwZW5kZW5jeVxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmUuTW9kdWxlTWFuYWdlclxuICAgKiBAcmV0dXJuIHtPYmplY3R8TW9kdWxlfVxuICAgKiBAdGhyb3dzIHtEZXBlbmRlbmN5RXJyb3J9IGlmIGRlcGVuZGVuY3kgaXMgbm90IGluIHRoZSBzdG9yZVxuICAgKiBAZXhhbXBsZSA8Y2FwdGlvbj5HZXQgdGhlICdoZWxsbycgZGVwZW5kZW5jeTwvY2FwdGlvbj5cbiAgICogbWFuYWdlci5nZXQoJ2hlbGxvJyk7IC8vIC0+IHt3b3JsZDogdHJ1ZX1cbiAgICovXG4gIGdldChrZXkpIHtcbiAgICBpZiAoIXRoaXMuc3RvcmUuZ2V0U3RhdGUoKVswXVtrZXldKSB7XG4gICAgICB0aHJvdyBuZXcgRGVwZW5kZW5jeUVycm9yKFxuICAgICAgICAnTW9kdWxlTWFuYWdlcicsXG4gICAgICAgIGBNb2R1bGUgcmVxdWlyZXMgJyR7a2V5fScgZGVwZW5kZW5jeWAsXG4gICAgICAgIHRoaXMuY3VycmVudE1vZHVsZVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zdG9yZS5nZXRTdGF0ZSgpWzBdW2tleV07XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBoYXNcbiAgICogQGluc3RhbmNlXG4gICAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIHdoZXRoZXIgbWFuYWdlciBoYXMgYSBkZXBlbmRlbmN5IHdpdGggdGhlIGdpdmVuIGtleVxuICAgKiBAcGFyYW0ge1N0cmluZ30ga2V5IHRoZSBrZXkgb2YgdGhlIGRlcGVuZGVuY3lcbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLk1vZHVsZU1hbmFnZXJcbiAgICogQHJldHVybiB7Qm9vbGVhbn0gUHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdoZW4gYWxsIHByb21pc2VzIGNvbXBsZXRlZC5cbiAgICogQGV4YW1wbGUgPGNhcHRpb24+Q2hlY2sgd2hldGhlciB0aGUgc3RvcmUgaGFzIHRoZSAnaGVsbG8nIGRlcGVuZGVuY3k8L2NhcHRpb24+XG4gICAqIG1hbmFnZXIuaGFzKCdoZWxsbycpOyAvLyAtPiB0cnVlXG4gICAqL1xuICBoYXMoa2V5KSB7XG4gICAgcmV0dXJuIEJvb2xlYW4odGhpcy5zdG9yZS5nZXRTdGF0ZSgpWzBdW2tleV0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgdXBkYXRlXG4gICAqIEBpbnN0YW5jZVxuICAgKiBAZGVzY3JpcHRpb24gVXBkYXRlcyBkZXBzXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbZGVwc01hcD17fV1cbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLk1vZHVsZU1hbmFnZXJcbiAgICovXG4gIHVwZGF0ZShkZXBzTWFwID0ge30pIHtcbiAgICB0aGlzLnN0b3JlLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICBjb25zdCBbZGF0YSwgY2hhbmdlZEtleV0gPSB0aGlzLnN0b3JlLmdldFN0YXRlKCk7XG4gICAgICBjb25zdCBjYWxsYmFjayA9IGRlcHNNYXBbY2hhbmdlZEtleV07XG5cbiAgICAgIGlmIChjYWxsYmFjaykgY2FsbGJhY2soZGF0YVtjaGFuZ2VkS2V5XSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBhZGRcbiAgICogQGFsaWFzIG1vZHVsZTpjb3JlLk1vZHVsZU1hbmFnZXIjc2V0XG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZS5Nb2R1bGVNYW5hZ2VyXG4gICAqL1xuICBhZGQoLi4uZGF0YSkge1xuICAgIGNvbnNvbGUud2FybignLmFkZCgpIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBVc2UgLnNldCgpIGluc3RlYWQnKTtcbiAgICByZXR1cm4gdGhpcy5zZXQoLi4uZGF0YSk7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCByZXF1aXJlXG4gICAqIEBpbnN0YW5jZVxuICAgKiBAZGVzY3JpcHRpb24gUmVxdWlyZSBtb2R1bGVcbiAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgRGVmaW5lZCBuYW1lXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IG1vZHVsZUV4ZWN1dG9yIEZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhcHBsaWVkIG1vZHVsZVxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmUuTW9kdWxlTWFuYWdlclxuICAgKi9cbiAgcmVxdWlyZShuYW1lLCBtb2R1bGVFeGVjdXRvcikge1xuICAgIGlmICh0aGlzLnVzZShuYW1lKSA9PT0gdW5kZWZpbmVkKSB0aGlzLmhhbmRsZXIuYXBwbHlNb2R1bGUobW9kdWxlRXhlY3V0b3IoKSk7XG4gIH1cbn1cbiIsImltcG9ydCB7ZXh0ZW5kLCB0cmFuc2Zvcm1EYXRhfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQge01vZHVsZVN5c3RlbX0gZnJvbSAnLi9Nb2R1bGVTeXN0ZW0nO1xuaW1wb3J0IHtNb2R1bGVNYW5hZ2VyfSBmcm9tICcuL01vZHVsZU1hbmFnZXInO1xuaW1wb3J0IHtNYW5hZ2VyRXJyb3IsIENvbXBvc2l0aW9uRXJyb3J9IGZyb20gJy4vZXJyb3JzJztcblxuLyoqXG4gKiBAY2xhc3MgQ29tcG9uZW50XG4gKiBAY2F0ZWdvcnkgY29yZVxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXNdIC0gVGhlIHBhcmFtZXRlcnMgb2JqZWN0LlxuICogQHBhcmFtIHtPYmplY3R9IFtpbnN0cnVjdGlvbnNdIC0gVGhlIGluc3RydWN0aW9ucyBvYmplY3QuXG4gKiBAZXh0ZW5kcyBNb2R1bGVTeXN0ZW1cbiAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZVxuICovXG5jbGFzcyBDb21wb25lbnQgZXh0ZW5kcyBNb2R1bGVTeXN0ZW0ge1xuICAvKipcbiAgICogRGVmYXVsdCB2YWx1ZXMgZm9yIHBhcmFtZXRlcnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29yZS5Db21wb25lbnQjZGVmYXVsdHNcbiAgICogQHN0YXRpY1xuICAgKiBAZGVmYXVsdCB7XG4gICAqICAgbW9kdWxlczogW10sXG4gICAqICAgbWFuYWdlcjogdHJ1ZVxuICAgKiB9XG4gICAqL1xuICBzdGF0aWMgZGVmYXVsdHMgPSB7XG4gICAgbW9kdWxlczogbnVsbCxcbiAgICBtYW5hZ2VyOiB0cnVlXG4gIH07XG5cbiAgLyoqXG4gICAqIFN0YXRpYyBpbnN0cnVjdGlvbnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29yZS5Db21wb25lbnQjaW5zdHJ1Y3Rpb25zXG4gICAqIEBzdGF0aWNcbiAgICogQGRlZmF1bHQge31cbiAgICovXG4gIHN0YXRpYyBpbnN0cnVjdGlvbnMgPSB7fTtcblxuICAvKipcbiAgICogQXJyYXkgb2YgcHJvbWlzZXMgdGhhdCBzaG91bGQgYmUgcmVzb2x2ZWQgYmVmb3JlIENvbXBvbmVudCBpcyByZWFkeS5cbiAgICogQG1lbWJlciB7QXJyYXl9IG1vZHVsZTpjb3JlLkNvbXBvbmVudCNfd2FpdFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3dhaXQgPSBbXTsgLy8gQ29sbGVjdGlvbiBvZiBwcm9taXNlcztcblxuICAvKipcbiAgICogQ29sbGVjdGlvbiBvZiBgbW9kdWxlc2AuXG4gICAqIEBtZW1iZXIge0FycmF5fSBtb2R1bGU6Y29yZS5Db21wb25lbnQjbW9kdWxlc1xuICAgKiBAcHVibGljXG4gICAqL1xuICBtb2R1bGVzID0gW107IC8vIENvbGxlY3Rpb24gb2YgbW9kdWxlcztcblxuICAvKipcbiAgICogQ29sbGVjdGlvbiBvZiBgY2hpbGRgIENvbXBvbmVudHMuXG4gICAqIEBtZW1iZXIge0FycmF5fSBtb2R1bGU6Y29yZS5Db21wb25lbnQjY2hpbGRyZW5cbiAgICogQHB1YmxpY1xuICAgKi9cbiAgY2hpbGRyZW4gPSBbXTsgLy8gRm9yIGtlZXBpbmcgY2hpbGRyZW4gY29tcG9uZW50cztcblxuICBjb25zdHJ1Y3RvcihwYXJhbXMgPSB7fSwgZGVmYXVsdHMgPSBDb21wb25lbnQuZGVmYXVsdHMsIGluc3RydWN0aW9ucyA9IENvbXBvbmVudC5pbnN0cnVjdGlvbnMpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgLy8gQXBwbHkgcG9seWZpbGxlZCBwYXJhbWV0ZXJzIHRvIC5wYXJhbXM7XG4gICAgdGhpcy5wYXJhbXMgPSBleHRlbmQodHJhbnNmb3JtRGF0YShwYXJhbXMsIGluc3RydWN0aW9ucyksIGRlZmF1bHRzKTtcbiAgICBpZiAodGhpcy5wYXJhbXMubWFuYWdlcikgdGhpcy5tYW5hZ2VyID0gbmV3IE1vZHVsZU1hbmFnZXIodGhpcyk7XG5cbiAgICB0aGlzLm1vZHVsZXMgPSB0aGlzLnBhcmFtcy5tb2R1bGVzO1xuXG4gICAgdGhpcy5pbnRlZ3JhdGVNb2R1bGVzKCk7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCB3YWl0XG4gICAqIEBpbnN0YW5jZVxuICAgKiBAZGVzY3JpcHRpb24gV2FpdCBmb3IgYSBwcm9taXNlLlxuICAgKiBAcGFyYW0ge1Byb21pc2V9IFtwcm9taXNlXSAtIFRoZSBwcm9taXNlIHRoYXQgc2hvdWxkIGJlIGFkZGVkIHRvIGEgcXVldWUuXG4gICAqIEByZXR1cm4ge1Byb21pc2V9IFByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aGVuIGFsbCBwcm9taXNlcyBjb21wbGV0ZWQuXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZS5Db21wb25lbnRcbiAgICovXG4gIHdhaXQocHJvbWlzZSkge1xuICAgIGlmIChwcm9taXNlKSB0aGlzLl93YWl0LnB1c2gocHJvbWlzZSk7XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKHRoaXMuX3dhaXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgZGVmZXJcbiAgICogQGluc3RhbmNlXG4gICAqIEBkZXNjcmlwdGlvbiBFeGVjdXRlIGBmdW5jYCAoQ2FsbGJhY2spIHdoZW4gQ29tcG9uZW50IGlzIHJlYWR5LlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIC0gQ2FsbGJhY2suXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZS5Db21wb25lbnRcbiAgICovXG4gIGRlZmVyKGZ1bmMpIHtcbiAgICBpZiAodGhpcy5pc0RlZmZlcmVkKSB0aGlzLndhaXQoKS50aGVuKCgpID0+IGZ1bmModGhpcykpO1xuICAgIGVsc2UgZnVuYyh0aGlzKTtcbiAgfVxuXG4gIC8vIFBBUkFNRVRFUlNcblxuICAvKipcbiAgICogQG1ldGhvZCB1cGRhdGVQYXJhbXNcbiAgICogQGluc3RhbmNlXG4gICAqIEBkZXNjcmlwdGlvbiBVcGRhdGVzIHBhcmFtZXRlcnMgb2YgdGhlIENvbXBvbmVudC5cbiAgICogQHJldHVybiB7T2JqZWN0fSBQYXJhbXMgb2YgdGhpcyBDb21wb25lbnRcbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLkNvbXBvbmVudFxuICAgKi9cbiAgdXBkYXRlUGFyYW1zKHBhcmFtcyA9IHt9KSB7XG4gICAgdGhpcy5wYXJhbXMgPSBleHRlbmQocGFyYW1zLCB0aGlzLnBhcmFtcyk7XG4gICAgcmV0dXJuIHRoaXMucGFyYW1zO1xuICB9XG5cbiAgLy8gQ09QWUlORyAmIENMT05JTkdcblxuICAvKipcbiAgICogQG1ldGhvZCBjbG9uZVxuICAgKiBAaW5zdGFuY2VcbiAgICogQGRlc2NyaXB0aW9uIENsb25lIHRoaXMgY29tcG9uZW50XG4gICAqIEByZXR1cm4ge29iamVjdH0gYSBjbG9uZWQgY29tcG9uZW50IHdpdGggYWxsIGl0cyBzb3VyY2UgY29tcG9uZW50JyBwYXJhbXMgY29waWVkLlxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmUuQ29tcG9uZW50XG4gICAqL1xuICBjbG9uZSgpIHtcbiAgICByZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5wYXJhbXMpLmNvcHkodGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBjb3B5XG4gICAqIEBpbnN0YW5jZVxuICAgKiBAZGVzY3JpcHRpb24gQ29weSBzb3VyY2UgbmF0aXZlIGFuZCBpbnRlZ3JhdGUgYG1vZHVsZXNgIHRvIGl0LlxuICAgKiBAcGFyYW0ge0NvbXBvbmVudH0gc291cmNlIC0gU291cmNlIGNvbXBvbmVudCB0aGF0IGlzIHVzZWQgZm9yIGBjb3B5KClgIGFjdGlvbi5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZV0gLSBDYWxsYmFjayBleGVjdXRlZCBiZWZvcmUgbW9kdWxlcyBpbnRlZ3JhdGlvbiBwcm9jZXNzLlxuICAgKiBAcmV0dXJuIHt0aGlzfSBDb21wb25lbnRcbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLkNvbXBvbmVudFxuICAgKi9cbiAgY29weShzb3VyY2UsIGN1c3RvbWl6ZSkge1xuICAgIHRoaXMucGFyYW1zID0gey4uLnNvdXJjZS5wYXJhbXN9O1xuXG4gICAgaWYgKHNvdXJjZS5uYXRpdmUpIHRoaXMubmF0aXZlID0gc291cmNlLm5hdGl2ZS5jbG9uZShzb3VyY2UucGFyYW1zKTtcbiAgICBpZiAoY3VzdG9taXplKSBjdXN0b21pemUoKTtcbiAgICB0aGlzLmludGVncmF0ZU1vZHVsZXMoc291cmNlKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgYWRkXG4gICAqIEBpbnN0YW5jZVxuICAgKiBAZGVzY3JpcHRpb24gQWRkIGEgY2hpbGQgYENvbXBvbmVudGAuXG4gICAqIEBwYXJhbSB7Q29tcG9uZW50fSBvYmplY3QgLSBDb21wb25lbnQgdGhhdCBzaG91bGQgYmUgYWRkZWQgYXMgYSBgY2hpbGRgLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlfSBSZXNvbHZlZCB3aGVuIGFjdGlvbiBpcyBkb25lLlxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmUuQ29tcG9uZW50XG4gICAqL1xuICBhc3luYyBhZGQob2JqZWN0KSB7XG4gICAgaWYgKG9iamVjdC5wYXJlbnQpIGF3YWl0IG9iamVjdC5wYXJlbnQucmVtb3ZlKG9iamVjdCk7XG5cbiAgICBhd2FpdCB0aGlzLndhaXQoKTtcbiAgICBhd2FpdCBvYmplY3Qud2FpdCgpO1xuXG4gICAgaWYgKCFvYmplY3QubmF0aXZlKSB7XG4gICAgICB0aHJvdyBuZXcgQ29tcG9zaXRpb25FcnJvcihcbiAgICAgICAgJ0NvbXBvbmVudCcsXG4gICAgICAgICd0aGVyZSBpcyBubyBvYmplY3QubmF0aXZlJyxcbiAgICAgICAgdGhpc1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBvYmplY3QucGFyZW50ID0gdGhpcztcbiAgICBhd2FpdCB0aGlzLmFwcGx5QnJpZGdlKHtvbkFkZDogb2JqZWN0fSkub25BZGQ7XG4gICAgdGhpcy5uYXRpdmUuYWRkKG9iamVjdC5uYXRpdmUpO1xuICAgIHRoaXMuY2hpbGRyZW4ucHVzaChvYmplY3QpO1xuXG4gICAgcmV0dXJuIG9iamVjdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIHJlbW92ZVxuICAgKiBAaW5zdGFuY2VcbiAgICogQGRlc2NyaXB0aW9uIFJlbW92ZSBhIGNoaWxkIGBDb21wb25lbnRgLlxuICAgKiBAcGFyYW0ge0NvbXBvbmVudH0gb2JqZWN0IC0gQ29tcG9uZW50IHRoYXQgc2hvdWxkIGJlIGEgKipjaGlsZCoqIG9mIHRoaXMgQ29tcG9uZW50LlxuICAgKiBAcmV0dXJuIHtQcm9taXNlfSBSZXNvbHZlZCB3aGVuIGFjdGlvbiBpcyBkb25lLlxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmUuQ29tcG9uZW50XG4gICAqL1xuICBhc3luYyByZW1vdmUob2JqZWN0KSB7XG4gICAgaWYgKG9iamVjdC5wYXJlbnQgIT09IHRoaXMpIHJldHVybjtcblxuICAgIGF3YWl0IHRoaXMud2FpdCgpO1xuICAgIGF3YWl0IG9iamVjdC53YWl0KCk7XG5cbiAgICBvYmplY3QucGFyZW50ID0gbnVsbDtcbiAgICB0aGlzLm5hdGl2ZS5yZW1vdmUob2JqZWN0Lm5hdGl2ZSk7XG4gICAgdGhpcy5jaGlsZHJlbi5zcGxpY2UodGhpcy5jaGlsZHJlbi5pbmRleE9mKG9iamVjdCksIDEpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgYWRkVG9cbiAgICogQGluc3RhbmNlXG4gICAqIEBkZXNjcmlwdGlvbiBBZGRzIGB0aGlzYCBDb21wb25lbnQgdG8gc3BlY2lmaWVkIGBBcHBgL2BDb21wb25lbnRgLlxuICAgKiBAcGFyYW0ge0NvbXBvbmVudH0gb2JqZWN0IC0gQ29tcG9uZW50IHRoYXQgd2lsbCBiZSBhIHBhcmVudCBvZiBgdGhpc2AuXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZS5Db21wb25lbnRcbiAgICovXG4gIGFkZFRvKG9iamVjdCkge1xuICAgIHJldHVybiBvYmplY3QuYWRkKHRoaXMpO1xuICB9XG5cbiAgZ2V0KGtleSkge1xuICAgIHJldHVybiB0aGlzLm1hbmFnZXIuZ2V0KGtleSk7XG4gIH1cblxuICB1c2Uoa2V5KSB7XG4gICAgcmV0dXJuIHRoaXMubWFuYWdlci51c2Uoa2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIG9iamVjdCBpcyBgYXN5bmNgIChgd2FpdGAgcHJvbWlzZXMgYXJlIG1vcmUgdGhhbiBgMGApLlxuICAgKiBAbWVtYmVyIHtCb29sZWFufSBtb2R1bGU6Y29yZS5Db21wb25lbnQjaXNEZWZmZXJlZFxuICAgKi9cbiAgZ2V0IGlzRGVmZmVyZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3dhaXQubGVuZ3RoID4gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBgTW9kdWxlTWFuYWdlcmAgdXNlZCBmb3IgdGhpcyBjb21wb25lbnQuXG4gICAqIEBtZW1iZXIge01vZHVsZU1hbmFnZXJ9IG1vZHVsZTpjb3JlLkNvbXBvbmVudCNtYW5hZ2VyXG4gICAqIEB0aHJvd3Mge01hbmFnZXJFcnJvcn1cbiAgICovXG4gIGdldCBtYW5hZ2VyKCkge1xuICAgIGlmICh0aGlzLl9tYW5hZ2VyKSByZXR1cm4gdGhpcy5fbWFuYWdlcjtcblxuICAgIHRocm93IG5ldyBNYW5hZ2VyRXJyb3IoXG4gICAgICAnQ29tcG9uZW50JyxcbiAgICAgIGBNb2R1bGVNYW5hZ2VyIGlzIG5vdCB1c2VkIGluIHRoaXMgY29tcG9uZW50LiAnbWFuYWdlcicgcGFyYW1ldGVyIHNob3VsZCBiZSBzZXQgYXMgJ3RydWUnYCxcbiAgICAgIHRoaXNcbiAgICApO1xuICB9XG5cbiAgc2V0IG1hbmFnZXIobWFuYWdlcikge1xuICAgIHRoaXMuX21hbmFnZXIgPSBtYW5hZ2VyO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGBuYXRpdmVgIG9iamVjdCB1c2VkIGZvciB0aGlzIGNvbXBvbmVudC5cbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29yZS5Db21wb25lbnQjbmF0aXZlXG4gICAqL1xuICBnZXQgbmF0aXZlKCkge1xuICAgIHJldHVybiB0aGlzLl9uYXRpdmU7XG4gIH1cblxuICBzZXQgbmF0aXZlKG1lc2gpIHtcbiAgICB0aGlzLl9uYXRpdmUgPSBtZXNoO1xuICAgIHRoaXMuX25hdGl2ZS5jb21wb25lbnQgPSB0aGlzO1xuICAgIHJldHVybiB0aGlzLl9uYXRpdmU7XG4gIH1cbn1cblxuZXhwb3J0IHtcbiAgQ29tcG9uZW50XG59O1xuIiwiLy8gMjYuMS42IFJlZmxlY3QuZ2V0KHRhcmdldCwgcHJvcGVydHlLZXkgWywgcmVjZWl2ZXJdKVxudmFyIGdPUEQgPSByZXF1aXJlKCcuL19vYmplY3QtZ29wZCcpO1xudmFyIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdwbycpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG5cbmZ1bmN0aW9uIGdldCh0YXJnZXQsIHByb3BlcnR5S2V5IC8qICwgcmVjZWl2ZXIgKi8pIHtcbiAgdmFyIHJlY2VpdmVyID0gYXJndW1lbnRzLmxlbmd0aCA8IDMgPyB0YXJnZXQgOiBhcmd1bWVudHNbMl07XG4gIHZhciBkZXNjLCBwcm90bztcbiAgaWYgKGFuT2JqZWN0KHRhcmdldCkgPT09IHJlY2VpdmVyKSByZXR1cm4gdGFyZ2V0W3Byb3BlcnR5S2V5XTtcbiAgaWYgKGRlc2MgPSBnT1BELmYodGFyZ2V0LCBwcm9wZXJ0eUtleSkpIHJldHVybiBoYXMoZGVzYywgJ3ZhbHVlJylcbiAgICA/IGRlc2MudmFsdWVcbiAgICA6IGRlc2MuZ2V0ICE9PSB1bmRlZmluZWRcbiAgICAgID8gZGVzYy5nZXQuY2FsbChyZWNlaXZlcilcbiAgICAgIDogdW5kZWZpbmVkO1xuICBpZiAoaXNPYmplY3QocHJvdG8gPSBnZXRQcm90b3R5cGVPZih0YXJnZXQpKSkgcmV0dXJuIGdldChwcm90bywgcHJvcGVydHlLZXksIHJlY2VpdmVyKTtcbn1cblxuJGV4cG9ydCgkZXhwb3J0LlMsICdSZWZsZWN0JywgeyBnZXQ6IGdldCB9KTtcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXM2LnJlZmxlY3QuZ2V0Jyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uLy4uL21vZHVsZXMvX2NvcmUnKS5SZWZsZWN0LmdldDtcbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMvbGlicmFyeS9mbi9yZWZsZWN0L2dldFwiKTsiLCJ2YXIgZ2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKFwiLi9nZXRQcm90b3R5cGVPZlwiKTtcblxuZnVuY3Rpb24gX3N1cGVyUHJvcEJhc2Uob2JqZWN0LCBwcm9wZXJ0eSkge1xuICB3aGlsZSAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KSkge1xuICAgIG9iamVjdCA9IGdldFByb3RvdHlwZU9mKG9iamVjdCk7XG4gICAgaWYgKG9iamVjdCA9PT0gbnVsbCkgYnJlYWs7XG4gIH1cblxuICByZXR1cm4gb2JqZWN0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9zdXBlclByb3BCYXNlOyIsInZhciBfT2JqZWN0JGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoXCIuLi9jb3JlLWpzL29iamVjdC9nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3JcIik7XG5cbnZhciBfUmVmbGVjdCRnZXQgPSByZXF1aXJlKFwiLi4vY29yZS1qcy9yZWZsZWN0L2dldFwiKTtcblxudmFyIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZShcIi4vZ2V0UHJvdG90eXBlT2ZcIik7XG5cbnZhciBzdXBlclByb3BCYXNlID0gcmVxdWlyZShcIi4vc3VwZXJQcm9wQmFzZVwiKTtcblxuZnVuY3Rpb24gX2dldCh0YXJnZXQsIHByb3BlcnR5LCByZWNlaXZlcikge1xuICBpZiAodHlwZW9mIFJlZmxlY3QgIT09IFwidW5kZWZpbmVkXCIgJiYgX1JlZmxlY3QkZ2V0KSB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBfZ2V0ID0gX1JlZmxlY3QkZ2V0O1xuICB9IGVsc2Uge1xuICAgIG1vZHVsZS5leHBvcnRzID0gX2dldCA9IGZ1bmN0aW9uIF9nZXQodGFyZ2V0LCBwcm9wZXJ0eSwgcmVjZWl2ZXIpIHtcbiAgICAgIHZhciBiYXNlID0gc3VwZXJQcm9wQmFzZSh0YXJnZXQsIHByb3BlcnR5KTtcbiAgICAgIGlmICghYmFzZSkgcmV0dXJuO1xuXG4gICAgICB2YXIgZGVzYyA9IF9PYmplY3QkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGJhc2UsIHByb3BlcnR5KTtcblxuICAgICAgaWYgKGRlc2MuZ2V0KSB7XG4gICAgICAgIHJldHVybiBkZXNjLmdldC5jYWxsKHJlY2VpdmVyKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGRlc2MudmFsdWU7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBfZ2V0KHRhcmdldCwgcHJvcGVydHksIHJlY2VpdmVyIHx8IHRhcmdldCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2dldDsiLCJleHBvcnQgZnVuY3Rpb24gYXR0cmlidXRlcyguLi5tYXBwZXJzKSB7XG4gIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXBwZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBtYXBwZXIgPSBtYXBwZXJzW2ldO1xuXG4gICAgICBmb3IgKGxldCBrID0gMDsgayA8IG1hcHBlci5tYXAubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgY29uc3QgYXR0cmlidXRlID0gbWFwcGVyLm1hcFtrXTtcblxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LnByb3RvdHlwZSwgYXR0cmlidXRlLCB7XG4gICAgICAgICAgZ2V0OiBtYXBwZXIuZ2V0dGVyKGF0dHJpYnV0ZSksXG4gICAgICAgICAgc2V0OiBtYXBwZXIuc2V0dGVyKGF0dHJpYnV0ZSksXG4gICAgICAgICAgY29uZmlndXJhYmxlOiBtYXBwZXIuY29uZmlndXJhYmxlLFxuICAgICAgICAgIGVudW1lcmFibGU6IG1hcHBlci5lbnVtZXJhYmxlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvcHkoLi4ubWFwKSB7XG4gIHJldHVybiB7XG4gICAgbWFwLFxuICAgIGdldHRlcihuYW1lKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uYXRpdmVbbmFtZV07XG4gICAgICB9O1xuICAgIH0sXG4gICAgc2V0dGVyKG5hbWUpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdGhpcy5uYXRpdmVbbmFtZV0uY29weSh2YWx1ZSk7XG4gICAgICB9O1xuICAgIH0sXG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGVudW1lcmFibGU6IHRydWVcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1pcnJvciguLi5tYXApIHtcbiAgcmV0dXJuIHtcbiAgICBtYXAsXG4gICAgZ2V0dGVyKG5hbWUpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hdGl2ZVtuYW1lXTtcbiAgICAgIH07XG4gICAgfSxcbiAgICBzZXR0ZXIobmFtZSkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB0aGlzLm5hdGl2ZVtuYW1lXSA9IHZhbHVlO1xuICAgICAgfTtcbiAgICB9LFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBlbnVtZXJhYmxlOiB0cnVlXG4gIH07XG59XG4iLCJpbXBvcnQge01lc2h9IGZyb20gJ3RocmVlJztcbmltcG9ydCB7Q29tcG9uZW50fSBmcm9tICcuL0NvbXBvbmVudCc7XG5cbmltcG9ydCB7YXR0cmlidXRlcywgY29weSwgbWlycm9yfSBmcm9tICcuL3Byb3RvdHlwZS9hdHRyaWJ1dGVzJztcbmltcG9ydCB7Q29tcG9zaXRpb25FcnJvcn0gZnJvbSAnLi9lcnJvcnMnO1xuXG5AYXR0cmlidXRlcyhcbiAgY29weSgncG9zaXRpb24nLCAncm90YXRpb24nLCAncXVhdGVybmlvbicsICdzY2FsZScpLFxuICBtaXJyb3IoJ21hdGVyaWFsJywgJ2dlb21ldHJ5Jylcbilcbi8qKlxuICogQGNsYXNzIE1lc2hDb21wb25lbnRcbiAqIEBjYXRlZ29yeSBjb3JlXG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtc10gLSBUaGUgcGFyYW1ldGVycyBvYmplY3QuXG4gKiBAcGFyYW0ge09iamVjdH0gW2luc3RydWN0aW9uc10gLSBUaGUgaW5zdHJ1Y3Rpb25zIG9iamVjdC5cbiAqIEBleHRlbmRzIG1vZHVsZTpjb3JlLkNvbXBvbmVudFxuICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlXG4gKi9cbmNsYXNzIE1lc2hDb21wb25lbnQgZXh0ZW5kcyBDb21wb25lbnQge1xuICAvKipcbiAgICogRGVmYXVsdCB2YWx1ZXMgZm9yIHBhcmFtZXRlcnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29yZS5NZXNoQ29tcG9uZW50I2RlZmF1bHRzXG4gICAqIEBzdGF0aWNcbiAgICogQGRlZmF1bHRcbiAgICoge1xuICAgKiAgIGJ1aWxkOiB0cnVlLFxuICAgKiAgIGdlb21ldHJ5OiB7fSxcbiAgICogICBtYXRlcmlhbDogZmFsc2UsXG4gICAqXG4gICAqICAgc2hhZG93OiB7XG4gICAqICAgICBjYXN0OiB0cnVlLFxuICAgKiAgICAgcmVjZWl2ZTogdHJ1ZVxuICAgKiAgIH0sXG4gICAqXG4gICAqICAgcG9zaXRpb246IHt4OiAwLCB5OiAwLCB6OiAwfSxcbiAgICogICByb3RhdGlvbjoge3g6IDAsIHk6IDAsIHo6IDB9LFxuICAgKiAgIHNjYWxlOiB7eDogMSwgeTogMSwgejogMX1cbiAgICogfVxuICAgKi9cbiAgc3RhdGljIGRlZmF1bHRzID0ge1xuICAgIC4uLkNvbXBvbmVudC5kZWZhdWx0cyxcblxuICAgIGJ1aWxkOiB0cnVlLFxuICAgIGdlb21ldHJ5OiB7fSxcbiAgICBtYXRlcmlhbDogZmFsc2UsXG5cbiAgICBzaGFkb3c6IHtcbiAgICAgIGNhc3Q6IHRydWUsXG4gICAgICByZWNlaXZlOiB0cnVlXG4gICAgfSxcblxuICAgIHBvc2l0aW9uOiB7eDogMCwgeTogMCwgejogMH0sXG4gICAgcm90YXRpb246IHt4OiAwLCB5OiAwLCB6OiAwfSxcbiAgICBzY2FsZToge3g6IDEsIHk6IDEsIHo6IDF9XG4gIH07XG5cbiAgLyoqXG4gICAqIFN0YXRpYyBpbnN0cnVjdGlvbnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29yZS5NZXNoQ29tcG9uZW50I2luc3RydWN0aW9uc1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0XG4gICAqIHtcbiAgICogICBwb3NpdGlvbjogWyd4JywgJ3knLCAneiddLFxuICAgKiAgIHJvdGF0aW9uOiBbJ3gnLCAneScsICd6J10sXG4gICAqICAgc2NhbGU6IFsneCcsICd5JywgJ3onXVxuICAgKiB9XG4gICAqL1xuICBzdGF0aWMgaW5zdHJ1Y3Rpb25zID0ge1xuICAgIHBvc2l0aW9uOiBbJ3gnLCAneScsICd6J10sXG4gICAgcm90YXRpb246IFsneCcsICd5JywgJ3onXSxcbiAgICBzY2FsZTogWyd4JywgJ3knLCAneiddXG4gIH07XG5cbiAgLy8gQ1VTVE9NIEdFT01FVFJZIEhBTkRMSU5HXG5cbiAgc3RhdGljIGN1c3RvbShnZW9tLCBjb25zdHJ1Y3RvciA9IE1lc2gpIHtcbiAgICByZXR1cm4gY2xhc3MgZXh0ZW5kcyBNZXNoQ29tcG9uZW50IHtcbiAgICAgIGJ1aWxkKHBhcmFtcyA9IHRoaXMucGFyYW1zKSB7XG4gICAgICAgIGNvbnN0IHtnZW9tZXRyeSwgbWF0ZXJpYWx9ID0gdGhpcy5hcHBseUJyaWRnZSh7XG4gICAgICAgICAgZ2VvbWV0cnk6IGdlb20sXG4gICAgICAgICAgbWF0ZXJpYWw6IHBhcmFtcy5tYXRlcmlhbFxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdGhpcy5hcHBseUJyaWRnZSh7bWVzaDogbmV3IGNvbnN0cnVjdG9yKGdlb21ldHJ5LCBtYXRlcmlhbCl9KS5tZXNoO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBzdGF0aWMgY3JlYXRlKGdlb20sIHBhcmFtcywgY29uc3RydWN0b3IpIHtcbiAgICByZXR1cm4gbmV3IChNZXNoQ29tcG9uZW50LmN1c3RvbShnZW9tLCBjb25zdHJ1Y3RvcikpKHBhcmFtcyk7XG4gIH1cblxuICBzdGF0aWMgZnJvbShtZXNoLCBwYXJhbXMgPSB7fSkge1xuICAgIHBhcmFtcy5idWlsZCA9IGZhbHNlO1xuXG4gICAgY29uc3QgY29tcG9uZW50ID0gbmV3IE1lc2hDb21wb25lbnQocGFyYW1zKTtcblxuICAgIGNvbXBvbmVudC5uYXRpdmUgPSBtZXNoO1xuICAgIGNvbXBvbmVudC53cmFwKCk7XG5cbiAgICByZXR1cm4gY29tcG9uZW50O1xuICB9XG5cbiAgY29uc3RydWN0b3IocGFyYW1zLCBkZWZhdWx0cyA9IE1lc2hDb21wb25lbnQuZGVmYXVsdHMsIGluc3RydWN0aW9ucyA9IE1lc2hDb21wb25lbnQuaW5zdHJ1Y3Rpb25zKSB7XG4gICAgc3VwZXIocGFyYW1zLCBkZWZhdWx0cywgaW5zdHJ1Y3Rpb25zKTtcblxuICAgIGlmICh0aGlzLnBhcmFtcy5idWlsZCkge1xuICAgICAgY29uc3QgYnVpbGQgPSB0aGlzLmJ1aWxkKHRoaXMucGFyYW1zKTtcblxuICAgICAgaWYgKCFidWlsZCkge1xuICAgICAgICB0aHJvdyBuZXcgQ29tcG9zaXRpb25FcnJvcihcbiAgICAgICAgICAnTWVzaENvbXBvbmVudCcsXG4gICAgICAgICAgJy5idWlsZCgpIG1ldGhvZCBzaG91bGQgcmV0dXJuIGEgVEhSRUUuT2JqZWN0M0Qgb3IgYSBQcm9taXNlIHJlc29sdmVkIHdpdGggVEhSRUUuT2JqZWN0M0QuJyxcbiAgICAgICAgICB0aGlzXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGlmIChidWlsZCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgdGhpcy53YWl0KGJ1aWxkKTtcblxuICAgICAgICB0aGlzLndhaXQobmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgICAgYnVpbGQudGhlbihuYXRpdmUgPT4ge1xuICAgICAgICAgICAgdGhpcy5uYXRpdmUgPSBuYXRpdmU7XG4gICAgICAgICAgICB0aGlzLndyYXAoKS50aGVuKHJlc29sdmUpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm5hdGl2ZSA9IGJ1aWxkO1xuICAgICAgICB0aGlzLndhaXQodGhpcy53cmFwKCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuYXBwbHlDb21tYW5kKCdwb3N0SW50ZWdyYXRlJyk7XG4gIH1cblxuICAvLyBCVUlMRElORyAmIFdSQVBQSU5HXG5cbiAgLyoqXG4gICAqIEBtZXRob2QgYnVpbGRcbiAgICogQGRlc2NyaXB0aW9uIEJ1aWxkIGxpdmVjeWNsZSBzaG91bGQgcmV0dXJuIGEgbmF0aXZlIG9iamVjdC5cbiAgICogQHRocm93cyB7Q29tcG9zaXRpb25FcnJvcn1cbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLk1lc2hDb21wb25lbnRcbiAgICovXG4gIGJ1aWxkKCkge1xuICAgIHRocm93IG5ldyBDb21wb3NpdGlvbkVycm9yKFxuICAgICAgJ01lc2hDb21wb25lbnQnLFxuICAgICAgJ0luc3RhbmNlIHNob3VsZCBoYXZlIGl0XFwncyBvd24gLmJ1aWxkKCkuJyxcbiAgICAgIHRoaXNcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2Qgd3JhcFxuICAgKiBAaW5zdGFuY2VcbiAgICogQGRlc2NyaXB0aW9uIFdyYXBzIHRyYW5zZm9ybXMgKGBwb3NpdGlvbmAgJiBgcm90YXRpb25gKVxuICAgKiBAcmV0dXJuIHtQcm9taXNlfSBSZXNvbHZlZCB3aGVuIGFjdGlvbiBpcyBjb21wbGV0ZWRcbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLk1lc2hDb21wb25lbnRcbiAgICovXG4gIHdyYXAoKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgLy8gVE9ETzogRml4IGRlZmVyIHdpdGggcGh5c2ljc1xuICAgICAgLy8gdGhpcy5kZWZlcigoKSA9PiB7XG4gICAgICBjb25zdCB7cG9zaXRpb24sIHJvdGF0aW9uLCBzY2FsZSwgc2hhZG93fSA9IHRoaXMucGFyYW1zO1xuXG4gICAgICB0aGlzLnBvc2l0aW9uLnNldChwb3NpdGlvbi54LCBwb3NpdGlvbi55LCBwb3NpdGlvbi56KTtcbiAgICAgIHRoaXMucm90YXRpb24uc2V0KHJvdGF0aW9uLngsIHJvdGF0aW9uLnksIHJvdGF0aW9uLnopO1xuICAgICAgdGhpcy5zY2FsZS5zZXQoc2NhbGUueCwgc2NhbGUueSwgc2NhbGUueik7XG5cbiAgICAgIHRoaXMubmF0aXZlLmNhc3RTaGFkb3cgPSBzaGFkb3cuY2FzdDtcbiAgICAgIHRoaXMubmF0aXZlLnJlY2VpdmVTaGFkb3cgPSBzaGFkb3cucmVjZWl2ZTtcblxuICAgICAgdGhpcy5hcHBseUJyaWRnZSh7b25XcmFwOiAxfSk7XG5cbiAgICAgIHJlc29sdmUodGhpcyk7XG4gICAgICAvLyB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIENPUFlJTkcgJiBDTE9OSU5HXG5cbiAgLyoqXG4gICAqIEBtZXRob2QgY29weVxuICAgKiBAaW5zdGFuY2VcbiAgICogQGRlc2NyaXB0aW9uIENvcHkgc291cmNlIHRyYW5zZm9ybXMgJiBleGVjdXRlIGBDb21wb25lbnQuY29weSgpYFxuICAgKiBAcmV0dXJuIHt0aGlzfSBNZXNoQ29tcG9uZW50XG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZS5NZXNoQ29tcG9uZW50XG4gICAqL1xuICBjb3B5KHNvdXJjZSkge1xuICAgIHJldHVybiBzdXBlci5jb3B5KHNvdXJjZSwgKCkgPT4ge1xuICAgICAgdGhpcy5wb3NpdGlvbi5jb3B5KHNvdXJjZS5wb3NpdGlvbik7XG4gICAgICB0aGlzLnJvdGF0aW9uLmNvcHkoc291cmNlLnJvdGF0aW9uKTtcbiAgICAgIHRoaXMucXVhdGVybmlvbi5jb3B5KHNvdXJjZS5xdWF0ZXJuaW9uKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGNsb25lXG4gICAqIEBpbnN0YW5jZVxuICAgKiBAZGVzY3JpcHRpb24gTWFrZSBhIGNsb25lIG9mIHRoaXMgTWVzaENvbXBvbmVudCB1c2luZyBgLmNvcHkoKWBcbiAgICogQHJldHVybiB7TWVzaENvbXBvbmVudH0gY2xvbmUgb2YgdGhpcyBvYmplY3RcbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLk1lc2hDb21wb25lbnRcbiAgICovXG4gIGNsb25lKGdlb21ldHJ5LCBtYXRlcmlhbCkge1xuICAgIGNvbnN0IGRlc3QgPSBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih7YnVpbGQ6IGZhbHNlfSkuY29weSh0aGlzKTtcblxuICAgIGlmIChnZW9tZXRyeSkgZGVzdC5nZW9tZXRyeSA9IGRlc3QuZ2VvbWV0cnkuY2xvbmUoKTtcbiAgICBpZiAobWF0ZXJpYWwpIGRlc3QubWF0ZXJpYWwgPSBkZXN0Lm1hdGVyaWFsLmNsb25lKCk7XG5cbiAgICByZXR1cm4gZGVzdDtcbiAgfVxufVxuXG5leHBvcnQge1xuICBNZXNoQ29tcG9uZW50XG59O1xuIiwiaW1wb3J0IHtDb21wb25lbnR9IGZyb20gJy4vQ29tcG9uZW50JztcblxuaW1wb3J0IHthdHRyaWJ1dGVzLCBjb3B5fSBmcm9tICcuL3Byb3RvdHlwZS9hdHRyaWJ1dGVzJztcbmltcG9ydCB7Q29tcG9zaXRpb25FcnJvcn0gZnJvbSAnLi9lcnJvcnMnO1xuXG5AYXR0cmlidXRlcyhcbiAgY29weSgncG9zaXRpb24nLCAncm90YXRpb24nLCAncXVhdGVybmlvbicsICd0YXJnZXQnKVxuKVxuLyoqXG4gKiBAY2xhc3MgTGlnaHRDb21wb25lbnRcbiAqIEBjYXRlZ29yeSBjb3JlXG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtc10gLSBUaGUgcGFyYW1ldGVycyBvYmplY3QuXG4gKiBAcGFyYW0ge09iamVjdH0gW2luc3RydWN0aW9uc10gLSBUaGUgaW5zdHJ1Y3Rpb25zIG9iamVjdC5cbiAqIEBleHRlbmRzIG1vZHVsZTpjb3JlLkNvbXBvbmVudFxuICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlXG4gKi9cbmNsYXNzIExpZ2h0Q29tcG9uZW50IGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgLyoqXG4gICAqIERlZmF1bHQgdmFsdWVzIGZvciBwYXJhbWV0ZXJzXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvcmUuTGlnaHRDb21wb25lbnQjZGVmYXVsdHNcbiAgICogQHN0YXRpY1xuICAgKiBAZGVmYXVsdFxuICAgKiB7XG4gICAqICAgYnVpbGQ6IHRydWUsXG4gICAqXG4gICAqICAgc2hhZG93OiB7XG4gICAqICAgICBjYXN0OiB0cnVlLFxuICAgKlxuICAgKiAgICAgYmlhczogMCxcbiAgICogICAgIHJhZGl1czogMSxcbiAgICpcbiAgICogICAgIG1hcFNpemU6IHtcbiAgICogICAgICAgd2lkdGg6IDEwMjQsXG4gICAqICAgICAgIGhlaWdodDogMTAyNFxuICAgKiAgICAgfSxcbiAgICpcbiAgICogICAgIGNhbWVyYToge1xuICAgKiAgICAgICBuZWFyOiB0cnVlLFxuICAgKiAgICAgICBmYXI6IDQwMCxcbiAgICogICAgICAgZm92OiA5MCxcbiAgICpcbiAgICogICAgICAgdG9wOiAyMDAsXG4gICAqICAgICAgIGJvdHRvbTogLTIwMCxcbiAgICogICAgICAgbGVmdDogLTIwMCxcbiAgICogICAgICAgcmlnaHQ6IDIwMFxuICAgKiAgICAgfVxuICAgKiAgIH0sXG4gICAqXG4gICAqICAgcG9zaXRpb246IHt4OiAwLCB5OiAwLCB6OiAwfSxcbiAgICogICByb3RhdGlvbjoge3g6IDAsIHk6IDAsIHo6IDB9XG4gICAqIH1cbiAgICovXG4gIHN0YXRpYyBkZWZhdWx0cyA9IHtcbiAgICAuLi5Db21wb25lbnQuZGVmYXVsdHMsXG5cbiAgICBidWlsZDogdHJ1ZSxcblxuICAgIHNoYWRvdzoge1xuICAgICAgY2FzdDogdHJ1ZSxcblxuICAgICAgYmlhczogMCxcbiAgICAgIHJhZGl1czogMSxcblxuICAgICAgbWFwU2l6ZToge1xuICAgICAgICB3aWR0aDogMTAyNCxcbiAgICAgICAgaGVpZ2h0OiAxMDI0XG4gICAgICB9LFxuXG4gICAgICBjYW1lcmE6IHtcbiAgICAgICAgbmVhcjogdHJ1ZSxcbiAgICAgICAgZmFyOiA0MDAsXG4gICAgICAgIGZvdjogOTAsXG5cbiAgICAgICAgdG9wOiAyMDAsXG4gICAgICAgIGJvdHRvbTogLTIwMCxcbiAgICAgICAgbGVmdDogLTIwMCxcbiAgICAgICAgcmlnaHQ6IDIwMFxuICAgICAgfVxuICAgIH0sXG5cbiAgICBwb3NpdGlvbjoge3g6IDAsIHk6IDAsIHo6IDB9LFxuICAgIHJvdGF0aW9uOiB7eDogMCwgeTogMCwgejogMH1cbiAgfTtcblxuICAvKipcbiAgICogU3RhdGljIGluc3RydWN0aW9uc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb3JlLkxpZ2h0Q29tcG9uZW50I2luc3RydWN0aW9uc1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0XG4gICAqIHtcbiAgICogICBwb3NpdGlvbjogWyd4JywgJ3knLCAneiddLFxuICAgKiAgIHJvdGF0aW9uOiBbJ3gnLCAneScsICd6J11cbiAgICogfVxuICAgKi9cbiAgc3RhdGljIGluc3RydWN0aW9ucyA9IHtcbiAgICBwb3NpdGlvbjogWyd4JywgJ3knLCAneiddLFxuICAgIHJvdGF0aW9uOiBbJ3gnLCAneScsICd6J11cbiAgfTtcblxuICBzdGF0aWMgZnJvbShsaWdodCwgcGFyYW1zID0ge30sIHdyYXBTaGFkb3cgPSB0cnVlKSB7XG4gICAgcGFyYW1zLmJ1aWxkID0gZmFsc2U7XG5cbiAgICBjb25zdCBjb21wb25lbnQgPSBuZXcgTGlnaHRDb21wb25lbnQocGFyYW1zKTtcblxuICAgIGNvbXBvbmVudC5uYXRpdmUgPSBsaWdodDtcbiAgICBjb21wb25lbnQud3JhcCgpO1xuICAgIGlmICh3cmFwU2hhZG93KSBjb21wb25lbnQud3JhcFNoYWRvdygpO1xuXG4gICAgcmV0dXJuIGNvbXBvbmVudDtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHBhcmFtcywgZGVmYXVsdHMgPSBMaWdodENvbXBvbmVudC5kZWZhdWx0cywgaW5zdHJ1Y3Rpb25zID0gTGlnaHRDb21wb25lbnQuaW5zdHJ1Y3Rpb25zKSB7XG4gICAgc3VwZXIocGFyYW1zLCBkZWZhdWx0cywgaW5zdHJ1Y3Rpb25zKTtcblxuICAgIGlmICh0aGlzLnBhcmFtcy5idWlsZCkge1xuICAgICAgY29uc3QgYnVpbGQgPSB0aGlzLmJ1aWxkKHRoaXMucGFyYW1zKTtcblxuICAgICAgaWYgKCFidWlsZCkge1xuICAgICAgICB0aHJvdyBuZXcgQ29tcG9zaXRpb25FcnJvcihcbiAgICAgICAgICAnTGlnaHRDb21wb25lbnQnLFxuICAgICAgICAgICcuYnVpbGQoKSBtZXRob2Qgc2hvdWxkIHJldHVybiBhIFRIUkVFLk9iamVjdDNEIG9yIGEgUHJvbWlzZSByZXNvbHZlZCB3aXRoIFRIUkVFLk9iamVjdDNELicsXG4gICAgICAgICAgdGhpc1xuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAoYnVpbGQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgIGJ1aWxkLnRoZW4obmF0aXZlID0+IHtcbiAgICAgICAgICB0aGlzLm5hdGl2ZSA9IG5hdGl2ZTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgdGhpcy5uYXRpdmUgPSBidWlsZDtcblxuICAgICAgdGhpcy53YWl0KHRoaXMud3JhcCgpKTtcbiAgICB9XG5cbiAgICB0aGlzLmFwcGx5Q29tbWFuZCgncG9zdEludGVncmF0ZScpO1xuICB9XG5cbiAgLy8gQlVJTERJTkcgJiBXUkFQUElOR1xuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGJ1aWxkXG4gICAqIEBpbnN0YW5jZVxuICAgKiBAZGVzY3JpcHRpb24gQnVpbGQgbGl2ZWN5Y2xlIHNob3VsZCByZXR1cm4gYSBuYXRpdmUgb2JqZWN0LlxuICAgKiBAdGhyb3dzIHtDb21wb3NpdGlvbkVycm9yfVxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmUuTGlnaHRDb21wb25lbnRcbiAgICovXG4gIGJ1aWxkKCkge1xuICAgIHRocm93IG5ldyBDb21wb3NpdGlvbkVycm9yKFxuICAgICAgJ01lc2hDb21wb25lbnQnLFxuICAgICAgJ0luc3RhbmNlIHNob3VsZCBoYXZlIGl0XFwncyBvd24gLmJ1aWxkKCkuJyxcbiAgICAgIHRoaXNcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2Qgd3JhcFxuICAgKiBAaW5zdGFuY2VcbiAgICogQGRlc2NyaXB0aW9uIFdyYXBzIHRyYW5zZm9ybXMgKGBwb3NpdGlvbmAgJiBgcm90YXRpb25gKVxuICAgKiBAcmV0dXJuIHtQcm9taXNlfSBSZXNvbHZlZCB3aGVuIGFjdGlvbiBpcyBjb21wbGV0ZWRcbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLkxpZ2h0Q29tcG9uZW50XG4gICAqL1xuICB3cmFwKCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgIHRoaXMuZGVmZXIoKCkgPT4ge1xuICAgICAgICBjb25zdCB7cG9zaXRpb24sIHJvdGF0aW9ufSA9IHRoaXMucGFyYW1zO1xuXG4gICAgICAgIHRoaXMucG9zaXRpb24uc2V0KHBvc2l0aW9uLngsIHBvc2l0aW9uLnksIHBvc2l0aW9uLnopO1xuICAgICAgICB0aGlzLnJvdGF0aW9uLnNldChyb3RhdGlvbi54LCByb3RhdGlvbi55LCByb3RhdGlvbi56KTtcblxuICAgICAgICB0aGlzLmFwcGx5QnJpZGdlKHtvbldyYXA6IDF9KTtcblxuICAgICAgICByZXNvbHZlKHRoaXMpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCB3cmFwU2hhZG93XG4gICAqIEBpbnN0YW5jZVxuICAgKiBAZGVzY3JpcHRpb24gV3JhcHMgc2hhZG93IHByb3BlcnRpZXNcbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLkxpZ2h0Q29tcG9uZW50XG4gICAqL1xuICB3cmFwU2hhZG93KCkge1xuICAgIGNvbnN0IHtuYXRpdmUsIHBhcmFtczoge3NoYWRvd319ID0gdGhpcztcblxuICAgIG5hdGl2ZS5jYXN0U2hhZG93ID0gc2hhZG93LmNhc3Q7XG4gICAgbmF0aXZlLnNoYWRvdy5tYXBTaXplLndpZHRoID0gc2hhZG93Lm1hcFNpemUud2lkdGg7XG4gICAgbmF0aXZlLnNoYWRvdy5tYXBTaXplLmhlaWdodCA9IHNoYWRvdy5tYXBTaXplLmhlaWdodDtcbiAgICBuYXRpdmUuc2hhZG93LmJpYXMgPSBzaGFkb3cuYmlhcztcbiAgICBuYXRpdmUuc2hhZG93LnJhZGl1cyA9IHNoYWRvdy5yYWRpdXM7XG5cbiAgICBjb25zdCBzaGFkb3dDYW1lcmEgPSBuYXRpdmUuc2hhZG93LmNhbWVyYTtcbiAgICBjb25zdCB7Y2FtZXJhfSA9IHNoYWRvdztcblxuICAgIHNoYWRvd0NhbWVyYS5uZWFyID0gY2FtZXJhLm5lYXI7XG4gICAgc2hhZG93Q2FtZXJhLmZhciA9IGNhbWVyYS5mYXI7XG4gICAgc2hhZG93Q2FtZXJhLmZvdiA9IGNhbWVyYS5mb3Y7XG5cbiAgICBzaGFkb3dDYW1lcmEubGVmdCA9IGNhbWVyYS5sZWZ0O1xuICAgIHNoYWRvd0NhbWVyYS5yaWdodCA9IGNhbWVyYS5yaWdodDtcbiAgICBzaGFkb3dDYW1lcmEudG9wID0gY2FtZXJhLnRvcDtcbiAgICBzaGFkb3dDYW1lcmEuYm90dG9tID0gY2FtZXJhLmJvdHRvbTtcbiAgfVxuXG4gIC8vIENPUFlJTkcgJiBDTE9OSU5HXG5cbiAgLyoqXG4gICAqIEBtZXRob2QgY29weVxuICAgKiBAaW5zdGFuY2VcbiAgICogQGRlc2NyaXB0aW9uIENvcHkgc291cmNlIHRyYW5zZm9ybXMgJiBleGVjdXRlIGBDb21wb25lbnQuY29weSgpYFxuICAgKiBAcmV0dXJuIHt0aGlzfSBMaWdodENvbXBvbmVudFxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmUuTGlnaHRDb21wb25lbnRcbiAgICovXG4gIGNvcHkoc291cmNlKSB7XG4gICAgcmV0dXJuIHN1cGVyLmNvcHkoc291cmNlLCAoKSA9PiB7XG4gICAgICBpZiAodGhpcy50YXJnZXQpIHRoaXMudGFyZ2V0LmNvcHkoc291cmNlLnRhcmdldCgpKTtcblxuICAgICAgdGhpcy5wb3NpdGlvbi5jb3B5KHNvdXJjZS5wb3NpdGlvbik7XG4gICAgICB0aGlzLnJvdGF0aW9uLmNvcHkoc291cmNlLnJvdGF0aW9uKTtcbiAgICAgIHRoaXMucXVhdGVybmlvbi5jb3B5KHNvdXJjZS5xdWF0ZXJuaW9uKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGNsb25lXG4gICAqIEBpbnN0YW5jZVxuICAgKiBAZGVzY3JpcHRpb24gTWFrZSBhIGNsb25lIG9mIHRoaXMgTGlnaHRDb21wb25lbnQgdXNpbmcgYC5jb3B5KClgXG4gICAqIEByZXR1cm4ge0xpZ2h0Q29tcG9uZW50fSBjbG9uZSBvZiB0aGlzIG9iamVjdFxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmUuTGlnaHRDb21wb25lbnRcbiAgICovXG4gIGNsb25lKCkge1xuICAgIHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih7YnVpbGQ6IGZhbHNlfSkuY29weSh0aGlzKTtcbiAgfVxufVxuXG5leHBvcnQge1xuICBMaWdodENvbXBvbmVudFxufTtcbiIsImltcG9ydCB7Q29tcG9uZW50fSBmcm9tICcuL0NvbXBvbmVudCc7XG5cbmltcG9ydCB7YXR0cmlidXRlcywgY29weX0gZnJvbSAnLi9wcm90b3R5cGUvYXR0cmlidXRlcyc7XG5pbXBvcnQge0NvbXBvc2l0aW9uRXJyb3J9IGZyb20gJy4vZXJyb3JzJztcblxuQGF0dHJpYnV0ZXMoXG4gIGNvcHkoJ3Bvc2l0aW9uJywgJ3JvdGF0aW9uJywgJ3F1YXRlcm5pb24nLCAndGFyZ2V0Jylcbilcbi8qKlxuICogQGNsYXNzIENhbWVyYUNvbXBvbmVudFxuICogQGNhdGVnb3J5IGNvcmVcbiAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zXSAtIFRoZSBwYXJhbWV0ZXJzIG9iamVjdC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbaW5zdHJ1Y3Rpb25zXSAtIFRoZSBpbnN0cnVjdGlvbnMgb2JqZWN0LlxuICogQGV4dGVuZHMgbW9kdWxlOmNvcmUuQ29tcG9uZW50XG4gKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmVcbiAqL1xuY2xhc3MgQ2FtZXJhQ29tcG9uZW50IGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgLyoqXG4gICAqIERlZmF1bHQgdmFsdWVzIGZvciBwYXJhbWV0ZXJzXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvcmUuQ2FtZXJhQ29tcG9uZW50I2RlZmF1bHRzXG4gICAqIEBzdGF0aWNcbiAgICogQGRlZmF1bHRcbiAgICoge1xuICAgKiAgIGJ1aWxkOiB0cnVlLFxuICAgKlxuICAgKiAgIHBvc2l0aW9uOiB7eDogMCwgeTogMCwgejogMH0sXG4gICAqICAgcm90YXRpb246IHt4OiAwLCB5OiAwLCB6OiAwfVxuICAgKiB9XG4gICAqL1xuICBzdGF0aWMgZGVmYXVsdHMgPSB7XG4gICAgLi4uQ29tcG9uZW50LmRlZmF1bHRzLFxuXG4gICAgYnVpbGQ6IHRydWUsXG5cbiAgICBwb3NpdGlvbjoge3g6IDAsIHk6IDAsIHo6IDB9LFxuICAgIHJvdGF0aW9uOiB7eDogMCwgeTogMCwgejogMH1cbiAgfTtcblxuICAvKipcbiAgICogU3RhdGljIGluc3RydWN0aW9uc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb3JlLkNhbWVyYUNvbXBvbmVudCNpbnN0cnVjdGlvbnNcbiAgICogQHN0YXRpY1xuICAgKiBAZGVmYXVsdFxuICAgKiB7XG4gICAqICAgcG9zaXRpb246IFsneCcsICd5JywgJ3onXSxcbiAgICogICByb3RhdGlvbjogWyd4JywgJ3knLCAneiddLFxuICAgKiAgIHNjYWxlOiBbJ3gnLCAneScsICd6J11cbiAgICogfVxuICAgKi9cbiAgc3RhdGljIGluc3RydWN0aW9ucyA9IHtcbiAgICBwb3NpdGlvbjogWyd4JywgJ3knLCAneiddLFxuICAgIHJvdGF0aW9uOiBbJ3gnLCAneScsICd6J10sXG4gICAgc2NhbGU6IFsneCcsICd5JywgJ3onXVxuICB9O1xuXG4gIHN0YXRpYyBmcm9tKGNhbWVyYSwgcGFyYW1zID0ge30pIHtcbiAgICBwYXJhbXMuYnVpbGQgPSBmYWxzZTtcblxuICAgIGNvbnN0IGNvbXBvbmVudCA9IG5ldyBDYW1lcmFDb21wb25lbnQocGFyYW1zKTtcblxuICAgIGNvbXBvbmVudC5uYXRpdmUgPSBjYW1lcmE7XG4gICAgY29tcG9uZW50LndyYXAoKTtcblxuICAgIHJldHVybiBjb21wb25lbnQ7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihwYXJhbXMsIGRlZmF1bHRzID0gQ2FtZXJhQ29tcG9uZW50LmRlZmF1bHRzLCBpbnN0cnVjdGlvbnMgPSBDYW1lcmFDb21wb25lbnQuaW5zdHJ1Y3Rpb25zKSB7XG4gICAgc3VwZXIocGFyYW1zLCBkZWZhdWx0cywgaW5zdHJ1Y3Rpb25zKTtcblxuICAgIGlmICh0aGlzLnBhcmFtcy5idWlsZCkge1xuICAgICAgY29uc3QgYnVpbGQgPSB0aGlzLmJ1aWxkKHRoaXMucGFyYW1zKTtcblxuICAgICAgaWYgKCFidWlsZCkge1xuICAgICAgICB0aHJvdyBuZXcgQ29tcG9zaXRpb25FcnJvcihcbiAgICAgICAgICAnQ2FtZXJhQ29tcG9uZW50JyxcbiAgICAgICAgICAnLmJ1aWxkKCkgbWV0aG9kIHNob3VsZCByZXR1cm4gYSBUSFJFRS5PYmplY3QzRCBvciBhIFByb21pc2UgcmVzb2x2ZWQgd2l0aCBUSFJFRS5PYmplY3QzRC4nLFxuICAgICAgICAgIHRoaXNcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGJ1aWxkIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICBidWlsZC50aGVuKG5hdGl2ZSA9PiB7XG4gICAgICAgICAgdGhpcy5uYXRpdmUgPSBuYXRpdmU7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHRoaXMubmF0aXZlID0gYnVpbGQ7XG5cbiAgICAgIHRoaXMud2FpdCh0aGlzLndyYXAoKSk7XG4gICAgfVxuXG4gICAgdGhpcy5hcHBseUNvbW1hbmQoJ3Bvc3RJbnRlZ3JhdGUnKTtcbiAgfVxuXG4gIC8vIEJVSUxESU5HICYgV1JBUFBJTkdcblxuICAvKipcbiAgICogQG1ldGhvZCBidWlsZFxuICAgKiBAaW5zdGFuY2VcbiAgICogQGRlc2NyaXB0aW9uIEJ1aWxkIGxpdmVjeWNsZSBzaG91bGQgcmV0dXJuIGEgbmF0aXZlIG9iamVjdC5cbiAgICogQHRocm93cyB7Q29tcG9zaXRpb25FcnJvcn1cbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLkNhbWVyYUNvbXBvbmVudFxuICAgKi9cbiAgYnVpbGQoKSB7XG4gICAgdGhyb3cgbmV3IENvbXBvc2l0aW9uRXJyb3IoXG4gICAgICAnQ2FtZXJhQ29tcG9uZW50JyxcbiAgICAgICdJbnN0YW5jZSBzaG91bGQgaGF2ZSBpdFxcJ3Mgb3duIC5idWlsZCgpLicsXG4gICAgICB0aGlzXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIHdyYXBcbiAgICogQGluc3RhbmNlXG4gICAqIEBkZXNjcmlwdGlvbiBXcmFwcyB0cmFuc2Zvcm1zIChgcG9zaXRpb25gICYgYHJvdGF0aW9uYClcbiAgICogQHJldHVybiB7UHJvbWlzZX0gUmVzb2x2ZWQgd2hlbiBhY3Rpb24gaXMgY29tcGxldGVkXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZS5DYW1lcmFDb21wb25lbnRcbiAgICovXG4gIHdyYXAoKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgdGhpcy5kZWZlcigoKSA9PiB7XG4gICAgICAgIHRoaXMucG9zaXRpb24uc2V0KHRoaXMucGFyYW1zLnBvc2l0aW9uLngsIHRoaXMucGFyYW1zLnBvc2l0aW9uLnksIHRoaXMucGFyYW1zLnBvc2l0aW9uLnopO1xuICAgICAgICB0aGlzLnJvdGF0aW9uLnNldCh0aGlzLnBhcmFtcy5yb3RhdGlvbi54LCB0aGlzLnBhcmFtcy5yb3RhdGlvbi55LCB0aGlzLnBhcmFtcy5yb3RhdGlvbi56KTtcblxuICAgICAgICB0aGlzLmFwcGx5QnJpZGdlKHtvbldyYXA6IDF9KTtcblxuICAgICAgICByZXNvbHZlKHRoaXMpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBjb3B5XG4gICAqIEBpbnN0YW5jZVxuICAgKiBAZGVzY3JpcHRpb24gQ29weSBzb3VyY2UgdHJhbnNmb3JtcyAmIGV4ZWN1dGUgYENvbXBvbmVudC5jb3B5KClgXG4gICAqIEByZXR1cm4ge3RoaXN9IENhbWVyYUNvbXBvbmVudFxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmUuQ2FtZXJhQ29tcG9uZW50XG4gICAqL1xuICBjb3B5KHNvdXJjZSkge1xuICAgIHJldHVybiBzdXBlci5jb3B5KHNvdXJjZSwgKCkgPT4ge1xuICAgICAgaWYgKHRoaXMudGFyZ2V0KSB0aGlzLnRhcmdldC5jb3B5KHNvdXJjZS50YXJnZXQoKSk7XG5cbiAgICAgIHRoaXMucG9zaXRpb24uY29weShzb3VyY2UucG9zaXRpb24pO1xuICAgICAgdGhpcy5yb3RhdGlvbi5jb3B5KHNvdXJjZS5yb3RhdGlvbik7XG4gICAgICB0aGlzLnF1YXRlcm5pb24uY29weShzb3VyY2UucXVhdGVybmlvbik7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBjbG9uZVxuICAgKiBAaW5zdGFuY2VcbiAgICogQGRlc2NyaXB0aW9uIE1ha2UgYSBjbG9uZSBvZiB0aGlzIENhbWVyYUNvbXBvbmVudCB1c2luZyBgLmNvcHkoKWBcbiAgICogQHJldHVybiB7Q2FtZXJhQ29tcG9uZW50fSBjbG9uZSBvZiB0aGlzIG9iamVjdFxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmUuQ2FtZXJhQ29tcG9uZW50XG4gICAqL1xuICBjbG9uZSgpIHtcbiAgICByZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3Ioe2J1aWxkOiBmYWxzZX0pLmNvcHkodGhpcyk7XG4gIH1cbn1cblxuZXhwb3J0IHtcbiAgQ2FtZXJhQ29tcG9uZW50XG59O1xuIiwiZXhwb3J0IGNvbnN0IHN5c3RlbSA9IHtcbiAgd2luZG93OiB0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJyA/IGdsb2JhbCA6IHdpbmRvd1xufTtcbiIsImltcG9ydCB7dmVyc2lvbn0gZnJvbSAnLi4vLi4vcGFja2FnZS5qc29uJztcbmltcG9ydCB7c3lzdGVtfSBmcm9tICcuLi9wb2x5ZmlsbCc7XG5pbXBvcnQge01vZHVsZVN5c3RlbX0gZnJvbSAnLi9Nb2R1bGVTeXN0ZW0nO1xuaW1wb3J0IHtNb2R1bGVNYW5hZ2VyfSBmcm9tICcuL01vZHVsZU1hbmFnZXInO1xuXG4vKipcbiAqIEBjbGFzcyBBcHBcbiAqIEBjYXRlZ29yeSBjb3JlXG4gKiBAZGVzY3JpcHRpb24gVGhpcyBjb21wb25lbnQgaXMgdXNlZCB0byBwcmVwYXJlIGEgd29ybGQgc2NlbmUsIHNldHVwIHBoeXNpY3MsIGNhbWVyYSwgcmVuZGVyZXIgYW5kIGFsbCBvdGhlciB0aGluZ3MgdGhhdCB5b3UgdXN1YWxseSBkbyBiZWZvcmUgbWFraW5nIG1lc2hlcy5cbiAqIEBwYXJhbSB7QXJyYXl9IFttb2R1bGVzPVtdXSAtIEFycmF5IG9mIE1vZHVsZXNcbiAqIEBleHRlbmRzIE1vZHVsZVN5c3RlbVxuICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlXG4gKi9cbmNsYXNzIEFwcCBleHRlbmRzIE1vZHVsZVN5c3RlbSB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRGVmaW5lcyB3aGV0aGVyIHRoZSBzY2VuZSBzaG91bGQgcmVuZGVyIG9yIG5vdFxuICAgKiBAbWVtYmVyIHtCb29sZWFufSBtb2R1bGU6Y29yZS5BcHAjZW5hYmxlZFxuICAgKiBAcHVibGljXG4gICAqL1xuICBlbmFibGVkID0gdHJ1ZTtcblxuICAvKipcbiAgICogTG9vcHMgaW4gdGhpcyBhcHBcbiAgICogQGRlc2NyaXB0aW9uIEFycmF5IG9mIGxvb3BzIHRoYXQgYXJlIGV4ZWN1dGVkIGJ5IHRoaXMgYXBwLlxuICAgKiBAbWVtYmVyIHtBcnJheX0gbW9kdWxlOmNvcmUuQXBwI2xvb3BzXG4gICAqIEBwdWJsaWNcbiAgICovXG4gIGxvb3BzID0gW107XG5cbiAgY29uc3RydWN0b3IobW9kdWxlcyA9IFtdKSB7XG4gICAgY29uc29sZS5sb2coYFdIUy5BcHAgJHt2ZXJzaW9ufWApO1xuXG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLm1hbmFnZXIgPSBuZXcgTW9kdWxlTWFuYWdlcih0aGlzKTtcbiAgICB0aGlzLm1vZHVsZXMgPSBtb2R1bGVzO1xuXG4gICAgdGhpcy5pbnRlZ3JhdGVNb2R1bGVzKCk7XG4gIH1cblxuICAvLyBDT05UUk9MUyAmIFVQREFUSU5HXG5cbiAgLyoqXG4gICAqIEBtZXRob2Qgc3RhcnRcbiAgICogQGRlc2NyaXB0aW9uIFN0YXJ0IHJlbmRlcmluZyBsb29wIGFuZCBwaHlzaWNzIHNpbXVsYXRpb24gKGlmIHlvdSB1c2UgdmVyc2lvbiB3aXRoIHBoeXNpY3MpLlxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmUuQXBwXG4gICAqL1xuICBzdGFydCgpIHtcbiAgICBjb25zdCByZXF1ZXN0QW5pbUZyYW1lID0gKCgpID0+IHtcbiAgICAgIHJldHVybiBzeXN0ZW0ud2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZVxuICAgICAgICB8fCBzeXN0ZW0ud2luZG93LndlYmtpdFJlcXVlc3RBbmltYXRpb25GcmFtZVxuICAgICAgICB8fCBzeXN0ZW0ud2luZG93Lm1velJlcXVlc3RBbmltYXRpb25GcmFtZVxuICAgICAgICB8fCBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgICBzeXN0ZW0ud2luZG93LnNldFRpbWVvdXQoY2FsbGJhY2ssIDEwMDAgLyA2MCk7XG4gICAgICAgIH07XG4gICAgfSkoKTtcblxuICAgIGNvbnN0IHByb2Nlc3MgPSAoKSA9PiB7XG4gICAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0QW5pbUZyYW1lKCgpID0+IHByb2Nlc3MoKSk7XG4gICAgICBpZiAoIXRoaXMuZW5hYmxlZCkgcmV0dXJuO1xuXG4gICAgICBmb3IgKGxldCBpID0gMCwgbGwgPSB0aGlzLmxvb3BzLmxlbmd0aDsgaSA8IGxsOyBpKyspIHtcbiAgICAgICAgY29uc3QgZSA9IHRoaXMubG9vcHNbaV07XG4gICAgICAgIGlmIChlLmVuYWJsZWQpIGUuZXhlY3V0ZShlLmNsb2NrKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy5lbmFibGVkID0gdHJ1ZTtcblxuICAgIGlmICghdGhpcy5yZXF1ZXN0KVxuICAgICAgcHJvY2VzcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2Qgc3RvcFxuICAgKiBAZGVzY3JpcHRpb24gU3RvcHMgcmVuZGVyaW5nIGxvb3BzXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZS5BcHBcbiAgICovXG4gIHN0b3AoKSB7XG4gICAgdGhpcy5lbmFibGVkID0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBhZGRMb29wXG4gICAqIEBkZXNjcmlwdGlvbiBBZGRzIGxvb3AgdG8gdGhpcyBhcHAuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBsb29wIC0gdGhlIGxvb3AgdG8gYWRkXG4gICAqIEByZXR1cm4ge1Byb21pc2V9IFByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aGVuIHByb21pc2VzIGNvbXBsZXRlZC5cbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLkFwcFxuICAgKiBAZXhhbXBsZSA8Y2FwdGlvbj5BZGRpbmcgYSBsb29wIHRvIGFuIGFwcDwvY2FwdGlvbj5cbiAgICogY29uc3QgbG9vcCA9IG5ldyBMb29wKCgpID0+IHtcbiAgICogIC8vIC4uLlxuICAgKiB9KTtcbiAgICpcbiAgICogY29uc3QgYXBwID0gbmV3IEFwcCgpO1xuICAgKlxuICAgKiBhcHAuYWRkTG9vcChsb29wKTtcbiAgICogbG9vcC5zdGFydCgpO1xuICAgKi9cbiAgYWRkTG9vcChsb29wKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgdGhpcy5sb29wcy5wdXNoKGxvb3ApO1xuICAgICAgcmVzb2x2ZShsb29wKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIHJlbW92ZUxvb3BcbiAgICogQGRlc2NyaXB0aW9uIFJlbW92ZXMgbG9vcCBmcm9tIHRoaXMgYXBwLlxuICAgKiBAcGFyYW0ge09iamVjdH0gbG9vcCAtIHRoZSBsb29wIHRvIHJlbW92ZVxuICAgKiBAcmV0dXJuIHtQcm9taXNlfSBQcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2hlbiBwcm9taXNlcyBjb21wbGV0ZWQuXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZS5BcHBcbiAgICovXG4gIHJlbW92ZUxvb3AobG9vcCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5sb29wcy5pbmRleE9mKGxvb3ApO1xuICAgICAgaWYgKGluZGV4ICE9PSAtMSkgdGhpcy5sb29wcy5zcGxpY2UoaW5kZXgsIDEpO1xuXG4gICAgICByZXNvbHZlKGxvb3ApO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0KGtleSkge1xuICAgIHJldHVybiB0aGlzLm1hbmFnZXIuZ2V0KGtleSk7XG4gIH1cblxuICB1c2Uoa2V5KSB7XG4gICAgcmV0dXJuIHRoaXMubWFuYWdlci51c2Uoa2V5KTtcbiAgfVxufVxuXG5leHBvcnQge1xuICBBcHBcbn07XG4iLCJpbXBvcnQge0Nsb2NrfSBmcm9tICd0aHJlZSc7XG5cbi8qKlxuICogQGNsYXNzIExvb3BcbiAqIEBjYXRlZ29yeSBjb3JlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgb24gZWFjaCBhbmltYXRpb24gZnJhbWVcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW3VzZUNsb2NrPXRydWVdIHBhc3NlcyBhIENsb2NrIHRvIHRoZSBmdW5jdGlvbiB3aGVuIGNhbGxlZCwgaWYgdHJ1ZVxuICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlXG4gKi9cbmNsYXNzIExvb3Age1xuICBjb25zdHJ1Y3RvcihmdW5jLCB1c2VDbG9jayA9IHRydWUpIHtcbiAgICB0aGlzLmZ1bmMgPSBmdW5jO1xuICAgIHRoaXMuY2xvY2sgPSB1c2VDbG9jayA/IG5ldyBDbG9jaygpIDogbnVsbDtcbiAgICB0aGlzLmVuYWJsZWQgPSBmYWxzZTtcbiAgfVxuXG4gIC8vIENPTlRST0xTXG5cbiAgLyoqXG4gICAqIEBtZXRob2Qgc3RhcnRcbiAgICogQGluc3RhbmNlXG4gICAqIEBkZXNjcmlwdGlvbiBTdGFydHMgdGhpcyBsb29wLCBjbG9jayBpZiBpdCBoYXMgb25lLiBXb24ndCBkbyBhbnl0aGluZyBpZiBsb29wIGVuYWJsZWQgYWxyZWFkeS5cbiAgICogQHBhcmFtIHtDb21wb25lbnR9IFt3b3JsZF0gYXBwIHRvIGFkZCB0aGlzIGxvb3AgdG8sIGlmIHByb3ZpZGVkLlxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmUuTG9vcFxuICAgKi9cbiAgc3RhcnQod29ybGQpIHtcbiAgICBpZiAodGhpcy5lbmFibGVkKSByZXR1cm47XG5cbiAgICBpZiAod29ybGQpIHdvcmxkLmFkZExvb3AodGhpcyk7XG5cbiAgICBpZiAodGhpcy5jbG9jaykgdGhpcy5jbG9jay5zdGFydCgpO1xuICAgIHRoaXMuZW5hYmxlZCA9IHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBzdG9wXG4gICAqIEBpbnN0YW5jZVxuICAgKiBAZGVzY3JpcHRpb24gU3RvcHMgdGhpcyBsb29wIGFuZCBpdHMgY2xvY2sgaWYgaXQgaGFzIG9uZSwgd29uJ3QgZG8gYW55dGhpbmcgaWYgdGhpcyBsb29wIGlzIG5vdCBlbmFibGVkKVxuICAgKiBAcGFyYW0ge0NvbXBvbmVudH0gW3dvcmxkXSBhcHAgdG8gcmVtb3ZlIHRoaXMgbG9vcCBmcm9tLCBpZiBwcm92aWRlZC5cbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLkxvb3BcbiAgICovXG4gIHN0b3Aod29ybGQpIHtcbiAgICBpZiAoIXRoaXMuZW5hYmxlZCkgcmV0dXJuO1xuXG4gICAgaWYgKHRoaXMuY2xvY2spIHRoaXMuY2xvY2suc3RvcCgpO1xuICAgIHRoaXMuZW5hYmxlZCA9IGZhbHNlO1xuXG4gICAgaWYgKHdvcmxkKSB3b3JsZC5yZW1vdmVMb29wKHRoaXMpO1xuICB9XG5cbiAgLy8gRVhFQ1VUSU9OXG5cbiAgLyoqXG4gICAqIEBtZXRob2QgZXhlY3V0ZVxuICAgKiBAaW5zdGFuY2VcbiAgICogQGRlc2NyaXB0aW9uIEV4ZWN1dGVzIHRoZSBmdW5jdGlvbiBvZiB0aGlzIGxvb3BcbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLkxvb3BcbiAgICogQHJldHVybnMgeyp9IHdoYXRldmVyIHRoZSBmdW5jdGlvbiBvZiB0aGlzIGxvb3AgcmV0dXJuc1xuICAgKi9cbiAgZXhlY3V0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5mdW5jKHRoaXMuY2xvY2spO1xuICB9XG59XG5cbmV4cG9ydCB7XG4gIExvb3Bcbn07XG4iLCIvKiogQG1vZHVsZSBjb3JlICovXG5leHBvcnQgKiBmcm9tICcuL0NvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL01lc2hDb21wb25lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9MaWdodENvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL0NhbWVyYUNvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL0FwcCc7XG5leHBvcnQgKiBmcm9tICcuL0xvb3AnO1xuZXhwb3J0ICogZnJvbSAnLi9Nb2R1bGVNYW5hZ2VyJztcbiIsImltcG9ydCB7QW1iaWVudExpZ2h0IGFzIEFtYmllbnRMaWdodE5hdGl2ZX0gZnJvbSAndGhyZWUnO1xuaW1wb3J0IHtMaWdodENvbXBvbmVudH0gZnJvbSAnLi4vLi4vY29yZS9MaWdodENvbXBvbmVudCc7XG5cbi8qKlxuICogQGNsYXNzIEFtYmllbnRMaWdodFxuICogQGNhdGVnb3J5IGNvbXBvbmVudHMvbGlnaHRzXG4gKiBAZGVzY3JpcHRpb24gQW1iaWVudExpZ2h0IGlzIGEgc2ltcGxlIGNsYXNzLCBpdCBleHRlbmRzIExpZ2h0IGFuZCBpbmhlcml0cyBhbGwgaXRzIG1ldGhvZHMuXG4gKiBBbWJpZW50TGlnaHQgY3JlYXRlcyBiYXNpYyBsaWdodCBhcm91bmQgYWxsIHNjZW5lLCBzbyBpdCBkb2Vzbid0IG5lZWQgcHJvcGVydGllcyBsaWtlIHBvcyBvciB0YXJnZXQuXG4gKiBJdCBzdXBwb3J0cyBvbmx5IGNvbG9yIGFuZCBpbnRlbnNpdHkgYXMgcGFyYW1ldGVycywgd2hpY2ggZGVmaW5lcyB0aGUgY29sb3Igb2YgdGhlIHN1cnJvdW5kZWQgbGlnaHQgYW5kIGludGVuc2l0eSBvZiBsaWdodC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zPXtsaWdodDoge2NvbG9yOiAweGZmZmZmZiwgaW50ZW5zaXR5OiAxfX1dIC0gVGhlIHBhcmFtcy5cbiAqIEBleHRlbmRzIG1vZHVsZTpjb3JlLkxpZ2h0Q29tcG9uZW50XG4gKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbGlnaHRzXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5DcmVhdGluZyBhbiBBbWJpZW50TGlnaHQgPC9jYXB0aW9uPlxuICogbmV3IEFtYmllbnRMaWdodCh7XG4gKiAgIGNvbG9yOiAweGZmZmZmZixcbiAqICAgaW50ZW5zaXR5OiAwLjJcbiAqIH0pLmFkZFRvKHdvcmxkKTtcbiAqL1xuY2xhc3MgQW1iaWVudExpZ2h0IGV4dGVuZHMgTGlnaHRDb21wb25lbnQge1xuICBzdGF0aWMgZGVmYXVsdHMgPSB7XG4gICAgLi4uTGlnaHRDb21wb25lbnQuZGVmYXVsdHMsXG5cbiAgICBjb2xvcjogMHhmZmZmZmYsXG4gICAgaW50ZW5zaXR5OiAxXG4gIH07XG5cbiAgY29uc3RydWN0b3IocGFyYW1zID0ge30pIHtcbiAgICBzdXBlcihwYXJhbXMsIEFtYmllbnRMaWdodC5kZWZhdWx0cyk7XG4gIH1cblxuICBidWlsZChwYXJhbXMgPSB7fSkge1xuICAgIHJldHVybiB0aGlzLmFwcGx5QnJpZGdlKHtsaWdodDogbmV3IEFtYmllbnRMaWdodE5hdGl2ZShcbiAgICAgIHBhcmFtcy5jb2xvcixcbiAgICAgIHBhcmFtcy5pbnRlbnNpdHlcbiAgICApfSkubGlnaHQ7XG4gIH1cbn1cblxuZXhwb3J0IHtcbiAgQW1iaWVudExpZ2h0XG59O1xuIiwiaW1wb3J0IHtEaXJlY3Rpb25hbExpZ2h0IGFzIERpcmVjdGlvbmFsTGlnaHROYXRpdmUsIERpcmVjdGlvbmFsTGlnaHRIZWxwZXJ9IGZyb20gJ3RocmVlJztcbmltcG9ydCB7TGlnaHRDb21wb25lbnR9IGZyb20gJy4uLy4uL2NvcmUvTGlnaHRDb21wb25lbnQnO1xuXG4vKipcbiAqIEBjbGFzcyBEaXJlY3Rpb25hbExpZ2h0XG4gKiBAY2F0ZWdvcnkgY29tcG9uZW50cy9saWdodHNcbiAqIEBkZXNjcmlwdGlvbiBEaXJlY3RpbmFsTGlnaHQgY3JlYXRlcyBhIGxpZ2h0IHRoYXQgc2hpbmVzIGZyb20gYSBzcGVjaWZpYyBkaXJlY3Rpb24gbm90IGZyb20gYSBzcGVjaWZpYyBwb3NpdGlvbi48YnIvPjxici8+XG4gKiBUaGlzIGxpZ2h0IHdpbGwgYmVoYXZlIGFzIHRob3VnaCBpdCBpcyBpbmZpbml0ZWx5IGZhciBhd2F5IGFuZCB0aGUgcmF5cyBwcm9kdWNlZCBmcm9tIGl0IGFyZSBhbGwgcGFyYWxsZWwuIDxici8+PGJyLz5cbiAqIFRoZSBiZXN0IGFuYWxvZ3kgd291bGQgYmUgYSBsaWdodCBzb3VyY2UgdGhhdCBhY3RzIGxpa2UgdGhlIHN1bjogdGhlIHN1biBpcyBzbyBmYXIgYXdheSB0aGF0IGFsbCBzdW5saWdodCBoaXR0aW5nIG9iamVjdHMgY29tZXMgZnJvbSB0aGUgc2FtZSBhbmdsZS48YnIvPjxici8+XG4gKiBJdCBoYXMgdGhlIHNhbWUgb3B0aW9ucyBhcyBBbWJpZW50TGlnaHQgaW4gbGlnaHQgcGFyYW1hdGVyLCBidXQgaXQgYWxzbyBzdXBwb3J0cyBwb3MgYW5kIHRhcmdldCBwYXJhbWF0ZXJzLlxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXM9e2xpZ2h0OiB7Y29sb3I6IDB4ZmZmZmZmLCBpbnRlbnNpdHk6IDF9fV0gLSBUaGUgcGFyYW1zLlxuICogQGV4dGVuZHMgbW9kdWxlOmNvcmUuTGlnaHRDb21wb25lbnRcbiAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9saWdodHNcbiAqIEBleGFtcGxlIDxjYXB0aW9uPkNyZWF0aW5nIGEgRGlyZWN0aW9uYWxMaWdodCB0byBmYWxsIGRvd24gZnJvbSB2ZWMzKDEwLCAyMCwgMTApIHRvIHZlYzMoMCwgMCwgMCk8L2NhcHRpb24+XG4gKiBuZXcgRGlyZWN0aW9uYWxMaWdodCh7XG4gKiAgIGNvbG9yOiAweGZmZmZmZixcbiAqICAgaW50ZW5zaXR5OiAwLjIsXG4gKlxuICogICBwb3NpdGlvbjogWzEwLCAyMCwgMTBdXG4gKiB9KS5hZGRUbyhhcHApO1xuICovXG5jbGFzcyBEaXJlY3Rpb25hbExpZ2h0IGV4dGVuZHMgTGlnaHRDb21wb25lbnQge1xuICBzdGF0aWMgZGVmYXVsdHMgPSB7XG4gICAgLi4uTGlnaHRDb21wb25lbnQuZGVmYXVsdHMsXG5cbiAgICBjb2xvcjogMHhmZmZmZmYsXG4gICAgaW50ZW5zaXR5OiAxXG4gIH07XG5cbiAgY29uc3RydWN0b3IocGFyYW1zID0ge30pIHtcbiAgICBzdXBlcihwYXJhbXMsIERpcmVjdGlvbmFsTGlnaHQuZGVmYXVsdHMpO1xuICAgIHRoaXMud3JhcFNoYWRvdygpO1xuICB9XG5cbiAgYnVpbGQocGFyYW1zID0ge30pIHtcbiAgICByZXR1cm4gdGhpcy5hcHBseUJyaWRnZSh7bGlnaHQ6IG5ldyBEaXJlY3Rpb25hbExpZ2h0TmF0aXZlKFxuICAgICAgcGFyYW1zLmNvbG9yLFxuICAgICAgcGFyYW1zLmludGVuc2l0eVxuICAgICl9KS5saWdodDtcbiAgfVxufVxuXG5leHBvcnQge1xuICBEaXJlY3Rpb25hbExpZ2h0XG59O1xuIiwiaW1wb3J0IHtIZW1pc3BoZXJlTGlnaHQgYXMgSGVtaXNwaGVyZUxpZ2h0TmF0aXZlLCBIZW1pc3BoZXJlTGlnaHRIZWxwZXJ9IGZyb20gJ3RocmVlJztcbmltcG9ydCB7TGlnaHRDb21wb25lbnR9IGZyb20gJy4uLy4uL2NvcmUvTGlnaHRDb21wb25lbnQnO1xuXG4vKipcbiAqIEBjbGFzcyBIZW1pc3BoZXJlTGlnaHRcbiAqIEBjYXRlZ29yeSBjb21wb25lbnRzL2xpZ2h0c1xuICogQGRlc2NyaXB0aW9uIEhlbWlzcGhlcmVMaWdodCBpcyBhIGxpZ2h0IHNvdXJjZSBwb3NpdGlvbmVkIGRpcmVjdGx5IGFib3ZlIHRoZSBzY2VuZS48YnIvPlxuICogSXQgYWxzbyBkb2Vzbid0IG5lZWQgcG9zaXRpb24gYW5kIHRhcmdldCBwcm9wZXJ0aWVzLlxuICogQGNsYXNzRGVzY1xuICogPGlmcmFtZSBzcmM9XCJodHRwczovL3RocmVlanMub3JnL2V4YW1wbGVzL3dlYmdsX2xpZ2h0c19oZW1pc3BoZXJlLmh0bWxcIj48L2lmcmFtZT5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zPXtsaWdodDoge3NreUNvbG9yOiAweGZmZmZmZiwgZ3JvdW5kQ29sb3I6IDB4ZmZmZmZmLCBpbnRlbnNpdHk6IDF9fV0gLSBUaGUgcGFyYW1zLlxuICogQGV4dGVuZHMgbW9kdWxlOmNvcmUuTGlnaHRDb21wb25lbnRcbiAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9saWdodHNcbiAqIEBleGFtcGxlIDxjYXB0aW9uPkNyZWF0aW5nIGEgSGVtaXNwaGVyZUxpZ2h0PC9jYXB0aW9uPlxuICogbmV3IEhlbWlzcGhlcmVMaWdodCh7XG4gKiAgIHNreUNvbG9yOiAweGZmMDAwMCxcbiAqICAgZ3JvdW5kQ29sb3I6IDB4MDAwMGZmLFxuICogICBpbnRlbnNpdHk6IDAuMlxuICogfSkuYWRkVG8oYXBwKTtcbiAqL1xuY2xhc3MgSGVtaXNwaGVyZUxpZ2h0IGV4dGVuZHMgTGlnaHRDb21wb25lbnQge1xuICBzdGF0aWMgZGVmYXVsdHMgPSB7XG4gICAgLi4uTGlnaHRDb21wb25lbnQuZGVmYXVsdHMsXG5cbiAgICBza3lDb2xvcjogMHhmZmZmZmYsXG4gICAgZ3JvdW5kQ29sb3I6IDB4ZmZmZmZmLFxuICAgIGludGVuc2l0eTogMVxuICB9XG5cbiAgY29uc3RydWN0b3IocGFyYW1zID0ge30pIHtcbiAgICBzdXBlcihwYXJhbXMsIEhlbWlzcGhlcmVMaWdodC5kZWZhdWx0cyk7XG4gIH1cblxuICBidWlsZChwYXJhbXMgPSB7fSkge1xuICAgIHJldHVybiB0aGlzLmFwcGx5QnJpZGdlKHtsaWdodDogbmV3IEhlbWlzcGhlcmVMaWdodE5hdGl2ZShcbiAgICAgIHBhcmFtcy5za3lDb2xvcixcbiAgICAgIHBhcmFtcy5ncm91bmRDb2xvcixcbiAgICAgIHBhcmFtcy5pbnRlbnNpdHlcbiAgICApfSkubGlnaHQ7XG4gIH1cbn1cblxuZXhwb3J0IHtcbiAgSGVtaXNwaGVyZUxpZ2h0XG59O1xuIiwiaW1wb3J0IHtQb2ludExpZ2h0IGFzIFBvaW50TGlnaHROYXRpdmUsIFBvaW50TGlnaHRIZWxwZXJ9IGZyb20gJ3RocmVlJztcbmltcG9ydCB7TGlnaHRDb21wb25lbnR9IGZyb20gJy4uLy4uL2NvcmUvTGlnaHRDb21wb25lbnQnO1xuXG4vKipcbiAqIEBjbGFzcyBQb2ludExpZ2h0XG4gKiBAY2F0ZWdvcnkgY29tcG9uZW50cy9saWdodHNcbiAqIEBkZXNjcmlwdGlvbiBQb2ludExpZ2h0IGNyZWF0ZXMgYSBsaWdodCBhdCBhIHNwZWNpZmljIHBvc2l0aW9uIGluIHRoZSBzY2VuZS4gVGhlIGxpZ2h0IHNoaW5lcyBpbiBhbGwgZGlyZWN0aW9ucyAocm91Z2hseSBzaW1pbGFyIHRvIGEgbGlnaHQgYnVsYi4pPGJyLz48YnIvPlxuICogSXQgaGFzIHRoZSBzYW1lIG9wdGlvbnMgYXMgQW1iaWVudExpZ2h0IGluIGxpZ2h0IHBhcmFtYXRlciwgYnV0IGl0IGFsc28gc3VwcG9ydHMgcG9zaXRpb24sIGRpc3RhbmNlIGFuZCBkZWNheS48YnIvPlxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXM9e2xpZ2h0OiB7Y29sb3I6IDB4ZmZmZmZmLCBpbnRlbnNpdHk6IDEsIGRpc3RhbmNlOiAxMDAsIGRlY2F5OiAxfX1dIC0gVGhlIHBhcmFtcy5cbiAqIEBleHRlbmRzIExpZ2h0Q29tcG9uZW50XG4gKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbGlnaHRzXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5DcmVhdGluZyBhIFBvaW50TGlnaHQ8L2NhcHRpb24+XG4gKiBuZXcgUG9pbnRMaWdodCgge1xuICogICBjb2xvcjogMHhmZjAwMDAsXG4gKiAgIGludGVuc2l0eTogMixcbiAqICAgZGlzdGFuY2U6IDMwMFxuICpcbiAqICAgcG9zaXRpb246IFsxMCwgMjAsIDEwXVxuICogfSkuYWRkVG8oYXBwKTtcbiAqL1xuY2xhc3MgUG9pbnRMaWdodCBleHRlbmRzIExpZ2h0Q29tcG9uZW50IHtcbiAgc3RhdGljIGRlZmF1bHRzPSB7XG4gICAgLi4uTGlnaHRDb21wb25lbnQuZGVmYXVsdHMsXG5cbiAgICBjb2xvcjogMHhmZmZmZmYsXG4gICAgaW50ZW5zaXR5OiAxLFxuICAgIGRpc3RhbmNlOiAxMDAsXG4gICAgZGVjYXk6IDFcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHBhcmFtcyA9IHt9KSB7XG4gICAgc3VwZXIocGFyYW1zLCBQb2ludExpZ2h0LmRlZmF1bHRzKTtcbiAgICB0aGlzLndyYXBTaGFkb3coKTtcbiAgfVxuXG4gIGJ1aWxkKHBhcmFtcyA9IHt9KSB7XG4gICAgcmV0dXJuIHRoaXMuYXBwbHlCcmlkZ2Uoe2xpZ2h0OiBuZXcgUG9pbnRMaWdodE5hdGl2ZShcbiAgICAgIHBhcmFtcy5jb2xvcixcbiAgICAgIHBhcmFtcy5pbnRlbnNpdHksXG4gICAgICBwYXJhbXMuZGlzdGFuY2UsXG4gICAgICBwYXJhbXMuZGVjYXlcbiAgICApfSkubGlnaHQ7XG4gIH1cbn1cblxuZXhwb3J0IHtcbiAgUG9pbnRMaWdodFxufTtcbiIsImltcG9ydCB7U3BvdExpZ2h0IGFzIFNwb3RMaWdodE5hdGl2ZX0gZnJvbSAndGhyZWUnO1xuaW1wb3J0IHtMaWdodENvbXBvbmVudH0gZnJvbSAnLi4vLi4vY29yZS9MaWdodENvbXBvbmVudCc7XG5cbi8qKlxuICogQGNsYXNzIFNwb3RMaWdodFxuICogQGNhdGVnb3J5IGNvbXBvbmVudHMvbGlnaHRzXG4gKiBAZGVzY3JpcHRpb24gU3BvdExpZ2h0IGNyZWF0ZXMgc3BvdCBsaWdodCB0aGF0IGNhbiBjYXN0IHNoYWRvdyBpbiBvbmUgZGlyZWN0aW9uLiA8YnIvPjxici8+XG4gKiBJdCBoYXMgdGhlIHNhbWUgcGFyYW1ldGVycyBhcyBBbWJpZW50TGlnaHQgaW4gbGlnaHQsIGJ1dCBpdCBhbHNvIHN1cHBvcnRzIHBvcyBhbmQgdGFyZ2V0LiA8YnIvPjxici8+XG4gKiBTcG90TGlnaHQgYWZmZWN0cyBtZXNoZXMgd2l0aCBsYW1iZXJ0IGFuZCBwaG9uZyBtYXRlcmlhbC5cbiAqIEBjbGFzc0Rlc2NcbiAqIDxpZnJhbWUgc3JjPVwiaHR0cHM6Ly90aHJlZWpzLm9yZy9leGFtcGxlcy93ZWJnbF9saWdodHNfc3BvdGxpZ2h0Lmh0bWxcIj48L2lmcmFtZT5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zPXtsaWdodDoge2NvbG9yOiAweGZmZmZmZiwgaW50ZW5zaXR5OiAxLCBkaXN0YW5jZTogMTAwLCBhbmdsZTogTWF0aC5QSSAvIDMsIGV4cG9uZW50OiAwLCBkZWNheTogMX19XSAtIFRoZSBwYXJhbXMuXG4gKiBAZXh0ZW5kcyBtb2R1bGU6Y29yZS5MaWdodENvbXBvbmVudFxuICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL2xpZ2h0c1xuICogQGV4YW1wbGUgPGNhcHRpb24+Q3JlYXRpbmcgYSBTcG90TGlnaHQgdGhhdCBmYWxscyBkb3duIGZyb20gdmVjMygxMCwgMjAsIDEwKSB0byB2ZWMzKDAsIDAsIDApPC9jYXB0aW9uPlxuICogbmV3IFNwb3RMaWdodCh7XG4gKiAgIGNvbG9yOiAweDAwZmYwMCxcbiAqICAgaW50ZW5zaXR5OiAzLFxuICogICBkaXN0YW5jZTogMTAwMFxuICpcbiAqICAgcG9zaXRpb246IFsxMCwgMjAsIDEwXVxuICogfSkuYWRkVG8oYXBwKTtcbiAqL1xuY2xhc3MgU3BvdExpZ2h0IGV4dGVuZHMgTGlnaHRDb21wb25lbnQge1xuICBzdGF0aWMgZGVmYXVsdHMgPSB7XG4gICAgLi4uTGlnaHRDb21wb25lbnQuZGVmYXVsdHMsXG5cbiAgICBjb2xvcjogMHhmZmZmZmYsXG4gICAgaW50ZW5zaXR5OiAxLFxuICAgIGRpc3RhbmNlOiAxMDAsXG4gICAgYW5nbGU6IE1hdGguUEkgLyAzLFxuICAgIGV4cG9uZW50OiAwLFxuICAgIGRlY2F5OiAxXG4gIH07XG5cbiAgY29uc3RydWN0b3IocGFyYW1zID0ge30pIHtcbiAgICBzdXBlcihwYXJhbXMsIFNwb3RMaWdodC5kZWZhdWx0cyk7XG4gICAgdGhpcy53cmFwU2hhZG93KCk7XG4gIH1cblxuICBidWlsZChwYXJhbXMgPSB7fSkge1xuICAgIHJldHVybiB0aGlzLmFwcGx5QnJpZGdlKHtsaWdodDogbmV3IFNwb3RMaWdodE5hdGl2ZShcbiAgICAgIHBhcmFtcy5jb2xvcixcbiAgICAgIHBhcmFtcy5pbnRlbnNpdHksXG4gICAgICBwYXJhbXMuZGlzdGFuY2UsXG4gICAgICBwYXJhbXMuYW5nbGUsXG4gICAgICBwYXJhbXMuZXhwb25lbnQsXG4gICAgICBwYXJhbXMuZGVjYXlcbiAgICApfSkubGlnaHQ7XG4gIH1cbn1cblxuZXhwb3J0IHtcbiAgU3BvdExpZ2h0XG59O1xuIiwiaW1wb3J0IHtSZWN0QXJlYUxpZ2h0IGFzIFJlY3RBcmVhTGlnaHROYXRpdmV9IGZyb20gJ3RocmVlJztcbmltcG9ydCB7TGlnaHRDb21wb25lbnR9IGZyb20gJy4uLy4uL2NvcmUvTGlnaHRDb21wb25lbnQnO1xuXG5jbGFzcyBBcmVhTGlnaHQgZXh0ZW5kcyBMaWdodENvbXBvbmVudCB7XG4gIHN0YXRpYyBkZWZhdWx0cyA9IHtcbiAgICAuLi5MaWdodENvbXBvbmVudC5kZWZhdWx0cyxcblxuICAgIGNvbG9yOiAweGZmZmZmZixcbiAgICBpbnRlbnNpdHk6IDEsXG4gICAgd2lkdGg6IDEwLFxuICAgIGhlaWdodDogMTBcbiAgfTtcblxuICBjb25zdHJ1Y3RvcihwYXJhbXMgPSB7fSkge1xuICAgIHN1cGVyKHBhcmFtcywgQXJlYUxpZ2h0LmRlZmF1bHRzKTtcbiAgfVxuXG4gIGJ1aWxkKHBhcmFtcyA9IHt9KSB7XG4gICAgcmV0dXJuIHRoaXMuYXBwbHlCcmlkZ2Uoe2xpZ2h0OiBuZXcgUmVjdEFyZWFMaWdodE5hdGl2ZShcbiAgICAgIHBhcmFtcy5jb2xvcixcbiAgICAgIHBhcmFtcy5pbnRlbnNpdHksXG4gICAgICBwYXJhbXMud2lkdGgsXG4gICAgICBwYXJhbXMuaGVpZ2h0XG4gICAgKX0pLmxpZ2h0O1xuICB9XG59XG5cbmV4cG9ydCB7XG4gIEFyZWFMaWdodFxufTtcbiIsIi8qKiBAbW9kdWxlIGNvbXBvbmVudHMvbGlnaHRzICovXG5leHBvcnQgKiBmcm9tICcuL0FtYmllbnRMaWdodCc7XG5leHBvcnQgKiBmcm9tICcuL0RpcmVjdGlvbmFsTGlnaHQnO1xuZXhwb3J0ICogZnJvbSAnLi9IZW1pc3BoZXJlTGlnaHQnO1xuZXhwb3J0ICogZnJvbSAnLi9Qb2ludExpZ2h0JztcbmV4cG9ydCAqIGZyb20gJy4vU3BvdExpZ2h0JztcbmV4cG9ydCAqIGZyb20gJy4vQXJlYUxpZ2h0JztcbiIsImltcG9ydCB7Q3ViZUNhbWVyYSBhcyBDdWJlQ2FtZXJhTmF0aXZlfSBmcm9tICd0aHJlZSc7XG5pbXBvcnQge0NhbWVyYUNvbXBvbmVudH0gZnJvbSAnLi4vLi4vY29yZS9DYW1lcmFDb21wb25lbnQnO1xuXG4vKipcbiAqIEBjbGFzcyBDdWJlQ2FtZXJhXG4gKiBAY2F0ZWdvcnkgY29tcG9uZW50cy9jYW1lcmFzXG4gKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyA2IGNhbWVyYXMgdGhhdCByZW5kZXIgdG8gYSBXZWJHTFJlbmRlclRhcmdldEN1YmVcbiAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zXSAtIFRoZSBwYXJhbWV0ZXJzIG9iamVjdC5cbiAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9jYW1lcmFzXG4gKiBAZXh0ZW5kcyBtb2R1bGU6Y29yZS5DYW1lcmFDb21wb25lbnRcbiAqIEBleGFtcGxlIDxjYXB0aW9uPkNyZWF0ZXMgYSBDdWJlQ2FtZXJhIGFuZCBzZXQgaXQgYXMgYXBwJ3MgY2FtZXJhPC9jYXB0aW9uPlxuICogY29uc3QgY2FtZXJhID0gbmV3IEN1YmVDYW1lcmEoe1xuICogICBjYW1lcmE6IHtcbiAqICAgICBjdWJlUmVzb2x1dGlvbjogMjU2XG4gKiAgIH0sXG4gKlxuICogICBwb3NpdGlvbjoge1xuICogICAgIHg6IDAsXG4gKiAgICAgeTogMTAwLFxuICogICAgIHo6IDBcbiAqICAgfVxuICogfSk7XG4gKlxuICogYXBwLmNhbWVyYSA9IGNhbWVyYTtcbiAqL1xuY2xhc3MgQ3ViZUNhbWVyYSBleHRlbmRzIENhbWVyYUNvbXBvbmVudCB7XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgdmFsdWVzIGZvciBwYXJhbWV0ZXJzXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvbXBvbmVudHMvY2FtZXJhcy5DdWJlQ2FtZXJhI2RlZmF1bHRzXG4gICAqIEBzdGF0aWNcbiAgICogQGRlZmF1bHQgPHByZT5cbiAgICoge1xuICAgKiAgIGNhbWVyYToge1xuICAgKiAgICAgbmVhcjogMSxcbiAgICogICAgIGZhcjogMTAwMCxcbiAgICogICAgIGN1YmVSZXNvbHV0aW9uOiAxMjhcbiAgICogICB9XG4gICAqIH08L3ByZT5cbiAgICovXG4gIHN0YXRpYyBkZWZhdWx0cyA9IHtcbiAgICAuLi5DYW1lcmFDb21wb25lbnQuZGVmYXVsdHMsXG5cbiAgICBuZWFyOiAxLFxuICAgIGZhcjogMTAwMCxcbiAgICBjdWJlUmVzb2x1dGlvbjogMTI4XG4gIH07XG5cbiAgY29uc3RydWN0b3IocGFyYW1zID0ge30pIHtcbiAgICBzdXBlcihwYXJhbXMsIEN1YmVDYW1lcmEuZGVmYXVsdHMpO1xuICB9XG5cbiAgYnVpbGQocGFyYW1zID0ge30pIHtcbiAgICByZXR1cm4gdGhpcy5hcHBseUJyaWRnZSh7Y2FtZXJhOiBuZXcgQ3ViZUNhbWVyYU5hdGl2ZShcbiAgICAgIHBhcmFtcy5uZWFyLFxuICAgICAgcGFyYW1zLmZhcixcbiAgICAgIHBhcmFtcy5jdWJlUmVzb2x1dGlvblxuICAgICl9KS5jYW1lcmE7XG4gIH1cbn1cblxuZXhwb3J0IHtcbiAgQ3ViZUNhbWVyYVxufTtcbiIsImltcG9ydCB7T3J0aG9ncmFwaGljQ2FtZXJhIGFzIE9ydGhvZ3JhcGhpY0NhbWVyYU5hdGl2ZX0gZnJvbSAndGhyZWUnO1xuaW1wb3J0IHtDYW1lcmFDb21wb25lbnR9IGZyb20gJy4uLy4uL2NvcmUvQ2FtZXJhQ29tcG9uZW50JztcbmltcG9ydCB7c3lzdGVtfSBmcm9tICcuLi8uLi9wb2x5ZmlsbCc7XG5cbi8qKlxuICogQGNsYXNzIE9ydGhvZ3JhcGhpY0NhbWVyYVxuICogQGNhdGVnb3J5IGNvbXBvbmVudHMvY2FtZXJhc1xuICogQGRlc2NyaXB0aW9uIENhbWVyYSB3aXRoIG9ydGhvZ3JhcGhpYyBwcm9qZWN0aW9uLlxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXNdIC0gVGhlIHBhcmFtZXRlcnMgb2JqZWN0LlxuICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL2NhbWVyYXNcbiAqIEBleHRlbmRzIG1vZHVsZTpjb3JlLkNhbWVyYUNvbXBvbmVudFxuICogQGV4YW1wbGUgPGNhcHRpb24+Q3JlYXRlIGFuIE9ydGhvZ3JhcGhpY0NhbWVyYSBhbmQgc2V0IGl0IGFzIGFwcCdzIGNhbWVyYTwvY2FwdGlvbj5cbiAqIGNvbnN0IGNhbWVyYSA9IG5ldyBPcnRob2dyYXBoaWNDYW1lcmEoe1xuICogICBjYW1lcmE6IHtcbiAqICAgICBmYXI6IDEwMDAwXG4gKiAgIH0sXG4gKlxuICogICBwb3NpdGlvbjoge1xuICogICAgIHk6IDUwXG4gKiAgIH1cbiAqIH0pO1xuICpcbiAqIGFwcC5jYW1lcmEgPSBjYW1lcmE7XG4gKi9cbmNsYXNzIE9ydGhvZ3JhcGhpY0NhbWVyYSBleHRlbmRzIENhbWVyYUNvbXBvbmVudCB7XG4gIC8qKlxuICAgKiBEZWZhdWx0IHZhbHVlcyBmb3IgcGFyYW1ldGVyc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb21wb25lbnRzL2NhbWVyYXMuT3J0aG9ncmFwaGljQ2FtZXJhI2RlZmF1bHRzXG4gICAqIEBzdGF0aWNcbiAgICogQGRlZmF1bHQgPHByZT5cbiAgICoge1xuICAgKiAgIG5lYXI6IDEsXG4gICAqICAgZmFyOiAxMDAwLFxuICAgKiAgIGxlZnQ6IHN5c3RlbS53aW5kb3cuaW5uZXJXaWR0aCAvIC0yLFxuICAgKiAgIHJpZ2h0OiBzeXN0ZW0ud2luZG93LmlubmVyV2lkdGggLyAyLFxuICAgKiAgIHRvcDogc3lzdGVtLndpbmRvdy5pbm5lckhlaWdodCAvIDIsXG4gICAqICAgYm90dG9tOiBzeXN0ZW0ud2luZG93LmlubmVySGVpZ2h0IC8gLTJcbiAgICogfTwvcHJlPlxuICAgKi9cbiAgc3RhdGljIGRlZmF1bHRzID0ge1xuICAgIC4uLkNhbWVyYUNvbXBvbmVudC5kZWZhdWx0cyxcblxuICAgIG5lYXI6IDEsXG4gICAgZmFyOiAxMDAwLFxuICAgIGxlZnQ6IHN5c3RlbS53aW5kb3cuaW5uZXJXaWR0aCAvIC0yLFxuICAgIHJpZ2h0OiBzeXN0ZW0ud2luZG93LmlubmVyV2lkdGggLyAyLFxuICAgIHRvcDogc3lzdGVtLndpbmRvdy5pbm5lckhlaWdodCAvIDIsXG4gICAgYm90dG9tOiBzeXN0ZW0ud2luZG93LmlubmVySGVpZ2h0IC8gLTJcbiAgfTtcblxuICBjb25zdHJ1Y3RvcihwYXJhbXMgPSB7fSkge1xuICAgIHN1cGVyKHBhcmFtcywgT3J0aG9ncmFwaGljQ2FtZXJhLmRlZmF1bHRzKTtcbiAgfVxuXG4gIGJ1aWxkKHBhcmFtcyA9IHt9KSB7XG4gICAgcmV0dXJuIHRoaXMuYXBwbHlCcmlkZ2Uoe2NhbWVyYTogbmV3IE9ydGhvZ3JhcGhpY0NhbWVyYU5hdGl2ZShcbiAgICAgIHBhcmFtcy5sZWZ0LFxuICAgICAgcGFyYW1zLnJpZ2h0LFxuICAgICAgcGFyYW1zLnRvcCxcbiAgICAgIHBhcmFtcy5ib3R0b20sXG4gICAgICBwYXJhbXMubmVhcixcbiAgICAgIHBhcmFtcy5mYXJcbiAgICApfSkuY2FtZXJhO1xuICB9XG59XG5cbmV4cG9ydCB7XG4gIE9ydGhvZ3JhcGhpY0NhbWVyYVxufTtcbiIsImltcG9ydCB7UGVyc3BlY3RpdmVDYW1lcmEgYXMgUGVyc3BlY3RpdmVDYW1lcmFOYXRpdmV9IGZyb20gJ3RocmVlJztcbmltcG9ydCB7Q2FtZXJhQ29tcG9uZW50fSBmcm9tICcuLi8uLi9jb3JlL0NhbWVyYUNvbXBvbmVudCc7XG5pbXBvcnQge3N5c3RlbX0gZnJvbSAnLi4vLi4vcG9seWZpbGwnO1xuXG4vKipcbiAqIEBjbGFzcyBQZXJzcGVjdGl2ZUNhbWVyYVxuICogQGRlc2NyaXB0aW9uIENhbWVyYSB3aXRoIHBlcnNwZWN0aXZlIHByb2plY3Rpb24uXG4gKiBAY2F0ZWdvcnkgY29tcG9uZW50cy9jYW1lcmFzXG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtc10gLSBUaGUgcGFyYW1ldGVycyBvYmplY3QuXG4gKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvY2FtZXJhc1xuICogQGV4dGVuZHMgbW9kdWxlOmNvcmUuQ2FtZXJhQ29tcG9uZW50XG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5DcmVhdGUgYW4gUGVyc3BlY3RpdmVDYW1lcmEgYW5kIHNldCBpdCBhcyBhcHAncyBjYW1lcmE8L2NhcHRpb24+XG4gKiBjb25zdCBjYW1lcmEgPSBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoe1xuICogICBmb3Y6IDc1LFxuICogICBhc3BlY3Q6IHdpbmRvdy5pbm5lcldpZHRoIC8gd2luZG93LmlubmVySGVpZ2h0LFxuICpcbiAqICAgcG9zaXRpb246IHtcbiAqICAgICB4OiAwLFxuICogICAgIHk6IDEwMCxcbiAqICAgICB6OiAwXG4gKiAgIH1cbiAqIH0pO1xuICpcbiAqIGFwcC5jYW1lcmEgPSBjYW1lcmE7XG4gKi9cbmNsYXNzIFBlcnNwZWN0aXZlQ2FtZXJhIGV4dGVuZHMgQ2FtZXJhQ29tcG9uZW50IHtcbiAgLyoqXG4gICAqIERlZmF1bHQgdmFsdWVzIGZvciBwYXJhbWV0ZXJzXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvbXBvbmVudHMvY2FtZXJhcy5QZXJzcGVjdGl2ZUNhbWVyYSNkZWZhdWx0c1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IDxwcmU+XG4gICAqIHtcbiAgICogICBuZWFyOiAxLFxuICAgKiAgIGZhcjogMTAwMCxcbiAgICogICBmb3Y6IDc1LFxuICAgKiAgIGFzcGVjdDogc3lzdGVtLndpbmRvdy5pbm5lcldpZHRoIC8gc3lzdGVtLndpbmRvdy5pbm5lckhlaWdodFxuICAgKiB9PC9wcmU+XG4gICAqL1xuICBzdGF0aWMgZGVmYXVsdHMgPSB7XG4gICAgLi4uQ2FtZXJhQ29tcG9uZW50LmRlZmF1bHRzLFxuXG4gICAgbmVhcjogMSxcbiAgICBmYXI6IDEwMDAsXG4gICAgZm92OiA3NSxcbiAgICBhc3BlY3Q6IHN5c3RlbS53aW5kb3cuaW5uZXJXaWR0aCAvIHN5c3RlbS53aW5kb3cuaW5uZXJIZWlnaHRcbiAgfTtcblxuICBjb25zdHJ1Y3RvcihwYXJhbXMgPSB7fSkge1xuICAgIHN1cGVyKHBhcmFtcywgUGVyc3BlY3RpdmVDYW1lcmEuZGVmYXVsdHMpO1xuICB9XG5cbiAgYnVpbGQocGFyYW1zID0ge30pIHtcbiAgICByZXR1cm4gdGhpcy5hcHBseUJyaWRnZSh7Y2FtZXJhOiBuZXcgUGVyc3BlY3RpdmVDYW1lcmFOYXRpdmUoXG4gICAgICBwYXJhbXMuZm92LFxuICAgICAgcGFyYW1zLmFzcGVjdCxcbiAgICAgIHBhcmFtcy5uZWFyLFxuICAgICAgcGFyYW1zLmZhclxuICAgICl9KS5jYW1lcmE7XG4gIH1cbn1cblxuZXhwb3J0IHtcbiAgUGVyc3BlY3RpdmVDYW1lcmFcbn07XG4iLCIvKiogQG1vZHVsZSBjb21wb25lbnRzL2NhbWVyYXMgKi9cbmV4cG9ydCAqIGZyb20gJy4vQ3ViZUNhbWVyYSc7XG5leHBvcnQgKiBmcm9tICcuL09ydGhvZ3JhcGhpY0NhbWVyYSc7XG5leHBvcnQgKiBmcm9tICcuL1BlcnNwZWN0aXZlQ2FtZXJhJztcbiIsImltcG9ydCB7XG4gIE1lc2gsXG4gIEJveEJ1ZmZlckdlb21ldHJ5LFxuICBCb3hHZW9tZXRyeVxufSBmcm9tICd0aHJlZSc7XG5cbmltcG9ydCB7TWVzaENvbXBvbmVudH0gZnJvbSAnLi4vLi4vY29yZS9NZXNoQ29tcG9uZW50JztcblxuLyoqXG4gKiBAY2xhc3MgQm94XG4gKiBAY2F0ZWdvcnkgY29tcG9uZW50cy9tZXNoZXNcbiAqIEBkZXNjcmlwdGlvbiBBcyB0b2xkIG9uIENvbXBvbmVudCBkZWZpbml0aW9uLCB3aGlsZSB5b3UgY2FuIHBhc3MgYW55IG9mIHRoZSBpbmhlcml0ZWQgcGFyYW1zIGZvciB0aGlzIGNvbXBvbmVudCBjb25zdHJ1Y3Rpb24sIHlvdSB3aWxsIG5lZWQgdG9cbiAqIHBhc3Mgc3BlY2lmaWMgcGFyYW1ldGVycyB0byBidWlsZCB0aGlzIG1lc2ggYXMgYSBnZW9tZXRyeSBvYmplY3QuXG4gKiBAY2xhc3NEZXNjXG4gKiA8aWZyYW1lIHNyYz1cImh0dHBzOi8vdGhyZWVqcy5vcmcvZG9jcy9zY2VuZXMvZ2VvbWV0cnktYnJvd3Nlci5odG1sI0JveEdlb21ldHJ5XCI+PC9pZnJhbWU+XG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtc10gLSBUaGUgcGFyYW1zLlxuICogQGV4dGVuZHMgbW9kdWxlOmNvcmUuTWVzaENvbXBvbmVudFxuICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL21lc2hlc1xuICogQGV4YW1wbGUgPGNhcHRpb24+Q3JlYXRpbmcgYSBCb3gsIGFuZCBhZGRpbmcgdG8gYXBwPC9jYXB0aW9uPlxuICogIG5ldyBCb3goe1xuICogICAgZ2VvbWV0cnk6IHtcbiAqICAgICAgd2lkdGg6IDIsXG4gKiAgICAgIGhlaWdodDogMixcbiAqICAgICAgZGVwdGg6IDJcbiAqICAgIH0sXG4gKlxuICogICAgbWF0ZXJpYWw6IG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCh7XG4gKiAgICAgIGNvbG9yOiAweGZmZmZmZlxuICogICAgfSksXG4gKlxuICogICAgcG9zaXRpb246IFs1MCwgNjAsIDcwXVxuICogfSkuYWRkVG8oYXBwKTtcbiAqL1xuY2xhc3MgQm94IGV4dGVuZHMgTWVzaENvbXBvbmVudCB7XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgdmFsdWVzIGZvciBwYXJhbWV0ZXJzXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLkJveCNkZWZhdWx0c1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IDxwcmU+XG4gICAqIHtcbiAgICogICBnZW9tZXRyeToge1xuICAgKiAgICAgd2lkdGg6IDEsXG4gICAqICAgICBoZWlnaHQ6IDEsXG4gICAqICAgICBkZXB0aDogMSxcbiAgICogICAgIHdpZHRoU2VnbWVudHM6IDEsXG4gICAqICAgICBoZWlnaHRTZWdtZW50czogMSxcbiAgICogICAgIGRlcHRoU2VnbWVudHM6IDFcbiAgICogICB9XG4gICAqIH08L3ByZT5cbiAgICovXG4gIHN0YXRpYyBkZWZhdWx0cyA9IHtcbiAgICAuLi5NZXNoQ29tcG9uZW50LmRlZmF1bHRzLFxuICAgIGdlb21ldHJ5OiB7XG4gICAgICB3aWR0aDogMSxcbiAgICAgIGhlaWdodDogMSxcbiAgICAgIGRlcHRoOiAxLFxuICAgICAgd2lkdGhTZWdtZW50czogMSxcbiAgICAgIGhlaWdodFNlZ21lbnRzOiAxLFxuICAgICAgZGVwdGhTZWdtZW50czogMVxuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogSW5zdHJ1Y3Rpb25zXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLkJveCNpbnN0cnVjdGlvbnNcbiAgICogQHN0YXRpY1xuICAgKiBAZGVmYXVsdCBnZW9tZXRyeTogWyd3aWR0aCcsICdoZWlnaHQnLCAnZGVwdGgnLCAnd2lkdGhTZWdtZW50cycsICdoZWlnaHRTZWdtZW50cycsICdkZXB0aFNlZ2VtZW50cyddXG4gICAqL1xuICBzdGF0aWMgaW5zdHJ1Y3Rpb25zID0ge1xuICAgIC4uLk1lc2hDb21wb25lbnQuaW5zdHJ1Y3Rpb25zLFxuICAgIGdlb21ldHJ5OiBbJ3dpZHRoJywgJ2hlaWdodCcsICdkZXB0aCcsICd3aWR0aFNlZ21lbnRzJywgJ2hlaWdodFNlZ21lbnRzJywgJ2RlcHRoU2VnZW1lbnRzJ11cbiAgfTtcblxuICBjb25zdHJ1Y3RvcihwYXJhbXMgPSB7fSkge1xuICAgIHN1cGVyKHBhcmFtcywgQm94LmRlZmF1bHRzLCBCb3guaW5zdHJ1Y3Rpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGJ1aWxkXG4gICAqIEBkZXNjcmlwdGlvbiBCdWlsZCBsaWZlY3ljbGUgY3JlYXRlcyBhIG1lc2ggdXNpbmcgaW5wdXQgcGFyYW1zLlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIENvbXBvbmVudCBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJuIHtUSFJFRS5NZXNofSBCdWlsdCBtZXNoXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuQm94XG4gICAqL1xuICBidWlsZChwYXJhbXMgPSB0aGlzLnBhcmFtcykge1xuICAgIGNvbnN0IHtnZW9tZXRyeSwgbWF0ZXJpYWx9ID0gdGhpcy5hcHBseUJyaWRnZSh7XG4gICAgICBnZW9tZXRyeTogdGhpcy5idWlsZEdlb21ldHJ5KHBhcmFtcyksXG4gICAgICBtYXRlcmlhbDogcGFyYW1zLm1hdGVyaWFsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5hcHBseUJyaWRnZSh7bWVzaDogbmV3IE1lc2goZ2VvbWV0cnksIG1hdGVyaWFsKX0pLm1lc2g7XG4gIH1cblxuICBidWlsZEdlb21ldHJ5KHBhcmFtcyA9IHt9KSB7XG4gICAgY29uc3QgZ2VvbWV0cnkgPSBuZXcgKHBhcmFtcy5idWZmZXIgPyBCb3hCdWZmZXJHZW9tZXRyeSA6IEJveEdlb21ldHJ5KShcbiAgICAgIHBhcmFtcy5nZW9tZXRyeS53aWR0aCxcbiAgICAgIHBhcmFtcy5nZW9tZXRyeS5oZWlnaHQsXG4gICAgICBwYXJhbXMuZ2VvbWV0cnkuZGVwdGgsXG4gICAgICBwYXJhbXMuZ2VvbWV0cnkud2lkdGhTZWdtZW50cyxcbiAgICAgIHBhcmFtcy5nZW9tZXRyeS5oZWlnaHRTZWdtZW50cyxcbiAgICAgIHBhcmFtcy5nZW9tZXRyeS5kZXB0aFNlZ21lbnRzXG4gICAgKTtcblxuICAgIHJldHVybiBnZW9tZXRyeTtcbiAgfVxufVxuXG5leHBvcnQge1xuICBCb3hcbn07XG4iLCJpbXBvcnQge1xuICBNZXNoLFxuICBDaXJjbGVCdWZmZXJHZW9tZXRyeSxcbiAgQ2lyY2xlR2VvbWV0cnlcbn0gZnJvbSAndGhyZWUnO1xuXG5pbXBvcnQge01lc2hDb21wb25lbnR9IGZyb20gJy4uLy4uL2NvcmUvTWVzaENvbXBvbmVudCc7XG5cbi8qKlxuICogQGNsYXNzIENpcmNsZVxuICogQGNhdGVnb3J5IGNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZGVzY3JpcHRpb24gQXMgdG9sZCBvbiBDb21wb25lbnQgZGVmaW5pdGlvbiwgd2hpbGUgeW91IGNhbiBwYXNzIGFueSBvZiB0aGUgaW5oZXJpdGVkIHBhcmFtcyBmb3IgdGhpcyBjb21wb25lbnQgY29uc3RydWN0aW9uLCB5b3Ugd2lsbCBuZWVkIHRvXG4gKiBwYXNzIHNwZWNpZmljIHBhcmFtZXRlcnMgdG8gYnVpbGQgdGhpcyBtZXNoIGFzIGEgZ2VvbWV0cnkgb2JqZWN0LlxuICogQGNsYXNzRGVzY1xuICogPGlmcmFtZSBzcmM9XCJodHRwczovL3RocmVlanMub3JnL2RvY3Mvc2NlbmVzL2dlb21ldHJ5LWJyb3dzZXIuaHRtbCNDaXJjbGVHZW9tZXRyeVwiPjwvaWZyYW1lPlxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXNdIC0gVGhlIHBhcmFtcy5cbiAqIEBleHRlbmRzIG1vZHVsZTpjb3JlLk1lc2hDb21wb25lbnRcbiAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXNcbiAqIEBleGFtcGxlIDxjYXB0aW9uPkNyZWF0aW5nIGEgQ2lyY2xlLCBhbmQgYWRkaW5nIHRvIGFwcDwvY2FwdGlvbj5cbiAqICBuZXcgQ2lyY2xlKHtcbiAqICAgIGdlb21ldHJ5OiB7XG4gKiAgICAgIHJhZGl1czogNCxcbiAqICAgICAgc2VnbWVudHM6IDE2XG4gKiAgICB9LFxuICpcbiAqICAgIG1hdGVyaWFsOiBuZXcgVEhSRUUuTWVzaEJhc2ljTWF0ZXJpYWwoe1xuICogICAgICBjb2xvcjogMHhmZmZmZmZcbiAqICAgIH0pLFxuICpcbiAqICAgIHBvc2l0aW9uOiBbNTAsIDYwLCA3MF1cbiAqIH0pLmFkZFRvKGFwcCk7XG4gKi9cbmNsYXNzIENpcmNsZSBleHRlbmRzIE1lc2hDb21wb25lbnQge1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0IHZhbHVlcyBmb3IgcGFyYW1ldGVyc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5DaXJjbGUjZGVmYXVsdHNcbiAgICogQHN0YXRpY1xuICAgKiBAZGVmYXVsdCA8cHJlPlxuICAgKiB7XG4gICAqICAgZ2VvbWV0cnk6IHtcbiAgICogICAgIHJhZGl1czogNTAsXG4gICAqICAgICBzZWdtZW50czogOCxcbiAgICogICAgIHRoZXRhU3RhcnQ6IDAsXG4gICAqICAgICB0aGV0YUxlbmd0aDogTWF0aC5QSSAqIDJcbiAgICogICB9XG4gICAqIH08L3ByZT5cbiAgICovXG4gIHN0YXRpYyBkZWZhdWx0cyA9IHtcbiAgICAuLi5NZXNoQ29tcG9uZW50LmRlZmF1bHRzLFxuXG4gICAgZ2VvbWV0cnk6IHtcbiAgICAgIHJhZGl1czogNTAsXG4gICAgICBzZWdtZW50czogOCxcbiAgICAgIHRoZXRhU3RhcnQ6IDAsXG4gICAgICB0aGV0YUxlbmd0aDogTWF0aC5QSSAqIDJcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEluc3RydWN0aW9uc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5DaXJjbGUjaW5zdHJ1Y3Rpb25zXG4gICAqIEBzdGF0aWNcbiAgICogQGRlZmF1bHQgZ2VvbWV0cnk6IFsncmFkaXVzJywgJ3NlZ21lbnRzJywgJ3RoZXRhU3RhcnQnLCAndGhldGFMZW5ndGgnXVxuICAgKi9cbiAgc3RhdGljIGluc3RydWN0aW9ucyA9IHtcbiAgICAuLi5NZXNoQ29tcG9uZW50Lmluc3RydWN0aW9ucyxcbiAgICBnZW9tZXRyeTogWydyYWRpdXMnLCAnc2VnbWVudHMnLCAndGhldGFTdGFydCcsICd0aGV0YUxlbmd0aCddXG4gIH07XG5cbiAgY29uc3RydWN0b3IocGFyYW1zID0ge30pIHtcbiAgICBzdXBlcihwYXJhbXMsIENpcmNsZS5kZWZhdWx0cywgQ2lyY2xlLmluc3RydWN0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBidWlsZFxuICAgKiBAZGVzY3JpcHRpb24gQnVpbGQgbGlmZWN5Y2xlIGNyZWF0ZXMgYSBtZXNoIHVzaW5nIGlucHV0IHBhcmFtcy5cbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBDb21wb25lbnQgcGFyYW1ldGVycy5cbiAgICogQHJldHVybiB7VEhSRUUuTWVzaH0gQnVpbHQgbWVzaFxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLkNpcmNsZVxuICAgKi9cbiAgYnVpbGQocGFyYW1zID0gdGhpcy5wYXJhbXMpIHtcbiAgICBjb25zdCB7Z2VvbWV0cnksIG1hdGVyaWFsfSA9IHRoaXMuYXBwbHlCcmlkZ2Uoe1xuICAgICAgZ2VvbWV0cnk6IHRoaXMuYnVpbGRHZW9tZXRyeShwYXJhbXMpLFxuICAgICAgbWF0ZXJpYWw6IHBhcmFtcy5tYXRlcmlhbFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMuYXBwbHlCcmlkZ2Uoe21lc2g6IG5ldyBNZXNoKGdlb21ldHJ5LCBtYXRlcmlhbCl9KS5tZXNoO1xuICB9XG5cbiAgYnVpbGRHZW9tZXRyeShwYXJhbXMgPSB7fSkge1xuICAgIGNvbnN0IGdlb21ldHJ5ID0gbmV3IChwYXJhbXMuYnVmZmVyID8gQ2lyY2xlQnVmZmVyR2VvbWV0cnkgOiBDaXJjbGVHZW9tZXRyeSkoXG4gICAgICBwYXJhbXMuZ2VvbWV0cnkucmFkaXVzLFxuICAgICAgcGFyYW1zLmdlb21ldHJ5LnNlZ21lbnRzLFxuICAgICAgcGFyYW1zLmdlb21ldHJ5LnRoZXRhU3RhcnQsXG4gICAgICBwYXJhbXMuZ2VvbWV0cnkudGhldGFMZW5ndGhcbiAgICApO1xuXG4gICAgcmV0dXJuIGdlb21ldHJ5O1xuICB9XG59XG5cbmV4cG9ydCB7XG4gIENpcmNsZVxufTtcbiIsImltcG9ydCB7XG4gIE1lc2gsXG4gIENvbmVCdWZmZXJHZW9tZXRyeSxcbiAgQ29uZUdlb21ldHJ5XG59IGZyb20gJ3RocmVlJztcblxuaW1wb3J0IHtNZXNoQ29tcG9uZW50fSBmcm9tICcuLi8uLi9jb3JlL01lc2hDb21wb25lbnQnO1xuXG4vKipcbiAqIEBjbGFzcyBDb25lXG4gKiBAY2F0ZWdvcnkgY29tcG9uZW50cy9tZXNoZXNcbiAqIEBkZXNjcmlwdGlvbiBBIGN5bGluZGVyIGlzIG9uZSBvZiB0aGUgbW9zdCBiYXNpYyBjdXJ2aWxpbmVhciBnZW9tZXRyaWMgc2hhcGVzLCB0aGUgc3VyZmFjZSBmb3JtZWQgYnkgdGhlIHBvaW50cyBhdCBhIGZpeGVkIGRpc3RhbmNlIGZyb20gYSBnaXZlbiBzdHJhaWdodCBsaW5lLCB0aGUgYXhpcyBvZiB0aGUgY3lsaW5kZXIuIDxici8+PGJyLz5cbiAqIFRoZSBzb2xpZCBlbmNsb3NlZCBieSB0aGlzIHN1cmZhY2UgYW5kIGJ5IHR3byBwbGFuZXMgcGVycGVuZGljdWxhciB0byB0aGUgYXhpcyBpcyBhbHNvIGNhbGxlZCBhIGN5bGluZGVyLjxici8+XG4gKiBUaGUgc3VyZmFjZSBhcmVhIGFuZCB0aGUgdm9sdW1lIG9mIGEgY3lsaW5kZXIgaGF2ZSBiZWVuIGtub3duIHNpbmNlIGRlZXAgYW50aXF1aXR5LlxuICogQGNsYXNzRGVzY1xuICogPGlmcmFtZSBzcmM9XCJodHRwczovL3RocmVlanMub3JnL2RvY3Mvc2NlbmVzL2dlb21ldHJ5LWJyb3dzZXIuaHRtbCNDb25lR2VvbWV0cnlcIj48L2lmcmFtZT5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zXSAtIFRoZSBwYXJhbXMuXG4gKiBAZXh0ZW5kcyBtb2R1bGU6Y29yZS5NZXNoQ29tcG9uZW50XG4gKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5DcmVhdGluZyBhIENvbmUsIGFuZCBhZGRpbmcgdG8gYXBwPC9jYXB0aW9uPlxuICogbmV3IENvbmUoe1xuICogICBnZW9tZXRyeToge1xuICogICAgIHJhZGl1c1RvcDogMixcbiAqICAgICByYWRpdXNCb3R0b206IDQsXG4gKiAgICAgaGVpZ2h0OiA1XG4gKiAgIH0sXG4gKlxuICogICBtYXRlcmlhbDogbmV3IFRIUkVFLk1lc2hCYXNpY01hdGVyaWFsKHtcbiAqICAgICBjb2xvcjogMHhmZmZmZmZcbiAqICAgfSksXG4gKlxuICogICBwb3M6IFswLCAxMDAsIDBdXG4gKiB9KS5hZGRUbyhhcHApO1xuICovXG5jbGFzcyBDb25lIGV4dGVuZHMgTWVzaENvbXBvbmVudCB7XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgdmFsdWVzIGZvciBwYXJhbWV0ZXJzXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLkNvbmUjZGVmYXVsdHNcbiAgICogQHN0YXRpY1xuICAgKiBAZGVmYXVsdCA8cHJlPlxuICAgKiB7XG4gICAqICAgZ2VvbWV0cnk6IHtcbiAgICogICAgIHJhZGl1czogMjAsXG4gICAqICAgICBoZWlnaHQ6IDEwMCxcbiAgICogICAgIHJhZGl1c1NlZ21lbnRzOiAzMixcbiAgICogICAgIGhlaWdodFNlZ21lbnRzOiAxLFxuICAgKiAgICAgb3BlbkVuZGVkOiBmYWxzZSxcbiAgICogICAgIHRoZXRhU3RhcnQ6IDAsXG4gICAqICAgICB0aGV0YUxlbmd0aDogTWF0aC5QSSAqIDJcbiAgICogICB9XG4gICAqIH08L3ByZT5cbiAgICovXG4gIHN0YXRpYyBkZWZhdWx0cyA9IHtcbiAgICAuLi5NZXNoQ29tcG9uZW50LmRlZmF1bHRzLFxuXG4gICAgZ2VvbWV0cnk6IHtcbiAgICAgIHJhZGl1czogMjAsXG4gICAgICBoZWlnaHQ6IDEwMCxcbiAgICAgIHJhZGl1c1NlZ21lbnRzOiAzMixcbiAgICAgIGhlaWdodFNlZ21lbnRzOiAxLFxuICAgICAgb3BlbkVuZGVkOiBmYWxzZSxcbiAgICAgIHRoZXRhU3RhcnQ6IDAsXG4gICAgICB0aGV0YUxlbmd0aDogTWF0aC5QSSAqIDJcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEluc3RydWN0aW9uc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5Db25lI2luc3RydWN0aW9uc1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IDxwcmU+XG4gICAqIGdlb21ldHJ5OiBbXG4gICAqICAgJ3JhZGl1cycsXG4gICAqICAgJ2hlaWdodCcsXG4gICAqICAgJ3JhZGl1c1NlZ21lbnRzJyxcbiAgICogICAnaGVpZ2h0U2VnbWVudHMnLFxuICAgKiAgICdvcGVuRW5kZWQnLFxuICAgKiAgICd0aGV0YVN0YXJ0JyxcbiAgICogICAndGhldGFMZW5ndGgnXG4gICAqIF1cbiAgICogPC9wcmU+XG4gICAqL1xuICBzdGF0aWMgaW5zdHJ1Y3Rpb25zID0ge1xuICAgIC4uLk1lc2hDb21wb25lbnQuaW5zdHJ1Y3Rpb25zLFxuICAgIGdlb21ldHJ5OiBbXG4gICAgICAncmFkaXVzJyxcbiAgICAgICdoZWlnaHQnLFxuICAgICAgJ3JhZGl1c1NlZ21lbnRzJyxcbiAgICAgICdoZWlnaHRTZWdtZW50cycsXG4gICAgICAnb3BlbkVuZGVkJyxcbiAgICAgICd0aGV0YVN0YXJ0JyxcbiAgICAgICd0aGV0YUxlbmd0aCdcbiAgICBdXG4gIH07XG5cbiAgY29uc3RydWN0b3IocGFyYW1zID0ge30pIHtcbiAgICBzdXBlcihwYXJhbXMsIENvbmUuZGVmYXVsdHMsIENvbmUuaW5zdHJ1Y3Rpb25zKTtcblxuICAgIGlmIChwYXJhbXMuYnVpbGQpIHtcbiAgICAgIHRoaXMuYnVpbGQocGFyYW1zKTtcbiAgICAgIHN1cGVyLndyYXAoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBidWlsZFxuICAgKiBAZGVzY3JpcHRpb24gQnVpbGQgbGlmZWN5Y2xlIGNyZWF0ZXMgYSBtZXNoIHVzaW5nIGlucHV0IHBhcmFtcy5cbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBDb21wb25lbnQgcGFyYW1ldGVycy5cbiAgICogQHJldHVybiB7VEhSRUUuTWVzaH0gQnVpbHQgbWVzaFxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLkNvbmVcbiAgICovXG4gIGJ1aWxkKHBhcmFtcyA9IHRoaXMucGFyYW1zKSB7XG4gICAgY29uc3Qge2dlb21ldHJ5LCBtYXRlcmlhbH0gPSB0aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgIGdlb21ldHJ5OiB0aGlzLmJ1aWxkR2VvbWV0cnkocGFyYW1zKSxcbiAgICAgIG1hdGVyaWFsOiBwYXJhbXMubWF0ZXJpYWxcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmFwcGx5QnJpZGdlKHttZXNoOiBuZXcgTWVzaChnZW9tZXRyeSwgbWF0ZXJpYWwpfSkubWVzaDtcbiAgfVxuXG4gIGJ1aWxkR2VvbWV0cnkocGFyYW1zID0ge30pIHtcbiAgICBjb25zdCBnZW9tZXRyeSA9IG5ldyAocGFyYW1zLmJ1ZmZlciA/IENvbmVCdWZmZXJHZW9tZXRyeSA6IENvbmVHZW9tZXRyeSkoXG4gICAgICBwYXJhbXMuZ2VvbWV0cnkucmFkaXVzLFxuICAgICAgcGFyYW1zLmdlb21ldHJ5LmhlaWdodCxcbiAgICAgIHBhcmFtcy5nZW9tZXRyeS5yYWRpdXNTZWdtZW50cyxcbiAgICAgIHBhcmFtcy5nZW9tZXRyeS5oZWlnaHRTZWdtZW50cyxcbiAgICAgIHBhcmFtcy5nZW9tZXRyeS5vcGVuRW5kZWQsXG4gICAgICBwYXJhbXMuZ2VvbWV0cnkudGhldGFTdGFydCxcbiAgICAgIHBhcmFtcy5nZW9tZXRyeS50aGV0YUxlbmd0aFxuICAgICk7XG5cbiAgICByZXR1cm4gZ2VvbWV0cnk7XG4gIH1cbn1cblxuZXhwb3J0IHtcbiAgQ29uZVxufTtcbiIsImltcG9ydCB7XG4gIE1lc2gsXG4gIEN5bGluZGVyQnVmZmVyR2VvbWV0cnksXG4gIEN5bGluZGVyR2VvbWV0cnlcbn0gZnJvbSAndGhyZWUnO1xuXG5pbXBvcnQge01lc2hDb21wb25lbnR9IGZyb20gJy4uLy4uL2NvcmUvTWVzaENvbXBvbmVudCc7XG5cbi8qKlxuICogQGNsYXNzIEN5bGluZGVyXG4gKiBAY2F0ZWdvcnkgY29tcG9uZW50cy9tZXNoZXNcbiAqIEBkZXNjcmlwdGlvbiBBIGN5bGluZGVyIGlzIG9uZSBvZiB0aGUgbW9zdCBiYXNpYyBjdXJ2aWxpbmVhciBnZW9tZXRyaWMgc2hhcGVzLCB0aGUgc3VyZmFjZSBmb3JtZWQgYnkgdGhlIHBvaW50cyBhdCBhIGZpeGVkIGRpc3RhbmNlIGZyb20gYSBnaXZlbiBzdHJhaWdodCBsaW5lLCB0aGUgYXhpcyBvZiB0aGUgY3lsaW5kZXIuIDxici8+PGJyLz5cbiAqIFRoZSBzb2xpZCBlbmNsb3NlZCBieSB0aGlzIHN1cmZhY2UgYW5kIGJ5IHR3byBwbGFuZXMgcGVycGVuZGljdWxhciB0byB0aGUgYXhpcyBpcyBhbHNvIGNhbGxlZCBhIGN5bGluZGVyLjxici8+XG4gKiBUaGUgc3VyZmFjZSBhcmVhIGFuZCB0aGUgdm9sdW1lIG9mIGEgY3lsaW5kZXIgaGF2ZSBiZWVuIGtub3duIHNpbmNlIGRlZXAgYW50aXF1aXR5LlxuICogQGNsYXNzRGVzY1xuICogPGlmcmFtZSBzcmM9XCJodHRwczovL3RocmVlanMub3JnL2RvY3Mvc2NlbmVzL2dlb21ldHJ5LWJyb3dzZXIuaHRtbCNDeWxpbmRlckdlb21ldHJ5XCI+PC9pZnJhbWU+XG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtc10gLSBUaGUgcGFyYW1zLlxuICogQGV4dGVuZHMgbW9kdWxlOmNvcmUuTWVzaENvbXBvbmVudFxuICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL21lc2hlc1xuICogQGV4YW1wbGUgPGNhcHRpb24+Q3JlYXRpbmcgYSBDeWxpbmRlciwgYW5kIGFkZGluZyB0byBhcHA8L2NhcHRpb24+XG4gKiBuZXcgQ3lsaW5kZXIoe1xuICogICBnZW9tZXRyeToge1xuICogICAgIHJhZGl1c1RvcDogMixcbiAqICAgICByYWRpdXNCb3R0b206IDQsXG4gKiAgICAgaGVpZ2h0OiA1XG4gKiAgIH0sXG4gKlxuICogICBtYXRlcmlhbDogbmV3IFRIUkVFLk1lc2hCYXNpY01hdGVyaWFsKHtcbiAqICAgICBjb2xvcjogMHhmZmZmZmZcbiAqICAgfSksXG4gKlxuICogICBwb3M6IFswLCAxMDAsIDBdXG4gKiB9KS5hZGRUbyhhcHApO1xuICovXG5jbGFzcyBDeWxpbmRlciBleHRlbmRzIE1lc2hDb21wb25lbnQge1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0IHZhbHVlcyBmb3IgcGFyYW1ldGVyc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5DeWxpbmRlciNkZWZhdWx0c1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IDxwcmU+XG4gICAqIHtcbiAgICogICBnZW9tZXRyeToge1xuICAgKiAgICAgcmFkaXVzVG9wOiAyMCxcbiAgICogICAgIHJhZGl1c0JvdHRvbTogMjAsXG4gICAqICAgICBoZWlnaHQ6IDEwMCxcbiAgICogICAgIHJhZGl1c1NlZ21lbnRzOiAzMixcbiAgICogICAgIGhlaWdodFNlZ21lbnRzOiAxLFxuICAgKiAgICAgb3BlbkVuZGVkOiBmYWxzZSxcbiAgICogICAgIHRoZXRhU3RhcnQ6IDAsXG4gICAqICAgICB0aGV0YUxlbmd0aDogTWF0aC5QSSAqIDJcbiAgICogICB9XG4gICAqIH08L3ByZT5cbiAgICovXG4gIHN0YXRpYyBkZWZhdWx0cyA9IHtcbiAgICAuLi5NZXNoQ29tcG9uZW50LmRlZmF1bHRzLFxuICAgIGdlb21ldHJ5OiB7XG4gICAgICByYWRpdXNUb3A6IDAsXG4gICAgICByYWRpdXNCb3R0b206IDEsXG4gICAgICBoZWlnaHQ6IDEsXG4gICAgICByYWRpdXNTZWdtZW50czogMzIsXG4gICAgICBoZWlnaHRTZWdtZW50czogMSxcbiAgICAgIG9wZW5FbmRlZDogZmFsc2UsXG4gICAgICB0aGV0YVN0YXJ0OiAwLFxuICAgICAgdGhldGFMZW5ndGg6IE1hdGguUEkgKiAyXG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBJbnN0cnVjdGlvbnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuQ3lsaW5kZXIjaW5zdHJ1Y3Rpb25zXG4gICAqIEBzdGF0aWNcbiAgICogQGRlZmF1bHQgPHByZT5cbiAgICogZ2VvbWV0cnk6IFtcbiAgICogICAncmFkaXVzVG9wJyxcbiAgICogICAncmFkaXVzQm90dG9tJyxcbiAgICogICAnaGVpZ2h0JyxcbiAgICogICAncmFkaXVzU2VnbWVudHMnLFxuICAgKiAgICdoZWlnaHRTZWdtZW50cycsXG4gICAqICAgJ29wZW5FbmRlZCcsXG4gICAqICAgJ3RoZXRhU3RhcnQnLFxuICAgKiAgICd0aGV0YUxlbmd0aCdcbiAgICogXVxuICAgKiA8L3ByZT5cbiAgICovXG4gIHN0YXRpYyBpbnN0cnVjdGlvbnMgPSB7XG4gICAgLi4uTWVzaENvbXBvbmVudC5pbnN0cnVjdGlvbnMsXG4gICAgZ2VvbWV0cnk6IFtcbiAgICAgICdyYWRpdXNUb3AnLFxuICAgICAgJ3JhZGl1c0JvdHRvbScsXG4gICAgICAnaGVpZ2h0JyxcbiAgICAgICdyYWRpdXNTZWdtZW50cycsXG4gICAgICAnaGVpZ2h0U2VnbWVudHMnLFxuICAgICAgJ29wZW5FbmRlZCcsXG4gICAgICAndGhldGFTdGFydCcsXG4gICAgICAndGhldGFMZW5ndGgnXG4gICAgXVxuICB9O1xuXG4gIGNvbnN0cnVjdG9yKHBhcmFtcyA9IHt9KSB7XG4gICAgc3VwZXIocGFyYW1zLCBDeWxpbmRlci5kZWZhdWx0cywgQ3lsaW5kZXIuaW5zdHJ1Y3Rpb25zKTtcblxuICAgIGlmIChwYXJhbXMuYnVpbGQpIHtcbiAgICAgIHRoaXMuYnVpbGQocGFyYW1zKTtcbiAgICAgIHN1cGVyLndyYXAoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBidWlsZFxuICAgKiBAZGVzY3JpcHRpb24gQnVpbGQgbGlmZWN5Y2xlIGNyZWF0ZXMgYSBtZXNoIHVzaW5nIGlucHV0IHBhcmFtcy5cbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBDb21wb25lbnQgcGFyYW1ldGVycy5cbiAgICogQHJldHVybiB7VEhSRUUuTWVzaH0gQnVpbHQgbWVzaFxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLkN5bGluZGVyXG4gICAqL1xuICBidWlsZChwYXJhbXMgPSB0aGlzLnBhcmFtcykge1xuICAgIGNvbnN0IHtnZW9tZXRyeSwgbWF0ZXJpYWx9ID0gdGhpcy5hcHBseUJyaWRnZSh7XG4gICAgICBnZW9tZXRyeTogdGhpcy5idWlsZEdlb21ldHJ5KHBhcmFtcyksXG4gICAgICBtYXRlcmlhbDogcGFyYW1zLm1hdGVyaWFsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5hcHBseUJyaWRnZSh7bWVzaDogbmV3IE1lc2goZ2VvbWV0cnksIG1hdGVyaWFsKX0pLm1lc2g7XG4gIH1cblxuICBidWlsZEdlb21ldHJ5KHBhcmFtcyA9IHt9KSB7XG4gICAgY29uc3QgZ2VvbWV0cnkgPSBuZXcgKHBhcmFtcy5idWZmZXIgPyBDeWxpbmRlckJ1ZmZlckdlb21ldHJ5IDogQ3lsaW5kZXJHZW9tZXRyeSkoXG4gICAgICBwYXJhbXMuZ2VvbWV0cnkucmFkaXVzVG9wLFxuICAgICAgcGFyYW1zLmdlb21ldHJ5LnJhZGl1c0JvdHRvbSxcbiAgICAgIHBhcmFtcy5nZW9tZXRyeS5oZWlnaHQsXG4gICAgICBwYXJhbXMuZ2VvbWV0cnkucmFkaXVzU2VnbWVudHMsXG4gICAgICBwYXJhbXMuZ2VvbWV0cnkuaGVpZ2h0U2VnbWVudHMsXG4gICAgICBwYXJhbXMuZ2VvbWV0cnkub3BlbkVuZGVkLFxuICAgICAgcGFyYW1zLmdlb21ldHJ5LnRoZXRhU3RhcnQsXG4gICAgICBwYXJhbXMuZ2VvbWV0cnkudGhldGFMZW5ndGhcbiAgICApO1xuXG4gICAgcmV0dXJuIGdlb21ldHJ5O1xuICB9XG59XG5cbmV4cG9ydCB7XG4gIEN5bGluZGVyXG59O1xuIiwiaW1wb3J0IHtcbiAgTWVzaCxcbiAgRG9kZWNhaGVkcm9uQnVmZmVyR2VvbWV0cnksXG4gIERvZGVjYWhlZHJvbkdlb21ldHJ5XG59IGZyb20gJ3RocmVlJztcblxuaW1wb3J0IHtNZXNoQ29tcG9uZW50fSBmcm9tICcuLi8uLi9jb3JlL01lc2hDb21wb25lbnQnO1xuXG4vKipcbiAqIEBjbGFzcyBEb2RlY2FoZWRyb25cbiAqIEBjYXRlZ29yeSBjb21wb25lbnRzL21lc2hlc1xuICogQGRlc2NyaXB0aW9uIEluIGdlb21ldHJ5LCBhIGRvZGVjYWhlZHJvbiBpcyBhbnkgcG9seWhlZHJvbiB3aXRoIHR3ZWx2ZSBmbGF0IGZhY2VzLiA8YnIvPjxici8+XG4gKiBUaGUgbW9zdCBmYW1pbGlhciBkb2RlY2FoZWRyb24gaXMgdGhlIHJlZ3VsYXIgZG9kZWNhaGVkcm9uLCB3aGljaCBpcyBhIFBsYXRvbmljIHNvbGlkLiA8YnIvPlxuICogVGhlcmUgYXJlIGFsc28gdGhyZWUgcmVndWxhciBzdGFyIGRvZGVjYWhlZHJhLCB3aGljaCBhcmUgY29uc3RydWN0ZWQgYXMgc3RlbGxhdGlvbnMgb2YgdGhlIGNvbnZleCBmb3JtLiA8YnIvPlxuICogQWxsIG9mIHRoZXNlIGhhdmUgaWNvc2FoZWRyYWwgc3ltbWV0cnksIG9yZGVyIDEyMC5cbiAqIERvZGVjYWhlZHJvbiBjcmVhdGVzIERvZGVjYWhlZHJvbiBvYmplY3QgYnkgaXQncyByYWRpdXMgYW5kIGRldGFpbC5cbiAqIEBjbGFzc0Rlc2NcbiAqIDxpZnJhbWUgc3JjPVwiaHR0cHM6Ly90aHJlZWpzLm9yZy9kb2NzL3NjZW5lcy9nZW9tZXRyeS1icm93c2VyLmh0bWwjRG9kZWNhaGVkcm9uR2VvbWV0cnlcIj48L2lmcmFtZT5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zXSAtIFRoZSBwYXJhbXMuXG4gKiBAZXh0ZW5kcyBtb2R1bGU6Y29yZS5NZXNoQ29tcG9uZW50XG4gKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5DcmVhdGluZyBhIERvZGVjYWhlZHJvbiwgYW5kIGFkZGluZyB0byBhcHA8L2NhcHRpb24+XG4gKiBuZXcgRG9kZWNhaGVkcm9uKHtcbiAqICAgZ2VvbWV0cnk6IHtcbiAqICAgICByYWRpdXM6IDJcbiAqICAgfSxcbiAqXG4gKiAgIG1hdGVyaWFsOiBuZXcgVEhSRUUuTWVzaEJhc2ljTWF0ZXJpYWwoe1xuICogICAgIGNvbG9yOiAweGZmZmZmZlxuICogICB9KSxcbiAqXG4gKiAgIHBvc2l0aW9uOiB7XG4gKiAgICAgeTogMTBcbiAqICAgfVxuICAqIH0pLmFkZFRvKGFwcCk7XG4gKi9cbmNsYXNzIERvZGVjYWhlZHJvbiBleHRlbmRzIE1lc2hDb21wb25lbnQge1xuICAvKipcbiAgICogRGVmYXVsdCB2YWx1ZXMgZm9yIHBhcmFtZXRlcnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuRG9kZWNhaGVkcm9uI2RlZmF1bHRzXG4gICAqIEBzdGF0aWNcbiAgICogQGRlZmF1bHQgPHByZT5cbiAgICogZ2VvbWV0cnk6IHtcbiAgICogICByYWRpdXM6IDEsXG4gICAqICAgZGV0YWlsOiAwXG4gICAqIH1cbiAgICogPC9wcmU+XG4gICAqL1xuICBzdGF0aWMgZGVmYXVsdHMgPSB7XG4gICAgLi4uTWVzaENvbXBvbmVudC5kZWZhdWx0cyxcbiAgICBnZW9tZXRyeToge1xuICAgICAgcmFkaXVzOiAxLFxuICAgICAgZGV0YWlsOiAwXG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBJbnN0cnVjdGlvbnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuRG9kZWNhaGVkcm9uI2luc3RydWN0aW9uc1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IDxwcmU+XG4gICAqIGdlb21ldHJ5OiBbJ3JhZGl1cycsICdkZXRhaWwnXVxuICAgKiA8L3ByZT5cbiAgICovXG4gIHN0YXRpYyBpbnN0cnVjdGlvbnMgPSB7XG4gICAgLi4uTWVzaENvbXBvbmVudC5pbnN0cnVjdGlvbnMsXG4gICAgZ2VvbWV0cnk6IFsncmFkaXVzJywgJ2RldGFpbCddXG4gIH07XG5cbiAgY29uc3RydWN0b3IocGFyYW1zID0ge30pIHtcbiAgICBzdXBlcihwYXJhbXMsIERvZGVjYWhlZHJvbi5kZWZhdWx0cywgRG9kZWNhaGVkcm9uLmluc3RydWN0aW9ucyk7XG5cbiAgICBpZiAocGFyYW1zLmJ1aWxkKSB7XG4gICAgICB0aGlzLmJ1aWxkKHBhcmFtcyk7XG4gICAgICBzdXBlci53cmFwKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgYnVpbGRcbiAgICogQGRlc2NyaXB0aW9uIEJ1aWxkIGxpZmVjeWNsZSBjcmVhdGVzIGEgbWVzaCB1c2luZyBpbnB1dCBwYXJhbXMuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgQ29tcG9uZW50IHBhcmFtZXRlcnMuXG4gICAqIEByZXR1cm4ge1RIUkVFLk1lc2h9IEJ1aWx0IG1lc2hcbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5Eb2RlY2FoZWRyb25cbiAgICovXG4gIGJ1aWxkKHBhcmFtcyA9IHRoaXMucGFyYW1zKSB7XG4gICAgY29uc3Qge2dlb21ldHJ5LCBtYXRlcmlhbH0gPSB0aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgIGdlb21ldHJ5OiB0aGlzLmJ1aWxkR2VvbWV0cnkocGFyYW1zKSxcbiAgICAgIG1hdGVyaWFsOiBwYXJhbXMubWF0ZXJpYWxcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmFwcGx5QnJpZGdlKHttZXNoOiBuZXcgTWVzaChnZW9tZXRyeSwgbWF0ZXJpYWwpfSkubWVzaDtcbiAgfVxuXG4gIGJ1aWxkR2VvbWV0cnkocGFyYW1zID0ge30pIHtcbiAgICByZXR1cm4gbmV3IChwYXJhbXMuYnVmZmVyID8gRG9kZWNhaGVkcm9uQnVmZmVyR2VvbWV0cnkgOiBEb2RlY2FoZWRyb25HZW9tZXRyeSkoXG4gICAgICBwYXJhbXMuZ2VvbWV0cnkucmFkaXVzLFxuICAgICAgcGFyYW1zLmdlb21ldHJ5LmRldGFpbFxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IHtcbiAgRG9kZWNhaGVkcm9uXG59O1xuIiwiaW1wb3J0IHtcbiAgTWVzaCxcbiAgQnVmZmVyR2VvbWV0cnksXG4gIEV4dHJ1ZGVHZW9tZXRyeVxufSBmcm9tICd0aHJlZSc7XG5cbmltcG9ydCB7TWVzaENvbXBvbmVudH0gZnJvbSAnLi4vLi4vY29yZS9NZXNoQ29tcG9uZW50JztcblxuLyoqXG4gKiBAY2xhc3MgRXh0cnVkZVxuICogQGNhdGVnb3J5IGNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZGVzY3JpcHRpb24gRXh0cnVkZSBnZW9tZXRyeSBtZWFucyB0aGF0IHlvdSBjYW4gY3JlYXRlIGEgM0QgbWVzaCBmcm9tIGFueSAyRCBzaGFwZSB1c2luZyB0aHJlZS5qcyBnZW9tZXRyeSBiYXNlZCBvbiA8YSBocmVmPSdodHRwczovL3RocmVlanMub3JnL2RvY3MvI2FwaS9tYXRoL1ZlY3RvcjInPlRIUkVFLlZlY3RvcjIuPC9hPiA8YnIvPlxuICogU3VjaCBpbXBsZW1lbnRhdGlvbiB3aWxsIGhlbHAgeW91IHRvIG1ha2Ugdm9sdW1lZCBzaGFwZXMgdGhhdCBoYXZlIHRoZWlyIG93biBkZXB0aCBhbmQgY2FuIGJlIHNlZW4gZnJvbSBhbGwgYW5nZWxzLjxici8+PGJyLz5cbiAqIFlvdSBjYW4gYWxzbyBmaW5kIHNvbWUgaW50ZXJlc3RpbmcgZXhhbXBsZXMgbWFkZSB1c2luZyA8YSBocmVmPSd0aHJlZWpzLm9yZyc+dGhyZWUuanM8L2E+IHdoaWNoIGlzIGEgY29yZSBvZiB3aHMuanMsIHN1Y2ggYXM6XG4gKiAtIDxhIGhyZWY9J2h0dHA6Ly90aHJlZWpzLm9yZy9leGFtcGxlcy93ZWJnbF9nZW9tZXRyeV9leHRydWRlX3NoYXBlcy5odG1sJz5XZWJnbCBnZW9tZXRyeSBleHRydWRlPC9hPlxuICogLSA8YSBocmVmPSdodHRwOi8vdGhyZWVqcy5vcmcvZXhhbXBsZXMvd2ViZ2xfZ2VvbWV0cnlfZXh0cnVkZV9zaGFwZXMyLmh0bWwnPkV4dHJ1ZGUgc2hhcGVzIGZyb20gZ2VvZGF0YTwvYT5cbiAqIC0gPGEgaHJlZj0naHR0cDovL3RocmVlanMub3JnL2V4YW1wbGVzL3dlYmdsX2dlb21ldHJ5X2V4dHJ1ZGVfc3BsaW5lcy5odG1sJz5FeHRydWRlIHNwbGluZXM8L2E+XG4gKlxuICogU3VjaCBleGFtcGxlcyBjYW4gYmUgZWFzaWx5IGltcGxlbWVudGVkIHVzaW5nIHdoaXRlc3Rvcm0uanMgb3IgaXQncyBwbHVnaW5zLiBVc2UgYEV4dHJ1ZGVgIGNsYXNzIHdpdGggPGEgaHJlZj0naHR0cHM6Ly90aHJlZWpzLm9yZy9kb2NzLyNhcGkvZXh0cmFzL2NvcmUvU2hhcGUnPlRIUkVFLlNoYXBlPC9hPiB0byBnZXQgZXh0cnVkZSBlZmZlY3Qgb2Ygc2hhcGUgZGVmaW5lZCBieSAyRCB2ZWN0b3JzLlxuICogVGhpcyBjbGFzcyBpcyBzaW1pbGFyIHRvIDxhIGhyZWY9J2h0dHBzOi8vdGhyZWVqcy5vcmcvZG9jcy8jYXBpL2dlb21ldHJpZXMvRXh0cnVkZUdlb21ldHJ5Jz5USFJFRS5FeHRydWRlR2VvbWV0cnk8L2E+LFxuICogYnV0IGl0IGFsc28gY29udGFpbnMgYWxsIHByb3BlcnRpZXMsIGFwcGxpZWQgYnkgYFNoYXBlYCwgc3VjaCBhcyBtYXRlcmlhbCwgbWFzcyBhbmQgdmVjdG9ycyBsaWtlIHBvc2l0aW9uIChwb3MpIGFuZCByb3RhdGlvbiAocm90KS5cbiAqIEBjbGFzc0Rlc2NcbiAqIDxpZnJhbWUgc3JjPVwiaHR0cHM6Ly90aHJlZWpzLm9yZy9kb2NzL3NjZW5lcy9nZW9tZXRyeS1icm93c2VyLmh0bWwjRXh0cnVkZUdlb21ldHJ5XCI+PC9pZnJhbWU+XG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtc10gLSBUaGUgcGFyYW1zLlxuICogQGV4dGVuZHMgbW9kdWxlOmNvcmUuTWVzaENvbXBvbmVudFxuICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL21lc2hlc1xuICogQGV4YW1wbGUgPGNhcHRpb24+Q3JlYXRpbmcgYSBzaGFwZSwgdGhlbiBhbiBFeHRydWRlIGZyb20gaXQ8L2NhcHRpb24+XG4gKiBjb25zdCBzaGFwZSA9IG5ldyBUSFJFRS5TaGFwZShbXG4gKiAgIG5ldyBUSFJFRS5WZWN0b3IyKC00LC00KSxcbiAqICAgbmV3IFRIUkVFLlZlY3RvcjIoLTIsMCksXG4gKiAgIG5ldyBUSFJFRS5WZWN0b3IyKC00LDQpLFxuICogICBuZXcgVEhSRUUuVmVjdG9yMigwLDIpLFxuICogICBuZXcgVEhSRUUuVmVjdG9yMig0LDQpLFxuICogICBuZXcgVEhSRUUuVmVjdG9yMigyLDApLFxuICogICBuZXcgVEhSRUUuVmVjdG9yMig0LC00KSxcbiAqICAgbmV3IFRIUkVFLlZlY3RvcjIoMCwtMilcbiAqIF0pO1xuICpcbiAqIGNvbnN0IGV4dHJ1ZGUgPSBuZXcgRXh0cnVkZSh7XG4gKiAgIGdlb21ldHJ5OiB7XG4gKiAgICAgc2hhcGVzOiBzaGFwZSxcbiAqICAgICBvcHRpb25zOiB7XG4gKiAgICAgICBiZXZlbEVuYWJsZWQ6IGZhbHNlLFxuICogICAgICAgYmV2ZWxTaXplOiAwLFxuICogICAgICAgYW1vdW50OiAyXG4gKiAgICAgfVxuICogICB9LFxuICpcbiAqICAgbWF0ZXJpYWw6IG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCh7XG4gKiAgICAgY29sb3I6IDB4ZmZmZmZmXG4gKiAgIH0pLFxuICpcbiAqICAgcG9zaXRpb246IFswLCAxMDAsIDBdXG4gKiB9KTtcbiAqXG4gKiBleHRydWRlLmFkZFRvKGFwcCk7XG4gKi9cbmNsYXNzIEV4dHJ1ZGUgZXh0ZW5kcyBNZXNoQ29tcG9uZW50IHtcbiAgLyoqXG4gICAqIERlZmF1bHQgdmFsdWVzIGZvciBwYXJhbWV0ZXJzXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLkV4dHJ1ZGUjZGVmYXVsdHNcbiAgICogQHN0YXRpY1xuICAgKiBAZGVmYXVsdCA8cHJlPlxuICAgKiB7XG4gICAqICAgZ2VvbWV0cnk6IHtcbiAgICogICAgIHNoYXBlczogW10sXG4gICAqICAgICBvcHRpb25zOiB7fVxuICAgKiAgIH1cbiAgICogfVxuICAgKiA8L3ByZT5cbiAgICovXG4gIHN0YXRpYyBkZWZhdWx0cyA9IHtcbiAgICAuLi5NZXNoQ29tcG9uZW50LmRlZmF1bHRzLFxuICAgIGdlb21ldHJ5OiB7XG4gICAgICBzaGFwZXM6IFtdLFxuICAgICAgb3B0aW9uczoge31cbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEluc3RydWN0aW9uc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5FeHRydWRlI2luc3RydWN0aW9uc1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IDxwcmU+XG4gICAqIHtcbiAgICogICBnZW9tZXRyeTogWydzaGFwZXMnLCAnb3B0aW9ucyddXG4gICAqIH1cbiAgICogPC9wcmU+XG4gICAqL1xuICBzdGF0aWMgaW5zdHJ1Y3Rpb25zID0ge1xuICAgIC4uLk1lc2hDb21wb25lbnQuaW5zdHJ1Y3Rpb25zLFxuICAgIGdlb21ldHJ5OiBbJ3NoYXBlcycsICdvcHRpb25zJ11cbiAgfTtcblxuICBjb25zdHJ1Y3RvcihwYXJhbXMgPSB7fSkge1xuICAgIHN1cGVyKHBhcmFtcywgRXh0cnVkZS5kZWZhdWx0cywgRXh0cnVkZS5pbnN0cnVjdGlvbnMpO1xuXG4gICAgaWYgKHBhcmFtcy5idWlsZCkge1xuICAgICAgdGhpcy5idWlsZChwYXJhbXMpO1xuICAgICAgc3VwZXIud3JhcCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGJ1aWxkXG4gICAqIEBkZXNjcmlwdGlvbiBCdWlsZCBsaWZlY3ljbGUgY3JlYXRlcyBhIG1lc2ggdXNpbmcgaW5wdXQgcGFyYW1zLlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIENvbXBvbmVudCBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJuIHtUSFJFRS5NZXNofSBCdWlsdCBtZXNoXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuRXh0cnVkZVxuICAgKi9cbiAgYnVpbGQocGFyYW1zID0gdGhpcy5wYXJhbXMpIHtcbiAgICBjb25zdCB7Z2VvbWV0cnksIG1hdGVyaWFsfSA9IHRoaXMuYXBwbHlCcmlkZ2Uoe1xuICAgICAgZ2VvbWV0cnk6IHRoaXMuYnVpbGRHZW9tZXRyeShwYXJhbXMpLFxuICAgICAgbWF0ZXJpYWw6IHBhcmFtcy5tYXRlcmlhbFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMuYXBwbHlCcmlkZ2Uoe21lc2g6IG5ldyBNZXNoKGdlb21ldHJ5LCBtYXRlcmlhbCl9KS5tZXNoO1xuICB9XG5cbiAgYnVpbGRHZW9tZXRyeShwYXJhbXMgPSB7fSkge1xuICAgIGNvbnN0IGdlb21ldHJ5ID0gbmV3IEV4dHJ1ZGVHZW9tZXRyeShcbiAgICAgIHBhcmFtcy5nZW9tZXRyeS5zaGFwZXMsXG4gICAgICBwYXJhbXMuZ2VvbWV0cnkub3B0aW9uc1xuICAgICk7XG5cbiAgICByZXR1cm4gcGFyYW1zLmJ1ZmZlciA/IG5ldyBCdWZmZXJHZW9tZXRyeSgpLmZyb21HZW9tZXRyeShnZW9tZXRyeSkgOiBnZW9tZXRyeTtcbiAgfVxufVxuXG5leHBvcnQge1xuICBFeHRydWRlXG59O1xuIiwiaW1wb3J0IHtcbiAgTWVzaCxcbiAgSWNvc2FoZWRyb25CdWZmZXJHZW9tZXRyeSxcbiAgSWNvc2FoZWRyb25HZW9tZXRyeVxufSBmcm9tICd0aHJlZSc7XG5cbmltcG9ydCB7TWVzaENvbXBvbmVudH0gZnJvbSAnLi4vLi4vY29yZS9NZXNoQ29tcG9uZW50JztcblxuLyoqXG4gKiBAY2xhc3MgSWNvc2FoZWRyb25cbiAqIEBjYXRlZ29yeSBjb21wb25lbnRzL21lc2hlc1xuICogQGRlc2NyaXB0aW9uIEluIGdlb21ldHJ5LCBhbiBpY29zYWhlZHJvbiBpcyBhIHBvbHloZWRyb24gd2l0aCAyMCBmYWNlcy48YnIvPlxuICogVGhlcmUgYXJlIG1hbnkga2luZHMgb2YgaWNvc2FoZWRyYSwgd2l0aCBzb21lIGJlaW5nIG1vcmUgc3ltbWV0cmljYWwgdGhhbiBvdGhlcnMuIFRoZSBtb3N0IHdlbGwga25vd24gaXMgdGhlIFBsYXRvbmljLCBjb252ZXggcmVndWxhciBpY29zYWhlZHJvbi48YnIvPlxuICogYEljb3NhaGVkcm9uYCBjcmVhdGVzIGFuIEljb3NhaGVkcm9uIG9iamVjdCBieSBpdHMgcmFkaXVzIGFuZCBkZXRhaWwuXG4gKiBAY2xhc3NEZXNjXG4gKiA8aWZyYW1lIHNyYz1cImh0dHBzOi8vdGhyZWVqcy5vcmcvZG9jcy9zY2VuZXMvZ2VvbWV0cnktYnJvd3Nlci5odG1sI0ljb3NhaGVkcm9uR2VvbWV0cnlcIj48L2lmcmFtZT5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zXSAtIFRoZSBwYXJhbXMuXG4gKiBAZXh0ZW5kcyBtb2R1bGU6Y29yZS5NZXNoQ29tcG9uZW50XG4gKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5DcmVhdGluZyBhIEljb3NhaGVkcm9uLCBhbmQgYWRkaW5nIHRvIGFwcDwvY2FwdGlvbj5cbiAqIG5ldyBJY29zYWhlZHJvbih7XG4gKiAgIGdlb21ldHJ5OiB7XG4gKiAgICAgcmFkaXVzOiAyLFxuICogICAgIGRldGFpbDogMVxuICogICB9LFxuICpcbiAqICAgbWF0ZXJpYWw6IG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCh7XG4gKiAgICAgY29sb3I6IDB4ZmZmZmZmXG4gKiAgIH0pLFxuICpcbiAqICAgcG9zaXRpb246IFswLCAxMDAsIDBdXG4gKiB9KS5hZGRUbyhhcHApO1xuICovXG5jbGFzcyBJY29zYWhlZHJvbiBleHRlbmRzIE1lc2hDb21wb25lbnQge1xuICAvKipcbiAgICogRGVmYXVsdCB2YWx1ZXMgZm9yIHBhcmFtZXRlcnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuSWNvc2FoZWRyb24jZGVmYXVsdHNcbiAgICogQHN0YXRpY1xuICAgKiBAZGVmYXVsdCA8cHJlPlxuICAgKiB7XG4gICAqICAgZ2VvbWV0cnk6IHtcbiAgICogICAgIHJhZGl1czogMSxcbiAgICogICAgIGRldGFpbDogMFxuICAgKiAgIH1cbiAgICogfTwvcHJlPlxuICAgKi9cbiAgc3RhdGljIGRlZmF1bHRzID0ge1xuICAgIC4uLk1lc2hDb21wb25lbnQuZGVmYXVsdHMsXG4gICAgZ2VvbWV0cnk6IHtcbiAgICAgIHJhZGl1czogMSxcbiAgICAgIGRldGFpbDogMFxuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogSW5zdHJ1Y3Rpb25zXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLkljb3NhaGVkcm9uI2luc3RydWN0aW9uc1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IHtnZW9tZXRyeTogWydyYWRpdXMnLCAnZGV0YWlsJ119XG4gICAqL1xuICBzdGF0aWMgaW5zdHJ1Y3Rpb25zID0ge1xuICAgIC4uLk1lc2hDb21wb25lbnQuaW5zdHJ1Y3Rpb25zLFxuICAgIGdlb21ldHJ5OiBbJ3JhZGl1cycsICdkZXRhaWwnXVxuICB9O1xuXG4gIGNvbnN0cnVjdG9yKHBhcmFtcyA9IHt9KSB7XG4gICAgc3VwZXIocGFyYW1zLCBJY29zYWhlZHJvbi5kZWZhdWx0cywgSWNvc2FoZWRyb24uaW5zdHJ1Y3Rpb25zKTtcblxuICAgIGlmIChwYXJhbXMuYnVpbGQpIHtcbiAgICAgIHRoaXMuYnVpbGQocGFyYW1zKTtcbiAgICAgIHN1cGVyLndyYXAoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBidWlsZFxuICAgKiBAZGVzY3JpcHRpb24gQnVpbGQgbGlmZWN5Y2xlIGNyZWF0ZXMgYSBtZXNoIHVzaW5nIGlucHV0IHBhcmFtcy5cbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBDb21wb25lbnQgcGFyYW1ldGVycy5cbiAgICogQHJldHVybiB7VEhSRUUuTWVzaH0gQnVpbHQgbWVzaFxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLkljb3NhaGVkcm9uXG4gICAqL1xuICBidWlsZChwYXJhbXMgPSB0aGlzLnBhcmFtcykge1xuICAgIGNvbnN0IHtnZW9tZXRyeSwgbWF0ZXJpYWx9ID0gdGhpcy5hcHBseUJyaWRnZSh7XG4gICAgICBnZW9tZXRyeTogdGhpcy5idWlsZEdlb21ldHJ5KHBhcmFtcyksXG4gICAgICBtYXRlcmlhbDogcGFyYW1zLm1hdGVyaWFsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5hcHBseUJyaWRnZSh7bWVzaDogbmV3IE1lc2goZ2VvbWV0cnksIG1hdGVyaWFsKX0pLm1lc2g7XG4gIH1cblxuICBidWlsZEdlb21ldHJ5KHBhcmFtcyA9IHt9KSB7XG4gICAgcmV0dXJuIG5ldyAocGFyYW1zLmJ1ZmZlciA/IEljb3NhaGVkcm9uQnVmZmVyR2VvbWV0cnkgOiBJY29zYWhlZHJvbkdlb21ldHJ5KShcbiAgICAgIHBhcmFtcy5nZW9tZXRyeS5yYWRpdXMsXG4gICAgICBwYXJhbXMuZ2VvbWV0cnkuZGV0YWlsXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQge1xuICBJY29zYWhlZHJvblxufTtcbiIsImltcG9ydCB7XG4gIE1lc2gsXG4gIExhdGhlQnVmZmVyR2VvbWV0cnksXG4gIExhdGhlR2VvbWV0cnlcbn0gZnJvbSAndGhyZWUnO1xuXG5pbXBvcnQge01lc2hDb21wb25lbnR9IGZyb20gJy4uLy4uL2NvcmUvTWVzaENvbXBvbmVudCc7XG5cbi8qKlxuICogQGNsYXNzIExhdGhlXG4gKiBAY2F0ZWdvcnkgY29tcG9uZW50cy9tZXNoZXNcbiAqIEBkZXNjcmlwdGlvbiBBIGBMYXRoZUdlb21ldHJ5YCBhbGxvd3MgeW91IHRvIGNyZWF0ZSBzaGFwZXMgZnJvbSBhIHNtb290aCBjdXJ2ZS5cbiAqIFRoaXMgY3VydmUgaXMgZGVmaW5lZCBieSBhIG51bWJlciBvZiBwb2ludHMgKGFsc28gY2FsbGVkIGtub3RzKSBhbmQgaXMgbW9zdCBvZnRlbiBjYWxsZWQgYSBzcGxpbmUuIFRoaXMgc3BsaW5lIGlzIHJvdGF0ZWQgYXJvdW5kIGEgZml4ZWQgcG9pbnQgYW5kIHJlc3VsdHMgaW4gdmFzZS0gYW5kIGJlbGwtbGlrZSBzaGFwZXMuPGJyLz48YnIvPlxuICogSW4gM0QgY29tcHV0ZXIgZ3JhcGhpY3MsIGEgbGF0aGVkIG9iamVjdCBpcyBhIDNEIG1vZGVsIHdob3NlIHZlcnRleCBnZW9tZXRyeSBpcyBwcm9kdWNlZCBieSByb3RhdGluZyB0aGUgcG9pbnRzIG9mIGEgc3BsaW5lIG9yIG90aGVyIHBvaW50IHNldCBhcm91bmQgYSBmaXhlZCBheGlzLlxuICogVGhlIGxhdGhpbmcgbWF5IGJlIHBhcnRpYWw7IHRoZSBhbW91bnQgb2Ygcm90YXRpb24gaXMgbm90IG5lY2Vzc2FyaWx5IGEgZnVsbCAzNjAgZGVncmVlcy5cbiAqIFRoZSBwb2ludCBzZXQgcHJvdmlkaW5nIHRoZSBpbml0aWFsIHNvdXJjZSBkYXRhIGNhbiBiZSB0aG91Z2h0IG9mIGFzIGEgY3Jvc3Mgc2VjdGlvbiB0aHJvdWdoIHRoZSBvYmplY3QgYWxvbmcgYSBwbGFuZSBjb250YWluaW5nIGl0cyBheGlzIG9mIHJhZGlhbCBzeW1tZXRyeS4gPGJyLz48YnIvPlxuICogVGhlIDxhIGhyZWY9J2h0dHA6Ly90aHJlZWpzLm9yZy9kb2NzL3NjZW5lcy9nZW9tZXRyeS1icm93c2VyLmh0bWwjTGF0aGVHZW9tZXRyeSc+Zm9sbG93aW5nIGV4YW1wbGU8L2E+IHNob3dzIGEgZ2VvbWV0cnkgd2hpY2ggY2FuIGJlIGdlbmVyYXRlZCB1c2luZyBgTGF0aGVgIGNsYXNzLlxuICogQGNsYXNzRGVzY1xuICogPGlmcmFtZSBzcmM9XCJodHRwczovL3RocmVlanMub3JnL2RvY3Mvc2NlbmVzL2dlb21ldHJ5LWJyb3dzZXIuaHRtbCNMYXRoZUdlb21ldHJ5XCI+PC9pZnJhbWU+XG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtc10gLSBUaGUgcGFyYW1zLlxuICogQGV4dGVuZHMgbW9kdWxlOmNvcmUuTWVzaENvbXBvbmVudFxuICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL21lc2hlc1xuICogQGV4YW1wbGUgPGNhcHRpb24+Q3JlYXRpbmcgYSBMYXRoLCBhbmQgYWRkaW5nIHRvIGFwcDwvY2FwdGlvbj5cbiAqIGNvbnN0IHBvaW50cyA9IFtdO1xuICpcbiAqIGZvciAobGV0IGkgPSAwOyBpIDwgMTA7IGkrKykge1xuICogICBwb2ludHMucHVzaChcbiAqICAgICBuZXcgVEhSRUUuVmVjdG9yMihcbiAqICAgICAgIChNYXRoLnNpbihpICogMC43KSAqIDE1ICsgNTApIC8gMTAsXG4gKiAgICAgICAoaSAtIDUpICogMC4yXG4gKiAgICAgKVxuICogICApO1xuICogfVxuICpcbiAqIGNvbnN0IGxhdGhlID0gbmV3IExhdGhlKHtcbiAqICAgZ2VvbWV0cnk6IHtcbiAqICAgICBwb2ludHM6IHBvaW50c1xuICogICB9LFxuICpcbiAqICAgbWF0ZXJpYWw6IG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCh7XG4gKiAgICAgY29sb3I6IDB4ZmZmZmZmXG4gKiAgIH0pLFxuICpcbiAqICAgcG9zaXRpb246IFswLCA1MCwgMTBdXG4gKiB9KS5hZGRUbyhhcHApO1xuICovXG5jbGFzcyBMYXRoZSBleHRlbmRzIE1lc2hDb21wb25lbnQge1xuICAvKipcbiAgICogRGVmYXVsdCB2YWx1ZXMgZm9yIHBhcmFtZXRlcnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuTGF0aGUjZGVmYXVsdHNcbiAgICogQHN0YXRpY1xuICAgKiBAZGVmYXVsdCA8cHJlPlxuICAgKiB7XG4gICAqICAgZ2VvbWV0cnk6IHtcbiAgICogICAgIHBvaW50czogW11cbiAgICogICB9XG4gICAqIH1cbiAgICogPC9wcmU+XG4gICAqL1xuICBzdGF0aWMgZGVmYXVsdHMgPSB7XG4gICAgLi4uTWVzaENvbXBvbmVudC5kZWZhdWx0cyxcbiAgICBnZW9tZXRyeToge1xuICAgICAgcG9pbnRzOiBbXVxuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogSW5zdHJ1Y3Rpb25zXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLkxhdGhlI2luc3RydWN0aW9uc1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IDxwcmU+e1xuICAgKiAgIGdlb21ldHJ5OiBbJ3BvaW50cyddXG4gICAqIH1cbiAgICogPC9wcmU+XG4gICAqL1xuICBzdGF0aWMgaW5zdHJ1Y3Rpb25zID0ge1xuICAgIC4uLk1lc2hDb21wb25lbnQuaW5zdHJ1Y3Rpb25zLFxuICAgIGdlb21ldHJ5OiBbJ3BvaW50cyddXG4gIH07XG5cbiAgY29uc3RydWN0b3IocGFyYW1zID0ge30pIHtcbiAgICBzdXBlcihwYXJhbXMsIExhdGhlLmRlZmF1bHRzLCBMYXRoZS5pbnN0cnVjdGlvbnMpO1xuXG4gICAgaWYgKHBhcmFtcy5idWlsZCkge1xuICAgICAgdGhpcy5idWlsZChwYXJhbXMpO1xuICAgICAgc3VwZXIud3JhcCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGJ1aWxkXG4gICAqIEBkZXNjcmlwdGlvbiBCdWlsZCBsaWZlY3ljbGUgY3JlYXRlcyBhIG1lc2ggdXNpbmcgaW5wdXQgcGFyYW1zLlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIENvbXBvbmVudCBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJuIHtUSFJFRS5NZXNofSBCdWlsdCBtZXNoXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuTGF0aGVcbiAgICovXG4gIGJ1aWxkKHBhcmFtcyA9IHRoaXMucGFyYW1zKSB7XG4gICAgY29uc3Qge2dlb21ldHJ5LCBtYXRlcmlhbH0gPSB0aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgIGdlb21ldHJ5OiB0aGlzLmJ1aWxkR2VvbWV0cnkocGFyYW1zKSxcbiAgICAgIG1hdGVyaWFsOiBwYXJhbXMubWF0ZXJpYWxcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmFwcGx5QnJpZGdlKHttZXNoOiBuZXcgTWVzaChnZW9tZXRyeSwgbWF0ZXJpYWwpfSkubWVzaDtcbiAgfVxuXG4gIGJ1aWxkR2VvbWV0cnkocGFyYW1zID0ge30pIHtcbiAgICByZXR1cm4gbmV3IChwYXJhbXMuYnVmZmVyID8gTGF0aGVCdWZmZXJHZW9tZXRyeSA6IExhdGhlR2VvbWV0cnkpKFxuICAgICAgcGFyYW1zLmdlb21ldHJ5LnBvaW50c1xuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IHtcbiAgTGF0aGVcbn07XG4iLCJpbXBvcnQge1xuICBMaW5lIGFzIExpbmVOYXRpdmUsXG4gIEJ1ZmZlckdlb21ldHJ5LFxuICBHZW9tZXRyeSxcbiAgQnVmZmVyQXR0cmlidXRlLFxuICBMaW5lQ3VydmUzLFxuICBWZWN0b3IzXG59IGZyb20gJ3RocmVlJztcblxuaW1wb3J0IHtNZXNoQ29tcG9uZW50fSBmcm9tICcuLi8uLi9jb3JlL01lc2hDb21wb25lbnQnO1xuXG4vKipcbiAqIEBjbGFzcyBMaW5lXG4gKiBAY2F0ZWdvcnkgY29tcG9uZW50cy9tZXNoZXNcbiAqIEBkZXNjcmlwdGlvbiBMaW5lIGNvbXBvbmVudCBpcyBnZW5lcmF0ZWQgZnJvbSBhIGN1cnZlL2xpbmUgYW5kIGFtb3VudCBvZiB2ZWN0b3JzIHRoYXQgc2hvdWxkIGJlIHVzZWQgKHBvaW50cykuXG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtc10gLSBUaGUgcGFyYW1zLlxuICogQGV4dGVuZHMgbW9kdWxlOmNvcmUuTWVzaENvbXBvbmVudFxuICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL21lc2hlc1xuICogQGV4YW1wbGUgPGNhcHRpb24+Q3JlYXRpbmcgYSBMaW5lLCBhbmQgYWRkaW5nIHRvIGFwcDwvY2FwdGlvbj5cbiAqIG5ldyBMaW5lKHtcbiAqICAgZ2VvbWV0cnk6IHtcbiAqICAgICBjdXJ2ZTogbmV3IFRIUkVFLkxpbmVDdXJ2ZTMobmV3IFRIUkVFLlZlY3RvcjMoMTAsIDEwLCAwKSwgbmV3IFRIUkVFLlZlY3RvcjMoMTAsIDMwLCAwKSlcbiAqICAgfSxcbiAqXG4gKiAgIG1hdGVyaWFsOiBuZXcgVEhSRUUuTWVzaEJhc2ljTWF0ZXJpYWwoe1xuICogICAgIGNvbG9yOiAweGZmZmZmZlxuICogICB9KVxuICogfSkuYWRkVG8oYXBwKTtcbiAqL1xuY2xhc3MgTGluZSBleHRlbmRzIE1lc2hDb21wb25lbnQge1xuICAvKipcbiAgICogRGVmYXVsdCB2YWx1ZXMgZm9yIHBhcmFtZXRlcnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuTGluZSNkZWZhdWx0c1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IDxwcmU+XG4gICAqIHtcbiAgICogICBjdXJ2ZTogbmV3IExpbmVDdXJ2ZTMobmV3IFZlY3RvcjMoMCwgMCwgMCksIG5ldyBWZWN0b3IzKDEwLCAwLCAwKSksXG4gICAqICAgcG9pbnRzOiA1MFxuICAgKiB9XG4gICAqIDwvcHJlPlxuICAgKi9cbiAgc3RhdGljIGRlZmF1bHRzID0ge1xuICAgIC4uLk1lc2hDb21wb25lbnQuZGVmYXVsdHMsXG5cbiAgICBjdXJ2ZTogbnVsbCxcbiAgICBwb2ludHM6IDUwXG4gIH07XG5cbiAgLyoqXG4gICAqIEluc3RydWN0aW9uc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5MaW5lI2luc3RydWN0aW9uc1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IDxwcmU+e1xuICAgKiAgIGdlb21ldHJ5OiBbJ2N1cnZlJywgJ3BvaW50cyddXG4gICAqIH1cbiAgICogPC9wcmU+XG4gICAqL1xuICBzdGF0aWMgaW5zdHJ1Y3Rpb25zID0ge1xuICAgIC4uLk1lc2hDb21wb25lbnQuaW5zdHJ1Y3Rpb25zLFxuICAgIGdlb21ldHJ5OiBbJ2N1cnZlJywgJ3BvaW50cyddXG4gIH07XG5cbiAgY29uc3RydWN0b3IocGFyYW1zKSB7XG4gICAgc3VwZXIocGFyYW1zLCBMaW5lLmRlZmF1bHRzLCBMaW5lLmluc3RydWN0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBidWlsZFxuICAgKiBAZGVzY3JpcHRpb24gQnVpbGQgbGlmZWN5Y2xlIGNyZWF0ZXMgYSBtZXNoIHVzaW5nIGlucHV0IHBhcmFtcy5cbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBDb21wb25lbnQgcGFyYW1ldGVycy5cbiAgICogQHJldHVybiB7VEhSRUUuTWVzaH0gQnVpbHQgbWVzaFxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLkxpbmVcbiAgICovXG4gIGJ1aWxkKHBhcmFtcyA9IHRoaXMucGFyYW1zKSB7XG4gICAgY29uc3Qge2dlb21ldHJ5LCBtYXRlcmlhbH0gPSB0aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgIGdlb21ldHJ5OiB0aGlzLmJ1aWxkR2VvbWV0cnkocGFyYW1zKSxcbiAgICAgIG1hdGVyaWFsOiBwYXJhbXMubWF0ZXJpYWxcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmFwcGx5QnJpZGdlKHttZXNoOiBuZXcgTGluZU5hdGl2ZShnZW9tZXRyeSwgbWF0ZXJpYWwpfSkubWVzaDtcbiAgfVxuXG4gIGJ1aWxkR2VvbWV0cnkocGFyYW1zID0ge30pIHtcbiAgICBjb25zdCBnZW9tZXRyeSA9IHBhcmFtcy5idWZmZXIgPyBuZXcgQnVmZmVyR2VvbWV0cnkoKSA6IG5ldyBHZW9tZXRyeSgpO1xuXG4gICAgaWYgKHBhcmFtcy5idWZmZXIpIHtcbiAgICAgIGNvbnN0IHBwID0gcGFyYW1zLmN1cnZlLmdldFBvaW50cyhwYXJhbXMucG9pbnRzKTtcbiAgICAgIGNvbnN0IHZlcnRzID0gbmV3IEZsb2F0MzJBcnJheShwcC5sZW5ndGggKiAzKTtcblxuICAgICAgZm9yIChsZXQgaSA9IDAsIG1heCA9IHBwLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGkzID0gaSAqIDM7XG5cbiAgICAgICAgdmVydHNbaTNdID0gcHBbaV0ueDtcbiAgICAgICAgdmVydHNbaTMgKyAxXSA9IHBwW2ldLnk7XG4gICAgICAgIHZlcnRzW2kzICsgMl0gPSBwcFtpXS56O1xuICAgICAgfVxuXG4gICAgICBnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoJ3Bvc2l0aW9uJywgbmV3IEJ1ZmZlckF0dHJpYnV0ZSh2ZXJ0cywgMykpO1xuICAgIH0gZWxzZSBnZW9tZXRyeS52ZXJ0aWNlcyA9IHBhcmFtcy5jdXJ2ZS5nZXRQb2ludHMocGFyYW1zLnBvaW50cyk7XG5cbiAgICByZXR1cm4gZ2VvbWV0cnk7XG4gIH1cbn1cblxuZXhwb3J0IHtcbiAgTGluZVxufTtcbiIsImltcG9ydCB7XG4gIE1lc2gsXG4gIEpTT05Mb2FkZXIsXG4gIFNraW5uZWRNZXNoXG59IGZyb20gJ3RocmVlJztcblxuaW1wb3J0IHtNZXNoQ29tcG9uZW50fSBmcm9tICcuLi8uLi9jb3JlL01lc2hDb21wb25lbnQnO1xuXG4vKipcbiAqIEBjbGFzcyBJbXBvcnRlclxuICogQGNhdGVnb3J5IGNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZGVzY3JpcHRpb24gSW1wb3J0ZXIgaXMgYSBsb2FkZXIgZm9yIG1lc2hlcyBhbmQgYW55IG90aGVyIGRhdGEgdG8geW91ciBzY2VuZVxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXNdIC0gVGhlIHBhcmFtcy5cbiAqIEBleHRlbmRzIG1vZHVsZTpjb3JlLk1lc2hDb21wb25lbnRcbiAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXNcbiAqIEBleGFtcGxlIDxjYXB0aW9uPkNyZWF0aW5nIGEgSW1wb3J0ZXIsIGFuZCBhZGRpbmcgdG8gYXBwPC9jYXB0aW9uPlxuICogbmV3IEltcG9ydGVyKHtcbiAqICAgbG9hZGVyOiBuZXcgVEhSRUUuT0JKTG9hZGVyKCksXG4gKlxuICogICBwYXJzZXIoZ2VvbWV0cnksIG1hdGVyaWFsKSB7IC8vIGRhdGEgZnJvbSBsb2FkZXJcbiAqICAgICByZXR1cm4gbmV3IFRIUkVFLk1lc2goZ2VvbWV0cnksIG1hdGVyaWFsKTsgLy8gc2hvdWxkIHJldHVybiB5b3VyIC5uYXRpdmUgKG1lc2ggaW4gdGhpcyBjYXNlKVxuICogICB9LFxuICpcbiAqICAgcG9zaXRpb246IFswLCAxMDAsIDBdXG4gKiB9KS5hZGRUbyhhcHApO1xuICovXG5jbGFzcyBJbXBvcnRlciBleHRlbmRzIE1lc2hDb21wb25lbnQge1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0IHZhbHVlcyBmb3IgcGFyYW1ldGVyc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5JbXBvcnRlciNkZWZhdWx0c1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IDxwcmU+XG4gICAqIHtcbiAgICogICB1cmw6ICcnLFxuICAgKiAgIGxvYWRlcjogbmV3IEpTT05Mb2FkZXIoKSxcbiAgICpcbiAgICogICBvbkxvYWQoKSB7fSxcbiAgICogICBvblByb2dyZXNzKCkge30sXG4gICAqICAgb25FcnJvcigpIHt9LFxuICAgKlxuICAgKiAgIHRleHR1cmVQYXRoOiBudWxsLFxuICAgKiAgIHVzZUN1c3RvbU1hdGVyaWFsOiBmYWxzZSxcbiAgICpcbiAgICogICBwYXJzZXIoZ2VvbWV0cnksIG1hdGVyaWFscykge1xuICAgKiAgICAgcmV0dXJuIG5ldyBNZXNoKGdlb21ldHJ5LCBtYXRlcmlhbHMpO1xuICAgKiAgIH1cbiAgICogfTwvcHJlPlxuICAgKi9cbiAgc3RhdGljIGRlZmF1bHRzID0ge1xuICAgIC4uLk1lc2hDb21wb25lbnQuZGVmYXVsdHMsXG5cbiAgICB1cmw6ICcnLFxuICAgIGxvYWRlcjogbmV3IEpTT05Mb2FkZXIoKSxcblxuICAgIG9uTG9hZCgpIHt9LFxuICAgIG9uUHJvZ3Jlc3MoKSB7fSxcbiAgICAvLyBUT0RPIGFkZCBvbkNvbXBsZXRlP1xuICAgIG9uRXJyb3IoKSB7fSxcblxuICAgIHRleHR1cmVQYXRoOiBudWxsLFxuICAgIHVzZUN1c3RvbU1hdGVyaWFsOiBmYWxzZSxcblxuICAgIHBhcnNlcihnZW9tZXRyeSwgbWF0ZXJpYWwpIHtcbiAgICAgIGNvbnN0IHtnZW9tZXRyeTogZ2VvbSwgbWF0ZXJpYWw6IG1hdH0gPSB0aGlzLmFwcGx5QnJpZGdlKHtnZW9tZXRyeSwgbWF0ZXJpYWx9KTtcblxuICAgICAgcmV0dXJuIHRoaXMuYXBwbHlCcmlkZ2Uoe1xuICAgICAgICBtZXNoOiBnZW9tLmJvbmVzID8gbmV3IFNraW5uZWRNZXNoKGdlb20sIG1hdCkgOiBuZXcgTWVzaChnZW9tLCBtYXQpXG4gICAgICB9KS5tZXNoO1xuICAgIH1cbiAgfTtcblxuICBzdGF0aWMgaW5zdHJ1Y3Rpb25zID0ge1xuICAgIC4uLk1lc2hDb21wb25lbnQuaW5zdHJ1Y3Rpb25zXG4gIH07XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgZmlsdGVyXG4gICAqIEBkZXNjcmlwdGlvbiBEZWZhdWx0IHZhbHVlcyBmb3IgZmlsdGVyXG4gICAqIEBzdGF0aWNcbiAgICogQHBhcmFtIHtUSFJFRS5NZXNofSBvYmplY3QgSW5zdGFuY2UgZm9yIGl0ZXJhdGluZyB0aHJvdWdoIGl0J3MgY2hpbGRyZW4uXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGZpbHRlciBGdW5jdGlvbiB3aXRoIGNoaWxkIGFzIGFyZ3VtZW50LCBzaG91bGQgcmV0dXJuIGEgYm9vbGVhbiB3aGV0aGVyIGluY2x1ZGUgdGhlIGNoaWxkIG9yIG5vdC5cbiAgICogQHJldHVybiB7VEhSRUUuTWVzaH0gb2JqZWN0IHdpdGggY2hpbGRyZW5cbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5JbXBvcnRlclxuICAgKiBAZXhhbXBsZSA8Y2FwdGlvbj5SZW1vdmluZyB1bm5lY2Vzc2FyeSBsaWdodHMgZnJvbSBjaGlsZHJlbjwvY2FwdGlvbj5cbiAgICogbmV3IEltcG9ydGVyKHtcbiAgICogICBsb2FkZXI6IG5ldyBUSFJFRS5PQkpMb2FkZXIoKSxcbiAgICpcbiAgICogICBwYXJzZShncm91cCkgeyAvLyBkYXRhIGZyb20gbG9hZGVyXG4gICAqICAgICByZXR1cm4gSW1wb3J0ZXIuZmlsdGVyKGdyb3VwLCBjaGlsZCA9PiAhY2hpbGQuaXNMaWdodCk7IC8vIHJlbW92ZSBsaWdodHNcbiAgICogICB9LFxuICAgKlxuICAgKiAgIHBvc2l0aW9uOiBbMCwgMTAwLCAwXVxuICAgKiB9KS5hZGRUbyhhcHApO1xuICAgKi9cbiAgc3RhdGljIGZpbHRlcihvYmplY3QsIGZpbHRlcikge1xuICAgIGNvbnN0IHByb2Nlc3NGaWx0ZXIgPSBvYmplY3QgPT4ge1xuICAgICAgb2JqZWN0LmNoaWxkcmVuLmZvckVhY2goKGVsLCBpbmRleCkgPT4ge1xuICAgICAgICBpZiAoZWwuY2hpbGRyZW4pIHByb2Nlc3NGaWx0ZXIoZWwpO1xuICAgICAgICBpZiAoIWZpbHRlcihlbCkpIG9iamVjdC5jaGlsZHJlbi5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBvYmplY3Q7XG4gICAgfTtcblxuICAgIHJldHVybiBwcm9jZXNzRmlsdGVyKG9iamVjdCk7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihwYXJhbXMgPSB7fSkge1xuICAgIHN1cGVyKHBhcmFtcywgSW1wb3J0ZXIuZGVmYXVsdHMsIEltcG9ydGVyLmluc3RydWN0aW9ucywgZmFsc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgYnVpbGRcbiAgICogQGRlc2NyaXB0aW9uIEJ1aWxkIGxpZmVjeWNsZSBjcmVhdGVzIGEgbWVzaCB1c2luZyBpbnB1dCBwYXJhbXMuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgQ29tcG9uZW50IHBhcmFtZXRlcnMuXG4gICAqIEByZXR1cm4ge1RIUkVFLk1lc2h9IEJ1aWx0IG1lc2hcbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5JbXBvcnRlclxuICAgKi9cbiAgYnVpbGQocGFyYW1zID0ge30pIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICBpZiAocGFyYW1zLnRleHR1cmVQYXRoKSBwYXJhbXMubG9hZGVyLnNldFRleHR1cmVQYXRoKHBhcmFtcy50ZXh0dXJlUGF0aCk7XG5cbiAgICAgIHBhcmFtcy5sb2FkZXIubG9hZChwYXJhbXMudXJsLCAoLi4uZGF0YSkgPT4geyAvLyBnZW9tZXRyeSwgbWF0ZXJpYWxzXG4gICAgICAgIHBhcmFtcy5vbkxvYWQoLi4uZGF0YSk7XG5cbiAgICAgICAgY29uc3Qgb2JqZWN0ID0gcGFyYW1zLnBhcnNlci5hcHBseSh0aGlzLCBkYXRhKTtcbiAgICAgICAgaWYgKHBhcmFtcy5tYXRlcmlhbCkgb2JqZWN0Lm1hdGVyaWFsID0gdGhpcy5hcHBseUJyaWRnZSh7bWF0ZXJpYWw6IHBhcmFtcy5tYXRlcmlhbH0pLm1hdGVyaWFsO1xuXG4gICAgICAgIHJlc29sdmUob2JqZWN0KTtcbiAgICAgIH0sIHBhcmFtcy5vblByb2dyZXNzLCBwYXJhbXMub25FcnJvcik7XG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IHtcbiAgSW1wb3J0ZXJcbn07XG4iLCJpbXBvcnQge1xuICBNZXNoLFxuICBPY3RhaGVkcm9uQnVmZmVyR2VvbWV0cnksXG4gIE9jdGFoZWRyb25HZW9tZXRyeVxufSBmcm9tICd0aHJlZSc7XG5cbmltcG9ydCB7TWVzaENvbXBvbmVudH0gZnJvbSAnLi4vLi4vY29yZS9NZXNoQ29tcG9uZW50JztcblxuLyoqXG4gKiBAY2xhc3MgT2N0YWhlZHJvblxuICogQGNhdGVnb3J5IGNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZGVzY3JpcHRpb24gSW4gZ2VvbWV0cnksIGFuIG9jdGFoZWRyb24gaXMgYSBwb2x5aGVkcm9uIHdpdGggZWlnaHQgZmFjZXMuXG4gKiBBIHJlZ3VsYXIgb2N0YWhlZHJvbiBpcyBhIFBsYXRvbmljIHNvbGlkIGNvbXBvc2VkIG9mIGVpZ2h0IGVxdWlsYXRlcmFsIHRyaWFuZ2xlcywgZm91ciBvZiB3aGljaCBtZWV0IGF0IGVhY2ggdmVydGV4LlxuICogPGJyLz48YnIvPlxuICogYE9jdGFoZWRyb25gIGNyZWF0ZXMgYW4gT2N0YWhlZHJvbiBvYmplY3QgYnkgaXRzIGByYWRpdXNgIGFuZCBgZGV0YWlsYC5cbiAqIEBjbGFzc0Rlc2NcbiAqIDxpZnJhbWUgc3JjPVwiaHR0cHM6Ly90aHJlZWpzLm9yZy9kb2NzL3NjZW5lcy9nZW9tZXRyeS1icm93c2VyLmh0bWwjT2N0YWhlZHJvbkdlb21ldHJ5XCI+PC9pZnJhbWU+XG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtc10gLSBUaGUgcGFyYW1zLlxuICogQGV4dGVuZHMgbW9kdWxlOmNvcmUuTWVzaENvbXBvbmVudFxuICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL21lc2hlc1xuICogQGV4YW1wbGUgPGNhcHRpb24+Q3JlYXRpbmcgYW4gT2N0YWhlZHJvbiwgYW5kIGFkZGluZyB0byBhcHA8L2NhcHRpb24+XG4gKiBuZXcgT2N0YWhlZHJvbih7XG4gKiAgIGdlb21ldHJ5OiB7XG4gKiAgICAgcmFkaXVzOiAyLFxuICogICAgIGRldGFpbDogMVxuICogICB9LFxuICpcbiAqICAgbWF0ZXJpYWw6IG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCh7XG4gKiAgICAgY29sb3I6IDB4ZmZmZmZmXG4gKiAgIH0pLFxuICpcbiAqICAgcG9zaXRpb246IFswLCAxMDAsIDBdXG4gKiB9KS5hZGRUbyhhcHApO1xuICovXG5jbGFzcyBPY3RhaGVkcm9uIGV4dGVuZHMgTWVzaENvbXBvbmVudCB7XG4gIC8qKlxuICAgKiBEZWZhdWx0IHZhbHVlcyBmb3IgcGFyYW1ldGVyc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5PY3RhaGVkcm9uI2RlZmF1bHRzXG4gICAqIEBzdGF0aWNcbiAgICogQGRlZmF1bHQgPHByZT5cbiAgICoge1xuICAgKiAgIGdlb21ldHJ5OiB7XG4gICAqICAgICByYWRpdXM6IDEsXG4gICAqICAgICBkZXRhaWw6IDBcbiAgICogICB9XG4gICAqIH1cbiAgICogPC9wcmU+XG4gICAqL1xuICBzdGF0aWMgZGVmYXVsdHMgPSB7XG4gICAgLi4uTWVzaENvbXBvbmVudC5kZWZhdWx0cyxcbiAgICBnZW9tZXRyeToge1xuICAgICAgcmFkaXVzOiAxLFxuICAgICAgZGV0YWlsOiAwXG4gICAgfVxuICB9XG5cbiAgY29uc3RydWN0b3IocGFyYW1zID0ge30pIHtcbiAgICBzdXBlcihwYXJhbXMsIE9jdGFoZWRyb24uZGVmYXVsdHMsIE9jdGFoZWRyb24uaW5zdHJ1Y3Rpb25zKTtcblxuICAgIGlmIChwYXJhbXMuYnVpbGQpIHtcbiAgICAgIHRoaXMuYnVpbGQocGFyYW1zKTtcbiAgICAgIHN1cGVyLndyYXAoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBidWlsZFxuICAgKiBAZGVzY3JpcHRpb24gQnVpbGQgbGlmZWN5Y2xlIGNyZWF0ZXMgYSBtZXNoIHVzaW5nIGlucHV0IHBhcmFtcy5cbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBDb21wb25lbnQgcGFyYW1ldGVycy5cbiAgICogQHJldHVybiB7VEhSRUUuTWVzaH0gQnVpbHQgbWVzaFxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLk9jdGFoZWRyb25cbiAgICovXG4gIGJ1aWxkKHBhcmFtcyA9IHRoaXMucGFyYW1zKSB7XG4gICAgY29uc3Qge2dlb21ldHJ5LCBtYXRlcmlhbH0gPSB0aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgIGdlb21ldHJ5OiB0aGlzLmJ1aWxkR2VvbWV0cnkocGFyYW1zKSxcbiAgICAgIG1hdGVyaWFsOiBwYXJhbXMubWF0ZXJpYWxcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmFwcGx5QnJpZGdlKHttZXNoOiBuZXcgTWVzaChnZW9tZXRyeSwgbWF0ZXJpYWwpfSkubWVzaDtcbiAgfVxuXG4gIGJ1aWxkR2VvbWV0cnkocGFyYW1zID0ge30pIHtcbiAgICByZXR1cm4gbmV3IChwYXJhbXMuYnVmZmVyID8gT2N0YWhlZHJvbkJ1ZmZlckdlb21ldHJ5IDogT2N0YWhlZHJvbkdlb21ldHJ5KShcbiAgICAgIHBhcmFtcy5nZW9tZXRyeS5yYWRpdXMsXG4gICAgICBwYXJhbXMuZ2VvbWV0cnkuZGV0YWlsXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQge1xuICBPY3RhaGVkcm9uXG59O1xuIiwiaW1wb3J0IHtcbiAgTWVzaCxcbiAgUGFyYW1ldHJpY0J1ZmZlckdlb21ldHJ5LFxuICBQYXJhbWV0cmljR2VvbWV0cnksXG4gIFZlY3RvcjNcbn0gZnJvbSAndGhyZWUnO1xuXG5pbXBvcnQge01lc2hDb21wb25lbnR9IGZyb20gJy4uLy4uL2NvcmUvTWVzaENvbXBvbmVudCc7XG5cbi8qKlxuICogQGNsYXNzIFBhcmFtZXRyaWNcbiAqIEBjYXRlZ29yeSBjb21wb25lbnRzL21lc2hlc1xuICogQGRlc2NyaXB0aW9uIGBQYXJhbWV0cmljYCBnZW5lcmF0ZXMgYSBnZW9tZXRyeSByZXByZXNlbnRpbmcgYSA8YSBocmVmPSdodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9QYXJhbWV0cmljX3N1cmZhY2UnPlBhcmFtZXRyaWMgc3VyZmFjZTwvYT5cbiAqIDxici8+PGJyLz5cbiAqIEl0IGlzIHVzdWFsbHkgdXNlZCB0byBkZXZlbG9wIGRpZmZlcmVudCBraW5kcyBvZiBoaWdoZmllbGRzIG9yIHZpc3VhbGl6ZSBhIDxhIGhyZWY9J2h0dHBzOi8vc3RlbWtvc2tpLmdpdGh1Yi5pby9UaHJlZS5qcy9HcmFwaHVsdXMtRnVuY3Rpb24uaHRtbCc+bWF0aCBmdW5jdGlvbjwvYT4uXG4gKiA8YnIvPlxuICogLSA8YSBocmVmPSdodHRwOi8vbWF0aC5od3MuZWR1L2dyYXBoaWNzYm9vay9zb3VyY2UvdGhyZWVqcy9jdXJ2ZXMtYW5kLXN1cmZhY2VzLmh0bWwnPlBhcmFtZXRyaWMgc3VyZmFjZTwvYT5cbiAqIC0gPGEgaHJlZj0naHR0cHM6Ly9zdGVta29za2kuZ2l0aHViLmlvL1RocmVlLmpzL0dyYXBodWx1cy1TdXJmYWNlLmh0bWwnPlwiR3JhcGh1bHVzXCI8L2E+XG4gKiA8YnIvPjxici8+XG4gKiBAY2xhc3NEZXNjXG4gKiA8aWZyYW1lIHNyYz1cImh0dHBzOi8vdGhyZWVqcy5vcmcvZG9jcy9zY2VuZXMvZ2VvbWV0cnktYnJvd3Nlci5odG1sI1BhcmFtZXRyaWNHZW9tZXRyeVwiPjwvaWZyYW1lPlxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXNdIC0gVGhlIHBhcmFtcy5cbiAqIEBleHRlbmRzIG1vZHVsZTpjb3JlLk1lc2hDb21wb25lbnRcbiAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXNcbiAqIEBleGFtcGxlIDxjYXB0aW9uPkV4YW1wbGUgY3JlYXRpbmcgYW4gaGVpZ2h0ZmllbGQtbGlrZSBnZW9tZXRyeS4gYHVgIGFuZCBgdmAgYXJlIGxpa2UgYHhgIGFuZCBgeWAgaW4gc2hhcGUsIGJ1dCB0aGVpciB2YWx1ZXMgYXJlIGFsd2F5cyBmcm9tIGAwYCB0byBgMWAuXG4gKiBXZSB1c2UgdGhlbSBpbiBgVEhSRUUuVmVjdG9yM2AgbGlrZSBgeGAgYW5kIGB6YCBhbmQgYE1hdGgucmFuZG9tKCkgKiA1YCBmb3IgYHlgLjwvY2FwdGlvbj5cbiAqIGNvbnN0IGNyZWF0ZVBhcmFtZXRyaWMgPSAodSwgdikgPT4ge1xuICogICByZXR1cm4gbmV3IFRIUkVFLlZlY3RvcjModSAqIDMwLCBNYXRoLnJhbmRvbSgpICogNSwgdiAqIDMwKTtcbiAqIH1cbiAqXG4gKiBuZXcgUGFyYW1ldHJpYyh7XG4gKiAgIGdlb21ldHJ5OiB7XG4gKiAgICAgZnVuYzogY3JlYXRlUGFyYW1ldHJpY1xuICogICB9LFxuICpcbiAqICAgbWF0ZXJpYWw6IG5ldyBUSFJFRS5NZXNoTGFtYmVydE1hdGVyaWFsKHtcbiAqICAgICBjb2xvcjogMHhmZmZmZmYsXG4gKiAgICAgc2lkZTogVEhSRUUuRG91YmxlU2lkZVxuICogICB9KSxcbiAqXG4gKiAgIHBvc2l0aW9uOiBbMCwgMTAwLCAtMTAwXVxuICogfSkuYWRkVG8oYXBwKTtcbiAqL1xuY2xhc3MgUGFyYW1ldHJpYyBleHRlbmRzIE1lc2hDb21wb25lbnQge1xuICAvKipcbiAgICogRGVmYXVsdCB2YWx1ZXMgZm9yIHBhcmFtZXRlcnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuUGFyYW1ldHJpYyNkZWZhdWx0c1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IDxwcmU+XG4gICAqIHtcbiAgICogICBnZW9tZXRyeToge1xuICAgKiAgICAgZnVuYzogKHUsIHYpID0+IG5ldyBWZWN0b3IzKHUsIHYsIDApLFxuICAgKiAgICAgc2xpY2VzOiAxMCxcbiAgICogICAgIHRhY2tzOiAxMFxuICAgKiAgIH1cbiAgICogfVxuICAgKiA8L3ByZT5cbiAgICovXG4gIHN0YXRpYyBkZWZhdWx0cyA9IHtcbiAgICAuLi5NZXNoQ29tcG9uZW50LmRlZmF1bHRzLFxuICAgIGdlb21ldHJ5OiB7XG4gICAgICBmdW5jOiAodSwgdikgPT4gbmV3IFZlY3RvcjModSwgdiwgMCksXG4gICAgICBzbGljZXM6IDEwLFxuICAgICAgc3RhY2tzOiAxMFxuICAgIH1cbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHBhcmFtcyA9IHt9KSB7XG4gICAgc3VwZXIocGFyYW1zLCBQYXJhbWV0cmljLmRlZmF1bHRzLCBQYXJhbWV0cmljLmluc3RydWN0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBidWlsZFxuICAgKiBAZGVzY3JpcHRpb24gQnVpbGQgbGlmZWN5Y2xlIGNyZWF0ZXMgYSBtZXNoIHVzaW5nIGlucHV0IHBhcmFtcy5cbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBDb21wb25lbnQgcGFyYW1ldGVycy5cbiAgICogQHJldHVybiB7VEhSRUUuTWVzaH0gQnVpbHQgbWVzaFxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLlBhcmFtZXRyaWNcbiAgICovXG4gIGJ1aWxkKHBhcmFtcyA9IHRoaXMucGFyYW1zKSB7XG4gICAgY29uc3Qge2dlb21ldHJ5LCBtYXRlcmlhbH0gPSB0aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgIGdlb21ldHJ5OiB0aGlzLmJ1aWxkR2VvbWV0cnkocGFyYW1zKSxcbiAgICAgIG1hdGVyaWFsOiBwYXJhbXMubWF0ZXJpYWxcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmFwcGx5QnJpZGdlKHttZXNoOiBuZXcgTWVzaChnZW9tZXRyeSwgbWF0ZXJpYWwpfSkubWVzaDtcbiAgfVxuXG4gIGJ1aWxkR2VvbWV0cnkocGFyYW1zID0ge30pIHtcbiAgICByZXR1cm4gbmV3IChwYXJhbXMuYnVmZmVyID8gUGFyYW1ldHJpY0J1ZmZlckdlb21ldHJ5IDogUGFyYW1ldHJpY0dlb21ldHJ5KShcbiAgICAgIHBhcmFtcy5nZW9tZXRyeS5mdW5jLFxuICAgICAgcGFyYW1zLmdlb21ldHJ5LnNsaWNlcyxcbiAgICAgIHBhcmFtcy5nZW9tZXRyeS5zdGFja3NcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCB7XG4gIFBhcmFtZXRyaWNcbn07XG4iLCJpbXBvcnQge1xuICBNZXNoLFxuICBQbGFuZUJ1ZmZlckdlb21ldHJ5LFxuICBQbGFuZUdlb21ldHJ5XG59IGZyb20gJ3RocmVlJztcblxuaW1wb3J0IHtNZXNoQ29tcG9uZW50fSBmcm9tICcuLi8uLi9jb3JlL01lc2hDb21wb25lbnQnO1xuXG4vKipcbiAqIEBjbGFzcyBQbGFuZVxuICogQGNhdGVnb3J5IGNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZGVzY3JpcHRpb24gYFBsYW5lYCBpcyB1c2VkIGZvciBjcmVhdGluZyBwbGFuZXMgZ2l2ZW4gc29tZSBgd2lkdGhgIGFuZCBgaGVpZ2h0YC5cbiAqIEBjbGFzc0Rlc2NcbiAqIDxpZnJhbWUgc3JjPVwiaHR0cHM6Ly90aHJlZWpzLm9yZy9kb2NzL3NjZW5lcy9nZW9tZXRyeS1icm93c2VyLmh0bWwjUGxhbmVHZW9tZXRyeVwiPjwvaWZyYW1lPlxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXNdIC0gVGhlIHBhcmFtcy5cbiAqIEBleHRlbmRzIG1vZHVsZTpjb3JlLk1lc2hDb21wb25lbnRcbiAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXNcbiAqIEBleGFtcGxlIDxjYXB0aW9uPkNyZWF0aW5nIGEgUGxhbmUsIGFuZCBhZGRpbmcgdG8gYXBwPC9jYXB0aW9uPlxuICogbmV3IFBsYW5lKHtcbiAqICAgZ2VvbWV0cnk6IHtcbiAqICAgICB3aWR0aDogMjAsXG4gKiAgICAgaGVpZ2h0OiAzMFxuICogICB9LFxuICpcbiAqICAgbWF0ZXJpYWw6IG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCh7XG4gKiAgICAgY29sb3I6IDB4ZmZmZmZmXG4gKiAgIH0pXG4gKiB9KS5hZGRUbyhhcHApO1xuICovXG5jbGFzcyBQbGFuZSBleHRlbmRzIE1lc2hDb21wb25lbnQge1xuICAvKipcbiAgICogRGVmYXVsdCB2YWx1ZXMgZm9yIHBhcmFtZXRlcnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuUGxhbmUjZGVmYXVsdHNcbiAgICogQHN0YXRpY1xuICAgKiBAZGVmYXVsdCA8cHJlPlxuICAgKiB7XG4gICAqICAgZ2VvbWV0cnk6IHtcbiAgICogICAgIHdpZHRoOiAxMCxcbiAgICogICAgIGhlaWdodDogMTAsXG4gICAqICAgICB3U2VnbWVudHM6IDEsXG4gICAqICAgICBoU2VnbWVudHM6IDFcbiAgICogICB9XG4gICAqIH1cbiAgICogPC9wcmU+XG4gICAqL1xuICBzdGF0aWMgZGVmYXVsdHMgPSB7XG4gICAgLi4uTWVzaENvbXBvbmVudC5kZWZhdWx0cyxcbiAgICBnZW9tZXRyeToge1xuICAgICAgd2lkdGg6IDEwLFxuICAgICAgaGVpZ2h0OiAxMCxcbiAgICAgIHdTZWdtZW50czogMSxcbiAgICAgIGhTZWdtZW50czogMVxuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogSW5zdHJ1Y3Rpb25zXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLlBsYW5lI2luc3RydWN0aW9uc1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IDxwcmU+XG4gICAqIHtcbiAgICogICBnZW9tZXRyeTogWyd3aWR0aCcsICdoZWlnaHQnLCAnd1NlZ21lbnRzJywgJ2hTZWdtZW50cyddXG4gICAqIH1cbiAgICogPC9wcmU+XG4gICAqL1xuICBzdGF0aWMgaW5zdHJ1Y3Rpb25zID0ge1xuICAgIC4uLk1lc2hDb21wb25lbnQuaW5zdHJ1Y3Rpb25zLFxuICAgIGdlb21ldHJ5OiBbJ3dpZHRoJywgJ2hlaWdodCcsICd3U2VnbWVudHMnLCAnaFNlZ21lbnRzJ11cbiAgfTtcblxuICBjb25zdHJ1Y3RvcihwYXJhbXMgPSB7fSkge1xuICAgIHN1cGVyKHBhcmFtcywgUGxhbmUuZGVmYXVsdHMsIFBsYW5lLmluc3RydWN0aW9ucyk7XG5cbiAgICBpZiAocGFyYW1zLmJ1aWxkKSB7XG4gICAgICB0aGlzLmJ1aWxkKHBhcmFtcyk7XG4gICAgICBzdXBlci53cmFwKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgYnVpbGRcbiAgICogQGRlc2NyaXB0aW9uIEJ1aWxkIGxpZmVjeWNsZSBjcmVhdGVzIGEgbWVzaCB1c2luZyBpbnB1dCBwYXJhbXMuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgQ29tcG9uZW50IHBhcmFtZXRlcnMuXG4gICAqIEByZXR1cm4ge1RIUkVFLk1lc2h9IEJ1aWx0IG1lc2hcbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5QbGFuZVxuICAgKi9cbiAgYnVpbGQocGFyYW1zID0gdGhpcy5wYXJhbXMpIHtcbiAgICBjb25zdCB7Z2VvbWV0cnksIG1hdGVyaWFsfSA9IHRoaXMuYXBwbHlCcmlkZ2Uoe1xuICAgICAgZ2VvbWV0cnk6IHRoaXMuYnVpbGRHZW9tZXRyeShwYXJhbXMpLFxuICAgICAgbWF0ZXJpYWw6IHBhcmFtcy5tYXRlcmlhbFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMuYXBwbHlCcmlkZ2Uoe21lc2g6IG5ldyBNZXNoKGdlb21ldHJ5LCBtYXRlcmlhbCl9KS5tZXNoO1xuICB9XG5cbiAgYnVpbGRHZW9tZXRyeShwYXJhbXMgPSB7fSkge1xuICAgIGNvbnN0IGdlb21ldHJ5ID0gbmV3IChwYXJhbXMuYnVmZmVyID8gUGxhbmVCdWZmZXJHZW9tZXRyeSA6IFBsYW5lR2VvbWV0cnkpKFxuICAgICAgcGFyYW1zLmdlb21ldHJ5LndpZHRoLFxuICAgICAgcGFyYW1zLmdlb21ldHJ5LmhlaWdodCxcbiAgICAgIHBhcmFtcy5nZW9tZXRyeS53U2VnbWVudHMsXG4gICAgICBwYXJhbXMuZ2VvbWV0cnkuaFNlZ21lbnRzXG4gICAgKTtcblxuICAgIHJldHVybiBnZW9tZXRyeTtcbiAgfVxufVxuXG5leHBvcnQge1xuICBQbGFuZVxufTtcbiIsImltcG9ydCB7XG4gIE1lc2gsXG4gIFBvbHloZWRyb25CdWZmZXJHZW9tZXRyeSxcbiAgUG9seWhlZHJvbkdlb21ldHJ5XG59IGZyb20gJ3RocmVlJztcblxuaW1wb3J0IHtNZXNoQ29tcG9uZW50fSBmcm9tICcuLi8uLi9jb3JlL01lc2hDb21wb25lbnQnO1xuXG5jb25zdCBbdmVydGljZXNPZkN1YmUsIGluZGljZXNPZkZhY2VzXSA9IFtcbiAgW1xuICAgIC0xLCAtMSwgLTEsIDEsIC0xLCAtMSwgMSwgMSwgLTEsIC0xLCAxLCAtMSxcbiAgICAtMSwgLTEsIDEsIDEsIC0xLCAxLCAxLCAxLCAxLCAtMSwgMSwgMVxuICBdLFxuICBbXG4gICAgMiwgMSwgMCwgMCwgMywgMixcbiAgICAwLCA0LCA3LCA3LCAzLCAwLFxuICAgIDAsIDEsIDUsIDUsIDQsIDAsXG4gICAgMSwgMiwgNiwgNiwgNSwgMSxcbiAgICAyLCAzLCA3LCA3LCA2LCAyLFxuICAgIDQsIDUsIDYsIDYsIDcsIDRcbiAgXVxuXTtcblxuLyoqXG4gKiBAY2xhc3MgUG9seWhlZHJvblxuICogQGNhdGVnb3J5IGNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZGVzY3JpcHRpb24gSW4gZWxlbWVudGFyeSBnZW9tZXRyeSwgYSBwb2x5aGVkcm9uIGlzIGEgc29saWQgaW4gdGhyZWUgZGltZW5zaW9ucyB3aXRoIGZsYXQgcG9seWdvbmFsIGZhY2VzLCBzdHJhaWdodCBlZGdlcyBhbmQgc2hhcnAgY29ybmVycyBvciB2ZXJ0aWNlcy5cbiAqIDxici8+PGJyLz5cbiAqIGBQb2x5aGVkcm9uYCBjcmVhdGVzIGEgUG9seWhlZHJvbiBieSBpdHMgYHJhZGl1c2AgYW5kIGBkZXRhaWxgLlxuICogPGJyLz48YnIvPlxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXNdIC0gVGhlIHBhcmFtcy5cbiAqIEBleHRlbmRzIG1vZHVsZTpjb3JlLk1lc2hDb21wb25lbnRcbiAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXNcbiAqIEBleGFtcGxlIDxjYXB0aW9uPkNyZWF0aW5nIGFuIFBvbHloZWRyb24sIGFuZCBhZGRpbmcgdG8gYXBwPC9jYXB0aW9uPlxuICogbmV3IFBvbHloZWRyb24oe1xuICogICBnZW9tZXRyeToge1xuICogICAgIHJhZGl1czogMixcbiAqICAgICBkZXRhaWw6IDFcbiAqICAgfSxcbiAqXG4gKiAgIG1hdGVyaWFsOiBuZXcgVEhSRUUuTWVzaEJhc2ljTWF0ZXJpYWwoe1xuICogICAgIGNvbG9yOiAweGZmZmZmZlxuICogICB9KSxcbiAqXG4gKiAgIHBvc2l0aW9uOiBbMCwgMTAwLCAwXVxuICogfSkuYWRkVG8oYXBwKTtcbiAqL1xuY2xhc3MgUG9seWhlZHJvbiBleHRlbmRzIE1lc2hDb21wb25lbnQge1xuICBzdGF0aWMgdmVydGljZXNPZkN1YmUgPSB2ZXJ0aWNlc09mQ3ViZTtcbiAgc3RhdGljIGluZGljZXNPZkZhY2VzID0gaW5kaWNlc09mRmFjZXM7XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgdmFsdWVzIGZvciBwYXJhbWV0ZXJzXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLlBvbHloZWRyb24jZGVmYXVsdHNcbiAgICogQHN0YXRpY1xuICAgKiBAZGVmYXVsdCA8cHJlPlxuICAgKiB7XG4gICAqICAgZ2VvbWV0cnk6IHtcbiAgICogICAgIHZlcnRpY2VzT2ZDdWJlOiBbXG4gICAqICAgICAgIC0xLCAtMSwgLTEsIDEsIC0xLCAtMSwgMSwgMSwgLTEsIC0xLCAxLCAtMSxcbiAgICogICAgICAgLTEsIC0xLCAxLCAxLCAtMSwgMSwgMSwgMSwgMSwgLTEsIDEsIDFcbiAgICogICAgIF0sXG4gICAqXG4gICAqICAgICBpbmRpY2VzT2ZGYWNlczogW1xuICAgKiAgICAgICAyLCAxLCAwLCAwLCAzLCAyLFxuICAgKiAgICAgICAwLCA0LCA3LCA3LCAzLCAwLFxuICAgKiAgICAgICAwLCAxLCA1LCA1LCA0LCAwLFxuICAgKiAgICAgICAxLCAyLCA2LCA2LCA1LCAxLFxuICAgKiAgICAgICAyLCAzLCA3LCA3LCA2LCAyLFxuICAgKiAgICAgICA0LCA1LCA2LCA2LCA3LCA0XG4gICAqICAgICBdLFxuICAgKlxuICAgKiAgICAgcmFkaXVzOiA2LFxuICAgKiAgICAgZGV0YWlsOiAyXG4gICAqICAgfVxuICAgKiB9XG4gICAqIDwvcHJlPlxuICAgKi9cbiAgc3RhdGljIGRlZmF1bHRzID0ge1xuICAgIC4uLk1lc2hDb21wb25lbnQuZGVmYXVsdHMsXG4gICAgZ2VvbWV0cnk6IHtcbiAgICAgIHZlcnRpY2VzT2ZDdWJlLFxuICAgICAgaW5kaWNlc09mRmFjZXMsXG4gICAgICByYWRpdXM6IDYsXG4gICAgICBkZXRhaWw6IDJcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEluc3RydWN0aW9uc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5Qb2x5aGVkcm9uI2luc3RydWN0aW9uc1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IDxwcmU+XG4gICAqIHtcbiAgICogICBnZW9tZXRyeTogWyd2ZXJ0aWNlc09mQ3ViZScsICdpbmRpY2VzT2ZGYWNlcycsICdyYWRpdXMnLCAnZGV0YWlsJ11cbiAgICogfVxuICAgKiA8L3ByZT5cbiAgICovXG4gIHN0YXRpYyBpbnN0cnVjdGlvbnMgPSB7XG4gICAgLi4uTWVzaENvbXBvbmVudC5pbnN0cnVjdGlvbnMsXG4gICAgZ2VvbWV0cnk6IFsndmVydGljZXNPZkN1YmUnLCAnaW5kaWNlc09mRmFjZXMnLCAncmFkaXVzJywgJ2RldGFpbCddXG4gIH07XG5cbiAgY29uc3RydWN0b3IocGFyYW1zID0ge30pIHtcbiAgICBzdXBlcihwYXJhbXMsIFBvbHloZWRyb24uZGVmYXVsdHMsIFBvbHloZWRyb24uaW5zdHJ1Y3Rpb25zKTtcblxuICAgIGlmIChwYXJhbXMuYnVpbGQpIHtcbiAgICAgIHRoaXMuYnVpbGQocGFyYW1zKTtcbiAgICAgIHN1cGVyLndyYXAoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBidWlsZFxuICAgKiBAZGVzY3JpcHRpb24gQnVpbGQgbGlmZWN5Y2xlIGNyZWF0ZXMgYSBtZXNoIHVzaW5nIGlucHV0IHBhcmFtcy5cbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBDb21wb25lbnQgcGFyYW1ldGVycy5cbiAgICogQHJldHVybiB7VEhSRUUuTWVzaH0gQnVpbHQgbWVzaFxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLlBvbHloZWRyb25cbiAgICovXG4gIGJ1aWxkKHBhcmFtcyA9IHRoaXMucGFyYW1zKSB7XG4gICAgY29uc3Qge2dlb21ldHJ5LCBtYXRlcmlhbH0gPSB0aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgIGdlb21ldHJ5OiB0aGlzLmJ1aWxkR2VvbWV0cnkocGFyYW1zKSxcbiAgICAgIG1hdGVyaWFsOiBwYXJhbXMubWF0ZXJpYWxcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmFwcGx5QnJpZGdlKHttZXNoOiBuZXcgTWVzaChnZW9tZXRyeSwgbWF0ZXJpYWwpfSkubWVzaDtcbiAgfVxuXG4gIGJ1aWxkR2VvbWV0cnkocGFyYW1zID0ge30pIHtcbiAgICByZXR1cm4gbmV3IChwYXJhbXMuYnVmZmVyID8gUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5IDogUG9seWhlZHJvbkdlb21ldHJ5KShcbiAgICAgIHBhcmFtcy5nZW9tZXRyeS52ZXJ0aWNlc09mQ3ViZSxcbiAgICAgIHBhcmFtcy5nZW9tZXRyeS5pbmRpY2VzT2ZGYWNlcyxcbiAgICAgIHBhcmFtcy5nZW9tZXRyeS5yYWRpdXMsXG4gICAgICBwYXJhbXMuZ2VvbWV0cnkuZGV0YWlsXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQge1xuICBQb2x5aGVkcm9uXG59O1xuIiwiaW1wb3J0IHtcbiAgTWVzaCxcbiAgUmluZ0dlb21ldHJ5LFxuICBSaW5nQnVmZmVyR2VvbWV0cnlcbn0gZnJvbSAndGhyZWUnO1xuXG5pbXBvcnQge01lc2hDb21wb25lbnR9IGZyb20gJy4uLy4uL2NvcmUvTWVzaENvbXBvbmVudCc7XG5cbi8qKlxuICogQGNsYXNzIFJpbmdcbiAqIEBjYXRlZ29yeSBjb21wb25lbnRzL21lc2hlc1xuICogQGRlc2NyaXB0aW9uIFJpbmcgY2xhc3MgY3JlYXRlcyBhIGNpcmNsZSBvciBqdXN0IDJEIFRvcnVzLiBEb2VzIG5vdCBzdXBwb3J0IHBoeXNpY3MuXG4gKiBAY2xhc3NEZXNjXG4gKiA8aWZyYW1lIHNyYz1cImh0dHBzOi8vdGhyZWVqcy5vcmcvZG9jcy9zY2VuZXMvZ2VvbWV0cnktYnJvd3Nlci5odG1sI1JpbmdHZW9tZXRyeVwiPjwvaWZyYW1lPlxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXNdIC0gVGhlIHBhcmFtcy5cbiAqIEBleHRlbmRzIG1vZHVsZTpjb3JlLk1lc2hDb21wb25lbnRcbiAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXNcbiAqIEBleGFtcGxlIDxjYXB0aW9uPkNyZWF0aW5nIGEgUmluZywgYW5kIGFkZGluZyB0byBhcHA8L2NhcHRpb24+XG4gKiBuZXcgUmluZyh7XG4gKiAgIGdlb21ldHJ5OiB7XG4gKiAgICAgaW5uZXJSYWRpdXM6IDUsXG4gKiAgICAgb3V0ZXJSYWRpdXM6IDJcbiAqICAgfSxcbiAqXG4gKiAgIG1hdGVyaWFsOiBuZXcgVEhSRUUuTWVzaExhbWJlcnRNYXRlcmlhbCh7XG4gKiAgICAgY29sb3I6IDB4ZmZmZmZmLFxuICogICAgIHNpZGUgVEhSRUUuRG91YmxlU2lkZVxuICogICB9KSxcbiAqXG4gKiAgIHBvc2l0aW9uOiBbMCwgOCwgMF0sXG4gKlxuICogICByb3RhdGlvbjoge1xuICogICAgIHg6IE1hdGguUEkvNFxuICogICB9XG4gKiB9KS5hZGRUbyhhcHApO1xuICovXG5jbGFzcyBSaW5nIGV4dGVuZHMgTWVzaENvbXBvbmVudCB7XG4gIC8qKlxuICAgKiBEZWZhdWx0IHZhbHVlcyBmb3IgcGFyYW1ldGVyc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5SaW5nI2RlZmF1bHRzXG4gICAqIEBzdGF0aWNcbiAgICogQGRlZmF1bHQgPHByZT5cbiAgICoge1xuICAgKiAgIGdlb21ldHJ5OiB7XG4gICAqICAgICBpbm5lclJhZGl1czogMCxcbiAgICogICAgIG91dGVyUmFkaXVzOiA1MCxcbiAgICogICAgIHRoZXRhU2VnbWVudHM6IDgsXG4gICAqICAgICBwaGlTZWdtZW50czogOCxcbiAgICogICAgIHRoZXRhU3RhcnQ6IDAsXG4gICAqICAgICB0aGV0YUxlbmd0aDogTWF0aC5QSSAqIDJcbiAgICogICB9XG4gICAqIH1cbiAgICogPC9wcmU+XG4gICAqL1xuICBzdGF0aWMgZGVmYXVsdHMgPSB7XG4gICAgLi4uTWVzaENvbXBvbmVudC5kZWZhdWx0cyxcbiAgICBnZW9tZXRyeToge1xuICAgICAgaW5uZXJSYWRpdXM6IDAsXG4gICAgICBvdXRlclJhZGl1czogNTAsXG4gICAgICB0aGV0YVNlZ21lbnRzOiA4LFxuICAgICAgcGhpU2VnbWVudHM6IDgsXG4gICAgICB0aGV0YVN0YXJ0OiAwLFxuICAgICAgdGhldGFMZW5ndGg6IE1hdGguUEkgKiAyXG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBJbnN0cnVjdGlvbnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuUmluZyNpbnN0cnVjdGlvbnNcbiAgICogQHN0YXRpY1xuICAgKiBAZGVmYXVsdCA8cHJlPlxuICAgKiB7XG4gICAqICAgZ2VvbWV0cnk6IFtcbiAgICogICAgICdpbm5lclJhZGl1cycsXG4gICAqICAgICAnb3V0ZXJSYWRpdXMnLFxuICAgKiAgICAgJ3RoZXRhU2VnbWVudHMnLFxuICAgKiAgICAgJ3BoaVNlZ21lbnRzJyxcbiAgICogICAgICd0aGV0YVN0YXJ0JyxcbiAgICogICAgICd0aGV0YUxlbmd0aCdcbiAgICogICBdXG4gICAqIH1cbiAgICogPC9wcmU+XG4gICAqL1xuICBzdGF0aWMgaW5zdHJ1Y3Rpb25zID0ge1xuICAgIC4uLk1lc2hDb21wb25lbnQuZGVmYXVsdHMsXG4gICAgZ2VvbWV0cnk6IFtcbiAgICAgICdpbm5lclJhZGl1cycsXG4gICAgICAnb3V0ZXJSYWRpdXMnLFxuICAgICAgJ3RoZXRhU2VnbWVudHMnLFxuICAgICAgJ3BoaVNlZ21lbnRzJyxcbiAgICAgICd0aGV0YVN0YXJ0JyxcbiAgICAgICd0aGV0YUxlbmd0aCdcbiAgICBdXG4gIH07XG5cbiAgY29uc3RydWN0b3IocGFyYW1zID0ge30pIHtcbiAgICBzdXBlcihwYXJhbXMsIFJpbmcuZGVmYXVsdHMsIFJpbmcuaW5zdHJ1Y3Rpb25zKTtcblxuICAgIGlmIChwYXJhbXMuYnVpbGQpIHtcbiAgICAgIHRoaXMuYnVpbGQocGFyYW1zKTtcbiAgICAgIHN1cGVyLndyYXAoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBidWlsZFxuICAgKiBAZGVzY3JpcHRpb24gQnVpbGQgbGlmZWN5Y2xlIGNyZWF0ZXMgYSBtZXNoIHVzaW5nIGlucHV0IHBhcmFtcy5cbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBDb21wb25lbnQgcGFyYW1ldGVycy5cbiAgICogQHJldHVybiB7VEhSRUUuTWVzaH0gQnVpbHQgbWVzaFxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLlJpbmdcbiAgICovXG4gIGJ1aWxkKHBhcmFtcyA9IHRoaXMucGFyYW1zKSB7XG4gICAgY29uc3Qge2dlb21ldHJ5LCBtYXRlcmlhbH0gPSB0aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgIGdlb21ldHJ5OiB0aGlzLmJ1aWxkR2VvbWV0cnkocGFyYW1zKSxcbiAgICAgIG1hdGVyaWFsOiBwYXJhbXMubWF0ZXJpYWxcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmFwcGx5QnJpZGdlKHttZXNoOiBuZXcgTWVzaChnZW9tZXRyeSwgbWF0ZXJpYWwpfSkubWVzaDtcbiAgfVxuXG4gIGJ1aWxkR2VvbWV0cnkocGFyYW1zID0ge30pIHtcbiAgICByZXR1cm4gbmV3IChwYXJhbXMuYnVmZmVyID8gUmluZ0J1ZmZlckdlb21ldHJ5IDogUmluZ0dlb21ldHJ5KShcbiAgICAgIHBhcmFtcy5nZW9tZXRyeS5pbm5lclJhZGl1cyxcbiAgICAgIHBhcmFtcy5nZW9tZXRyeS5vdXRlclJhZGl1cyxcbiAgICAgIHBhcmFtcy5nZW9tZXRyeS50aGV0YVNlZ21lbnRzLFxuICAgICAgcGFyYW1zLmdlb21ldHJ5LnBoaVNlZ21lbnRzLFxuICAgICAgcGFyYW1zLmdlb21ldHJ5LnRoZXRhU3RhcnQsXG4gICAgICBwYXJhbXMuZ2VvbWV0cnkudGhldGFMZW5ndGhcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCB7XG4gIFJpbmdcbn07XG4iLCJpbXBvcnQge1xuICBNZXNoLFxuICBTaGFwZUJ1ZmZlckdlb21ldHJ5LFxuICBTaGFwZUdlb21ldHJ5XG59IGZyb20gJ3RocmVlJztcblxuaW1wb3J0IHtNZXNoQ29tcG9uZW50fSBmcm9tICcuLi8uLi9jb3JlL01lc2hDb21wb25lbnQnO1xuXG4vKipcbiAqIEBjbGFzcyBTaGFwZVxuICogQGNhdGVnb3J5IGNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZGVzY3JpcHRpb24gU2hhcGUgaXMgYSB1bml2ZXJzYWwgY2xhc3MuIEl0IGFsbG93cyB5b3UgdG8gY3JlYXRlIGRpZmZlcmVudCAyRCBzaGFwZXMgaW4gM0Qgc2NlbmUuPGJyLz5cbiAqIFVuZm9ydHVuYXRlbHksIG5vdCBhbGwgb2YgdGhlbSBzdXBwb3J0IHBoeXNpY3MsIGFuIGFsdGVybmF0aXZlIGlzIHRvIG1ha2UgYSBzaW1pbGFyIDNEIG9iamVjdCBhbmQgc2NhbGUgaXRzIHdpZHRoIGRvd24gdG8gbmVhciB6ZXJvLlxuICogPGJyLz48YnIvPlxuICogYFNoYXBlYCBjb25zaXN0cyBvZiBzaGFwZXMgdGhhdCBhcmUgaW4gaXRzIHNoYXBlcyBwYXJhbWV0ZXIuXG4gKiBAY2xhc3NEZXNjXG4gKiA8aWZyYW1lIHNyYz1cImh0dHBzOi8vdGhyZWVqcy5vcmcvZG9jcy9zY2VuZXMvZ2VvbWV0cnktYnJvd3Nlci5odG1sI1NoYXBlR2VvbWV0cnlcIj48L2lmcmFtZT5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zXSAtIFRoZSBwYXJhbXMuXG4gKiBAZXh0ZW5kcyBtb2R1bGU6Y29yZS5NZXNoQ29tcG9uZW50XG4gKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5DcmVhdGluZyBhIHBsYW5lIGxvb2tpbmcgU2hhcGUgZnJvbSBhIFRIUkVFLlNoYXBlLCBhbmQgYWRkaW5nIGl0IHRvIGFwcDwvY2FwdGlvbj5cbiAqIGNvbnN0IHJlY3RXaWR0aCA9IDEwLFxuICogcmVjdExlbmd0aCA9IDU7XG4gKlxuICogY29uc3QgcmVjdFNoYXBlID0gbmV3IFRIUkVFLlNoYXBlKCk7XG4gKiByZWN0U2hhcGUubW92ZVRvKDAsMCk7XG4gKiByZWN0U2hhcGUubGluZVRvKDAsIHJlY3RXaWR0aCk7XG4gKiByZWN0U2hhcGUubGluZVRvKHJlY3RMZW5ndGgsIHJlY3RXaWR0aCk7XG4gKiByZWN0U2hhcGUubGluZVRvKHJlY3RMZW5ndGgsIDApO1xuICogcmVjdFNoYXBlLmxpbmVUbygwLCAwKTtcbiAqXG4gKiBjb25zdCBwbGFuZSA9IG5ldyBTaGFwZSh7XG4gKiAgIGdlb21ldHJ5OiB7XG4gKiAgICAgc2hhcGU6IHJlY3RTaGFwZVxuICogICB9LFxuICpcbiAqICAgbWF0ZXJpYWw6IG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCh7XG4gKiAgICAgY29sb3I6IDB4ZmZmZmZmXG4gKiAgIH0pXG4gKiB9KS5hZGRUbyhhcHApO1xuICovXG5jbGFzcyBTaGFwZSBleHRlbmRzIE1lc2hDb21wb25lbnQge1xuICAvKipcbiAgICogRGVmYXVsdCB2YWx1ZXMgZm9yIHBhcmFtZXRlcnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuU2hhcGUjZGVmYXVsdHNcbiAgICogQHN0YXRpY1xuICAgKiBAZGVmYXVsdCA8cHJlPlxuICAgKiB7XG4gICAqICAgZ2VvbWV0cnk6IHtcbiAgICogICAgIHNoYXBlczogW11cbiAgICogfVxuICAgKiA8L3ByZT5cbiAgICovXG4gIHN0YXRpYyBkZWZhdWx0cyA9IHtcbiAgICAuLi5NZXNoQ29tcG9uZW50LmRlZmF1bHRzLFxuICAgIGdlb21ldHJ5OiB7XG4gICAgICBzaGFwZXM6IFtdXG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBJbnN0cnVjdGlvbnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuU2hhcGUjaW5zdHJ1Y3Rpb25zXG4gICAqIEBzdGF0aWNcbiAgICogQGRlZmF1bHQgPHByZT5cbiAgICoge1xuICAgKiAgIGdlb21ldHJ5OiBbJ3NoYXBlcyddXG4gICAqIH1cbiAgICogPC9wcmU+XG4gICAqL1xuICBzdGF0aWMgaW5zdHJ1Y3Rpb25zID0ge1xuICAgIC4uLk1lc2hDb21wb25lbnQuaW5zdHJ1Y3Rpb25zLFxuICAgIGdlb21ldHJ5OiBbJ3NoYXBlcyddXG4gIH07XG5cbiAgY29uc3RydWN0b3IocGFyYW1zID0ge30pIHtcbiAgICBzdXBlcihwYXJhbXMsIFNoYXBlLmRlZmF1bHRzLCBTaGFwZS5pbnN0cnVjdGlvbnMpO1xuXG4gICAgaWYgKHBhcmFtcy5idWlsZCkge1xuICAgICAgdGhpcy5idWlsZChwYXJhbXMpO1xuICAgICAgc3VwZXIud3JhcCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGJ1aWxkXG4gICAqIEBkZXNjcmlwdGlvbiBCdWlsZCBsaWZlY3ljbGUgY3JlYXRlcyBhIG1lc2ggdXNpbmcgaW5wdXQgcGFyYW1zLlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIENvbXBvbmVudCBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJuIHtUSFJFRS5NZXNofSBCdWlsdCBtZXNoXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuU2hhcGVcbiAgICovXG4gIGJ1aWxkKHBhcmFtcyA9IHRoaXMucGFyYW1zKSB7XG4gICAgY29uc3Qge2dlb21ldHJ5LCBtYXRlcmlhbH0gPSB0aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgIGdlb21ldHJ5OiB0aGlzLmJ1aWxkR2VvbWV0cnkocGFyYW1zKSxcbiAgICAgIG1hdGVyaWFsOiBwYXJhbXMubWF0ZXJpYWxcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmFwcGx5QnJpZGdlKHttZXNoOiBuZXcgTWVzaChnZW9tZXRyeSwgbWF0ZXJpYWwpfSkubWVzaDtcbiAgfVxuXG4gIGJ1aWxkR2VvbWV0cnkocGFyYW1zID0ge30pIHtcbiAgICByZXR1cm4gbmV3IChwYXJhbXMuYnVmZmVyID8gU2hhcGVCdWZmZXJHZW9tZXRyeSA6IFNoYXBlR2VvbWV0cnkpKFxuICAgICAgcGFyYW1zLmdlb21ldHJ5LnNoYXBlc1xuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IHtcbiAgU2hhcGVcbn07XG4iLCJpbXBvcnQge1xuICBNZXNoLFxuICBTcGhlcmVCdWZmZXJHZW9tZXRyeSxcbiAgU3BoZXJlR2VvbWV0cnlcbn0gZnJvbSAndGhyZWUnO1xuXG5pbXBvcnQge01lc2hDb21wb25lbnR9IGZyb20gJy4uLy4uL2NvcmUvTWVzaENvbXBvbmVudCc7XG5cbi8qKlxuICogQGNsYXNzIFNwaGVyZVxuICogQGNhdGVnb3J5IGNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZGVzY3JpcHRpb24gU3BoZXJlIGNsYXNzIGlzIHVzZWQgdG8gY3JlYXRlIHNwaGVyZSBvYmplY3RzIGJ5IGl0cyByYWRpdXMgcHJvcGVydHkgYW5kIG90aGVyIHZhbHVlcyB0aGF0IGRldGVybWluZXMgaXRzIGRldGFsaXR5LlxuICogPGJyLz48YnIvPlxuICogSXQgaXMgc2ltaWxhciB0byBUSFJFRS5TcGhlcmVHZW9tZXRyeSwgYnV0IGl0IGFsc28gY29udGFpbnMgYWxsIGBTaGFwZWAgcHJvcGVydGllcywgc3VjaCBhcyBtYXRlcmlhbCwgbWFzcyBhbmQgdmVjdG9ycyBsaWtlIHBvc2l0aW9uIChwb3MpIGFuZCByb3RhdGlvbiAocm90KS5cbiAqIDxici8+PGJyLz5cbiAqIFRoZW4gaXQgY3JlYXRlcyBhbiBgVGhyZWUuanMgbWVzaGAgb3IgYSBgUGh5c2lqcyBtZXNoYCwgdGhhdCBpcyBzaW1pbGFyIHRvIGBUaHJlZS5qcyBtZXNoYCwgYnV0IGl0IGFsc28gdGFrZSBpbnRvIGNvbnNpZGVyYXRpb24gY29sbGlzaW9uIGNhbGN1bGF0aW9ucy5cbiAqIFRoaXMgbWVzaCBpcyBhIGNvbWJpbmF0aW9uIG9mIGBUaHJlZS5qcyBnZW9tZXRyeWAgYW5kIGBQaHlzaWpzIG1hdGVyaWFsYCAoVGhlIHNhbWUgYXMgaW4gdGhyZWUuanMsIGJ1dCB3aXRoIGZyaWN0aW9uIGFuZCByZXN0aXR1dGlvbikuXG4gKiBAY2xhc3NEZXNjXG4gKiA8aWZyYW1lIHNyYz1cImh0dHBzOi8vdGhyZWVqcy5vcmcvZG9jcy9zY2VuZXMvZ2VvbWV0cnktYnJvd3Nlci5odG1sI1NwaGVyZUdlb21ldHJ5XCI+PC9pZnJhbWU+XG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtc10gLSBUaGUgcGFyYW1zLlxuICogQGV4dGVuZHMgbW9kdWxlOmNvcmUuTWVzaENvbXBvbmVudFxuICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL21lc2hlc1xuICogQGV4YW1wbGUgPGNhcHRpb24+Q3JlYXRpbmcgYSBTcGhlcmUsIGFuZCBhZGRpbmcgaXQgdG8gYXBwPC9jYXB0aW9uPlxuICogbmV3IFNwaGVyZSh7XG4gKiAgIGdlb21ldHJ5OiB7XG4gKiAgICAgcmFkaXVzOiAyXG4gKiAgIH0sXG4gKlxuICogICBtYXRlcmlhbDogbmV3IFRIUkVFLk1lc2hCYXNpY01hdGVyaWFsKHtcbiAqICAgICBjb2xvcjogMHhmZmZmZmZcbiAqICAgfSksXG4gKlxuICogICBwb3NpdGlvbjoge1xuICogICAgIHk6IDEwMFxuICogICB9XG4gKiB9KS5hZGRUbyhhcHApO1xuICovXG5jbGFzcyBTcGhlcmUgZXh0ZW5kcyBNZXNoQ29tcG9uZW50IHtcbiAgLyoqXG4gICAqIERlZmF1bHQgdmFsdWVzIGZvciBwYXJhbWV0ZXJzXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLlNwaGVyZSNkZWZhdWx0c1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IDxwcmU+XG4gICAqIHtcbiAgICogICBnZW9tZXRyeToge1xuICAgKiAgICAgcmFkaXVzOiAxLFxuICAgKiAgICAgd2lkdGhTZWdtZW50czogOCxcbiAgICogICAgIGhlaWdodFNlZ21lbnRzOiA2XG4gICAqIH1cbiAgICogPC9wcmU+XG4gICAqL1xuICBzdGF0aWMgZGVmYXVsdHMgPSB7XG4gICAgLi4uTWVzaENvbXBvbmVudC5kZWZhdWx0cyxcbiAgICBnZW9tZXRyeToge1xuICAgICAgcmFkaXVzOiAxLFxuICAgICAgd2lkdGhTZWdtZW50czogOCxcbiAgICAgIGhlaWdodFNlZ21lbnRzOiA2XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBJbnN0cnVjdGlvbnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuU3BoZXJlI2luc3RydWN0aW9uc1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IDxwcmU+XG4gICAqIHtcbiAgICogICBnZW9tZXRyeTogWydyYWRpdXMnLCAnd2lkdGhTZWdtZW50cycsICdoZWlnaHRTZWdtZW50cyddXG4gICAqIH1cbiAgICogPC9wcmU+XG4gICAqL1xuICBzdGF0aWMgaW5zdHJ1Y3Rpb25zID0ge1xuICAgIC4uLk1lc2hDb21wb25lbnQuaW5zdHJ1Y3Rpb25zLFxuICAgIGdlb21ldHJ5OiBbJ3JhZGl1cycsICd3aWR0aFNlZ21lbnRzJywgJ2hlaWdodFNlZ21lbnRzJ11cbiAgfTtcblxuICBjb25zdHJ1Y3RvcihwYXJhbXMgPSB7fSkge1xuICAgIHN1cGVyKHBhcmFtcywgU3BoZXJlLmRlZmF1bHRzLCBTcGhlcmUuaW5zdHJ1Y3Rpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGJ1aWxkXG4gICAqIEBkZXNjcmlwdGlvbiBCdWlsZCBsaWZlY3ljbGUgY3JlYXRlcyBhIG1lc2ggdXNpbmcgaW5wdXQgcGFyYW1zLlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIENvbXBvbmVudCBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJuIHtUSFJFRS5NZXNofSBCdWlsdCBtZXNoXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuU3BoZXJlXG4gICAqL1xuICBidWlsZChwYXJhbXMgPSB0aGlzLnBhcmFtcykge1xuICAgIGNvbnN0IHtnZW9tZXRyeSwgbWF0ZXJpYWx9ID0gdGhpcy5hcHBseUJyaWRnZSh7XG4gICAgICBnZW9tZXRyeTogdGhpcy5idWlsZEdlb21ldHJ5KHBhcmFtcyksXG4gICAgICBtYXRlcmlhbDogcGFyYW1zLm1hdGVyaWFsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5hcHBseUJyaWRnZSh7bWVzaDogbmV3IE1lc2goZ2VvbWV0cnksIG1hdGVyaWFsKX0pLm1lc2g7XG4gIH1cblxuICBidWlsZEdlb21ldHJ5KHBhcmFtcyA9IHt9KSB7XG4gICAgY29uc3QgZ2VvbWV0cnkgPSBuZXcgKHBhcmFtcy5idWZmZXIgPyBTcGhlcmVCdWZmZXJHZW9tZXRyeSA6IFNwaGVyZUdlb21ldHJ5KShcbiAgICAgIHBhcmFtcy5nZW9tZXRyeS5yYWRpdXMsXG4gICAgICBwYXJhbXMuZ2VvbWV0cnkud2lkdGhTZWdtZW50cyxcbiAgICAgIHBhcmFtcy5nZW9tZXRyeS5oZWlnaHRTZWdtZW50c1xuICAgICk7XG5cbiAgICByZXR1cm4gZ2VvbWV0cnk7XG4gIH1cbn1cblxuZXhwb3J0IHtcbiAgU3BoZXJlXG59O1xuIiwiaW1wb3J0IHtcbiAgTWVzaCxcbiAgVGV0cmFoZWRyb25CdWZmZXJHZW9tZXRyeSxcbiAgVGV0cmFoZWRyb25HZW9tZXRyeVxufSBmcm9tICd0aHJlZSc7XG5cbmltcG9ydCB7TWVzaENvbXBvbmVudH0gZnJvbSAnLi4vLi4vY29yZS9NZXNoQ29tcG9uZW50JztcblxuLyoqXG4gKiBAY2xhc3MgVGV0cmFoZWRyb25cbiAqIEBjYXRlZ29yeSBjb21wb25lbnRzL21lc2hlc1xuICogQGRlc2NyaXB0aW9uIEluIGdlb21ldHJ5LCBhIHRldHJhaGVkcm9uIGlzIGEgcG9seWhlZHJvbiBjb21wb3NlZCBvZiBmb3VyIHRyaWFuZ3VsYXIgZmFjZXMsIHNpeCBzdHJhaWdodCBlZGdlcywgYW5kIGZvdXIgdmVydGV4IGNvcm5lcnMuXG4gKiBUaGUgdGV0cmFoZWRyb24gaXMgdGhlIHNpbXBsZXN0IG9mIGFsbCB0aGUgb3JkaW5hcnkgY29udmV4IHBvbHloZWRyYSBhbmQgdGhlIG9ubHkgb25lIHRoYXQgaGFzIGZld2VyIHRoYW4gNSBmYWNlcy5cbiAqIDxici8+PGJyLz5cbiAqIGBUZXRyYWhlZHJvbmAgY3JlYXRlcyBhIFRldHJhaGVkcm9uIG9iamVjdCBieSBpdHMgYHJhZGl1c2AgYW5kIGBkZXRhaWxgXG4gKiBAY2xhc3NEZXNjXG4gKiA8aWZyYW1lIHNyYz1cImh0dHBzOi8vdGhyZWVqcy5vcmcvZG9jcy9zY2VuZXMvZ2VvbWV0cnktYnJvd3Nlci5odG1sI1RldHJhaGVkcm9uR2VvbWV0cnlcIj48L2lmcmFtZT5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zXSAtIFRoZSBwYXJhbXMuXG4gKiBAZXh0ZW5kcyBtb2R1bGU6Y29yZS5NZXNoQ29tcG9uZW50XG4gKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5DcmVhdGluZyBhIFRldHJhaGVkcm9uLCBhbmQgYWRkaW5nIGl0IHRvIGFwcDwvY2FwdGlvbj5cbiAqIG5ldyBUZXRyYWhlZHJvbih7XG4gKiAgIGdlb21ldHJ5OiB7XG4gKiAgICAgcmFkaXVzOiAyLFxuICogICAgIGRldGFpbDogMVxuICogICB9LFxuICpcbiAqICAgbWF0ZXJpYWw6IG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCh7XG4gKiAgICAgY29sb3I6IDB4ZmZmZmZmXG4gKiAgIH0pLFxuICpcbiAqICAgcG9zaXRpb246IHtcbiAqICAgICB4OiAwLFxuICogICAgIHk6IDEwMCxcbiAqICAgICB6OiAwXG4gKiAgIH1cbiAqIH0pLmFkZFRvKGFwcCk7XG4gKi9cbmNsYXNzIFRldHJhaGVkcm9uIGV4dGVuZHMgTWVzaENvbXBvbmVudCB7XG4gIC8qKlxuICAgKiBEZWZhdWx0IHZhbHVlcyBmb3IgcGFyYW1ldGVyc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5UZXRyYWhlZHJvbiNkZWZhdWx0c1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IDxwcmU+XG4gICAqIHtcbiAgICogICBnZW9tZXRyeToge1xuICAgKiAgICAgcmFkaXVzOiAxLFxuICAgKiAgICAgZGV0YWlsOiAwXG4gICAqIH1cbiAgICogPC9wcmU+XG4gICAqL1xuICBzdGF0aWMgZGVmYXVsdHMgPSB7XG4gICAgLi4uTWVzaENvbXBvbmVudC5kZWZhdWx0cyxcbiAgICBnZW9tZXRyeToge1xuICAgICAgcmFkaXVzOiAxLFxuICAgICAgZGV0YWlsOiAwXG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBJbnN0cnVjdGlvbnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuVGV0cmFoZWRyb24jaW5zdHJ1Y3Rpb25zXG4gICAqIEBzdGF0aWNcbiAgICogQGRlZmF1bHQgPHByZT5cbiAgICoge1xuICAgKiAgIGdlb21ldHJ5OiBbJ3JhZGl1cycsICdkZXRhaWwnXVxuICAgKiB9XG4gICAqIDwvcHJlPlxuICAgKi9cbiAgc3RhdGljIGluc3RydWN0aW9ucyA9IHtcbiAgICAuLi5NZXNoQ29tcG9uZW50Lmluc3RydWN0aW9ucyxcbiAgICBnZW9tZXRyeTogWydyYWRpdXMnLCAnZGV0YWlsJ11cbiAgfTtcblxuICBjb25zdHJ1Y3RvcihwYXJhbXMgPSB7fSkge1xuICAgIHN1cGVyKHBhcmFtcywgVGV0cmFoZWRyb24uZGVmYXVsdHMsIFRldHJhaGVkcm9uLmluc3RydWN0aW9ucyk7XG5cbiAgICBpZiAocGFyYW1zLmJ1aWxkKSB7XG4gICAgICB0aGlzLmJ1aWxkKHBhcmFtcyk7XG4gICAgICBzdXBlci53cmFwKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgYnVpbGRcbiAgICogQGRlc2NyaXB0aW9uIEJ1aWxkIGxpZmVjeWNsZSBjcmVhdGVzIGEgbWVzaCB1c2luZyBpbnB1dCBwYXJhbXMuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgQ29tcG9uZW50IHBhcmFtZXRlcnMuXG4gICAqIEByZXR1cm4ge1RIUkVFLk1lc2h9IEJ1aWx0IG1lc2hcbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5UZXRyYWhlZHJvblxuICAgKi9cbiAgYnVpbGQocGFyYW1zID0gdGhpcy5wYXJhbXMpIHtcbiAgICBjb25zdCB7Z2VvbWV0cnksIG1hdGVyaWFsfSA9IHRoaXMuYXBwbHlCcmlkZ2Uoe1xuICAgICAgZ2VvbWV0cnk6IHRoaXMuYnVpbGRHZW9tZXRyeShwYXJhbXMpLFxuICAgICAgbWF0ZXJpYWw6IHBhcmFtcy5tYXRlcmlhbFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMuYXBwbHlCcmlkZ2Uoe21lc2g6IG5ldyBNZXNoKGdlb21ldHJ5LCBtYXRlcmlhbCl9KS5tZXNoO1xuICB9XG5cbiAgYnVpbGRHZW9tZXRyeShwYXJhbXMgPSB7fSkge1xuICAgIHJldHVybiBuZXcgKHBhcmFtcy5idWZmZXIgPyBUZXRyYWhlZHJvbkJ1ZmZlckdlb21ldHJ5IDogVGV0cmFoZWRyb25HZW9tZXRyeSkoXG4gICAgICBwYXJhbXMuZ2VvbWV0cnkucmFkaXVzLFxuICAgICAgcGFyYW1zLmdlb21ldHJ5LmRldGFpbFxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IHtcbiAgVGV0cmFoZWRyb25cbn07XG4iLCJpbXBvcnQge1xuICBGb250LFxuICBNZXNoLFxuICBUZXh0R2VvbWV0cnksXG4gIEZvbnRMb2FkZXJcbn0gZnJvbSAndGhyZWUnO1xuXG5pbXBvcnQge01lc2hDb21wb25lbnR9IGZyb20gJy4uLy4uL2NvcmUvTWVzaENvbXBvbmVudCc7XG5cbi8qKlxuICogQGNsYXNzIFRleHRcbiAqIEBjYXRlZ29yeSBjb21wb25lbnRzL21lc2hlc1xuICogQGRlc2NyaXB0aW9uIFRleHQgY2xhc3MgaXMgbWFkZSBmb3IgY3JlYXRpbmcgM0QgdGV4dCBvYmplY3RzLlxuICogQGNsYXNzRGVzY1xuICogPGlmcmFtZSBzcmM9XCJodHRwczovL3RocmVlanMub3JnL2RvY3Mvc2NlbmVzL2dlb21ldHJ5LWJyb3dzZXIuaHRtbCNUZXh0R2VvbWV0cnlcIj48L2lmcmFtZT5cbiAqIDxici8+PGJyLz5cbiAqIFBoeXNpY3MgdGV4dCBvYmplY3QgY2FuIGJlIGNvbnZleCBvciBjb25jYXZlLiBCeSBkZWZhdWx0IGl0J3MgY29udmV4IGJ1dCB5b3UgY2FuIGFsc28gc3dpdGNoIHRvIGNvbmNhdmUuXG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtc10gLSBUaGUgcGFyYW1zLlxuICogQGV4dGVuZHMgbW9kdWxlOmNvcmUuTWVzaENvbXBvbmVudFxuICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL21lc2hlc1xuICogQGV4YW1wbGUgPGNhcHRpb24+Q3JlYXRpbmcgYSBUZXh0LCBhbmQgYWRkaW5nIGl0IHRvIGFwcDwvY2FwdGlvbj5cbiAqIG5ldyBUZXh0KHtcbiAqICAgICB0ZXh0OiAnU29tZSB0ZXh0JyxcbiAqICAgICBwYXJhbWV0ZXJzOiB7XG4gKiAgICAgICBmb250OiAncGF0aC90by9mb250LnR5cGVmYWNlLmpzJyxcbiAqICAgICAgIHNpemU6IDIwLFxuICogICAgICAgaGVpZ2h0OiA1LFxuICogICAgICAgY3VydmVTZWdtZW50czogNlxuICogICAgIH1cbiAqICAgfSxcbiAqXG4gKiAgIG1hdGVyaWFsOiBuZXcgVEhSRUUuTWVzaEJhc2ljTWF0ZXJpYWwoe1xuICogICAgIGNvbG9yOiAweGZmZmZmZlxuICogICB9KSxcbiAqXG4gKiAgIHBvc2l0aW9uOiB7XG4gKiAgICAgeDogLTQwLFxuICogICAgIHk6IDIwLFxuICogICAgIHo6IDBcbiAqICAgfVxuICogfSkuYWRkVG8oYXBwKTtcbiAqL1xuY2xhc3MgVGV4dCBleHRlbmRzIE1lc2hDb21wb25lbnQge1xuICAvKipcbiAgICogRGVmYXVsdCB2YWx1ZXMgZm9yIHBhcmFtZXRlcnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuVGV4dCNkZWZhdWx0c1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IDxwcmU+XG4gICAqIHtcbiAgICogICB0ZXh0OiAnSGVsbG8gV29ybGQhJyxcbiAgICogICBmb250OiBudWxsLFxuICAgKlxuICAgKiAgIGdlb21ldHJ5OiB7XG4gICAqICAgICBzaXplOiAxMixcbiAgICogICAgIGhlaWdodDogNTAsXG4gICAqICAgICBjdXJ2ZVNlZ21lbnRzOiAxMixcbiAgICogICAgIGZvbnQ6IG5ldyBGb250KCksXG4gICAqICAgICBiZXZlbEVuYWJsZWQ6IGZhbHNlLFxuICAgKiAgICAgYmV2ZWxUaGlja25lc3M6IDEwLFxuICAgKiAgICAgYmV2ZWxTaXplOiA4XG4gICAqICAgfVxuICAgKiB9XG4gICAqIDwvcHJlPlxuICAgKi9cbiAgc3RhdGljIGRlZmF1bHRzID0ge1xuICAgIC4uLk1lc2hDb21wb25lbnQuZGVmYXVsdHMsXG4gICAgdGV4dDogJ0hlbGxvIFdvcmxkIScsXG4gICAgZm9udDogbnVsbCxcblxuICAgIGdlb21ldHJ5OiB7XG4gICAgICBzaXplOiAxMixcbiAgICAgIGhlaWdodDogNTAsXG4gICAgICBjdXJ2ZVNlZ21lbnRzOiAxMixcbiAgICAgIGZvbnQ6IG5ldyBGb250KCksXG4gICAgICBiZXZlbEVuYWJsZWQ6IGZhbHNlLFxuICAgICAgYmV2ZWxUaGlja25lc3M6IDEwLFxuICAgICAgYmV2ZWxTaXplOiA4XG4gICAgfVxuICB9O1xuXG4gIHN0YXRpYyBpbnN0cnVjdGlvbnMgPSB7XG4gICAgLi4uTWVzaENvbXBvbmVudC5pbnN0cnVjdGlvbnNcbiAgfTtcblxuICAvKipcbiAgICogRGVmYXVsdCBGb250TG9hZGVyXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLlRleHQjbG9hZGVyXG4gICAqIEBzdGF0aWNcbiAgICogQGRlZmF1bHQgbmV3IEZvbnRMb2FkZXIoKVxuICAgKi9cbiAgc3RhdGljIGxvYWRlciA9IG5ldyBGb250TG9hZGVyKCk7XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgbG9hZFxuICAgKiBAc3RhdGljXG4gICAqIEBkZXNjcmlwdGlvbiBsb2FkKCkgcHJlbG9hZHMgYSBGb250IG9iamVjdCBhbmQgcmV0dXJucyBhIFByb21pc2Ugd2l0aCBpdC5cbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhdGggUGF0aCB0byB0aGUgZm9udFxuICAgKiBAcmV0dXJuIHtQcm9taXNlfSBBIHByb21pc2UgcmVzb2x2ZWQgd2l0aCBhIGZvbnRcbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5UZXh0XG4gICAqL1xuICBzdGF0aWMgbG9hZChwYXRoLCBsb2FkZXIgPSBUZXh0LmxvYWRlcikge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgIGxvYWRlci5sb2FkKHBhdGgsIHJlc29sdmUpO1xuICAgIH0pO1xuICB9XG5cbiAgY29uc3RydWN0b3IocGFyYW1zID0ge30pIHtcbiAgICBzdXBlcihwYXJhbXMsIFRleHQuZGVmYXVsdHMsIFRleHQuaW5zdHJ1Y3Rpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGJ1aWxkXG4gICAqIEBkZXNjcmlwdGlvbiBCdWlsZCBpcyBjYWxsZWQgYXMgcGFydCBvZiB0aGUgbGlmZWN5Y2xlIHRvIGNyZWF0ZSBhIG1lc2ggdXNpbmcgaW5wdXQgcGFyYW1zLlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIENvbXBvbmVudCBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJuIHtUSFJFRS5NZXNofSBCdWlsdCBtZXNoXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuVGV4dFxuICAgKi9cbiAgYnVpbGQocGFyYW1zID0gdGhpcy5wYXJhbXMpIHtcbiAgICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAocGFyYW1zLmZvbnQgaW5zdGFuY2VvZiBQcm9taXNlID8gcGFyYW1zLmZvbnQgOiBQcm9taXNlLnJlc29sdmUocGFyYW1zLmZvbnQpKVxuICAgICAgLnRoZW4oZm9udCA9PiB7XG4gICAgICAgIGNvbnN0IHtnZW9tZXRyeSwgbWF0ZXJpYWx9ID0gdGhpcy5hcHBseUJyaWRnZSh7XG4gICAgICAgICAgZ2VvbWV0cnk6IG5ldyBUZXh0R2VvbWV0cnkoXG4gICAgICAgICAgICBwYXJhbXMudGV4dCxcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oXG4gICAgICAgICAgICAgIHBhcmFtcy5nZW9tZXRyeSxcbiAgICAgICAgICAgICAge2ZvbnR9XG4gICAgICAgICAgICApXG4gICAgICAgICAgKSxcblxuICAgICAgICAgIG1hdGVyaWFsOiBwYXJhbXMubWF0ZXJpYWxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmVzb2x2ZShcbiAgICAgICAgICB0aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgICAgICAgIG1lc2g6IG5ldyBNZXNoKGdlb21ldHJ5LCBtYXRlcmlhbClcbiAgICAgICAgICB9KS5tZXNoXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHN1cGVyLndhaXQocHJvbWlzZSk7XG5cbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfVxufVxuXG5leHBvcnQge1xuICBUZXh0XG59O1xuIiwiaW1wb3J0IHtcbiAgTWVzaCxcbiAgVG9ydXNHZW9tZXRyeVxufSBmcm9tICd0aHJlZSc7XG5cbmltcG9ydCB7TWVzaENvbXBvbmVudH0gZnJvbSAnLi4vLi4vY29yZS9NZXNoQ29tcG9uZW50JztcblxuLyoqXG4gKiBAY2xhc3MgVG9ydXNcbiAqIEBjYXRlZ29yeSBjb21wb25lbnRzL21lc2hlc1xuICogQGRlc2NyaXB0aW9uIFRvcnVzIGNsYXNzIG1ha2VzIGEgdG9ydXMgZmlndXJlLiBBIGRvbnV0IGlzIGEgdG9ydXMuXG4gKiBAY2xhc3NEZXNjXG4gKiA8aWZyYW1lIHNyYz1cImh0dHBzOi8vdGhyZWVqcy5vcmcvZG9jcy9pbmRleC5odG1sI2FwaS9nZW9tZXRyaWVzL1RvcnVzR2VvbWV0cnlcIj48L2lmcmFtZT5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zXSAtIFRoZSBwYXJhbXMuXG4gKiBAZXh0ZW5kcyBtb2R1bGU6Y29yZS5NZXNoQ29tcG9uZW50XG4gKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5DcmVhdGluZyBhIFRvcnVzLCBhbmQgYWRkaW5nIGl0IHRvIGFwcDwvY2FwdGlvbj5cbiAqIG5ldyBUb3J1cyh7XG4gKiAgIGdlb21ldHJ5OiB7XG4gKiAgICAgcmFkaXVzOiA1LFxuICogICAgIHR1YmU6IDJcbiAqICAgfSxcbiAqXG4gKiAgIG1hdGVyaWFsOiBuZXcgVEhSRUUuTWVzaEJhc2ljTWF0ZXJpYWwoe1xuICogICAgIGNvbG9yOiAweGZmZmZmZlxuICogICB9KSxcbiAqXG4gKiAgIHBvc2l0aW9uOiB7XG4gKiAgICAgeTogMzVcbiAqICAgfVxuICogfSkuYWRkVG8oYXBwKTtcbiAqL1xuY2xhc3MgVG9ydXMgZXh0ZW5kcyBNZXNoQ29tcG9uZW50IHtcbiAgLyoqXG4gICAqIERlZmF1bHQgdmFsdWVzIGZvciBwYXJhbWV0ZXJzXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLlRvcnVzI2RlZmF1bHRzXG4gICAqIEBzdGF0aWNcbiAgICogQGRlZmF1bHQgPHByZT5cbiAgICoge1xuICAgKiAgIGdlb21ldHJ5OiB7XG4gICAqICAgICByYWRpdXM6IDEwMCxcbiAgICogICAgIHR1YmU6IDQwLFxuICAgKiAgICAgcmFkaWFsU2VnbWVudHM6IDgsXG4gICAqICAgICB0dWJ1bGFyU2VnbWVudHM6IDYsXG4gICAqICAgICBhcmM6IE1hdGguUEkgKiAyXG4gICAqICAgfVxuICAgKiB9XG4gICAqIDwvcHJlPlxuICAgKi9cbiAgc3RhdGljIGRlZmF1bHRzID0ge1xuICAgIC4uLk1lc2hDb21wb25lbnQuZGVmYXVsdHMsXG4gICAgZ2VvbWV0cnk6IHtcbiAgICAgIHJhZGl1czogMTAwLFxuICAgICAgdHViZTogNDAsXG4gICAgICByYWRpYWxTZWdtZW50czogOCxcbiAgICAgIHR1YnVsYXJTZWdtZW50czogNixcbiAgICAgIGFyYzogTWF0aC5QSSAqIDJcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEluc3RydWN0aW9uc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5Ub3J1cyNpbnN0cnVjdGlvbnNcbiAgICogQHN0YXRpY1xuICAgKiBAZGVmYXVsdCA8cHJlPlxuICAgKiB7XG4gICAqICAgZ2VvbWV0cnk6IFtcbiAgICogICAgICdyYWRpdXMnLFxuICAgKiAgICAgJ3R1YmUnLFxuICAgKiAgICAgJ3JhZGlhbFNlZ21lbnRzJyxcbiAgICogICAgICd0dWJ1bGFyU2VnbWVudHMnLFxuICAgKiAgICAgJ2FyYydcbiAgICogICBdXG4gICAqIH1cbiAgICogPC9wcmU+XG4gICAqL1xuICBzdGF0aWMgaW5zdHJ1Y3Rpb25zID0ge1xuICAgIC4uLk1lc2hDb21wb25lbnQuaW5zdHJ1Y3Rpb25zLFxuICAgIGdlb21ldHJ5OiBbXG4gICAgICAncmFkaXVzJyxcbiAgICAgICd0dWJlJyxcbiAgICAgICdyYWRpYWxTZWdtZW50cycsXG4gICAgICAndHVidWxhclNlZ21lbnRzJyxcbiAgICAgICdhcmMnXG4gICAgXVxuICB9O1xuXG4gIGNvbnN0cnVjdG9yKHBhcmFtcyA9IHt9KSB7XG4gICAgc3VwZXIocGFyYW1zLCBUb3J1cy5kZWZhdWx0cywgVG9ydXMuaW5zdHJ1Y3Rpb25zKTtcblxuICAgIGlmIChwYXJhbXMuYnVpbGQpIHtcbiAgICAgIHRoaXMuYnVpbGQocGFyYW1zKTtcbiAgICAgIHN1cGVyLndyYXAoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBidWlsZFxuICAgKiBAZGVzY3JpcHRpb24gQnVpbGQgbGlmZWN5Y2xlIGNyZWF0ZXMgYSBtZXNoIHVzaW5nIGlucHV0IHBhcmFtcy5cbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBDb21wb25lbnQgcGFyYW1ldGVycy5cbiAgICogQHJldHVybiB7VEhSRUUuTWVzaH0gQnVpbHQgbWVzaFxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLlRvcnVzXG4gICAqL1xuICBidWlsZChwYXJhbXMgPSB0aGlzLnBhcmFtcykge1xuICAgIGNvbnN0IHtnZW9tZXRyeSwgbWF0ZXJpYWx9ID0gdGhpcy5hcHBseUJyaWRnZSh7XG4gICAgICBnZW9tZXRyeTogdGhpcy5idWlsZEdlb21ldHJ5KHBhcmFtcyksXG4gICAgICBtYXRlcmlhbDogcGFyYW1zLm1hdGVyaWFsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5hcHBseUJyaWRnZSh7bWVzaDogbmV3IE1lc2goZ2VvbWV0cnksIG1hdGVyaWFsKX0pLm1lc2g7XG4gIH1cblxuICBidWlsZEdlb21ldHJ5KHBhcmFtcyA9IHt9KSB7XG4gICAgcmV0dXJuIG5ldyBUb3J1c0dlb21ldHJ5KFxuICAgICAgcGFyYW1zLmdlb21ldHJ5LnJhZGl1cyxcbiAgICAgIHBhcmFtcy5nZW9tZXRyeS50dWJlLFxuICAgICAgcGFyYW1zLmdlb21ldHJ5LnJhZGlhbFNlZ21lbnRzLFxuICAgICAgcGFyYW1zLmdlb21ldHJ5LnR1YnVsYXJTZWdtZW50cyxcbiAgICAgIHBhcmFtcy5nZW9tZXRyeS5hcmNcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCB7XG4gIFRvcnVzXG59O1xuIiwiaW1wb3J0IHtcbiAgTWVzaCxcbiAgVG9ydXNLbm90QnVmZmVyR2VvbWV0cnksXG4gIFRvcnVzS25vdEdlb21ldHJ5XG59IGZyb20gJ3RocmVlJztcblxuaW1wb3J0IHtNZXNoQ29tcG9uZW50fSBmcm9tICcuLi8uLi9jb3JlL01lc2hDb21wb25lbnQnO1xuXG4vKipcbiAqIEBjbGFzcyBUb3J1c2tub3RcbiAqIEBjYXRlZ29yeSBjb21wb25lbnRzL21lc2hlc1xuICogQGRlc2NyaXB0aW9uIFRvcnVza25vdCBjbGFzcyBtYWtlcyBhIHRvcnVza25vdCBmaWd1cmUuIEl0J3MgbGlrZSBhIGNyb29rZWQgZG9udXQsIHZlcnkgY3Jvb2tlZC5cbiAqIEBjbGFzc0Rlc2NcbiAqIDxpZnJhbWUgc3JjPVwiaHR0cHM6Ly90aHJlZWpzLm9yZy9kb2NzL3NjZW5lcy9nZW9tZXRyeS1icm93c2VyLmh0bWwjVG9ydXNLbm90R2VvbWV0cnlcIj48L2lmcmFtZT5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zXSAtIFRoZSBwYXJhbXMuXG4gKiBAZXh0ZW5kcyBtb2R1bGU6Y29yZS5NZXNoQ29tcG9uZW50XG4gKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5DcmVhdGluZyBhIFRvcnVza25vdCwgYW5kIGFkZGluZyBpdCB0byBhcHA8L2NhcHRpb24+XG4gKiBuZXcgVG9ydXNrbm90KHtcbiAqICAgZ2VvbWV0cnk6IHtcbiAqICAgICByYWRpdXM6NSxcbiAqICAgICB0dWJlOiAyXG4gKiAgIH0sXG4gKlxuICogICBtYXRlcmlhbDogbmV3IFRIUkVFLk1lc2hCYXNpY01hdGVyaWFsKHtcbiAqICAgICBjb2xvcjogMHhmZmZmZmZcbiAqICAgfSksXG4gKlxuICogICBwb3M6IHtcbiAqICAgICB5OiAxMDBcbiAqICAgfVxuICogfSkuYWRkVG8oYXBwKTtcbiAqL1xuY2xhc3MgVG9ydXNrbm90IGV4dGVuZHMgTWVzaENvbXBvbmVudCB7XG4gIC8qKlxuICAgKiBEZWZhdWx0IHZhbHVlcyBmb3IgcGFyYW1ldGVyc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5Ub3J1c2tub3QjZGVmYXVsdHNcbiAgICogQHN0YXRpY1xuICAgKiBAZGVmYXVsdCA8cHJlPlxuICAgKiB7XG4gICAqICAgZ2VvbWV0cnk6IHtcbiAgICogICAgIHJhZGl1czogMTAwLFxuICAgKiAgICAgdHViZTogNDAsXG4gICAqICAgICByYWRpYWxTZWdtZW50czogNjQsXG4gICAqICAgICB0dWJ1bGFyU2VnbWVudHM6IDgsXG4gICAqICAgICBwOiAyLFxuICAgKiAgICAgcTogM1xuICAgKiAgIH1cbiAgICogfVxuICAgKiA8L3ByZT5cbiAgICovXG4gIHN0YXRpYyBkZWZhdWx0cyA9IHtcbiAgICAuLi5NZXNoQ29tcG9uZW50LmRlZmF1bHRzLFxuICAgIGdlb21ldHJ5OiB7XG4gICAgICByYWRpdXM6IDEwMCxcbiAgICAgIHR1YmU6IDQwLFxuICAgICAgcmFkaWFsU2VnbWVudHM6IDY0LFxuICAgICAgdHVidWxhclNlZ21lbnRzOiA4LFxuICAgICAgcDogMixcbiAgICAgIHE6IDNcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEluc3RydWN0aW9uc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5Ub3J1c2tub3QjaW5zdHJ1Y3Rpb25zXG4gICAqIEBzdGF0aWNcbiAgICogQGRlZmF1bHQgPHByZT5cbiAgICoge1xuICAgKiAgIGdlb21ldHJ5OiBbXG4gICAqICAgICAncmFkaXVzJyxcbiAgICogICAgICd0dWJlJyxcbiAgICogICAgICdyYWRpYWxTZWdtZW50cycsXG4gICAqICAgICAndHVidWxhclNlZ21lbnRzJyxcbiAgICogICAgICdwJyxcbiAgICogICAgICdxJ1xuICAgKiAgIF1cbiAgICogfVxuICAgKiA8L3ByZT5cbiAgICovXG4gIHN0YXRpYyBpbnN0cnVjdGlvbnMgPSB7XG4gICAgLi4uTWVzaENvbXBvbmVudC5pbnN0cnVjdGlvbnMsXG4gICAgZ2VvbWV0cnk6IFtcbiAgICAgICdyYWRpdXMnLFxuICAgICAgJ3R1YmUnLFxuICAgICAgJ3JhZGlhbFNlZ21lbnRzJyxcbiAgICAgICd0dWJ1bGFyU2VnbWVudHMnLFxuICAgICAgJ3AnLFxuICAgICAgJ3EnXG4gICAgXVxuICB9O1xuXG4gIGNvbnN0cnVjdG9yKHBhcmFtcyA9IHt9KSB7XG4gICAgc3VwZXIocGFyYW1zLCBUb3J1c2tub3QuZGVmYXVsdHMsIFRvcnVza25vdC5pbnN0cnVjdGlvbnMpO1xuXG4gICAgaWYgKHBhcmFtcy5idWlsZCkge1xuICAgICAgdGhpcy5idWlsZChwYXJhbXMpO1xuICAgICAgc3VwZXIud3JhcCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGJ1aWxkXG4gICAqIEBkZXNjcmlwdGlvbiBCdWlsZCBsaWZlY3ljbGUgY3JlYXRlcyBhIG1lc2ggdXNpbmcgaW5wdXQgcGFyYW1zLlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIENvbXBvbmVudCBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJuIHtUSFJFRS5NZXNofSBCdWlsdCBtZXNoXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuVG9ydXNrbm90XG4gICAqL1xuICBidWlsZChwYXJhbXMgPSB0aGlzLnBhcmFtcykge1xuICAgIGNvbnN0IHtnZW9tZXRyeSwgbWF0ZXJpYWx9ID0gdGhpcy5hcHBseUJyaWRnZSh7XG4gICAgICBnZW9tZXRyeTogdGhpcy5idWlsZEdlb21ldHJ5KHBhcmFtcyksXG4gICAgICBtYXRlcmlhbDogcGFyYW1zLm1hdGVyaWFsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5hcHBseUJyaWRnZSh7bWVzaDogbmV3IE1lc2goZ2VvbWV0cnksIG1hdGVyaWFsKX0pLm1lc2g7XG4gIH1cblxuICBidWlsZEdlb21ldHJ5KHBhcmFtcyA9IHt9KSB7XG4gICAgY29uc3QgR0NvbnN0cnVjdCA9IHBhcmFtcy5idWZmZXIgPyBUb3J1c0tub3RCdWZmZXJHZW9tZXRyeSA6IFRvcnVzS25vdEdlb21ldHJ5O1xuXG4gICAgcmV0dXJuIG5ldyBHQ29uc3RydWN0KFxuICAgICAgcGFyYW1zLmdlb21ldHJ5LnJhZGl1cyxcbiAgICAgIHBhcmFtcy5nZW9tZXRyeS50dWJlLFxuICAgICAgcGFyYW1zLmdlb21ldHJ5LnJhZGlhbFNlZ21lbnRzLFxuICAgICAgcGFyYW1zLmdlb21ldHJ5LnR1YnVsYXJTZWdtZW50cyxcbiAgICAgIHBhcmFtcy5nZW9tZXRyeS5wLFxuICAgICAgcGFyYW1zLmdlb21ldHJ5LnFcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCB7XG4gIFRvcnVza25vdFxufTtcbiIsImltcG9ydCB7XG4gIE1lc2gsXG4gIExpbmVDdXJ2ZTMsXG4gIFZlY3RvcjMsXG4gIFR1YmVCdWZmZXJHZW9tZXRyeSxcbiAgVHViZUdlb21ldHJ5XG59IGZyb20gJ3RocmVlJztcblxuaW1wb3J0IHtNZXNoQ29tcG9uZW50fSBmcm9tICcuLi8uLi9jb3JlL01lc2hDb21wb25lbnQnO1xuXG4vKipcbiAqIEBjbGFzcyBUdWJlXG4gKiBAY2F0ZWdvcnkgY29tcG9uZW50cy9tZXNoZXNcbiAqIEBkZXNjcmlwdGlvbiBUdWJlIGNsYXNzIG1ha2VzIGEgdHViZSB0aGF0IGV4dHJ1ZGVzIGFsb25nIGEgM2QgY3VydmUuXG4gKiBAY2xhc3NEZXNjXG4gKiA8aWZyYW1lIHNyYz1cImh0dHBzOi8vdGhyZWVqcy5vcmcvZG9jcy9pbmRleC5odG1sI2FwaS9nZW9tZXRyaWVzL1R1YmVHZW9tZXRyeVwiPjwvaWZyYW1lPlxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXNdIC0gVGhlIHBhcmFtcy5cbiAqIEBleHRlbmRzIG1vZHVsZTpjb3JlLk1lc2hDb21wb25lbnRcbiAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXNcbiAqIEBleGFtcGxlIDxjYXB0aW9uPkNyZWF0aW5nIGEgVHViZSBmcm9tIGEgdGhyZWUuanMgQ3VydmUsIGFuZCBhZGRpbmcgaXQgdG8gYXBwPC9jYXB0aW9uPlxuICogY29uc3QgQ3VzdG9tU2luQ3VydmUgPSBUSFJFRS5DdXJ2ZS5jcmVhdGUoXG4gKiAgIGZ1bmN0aW9uIChzY2FsZSkgeyAvLyBjdXN0b20gY3VydmUgY29uc3RydWN0b3JcbiAqICAgICB0aGlzLnNjYWxlID0gKHNjYWxlID09PSB1bmRlZmluZWQpID8gMSA6IHNjYWxlO1xuICogICB9LFxuICpcbiAqICAgZnVuY3Rpb24gKHQpIHsgLy8gZ2V0UG9pbnQ6IHQgaXMgYmV0d2VlbiAwLTFcbiAqICAgICBjb25zdCB0eCA9IHQgKiAzIC0gMS41LFxuICogICAgIHR5ID0gTWF0aC5zaW4oIDIgKiBNYXRoLlBJICogdCApLFxuICogICAgIHR6ID0gMDtcbiAqXG4gKiAgICAgcmV0dXJuIG5ldyBUSFJFRS5WZWN0b3IzKHR4LCB0eSwgdHopLm11bHRpcGx5U2NhbGFyKHRoaXMuc2NhbGUpO1xuICogICB9XG4gKiApO1xuICpcbiAqIGNvbnN0IHBhdGggPSBuZXcgQ3VzdG9tU2luQ3VydmUoMTApO1xuICpcbiAqIG5ldyBUdWJlKHtcbiAqICAgZ2VvbWV0cnk6IHtcbiAqICAgICBwYXRoOiBwYXRoXG4gKiAgIH0sXG4gKlxuICogICBtYXRlcmlhbDogbmV3IFRIUkVFLk1lc2hCYXNpY01hdGVyaWFsKHtcbiAqICAgICBjb2xvcjogMHhmZmZmZmZcbiAqICAgfSlcbiAqIH0pLmFkZFRvKGFwcCk7XG4gKi9cbmNsYXNzIFR1YmUgZXh0ZW5kcyBNZXNoQ29tcG9uZW50IHtcbiAgLyoqXG4gICAqIERlZmF1bHQgdmFsdWVzIGZvciBwYXJhbWV0ZXJzXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLlR1YmUjZGVmYXVsdHNcbiAgICogQHN0YXRpY1xuICAgKiBAZGVmYXVsdCA8cHJlPlxuICAgKiB7XG4gICAqICAgZ2VvbWV0cnk6IHtcbiAgICogICAgIHBhdGg6IG5ldyBUSFJFRS5MaW5lQ3VydmUzKG5ldyBWZWN0b3IzKDAsIDAsIDApLCBuZXcgVmVjdG9yMygwLCAwLCAxKSksXG4gICAqICAgICBzZWdtZW50czogMjAsXG4gICAqICAgICByYWRpdXM6IDIsXG4gICAqICAgICByYWRpdXNTZWdtZW50czogOCxcbiAgICogICAgIGNsb3NlZDogZmFsc2VcbiAgICogICB9XG4gICAqIH1cbiAgICogPC9wcmU+XG4gICAqL1xuICBzdGF0aWMgZGVmYXVsdHMgPSB7XG4gICAgLi4uTWVzaENvbXBvbmVudC5kZWZhdWx0cyxcbiAgICBnZW9tZXRyeToge1xuICAgICAgcGF0aDogbmV3IExpbmVDdXJ2ZTMobmV3IFZlY3RvcjMoMCwgMCwgMCksIG5ldyBWZWN0b3IzKDAsIDAsIDEpKSxcbiAgICAgIHNlZ21lbnRzOiAyMCxcbiAgICAgIHJhZGl1czogMixcbiAgICAgIHJhZGl1c1NlZ21lbnRzOiA4LFxuICAgICAgY2xvc2VkOiBmYWxzZVxuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogSW5zdHJ1Y3Rpb25zXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLlR1YmUjaW5zdHJ1Y3Rpb25zXG4gICAqIEBzdGF0aWNcbiAgICogQGRlZmF1bHQgPHByZT5cbiAgICoge1xuICAgKiAgIGdlb21ldHJ5OiBbXG4gICAqICAgICAncGF0aCcsXG4gICAqICAgICAnc2VnbWVudHMnLFxuICAgKiAgICAgJ3JhZGl1cycsXG4gICAqICAgICAncmFkaXVzU2VnbWVudHMnLFxuICAgKiAgICAgJ2Nsb3NlZCdcbiAgICogICBdXG4gICAqIH1cbiAgICogPC9wcmU+XG4gICAqL1xuICBzdGF0aWMgaW5zdHJ1Y3Rpb25zID0ge1xuICAgIC4uLk1lc2hDb21wb25lbnQuaW5zdHJ1Y3Rpb25zLFxuICAgIGdlb21ldHJ5OiBbXG4gICAgICAncGF0aCcsXG4gICAgICAnc2VnbWVudHMnLFxuICAgICAgJ3JhZGl1cycsXG4gICAgICAncmFkaXVzU2VnbWVudHMnLFxuICAgICAgJ2Nsb3NlZCdcbiAgICBdXG4gIH07XG5cbiAgY29uc3RydWN0b3IocGFyYW1zID0ge30pIHtcbiAgICBzdXBlcihwYXJhbXMsIFR1YmUuZGVmYXVsdHMsIFR1YmUuaW5zdHJ1Y3Rpb25zKTtcblxuICAgIGlmIChwYXJhbXMuYnVpbGQpIHtcbiAgICAgIHRoaXMuYnVpbGQocGFyYW1zKTtcbiAgICAgIHN1cGVyLndyYXAoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBidWlsZFxuICAgKiBAZGVzY3JpcHRpb24gQnVpbGQgbGlmZWN5Y2xlIGNyZWF0ZXMgYSBtZXNoIHVzaW5nIGlucHV0IHBhcmFtcy5cbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBDb21wb25lbnQgcGFyYW1ldGVycy5cbiAgICogQHJldHVybiB7VEhSRUUuTWVzaH0gQnVpbHQgbWVzaFxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLlR1YmVcbiAgICovXG4gIGJ1aWxkKHBhcmFtcyA9IHRoaXMucGFyYW1zKSB7XG4gICAgY29uc3Qge2dlb21ldHJ5LCBtYXRlcmlhbH0gPSB0aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgIGdlb21ldHJ5OiB0aGlzLmJ1aWxkR2VvbWV0cnkocGFyYW1zKSxcbiAgICAgIG1hdGVyaWFsOiBwYXJhbXMubWF0ZXJpYWxcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmFwcGx5QnJpZGdlKHttZXNoOiBuZXcgTWVzaChnZW9tZXRyeSwgbWF0ZXJpYWwpfSkubWVzaDtcbiAgfVxuXG4gIGJ1aWxkR2VvbWV0cnkocGFyYW1zID0ge30pIHtcbiAgICBjb25zdCBnZW9tZXRyeSA9IG5ldyAocGFyYW1zLmJ1ZmZlciA/IFR1YmVCdWZmZXJHZW9tZXRyeSA6IFR1YmVHZW9tZXRyeSkoXG4gICAgICBwYXJhbXMuZ2VvbWV0cnkucGF0aCxcbiAgICAgIHBhcmFtcy5nZW9tZXRyeS5zZWdtZW50cyxcbiAgICAgIHBhcmFtcy5nZW9tZXRyeS5yYWRpdXMsXG4gICAgICBwYXJhbXMuZ2VvbWV0cnkucmFkaXVzU2VnbWVudHMsXG4gICAgICBwYXJhbXMuZ2VvbWV0cnkuY2xvc2VkXG4gICAgKTtcblxuICAgIHJldHVybiBnZW9tZXRyeTtcbiAgfVxufVxuXG5leHBvcnQge1xuICBUdWJlXG59O1xuIiwiaW1wb3J0IHtPYmplY3QzRH0gZnJvbSAndGhyZWUnO1xuaW1wb3J0IHtNZXNoQ29tcG9uZW50fSBmcm9tICcuLi8uLi9jb3JlL01lc2hDb21wb25lbnQnO1xuaW1wb3J0IHtDb21wb25lbnR9IGZyb20gJy4uLy4uL2NvcmUvQ29tcG9uZW50JztcblxuLyoqXG4gKiBAY2xhc3MgR3JvdXBcbiAqIEBjYXRlZ29yeSBjb21wb25lbnRzL21lc2hlc1xuICogQGRlc2NyaXB0aW9uIFNvbWV0aW1lcyB5b3UgbmVlZCB0byBtYWtlIGdyb3VwcyBvZiBvYmplY3RzIChpdCdzIG5vdCBjb252ZW5pZW50bHkgdG8gYXBwbHkgdHJhbnNmb3JtcyB0byBlYWNoIG9iamVjdCB3aGVuIGNhbiBtYWtlIGp1c3Qgb25lIHRvIGEgZ3JvdXApLjxici8+XG4gKiBJbiBUaHJlZS5qcyB5b3UgbWFrZSBpdCB1c2luZyBgVEhSRUUuT2JqZWN0M0RgIGFuZCBpdCdzIGNoaWxkcmVuLiA8YnIvPjxici8+XG4gKiBJbiB3aHMuanMgd2UgaGF2ZSBgR3JvdXBgXG4gKiBAZXh0ZW5kcyBtb2R1bGU6Y29yZS5NZXNoQ29tcG9uZW50XG4gKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5BcHByb2FjaCAyIC0gQWRkaW5nIG9iamVjdHMgdG8gYW4gZW1wdHkgZ3JvdXA8L2NhcHRpb24+XG4gKiBjb25zdCBzcGhlcmUgPSBuZXcgU3BoZXJlKCk7XG4gKiBjb25zdCBib3ggPSBuZXcgQm94KCk7XG4gKiBjb25zdCBncm91cCA9IG5ldyBHcm91cCgpO1xuICpcbiAqIHNwaGVyZS5hZGRUbyhncm91cCk7XG4gKiBib3guYWRkVG8oZ3JvdXApO1xuKiBAZXhhbXBsZSA8Y2FwdGlvbj5BcHByb2FjaCAyIC0gTWFraW5nIGEgZ3JvdXAgZnJvbSBvYmplY3RzPC9jYXB0aW9uPlxuICogY29uc3Qgc3BoZXJlID0gbmV3IFNwaGVyZSgpO1xuICogY29uc3QgYm94ID0gbmV3IEJveCgpO1xuICogY29uc3QgZ3JvdXAgPSBuZXcgR3JvdXAoYm94LCBzcGhlcmUpO1xuICogLy8gT1I6IGNvbnN0IGdyb3VwID0gbmV3IEdyb3VwKFtib3gsIHNwaGVyZV0pO1xuICovXG5jbGFzcyBHcm91cCBleHRlbmRzIE1lc2hDb21wb25lbnQge1xuICBjb25zdHJ1Y3RvciguLi5vYmplY3RzKSB7XG4gICAgc3VwZXIoe30pO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvYmplY3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBvYmogPSBvYmplY3RzW2ldO1xuXG4gICAgICBpZiAob2JqIGluc3RhbmNlb2YgQ29tcG9uZW50KSBvYmouYWRkVG8odGhpcyk7XG4gICAgICBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBPYmplY3QzRCkgdGhpcy5uYXRpdmUuYWRkKG9iaik7XG4gICAgfVxuICB9XG5cbiAgYnVpbGQoKSB7XG4gICAgcmV0dXJuIG5ldyBPYmplY3QzRCgpO1xuICB9XG59XG5cbmV4cG9ydCB7XG4gIEdyb3VwXG59O1xuIiwiLyoqIEBtb2R1bGUgY29tcG9uZW50cy9tZXNoZXMgKi9cbmV4cG9ydCAqIGZyb20gJy4vQm94JztcbmV4cG9ydCAqIGZyb20gJy4vQ2lyY2xlJztcbmV4cG9ydCAqIGZyb20gJy4vQ29uZSc7XG5leHBvcnQgKiBmcm9tICcuL0N5bGluZGVyJztcbmV4cG9ydCAqIGZyb20gJy4vRG9kZWNhaGVkcm9uJztcbmV4cG9ydCAqIGZyb20gJy4vRXh0cnVkZSc7XG5leHBvcnQgKiBmcm9tICcuL0ljb3NhaGVkcm9uJztcbmV4cG9ydCAqIGZyb20gJy4vTGF0aGUnO1xuZXhwb3J0ICogZnJvbSAnLi9MaW5lJztcbmV4cG9ydCAqIGZyb20gJy4vSW1wb3J0ZXInO1xuZXhwb3J0ICogZnJvbSAnLi9PY3RhaGVkcm9uJztcbmV4cG9ydCAqIGZyb20gJy4vUGFyYW1ldHJpYyc7XG5leHBvcnQgKiBmcm9tICcuL1BsYW5lJztcbmV4cG9ydCAqIGZyb20gJy4vUG9seWhlZHJvbic7XG5leHBvcnQgKiBmcm9tICcuL1JpbmcnO1xuZXhwb3J0ICogZnJvbSAnLi9TaGFwZSc7XG5leHBvcnQgKiBmcm9tICcuL1NwaGVyZSc7XG5leHBvcnQgKiBmcm9tICcuL1RldHJhaGVkcm9uJztcbmV4cG9ydCAqIGZyb20gJy4vVGV4dCc7XG5leHBvcnQgKiBmcm9tICcuL1RvcnVzJztcbmV4cG9ydCAqIGZyb20gJy4vVG9ydXNrbm90JztcbmV4cG9ydCAqIGZyb20gJy4vVHViZSc7XG5leHBvcnQgKiBmcm9tICcuL0dyb3VwJztcbiIsIi8qKlxuICogQGNsYXNzIEVsZW1lbnRNb2R1bGVcbiAqIEBjYXRlZ29yeSBtb2R1bGVzL2FwcFxuICogQHBhcmFtIHtPYmplY3R9IFtjb250YWluZXI9ZG9jdW1lbnQuYm9keV0gY29udGFpbmVyIGlzIHRoZSBET00gb2JqZWN0IHRvIHdoaWNoIGFwcGxpY2F0aW9uJ3MgY2FudmFzIHdpbGwgYmUgYWRkZWQgdG8uXG4gKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5DcmVhdGluZyBhbiBlbGVtZW50IG1vZHVsZSwgcGFzc2luZyBpdCB0byB0aGUgQXBwPC9jYXB0aW9uPlxuICogbmV3IEFwcChbXG4gKiAgIG5ldyBFbGVtZW50TW9kdWxlKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhcHAnKSlcbiAqIF0pO1xuICovXG5leHBvcnQgY2xhc3MgRWxlbWVudE1vZHVsZSB7XG4gIGNvbnN0cnVjdG9yKGNvbnRhaW5lciA9IGRvY3VtZW50LmJvZHkpIHtcbiAgICBpZiAoY29udGFpbmVyLmNvbnRhaW5lcikge1xuICAgICAgY29uc29sZS53YXJuKCdFbGVtZW50TW9kdWxlIG5vdyBhY2NlcHRzIG9ubHkgYXJndW1lbnQgd2hpY2ggaXMgYSBET00gb2JqZWN0LCBub3QgYSBwYXJhbXMgb2JqZWN0LicpO1xuICAgICAgdGhpcy5jb250YWluZXIgPSBjb250YWluZXIuY29udGFpbmVyO1xuICAgIH0gZWxzZSB0aGlzLmNvbnRhaW5lciA9IGNvbnRhaW5lcjtcblxuICAgIHRoaXMuY3JlYXRlRWxlbWVudCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgY3JlYXRlRWxlbWVudFxuICAgKiBAaW5zdGFuY2VcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBjYW52YXMgZWxlbWVudC5cbiAgICogQG1lbWJlcm9mIG1vZHVsZTptb2R1bGVzL2FwcC5FbGVtZW50TW9kdWxlXG4gICAqL1xuICBjcmVhdGVFbGVtZW50KCkge1xuICAgIHRoaXMuZWxlbWVudCA9IHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxuICAgIHRoaXMuZWxlbWVudC5jbGFzc05hbWUgPSAnd2hzLWFwcCc7XG4gICAgdGhpcy5lbGVtZW50LnN0eWxlLndpZHRoID0gJ2luaGVyaXQnO1xuICAgIHRoaXMuZWxlbWVudC5zdHlsZS5oZWlnaHQgPSAnaW5oZXJpdCc7XG4gICAgdGhpcy5lbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJztcbiAgfVxuXG4gIG1hbmFnZXIobWFuYWdlcikge1xuICAgIG1hbmFnZXIuc2V0KCdlbGVtZW50JywgdGhpcy5lbGVtZW50KTtcbiAgICBtYW5hZ2VyLnNldCgnY29udGFpbmVyJywgdGhpcy5jb250YWluZXIpO1xuICB9XG5cbiAgaW50ZWdyYXRlKHNlbGYpIHtcbiAgICBzZWxmLmNvbnRhaW5lci5hcHBlbmRDaGlsZChzZWxmLmVsZW1lbnQpO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBXZWJHTFJlbmRlcmVyLFxuICBWZWN0b3IyXG59IGZyb20gJ3RocmVlJztcblxuaW1wb3J0IHtMb29wfSBmcm9tICcuLi8uLi9jb3JlL0xvb3AnO1xuXG4vKipcbiAqIEBjbGFzcyBSZW5kZXJpbmdNb2R1bGVcbiAqIEBjYXRlZ29yeSBtb2R1bGVzL2FwcFxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXNdXG4gKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj4gQ3JlYXRpbmcgYSByZW5kZXJpbmcgbW9kdWxlIGFuZCBwYXNzaW5nIGl0IHRvIEFwcCdzIG1vZHVsZXM8L2NhcHRpb24+XG4gKiBuZXcgQXBwKFtcbiAqICAgbmV3IEVsZW1lbnRNb2R1bGUoKSxcbiAqICAgbmV3IFNjZW5lTW9kdWxlKCksXG4gKiAgIG5ldyBEZWZpbmVNb2R1bGUoJ2NhbWVyYScsIG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSh7XG4gKiAgICAgcG9zaXRpb246IG5ldyBUSFJFRS5WZWN0b3IzKDAsIDYsIDE4KSxcbiAqICAgICBmYXI6IDEwMDAwXG4gKiAgIH0pKSxcbiAqICAgbmV3IFJlbmRlcmluZ01vZHVsZSh7XG4gKiAgICAgYmdDb2xvcjogMHgxNjIxMjksXG4gKlxuICogICAgIHJlbmRlcmVyOiB7XG4gKiAgICAgICBhbnRpYWxpYXM6IHRydWVcbiAqICAgICB9XG4gKiAgIH0sIHtzaGFkb3c6IHRydWV9KVxuICogXSk7XG4gKi9cbmV4cG9ydCBjbGFzcyBSZW5kZXJpbmdNb2R1bGUge1xuICAvKipcbiAgICogYWRkaXRpb25hbFxuICAgKiBAZGVzY3JpcHRpb24gY29sbGVjdGlvbiBvZiBhZGRpdGlvbmFsIHNjcmlwdHNcbiAgICogQHN0YXRpY1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb3JlLkFwcCNhZGRpdGlvbmFsXG4gICAqIEBwdWJsaWNcbiAgICovXG4gIHN0YXRpYyBhZGRpdGlvbmFsID0ge1xuICAgIHNoYWRvdyhyZW5kZXJlcikge1xuICAgICAgcmVuZGVyZXIuc2hhZG93TWFwLmVuYWJsZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBlbmFibGVkXG4gICAqIEBzdGF0aWNcbiAgICogQG1lbWJlciB7Qm9vbGVhbn0gbW9kdWxlOmNvcmUuQXBwI2VuYWJsZWRcbiAgICogQHB1YmxpY1xuICAgKi9cbiAgZW5hYmxlZCA9IHRydWU7XG5cbiAgY29uc3RydWN0b3IocGFyYW1zID0ge30sIGFkZGl0aW9uYWwpIHtcbiAgICB0aGlzLnBhcmFtcyA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgd2lkdGg6IHdpbmRvdy5pbm5lcldpZHRoLFxuICAgICAgaGVpZ2h0OiB3aW5kb3cuaW5uZXJIZWlnaHQsXG5cbiAgICAgIHJlc29sdXRpb246IG5ldyBWZWN0b3IyKDEsIDEpLFxuICAgICAgcGl4ZWxSYXRpbzogd2luZG93LmRldmljZVBpeGVsUmF0aW8sXG5cbiAgICAgIGJnQ29sb3I6IDB4MDAwMDAwLFxuICAgICAgYmdPcGFjaXR5OiAxLFxuXG4gICAgICByZW5kZXJlcjoge30sXG4gICAgICBmaXgoKSB7fVxuICAgIH0sIHBhcmFtcyk7XG5cbiAgICBjb25zdCB7XG4gICAgICBiZ0NvbG9yLFxuICAgICAgYmdPcGFjaXR5LFxuICAgICAgcmVuZGVyZXIsXG4gICAgICBwaXhlbFJhdGlvLFxuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHQsXG4gICAgICByZXNvbHV0aW9uLFxuICAgICAgZml4XG4gICAgfSA9IHRoaXMucGFyYW1zO1xuXG4gICAgdGhpcy5yZW5kZXJlciA9IG5ldyBXZWJHTFJlbmRlcmVyKHJlbmRlcmVyKTtcbiAgICB0aGlzLmVmZmVjdHMgPSBbXTtcblxuICAgIHRoaXMucmVuZGVyZXIuc2V0Q2xlYXJDb2xvcihcbiAgICAgIGJnQ29sb3IsXG4gICAgICBiZ09wYWNpdHlcbiAgICApO1xuXG4gICAgaWYgKHBpeGVsUmF0aW8pIHRoaXMucmVuZGVyZXIuc2V0UGl4ZWxSYXRpbyhwaXhlbFJhdGlvKTtcblxuICAgIHRoaXMuc2V0U2l6ZShcbiAgICAgIE51bWJlcih3aWR0aCAqIHJlc29sdXRpb24ueCkudG9GaXhlZCgpLFxuICAgICAgTnVtYmVyKGhlaWdodCAqIHJlc29sdXRpb24ueSkudG9GaXhlZCgpXG4gICAgKTtcblxuICAgIGZvciAoY29uc3Qga2V5IGluIGFkZGl0aW9uYWwpXG4gICAgICBpZiAoYWRkaXRpb25hbFtrZXldKSB0aGlzLmFwcGx5QWRkaXRpb25hbChrZXkpO1xuXG4gICAgZml4KHRoaXMucmVuZGVyZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgYXBwbHlBZGRpdGlvbmFsXG4gICAqIEBkZXNjcmlwdGlvbiBBcHBseSBhZGRpdGlvbmFsIHNjcmlwdCBmcm9tIFJlbmRlcmluZ01vZHVsZS5hZGRpdGlvbmFsXG4gICAqIEBwYXJhbSB7U3Rpcm5nfSBuYW1lIFNjcmlwdCBuYW1lXG4gICAqIEByZXR1cm4ge3RoaXN9XG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9hcHAuUmVuZGVyaW5nTW9kdWxlXG4gICAqL1xuICBhcHBseUFkZGl0aW9uYWwobmFtZSkge1xuICAgIFJlbmRlcmluZ01vZHVsZS5hZGRpdGlvbmFsW25hbWVdLmFwcGx5KHRoaXMsIFt0aGlzLnJlbmRlcmVyXSk7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBpbnRlZ3JhdGVSZW5kZXJlclxuICAgKiBAZGVzY3JpcHRpb24gSW50ZWdyYXRlIHJlbmRlcmVyXG4gICAqIEBwYXJhbSB7Tm9kZUVsZW1lbnR9IGVsZW1lbnQgRE9NIG9iamVjdFxuICAgKiBAcGFyYW0ge1RIUkVFLlNjZW5lfSBzY2VuZSB1c2VkIHNjZW5lXG4gICAqIEBwYXJhbSB7VEhSRUUuQ2FtZXJhfSBjYW1lcmEgdXNlZCBjYW1lcmFcbiAgICogQHJldHVybiB7TG9vcH0gcmVuZGVyTG9vcFxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwLlJlbmRlcmluZ01vZHVsZVxuICAgKi9cbiAgaW50ZWdyYXRlUmVuZGVyZXIoZWxlbWVudCwgc2NlbmUsIGNhbWVyYSkge1xuICAgIHRoaXMuc2NlbmUgPSBzY2VuZTtcbiAgICB0aGlzLmNhbWVyYSA9IGNhbWVyYTtcbiAgICB0aGlzLmF0dGFjaFRvQ2FudmFzKGVsZW1lbnQpO1xuXG4gICAgcmV0dXJuIG5ldyBMb29wKCgpID0+IHRoaXMucmVuZGVyZXIucmVuZGVyKHRoaXMuc2NlbmUsIHRoaXMuY2FtZXJhKSk7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBlZmZlY3RcbiAgICogQGRlc2NyaXB0aW9uIEFkZCB0aHJlZS5qcyBlZmZlY3RcbiAgICogQHBhcmFtIHtPYmplY3R9IGVmZmVjdCB0aHJlZS5qcyBlZmZlY3RcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gZWZmZWN0TG9vcCB1cGRhdGUgZnVuY3Rpb24gZm9yIGVmZmVjdFxuICAgKiBAcmV0dXJuIHt0aGlzfVxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwLlJlbmRlcmluZ01vZHVsZVxuICAgKi9cbiAgZWZmZWN0KGVmZmVjdCwgZWZmZWN0TG9vcCA9ICgpID0+IHtcbiAgICBlZmZlY3QucmVuZGVyKHRoaXMuc2NlbmUsIHRoaXMuY2FtZXJhKTtcbiAgfSkge1xuICAgIHRoaXMucmVuZGVyTG9vcC5zdG9wKCk7XG5cbiAgICBjb25zdCBzaXplID0gdGhpcy5yZW5kZXJlci5nZXRTaXplKCk7XG4gICAgZWZmZWN0LnNldFNpemUoc2l6ZS53aWR0aCwgc2l6ZS5oZWlnaHQpO1xuXG4gICAgY29uc3QgbG9vcCA9IG5ldyBMb29wKGVmZmVjdExvb3ApO1xuXG4gICAgdGhpcy5lZmZlY3RzLnB1c2gobG9vcCk7XG4gICAgaWYgKHRoaXMuZW5hYmxlZCkgbG9vcC5zdGFydCh0aGlzLmFwcCk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIHNldFNpemVcbiAgICogQGRlc2NyaXB0aW9uIFVwZGF0ZSByZW5kZXIgdGFyZ2V0IHdpZHRoIGFuZCBoZWlnaHQuXG4gICAqIEBwYXJhbSB7TnVtYmVyfSB3aWR0aFxuICAgKiBAcGFyYW0ge051bWJlcn0gaGVpZ2h0XG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9hcHAuUmVuZGVyaW5nTW9kdWxlXG4gICAqL1xuICBzZXRTaXplKHdpZHRoLCBoZWlnaHQpIHtcbiAgICBpZiAodGhpcy5yZW5kZXJlcikgdGhpcy5yZW5kZXJlci5zZXRTaXplKHdpZHRoLCBoZWlnaHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgYXR0YWNoVG9DYW52YXNcbiAgICogQGRlc2NyaXB0aW9uIEF0dGFjaCByZW5kZXJlci5kb21FbGVtZW50IHRvIGVsZW1lbnRcbiAgICogQHBhcmFtIHtOb2RlRWxlbWVudH0gZWxlbWVudCBET00gb2JqZWN0XG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9hcHAuUmVuZGVyaW5nTW9kdWxlXG4gICAqL1xuICBhdHRhY2hUb0NhbnZhcyhlbGVtZW50KSB7XG4gICAgY29uc3QgY2FudmFzID0gdGhpcy5yZW5kZXJlci5kb21FbGVtZW50O1xuXG4gICAgLy8gYXR0YWNoIHRvIG5ldyBwYXJlbnQgd29ybGQgZG9tXG4gICAgZWxlbWVudC5hcHBlbmRDaGlsZChjYW52YXMpO1xuICAgIGNhbnZhcy5zdHlsZS53aWR0aCA9ICcxMDAlJztcbiAgICBjYW52YXMuc3R5bGUuaGVpZ2h0ID0gJzEwMCUnO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2Qgc3RvcFxuICAgKiBAZGVzY3JpcHRpb24gU3RvcHMgcmVuZGVyTG9vcCBhbmQgZWZmZWN0IGxvb3BzXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9hcHAuUmVuZGVyaW5nTW9kdWxlXG4gICAqL1xuICBzdG9wKCkge1xuICAgIHRoaXMuZW5hYmxlZCA9IGZhbHNlO1xuICAgIHRoaXMucmVuZGVyTG9vcC5zdG9wKCk7XG4gICAgdGhpcy5lZmZlY3RzLmZvckVhY2gobG9vcCA9PiBsb29wLnN0b3AoKSk7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBwbGF5XG4gICAqIEBkZXNjcmlwdGlvbiBSZXN1bWVzIHJlbmRlckxvb3AgYW5kIGVmZmVjdCBsb29wc1xuICAgKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwLlJlbmRlcmluZ01vZHVsZVxuICAgKi9cbiAgcGxheSgpIHtcbiAgICB0aGlzLmVuYWJsZWQgPSB0cnVlO1xuICAgIHRoaXMucmVuZGVyTG9vcC5zdGFydCgpO1xuICAgIHRoaXMuZWZmZWN0cy5mb3JFYWNoKGxvb3AgPT4gbG9vcC5zdGFydCgpKTtcbiAgfVxuXG4gIG1hbmFnZXIobWFuYWdlcikge1xuICAgIG1hbmFnZXIuZGVmaW5lKCdyZW5kZXJpbmcnKTtcbiAgICBtYW5hZ2VyLnNldCgncmVuZGVyZXInLCB0aGlzLnJlbmRlcmVyKTtcblxuICAgIHRoaXMuYXBwID0gbWFuYWdlci5oYW5kbGVyO1xuXG4gICAgdGhpcy5yZW5kZXJMb29wID0gdGhpcy5pbnRlZ3JhdGVSZW5kZXJlcihcbiAgICAgIG1hbmFnZXIuZ2V0KCdlbGVtZW50JyksXG4gICAgICBtYW5hZ2VyLmdldCgnc2NlbmUnKSxcbiAgICAgIG1hbmFnZXIuZ2V0KCdjYW1lcmEnKS5uYXRpdmVcbiAgICApO1xuXG4gICAgbWFuYWdlci51cGRhdGUoe1xuICAgICAgZWxlbWVudDogZWxlbWVudCA9PiB7XG4gICAgICAgIHRoaXMuYXR0YWNoVG9DYW52YXMoZWxlbWVudCk7XG4gICAgICB9LFxuICAgICAgc2NlbmU6IHNjZW5lID0+IHtcbiAgICAgICAgdGhpcy5zY2VuZSA9IHNjZW5lO1xuICAgICAgfSxcbiAgICAgIGNhbWVyYTogY2FtZXJhID0+IHtcbiAgICAgICAgdGhpcy5jYW1lcmEgPSBjYW1lcmEubmF0aXZlO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgaW50ZWdyYXRlKHNlbGYpIHtcbiAgICBzZWxmLnJlbmRlckxvb3Auc3RhcnQodGhpcyk7XG4gICAgc2VsZi5lZmZlY3RzLmZvckVhY2gobG9vcCA9PiBsb29wLnN0YXJ0KHRoaXMpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGRpc3Bvc2VcbiAgICogQGRlc2NyaXB0aW9uIERpc3Bvc2UgcmVuZGVyaW5nIGNvbnRleHRcbiAgICogQG1lbWJlcm9mIG1vZHVsZTptb2R1bGVzL2FwcC5SZW5kZXJpbmdNb2R1bGVcbiAgICovXG4gIGRpc3Bvc2UoKSB7XG4gICAgdGhpcy5zdG9wKCk7XG4gICAgdGhpcy5yZW5kZXJlci5mb3JjZUNvbnRleHRMb3NzKCk7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIFNjZW5lLFxufSBmcm9tICd0aHJlZSc7XG5cbmNvbnN0IFNZTUJPTF9DSElMRFJFTl9GT1JfU0NFTkUgPSBTeW1ib2woJ1NZTUJPTF9DSElMRFJFTl9GT1JfU0NFTkUnKVxuXG4vKipcbiAqIEBjbGFzcyBTY2VuZU1vZHVsZVxuICogQGNhdGVnb3J5IG1vZHVsZXMvYXBwXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFt3aWxsU2NlbmVCZVJlcGxhY2VkPWZhbHNlXSB3aWxsU2NlbmVCZVJlcGxhY2VkIHNob3VsZCBiZSB0cnVlIG9ubHkgaWYgeW91IGFyZSBnb2luZyB0byBvdmVyd3JpdGUgc2NlbmUgZGVwZW5kZW5jeSBldmVuIHdpdGhvdXQgdGhlIHVzZSBvZiBkZWZhdWx0IG9uZS5cbiAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9hcHBcbiAqL1xuZXhwb3J0IGNsYXNzIFNjZW5lTW9kdWxlIHtcbiAgY29uc3RydWN0b3Iod2lsbFNjZW5lQmVSZXBsYWNlZCA9IGZhbHNlKSB7XG4gICAgdGhpcy5zY2VuZSA9IHdpbGxTY2VuZUJlUmVwbGFjZWQgPyBudWxsIDogbmV3IFNjZW5lKCk7XG4gIH1cblxuICBtYW5hZ2VyKG1hbmFnZXIpIHtcbiAgICBtYW5hZ2VyLnNldCgnc2NlbmUnLCB0aGlzLnNjZW5lKTtcbiAgfVxuXG4gIGludGVncmF0ZShzZWxmKSB7XG4gICAgT2JqZWN0LmFzc2lnbihcbiAgICAgIHRoaXMsXG4gICAgICB7XG4gICAgICAgIGFzeW5jIGFkZChvYmplY3QpIHtcbiAgICAgICAgICBpZiAob2JqZWN0LnBhcmVudCkgYXdhaXQgb2JqZWN0LnBhcmVudC5yZW1vdmUob2JqZWN0KTtcbiAgICAgIFxuICAgICAgICAgIGF3YWl0IG9iamVjdC53YWl0KCk7XG4gICAgICBcbiAgICAgICAgICBpZiAoIW9iamVjdC5uYXRpdmUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBDb21wb3NpdGlvbkVycm9yKFxuICAgICAgICAgICAgICAnU2NlbmVNb2R1bGUnLFxuICAgICAgICAgICAgICAndGhlcmUgaXMgbm8gb2JqZWN0Lm5hdGl2ZScsXG4gICAgICAgICAgICAgIHRoaXNcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgXG4gICAgICAgICAgb2JqZWN0LnBhcmVudCA9IHRoaXM7XG4gICAgICAgICAgYXdhaXQgdGhpcy5hcHBseUJyaWRnZSh7b25BZGQ6IG9iamVjdH0pLm9uQWRkO1xuICAgICAgICAgIHNlbGYuc2NlbmUuYWRkKG9iamVjdC5uYXRpdmUpO1xuICAgICAgICAgIHRoaXMuY2hpbGRyZW4ucHVzaChvYmplY3QpO1xuICAgICAgXG4gICAgICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICAgICAgfSxcbiAgICAgICAgYXN5bmMgcmVtb3ZlKG9iamVjdCkge1xuICAgICAgICAgIGlmIChvYmplY3QucGFyZW50ICE9PSB0aGlzKSByZXR1cm47XG4gICAgICBcbiAgICAgICAgICBhd2FpdCBvYmplY3Qud2FpdCgpO1xuICAgICAgICAgIHRoaXMuYXBwbHlCcmlkZ2Uoe29uUmVtb3ZlOiBvYmplY3R9KTtcbiAgICAgIFxuICAgICAgICAgIG9iamVjdC5wYXJlbnQgPSBudWxsO1xuICAgICAgICAgIHNlbGYuc2NlbmUucmVtb3ZlKG9iamVjdC5uYXRpdmUpO1xuICAgICAgICAgIHRoaXMuY2hpbGRyZW4uc3BsaWNlKHRoaXMuY2hpbGRyZW4uaW5kZXhPZihvYmplY3QpLCAxKTtcbiAgICAgICAgfSxcbiAgICAgICAgX3NldFNjZW5lKHNjZW5lKSB7XG4gICAgICAgICAgdGhpcy5jaGlsZHJlbiA9IHNjZW5lW1NZTUJPTF9DSElMRFJFTl9GT1JfU0NFTkVdID0gc2NlbmVbU1lNQk9MX0NISUxEUkVOX0ZPUl9TQ0VORV0gfHwgW11cbiAgICAgICAgICBzZWxmLnNjZW5lID0gc2NlbmU7XG4gICAgICAgIH0sXG4gICAgICAgIHNldFNjZW5lKHNjZW5lKSB7XG4gICAgICAgICAgdGhpcy5fc2V0U2NlbmUoc2NlbmUpO1xuICAgICAgICAgIHRoaXMubWFuYWdlci5zZXQoJ3NjZW5lJywgc2NlbmUpO1xuICAgICAgICB9LFxuICAgICAgICBnZXRTY2VuZSgpIHtcbiAgICAgICAgICByZXR1cm4gc2VsZi5zY2VuZTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgKTtcbiAgICBpZiAoc2VsZi5zY2VuZSkgdGhpcy5fc2V0U2NlbmUoc2VsZi5zY2VuZSk7XG4gIH1cbn1cbiIsIi8vIGltcG9ydCB7YWRkUmVzaXplTGlzdGVuZXJ9IGZyb20gJ2RldGVjdC1lbGVtZW50LXJlc2l6ZSc7XG5cbi8qKlxuICogQGNsYXNzIFJlc2l6ZU1vZHVsZVxuICogQGNhdGVnb3J5IG1vZHVsZXMvYXBwXG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtcz17YXV0bzogdHJ1ZX1dIC0gSWYgYXV0byBpcyBzZXQgdG8gdHJ1ZSAtIHJlc2l6ZSB3aWxsIGJlIHRyaWdnZXJlZCB3aGVuIGNvbnRhaW5lciByZXNpemVzXG4gKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwXG4gKi9cbmV4cG9ydCBjbGFzcyBSZXNpemVNb2R1bGUge1xuICBjb25zdHJ1Y3RvcihwYXJhbXMgPSB7fSkge1xuICAgIHRoaXMucGFyYW1zID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICBhdXRvOiB0cnVlXG4gICAgfSwgcGFyYW1zKTtcblxuICAgIHRoaXMuY2FsbGJhY2tzID0gW3RoaXMuc2V0U2l6ZS5iaW5kKHRoaXMpXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZnVuY3Rpb24gc2V0U2l6ZVxuICAgKiBAaW5zdGFuY2VcbiAgICogQGRlc2NyaXB0aW9uIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgcHJvdmlkZWQgd2lkdGggJiBoZWlnaHQgdG8gdGhlIHJlbmRlcmVyIG9iamVjdC5cbiAgICogQHBhcmFtIHtOdW1iZXJ9IFt3aWR0aD0xXSAtIFRoZSBwcm9taXNlIHRoYXQgc2hvdWxkIGJlIGFkZGVkIHRvIGEgcXVldWUuXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbaGVpZ2h0PTFdIC0gdGhhdCBpcyByZXNvbHZlZCB3aGVuIGFsbCBwcm9taXNlcyBjb21wbGV0ZWQuXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9hcHAuUmVzaXplTW9kdWxlXG4gICAqL1xuICBzZXRTaXplKHdpZHRoID0gMSwgaGVpZ2h0ID0gMSkge1xuICAgIHRoaXMuY2FtZXJhLm5hdGl2ZS5hc3BlY3QgPSB3aWR0aCAvIGhlaWdodDtcbiAgICB0aGlzLmNhbWVyYS5uYXRpdmUudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xuXG4gICAgaWYgKHRoaXMucmVuZGVyaW5nKSB0aGlzLnJlbmRlcmluZy5zZXRTaXplKHdpZHRoLCBoZWlnaHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgdHJpZ2dlclxuICAgKiBAaW5zdGFuY2VcbiAgICogQGRlc2NyaXB0aW9uIFRyaWdnZXJzIHJlc2l6ZSB3aGVuIGNhbGxlZC4gd2lkdGggJiBoZWlnaHQgYXJlIGRldGVybWluZWQgYXV0b21hdGljYWxseVxuICAgKiBUaGlzIGludm9rZXMgZWFjaCBjYWxsYmFja3Mgd2l0aCB0aGUgbmV3IHdpZHRoIGFuZCBoZWlnaHQgYXMgcGFyYW1zXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9hcHAuUmVzaXplTW9kdWxlXG4gICAqL1xuICB0cmlnZ2VyKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGNvbnRhaW5lcjoge1xuICAgICAgICBvZmZzZXRXaWR0aCxcbiAgICAgICAgb2Zmc2V0SGVpZ2h0XG4gICAgICB9LFxuICAgICAgcmVzb2x1dGlvblxuICAgIH0gPSB0aGlzO1xuXG4gICAgY29uc3Qgd2lkdGggPSBOdW1iZXIob2Zmc2V0V2lkdGggKiByZXNvbHV0aW9uLngpLnRvRml4ZWQoKTtcbiAgICBjb25zdCBoZWlnaHQgPSBOdW1iZXIob2Zmc2V0SGVpZ2h0ICogcmVzb2x1dGlvbi55KS50b0ZpeGVkKCk7XG5cbiAgICB0aGlzLmNhbGxiYWNrcy5mb3JFYWNoKGNiID0+IHtcbiAgICAgIGNiKHdpZHRoLCBoZWlnaHQpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgYWRkQXV0b3Jlc2l6ZVxuICAgKiBAaW5zdGFuY2VcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgbW9kdWxlIHRvIGF1dG9yZXNpemUsIHRoaXMgYWRkcyBhbiBldmVudCBsaXN0ZW5lIG9uIHdpbmRvdyByZXNpemUgdG8gdHJpZ2dlciB0aGUgcmVzaXplXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9hcHAuUmVzaXplTW9kdWxlXG4gICAqL1xuICBhZGRBdXRvcmVzaXplKCkge1xuICAgIHRoaXMuY29udGFpbmVyID0gdGhpcy5nZXRDb250YWluZXIoKTtcbiAgICB0aGlzLnJlc29sdXRpb24gPSB0aGlzLmdldFJlc29sdXRpb24oKTtcblxuICAgIGlmICh0aGlzLnBhcmFtcy5hdXRvKSB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy50cmlnZ2VyLmJpbmQodGhpcykpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgYWRkQ2FsbGJhY2tcbiAgICogQGluc3RhbmNlXG4gICAqIEBkZXNjcmlwdGlvbiBBZGRzIGEgY2FsbCBiYWNrIGZ1bmN0aW9uIHRvIHRoZSBleGlzdGluZyBjYWxsYmFja3MgbGlzdC5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyAtIFRoZSBjYWxsYmFjayBmdW5jdGlvbiB0byBhZGRcbiAgICogQG1lbWJlcm9mIG1vZHVsZTptb2R1bGVzL2FwcC5SZXNpemVNb2R1bGVcbiAgICovXG4gIGFkZENhbGxiYWNrKGZ1bmMpIHtcbiAgICB0aGlzLmNhbGxiYWNrcy5wdXNoKGZ1bmMpO1xuICB9XG5cbiAgbWFuYWdlcihtYW5hZ2VyKSB7XG4gICAgbWFuYWdlci5kZWZpbmUoJ3Jlc2l6ZScpO1xuXG4gICAgdGhpcy5yZW5kZXJpbmcgPSBtYW5hZ2VyLmdldCgncmVuZGVyZXInKTtcbiAgICB0aGlzLmNhbWVyYSA9IG1hbmFnZXIuZ2V0KCdjYW1lcmEnKTtcblxuICAgIHRoaXMuZ2V0UmVzb2x1dGlvbiA9ICgpID0+IG1hbmFnZXIudXNlKCdyZW5kZXJpbmcnKS5wYXJhbXMucmVzb2x1dGlvbjtcbiAgICB0aGlzLmdldENvbnRhaW5lciA9ICgpID0+IG1hbmFnZXIuZ2V0KCdjb250YWluZXInKTtcblxuICAgIG1hbmFnZXIudXBkYXRlKHtcbiAgICAgIGNvbnRhaW5lcjogY29udGFpbmVyID0+IHtcbiAgICAgICAgdGhpcy5jb250YWluZXIgPSBjb250YWluZXI7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLmFkZEF1dG9yZXNpemUoKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgU2hhZGVyTWF0ZXJpYWwsIFVuaWZvcm0gfSBmcm9tIFwidGhyZWVcIjtcclxuXHJcbmNvbnN0IGZyYWdtZW50ID0gXCJ1bmlmb3JtIHNhbXBsZXIyRCB0UHJldmlvdXNMdW07XFxyXFxudW5pZm9ybSBzYW1wbGVyMkQgdEN1cnJlbnRMdW07XFxyXFxudW5pZm9ybSBmbG9hdCBtaW5MdW1pbmFuY2U7XFxyXFxudW5pZm9ybSBmbG9hdCBkZWx0YTtcXHJcXG51bmlmb3JtIGZsb2F0IHRhdTtcXHJcXG5cXHJcXG52YXJ5aW5nIHZlYzIgdlV2O1xcclxcblxcclxcbnZvaWQgbWFpbigpIHtcXHJcXG5cXHJcXG5cXHRmbG9hdCBwcmV2aW91c0x1bSA9IHRleHR1cmUyRCh0UHJldmlvdXNMdW0sIHZVdiwgTUlQX0xFVkVMXzFYMSkucjtcXHJcXG5cXHRmbG9hdCBjdXJyZW50THVtID0gdGV4dHVyZTJEKHRDdXJyZW50THVtLCB2VXYsIE1JUF9MRVZFTF8xWDEpLnI7XFxyXFxuXFxyXFxuXFx0cHJldmlvdXNMdW0gPSBtYXgobWluTHVtaW5hbmNlLCBwcmV2aW91c0x1bSk7XFxyXFxuXFx0Y3VycmVudEx1bSA9IG1heChtaW5MdW1pbmFuY2UsIGN1cnJlbnRMdW0pO1xcclxcblxcclxcblxcdC8vIEFkYXB0IHRoZSBsdW1pbmFuY2UgdXNpbmcgUGF0dGFuYWlrJ3MgdGVjaG5pcXVlLlxcclxcblxcdGZsb2F0IGFkYXB0ZWRMdW0gPSBwcmV2aW91c0x1bSArIChjdXJyZW50THVtIC0gcHJldmlvdXNMdW0pICogKDEuMCAtIGV4cCgtZGVsdGEgKiB0YXUpKTtcXHJcXG5cXHJcXG5cXHRnbF9GcmFnQ29sb3IuciA9IGFkYXB0ZWRMdW07XFxyXFxuXFxyXFxufVxcclxcblwiO1xyXG5jb25zdCB2ZXJ0ZXggPSBcInZhcnlpbmcgdmVjMiB2VXY7XFxyXFxuXFxyXFxudm9pZCBtYWluKCkge1xcclxcblxcclxcblxcdHZVdiA9IHV2O1xcclxcblxcdGdsX1Bvc2l0aW9uID0gcHJvamVjdGlvbk1hdHJpeCAqIG1vZGVsVmlld01hdHJpeCAqIHZlYzQocG9zaXRpb24sIDEuMCk7XFxyXFxuXFxyXFxufVxcclxcblwiO1xyXG5cclxuLyoqXHJcbiAqIEFuIGFkYXB0aXZlIGx1bWlub3NpdHkgc2hhZGVyIG1hdGVyaWFsLlxyXG4gKi9cclxuXHJcbmV4cG9ydCBjbGFzcyBBZGFwdGl2ZUx1bWlub3NpdHlNYXRlcmlhbCBleHRlbmRzIFNoYWRlck1hdGVyaWFsIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBhZGFwdGl2ZSBsdW1pbm9zaXR5IG1hdGVyaWFsLlxyXG5cdCAqL1xyXG5cclxuXHRjb25zdHJ1Y3RvcigpIHtcclxuXHJcblx0XHRzdXBlcih7XHJcblxyXG5cdFx0XHR0eXBlOiBcIkFkYXB0aXZlTHVtaW5vc2l0eU1hdGVyaWFsXCIsXHJcblxyXG5cdFx0XHRkZWZpbmVzOiB7XHJcblxyXG5cdFx0XHRcdE1JUF9MRVZFTF8xWDE6IFwiMC4wXCJcclxuXHJcblx0XHRcdH0sXHJcblxyXG5cdFx0XHR1bmlmb3Jtczoge1xyXG5cclxuXHRcdFx0XHR0UHJldmlvdXNMdW06IG5ldyBVbmlmb3JtKG51bGwpLFxyXG5cdFx0XHRcdHRDdXJyZW50THVtOiBuZXcgVW5pZm9ybShudWxsKSxcclxuXHRcdFx0XHRtaW5MdW1pbmFuY2U6IG5ldyBVbmlmb3JtKDAuMDEpLFxyXG5cdFx0XHRcdGRlbHRhOiBuZXcgVW5pZm9ybSgwLjApLFxyXG5cdFx0XHRcdHRhdTogbmV3IFVuaWZvcm0oMS4wKVxyXG5cclxuXHRcdFx0fSxcclxuXHJcblx0XHRcdGZyYWdtZW50U2hhZGVyOiBmcmFnbWVudCxcclxuXHRcdFx0dmVydGV4U2hhZGVyOiB2ZXJ0ZXgsXHJcblxyXG5cdFx0XHRkZXB0aFdyaXRlOiBmYWxzZSxcclxuXHRcdFx0ZGVwdGhUZXN0OiBmYWxzZVxyXG5cclxuXHRcdH0pO1xyXG5cclxuXHR9XHJcblxyXG59XHJcbiIsImltcG9ydCB7IFNoYWRlck1hdGVyaWFsLCBVbmlmb3JtIH0gZnJvbSBcInRocmVlXCI7XHJcblxyXG5jb25zdCBmcmFnbWVudCA9IFwidW5pZm9ybSBzYW1wbGVyMkQgdERpZmZ1c2U7XFxyXFxudW5pZm9ybSBzYW1wbGVyMkQgdERlcHRoO1xcclxcblxcclxcbnVuaWZvcm0gZmxvYXQgZm9jdXM7XFxyXFxudW5pZm9ybSBmbG9hdCBkb2Y7XFxyXFxudW5pZm9ybSBmbG9hdCBhc3BlY3Q7XFxyXFxudW5pZm9ybSBmbG9hdCBhcGVydHVyZTtcXHJcXG51bmlmb3JtIGZsb2F0IG1heEJsdXI7XFxyXFxuXFxyXFxudmFyeWluZyB2ZWMyIHZVdjtcXHJcXG5cXHJcXG4jaWZuZGVmIFVTRV9MT0dERVBUSEJVRlxcclxcblxcclxcblxcdCNpbmNsdWRlIDxwYWNraW5nPlxcclxcblxcclxcblxcdHVuaWZvcm0gZmxvYXQgY2FtZXJhTmVhcjtcXHJcXG5cXHR1bmlmb3JtIGZsb2F0IGNhbWVyYUZhcjtcXHJcXG5cXHJcXG5cXHRmbG9hdCByZWFkRGVwdGgoc2FtcGxlcjJEIGRlcHRoU2FtcGxlciwgdmVjMiBjb29yZCkge1xcclxcblxcclxcblxcdFxcdGZsb2F0IGZyYWdDb29yZFogPSB0ZXh0dXJlMkQoZGVwdGhTYW1wbGVyLCBjb29yZCkueDtcXHJcXG5cXHRcXHRmbG9hdCB2aWV3WiA9IHBlcnNwZWN0aXZlRGVwdGhUb1ZpZXdaKGZyYWdDb29yZFosIGNhbWVyYU5lYXIsIGNhbWVyYUZhcik7XFxyXFxuXFxyXFxuXFx0XFx0cmV0dXJuIHZpZXdaVG9PcnRob2dyYXBoaWNEZXB0aCh2aWV3WiwgY2FtZXJhTmVhciwgY2FtZXJhRmFyKTtcXHJcXG5cXHJcXG5cXHR9XFxyXFxuXFxyXFxuI2VuZGlmXFxyXFxuXFxyXFxudm9pZCBtYWluKCkge1xcclxcblxcclxcblxcdHZlYzIgYXNwZWN0Q29ycmVjdGlvbiA9IHZlYzIoMS4wLCBhc3BlY3QpO1xcclxcblxcclxcblxcdCNpZmRlZiBVU0VfTE9HREVQVEhCVUZcXHJcXG5cXHJcXG5cXHRcXHRmbG9hdCBkZXB0aCA9IHRleHR1cmUyRCh0RGVwdGgsIHZVdikueDtcXHJcXG5cXHJcXG5cXHQjZWxzZVxcclxcblxcclxcblxcdFxcdGZsb2F0IGRlcHRoID0gcmVhZERlcHRoKHREZXB0aCwgdlV2KTtcXHJcXG5cXHJcXG5cXHQjZW5kaWZcXHJcXG5cXHJcXG5cXHRmbG9hdCBmb2N1c05lYXIgPSBjbGFtcChmb2N1cyAtIGRvZiwgMC4wLCAxLjApO1xcclxcblxcdGZsb2F0IGZvY3VzRmFyID0gY2xhbXAoZm9jdXMgKyBkb2YsIDAuMCwgMS4wKTtcXHJcXG5cXHJcXG5cXHQvLyBDYWxjdWxhdGUgYSBEb0YgbWFzay5cXHJcXG5cXHRmbG9hdCBsb3cgPSBzdGVwKGRlcHRoLCBmb2N1c05lYXIpO1xcclxcblxcdGZsb2F0IGhpZ2ggPSBzdGVwKGZvY3VzRmFyLCBkZXB0aCk7XFxyXFxuXFxyXFxuXFx0ZmxvYXQgZmFjdG9yID0gKGRlcHRoIC0gZm9jdXNOZWFyKSAqIGxvdyArIChkZXB0aCAtIGZvY3VzRmFyKSAqIGhpZ2g7XFxyXFxuXFxyXFxuXFx0dmVjMiBkb2ZCbHVyID0gdmVjMihjbGFtcChmYWN0b3IgKiBhcGVydHVyZSwgLW1heEJsdXIsIG1heEJsdXIpKTtcXHJcXG5cXHJcXG5cXHR2ZWMyIGRvZmJsdXI5ID0gZG9mQmx1ciAqIDAuOTtcXHJcXG5cXHR2ZWMyIGRvZmJsdXI3ID0gZG9mQmx1ciAqIDAuNztcXHJcXG5cXHR2ZWMyIGRvZmJsdXI0ID0gZG9mQmx1ciAqIDAuNDtcXHJcXG5cXHJcXG5cXHR2ZWM0IGNvbG9yID0gdmVjNCgwLjApO1xcclxcblxcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2KTtcXHJcXG5cXHRjb2xvciArPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdiArICh2ZWMyKCAwLjAsICAgMC40ICkgKiBhc3BlY3RDb3JyZWN0aW9uKSAqIGRvZkJsdXIpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoIDAuMTUsICAwLjM3KSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mQmx1cik7XFxyXFxuXFx0Y29sb3IgKz0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYgKyAodmVjMiggMC4yOSwgIDAuMjkpICogYXNwZWN0Q29ycmVjdGlvbikgKiBkb2ZCbHVyKTtcXHJcXG5cXHRjb2xvciArPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdiArICh2ZWMyKC0wLjM3LCAgMC4xNSkgKiBhc3BlY3RDb3JyZWN0aW9uKSAqIGRvZkJsdXIpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoIDAuNDAsICAwLjAgKSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mQmx1cik7XFxyXFxuXFx0Y29sb3IgKz0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYgKyAodmVjMiggMC4zNywgLTAuMTUpICogYXNwZWN0Q29ycmVjdGlvbikgKiBkb2ZCbHVyKTtcXHJcXG5cXHRjb2xvciArPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdiArICh2ZWMyKCAwLjI5LCAtMC4yOSkgKiBhc3BlY3RDb3JyZWN0aW9uKSAqIGRvZkJsdXIpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoLTAuMTUsIC0wLjM3KSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mQmx1cik7XFxyXFxuXFx0Y29sb3IgKz0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYgKyAodmVjMiggMC4wLCAgLTAuNCApICogYXNwZWN0Q29ycmVjdGlvbikgKiBkb2ZCbHVyKTtcXHJcXG5cXHRjb2xvciArPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdiArICh2ZWMyKC0wLjE1LCAgMC4zNykgKiBhc3BlY3RDb3JyZWN0aW9uKSAqIGRvZkJsdXIpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoLTAuMjksICAwLjI5KSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mQmx1cik7XFxyXFxuXFx0Y29sb3IgKz0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYgKyAodmVjMiggMC4zNywgIDAuMTUpICogYXNwZWN0Q29ycmVjdGlvbikgKiBkb2ZCbHVyKTtcXHJcXG5cXHRjb2xvciArPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdiArICh2ZWMyKC0wLjQsICAgMC4wICkgKiBhc3BlY3RDb3JyZWN0aW9uKSAqIGRvZkJsdXIpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoLTAuMzcsIC0wLjE1KSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mQmx1cik7XFxyXFxuXFx0Y29sb3IgKz0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYgKyAodmVjMigtMC4yOSwgLTAuMjkpICogYXNwZWN0Q29ycmVjdGlvbikgKiBkb2ZCbHVyKTtcXHJcXG5cXHRjb2xvciArPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdiArICh2ZWMyKCAwLjE1LCAtMC4zNykgKiBhc3BlY3RDb3JyZWN0aW9uKSAqIGRvZkJsdXIpO1xcclxcblxcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoIDAuMTUsICAwLjM3KSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjkpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoLTAuMzcsICAwLjE1KSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjkpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoIDAuMzcsIC0wLjE1KSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjkpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoLTAuMTUsIC0wLjM3KSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjkpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoLTAuMTUsICAwLjM3KSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjkpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoIDAuMzcsICAwLjE1KSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjkpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoLTAuMzcsIC0wLjE1KSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjkpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoIDAuMTUsIC0wLjM3KSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjkpO1xcclxcblxcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoIDAuMjksICAwLjI5KSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjcpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoIDAuNDAsICAwLjAgKSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjcpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoIDAuMjksIC0wLjI5KSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjcpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoIDAuMCwgIC0wLjQgKSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjcpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoLTAuMjksICAwLjI5KSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjcpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoLTAuNCwgICAwLjAgKSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjcpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoLTAuMjksIC0wLjI5KSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjcpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoIDAuMCwgICAwLjQgKSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjcpO1xcclxcblxcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoIDAuMjksICAwLjI5KSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjQpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoIDAuNCwgICAwLjAgKSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjQpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoIDAuMjksIC0wLjI5KSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjQpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoIDAuMCwgIC0wLjQgKSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjQpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoLTAuMjksICAwLjI5KSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjQpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoLTAuNCwgICAwLjAgKSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjQpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoLTAuMjksIC0wLjI5KSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjQpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoIDAuMCwgICAwLjQgKSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjQpO1xcclxcblxcclxcblxcdGdsX0ZyYWdDb2xvciA9IGNvbG9yIC8gNDEuMDtcXHJcXG5cXHJcXG59XFxyXFxuXCI7XHJcbmNvbnN0IHZlcnRleCA9IFwidmFyeWluZyB2ZWMyIHZVdjtcXHJcXG5cXHJcXG52b2lkIG1haW4oKSB7XFxyXFxuXFxyXFxuXFx0dlV2ID0gdXY7XFxyXFxuXFx0Z2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbW9kZWxWaWV3TWF0cml4ICogdmVjNChwb3NpdGlvbiwgMS4wKTtcXHJcXG5cXHJcXG59XFxyXFxuXCI7XHJcblxyXG4vKipcclxuICogRGVwdGggb2YgRmllbGQgc2hhZGVyIChCb2tlaCkuXHJcbiAqXHJcbiAqIE9yaWdpbmFsIHNoYWRlciBjb2RlIGJ5IE1hcnRpbnMgVXBpdGlzOlxyXG4gKiAgaHR0cDovL2FydG1hcnRpbnNoLmJsb2dzcG90LmNvbS8yMDEwLzAyL2dsc2wtbGVucy1ibHVyLWZpbHRlci13aXRoLWJva2VoLmh0bWxcclxuICovXHJcblxyXG5leHBvcnQgY2xhc3MgQm9rZWhNYXRlcmlhbCBleHRlbmRzIFNoYWRlck1hdGVyaWFsIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBib2tlaCBtYXRlcmlhbC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UGVyc3BlY3RpdmVDYW1lcmF9IFtjYW1lcmFdIC0gQSBjYW1lcmEuXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIFRoZSBvcHRpb25zLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5mb2N1cz0xLjBdIC0gVGhlIGZvY3VzIGRpc3RhbmNlLCBjb3JyZXNwb25kcyBkaXJlY3RseSB3aXRoIHRoZSBzY2VuZSBkZXB0aC5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuZG9mPTAuMDJdIC0gRGVwdGggb2YgZmllbGQuIEFuIGFyZWEgaW4gZnJvbnQgb2YgYW5kIGJlaGluZCB0aGUgZm9jdXMgcG9pbnQgdGhhdCBzdGlsbCBhcHBlYXJzIHNoYXJwLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5hcGVydHVyZT0wLjAyNV0gLSBDYW1lcmEgYXBlcnR1cmUgc2NhbGUuIEJpZ2dlciB2YWx1ZXMgZm9yIHN0cm9uZ2VyIGJsdXIgYW5kIHNoYWxsb3dlciBkZXB0aCBvZiBmaWVsZC5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMubWF4Qmx1cj0xLjBdIC0gTWF4aW11bSBibHVyIHN0cmVuZ3RoLlxyXG5cdCAqL1xyXG5cclxuXHRjb25zdHJ1Y3RvcihjYW1lcmEsIG9wdGlvbnMgPSB7fSkge1xyXG5cclxuXHRcdGNvbnN0IHNldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7XHJcblx0XHRcdGZvY3VzOiAxLjAsXHJcblx0XHRcdGRvZjogMC4wMixcclxuXHRcdFx0YXBlcnR1cmU6IDAuMDI1LFxyXG5cdFx0XHRtYXhCbHVyOiAxLjBcclxuXHRcdH0sIG9wdGlvbnMpO1xyXG5cclxuXHRcdHN1cGVyKHtcclxuXHJcblx0XHRcdHR5cGU6IFwiQm9rZWhNYXRlcmlhbFwiLFxyXG5cclxuXHRcdFx0dW5pZm9ybXM6IHtcclxuXHJcblx0XHRcdFx0Y2FtZXJhTmVhcjogbmV3IFVuaWZvcm0oMC4xKSxcclxuXHRcdFx0XHRjYW1lcmFGYXI6IG5ldyBVbmlmb3JtKDIwMDApLFxyXG5cdFx0XHRcdGFzcGVjdDogbmV3IFVuaWZvcm0oMS4wKSxcclxuXHJcblx0XHRcdFx0dERpZmZ1c2U6IG5ldyBVbmlmb3JtKG51bGwpLFxyXG5cdFx0XHRcdHREZXB0aDogbmV3IFVuaWZvcm0obnVsbCksXHJcblxyXG5cdFx0XHRcdGZvY3VzOiBuZXcgVW5pZm9ybShzZXR0aW5ncy5mb2N1cyksXHJcblx0XHRcdFx0ZG9mOiBuZXcgVW5pZm9ybShzZXR0aW5ncy5kb2YpLFxyXG5cdFx0XHRcdGFwZXJ0dXJlOiBuZXcgVW5pZm9ybShzZXR0aW5ncy5hcGVydHVyZSksXHJcblx0XHRcdFx0bWF4Qmx1cjogbmV3IFVuaWZvcm0oc2V0dGluZ3MubWF4Qmx1cilcclxuXHJcblx0XHRcdH0sXHJcblxyXG5cdFx0XHRmcmFnbWVudFNoYWRlcjogZnJhZ21lbnQsXHJcblx0XHRcdHZlcnRleFNoYWRlcjogdmVydGV4LFxyXG5cclxuXHRcdFx0ZGVwdGhXcml0ZTogZmFsc2UsXHJcblx0XHRcdGRlcHRoVGVzdDogZmFsc2VcclxuXHJcblx0XHR9KTtcclxuXHJcblx0XHR0aGlzLmFkb3B0Q2FtZXJhU2V0dGluZ3MoY2FtZXJhKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBZG9wdHMgdGhlIHNldHRpbmdzIG9mIHRoZSBnaXZlbiBjYW1lcmEuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1BlcnNwZWN0aXZlQ2FtZXJhfSBbY2FtZXJhPW51bGxdIC0gQSBjYW1lcmEuXHJcblx0ICovXHJcblxyXG5cdGFkb3B0Q2FtZXJhU2V0dGluZ3MoY2FtZXJhID0gbnVsbCkge1xyXG5cclxuXHRcdGlmKGNhbWVyYSAhPT0gbnVsbCkge1xyXG5cclxuXHRcdFx0dGhpcy51bmlmb3Jtcy5jYW1lcmFOZWFyLnZhbHVlID0gY2FtZXJhLm5lYXI7XHJcblx0XHRcdHRoaXMudW5pZm9ybXMuY2FtZXJhRmFyLnZhbHVlID0gY2FtZXJhLmZhcjtcclxuXHRcdFx0dGhpcy51bmlmb3Jtcy5hc3BlY3QudmFsdWUgPSBjYW1lcmEuYXNwZWN0O1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxufVxyXG4iLCJpbXBvcnQgeyBTaGFkZXJNYXRlcmlhbCwgVW5pZm9ybSwgVmVjdG9yMiB9IGZyb20gXCJ0aHJlZVwiO1xyXG5cclxuY29uc3QgZnJhZ21lbnQgPSBcInVuaWZvcm0gc2FtcGxlcjJEIHREaWZmdXNlO1xcclxcblxcclxcbnZhcnlpbmcgdmVjMiB2VXY7XFxyXFxudmFyeWluZyB2ZWM0IHZPZmZzZXRbM107XFxyXFxuXFxyXFxudm9pZCBtYWluKCkge1xcclxcblxcclxcblxcdGNvbnN0IHZlYzIgdGhyZXNob2xkID0gdmVjMihFREdFX1RIUkVTSE9MRCk7XFxyXFxuXFxyXFxuXFx0Ly8gQ2FsY3VsYXRlIGNvbG9yIGRlbHRhcy5cXHJcXG5cXHR2ZWM0IGRlbHRhO1xcclxcblxcdHZlYzMgYyA9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2KS5yZ2I7XFxyXFxuXFxyXFxuXFx0dmVjMyBjTGVmdCA9IHRleHR1cmUyRCh0RGlmZnVzZSwgdk9mZnNldFswXS54eSkucmdiO1xcclxcblxcdHZlYzMgdCA9IGFicyhjIC0gY0xlZnQpO1xcclxcblxcdGRlbHRhLnggPSBtYXgobWF4KHQuciwgdC5nKSwgdC5iKTtcXHJcXG5cXHJcXG5cXHR2ZWMzIGNUb3AgPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZPZmZzZXRbMF0uencpLnJnYjtcXHJcXG5cXHR0ID0gYWJzKGMgLSBjVG9wKTtcXHJcXG5cXHRkZWx0YS55ID0gbWF4KG1heCh0LnIsIHQuZyksIHQuYik7XFxyXFxuXFxyXFxuXFx0Ly8gV2UgZG8gdGhlIHVzdWFsIHRocmVzaG9sZC5cXHJcXG5cXHR2ZWMyIGVkZ2VzID0gc3RlcCh0aHJlc2hvbGQsIGRlbHRhLnh5KTtcXHJcXG5cXHJcXG5cXHQvLyBUaGVuIGRpc2NhcmQgaWYgdGhlcmUgaXMgbm8gZWRnZS5cXHJcXG5cXHRpZihkb3QoZWRnZXMsIHZlYzIoMS4wKSkgPT0gMC4wKSB7XFxyXFxuXFxyXFxuXFx0XFx0ZGlzY2FyZDtcXHJcXG5cXHJcXG5cXHR9XFxyXFxuXFxyXFxuXFx0Ly8gQ2FsY3VsYXRlIHJpZ2h0IGFuZCBib3R0b20gZGVsdGFzLlxcclxcblxcdHZlYzMgY1JpZ2h0ID0gdGV4dHVyZTJEKHREaWZmdXNlLCB2T2Zmc2V0WzFdLnh5KS5yZ2I7XFxyXFxuXFx0dCA9IGFicyhjIC0gY1JpZ2h0KTtcXHJcXG5cXHRkZWx0YS56ID0gbWF4KG1heCh0LnIsIHQuZyksIHQuYik7XFxyXFxuXFxyXFxuXFx0dmVjMyBjQm90dG9tID0gdGV4dHVyZTJEKHREaWZmdXNlLCB2T2Zmc2V0WzFdLnp3KS5yZ2I7XFxyXFxuXFx0dCA9IGFicyhjIC0gY0JvdHRvbSk7XFxyXFxuXFx0ZGVsdGEudyA9IG1heChtYXgodC5yLCB0LmcpLCB0LmIpO1xcclxcblxcclxcblxcdC8vIENhbGN1bGF0ZSB0aGUgbWF4aW11bSBkZWx0YSBpbiB0aGUgZGlyZWN0IG5laWdoYm9yaG9vZC5cXHJcXG5cXHRmbG9hdCBtYXhEZWx0YSA9IG1heChtYXgobWF4KGRlbHRhLngsIGRlbHRhLnkpLCBkZWx0YS56KSwgZGVsdGEudyk7XFxyXFxuXFxyXFxuXFx0Ly8gQ2FsY3VsYXRlIGxlZnQtbGVmdCBhbmQgdG9wLXRvcCBkZWx0YXMuXFxyXFxuXFx0dmVjMyBjTGVmdExlZnQgPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZPZmZzZXRbMl0ueHkpLnJnYjtcXHJcXG5cXHR0ID0gYWJzKGMgLSBjTGVmdExlZnQpO1xcclxcblxcdGRlbHRhLnogPSBtYXgobWF4KHQuciwgdC5nKSwgdC5iKTtcXHJcXG5cXHJcXG5cXHR2ZWMzIGNUb3BUb3AgPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZPZmZzZXRbMl0uencpLnJnYjtcXHJcXG5cXHR0ID0gYWJzKGMgLSBjVG9wVG9wKTtcXHJcXG5cXHRkZWx0YS53ID0gbWF4KG1heCh0LnIsIHQuZyksIHQuYik7XFxyXFxuXFxyXFxuXFx0Ly8gQ2FsY3VsYXRlIHRoZSBmaW5hbCBtYXhpbXVtIGRlbHRhLlxcclxcblxcdG1heERlbHRhID0gbWF4KG1heChtYXhEZWx0YSwgZGVsdGEueiksIGRlbHRhLncpO1xcclxcblxcclxcblxcdC8vIExvY2FsIGNvbnRyYXN0IGFkYXB0YXRpb24gaW4gYWN0aW9uLlxcclxcblxcdGVkZ2VzLnh5ICo9IHN0ZXAoMC41ICogbWF4RGVsdGEsIGRlbHRhLnh5KTtcXHJcXG5cXHJcXG5cXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KGVkZ2VzLCAwLjAsIDAuMCk7XFxyXFxuXFxyXFxufVxcclxcblwiO1xyXG5jb25zdCB2ZXJ0ZXggPSBcInVuaWZvcm0gdmVjMiB0ZXhlbFNpemU7XFxyXFxuXFxyXFxudmFyeWluZyB2ZWMyIHZVdjtcXHJcXG52YXJ5aW5nIHZlYzQgdk9mZnNldFszXTtcXHJcXG5cXHJcXG52b2lkIG1haW4oKSB7XFxyXFxuXFxyXFxuXFx0dlV2ID0gdXY7XFxyXFxuXFxyXFxuXFx0dk9mZnNldFswXSA9IHV2Lnh5eHkgKyB0ZXhlbFNpemUueHl4eSAqIHZlYzQoLTEuMCwgMC4wLCAwLjAsIDEuMCk7IC8vIENoYW5nZWQgc2lnbiBpbiBXIGNvbXBvbmVudC5cXHJcXG5cXHR2T2Zmc2V0WzFdID0gdXYueHl4eSArIHRleGVsU2l6ZS54eXh5ICogdmVjNCgxLjAsIDAuMCwgMC4wLCAtMS4wKTsgLy8gQ2hhbmdlZCBzaWduIGluIFcgY29tcG9uZW50LlxcclxcblxcdHZPZmZzZXRbMl0gPSB1di54eXh5ICsgdGV4ZWxTaXplLnh5eHkgKiB2ZWM0KC0yLjAsIDAuMCwgMC4wLCAyLjApOyAvLyBDaGFuZ2VkIHNpZ24gaW4gVyBjb21wb25lbnQuXFxyXFxuXFxyXFxuXFx0Z2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbW9kZWxWaWV3TWF0cml4ICogdmVjNChwb3NpdGlvbiwgMS4wKTtcXHJcXG5cXHJcXG59XFxyXFxuXCI7XHJcblxyXG4vKipcclxuICogQSBtYXRlcmlhbCB0aGF0IGRldGVjdHMgZWRnZXMgaW4gYSBjb2xvciB0ZXh0dXJlLlxyXG4gKlxyXG4gKiBNYWlubHkgdXNlZCBmb3IgU3VicGl4ZWwgTW9ycGhvbG9naWNhbCBBbnRpYWxpYXNpbmcuXHJcbiAqL1xyXG5cclxuZXhwb3J0IGNsYXNzIENvbG9yRWRnZXNNYXRlcmlhbCBleHRlbmRzIFNoYWRlck1hdGVyaWFsIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBjb2xvciBlZGdlcyBtYXRlcmlhbC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VmVjdG9yMn0gW3RleGVsU2l6ZV0gLSBUaGUgYWJzb2x1dGUgc2NyZWVuIHRleGVsIHNpemUuXHJcblx0ICovXHJcblxyXG5cdGNvbnN0cnVjdG9yKHRleGVsU2l6ZSA9IG5ldyBWZWN0b3IyKCkpIHtcclxuXHJcblx0XHRzdXBlcih7XHJcblxyXG5cdFx0XHR0eXBlOiBcIkNvbG9yRWRnZXNNYXRlcmlhbFwiLFxyXG5cclxuXHRcdFx0ZGVmaW5lczoge1xyXG5cclxuXHRcdFx0XHRFREdFX1RIUkVTSE9MRDogXCIwLjFcIlxyXG5cclxuXHRcdFx0fSxcclxuXHJcblx0XHRcdHVuaWZvcm1zOiB7XHJcblxyXG5cdFx0XHRcdHREaWZmdXNlOiBuZXcgVW5pZm9ybShudWxsKSxcclxuXHRcdFx0XHR0ZXhlbFNpemU6IG5ldyBVbmlmb3JtKHRleGVsU2l6ZSlcclxuXHJcblx0XHRcdH0sXHJcblxyXG5cdFx0XHRmcmFnbWVudFNoYWRlcjogZnJhZ21lbnQsXHJcblx0XHRcdHZlcnRleFNoYWRlcjogdmVydGV4LFxyXG5cclxuXHRcdFx0ZGVwdGhXcml0ZTogZmFsc2UsXHJcblx0XHRcdGRlcHRoVGVzdDogZmFsc2VcclxuXHJcblx0XHR9KTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBlZGdlIGRldGVjdGlvbiBzZW5zaXRpdml0eS5cclxuXHQgKlxyXG5cdCAqIEEgbG93ZXIgdmFsdWUgcmVzdWx0cyBpbiBtb3JlIGVkZ2VzIGJlaW5nIGRldGVjdGVkIGF0IHRoZSBleHBlbnNlIG9mXHJcblx0ICogcGVyZm9ybWFuY2UuXHJcblx0ICpcclxuXHQgKiAwLjEgaXMgYSByZWFzb25hYmxlIHZhbHVlLCBhbmQgYWxsb3dzIHRvIGNhdGNoIG1vc3QgdmlzaWJsZSBlZGdlcy5cclxuXHQgKiAwLjA1IGlzIGEgcmF0aGVyIG92ZXJraWxsIHZhbHVlLCB0aGF0IGFsbG93cyB0byBjYXRjaCAnZW0gYWxsLlxyXG5cdCAqXHJcblx0ICogSWYgdGVtcG9yYWwgc3VwZXJzYW1wbGluZyBpcyB1c2VkLCAwLjIgY291bGQgYmUgYSByZWFzb25hYmxlIHZhbHVlLFxyXG5cdCAqIGFzIGxvdyBjb250cmFzdCBlZGdlcyBhcmUgcHJvcGVybHkgZmlsdGVyZWQgYnkganVzdCAyeC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSB0aHJlc2hvbGQgLSBUaGUgZWRnZSBkZXRlY3Rpb24gc2Vuc2l0aXZpdHkuIFJhbmdlOiBbMCwgMC41XS5cclxuXHQgKi9cclxuXHJcblx0c2V0RWRnZURldGVjdGlvblRocmVzaG9sZCh0aHJlc2hvbGQpIHtcclxuXHJcblx0XHR0aGlzLmRlZmluZXMuRURHRV9USFJFU0hPTEQgPSB0aHJlc2hvbGQudG9GaXhlZChcIjJcIik7XHJcblxyXG5cdFx0dGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuIiwiaW1wb3J0IHsgU2hhZGVyTWF0ZXJpYWwsIFVuaWZvcm0gfSBmcm9tIFwidGhyZWVcIjtcclxuXHJcbmNvbnN0IGZyYWdtZW50ID0gXCJ1bmlmb3JtIHNhbXBsZXIyRCB0ZXh0dXJlMTtcXHJcXG51bmlmb3JtIHNhbXBsZXIyRCB0ZXh0dXJlMjtcXHJcXG5cXHJcXG51bmlmb3JtIGZsb2F0IG9wYWNpdHkxO1xcclxcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTI7XFxyXFxuXFxyXFxudmFyeWluZyB2ZWMyIHZVdjtcXHJcXG5cXHJcXG52b2lkIG1haW4oKSB7XFxyXFxuXFxyXFxuXFx0dmVjNCB0ZXhlbDEgPSBvcGFjaXR5MSAqIHRleHR1cmUyRCh0ZXh0dXJlMSwgdlV2KTtcXHJcXG5cXHR2ZWM0IHRleGVsMiA9IG9wYWNpdHkyICogdGV4dHVyZTJEKHRleHR1cmUyLCB2VXYpO1xcclxcblxcclxcblxcdCNpZmRlZiBTQ1JFRU5fTU9ERVxcclxcblxcclxcblxcdFxcdHZlYzMgaW52VGV4ZWwxID0gdmVjMygxLjApIC0gdGV4ZWwxLnJnYjtcXHJcXG5cXHRcXHR2ZWMzIGludlRleGVsMiA9IHZlYzMoMS4wKSAtIHRleGVsMi5yZ2I7XFxyXFxuXFxyXFxuXFx0XFx0dmVjNCBjb2xvciA9IHZlYzQoXFxyXFxuXFx0XFx0XFx0dmVjMygxLjApIC0gaW52VGV4ZWwxICogaW52VGV4ZWwyLFxcclxcblxcdFxcdFxcdHRleGVsMS5hICsgdGV4ZWwyLmFcXHJcXG5cXHRcXHQpO1xcclxcblxcclxcblxcdCNlbHNlXFxyXFxuXFxyXFxuXFx0XFx0dmVjNCBjb2xvciA9IHRleGVsMSArIHRleGVsMjtcXHJcXG5cXHJcXG5cXHQjZW5kaWZcXHJcXG5cXHJcXG5cXHRnbF9GcmFnQ29sb3IgPSBjb2xvcjtcXHJcXG5cXHJcXG59XFxyXFxuXCI7XHJcbmNvbnN0IHZlcnRleCA9IFwidmFyeWluZyB2ZWMyIHZVdjtcXHJcXG5cXHJcXG52b2lkIG1haW4oKSB7XFxyXFxuXFxyXFxuXFx0dlV2ID0gdXY7XFxyXFxuXFx0Z2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbW9kZWxWaWV3TWF0cml4ICogdmVjNChwb3NpdGlvbiwgMS4wKTtcXHJcXG5cXHJcXG59XFxyXFxuXCI7XHJcblxyXG4vKipcclxuICogQSBtYXRlcmlhbCBmb3IgY29tYmluaW5nIHR3byB0ZXh0dXJlcy5cclxuICpcclxuICogVGhpcyBtYXRlcmlhbCBzdXBwb3J0cyB0aGUgdHdvIGJsZW5kIG1vZGVzIEFkZCBhbmQgU2NyZWVuLlxyXG4gKlxyXG4gKiBJbiBTY3JlZW4gbW9kZSwgdGhlIHR3byB0ZXh0dXJlcyBhcmUgZWZmZWN0aXZlbHkgcHJvamVjdGVkIG9uIGEgd2hpdGUgc2NyZWVuXHJcbiAqIHNpbXVsdGFuZW91c2x5LiBJbiBBZGQgbW9kZSwgdGhlIHRleHR1cmVzIGFyZSBzaW1wbHkgYWRkZWQgdG9nZXRoZXIgd2hpY2hcclxuICogb2Z0ZW4gcHJvZHVjZXMgdW5kZXNpcmVkLCB3YXNoZWQgb3V0IHJlc3VsdHMuXHJcbiAqL1xyXG5cclxuZXhwb3J0IGNsYXNzIENvbWJpbmVNYXRlcmlhbCBleHRlbmRzIFNoYWRlck1hdGVyaWFsIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBjb21iaW5lIG1hdGVyaWFsLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtCb29sZWFufSBbc2NyZWVuTW9kZT1mYWxzZV0gLSBXaGV0aGVyIHRoZSBzY3JlZW4gYmxlbmQgbW9kZSBzaG91bGQgYmUgdXNlZC5cclxuXHQgKi9cclxuXHJcblx0Y29uc3RydWN0b3Ioc2NyZWVuTW9kZSA9IGZhbHNlKSB7XHJcblxyXG5cdFx0c3VwZXIoe1xyXG5cclxuXHRcdFx0dHlwZTogXCJDb21iaW5lTWF0ZXJpYWxcIixcclxuXHJcblx0XHRcdHVuaWZvcm1zOiB7XHJcblxyXG5cdFx0XHRcdHRleHR1cmUxOiBuZXcgVW5pZm9ybShudWxsKSxcclxuXHRcdFx0XHR0ZXh0dXJlMjogbmV3IFVuaWZvcm0obnVsbCksXHJcblxyXG5cdFx0XHRcdG9wYWNpdHkxOiBuZXcgVW5pZm9ybSgxLjApLFxyXG5cdFx0XHRcdG9wYWNpdHkyOiBuZXcgVW5pZm9ybSgxLjApXHJcblxyXG5cdFx0XHR9LFxyXG5cclxuXHRcdFx0ZnJhZ21lbnRTaGFkZXI6IGZyYWdtZW50LFxyXG5cdFx0XHR2ZXJ0ZXhTaGFkZXI6IHZlcnRleCxcclxuXHJcblx0XHRcdGRlcHRoV3JpdGU6IGZhbHNlLFxyXG5cdFx0XHRkZXB0aFRlc3Q6IGZhbHNlXHJcblxyXG5cdFx0fSk7XHJcblxyXG5cdFx0dGhpcy5zZXRTY3JlZW5Nb2RlRW5hYmxlZChzY3JlZW5Nb2RlKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBTY3JlZW4gYmxlbmQgbW9kZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gZW5hYmxlZCAtIFdoZXRoZXIgdGhlIFNjcmVlbiBibGVuZCBtb2RlIHNob3VsZCBiZSBlbmFibGVkLlxyXG5cdCAqL1xyXG5cclxuXHRzZXRTY3JlZW5Nb2RlRW5hYmxlZChlbmFibGVkKSB7XHJcblxyXG5cdFx0aWYoZW5hYmxlZCkge1xyXG5cclxuXHRcdFx0dGhpcy5kZWZpbmVzLlNDUkVFTl9NT0RFID0gXCIxXCI7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGRlbGV0ZSB0aGlzLmRlZmluZXMuU0NSRUVOX01PREU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG59XHJcbiIsImltcG9ydCB7IFNoYWRlck1hdGVyaWFsLCBVbmlmb3JtLCBWZWN0b3IyIH0gZnJvbSBcInRocmVlXCI7XHJcblxyXG5jb25zdCBmcmFnbWVudCA9IFwiI2luY2x1ZGUgPGNvbW1vbj5cXHJcXG4jaW5jbHVkZSA8ZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnQ+XFxyXFxuXFxyXFxudW5pZm9ybSBzYW1wbGVyMkQgdERpZmZ1c2U7XFxyXFxuXFxyXFxudmFyeWluZyB2ZWMyIHZVdjA7XFxyXFxudmFyeWluZyB2ZWMyIHZVdjE7XFxyXFxudmFyeWluZyB2ZWMyIHZVdjI7XFxyXFxudmFyeWluZyB2ZWMyIHZVdjM7XFxyXFxuXFxyXFxudm9pZCBtYWluKCkge1xcclxcblxcclxcblxcdC8vIFNhbXBsZSB0b3AgbGVmdCB0ZXhlbC5cXHJcXG5cXHR2ZWM0IHN1bSA9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2MCk7XFxyXFxuXFxyXFxuXFx0Ly8gU2FtcGxlIHRvcCByaWdodCB0ZXhlbC5cXHJcXG5cXHRzdW0gKz0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYxKTtcXHJcXG5cXHJcXG5cXHQvLyBTYW1wbGUgYm90dG9tIHJpZ2h0IHRleGVsLlxcclxcblxcdHN1bSArPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdjIpO1xcclxcblxcclxcblxcdC8vIFNhbXBsZSBib3R0b20gbGVmdCB0ZXhlbC5cXHJcXG5cXHRzdW0gKz0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYzKTtcXHJcXG5cXHJcXG5cXHQvLyBDb21wdXRlIHRoZSBhdmVyYWdlLlxcclxcblxcdGdsX0ZyYWdDb2xvciA9IHN1bSAqIDAuMjU7XFxyXFxuXFxyXFxuXFx0I2luY2x1ZGUgPGRpdGhlcmluZ19mcmFnbWVudD5cXHJcXG5cXHJcXG59XFxyXFxuXCI7XHJcbmNvbnN0IHZlcnRleCA9IFwidW5pZm9ybSB2ZWMyIHRleGVsU2l6ZTtcXHJcXG51bmlmb3JtIHZlYzIgaGFsZlRleGVsU2l6ZTtcXHJcXG51bmlmb3JtIGZsb2F0IGtlcm5lbDtcXHJcXG5cXHJcXG52YXJ5aW5nIHZlYzIgdlV2MDtcXHJcXG52YXJ5aW5nIHZlYzIgdlV2MTtcXHJcXG52YXJ5aW5nIHZlYzIgdlV2MjtcXHJcXG52YXJ5aW5nIHZlYzIgdlV2MztcXHJcXG5cXHJcXG52b2lkIG1haW4oKSB7XFxyXFxuXFxyXFxuXFx0dmVjMiBkVXYgPSAodGV4ZWxTaXplICogdmVjMihrZXJuZWwpKSArIGhhbGZUZXhlbFNpemU7XFxyXFxuXFxyXFxuXFx0dlV2MCA9IHZlYzIodXYueCAtIGRVdi54LCB1di55ICsgZFV2LnkpO1xcclxcblxcdHZVdjEgPSB2ZWMyKHV2LnggKyBkVXYueCwgdXYueSArIGRVdi55KTtcXHJcXG5cXHR2VXYyID0gdmVjMih1di54ICsgZFV2LngsIHV2LnkgLSBkVXYueSk7XFxyXFxuXFx0dlV2MyA9IHZlYzIodXYueCAtIGRVdi54LCB1di55IC0gZFV2LnkpO1xcclxcblxcclxcblxcdGdsX1Bvc2l0aW9uID0gcHJvamVjdGlvbk1hdHJpeCAqIG1vZGVsVmlld01hdHJpeCAqIHZlYzQocG9zaXRpb24sIDEuMCk7XFxyXFxuXFxyXFxufVxcclxcblwiO1xyXG5cclxuLyoqXHJcbiAqIEFuIG9wdGltaXNlZCBjb252b2x1dGlvbiBzaGFkZXIgbWF0ZXJpYWwuXHJcbiAqXHJcbiAqIFRoaXMgbWF0ZXJpYWwgc3VwcG9ydHMgZGl0aGVyaW5nLlxyXG4gKlxyXG4gKiBCYXNlZCBvbiB0aGUgR0RDMjAwMyBQcmVzZW50YXRpb24gYnkgTWFzYWtpIEthd2FzZSwgQnVua2FzaGEgR2FtZXM6XHJcbiAqICBGcmFtZSBCdWZmZXIgUG9zdHByb2Nlc3NpbmcgRWZmZWN0cyBpbiBET1VCTEUtUy5ULkUuQS5MIChXcmVja2xlc3MpXHJcbiAqIGFuZCBhbiBhcnRpY2xlIGJ5IEZpbGlwIFN0cnVnYXIsIEludGVsOlxyXG4gKiAgQW4gaW52ZXN0aWdhdGlvbiBvZiBmYXN0IHJlYWwtdGltZSBHUFUtYmFzZWQgaW1hZ2UgYmx1ciBhbGdvcml0aG1zXHJcbiAqXHJcbiAqIEZ1cnRoZXIgbW9kaWZpZWQgYWNjb3JkaW5nIHRvIEFwcGxlJ3NcclxuICogW0Jlc3QgUHJhY3RpY2VzIGZvciBTaGFkZXJzXShodHRwczovL2dvby5nbC9sbVJvTTUpLlxyXG4gKi9cclxuXHJcbmV4cG9ydCBjbGFzcyBDb252b2x1dGlvbk1hdGVyaWFsIGV4dGVuZHMgU2hhZGVyTWF0ZXJpYWwge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGNvbnZvbHV0aW9uIG1hdGVyaWFsLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IyfSBbdGV4ZWxTaXplXSAtIFRoZSBhYnNvbHV0ZSBzY3JlZW4gdGV4ZWwgc2l6ZS5cclxuXHQgKi9cclxuXHJcblx0Y29uc3RydWN0b3IodGV4ZWxTaXplID0gbmV3IFZlY3RvcjIoKSkge1xyXG5cclxuXHRcdHN1cGVyKHtcclxuXHJcblx0XHRcdHR5cGU6IFwiQ29udm9sdXRpb25NYXRlcmlhbFwiLFxyXG5cclxuXHRcdFx0dW5pZm9ybXM6IHtcclxuXHJcblx0XHRcdFx0dERpZmZ1c2U6IG5ldyBVbmlmb3JtKG51bGwpLFxyXG5cdFx0XHRcdHRleGVsU2l6ZTogbmV3IFVuaWZvcm0obmV3IFZlY3RvcjIoKSksXHJcblx0XHRcdFx0aGFsZlRleGVsU2l6ZTogbmV3IFVuaWZvcm0obmV3IFZlY3RvcjIoKSksXHJcblx0XHRcdFx0a2VybmVsOiBuZXcgVW5pZm9ybSgwLjApXHJcblxyXG5cdFx0XHR9LFxyXG5cclxuXHRcdFx0ZnJhZ21lbnRTaGFkZXI6IGZyYWdtZW50LFxyXG5cdFx0XHR2ZXJ0ZXhTaGFkZXI6IHZlcnRleCxcclxuXHJcblx0XHRcdGRlcHRoV3JpdGU6IGZhbHNlLFxyXG5cdFx0XHRkZXB0aFRlc3Q6IGZhbHNlXHJcblxyXG5cdFx0fSk7XHJcblxyXG5cdFx0dGhpcy5zZXRUZXhlbFNpemUodGV4ZWxTaXplLngsIHRleGVsU2l6ZS55KTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBjdXJyZW50IGtlcm5lbCBzaXplLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtLZXJuZWxTaXplfVxyXG5cdFx0ICogQGRlZmF1bHQgS2VybmVsU2l6ZS5MQVJHRVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy5rZXJuZWxTaXplID0gS2VybmVsU2l6ZS5MQVJHRTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRoZSBrZXJuZWwuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtGbG9hdDMyQXJyYXl9IFRoZSBrZXJuZWwuXHJcblx0ICovXHJcblxyXG5cdGdldEtlcm5lbCgpIHtcclxuXHJcblx0XHRyZXR1cm4ga2VybmVsUHJlc2V0c1t0aGlzLmtlcm5lbFNpemVdO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHRleGVsIHNpemUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge051bWJlcn0geCAtIFRoZSB0ZXhlbCB3aWR0aC5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0geSAtIFRoZSB0ZXhlbCBoZWlnaHQuXHJcblx0ICovXHJcblxyXG5cdHNldFRleGVsU2l6ZSh4LCB5KSB7XHJcblxyXG5cdFx0dGhpcy51bmlmb3Jtcy50ZXhlbFNpemUudmFsdWUuc2V0KHgsIHkpO1xyXG5cdFx0dGhpcy51bmlmb3Jtcy5oYWxmVGV4ZWxTaXplLnZhbHVlLnNldCh4LCB5KS5tdWx0aXBseVNjYWxhcigwLjUpO1xyXG5cclxuXHR9XHJcblxyXG59XHJcblxyXG4vKipcclxuICogVGhlIEthd2FzZSBibHVyIGtlcm5lbCBwcmVzZXRzLlxyXG4gKlxyXG4gKiBAdHlwZSB7RmxvYXQzMkFycmF5W119XHJcbiAqIEBwcml2YXRlXHJcbiAqL1xyXG5cclxuY29uc3Qga2VybmVsUHJlc2V0cyA9IFtcclxuXHRuZXcgRmxvYXQzMkFycmF5KFswLjAsIDAuMF0pLFxyXG5cdG5ldyBGbG9hdDMyQXJyYXkoWzAuMCwgMS4wLCAxLjBdKSxcclxuXHRuZXcgRmxvYXQzMkFycmF5KFswLjAsIDEuMCwgMS4wLCAyLjBdKSxcclxuXHRuZXcgRmxvYXQzMkFycmF5KFswLjAsIDEuMCwgMi4wLCAyLjAsIDMuMF0pLFxyXG5cdG5ldyBGbG9hdDMyQXJyYXkoWzAuMCwgMS4wLCAyLjAsIDMuMCwgNC4wLCA0LjAsIDUuMF0pLFxyXG5cdG5ldyBGbG9hdDMyQXJyYXkoWzAuMCwgMS4wLCAyLjAsIDMuMCwgNC4wLCA1LjAsIDcuMCwgOC4wLCA5LjAsIDEwLjBdKVxyXG5dO1xyXG5cclxuLyoqXHJcbiAqIEEga2VybmVsIHNpemUgZW51bWVyYXRpb24uXHJcbiAqXHJcbiAqIEB0eXBlIHtPYmplY3R9XHJcbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBWRVJZX1NNQUxMIC0gQSB2ZXJ5IHNtYWxsIGtlcm5lbCB0aGF0IG1hdGNoZXMgYSA3eDcgR2F1c3MgYmx1ciBrZXJuZWwuXHJcbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBTTUFMTCAtIEEgc21hbGwga2VybmVsIHRoYXQgbWF0Y2hlcyBhIDE1eDE1IEdhdXNzIGJsdXIga2VybmVsLlxyXG4gKiBAcHJvcGVydHkge051bWJlcn0gTUVESVVNIC0gQSBtZWRpdW0gc2l6ZWQga2VybmVsIHRoYXQgbWF0Y2hlcyBhIDIzeDIzIEdhdXNzIGJsdXIga2VybmVsLlxyXG4gKiBAcHJvcGVydHkge051bWJlcn0gTEFSR0UgLSBBIGxhcmdlIGtlcm5lbCB0aGF0IG1hdGNoZXMgYSAzNXgzNSBHYXVzcyBibHVyIGtlcm5lbC5cclxuICogQHByb3BlcnR5IHtOdW1iZXJ9IFZFUllfTEFSR0UgLSBBIHZlcnkgbGFyZ2Uga2VybmVsIHRoYXQgbWF0Y2hlcyBhIDYzeDYzIEdhdXNzIGJsdXIga2VybmVsLlxyXG4gKiBAcHJvcGVydHkge051bWJlcn0gSFVHRSAtIEEgaHVnZSBrZXJuZWwgdGhhdCBtYXRjaGVzIGEgMTI3eDEyNyBHYXVzcyBibHVyIGtlcm5lbC5cclxuICovXHJcblxyXG5leHBvcnQgY29uc3QgS2VybmVsU2l6ZSA9IHtcclxuXHJcblx0VkVSWV9TTUFMTDogMCxcclxuXHRTTUFMTDogMSxcclxuXHRNRURJVU06IDIsXHJcblx0TEFSR0U6IDMsXHJcblx0VkVSWV9MQVJHRTogNCxcclxuXHRIVUdFOiA1XHJcblxyXG59O1xyXG4iLCJpbXBvcnQgeyBTaGFkZXJNYXRlcmlhbCwgVW5pZm9ybSB9IGZyb20gXCJ0aHJlZVwiO1xyXG5cclxuY29uc3QgZnJhZ21lbnQgPSBcInVuaWZvcm0gc2FtcGxlcjJEIHREaWZmdXNlO1xcclxcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcXHJcXG5cXHJcXG52YXJ5aW5nIHZlYzIgdlV2O1xcclxcblxcclxcbnZvaWQgbWFpbigpIHtcXHJcXG5cXHJcXG5cXHR2ZWM0IHRleGVsID0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYpO1xcclxcblxcdGdsX0ZyYWdDb2xvciA9IG9wYWNpdHkgKiB0ZXhlbDtcXHJcXG5cXHJcXG59XFxyXFxuXCI7XHJcbmNvbnN0IHZlcnRleCA9IFwidmFyeWluZyB2ZWMyIHZVdjtcXHJcXG5cXHJcXG52b2lkIG1haW4oKSB7XFxyXFxuXFxyXFxuXFx0dlV2ID0gdXY7XFxyXFxuXFx0Z2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbW9kZWxWaWV3TWF0cml4ICogdmVjNChwb3NpdGlvbiwgMS4wKTtcXHJcXG5cXHJcXG59XFxyXFxuXCI7XHJcblxyXG4vKipcclxuICogQSBzaW1wbGUgY29weSBzaGFkZXIgbWF0ZXJpYWwuXHJcbiAqL1xyXG5cclxuZXhwb3J0IGNsYXNzIENvcHlNYXRlcmlhbCBleHRlbmRzIFNoYWRlck1hdGVyaWFsIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBjb3B5IG1hdGVyaWFsLlxyXG5cdCAqL1xyXG5cclxuXHRjb25zdHJ1Y3RvcigpIHtcclxuXHJcblx0XHRzdXBlcih7XHJcblxyXG5cdFx0XHR0eXBlOiBcIkNvcHlNYXRlcmlhbFwiLFxyXG5cclxuXHRcdFx0dW5pZm9ybXM6IHtcclxuXHJcblx0XHRcdFx0dERpZmZ1c2U6IG5ldyBVbmlmb3JtKG51bGwpLFxyXG5cdFx0XHRcdG9wYWNpdHk6IG5ldyBVbmlmb3JtKDEuMClcclxuXHJcblx0XHRcdH0sXHJcblxyXG5cdFx0XHRmcmFnbWVudFNoYWRlcjogZnJhZ21lbnQsXHJcblx0XHRcdHZlcnRleFNoYWRlcjogdmVydGV4LFxyXG5cclxuXHRcdFx0ZGVwdGhXcml0ZTogZmFsc2UsXHJcblx0XHRcdGRlcHRoVGVzdDogZmFsc2VcclxuXHJcblx0XHR9KTtcclxuXHJcblx0fVxyXG5cclxufVxyXG4iLCJpbXBvcnQgeyBQZXJzcGVjdGl2ZUNhbWVyYSwgU2hhZGVyTWF0ZXJpYWwsIFVuaWZvcm0gfSBmcm9tIFwidGhyZWVcIjtcclxuXHJcbmNvbnN0IGZyYWdtZW50ID0gXCIjaW5jbHVkZSA8cGFja2luZz5cXHJcXG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+XFxyXFxuXFxyXFxudW5pZm9ybSBzYW1wbGVyMkQgdERlcHRoO1xcclxcbnVuaWZvcm0gZmxvYXQgY2FtZXJhTmVhcjtcXHJcXG51bmlmb3JtIGZsb2F0IGNhbWVyYUZhcjtcXHJcXG5cXHJcXG52YXJ5aW5nIGZsb2F0IHZWaWV3WjtcXHJcXG52YXJ5aW5nIHZlYzQgdlByb2pUZXhDb29yZDtcXHJcXG5cXHJcXG52b2lkIG1haW4oKSB7XFxyXFxuXFxyXFxuXFx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD5cXHJcXG5cXHJcXG5cXHQvLyBUcmFuc2Zvcm0gaW50byBDYXJ0ZXNpYW4gY29vcmRpbmF0ZSAobm90IG1pcnJvcmVkKS5cXHJcXG5cXHR2ZWMyIHByb2pUZXhDb29yZCA9ICh2UHJvalRleENvb3JkLnh5IC8gdlByb2pUZXhDb29yZC53KSAqIDAuNSArIDAuNTtcXHJcXG5cXHRwcm9qVGV4Q29vcmQgPSBjbGFtcChwcm9qVGV4Q29vcmQsIDAuMDAyLCAwLjk5OCk7XFxyXFxuXFxyXFxuXFx0ZmxvYXQgZnJhZ0Nvb3JkWiA9IHVucGFja1JHQkFUb0RlcHRoKHRleHR1cmUyRCh0RGVwdGgsIHByb2pUZXhDb29yZCkpO1xcclxcblxcclxcblxcdCNpZmRlZiBQRVJTUEVDVElWRV9DQU1FUkFcXHJcXG5cXHJcXG5cXHRcXHRmbG9hdCB2aWV3WiA9IHBlcnNwZWN0aXZlRGVwdGhUb1ZpZXdaKGZyYWdDb29yZFosIGNhbWVyYU5lYXIsIGNhbWVyYUZhcik7XFxyXFxuXFxyXFxuXFx0I2Vsc2VcXHJcXG5cXHJcXG5cXHRcXHRmbG9hdCB2aWV3WiA9IG9ydGhvZ3JhcGhpY0RlcHRoVG9WaWV3WihmcmFnQ29vcmRaLCBjYW1lcmFOZWFyLCBjYW1lcmFGYXIpO1xcclxcblxcclxcblxcdCNlbmRpZlxcclxcblxcclxcblxcdGZsb2F0IGRlcHRoVGVzdCA9ICgtdlZpZXdaID4gLXZpZXdaKSA/IDEuMCA6IDAuMDtcXHJcXG5cXHJcXG5cXHRnbF9GcmFnQ29sb3IucmdiID0gdmVjMygwLjAsIGRlcHRoVGVzdCwgMS4wKTtcXHJcXG5cXHJcXG59XFxyXFxuXCI7XHJcbmNvbnN0IHZlcnRleCA9IFwiI2luY2x1ZGUgPGNvbW1vbj5cXHJcXG4jaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+XFxyXFxuI2luY2x1ZGUgPHNraW5uaW5nX3BhcnNfdmVydGV4PlxcclxcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+XFxyXFxuXFxyXFxudmFyeWluZyBmbG9hdCB2Vmlld1o7XFxyXFxudmFyeWluZyB2ZWM0IHZQcm9qVGV4Q29vcmQ7XFxyXFxuXFxyXFxudm9pZCBtYWluKCkge1xcclxcblxcclxcblxcdCNpbmNsdWRlIDxza2luYmFzZV92ZXJ0ZXg+XFxyXFxuXFxyXFxuXFx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cXHJcXG5cXHQjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PlxcclxcblxcdCNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+XFxyXFxuXFx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxcclxcblxcclxcblxcdHZWaWV3WiA9IG12UG9zaXRpb24uejtcXHJcXG5cXHR2UHJvalRleENvb3JkID0gZ2xfUG9zaXRpb247XFxyXFxuXFxyXFxuXFx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+XFxyXFxuXFxyXFxufVxcclxcblwiO1xyXG5cclxuLyoqXHJcbiAqIEEgZGVwdGggY29tcGFyaXNvbiBzaGFkZXIgbWF0ZXJpYWwuXHJcbiAqL1xyXG5cclxuZXhwb3J0IGNsYXNzIERlcHRoQ29tcGFyaXNvbk1hdGVyaWFsIGV4dGVuZHMgU2hhZGVyTWF0ZXJpYWwge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGRlcHRoIGNvbXBhcmlzb24gbWF0ZXJpYWwuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1RleHR1cmV9IFtkZXB0aFRleHR1cmU9bnVsbF0gLSBBIGRlcHRoIHRleHR1cmUuXHJcblx0ICogQHBhcmFtIHtQZXJzcGVjdGl2ZUNhbWVyYX0gW2NhbWVyYV0gLSBBIGNhbWVyYS5cclxuXHQgKi9cclxuXHJcblx0Y29uc3RydWN0b3IoZGVwdGhUZXh0dXJlID0gbnVsbCwgY2FtZXJhKSB7XHJcblxyXG5cdFx0c3VwZXIoe1xyXG5cclxuXHRcdFx0dHlwZTogXCJEZXB0aENvbXBhcmlzb25NYXRlcmlhbFwiLFxyXG5cclxuXHRcdFx0dW5pZm9ybXM6IHtcclxuXHJcblx0XHRcdFx0dERlcHRoOiBuZXcgVW5pZm9ybShkZXB0aFRleHR1cmUpLFxyXG5cdFx0XHRcdGNhbWVyYU5lYXI6IG5ldyBVbmlmb3JtKDAuMSksXHJcblx0XHRcdFx0Y2FtZXJhRmFyOiBuZXcgVW5pZm9ybSgyMDAwKVxyXG5cclxuXHRcdFx0fSxcclxuXHJcblx0XHRcdGZyYWdtZW50U2hhZGVyOiBmcmFnbWVudCxcclxuXHRcdFx0dmVydGV4U2hhZGVyOiB2ZXJ0ZXgsXHJcblxyXG5cdFx0XHRkZXB0aFdyaXRlOiBmYWxzZSxcclxuXHRcdFx0ZGVwdGhUZXN0OiBmYWxzZSxcclxuXHJcblx0XHRcdG1vcnBoVGFyZ2V0czogdHJ1ZSxcclxuXHRcdFx0c2tpbm5pbmc6IHRydWVcclxuXHJcblx0XHR9KTtcclxuXHJcblx0XHR0aGlzLmFkb3B0Q2FtZXJhU2V0dGluZ3MoY2FtZXJhKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBZG9wdHMgdGhlIHNldHRpbmdzIG9mIHRoZSBnaXZlbiBjYW1lcmEuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0NhbWVyYX0gW2NhbWVyYT1udWxsXSAtIEEgY2FtZXJhLlxyXG5cdCAqL1xyXG5cclxuXHRhZG9wdENhbWVyYVNldHRpbmdzKGNhbWVyYSA9IG51bGwpIHtcclxuXHJcblx0XHRpZihjYW1lcmEgIT09IG51bGwpIHtcclxuXHJcblx0XHRcdHRoaXMudW5pZm9ybXMuY2FtZXJhTmVhci52YWx1ZSA9IGNhbWVyYS5uZWFyO1xyXG5cdFx0XHR0aGlzLnVuaWZvcm1zLmNhbWVyYUZhci52YWx1ZSA9IGNhbWVyYS5mYXI7XHJcblxyXG5cdFx0XHRpZihjYW1lcmEgaW5zdGFuY2VvZiBQZXJzcGVjdGl2ZUNhbWVyYSkge1xyXG5cclxuXHRcdFx0XHR0aGlzLmRlZmluZXMuUEVSU1BFQ1RJVkVfQ0FNRVJBID0gXCIxXCI7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRkZWxldGUgdGhpcy5kZWZpbmVzLlBFUlNQRUNUSVZFX0NBTUVSQTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcbn1cclxuIiwiaW1wb3J0IHsgU2hhZGVyTWF0ZXJpYWwsIFVuaWZvcm0sIFZlY3RvcjQgfSBmcm9tIFwidGhyZWVcIjtcclxuXHJcbmNvbnN0IGZyYWdtZW50ID0gXCJ1bmlmb3JtIHNhbXBsZXIyRCB0RGlmZnVzZTtcXHJcXG5cXHJcXG51bmlmb3JtIGZsb2F0IGFuZ2xlO1xcclxcbnVuaWZvcm0gZmxvYXQgc2NhbGU7XFxyXFxudW5pZm9ybSBmbG9hdCBpbnRlbnNpdHk7XFxyXFxuXFxyXFxudmFyeWluZyB2ZWMyIHZVdjtcXHJcXG52YXJ5aW5nIHZlYzIgdlV2UGF0dGVybjtcXHJcXG5cXHJcXG5mbG9hdCBwYXR0ZXJuKCkge1xcclxcblxcclxcblxcdGZsb2F0IHMgPSBzaW4oYW5nbGUpO1xcclxcblxcdGZsb2F0IGMgPSBjb3MoYW5nbGUpO1xcclxcblxcclxcblxcdHZlYzIgcG9pbnQgPSB2ZWMyKGMgKiB2VXZQYXR0ZXJuLnggLSBzICogdlV2UGF0dGVybi55LCBzICogdlV2UGF0dGVybi54ICsgYyAqIHZVdlBhdHRlcm4ueSkgKiBzY2FsZTtcXHJcXG5cXHJcXG5cXHRyZXR1cm4gKHNpbihwb2ludC54KSAqIHNpbihwb2ludC55KSkgKiA0LjA7XFxyXFxuXFxyXFxufVxcclxcblxcclxcbnZvaWQgbWFpbigpIHtcXHJcXG5cXHJcXG5cXHR2ZWM0IHRleGVsID0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYpO1xcclxcblxcdHZlYzMgY29sb3IgPSB0ZXhlbC5yZ2I7XFxyXFxuXFxyXFxuXFx0I2lmZGVmIEFWRVJBR0VcXHJcXG5cXHJcXG5cXHRcXHRjb2xvciA9IHZlYzMoKGNvbG9yLnIgKyBjb2xvci5nICsgY29sb3IuYikgLyAzLjApO1xcclxcblxcclxcblxcdCNlbmRpZlxcclxcblxcclxcblxcdGNvbG9yID0gdmVjMyhjb2xvciAqIDEwLjAgLSA1LjAgKyBwYXR0ZXJuKCkpO1xcclxcblxcdGNvbG9yID0gdGV4ZWwucmdiICsgKGNvbG9yIC0gdGV4ZWwucmdiKSAqIGludGVuc2l0eTtcXHJcXG5cXHJcXG5cXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KGNvbG9yLCB0ZXhlbC5hKTtcXHJcXG5cXHJcXG59XFxyXFxuXCI7XHJcbmNvbnN0IHZlcnRleCA9IFwidW5pZm9ybSB2ZWM0IG9mZnNldFJlcGVhdDtcXHJcXG5cXHJcXG52YXJ5aW5nIHZlYzIgdlV2O1xcclxcbnZhcnlpbmcgdmVjMiB2VXZQYXR0ZXJuO1xcclxcblxcclxcbnZvaWQgbWFpbigpIHtcXHJcXG5cXHJcXG5cXHR2VXYgPSB1djtcXHJcXG5cXHR2VXZQYXR0ZXJuID0gdXYgKiBvZmZzZXRSZXBlYXQuencgKyBvZmZzZXRSZXBlYXQueHk7XFxyXFxuXFx0Z2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbW9kZWxWaWV3TWF0cml4ICogdmVjNChwb3NpdGlvbiwgMS4wKTtcXHJcXG5cXHJcXG59XFxyXFxuXCI7XHJcblxyXG4vKipcclxuICogQSBkb3Qgc2NyZWVuIHNoYWRlciBtYXRlcmlhbC5cclxuICovXHJcblxyXG5leHBvcnQgY2xhc3MgRG90U2NyZWVuTWF0ZXJpYWwgZXh0ZW5kcyBTaGFkZXJNYXRlcmlhbCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgZG90IHNjcmVlbiBtYXRlcmlhbC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnNdIC0gVGhlIG9wdGlvbnMuXHJcblx0ICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5hdmVyYWdlPWZhbHNlXSAtIFdoZXRoZXIgdGhlIHNoYWRlciBzaG91bGQgb3V0cHV0IHRoZSBjb2xvdXIgYXZlcmFnZSAoYmxhY2sgYW5kIHdoaXRlKS5cclxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmFuZ2xlPTEuNTddIC0gVGhlIGFuZ2xlIG9mIHRoZSBkb3QgcGF0dGVybi5cclxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnNjYWxlPTEuMF0gLSBUaGUgc2NhbGUgb2YgdGhlIGRvdCBwYXR0ZXJuLlxyXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuaW50ZW5zaXR5PTEuMF0gLSBUaGUgaW50ZW5zaXR5IG9mIHRoZSBlZmZlY3QuXHJcblx0ICovXHJcblxyXG5cdGNvbnN0cnVjdG9yKG9wdGlvbnMgPSB7fSkge1xyXG5cclxuXHRcdGNvbnN0IHNldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7XHJcblx0XHRcdGF2ZXJhZ2U6IGZhbHNlLFxyXG5cdFx0XHRhbmdsZTogMS41NyxcclxuXHRcdFx0c2NhbGU6IDEuMCxcclxuXHRcdFx0aW50ZW5zaXR5OiAxLjBcclxuXHRcdH0sIG9wdGlvbnMpO1xyXG5cclxuXHRcdHN1cGVyKHtcclxuXHJcblx0XHRcdHR5cGU6IFwiRG90U2NyZWVuTWF0ZXJpYWxcIixcclxuXHJcblx0XHRcdHVuaWZvcm1zOiB7XHJcblxyXG5cdFx0XHRcdHREaWZmdXNlOiBuZXcgVW5pZm9ybShudWxsKSxcclxuXHJcblx0XHRcdFx0YW5nbGU6IG5ldyBVbmlmb3JtKHNldHRpbmdzLmFuZ2xlKSxcclxuXHRcdFx0XHRzY2FsZTogbmV3IFVuaWZvcm0oc2V0dGluZ3Muc2NhbGUpLFxyXG5cdFx0XHRcdGludGVuc2l0eTogbmV3IFVuaWZvcm0oc2V0dGluZ3MuaW50ZW5zaXR5KSxcclxuXHJcblx0XHRcdFx0b2Zmc2V0UmVwZWF0OiBuZXcgVW5pZm9ybShuZXcgVmVjdG9yNCgwLjUsIDAuNSwgMS4wLCAxLjApKVxyXG5cclxuXHRcdFx0fSxcclxuXHJcblx0XHRcdGZyYWdtZW50U2hhZGVyOiBmcmFnbWVudCxcclxuXHRcdFx0dmVydGV4U2hhZGVyOiB2ZXJ0ZXgsXHJcblxyXG5cdFx0XHRkZXB0aFdyaXRlOiBmYWxzZSxcclxuXHRcdFx0ZGVwdGhUZXN0OiBmYWxzZVxyXG5cclxuXHRcdH0pO1xyXG5cclxuXHRcdHRoaXMuc2V0QXZlcmFnZUVuYWJsZWQoc2V0dGluZ3MuYXZlcmFnZSk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgU2NyZWVuIGJsZW5kIG1vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IGVuYWJsZWQgLSBXaGV0aGVyIHRoZSBTY3JlZW4gYmxlbmQgbW9kZSBzaG91bGQgYmUgZW5hYmxlZC5cclxuXHQgKi9cclxuXHJcblx0c2V0QXZlcmFnZUVuYWJsZWQoZW5hYmxlZCkge1xyXG5cclxuXHRcdGlmKGVuYWJsZWQpIHtcclxuXHJcblx0XHRcdHRoaXMuZGVmaW5lcy5BVkVSQUdFID0gXCIxXCI7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGRlbGV0ZSB0aGlzLmRlZmluZXMuQVZFUkFHRTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuIiwiaW1wb3J0IHsgU2hhZGVyTWF0ZXJpYWwsIFVuaWZvcm0sIFZlY3RvcjIgfSBmcm9tIFwidGhyZWVcIjtcclxuXHJcbmNvbnN0IGZyYWdtZW50ID0gXCJ1bmlmb3JtIHNhbXBsZXIyRCB0RGlmZnVzZTtcXHJcXG51bmlmb3JtIGZsb2F0IHRpbWU7XFxyXFxuXFxyXFxudmFyeWluZyB2ZWMyIHZVdjtcXHJcXG5cXHJcXG4jaWZkZWYgTk9JU0VcXHJcXG5cXHJcXG5cXHR1bmlmb3JtIGZsb2F0IG5vaXNlSW50ZW5zaXR5O1xcclxcblxcclxcbiNlbmRpZlxcclxcblxcclxcbiNpZmRlZiBTQ0FOTElORVNcXHJcXG5cXHJcXG5cXHR1bmlmb3JtIGZsb2F0IHNjYW5saW5lSW50ZW5zaXR5O1xcclxcblxcdHVuaWZvcm0gZmxvYXQgc2NhbmxpbmVDb3VudDtcXHJcXG5cXHJcXG4jZW5kaWZcXHJcXG5cXHJcXG4jaWZkZWYgR1JJRFxcclxcblxcclxcblxcdHVuaWZvcm0gZmxvYXQgZ3JpZEludGVuc2l0eTtcXHJcXG5cXHR1bmlmb3JtIHZlYzIgZ3JpZFNjYWxlO1xcclxcblxcdHVuaWZvcm0gZmxvYXQgZ3JpZExpbmVXaWR0aDtcXHJcXG5cXHJcXG4jZW5kaWZcXHJcXG5cXHJcXG4jaWZkZWYgR1JFWVNDQUxFXFxyXFxuXFxyXFxuXFx0I2luY2x1ZGUgPGNvbW1vbj5cXHJcXG5cXHJcXG5cXHR1bmlmb3JtIGZsb2F0IGdyZXlzY2FsZUludGVuc2l0eTtcXHJcXG5cXHJcXG4jZWxpZiBkZWZpbmVkKFNFUElBKVxcclxcblxcclxcblxcdHVuaWZvcm0gZmxvYXQgc2VwaWFJbnRlbnNpdHk7XFxyXFxuXFxyXFxuI2VuZGlmXFxyXFxuXFxyXFxuI2lmZGVmIFZJR05FVFRFXFxyXFxuXFxyXFxuXFx0dW5pZm9ybSBmbG9hdCB2aWduZXR0ZU9mZnNldDtcXHJcXG5cXHR1bmlmb3JtIGZsb2F0IHZpZ25ldHRlRGFya25lc3M7XFxyXFxuXFxyXFxuI2VuZGlmXFxyXFxuXFxyXFxudm9pZCBtYWluKCkge1xcclxcblxcclxcblxcdHZlYzQgdGV4ZWwgPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdik7XFxyXFxuXFx0dmVjMyBjb2xvciA9IHRleGVsLnJnYjtcXHJcXG5cXHJcXG5cXHQjaWZkZWYgU0NSRUVOX01PREVcXHJcXG5cXHJcXG5cXHRcXHR2ZWMzIGludkNvbG9yO1xcclxcblxcclxcblxcdCNlbmRpZlxcclxcblxcclxcblxcdCNpZmRlZiBOT0lTRVxcclxcblxcclxcblxcdFxcdGZsb2F0IHggPSB2VXYueCAqIHZVdi55ICogdGltZSAqIDEwMDAuMDtcXHJcXG5cXHRcXHR4ID0gbW9kKHgsIDEzLjApICogbW9kKHgsIDEyMy4wKTtcXHJcXG5cXHRcXHR4ID0gbW9kKHgsIDAuMDEpO1xcclxcblxcclxcblxcdFxcdHZlYzMgbm9pc2UgPSB0ZXhlbC5yZ2IgKiBjbGFtcCgwLjEgKyB4ICogMTAwLjAsIDAuMCwgMS4wKSAqIG5vaXNlSW50ZW5zaXR5O1xcclxcblxcclxcblxcdFxcdCNpZmRlZiBTQ1JFRU5fTU9ERVxcclxcblxcclxcblxcdFxcdFxcdGludkNvbG9yID0gdmVjMygxLjApIC0gY29sb3I7XFxyXFxuXFx0XFx0XFx0dmVjMyBpbnZOb2lzZSA9IHZlYzMoMS4wKSAtIG5vaXNlO1xcclxcblxcclxcblxcdFxcdFxcdGNvbG9yID0gdmVjMygxLjApIC0gaW52Q29sb3IgKiBpbnZOb2lzZTtcXHJcXG5cXHJcXG5cXHRcXHQjZWxzZVxcclxcblxcclxcblxcdFxcdFxcdGNvbG9yICs9IG5vaXNlO1xcclxcblxcclxcblxcdFxcdCNlbmRpZlxcclxcblxcclxcblxcdCNlbmRpZlxcclxcblxcclxcblxcdCNpZmRlZiBTQ0FOTElORVNcXHJcXG5cXHJcXG5cXHRcXHR2ZWMyIHNsID0gdmVjMihzaW4odlV2LnkgKiBzY2FubGluZUNvdW50KSwgY29zKHZVdi55ICogc2NhbmxpbmVDb3VudCkpO1xcclxcblxcdFxcdHZlYzMgc2NhbmxpbmVzID0gdGV4ZWwucmdiICogdmVjMyhzbC54LCBzbC55LCBzbC54KSAqIHNjYW5saW5lSW50ZW5zaXR5O1xcclxcblxcclxcblxcdFxcdCNpZmRlZiBTQ1JFRU5fTU9ERVxcclxcblxcclxcblxcdFxcdFxcdGludkNvbG9yID0gdmVjMygxLjApIC0gY29sb3I7XFxyXFxuXFx0XFx0XFx0dmVjMyBpbnZTY2FubGluZXMgPSB2ZWMzKDEuMCkgLSBzY2FubGluZXM7XFxyXFxuXFxyXFxuXFx0XFx0XFx0Y29sb3IgPSB2ZWMzKDEuMCkgLSBpbnZDb2xvciAqIGludlNjYW5saW5lcztcXHJcXG5cXHJcXG5cXHRcXHQjZWxzZVxcclxcblxcclxcblxcdFxcdFxcdGNvbG9yICs9IHNjYW5saW5lcztcXHJcXG5cXHJcXG5cXHRcXHQjZW5kaWZcXHJcXG5cXHJcXG5cXHQjZW5kaWZcXHJcXG5cXHJcXG5cXHQjaWZkZWYgR1JJRFxcclxcblxcclxcblxcdFxcdGZsb2F0IGdyaWQgPSAwLjUgLSBtYXgoYWJzKG1vZCh2VXYueCAqIGdyaWRTY2FsZS54LCAxLjApIC0gMC41KSwgYWJzKG1vZCh2VXYueSAqIGdyaWRTY2FsZS55LCAxLjApIC0gMC41KSk7XFxyXFxuXFx0XFx0Y29sb3IgKj0gKDEuMCAtIGdyaWRJbnRlbnNpdHkpICsgdmVjMyhzbW9vdGhzdGVwKDAuMCwgZ3JpZExpbmVXaWR0aCwgZ3JpZCkpICogZ3JpZEludGVuc2l0eTtcXHJcXG5cXHJcXG5cXHQjZW5kaWZcXHJcXG5cXHJcXG5cXHQjaWZkZWYgR1JFWVNDQUxFXFxyXFxuXFxyXFxuXFx0XFx0Y29sb3IgPSBtaXgoY29sb3IsIHZlYzMobGluZWFyVG9SZWxhdGl2ZUx1bWluYW5jZShjb2xvcikpLCBncmV5c2NhbGVJbnRlbnNpdHkpO1xcclxcblxcclxcblxcdCNlbGlmIGRlZmluZWQoU0VQSUEpXFxyXFxuXFxyXFxuXFx0XFx0dmVjMyBjID0gY29sb3IucmdiO1xcclxcblxcclxcblxcdFxcdGNvbG9yLnIgPSBkb3QoYywgdmVjMygxLjAgLSAwLjYwNyAqIHNlcGlhSW50ZW5zaXR5LCAwLjc2OSAqIHNlcGlhSW50ZW5zaXR5LCAwLjE4OSAqIHNlcGlhSW50ZW5zaXR5KSk7XFxyXFxuXFx0XFx0Y29sb3IuZyA9IGRvdChjLCB2ZWMzKDAuMzQ5ICogc2VwaWFJbnRlbnNpdHksIDEuMCAtIDAuMzE0ICogc2VwaWFJbnRlbnNpdHksIDAuMTY4ICogc2VwaWFJbnRlbnNpdHkpKTtcXHJcXG5cXHRcXHRjb2xvci5iID0gZG90KGMsIHZlYzMoMC4yNzIgKiBzZXBpYUludGVuc2l0eSwgMC41MzQgKiBzZXBpYUludGVuc2l0eSwgMS4wIC0gMC44NjkgKiBzZXBpYUludGVuc2l0eSkpO1xcclxcblxcclxcblxcdCNlbmRpZlxcclxcblxcclxcblxcdCNpZmRlZiBWSUdORVRURVxcclxcblxcclxcblxcdFxcdGNvbnN0IHZlYzIgY2VudGVyID0gdmVjMigwLjUpO1xcclxcblxcclxcblxcdFxcdCNpZmRlZiBFU0tJTFxcclxcblxcclxcblxcdFxcdFxcdHZlYzIgdXYgPSAodlV2IC0gY2VudGVyKSAqIHZlYzIodmlnbmV0dGVPZmZzZXQpO1xcclxcblxcdFxcdFxcdGNvbG9yID0gbWl4KGNvbG9yLnJnYiwgdmVjMygxLjAgLSB2aWduZXR0ZURhcmtuZXNzKSwgZG90KHV2LCB1dikpO1xcclxcblxcclxcblxcdFxcdCNlbHNlXFxyXFxuXFxyXFxuXFx0XFx0XFx0ZmxvYXQgZGlzdCA9IGRpc3RhbmNlKHZVdiwgY2VudGVyKTtcXHJcXG5cXHRcXHRcXHRjb2xvciAqPSBzbW9vdGhzdGVwKDAuOCwgdmlnbmV0dGVPZmZzZXQgKiAwLjc5OSwgZGlzdCAqICh2aWduZXR0ZURhcmtuZXNzICsgdmlnbmV0dGVPZmZzZXQpKTtcXHJcXG5cXHJcXG5cXHRcXHQjZW5kaWZcXHRcXHRcXHJcXG5cXHJcXG5cXHQjZW5kaWZcXHJcXG5cXHJcXG5cXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KGNsYW1wKGNvbG9yLCAwLjAsIDEuMCksIHRleGVsLmEpO1xcclxcblxcclxcbn1cXHJcXG5cIjtcclxuY29uc3QgdmVydGV4ID0gXCJ2YXJ5aW5nIHZlYzIgdlV2O1xcclxcblxcclxcbnZvaWQgbWFpbigpIHtcXHJcXG5cXHJcXG5cXHR2VXYgPSB1djtcXHJcXG5cXHRnbF9Qb3NpdGlvbiA9IHByb2plY3Rpb25NYXRyaXggKiBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KHBvc2l0aW9uLCAxLjApO1xcclxcblxcclxcbn1cXHJcXG5cIjtcclxuXHJcbi8qKlxyXG4gKiBBIGNpbmVtYXRpYyBzaGFkZXIgdGhhdCBwcm92aWRlcyB0aGUgZm9sbG93aW5nIGVmZmVjdHM6XHJcbiAqICAtIEZpbG0gR3JhaW5cclxuICogIC0gU2NhbmxpbmVzXHJcbiAqICAtIFZpZ25ldHRlXHJcbiAqICAtIEdyZXlzY2FsZVxyXG4gKiAgLSBTZXBpYVxyXG4gKlxyXG4gKiBPcmlnaW5hbCBzY2FubGluZXMgYWxnb3JpdGhtIGJ5IFBhdCBcIkhhd3Rob3JuZVwiIFNoZWFyb24uXHJcbiAqICBodHRwOi8vd3d3LnRydWV2aXNpb24zZC5jb20vZm9ydW1zL3Nob3djYXNlL3N0YXRpY25vaXNlX2NvbG9yYmxhY2t3aGl0ZV9zY2FubGluZV9zaGFkZXJzLXQxODY5OC4wLmh0bWxcclxuICpcclxuICogT3B0aW1pc2VkIHNjYW5saW5lcyBhbmQgbm9pc2Ugd2l0aCBpbnRlbnNpdHkgc2NhbGluZyBieSBHZW9yZyBcIkxldmlhdGhhblwiXHJcbiAqIFN0ZWlucm9oZGVyLiBUaGlzIHZlcnNpb24gd2FzIHByb3ZpZGVkIHVuZGVyIGEgQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvblxyXG4gKiAzLjAgTGljZW5zZTogaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnkvMy4wLlxyXG4gKlxyXG4gKiBUaGUgc2VwaWEgZWZmZWN0IGlzIGJhc2VkIG9uOlxyXG4gKiAgaHR0cHM6Ly9naXRodWIuY29tL2V2YW53L2dsZnguanNcclxuICpcclxuICogVGhlIHZpZ25ldHRlIGNvZGUgaXMgYmFzZWQgb24gUGFpbnRFZmZlY3QgcG9zdHByb2Nlc3MgZnJvbSByby5tZTpcclxuICogIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC8zLWRyZWFtcy1vZi1ibGFjay9zb3VyY2UvYnJvd3NlL2RlcGxveS9qcy9lZmZlY3RzL1BhaW50RWZmZWN0LmpzXHJcbiAqL1xyXG5cclxuZXhwb3J0IGNsYXNzIEZpbG1NYXRlcmlhbCBleHRlbmRzIFNoYWRlck1hdGVyaWFsIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBmaWxtIG1hdGVyaWFsLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIFRoZSBvcHRpb25zLiBEaXNhYmxlZCBlZmZlY3RzIHdpbGwgbm90IGJlIGluY2x1ZGVkIGluIHRoZSBmaW5hbCBzaGFkZXIgYW5kIGhhdmUgbm8gbmVnYXRpdmUgaW1wYWN0IG9uIHBlcmZvcm1hbmNlLlxyXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuZ3JleXNjYWxlPWZhbHNlXSAtIEVuYWJsZSBncmV5c2NhbGUgZWZmZWN0LiBHcmV5c2NhbGUgYW5kIHNlcGlhIGFyZSBtdXR1YWxseSBleGNsdXNpdmUuXHJcblx0ICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5zZXBpYT1mYWxzZV0gLSBFbmFibGUgc2VwaWEgZWZmZWN0LiBHcmV5c2NhbGUgYW5kIHNlcGlhIGFyZSBtdXR1YWxseSBleGNsdXNpdmUuXHJcblx0ICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy52aWduZXR0ZT1mYWxzZV0gLSBBcHBseSB2aWduZXR0ZSBlZmZlY3QuXHJcblx0ICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5lc2tpbD1mYWxzZV0gLSBVc2UgRXNraWwncyB2aWduZXR0ZSBhcHByb2FjaC4gVGhlIGRlZmF1bHQgbG9va3MgZHVzdHkgd2hpbGUgRXNraWwgbG9va3MgYnVybmVkIG91dC5cclxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnNjcmVlbk1vZGU9dHJ1ZV0gLSBXaGV0aGVyIHRoZSBzY3JlZW4gYmxlbmQgbW9kZSBzaG91bGQgYmUgdXNlZCBmb3Igbm9pc2UgYW5kIHNjYW5saW5lcy4gQm90aCBvZiB0aGVzZSBlZmZlY3RzIGFyZSBjb21wdXRlZCBpbmRlcGVuZGVudGx5LlxyXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMubm9pc2U9dHJ1ZV0gLSBTaG93IG5vaXNlLWJhc2VkIGZpbG0gZ3JhaW4uXHJcblx0ICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5zY2FubGluZXM9dHJ1ZV0gLSBTaG93IHNjYW5saW5lcy5cclxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmdyaWQ9dHJ1ZV0gLSBTaG93IGEgZ3JpZC5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMubm9pc2VJbnRlbnNpdHk9MC41XSAtIFRoZSBub2lzZSBpbnRlbnNpdHkuXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLnNjYW5saW5lSW50ZW5zaXR5PTAuMDVdIC0gVGhlIHNjYW5saW5lIGludGVuc2l0eS5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuZ3JpZEludGVuc2l0eT0xLjBdIC0gVGhlIGdyaWQgc3RyZW5ndGguIDAuMCB0byAxLjAuXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmdyZXlzY2FsZUludGVuc2l0eT0xLjBdIC0gVGhlIGludGVuc2l0eSBvZiB0aGUgZ3JleXNjYWxlIGVmZmVjdC4gMC4wIHRvIDEuMC5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuc2VwaWFJbnRlbnNpdHk9MS4wXSAtIFRoZSBpbnRlbnNpdHkgb2YgdGhlIHNlcGlhIGVmZmVjdC4gMC4wIHRvIDEuMC5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMudmlnbmV0dGVPZmZzZXQ9MS4wXSAtIFRoZSBvZmZzZXQgb2YgdGhlIHZpZ25ldHRlIGVmZmVjdC4gMC4wIHRvIDEuMC5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMudmlnbmV0dGVEYXJrbmVzcz0xLjBdIC0gVGhlIGRhcmtuZXNzIG9mIHRoZSB2aWduZXR0ZSBlZmZlY3QuIDAuMCB0byAxLjAuXHJcblx0ICovXHJcblxyXG5cdGNvbnN0cnVjdG9yKG9wdGlvbnMgPSB7fSkge1xyXG5cclxuXHRcdGNvbnN0IHNldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7XHJcblxyXG5cdFx0XHRzY3JlZW5Nb2RlOiB0cnVlLFxyXG5cdFx0XHRub2lzZTogdHJ1ZSxcclxuXHRcdFx0c2NhbmxpbmVzOiB0cnVlLFxyXG5cdFx0XHRncmlkOiBmYWxzZSxcclxuXHJcblx0XHRcdGdyZXlzY2FsZTogZmFsc2UsXHJcblx0XHRcdHNlcGlhOiBmYWxzZSxcclxuXHRcdFx0dmlnbmV0dGU6IGZhbHNlLFxyXG5cdFx0XHRlc2tpbDogZmFsc2UsXHJcblxyXG5cdFx0XHRub2lzZUludGVuc2l0eTogMC41LFxyXG5cdFx0XHRzY2FubGluZUludGVuc2l0eTogMC4wNSxcclxuXHRcdFx0Z3JpZEludGVuc2l0eTogMS4wLFxyXG5cdFx0XHRncmV5c2NhbGVJbnRlbnNpdHk6IDEuMCxcclxuXHRcdFx0c2VwaWFJbnRlbnNpdHk6IDEuMCxcclxuXHJcblx0XHRcdHZpZ25ldHRlT2Zmc2V0OiAxLjAsXHJcblx0XHRcdHZpZ25ldHRlRGFya25lc3M6IDEuMFxyXG5cclxuXHRcdH0sIG9wdGlvbnMpO1xyXG5cclxuXHRcdHN1cGVyKHtcclxuXHJcblx0XHRcdHR5cGU6IFwiRmlsbU1hdGVyaWFsXCIsXHJcblxyXG5cdFx0XHR1bmlmb3Jtczoge1xyXG5cclxuXHRcdFx0XHR0RGlmZnVzZTogbmV3IFVuaWZvcm0obnVsbCksXHJcblx0XHRcdFx0dGltZTogbmV3IFVuaWZvcm0oMC4wKSxcclxuXHJcblx0XHRcdFx0bm9pc2VJbnRlbnNpdHk6IG5ldyBVbmlmb3JtKHNldHRpbmdzLm5vaXNlSW50ZW5zaXR5KSxcclxuXHRcdFx0XHRzY2FubGluZUludGVuc2l0eTogbmV3IFVuaWZvcm0oc2V0dGluZ3Muc2NhbmxpbmVJbnRlbnNpdHkpLFxyXG5cdFx0XHRcdGdyaWRJbnRlbnNpdHk6IG5ldyBVbmlmb3JtKHNldHRpbmdzLmdyaWRJbnRlbnNpdHkpLFxyXG5cclxuXHRcdFx0XHRzY2FubGluZUNvdW50OiBuZXcgVW5pZm9ybSgwLjApLFxyXG5cdFx0XHRcdGdyaWRTY2FsZTogbmV3IFVuaWZvcm0obmV3IFZlY3RvcjIoKSksXHJcblx0XHRcdFx0Z3JpZExpbmVXaWR0aDogbmV3IFVuaWZvcm0oMC4wKSxcclxuXHJcblx0XHRcdFx0Z3JleXNjYWxlSW50ZW5zaXR5OiBuZXcgVW5pZm9ybShzZXR0aW5ncy5ncmV5c2NhbGVJbnRlbnNpdHkpLFxyXG5cdFx0XHRcdHNlcGlhSW50ZW5zaXR5OiBuZXcgVW5pZm9ybShzZXR0aW5ncy5zZXBpYUludGVuc2l0eSksXHJcblxyXG5cdFx0XHRcdHZpZ25ldHRlT2Zmc2V0OiBuZXcgVW5pZm9ybShzZXR0aW5ncy52aWduZXR0ZU9mZnNldCksXHJcblx0XHRcdFx0dmlnbmV0dGVEYXJrbmVzczogbmV3IFVuaWZvcm0oc2V0dGluZ3MudmlnbmV0dGVEYXJrbmVzcylcclxuXHJcblx0XHRcdH0sXHJcblxyXG5cdFx0XHRmcmFnbWVudFNoYWRlcjogZnJhZ21lbnQsXHJcblx0XHRcdHZlcnRleFNoYWRlcjogdmVydGV4LFxyXG5cclxuXHRcdFx0ZGVwdGhXcml0ZTogZmFsc2UsXHJcblx0XHRcdGRlcHRoVGVzdDogZmFsc2VcclxuXHJcblx0XHR9KTtcclxuXHJcblx0XHR0aGlzLnNldFNjcmVlbk1vZGVFbmFibGVkKHNldHRpbmdzLnNjcmVlbk1vZGUpO1xyXG5cdFx0dGhpcy5zZXROb2lzZUVuYWJsZWQoc2V0dGluZ3Mubm9pc2UpO1xyXG5cdFx0dGhpcy5zZXRTY2FubGluZXNFbmFibGVkKHNldHRpbmdzLnNjYW5saW5lcyk7XHJcblx0XHR0aGlzLnNldEdyaWRFbmFibGVkKHNldHRpbmdzLmdyaWQpO1xyXG5cdFx0dGhpcy5zZXRHcmV5c2NhbGVFbmFibGVkKHNldHRpbmdzLmdyZXlzY2FsZSk7XHJcblx0XHR0aGlzLnNldFNlcGlhRW5hYmxlZChzZXR0aW5ncy5zZXBpYSk7XHJcblx0XHR0aGlzLnNldFZpZ25ldHRlRW5hYmxlZChzZXR0aW5ncy52aWduZXR0ZSk7XHJcblx0XHR0aGlzLnNldEVza2lsRW5hYmxlZChzZXR0aW5ncy5lc2tpbCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgU2NyZWVuIGJsZW5kIG1vZGUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IGVuYWJsZWQgLSBXaGV0aGVyIHRoZSBTY3JlZW4gYmxlbmQgbW9kZSBzaG91bGQgYmUgZW5hYmxlZC5cclxuXHQgKi9cclxuXHJcblx0c2V0U2NyZWVuTW9kZUVuYWJsZWQoZW5hYmxlZCkge1xyXG5cclxuXHRcdGlmKGVuYWJsZWQpIHtcclxuXHJcblx0XHRcdHRoaXMuZGVmaW5lcy5TQ1JFRU5fTU9ERSA9IFwiMVwiO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRkZWxldGUgdGhpcy5kZWZpbmVzLlNDUkVFTl9NT0RFO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBub2lzZSBlZmZlY3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IGVuYWJsZWQgLSBXaGV0aGVyIHRoZSBub2lzZSBlZmZlY3Qgc2hvdWxkIGJlIGVuYWJsZWQuXHJcblx0ICovXHJcblxyXG5cdHNldE5vaXNlRW5hYmxlZChlbmFibGVkKSB7XHJcblxyXG5cdFx0aWYoZW5hYmxlZCkge1xyXG5cclxuXHRcdFx0dGhpcy5kZWZpbmVzLk5PSVNFID0gXCIxXCI7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGRlbGV0ZSB0aGlzLmRlZmluZXMuTk9JU0U7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIHNjYW5saW5lcyBlZmZlY3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IGVuYWJsZWQgLSBXaGV0aGVyIHRoZSBzY2FubGluZXMgZWZmZWN0IHNob3VsZCBiZSBlbmFibGVkLlxyXG5cdCAqL1xyXG5cclxuXHRzZXRTY2FubGluZXNFbmFibGVkKGVuYWJsZWQpIHtcclxuXHJcblx0XHRpZihlbmFibGVkKSB7XHJcblxyXG5cdFx0XHR0aGlzLmRlZmluZXMuU0NBTkxJTkVTID0gXCIxXCI7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGRlbGV0ZSB0aGlzLmRlZmluZXMuU0NBTkxJTkVTO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBncmlkIGVmZmVjdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gZW5hYmxlZCAtIFdoZXRoZXIgdGhlIGdyaWQgZWZmZWN0IHNob3VsZCBiZSBlbmFibGVkLlxyXG5cdCAqL1xyXG5cclxuXHRzZXRHcmlkRW5hYmxlZChlbmFibGVkKSB7XHJcblxyXG5cdFx0aWYoZW5hYmxlZCkge1xyXG5cclxuXHRcdFx0dGhpcy5kZWZpbmVzLkdSSUQgPSBcIjFcIjtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0ZGVsZXRlIHRoaXMuZGVmaW5lcy5HUklEO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBncmV5c2NhbGUgZWZmZWN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtCb29sZWFufSBlbmFibGVkIC0gV2hldGhlciB0aGUgZ3JleXNjYWxlIGVmZmVjdCBzaG91bGQgYmUgZW5hYmxlZC5cclxuXHQgKi9cclxuXHJcblx0c2V0R3JleXNjYWxlRW5hYmxlZChlbmFibGVkKSB7XHJcblxyXG5cdFx0aWYoZW5hYmxlZCkge1xyXG5cclxuXHRcdFx0dGhpcy5kZWZpbmVzLkdSRVlTQ0FMRSA9IFwiMVwiO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRkZWxldGUgdGhpcy5kZWZpbmVzLkdSRVlTQ0FMRTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgc2VwaWEgZWZmZWN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtCb29sZWFufSBlbmFibGVkIC0gV2hldGhlciB0aGUgc2VwaWEgZWZmZWN0IHNob3VsZCBiZSBlbmFibGVkLlxyXG5cdCAqL1xyXG5cclxuXHRzZXRTZXBpYUVuYWJsZWQoZW5hYmxlZCkge1xyXG5cclxuXHRcdGlmKGVuYWJsZWQpIHtcclxuXHJcblx0XHRcdHRoaXMuZGVmaW5lcy5TRVBJQSA9IFwiMVwiO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRkZWxldGUgdGhpcy5kZWZpbmVzLlNFUElBO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBWaWduZXR0ZSBlZmZlY3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IGVuYWJsZWQgLSBXaGV0aGVyIHRoZSBWaWduZXR0ZSBlZmZlY3Qgc2hvdWxkIGJlIGVuYWJsZWQuXHJcblx0ICovXHJcblxyXG5cdHNldFZpZ25ldHRlRW5hYmxlZChlbmFibGVkKSB7XHJcblxyXG5cdFx0aWYoZW5hYmxlZCkge1xyXG5cclxuXHRcdFx0dGhpcy5kZWZpbmVzLlZJR05FVFRFID0gXCIxXCI7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGRlbGV0ZSB0aGlzLmRlZmluZXMuVklHTkVUVEU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIEVza2lsIFZpZ25ldHRlIGVmZmVjdC5cclxuXHQgKlxyXG5cdCAqIEhhcyBubyBlZmZlY3QgaWYgVmlnbmV0dGUgaXMgZGlzYWJsZWQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IGVuYWJsZWQgLSBXaGV0aGVyIHRoZSBFc2tpbCBWaWduZXR0ZSBlZmZlY3Qgc2hvdWxkIGJlIGVuYWJsZWQuXHJcblx0ICovXHJcblxyXG5cdHNldEVza2lsRW5hYmxlZChlbmFibGVkKSB7XHJcblxyXG5cdFx0aWYoZW5hYmxlZCkge1xyXG5cclxuXHRcdFx0dGhpcy5kZWZpbmVzLkVTS0lMID0gXCIxXCI7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGRlbGV0ZSB0aGlzLmRlZmluZXMuRVNLSUw7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG59XHJcbiIsImltcG9ydCB7IFNoYWRlck1hdGVyaWFsLCBVbmlmb3JtIH0gZnJvbSBcInRocmVlXCI7XHJcblxyXG5jb25zdCBmcmFnbWVudCA9IFwidW5pZm9ybSBzYW1wbGVyMkQgdERpZmZ1c2U7XFxyXFxudW5pZm9ybSBzYW1wbGVyMkQgdFBlcnR1cmI7XFxyXFxuXFxyXFxudW5pZm9ybSBib29sIGFjdGl2ZTtcXHJcXG5cXHJcXG51bmlmb3JtIGZsb2F0IGFtb3VudDtcXHJcXG51bmlmb3JtIGZsb2F0IGFuZ2xlO1xcclxcbnVuaWZvcm0gZmxvYXQgc2VlZDtcXHJcXG51bmlmb3JtIGZsb2F0IHNlZWRYO1xcclxcbnVuaWZvcm0gZmxvYXQgc2VlZFk7XFxyXFxudW5pZm9ybSBmbG9hdCBkaXN0b3J0aW9uWDtcXHJcXG51bmlmb3JtIGZsb2F0IGRpc3RvcnRpb25ZO1xcclxcbnVuaWZvcm0gZmxvYXQgY29sUztcXHJcXG5cXHJcXG52YXJ5aW5nIHZlYzIgdlV2O1xcclxcblxcclxcbmZsb2F0IHJhbmQodmVjMiB0Yykge1xcclxcblxcclxcblxcdGNvbnN0IGZsb2F0IGEgPSAxMi45ODk4O1xcclxcblxcdGNvbnN0IGZsb2F0IGIgPSA3OC4yMzM7XFxyXFxuXFx0Y29uc3QgZmxvYXQgYyA9IDQzNzU4LjU0NTM7XFxyXFxuXFxyXFxuXFx0ZmxvYXQgZHQgPSBkb3QodGMsIHZlYzIoYSwgYikpO1xcclxcblxcdGZsb2F0IHNuID0gbW9kKGR0LCAzLjE0KTtcXHJcXG5cXHJcXG5cXHRyZXR1cm4gZnJhY3Qoc2luKHNuKSAqIGMpO1xcclxcblxcclxcbn1cXHJcXG5cXHJcXG52b2lkIG1haW4oKSB7XFxyXFxuXFxyXFxuXFx0dmVjMiBjb29yZCA9IHZVdjtcXHJcXG5cXHJcXG5cXHRmbG9hdCB4cywgeXM7XFxyXFxuXFx0dmVjNCBub3JtYWw7XFxyXFxuXFxyXFxuXFx0dmVjMiBvZmZzZXQ7XFxyXFxuXFx0dmVjNCBjciwgY2dhLCBjYjtcXHJcXG5cXHR2ZWM0IHNub3csIGNvbG9yO1xcclxcblxcclxcblxcdGZsb2F0IHN4LCBzeTtcXHJcXG5cXHJcXG5cXHRpZihhY3RpdmUpIHtcXHJcXG5cXHJcXG5cXHRcXHR4cyA9IGZsb29yKGdsX0ZyYWdDb29yZC54IC8gMC41KTtcXHJcXG5cXHRcXHR5cyA9IGZsb29yKGdsX0ZyYWdDb29yZC55IC8gMC41KTtcXHJcXG5cXHJcXG5cXHRcXHRub3JtYWwgPSB0ZXh0dXJlMkQodFBlcnR1cmIsIGNvb3JkICogc2VlZCAqIHNlZWQpO1xcclxcblxcclxcblxcdFxcdGlmKGNvb3JkLnkgPCBkaXN0b3J0aW9uWCArIGNvbFMgJiYgY29vcmQueSA+IGRpc3RvcnRpb25YIC0gY29sUyAqIHNlZWQpIHtcXHJcXG5cXHJcXG5cXHRcXHRcXHRzeCA9IGNsYW1wKGNlaWwoc2VlZFgpLCAwLjAsIDEuMCk7XFxyXFxuXFx0XFx0XFx0Y29vcmQueSA9IHN4ICogKDEuMCAtIChjb29yZC55ICsgZGlzdG9ydGlvblkpKSArICgxLjAgLSBzeCkgKiBkaXN0b3J0aW9uWTtcXHJcXG5cXHJcXG5cXHRcXHR9XFxyXFxuXFxyXFxuXFx0XFx0aWYoY29vcmQueCA8IGRpc3RvcnRpb25ZICsgY29sUyAmJiBjb29yZC54ID4gZGlzdG9ydGlvblkgLSBjb2xTICogc2VlZCkge1xcclxcblxcclxcblxcdFxcdFxcdHN5ID0gY2xhbXAoY2VpbChzZWVkWSksIDAuMCwgMS4wKTtcXHJcXG5cXHRcXHRcXHRjb29yZC54ID0gc3kgKiBkaXN0b3J0aW9uWCArICgxLjAgLSBzeSkgKiAoMS4wIC0gKGNvb3JkLnggKyBkaXN0b3J0aW9uWCkpO1xcclxcblxcclxcblxcdFxcdH1cXHJcXG5cXHJcXG5cXHRcXHRjb29yZC54ICs9IG5vcm1hbC54ICogc2VlZFggKiAoc2VlZCAvIDUuMCk7XFxyXFxuXFx0XFx0Y29vcmQueSArPSBub3JtYWwueSAqIHNlZWRZICogKHNlZWQgLyA1LjApO1xcclxcblxcclxcblxcdFxcdG9mZnNldCA9IGFtb3VudCAqIHZlYzIoY29zKGFuZ2xlKSwgc2luKGFuZ2xlKSk7XFxyXFxuXFxyXFxuXFx0XFx0Y3IgPSB0ZXh0dXJlMkQodERpZmZ1c2UsIGNvb3JkICsgb2Zmc2V0KTtcXHJcXG5cXHRcXHRjZ2EgPSB0ZXh0dXJlMkQodERpZmZ1c2UsIGNvb3JkKTtcXHJcXG5cXHRcXHRjYiA9IHRleHR1cmUyRCh0RGlmZnVzZSwgY29vcmQgLSBvZmZzZXQpO1xcclxcblxcclxcblxcdFxcdGNvbG9yID0gdmVjNChjci5yLCBjZ2EuZywgY2IuYiwgY2dhLmEpO1xcclxcblxcdFxcdHNub3cgPSAyMDAuMCAqIGFtb3VudCAqIHZlYzQocmFuZCh2ZWMyKHhzICogc2VlZCwgeXMgKiBzZWVkICogNTAuMCkpICogMC4yKTtcXHJcXG5cXHRcXHRjb2xvciArPSBzbm93O1xcclxcblxcclxcblxcdH0gZWxzZSB7XFxyXFxuXFxyXFxuXFx0XFx0Y29sb3IgPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdik7XFxyXFxuXFxyXFxuXFx0fVxcclxcblxcclxcblxcdGdsX0ZyYWdDb2xvciA9IGNvbG9yO1xcclxcblxcclxcbn1cXHJcXG5cIjtcclxuY29uc3QgdmVydGV4ID0gXCJ2YXJ5aW5nIHZlYzIgdlV2O1xcclxcblxcclxcbnZvaWQgbWFpbigpIHtcXHJcXG5cXHJcXG5cXHR2VXYgPSB1djtcXHJcXG5cXHRnbF9Qb3NpdGlvbiA9IHByb2plY3Rpb25NYXRyaXggKiBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KHBvc2l0aW9uLCAxLjApO1xcclxcblxcclxcbn1cXHJcXG5cIjtcclxuXHJcbi8qKlxyXG4gKiBBIGdsaXRjaCBzaGFkZXIgbWF0ZXJpYWwuXHJcbiAqXHJcbiAqIFJlZmVyZW5jZTpcclxuICogIGh0dHBzOi8vZ2l0aHViLmNvbS9zdGFmZmFudGFuL3VuaXR5Z2xpdGNoXHJcbiAqL1xyXG5cclxuZXhwb3J0IGNsYXNzIEdsaXRjaE1hdGVyaWFsIGV4dGVuZHMgU2hhZGVyTWF0ZXJpYWwge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGdsaXRjaCBtYXRlcmlhbC5cclxuXHQgKi9cclxuXHJcblx0Y29uc3RydWN0b3IoKSB7XHJcblxyXG5cdFx0c3VwZXIoe1xyXG5cclxuXHRcdFx0dHlwZTogXCJHbGl0Y2hNYXRlcmlhbFwiLFxyXG5cclxuXHRcdFx0dW5pZm9ybXM6IHtcclxuXHJcblx0XHRcdFx0dERpZmZ1c2U6IG5ldyBVbmlmb3JtKG51bGwpLFxyXG5cdFx0XHRcdHRQZXJ0dXJiOiBuZXcgVW5pZm9ybShudWxsKSxcclxuXHJcblx0XHRcdFx0YWN0aXZlOiBuZXcgVW5pZm9ybSgxKSxcclxuXHJcblx0XHRcdFx0YW1vdW50OiBuZXcgVW5pZm9ybSgwLjgpLFxyXG5cdFx0XHRcdGFuZ2xlOiBuZXcgVW5pZm9ybSgwLjAyKSxcclxuXHRcdFx0XHRzZWVkOiBuZXcgVW5pZm9ybSgwLjAyKSxcclxuXHRcdFx0XHRzZWVkWDogbmV3IFVuaWZvcm0oMC4wMiksXHJcblx0XHRcdFx0c2VlZFk6IG5ldyBVbmlmb3JtKDAuMDIpLFxyXG5cdFx0XHRcdGRpc3RvcnRpb25YOiBuZXcgVW5pZm9ybSgwLjUpLFxyXG5cdFx0XHRcdGRpc3RvcnRpb25ZOiBuZXcgVW5pZm9ybSgwLjYpLFxyXG5cdFx0XHRcdGNvbFM6IG5ldyBVbmlmb3JtKDAuMDUpXHJcblxyXG5cdFx0XHR9LFxyXG5cclxuXHRcdFx0ZnJhZ21lbnRTaGFkZXI6IGZyYWdtZW50LFxyXG5cdFx0XHR2ZXJ0ZXhTaGFkZXI6IHZlcnRleCxcclxuXHJcblx0XHRcdGRlcHRoV3JpdGU6IGZhbHNlLFxyXG5cdFx0XHRkZXB0aFRlc3Q6IGZhbHNlXHJcblxyXG5cdFx0fSk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuIiwiaW1wb3J0IHsgU2hhZGVyTWF0ZXJpYWwsIFVuaWZvcm0gfSBmcm9tIFwidGhyZWVcIjtcclxuXHJcbmNvbnN0IGZyYWdtZW50ID0gXCIjaW5jbHVkZSA8Y29tbW9uPlxcclxcbiNpbmNsdWRlIDxkaXRoZXJpbmdfcGFyc19mcmFnbWVudD5cXHJcXG5cXHJcXG51bmlmb3JtIHNhbXBsZXIyRCB0RGlmZnVzZTtcXHJcXG51bmlmb3JtIHZlYzMgbGlnaHRQb3NpdGlvbjtcXHJcXG5cXHJcXG51bmlmb3JtIGZsb2F0IGV4cG9zdXJlO1xcclxcbnVuaWZvcm0gZmxvYXQgZGVjYXk7XFxyXFxudW5pZm9ybSBmbG9hdCBkZW5zaXR5O1xcclxcbnVuaWZvcm0gZmxvYXQgd2VpZ2h0O1xcclxcbnVuaWZvcm0gZmxvYXQgY2xhbXBNYXg7XFxyXFxuXFxyXFxudmFyeWluZyB2ZWMyIHZVdjtcXHJcXG5cXHJcXG52b2lkIG1haW4oKSB7XFxyXFxuXFxyXFxuXFx0dmVjMiB0ZXhDb29yZCA9IHZVdjtcXHJcXG5cXHJcXG5cXHQvLyBDYWxjdWxhdGUgdmVjdG9yIGZyb20gcGl4ZWwgdG8gbGlnaHQgc291cmNlIGluIHNjcmVlbiBzcGFjZS5cXHJcXG5cXHR2ZWMyIGRlbHRhVGV4Q29vcmQgPSB0ZXhDb29yZCAtIGxpZ2h0UG9zaXRpb24uc3Q7XFxyXFxuXFx0ZGVsdGFUZXhDb29yZCAqPSAxLjAgLyBOVU1fU0FNUExFU19GTE9BVCAqIGRlbnNpdHk7XFxyXFxuXFxyXFxuXFx0Ly8gQSBkZWNyZWFzaW5nIGlsbHVtaW5hdGlvbiBmYWN0b3IuXFxyXFxuXFx0ZmxvYXQgaWxsdW1pbmF0aW9uRGVjYXkgPSAxLjA7XFxyXFxuXFxyXFxuXFx0dmVjNCBzYW1wbGU7XFxyXFxuXFx0dmVjNCBjb2xvciA9IHZlYzQoMC4wKTtcXHJcXG5cXHJcXG5cXHQvLyBFc3RpbWF0ZSB0aGUgcHJvYmFiaWxpdHkgb2Ygb2NjbHVzaW9uIGF0IGVhY2ggcGl4ZWwgYnkgc3VtbWluZyBzYW1wbGVzIGFsb25nIGEgcmF5IHRvIHRoZSBsaWdodCBzb3VyY2UuXFxyXFxuXFx0Zm9yKGludCBpID0gMDsgaSA8IE5VTV9TQU1QTEVTX0lOVDsgKytpKSB7XFxyXFxuXFxyXFxuXFx0XFx0dGV4Q29vcmQgLT0gZGVsdGFUZXhDb29yZDtcXHJcXG5cXHRcXHRzYW1wbGUgPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHRleENvb3JkKTtcXHJcXG5cXHJcXG5cXHRcXHQvLyBBcHBseSBzYW1wbGUgYXR0ZW51YXRpb24gc2NhbGUvZGVjYXkgZmFjdG9ycy5cXHJcXG5cXHRcXHRzYW1wbGUgKj0gaWxsdW1pbmF0aW9uRGVjYXkgKiB3ZWlnaHQ7XFxyXFxuXFxyXFxuXFx0XFx0Y29sb3IgKz0gc2FtcGxlO1xcclxcblxcclxcblxcdFxcdC8vIFVwZGF0ZSBleHBvbmVudGlhbCBkZWNheSBmYWN0b3IuXFxyXFxuXFx0XFx0aWxsdW1pbmF0aW9uRGVjYXkgKj0gZGVjYXk7XFxyXFxuXFxyXFxuXFx0fVxcclxcblxcclxcblxcdGdsX0ZyYWdDb2xvciA9IGNsYW1wKGNvbG9yICogZXhwb3N1cmUsIDAuMCwgY2xhbXBNYXgpO1xcclxcblxcclxcblxcdCNpbmNsdWRlIDxkaXRoZXJpbmdfZnJhZ21lbnQ+XFxyXFxuXFxyXFxufVxcclxcblwiO1xyXG5jb25zdCB2ZXJ0ZXggPSBcInZhcnlpbmcgdmVjMiB2VXY7XFxyXFxuXFxyXFxudm9pZCBtYWluKCkge1xcclxcblxcclxcblxcdHZVdiA9IHV2O1xcclxcblxcdGdsX1Bvc2l0aW9uID0gcHJvamVjdGlvbk1hdHJpeCAqIG1vZGVsVmlld01hdHJpeCAqIHZlYzQocG9zaXRpb24sIDEuMCk7XFxyXFxuXFxyXFxufVxcclxcblwiO1xyXG5cclxuLyoqXHJcbiAqIEEgY3JlcHVzY3VsYXIgcmF5cyBzaGFkZXIgbWF0ZXJpYWwuXHJcbiAqXHJcbiAqIFRoaXMgbWF0ZXJpYWwgc3VwcG9ydHMgZGl0aGVyaW5nLlxyXG4gKlxyXG4gKiBSZWZlcmVuY2VzOlxyXG4gKlxyXG4gKiBUaGliYXV0IERlc3BvdWxhaW4sIDIwMTI6XHJcbiAqICBbKFdlYkdMKSBWb2x1bWV0cmljIExpZ2h0IEFwcHJveGltYXRpb24gaW4gVGhyZWUuanNdKFxyXG4gKiAgaHR0cDovL2JrY29yZS5jb20vYmxvZy8zZC93ZWJnbC10aHJlZS1qcy12b2x1bWV0cmljLWxpZ2h0LWdvZHJheXMuaHRtbClcclxuICpcclxuICogTnZpZGlhLCBHUFUgR2VtcyAzLCAyMDA4OlxyXG4gKiAgW0NoYXB0ZXIgMTMuIFZvbHVtZXRyaWMgTGlnaHQgU2NhdHRlcmluZyBhcyBhIFBvc3QtUHJvY2Vzc10oXHJcbiAqICBodHRwczovL2RldmVsb3Blci5udmlkaWEuY29tL2dwdWdlbXMvR1BVR2VtczMvZ3B1Z2VtczNfY2gxMy5odG1sKVxyXG4gKi9cclxuXHJcbmV4cG9ydCBjbGFzcyBHb2RSYXlzTWF0ZXJpYWwgZXh0ZW5kcyBTaGFkZXJNYXRlcmlhbCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgZ29kIHJheXMgbWF0ZXJpYWwuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gVGhlIG9wdGlvbnMuXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmRlbnNpdHk9MC45Nl0gLSBUaGUgZGVuc2l0eSBvZiB0aGUgbGlnaHQgcmF5cy5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuZGVjYXk9MC45M10gLSBBbiBpbGx1bWluYXRpb24gZGVjYXkgZmFjdG9yLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy53ZWlnaHQ9MC40XSAtIEEgbGlnaHQgcmF5IHdlaWdodCBmYWN0b3IuXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmV4cG9zdXJlPTAuNl0gLSBBIGNvbnN0YW50IGF0dGVudWF0aW9uIGNvZWZmaWNpZW50LlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5jbGFtcE1heD0xLjBdIC0gQW4gdXBwZXIgYm91bmQgZm9yIHRoZSBzYXR1cmF0aW9uIG9mIHRoZSBvdmVyYWxsIGVmZmVjdC5cclxuXHQgKi9cclxuXHJcblx0Y29uc3RydWN0b3Iob3B0aW9ucyA9IHt9KSB7XHJcblxyXG5cdFx0Y29uc3Qgc2V0dGluZ3MgPSBPYmplY3QuYXNzaWduKHtcclxuXHRcdFx0ZXhwb3N1cmU6IDAuNixcclxuXHRcdFx0ZGVuc2l0eTogMC45MyxcclxuXHRcdFx0ZGVjYXk6IDAuOTYsXHJcblx0XHRcdHdlaWdodDogMC40LFxyXG5cdFx0XHRjbGFtcE1heDogMS4wXHJcblx0XHR9LCBvcHRpb25zKTtcclxuXHJcblx0XHRzdXBlcih7XHJcblxyXG5cdFx0XHR0eXBlOiBcIkdvZFJheXNNYXRlcmlhbFwiLFxyXG5cclxuXHRcdFx0ZGVmaW5lczoge1xyXG5cclxuXHRcdFx0XHROVU1fU0FNUExFU19GTE9BVDogXCI2MC4wXCIsXHJcblx0XHRcdFx0TlVNX1NBTVBMRVNfSU5UOiBcIjYwXCJcclxuXHJcblx0XHRcdH0sXHJcblxyXG5cdFx0XHR1bmlmb3Jtczoge1xyXG5cclxuXHRcdFx0XHR0RGlmZnVzZTogbmV3IFVuaWZvcm0obnVsbCksXHJcblx0XHRcdFx0bGlnaHRQb3NpdGlvbjogbmV3IFVuaWZvcm0obnVsbCksXHJcblxyXG5cdFx0XHRcdGV4cG9zdXJlOiBuZXcgVW5pZm9ybShzZXR0aW5ncy5leHBvc3VyZSksXHJcblx0XHRcdFx0ZGVjYXk6IG5ldyBVbmlmb3JtKHNldHRpbmdzLmRlY2F5KSxcclxuXHRcdFx0XHRkZW5zaXR5OiBuZXcgVW5pZm9ybShzZXR0aW5ncy5kZW5zaXR5KSxcclxuXHRcdFx0XHR3ZWlnaHQ6IG5ldyBVbmlmb3JtKHNldHRpbmdzLndlaWdodCksXHJcblx0XHRcdFx0Y2xhbXBNYXg6IG5ldyBVbmlmb3JtKHNldHRpbmdzLmNsYW1wTWF4KVxyXG5cclxuXHRcdFx0fSxcclxuXHJcblx0XHRcdGZyYWdtZW50U2hhZGVyOiBmcmFnbWVudCxcclxuXHRcdFx0dmVydGV4U2hhZGVyOiB2ZXJ0ZXgsXHJcblxyXG5cdFx0XHRkZXB0aFdyaXRlOiBmYWxzZSxcclxuXHRcdFx0ZGVwdGhUZXN0OiBmYWxzZVxyXG5cclxuXHRcdH0pO1xyXG5cclxuXHR9XHJcblxyXG59XHJcbiIsImltcG9ydCB7IFNoYWRlck1hdGVyaWFsLCBVbmlmb3JtLCBWZWN0b3IyIH0gZnJvbSBcInRocmVlXCI7XHJcblxyXG5jb25zdCBmcmFnbWVudCA9IFwiI2luY2x1ZGUgPGNvbW1vbj5cXHJcXG5cXHJcXG51bmlmb3JtIHNhbXBsZXIyRCB0RGlmZnVzZTtcXHJcXG51bmlmb3JtIGZsb2F0IGRpc3RpbmN0aW9uO1xcclxcbnVuaWZvcm0gdmVjMiByYW5nZTtcXHJcXG5cXHJcXG52YXJ5aW5nIHZlYzIgdlV2O1xcclxcblxcclxcbnZvaWQgbWFpbigpIHtcXHJcXG5cXHJcXG5cXHR2ZWM0IHRleGVsID0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYpO1xcclxcblxcdGZsb2F0IGwgPSBsaW5lYXJUb1JlbGF0aXZlTHVtaW5hbmNlKHRleGVsLnJnYik7XFxyXFxuXFxyXFxuXFx0I2lmZGVmIFJBTkdFXFxyXFxuXFxyXFxuXFx0XFx0ZmxvYXQgbG93ID0gc3RlcChyYW5nZS54LCBsKTtcXHJcXG5cXHRcXHRmbG9hdCBoaWdoID0gc3RlcChsLCByYW5nZS55KTtcXHJcXG5cXHJcXG5cXHRcXHQvLyBBcHBseSB0aGUgbWFzay5cXHJcXG5cXHRcXHRsICo9IGxvdyAqIGhpZ2g7XFxyXFxuXFxyXFxuXFx0I2VuZGlmXFxyXFxuXFxyXFxuXFx0bCA9IHBvdyhhYnMobCksIGRpc3RpbmN0aW9uKTtcXHJcXG5cXHJcXG5cXHQjaWZkZWYgQ09MT1JcXHJcXG5cXHJcXG5cXHRcXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KHRleGVsLnJnYiAqIGwsIHRleGVsLmEpO1xcclxcblxcclxcblxcdCNlbHNlXFxyXFxuXFxyXFxuXFx0XFx0Z2xfRnJhZ0NvbG9yID0gdmVjNChsLCBsLCBsLCB0ZXhlbC5hKTtcXHJcXG5cXHJcXG5cXHQjZW5kaWZcXHJcXG5cXHJcXG59XFxyXFxuXCI7XHJcbmNvbnN0IHZlcnRleCA9IFwidmFyeWluZyB2ZWMyIHZVdjtcXHJcXG5cXHJcXG52b2lkIG1haW4oKSB7XFxyXFxuXFxyXFxuXFx0dlV2ID0gdXY7XFxyXFxuXFx0Z2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbW9kZWxWaWV3TWF0cml4ICogdmVjNChwb3NpdGlvbiwgMS4wKTtcXHJcXG5cXHJcXG59XFxyXFxuXCI7XHJcblxyXG4vKipcclxuICogQSBsdW1pbm9zaXR5IHNoYWRlciBtYXRlcmlhbC5cclxuICpcclxuICogVGhpcyBzaGFkZXIgcHJvZHVjZXMgYSBncmV5c2NhbGUgbHVtaW5hbmNlIG1hcCB0aGF0IGRlc2NyaWJlcyB0aGUgYWJzb2x1dGVcclxuICogYW1vdW50IG9mIGxpZ2h0IGVtaXR0ZWQgYnkgYSBzY2VuZS4gSXQgY2FuIGFsc28gYmUgY29uZmlndXJlZCB0byBvdXRwdXRcclxuICogY29sb3VycyB0aGF0IGFyZSBzY2FsZWQgd2l0aCB0aGVpciByZXNwZWN0aXZlIGx1bWluYW5jZSB2YWx1ZS4gQWRkaXRpb25hbGx5LFxyXG4gKiBhIHJhbmdlIG1heSBiZSBwcm92aWRlZCB0byBtYXNrIG91dCB1bmRlc2lyZWQgdGV4ZWxzLlxyXG4gKlxyXG4gKiBUaGUgYWxwaGEgY2hhbm5lbCB3aWxsIHJlbWFpbiB1bmFmZmVjdGVkIGluIGFsbCBjYXNlcy5cclxuICpcclxuICogT24gbHVtaW5hbmNlIGNvZWZmaWNpZW50czpcclxuICogIGh0dHA6Ly93d3cucG95bnRvbi5jb20vbm90ZXMvY29sb3VyX2FuZF9nYW1tYS9Db2xvckZBUS5odG1sI1JURlRvQzlcclxuICpcclxuICogQ29lZmZpY2llbnRzIGZvciBkaWZmZXJlbnQgY29sb3VyIHNwYWNlczpcclxuICogIGh0dHBzOi8vaHN0by5vcmcvZ2V0cHJvL2hhYnIvcG9zdF9pbWFnZXMvMmFiLzY5ZC8wODQvMmFiNjlkMDg0ZjlhNTk3ZTAzMjYyNGJjZDc0ZDU3YTcucG5nXHJcbiAqXHJcbiAqIEx1bWluYW5jZSByYW5nZSByZWZlcmVuY2U6XHJcbiAqICBodHRwczovL2N5Y2xpbmc3NC5jb20vMjAwNy8wNS8yMy95b3VyLWZpcnN0LXNoYWRlci8jLlZ0eTlGZmtyTDRaXHJcbiAqL1xyXG5cclxuZXhwb3J0IGNsYXNzIEx1bWlub3NpdHlNYXRlcmlhbCBleHRlbmRzIFNoYWRlck1hdGVyaWFsIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBsdW1pbm9zaXR5IG1hdGVyaWFsLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtCb29sZWFufSBbY29sb3JPdXRwdXQ9ZmFsc2VdIC0gRGVmaW5lcyB3aGV0aGVyIHRoZSBzaGFkZXIgc2hvdWxkIG91dHB1dCBjb2xvdXJzIHNjYWxlZCB3aXRoIHRoZWlyIGx1bWluYW5jZSB2YWx1ZS5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjJ9IFtsdW1pbmFuY2VSYW5nZV0gLSBJZiBwcm92aWRlZCwgdGhlIHNoYWRlciB3aWxsIG1hc2sgb3V0IHRleGVscyB0aGF0IGFyZW4ndCBpbiB0aGUgc3BlY2lmaWVkIGx1bWluYW5jZSByYW5nZS5cclxuXHQgKi9cclxuXHJcblx0Y29uc3RydWN0b3IoY29sb3JPdXRwdXQgPSBmYWxzZSwgbHVtaW5hbmNlUmFuZ2UgPSBudWxsKSB7XHJcblxyXG5cdFx0Y29uc3QgbWFza0x1bWluYW5jZSA9IChsdW1pbmFuY2VSYW5nZSAhPT0gbnVsbCk7XHJcblxyXG5cdFx0c3VwZXIoe1xyXG5cclxuXHRcdFx0dHlwZTogXCJMdW1pbm9zaXR5TWF0ZXJpYWxcIixcclxuXHJcblx0XHRcdHVuaWZvcm1zOiB7XHJcblxyXG5cdFx0XHRcdHREaWZmdXNlOiBuZXcgVW5pZm9ybShudWxsKSxcclxuXHRcdFx0XHRkaXN0aW5jdGlvbjogbmV3IFVuaWZvcm0oMS4wKSxcclxuXHRcdFx0XHRyYW5nZTogbmV3IFVuaWZvcm0obWFza0x1bWluYW5jZSA/IGx1bWluYW5jZVJhbmdlIDogbmV3IFZlY3RvcjIoKSlcclxuXHJcblx0XHRcdH0sXHJcblxyXG5cdFx0XHRmcmFnbWVudFNoYWRlcjogZnJhZ21lbnQsXHJcblx0XHRcdHZlcnRleFNoYWRlcjogdmVydGV4XHJcblxyXG5cdFx0fSk7XHJcblxyXG5cdFx0dGhpcy5zZXRDb2xvck91dHB1dEVuYWJsZWQoY29sb3JPdXRwdXQpO1xyXG5cdFx0dGhpcy5zZXRMdW1pbmFuY2VSYW5nZUVuYWJsZWQobWFza0x1bWluYW5jZSk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRW5hYmxlcyBvciBkaXNhYmxlcyBjb2xvciBvdXRwdXQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IGVuYWJsZWQgLSBXaGV0aGVyIGNvbG9yIG91dHB1dCBzaG91bGQgYmUgZW5hYmxlZC5cclxuXHQgKi9cclxuXHJcblx0c2V0Q29sb3JPdXRwdXRFbmFibGVkKGVuYWJsZWQpIHtcclxuXHJcblx0XHRpZihlbmFibGVkKSB7XHJcblxyXG5cdFx0XHR0aGlzLmRlZmluZXMuQ09MT1IgPSBcIjFcIjtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0ZGVsZXRlIHRoaXMuZGVmaW5lcy5DT0xPUjtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgbHVtaW5hbmNlIG1hc2suXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IGVuYWJsZWQgLSBXaGV0aGVyIHRoZSBsdW1pbmFuY2UgbWFzayBzaG91bGQgYmUgZW5hYmxlZC5cclxuXHQgKi9cclxuXHJcblx0c2V0THVtaW5hbmNlUmFuZ2VFbmFibGVkKGVuYWJsZWQpIHtcclxuXHJcblx0XHRpZihlbmFibGVkKSB7XHJcblxyXG5cdFx0XHR0aGlzLmRlZmluZXMuUkFOR0UgPSBcIjFcIjtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0ZGVsZXRlIHRoaXMuZGVmaW5lcy5SQU5HRTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuIiwiaW1wb3J0IHsgQ29sb3IsIFNoYWRlck1hdGVyaWFsLCBVbmlmb3JtIH0gZnJvbSBcInRocmVlXCI7XHJcblxyXG5jb25zdCBmcmFnbWVudCA9IFwidW5pZm9ybSBzYW1wbGVyMkQgdERpZmZ1c2U7XFxyXFxudW5pZm9ybSBzYW1wbGVyMkQgdE1hc2s7XFxyXFxudW5pZm9ybSBzYW1wbGVyMkQgdEVkZ2VzO1xcclxcblxcclxcbnVuaWZvcm0gdmVjMyB2aXNpYmxlRWRnZUNvbG9yO1xcclxcbnVuaWZvcm0gdmVjMyBoaWRkZW5FZGdlQ29sb3I7XFxyXFxudW5pZm9ybSBmbG9hdCBwdWxzZTtcXHJcXG51bmlmb3JtIGZsb2F0IGVkZ2VTdHJlbmd0aDtcXHJcXG5cXHJcXG4jaWZkZWYgVVNFX1BBVFRFUk5cXHJcXG5cXHJcXG5cXHR1bmlmb3JtIHNhbXBsZXIyRCB0UGF0dGVybjtcXHJcXG5cXHR2YXJ5aW5nIHZlYzIgdlBhdHRlcm5Db29yZDtcXHJcXG5cXHJcXG4jZW5kaWZcXHJcXG5cXHJcXG52YXJ5aW5nIHZlYzIgdlV2O1xcclxcblxcclxcbnZvaWQgbWFpbigpIHtcXHJcXG5cXHJcXG5cXHR2ZWM0IGNvbG9yID0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYpO1xcclxcblxcdHZlYzIgZWRnZSA9IHRleHR1cmUyRCh0RWRnZXMsIHZVdikucmc7XFxyXFxuXFx0dmVjMiBtYXNrID0gdGV4dHVyZTJEKHRNYXNrLCB2VXYpLnJnO1xcclxcblxcclxcblxcdCNpZm5kZWYgWF9SQVlcXHJcXG5cXHJcXG5cXHRcXHRlZGdlLnkgPSAwLjA7XFxyXFxuXFxyXFxuXFx0I2VuZGlmXFxyXFxuXFxyXFxuXFx0ZWRnZSAqPSAoZWRnZVN0cmVuZ3RoICogbWFzay54ICogcHVsc2UpO1xcclxcblxcdHZlYzMgb3V0bGluZUNvbG9yID0gZWRnZS54ICogdmlzaWJsZUVkZ2VDb2xvciArIGVkZ2UueSAqIGhpZGRlbkVkZ2VDb2xvcjtcXHJcXG5cXHJcXG5cXHQjaWZkZWYgQUxQSEFfQkxFTkRJTkdcXHJcXG5cXHJcXG5cXHRcXHRjb2xvci5yZ2IgPSBtaXgoY29sb3IucmdiLCBvdXRsaW5lQ29sb3IsIG1heChlZGdlLngsIGVkZ2UueSkpO1xcclxcblxcclxcblxcdCNlbHNlXFxyXFxuXFxyXFxuXFx0XFx0Y29sb3IucmdiICs9IG91dGxpbmVDb2xvcjtcXHJcXG5cXHJcXG5cXHQjZW5kaWZcXHJcXG5cXHJcXG5cXHQjaWZkZWYgVVNFX1BBVFRFUk5cXHJcXG5cXHJcXG5cXHRcXHR2ZWMzIHBhdHRlcm5Db2xvciA9IHRleHR1cmUyRCh0UGF0dGVybiwgdlBhdHRlcm5Db29yZCkucmdiO1xcclxcblxcclxcblxcdFxcdCNpZmRlZiBYX1JBWVxcclxcblxcclxcblxcdFxcdFxcdGZsb2F0IGhpZGRlbkZhY3RvciA9IDAuNTtcXHJcXG5cXHJcXG5cXHRcXHQjZWxzZVxcclxcblxcclxcblxcdFxcdFxcdGZsb2F0IGhpZGRlbkZhY3RvciA9IDAuMDtcXHJcXG5cXHJcXG5cXHRcXHQjZW5kaWZcXHJcXG5cXHJcXG5cXHRcXHRmbG9hdCB2aXNpYmlsaXR5RmFjdG9yID0gKDEuMCAtIG1hc2sueSA+IDAuMCkgPyAxLjAgOiBoaWRkZW5GYWN0b3I7XFxyXFxuXFxyXFxuXFx0XFx0Y29sb3IucmdiICs9IHZpc2liaWxpdHlGYWN0b3IgKiAoMS4wIC0gbWFzay54KSAqICgxLjAgLSBwYXR0ZXJuQ29sb3IpO1xcclxcblxcclxcblxcdCNlbmRpZlxcclxcblxcclxcblxcdGdsX0ZyYWdDb2xvciA9IGNvbG9yO1xcclxcblxcclxcbn1cXHJcXG5cIjtcclxuY29uc3QgdmVydGV4ID0gXCIjaWZkZWYgVVNFX1BBVFRFUk5cXHJcXG5cXHJcXG5cXHR1bmlmb3JtIGZsb2F0IGFzcGVjdDtcXHJcXG5cXHR1bmlmb3JtIGZsb2F0IHBhdHRlcm5TY2FsZTtcXHJcXG5cXHR2YXJ5aW5nIHZlYzIgdlBhdHRlcm5Db29yZDtcXHJcXG5cXHJcXG4jZW5kaWZcXHJcXG5cXHJcXG52YXJ5aW5nIHZlYzIgdlV2O1xcclxcblxcclxcbnZvaWQgbWFpbigpIHtcXHJcXG5cXHJcXG5cXHQjaWZkZWYgVVNFX1BBVFRFUk5cXHJcXG5cXHJcXG5cXHRcXHR2ZWMyIGFzcGVjdENvcnJlY3Rpb24gPSB2ZWMyKGFzcGVjdCwgMS4wKTtcXHJcXG5cXHRcXHR2UGF0dGVybkNvb3JkID0gdXYgKiBhc3BlY3RDb3JyZWN0aW9uICogcGF0dGVyblNjYWxlO1xcclxcblxcclxcblxcdCNlbmRpZlxcclxcblxcclxcblxcdHZVdiA9IHV2O1xcclxcblxcclxcblxcdGdsX1Bvc2l0aW9uID0gcHJvamVjdGlvbk1hdHJpeCAqIG1vZGVsVmlld01hdHJpeCAqIHZlYzQocG9zaXRpb24sIDEuMCk7XFxyXFxuXFxyXFxufVxcclxcblwiO1xyXG5cclxuLyoqXHJcbiAqIEFuIG91dGxpbmUgYmxlbmQgc2hhZGVyIG1hdGVyaWFsLlxyXG4gKi9cclxuXHJcbmV4cG9ydCBjbGFzcyBPdXRsaW5lQmxlbmRNYXRlcmlhbCBleHRlbmRzIFNoYWRlck1hdGVyaWFsIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBvdXRsaW5lIGJsZW5kIG1hdGVyaWFsLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIFRoZSBvcHRpb25zLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5lZGdlU3RyZW5ndGg9MS4wXSAtIFRoZSBlZGdlIHN0cmVuZ3RoLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5wYXR0ZXJuU2NhbGU9MS4wXSAtIFRoZSBzY2FsZSBvZiB0aGUgcGF0dGVybiB0ZXh0dXJlLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy52aXNpYmxlRWRnZUNvbG9yPTB4ZmZmZmZmXSAtIFRoZSBjb2xvciBvZiB2aXNpYmxlIGVkZ2VzLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5oaWRkZW5FZGdlQ29sb3I9MHgyMjA5MEFdIC0gVGhlIGNvbG9yIG9mIGhpZGRlbiBlZGdlcy5cclxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IFthbHBoYUJsZW5kaW5nPWZhbHNlXSAtIFdoZXRoZXIgdGhlIG91dGxpbmUgc2hvdWxkIGJlIGJsZW5kZWQgdXNpbmcgYWxwaGEuXHJcblx0ICogQHBhcmFtIHtCb29sZWFufSBbeFJheT10cnVlXSAtIFdoZXRoZXIgaGlkZGVuIHBhcnRzIG9mIHNlbGVjdGVkIG9iamVjdHMgc2hvdWxkIGJlIHZpc2libGUuXHJcblx0ICovXHJcblxyXG5cdGNvbnN0cnVjdG9yKG9wdGlvbnMgPSB7fSkge1xyXG5cclxuXHRcdGNvbnN0IHNldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7XHJcblx0XHRcdGVkZ2VTdHJlbmd0aDogMS4wLFxyXG5cdFx0XHRwYXR0ZXJuU2NhbGU6IDEuMCxcclxuXHRcdFx0dmlzaWJsZUVkZ2VDb2xvcjogMHhmZmZmZmYsXHJcblx0XHRcdGhpZGRlbkVkZ2VDb2xvcjogMHgyMjA5MEEsXHJcblx0XHRcdGFscGhhQmxlbmRpbmc6IGZhbHNlLFxyXG5cdFx0XHR4UmF5OiB0cnVlXHJcblx0XHR9LCBvcHRpb25zKTtcclxuXHJcblx0XHRzdXBlcih7XHJcblxyXG5cdFx0XHR0eXBlOiBcIk91dGxpbmVCbGVuZE1hdGVyaWFsXCIsXHJcblxyXG5cdFx0XHR1bmlmb3Jtczoge1xyXG5cclxuXHRcdFx0XHRwdWxzZTogbmV3IFVuaWZvcm0oMS4wKSxcclxuXHRcdFx0XHRhc3BlY3Q6IG5ldyBVbmlmb3JtKDEuMCksXHJcblxyXG5cdFx0XHRcdHREaWZmdXNlOiBuZXcgVW5pZm9ybShudWxsKSxcclxuXHRcdFx0XHR0TWFzazogbmV3IFVuaWZvcm0obnVsbCksXHJcblx0XHRcdFx0dEVkZ2VzOiBuZXcgVW5pZm9ybShudWxsKSxcclxuXHRcdFx0XHR0UGF0dGVybjogbmV3IFVuaWZvcm0obnVsbCksXHJcblxyXG5cdFx0XHRcdGVkZ2VTdHJlbmd0aDogbmV3IFVuaWZvcm0oc2V0dGluZ3MuZWRnZVN0cmVuZ3RoKSxcclxuXHRcdFx0XHRwYXR0ZXJuU2NhbGU6IG5ldyBVbmlmb3JtKHNldHRpbmdzLnBhdHRlcm5TY2FsZSksXHJcblxyXG5cdFx0XHRcdHZpc2libGVFZGdlQ29sb3I6IG5ldyBVbmlmb3JtKG5ldyBDb2xvcihzZXR0aW5ncy52aXNpYmxlRWRnZUNvbG9yKSksXHJcblx0XHRcdFx0aGlkZGVuRWRnZUNvbG9yOiBuZXcgVW5pZm9ybShuZXcgQ29sb3Ioc2V0dGluZ3MuaGlkZGVuRWRnZUNvbG9yKSlcclxuXHJcblx0XHRcdH0sXHJcblxyXG5cdFx0XHRmcmFnbWVudFNoYWRlcjogZnJhZ21lbnQsXHJcblx0XHRcdHZlcnRleFNoYWRlcjogdmVydGV4LFxyXG5cclxuXHRcdFx0ZGVwdGhXcml0ZTogZmFsc2UsXHJcblx0XHRcdGRlcHRoVGVzdDogZmFsc2VcclxuXHJcblx0XHR9KTtcclxuXHJcblx0XHR0aGlzLnNldEFscGhhQmxlbmRpbmdFbmFibGVkKHNldHRpbmdzLmFscGhhQmxlbmRpbmcpO1xyXG5cdFx0dGhpcy5zZXRYUmF5RW5hYmxlZChzZXR0aW5ncy54UmF5KTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBhbHBoYSBibGVuZGluZy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gZW5hYmxlZCAtIFdoZXRoZXIgdGhlIGFscGhhIGJsZW5kaW5nIHNob3VsZCBiZSBlbmFibGVkLlxyXG5cdCAqL1xyXG5cclxuXHRzZXRBbHBoYUJsZW5kaW5nRW5hYmxlZChlbmFibGVkKSB7XHJcblxyXG5cdFx0aWYoZW5hYmxlZCkge1xyXG5cclxuXHRcdFx0dGhpcy5kZWZpbmVzLkFMUEhBX0JMRU5ESU5HID0gXCIxXCI7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGRlbGV0ZSB0aGlzLmRlZmluZXMuQUxQSEFfQkxFTkRJTkc7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERlZmluZXMgd2hldGhlciBoaWRkZW4gcGFydHMgb2Ygc2VsZWN0ZWQgb2JqZWN0cyBzaG91bGQgYmUgdmlzaWJsZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gZW5hYmxlZCAtIFdoZXRoZXIgaGlkZGVuIHBhcnRzIG9mIHNlbGVjdGVkIG9iamVjdHMgc2hvdWxkIGJlIHZpc2libGUuXHJcblx0ICovXHJcblxyXG5cdHNldFhSYXlFbmFibGVkKGVuYWJsZWQpIHtcclxuXHJcblx0XHRpZihlbmFibGVkKSB7XHJcblxyXG5cdFx0XHR0aGlzLmRlZmluZXMuWF9SQVkgPSBcIjFcIjtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0ZGVsZXRlIHRoaXMuZGVmaW5lcy5YX1JBWTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyBhIHBhdHRlcm4gdGV4dHVyZSB0byB1c2UgYXMgb3ZlcmxheS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZX0gW3RleHR1cmU9bnVsbF0gLSBBIHBhdHRlcm4gdGV4dHVyZS4gU2V0IHRvIG51bGwgdG8gZGlzYWJsZSB0aGUgcGF0dGVybi5cclxuXHQgKi9cclxuXHJcblx0c2V0UGF0dGVyblRleHR1cmUodGV4dHVyZSA9IG51bGwpIHtcclxuXHJcblx0XHRpZih0ZXh0dXJlICE9PSBudWxsKSB7XHJcblxyXG5cdFx0XHR0aGlzLmRlZmluZXMuVVNFX1BBVFRFUk4gPSBcIjFcIjtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0ZGVsZXRlIHRoaXMuZGVmaW5lcy5VU0VfUEFUVEVSTjtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy51bmlmb3Jtcy50UGF0dGVybi52YWx1ZSA9IHRleHR1cmU7XHJcblx0XHR0aGlzLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxufVxyXG4iLCJpbXBvcnQgeyBTaGFkZXJNYXRlcmlhbCwgVW5pZm9ybSwgVmVjdG9yMiB9IGZyb20gXCJ0aHJlZVwiO1xyXG5cclxuY29uc3QgZnJhZ21lbnQgPSBcInVuaWZvcm0gc2FtcGxlcjJEIHRNYXNrO1xcclxcblxcclxcbnZhcnlpbmcgdmVjMiB2VXYwO1xcclxcbnZhcnlpbmcgdmVjMiB2VXYxO1xcclxcbnZhcnlpbmcgdmVjMiB2VXYyO1xcclxcbnZhcnlpbmcgdmVjMiB2VXYzO1xcclxcblxcclxcbnZvaWQgbWFpbigpIHtcXHJcXG5cXHJcXG5cXHR2ZWMyIGMwID0gdGV4dHVyZTJEKHRNYXNrLCB2VXYwKS5yZztcXHJcXG5cXHR2ZWMyIGMxID0gdGV4dHVyZTJEKHRNYXNrLCB2VXYxKS5yZztcXHJcXG5cXHR2ZWMyIGMyID0gdGV4dHVyZTJEKHRNYXNrLCB2VXYyKS5yZztcXHJcXG5cXHR2ZWMyIGMzID0gdGV4dHVyZTJEKHRNYXNrLCB2VXYzKS5yZztcXHJcXG5cXHJcXG5cXHRmbG9hdCBkMCA9IChjMC54IC0gYzEueCkgKiAwLjU7XFxyXFxuXFx0ZmxvYXQgZDEgPSAoYzIueCAtIGMzLngpICogMC41O1xcclxcblxcdGZsb2F0IGQgPSBsZW5ndGgodmVjMihkMCwgZDEpKTtcXHJcXG5cXHJcXG5cXHRmbG9hdCBhMCA9IG1pbihjMC55LCBjMS55KTtcXHJcXG5cXHRmbG9hdCBhMSA9IG1pbihjMi55LCBjMy55KTtcXHJcXG5cXHRmbG9hdCB2aXNpYmlsaXR5RmFjdG9yID0gbWluKGEwLCBhMSk7XFxyXFxuXFxyXFxuXFx0Z2xfRnJhZ0NvbG9yLnJnID0gKDEuMCAtIHZpc2liaWxpdHlGYWN0b3IgPiAwLjAwMSkgPyB2ZWMyKGQsIDAuMCkgOiB2ZWMyKDAuMCwgZCk7XFxyXFxuXFxyXFxufVxcclxcblwiO1xyXG5jb25zdCB2ZXJ0ZXggPSBcInVuaWZvcm0gdmVjMiB0ZXhlbFNpemU7XFxyXFxuXFxyXFxudmFyeWluZyB2ZWMyIHZVdjA7XFxyXFxudmFyeWluZyB2ZWMyIHZVdjE7XFxyXFxudmFyeWluZyB2ZWMyIHZVdjI7XFxyXFxudmFyeWluZyB2ZWMyIHZVdjM7XFxyXFxuXFxyXFxudm9pZCBtYWluKCkge1xcclxcblxcclxcblxcdHZVdjAgPSB2ZWMyKHV2LnggKyB0ZXhlbFNpemUueCwgdXYueSk7XFxyXFxuXFx0dlV2MSA9IHZlYzIodXYueCAtIHRleGVsU2l6ZS54LCB1di55KTtcXHJcXG5cXHR2VXYyID0gdmVjMih1di54LCB1di55ICsgdGV4ZWxTaXplLnkpO1xcclxcblxcdHZVdjMgPSB2ZWMyKHV2LngsIHV2LnkgLSB0ZXhlbFNpemUueSk7XFxyXFxuXFxyXFxuXFx0Z2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbW9kZWxWaWV3TWF0cml4ICogdmVjNChwb3NpdGlvbiwgMS4wKTtcXHJcXG5cXHJcXG59XFxyXFxuXCI7XHJcblxyXG4vKipcclxuICogQW4gb3V0bGluZSBlZGdlIGRldGVjdGlvbiBzaGFkZXIgbWF0ZXJpYWwuXHJcbiAqL1xyXG5cclxuZXhwb3J0IGNsYXNzIE91dGxpbmVFZGdlc01hdGVyaWFsIGV4dGVuZHMgU2hhZGVyTWF0ZXJpYWwge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IG91dGxpbmUgZWRnZSBkZXRlY3Rpb24gbWF0ZXJpYWwuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjJ9IFt0ZXhlbFNpemVdIC0gVGhlIGFic29sdXRlIHNjcmVlbiB0ZXhlbCBzaXplLlxyXG5cdCAqL1xyXG5cclxuXHRjb25zdHJ1Y3Rvcih0ZXhlbFNpemUgPSBuZXcgVmVjdG9yMigpKSB7XHJcblxyXG5cdFx0c3VwZXIoe1xyXG5cclxuXHRcdFx0dHlwZTogXCJPdXRsaW5lRWRnZXNNYXRlcmlhbFwiLFxyXG5cclxuXHRcdFx0dW5pZm9ybXM6IHtcclxuXHJcblx0XHRcdFx0dE1hc2s6IG5ldyBVbmlmb3JtKG51bGwpLFxyXG5cdFx0XHRcdHRleGVsU2l6ZTogbmV3IFVuaWZvcm0obmV3IFZlY3RvcjIoKSlcclxuXHJcblx0XHRcdH0sXHJcblxyXG5cdFx0XHRmcmFnbWVudFNoYWRlcjogZnJhZ21lbnQsXHJcblx0XHRcdHZlcnRleFNoYWRlcjogdmVydGV4LFxyXG5cclxuXHRcdFx0ZGVwdGhXcml0ZTogZmFsc2UsXHJcblx0XHRcdGRlcHRoVGVzdDogZmFsc2VcclxuXHJcblx0XHR9KTtcclxuXHJcblx0XHR0aGlzLnNldFRleGVsU2l6ZSh0ZXhlbFNpemUueCwgdGV4ZWxTaXplLnkpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHRleGVsIHNpemUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge051bWJlcn0geCAtIFRoZSB0ZXhlbCB3aWR0aC5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0geSAtIFRoZSB0ZXhlbCBoZWlnaHQuXHJcblx0ICovXHJcblxyXG5cdHNldFRleGVsU2l6ZSh4LCB5KSB7XHJcblxyXG5cdFx0dGhpcy51bmlmb3Jtcy50ZXhlbFNpemUudmFsdWUuc2V0KHgsIHkpO1xyXG5cclxuXHR9XHJcblxyXG59XHJcbiIsImltcG9ydCB7IFNoYWRlck1hdGVyaWFsLCBVbmlmb3JtLCBWZWN0b3IyIH0gZnJvbSBcInRocmVlXCI7XHJcblxyXG5jb25zdCBmcmFnbWVudCA9IFwidW5pZm9ybSBzYW1wbGVyMkQgdERpZmZ1c2U7XFxyXFxudW5pZm9ybSBmbG9hdCBncmFudWxhcml0eTtcXHJcXG51bmlmb3JtIGZsb2F0IGR4O1xcclxcbnVuaWZvcm0gZmxvYXQgZHk7XFxyXFxuXFxyXFxudmFyeWluZyB2ZWMyIHZVdjtcXHJcXG5cXHJcXG52b2lkIG1haW4oKSB7XFxyXFxuXFxyXFxuXFx0dmVjNCB0ZXhlbDtcXHJcXG5cXHJcXG5cXHRpZihncmFudWxhcml0eSA+IDAuMCkge1xcclxcblxcclxcblxcdFxcdHZlYzIgY29vcmQgPSB2ZWMyKFxcclxcblxcdFxcdFxcdGR4ICogKGZsb29yKHZVdi54IC8gZHgpICsgMC41KSxcXHJcXG5cXHRcXHRcXHRkeSAqIChmbG9vcih2VXYueSAvIGR5KSArIDAuNSlcXHJcXG5cXHRcXHQpO1xcclxcblxcclxcblxcdFxcdHRleGVsID0gdGV4dHVyZTJEKHREaWZmdXNlLCBjb29yZCk7XFxyXFxuXFxyXFxuXFx0fSBlbHNlIHtcXHJcXG5cXHJcXG5cXHRcXHR0ZXhlbCA9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2KTtcXHJcXG5cXHJcXG5cXHR9XFxyXFxuXFxyXFxuXFx0Z2xfRnJhZ0NvbG9yID0gdGV4ZWw7XFxyXFxuXFxyXFxufVxcclxcblwiO1xyXG5jb25zdCB2ZXJ0ZXggPSBcInZhcnlpbmcgdmVjMiB2VXY7XFxyXFxuXFxyXFxudm9pZCBtYWluKCkge1xcclxcblxcclxcblxcdHZVdiA9IHV2O1xcclxcblxcdGdsX1Bvc2l0aW9uID0gcHJvamVjdGlvbk1hdHJpeCAqIG1vZGVsVmlld01hdHJpeCAqIHZlYzQocG9zaXRpb24sIDEuMCk7XFxyXFxuXFxyXFxufVxcclxcblwiO1xyXG5cclxuLyoqXHJcbiAqIEEgcGl4ZWxhdGlvbiBzaGFkZXIgbWF0ZXJpYWwuXHJcbiAqXHJcbiAqIE9yaWdpbmFsIHNoYWRlciBjb2RlIGJ5IFJvYmVydCBDYXNhbm92YTpcclxuICogIGh0dHBzOi8vZ2l0aHViLmNvbS9yb2JlcnRjYXNhbm92YS9waXhlbGF0ZS1zaGFkZXJcclxuICovXHJcblxyXG5leHBvcnQgY2xhc3MgUGl4ZWxhdGlvbk1hdGVyaWFsIGV4dGVuZHMgU2hhZGVyTWF0ZXJpYWwge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHBpeGVsYXRpb24gbWF0ZXJpYWwuXHJcblx0ICovXHJcblxyXG5cdGNvbnN0cnVjdG9yKCkge1xyXG5cclxuXHRcdHN1cGVyKHtcclxuXHJcblx0XHRcdHR5cGU6IFwiUGl4ZWxhdGlvbk1hdGVyaWFsXCIsXHJcblxyXG5cdFx0XHR1bmlmb3Jtczoge1xyXG5cclxuXHRcdFx0XHR0RGlmZnVzZTogbmV3IFVuaWZvcm0obnVsbCksXHJcblx0XHRcdFx0Z3JhbnVsYXJpdHk6IG5ldyBVbmlmb3JtKDEuMCksXHJcblx0XHRcdFx0cmVzb2x1dGlvbjogbmV3IFVuaWZvcm0obmV3IFZlY3RvcjIoMS4wLCAxLjApKSxcclxuXHRcdFx0XHRkeDogbmV3IFVuaWZvcm0oMS4wKSxcclxuXHRcdFx0XHRkeTogbmV3IFVuaWZvcm0oMS4wKVxyXG5cclxuXHRcdFx0fSxcclxuXHJcblx0XHRcdGZyYWdtZW50U2hhZGVyOiBmcmFnbWVudCxcclxuXHRcdFx0dmVydGV4U2hhZGVyOiB2ZXJ0ZXgsXHJcblxyXG5cdFx0XHRkZXB0aFdyaXRlOiBmYWxzZSxcclxuXHRcdFx0ZGVwdGhUZXN0OiBmYWxzZVxyXG5cclxuXHRcdH0pO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBwaXhlbCBncmFudWxhcml0eS5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtOdW1iZXJ9XHJcblx0ICovXHJcblxyXG5cdGdldCBncmFudWxhcml0eSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy51bmlmb3Jtcy5ncmFudWxhcml0eS52YWx1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBIGhpZ2hlciB2YWx1ZSB5aWVsZHMgY29hcnNlciB2aXN1YWxzLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge051bWJlcn1cclxuXHQgKi9cclxuXHJcblx0c2V0IGdyYW51bGFyaXR5KHgpIHtcclxuXHJcblx0XHRjb25zdCB1bmlmb3JtcyA9IHRoaXMudW5pZm9ybXM7XHJcblx0XHRjb25zdCByZXNvbHV0aW9uID0gdW5pZm9ybXMucmVzb2x1dGlvbi52YWx1ZTtcclxuXHJcblx0XHR1bmlmb3Jtcy5ncmFudWxhcml0eS52YWx1ZSA9IHg7XHJcblx0XHR1bmlmb3Jtcy5keC52YWx1ZSA9IHggLyByZXNvbHV0aW9uLng7XHJcblx0XHR1bmlmb3Jtcy5keS52YWx1ZSA9IHggLyByZXNvbHV0aW9uLnk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgcmVzb2x1dGlvbi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSB3aWR0aCAtIFRoZSB3aWR0aC5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gaGVpZ2h0IC0gVGhlIGhlaWdodC5cclxuXHQgKi9cclxuXHJcblx0c2V0UmVzb2x1dGlvbih3aWR0aCwgaGVpZ2h0KSB7XHJcblxyXG5cdFx0dGhpcy51bmlmb3Jtcy5yZXNvbHV0aW9uLnZhbHVlLnNldCh3aWR0aCwgaGVpZ2h0KTtcclxuXHRcdHRoaXMuZ3JhbnVsYXJpdHkgPSB0aGlzLmdyYW51bGFyaXR5O1xyXG5cclxuXHR9XHJcblxyXG59XHJcbiIsImltcG9ydCB7IFNoYWRlck1hdGVyaWFsLCBVbmlmb3JtLCBWZWN0b3IyIH0gZnJvbSBcInRocmVlXCI7XHJcblxyXG5jb25zdCBmcmFnbWVudCA9IFwiI2luY2x1ZGUgPGNvbW1vbj5cXHJcXG5cXHJcXG51bmlmb3JtIHNhbXBsZXIyRCB0RGlmZnVzZTtcXHJcXG51bmlmb3JtIHNhbXBsZXIyRCB0RGVwdGg7XFxyXFxuXFxyXFxudW5pZm9ybSB2ZWMyIHRleGVsU2l6ZTtcXHJcXG51bmlmb3JtIHZlYzIgaGFsZlRleGVsU2l6ZTtcXHJcXG5cXHJcXG51bmlmb3JtIGZsb2F0IGNhbWVyYU5lYXI7XFxyXFxudW5pZm9ybSBmbG9hdCBjYW1lcmFGYXI7XFxyXFxuXFxyXFxudW5pZm9ybSBmbG9hdCBmb2NhbExlbmd0aDtcXHJcXG51bmlmb3JtIGZsb2F0IGZvY2FsU3RvcDtcXHJcXG5cXHJcXG51bmlmb3JtIGZsb2F0IG1heEJsdXI7XFxyXFxudW5pZm9ybSBmbG9hdCBsdW1pbmFuY2VUaHJlc2hvbGQ7XFxyXFxudW5pZm9ybSBmbG9hdCBsdW1pbmFuY2VHYWluO1xcclxcbnVuaWZvcm0gZmxvYXQgYmlhcztcXHJcXG51bmlmb3JtIGZsb2F0IGZyaW5nZTtcXHJcXG51bmlmb3JtIGZsb2F0IGRpdGhlclN0cmVuZ3RoO1xcclxcblxcclxcbiNpZmRlZiBTSEFERVJfRk9DVVNcXHJcXG5cXHJcXG5cXHR1bmlmb3JtIHZlYzIgZm9jdXNDb29yZHM7XFxyXFxuXFxyXFxuI2Vsc2VcXHJcXG5cXHJcXG5cXHR1bmlmb3JtIGZsb2F0IGZvY2FsRGVwdGg7XFxyXFxuXFxyXFxuI2VuZGlmXFxyXFxuXFxyXFxudmFyeWluZyB2ZWMyIHZVdjtcXHJcXG5cXHJcXG4jaWZuZGVmIFVTRV9MT0dERVBUSEJVRlxcclxcblxcclxcblxcdCNpbmNsdWRlIDxwYWNraW5nPlxcclxcblxcclxcblxcdGZsb2F0IHJlYWREZXB0aChzYW1wbGVyMkQgZGVwdGhTYW1wbGVyLCB2ZWMyIGNvb3JkKSB7XFxyXFxuXFxyXFxuXFx0XFx0ZmxvYXQgZnJhZ0Nvb3JkWiA9IHRleHR1cmUyRChkZXB0aFNhbXBsZXIsIGNvb3JkKS54O1xcclxcblxcdFxcdGZsb2F0IHZpZXdaID0gcGVyc3BlY3RpdmVEZXB0aFRvVmlld1ooZnJhZ0Nvb3JkWiwgY2FtZXJhTmVhciwgY2FtZXJhRmFyKTtcXHJcXG5cXHJcXG5cXHRcXHRyZXR1cm4gdmlld1pUb09ydGhvZ3JhcGhpY0RlcHRoKHZpZXdaLCBjYW1lcmFOZWFyLCBjYW1lcmFGYXIpO1xcclxcblxcclxcblxcdH1cXHJcXG5cXHJcXG4jZW5kaWZcXHJcXG5cXHJcXG4jaWZkZWYgUEVOVEFHT05cXHJcXG5cXHJcXG5cXHRmbG9hdCBwZW50YSh2ZWMyIGNvb3Jkcykge1xcclxcblxcclxcblxcdFxcdGNvbnN0IHZlYzQgSFMwID0gdmVjNCggMS4wLCAgICAgICAgICAwLjAsICAgICAgICAgMC4wLCAxLjApO1xcclxcblxcdFxcdGNvbnN0IHZlYzQgSFMxID0gdmVjNCggMC4zMDkwMTY5OTQsICAwLjk1MTA1NjUxNiwgMC4wLCAxLjApO1xcclxcblxcdFxcdGNvbnN0IHZlYzQgSFMyID0gdmVjNCgtMC44MDkwMTY5OTQsICAwLjU4Nzc4NTI1MiwgMC4wLCAxLjApO1xcclxcblxcdFxcdGNvbnN0IHZlYzQgSFMzID0gdmVjNCgtMC44MDkwMTY5OTQsIC0wLjU4Nzc4NTI1MiwgMC4wLCAxLjApO1xcclxcblxcdFxcdGNvbnN0IHZlYzQgSFM0ID0gdmVjNCggMC4zMDkwMTY5OTQsIC0wLjk1MTA1NjUxNiwgMC4wLCAxLjApO1xcclxcblxcdFxcdGNvbnN0IHZlYzQgSFM1ID0gdmVjNCggMC4wLCAgICAgICAgICAwLjAsICAgICAgICAgMS4wLCAxLjApO1xcclxcblxcclxcblxcdFxcdGNvbnN0IHZlYzQgT05FID0gdmVjNCgxLjApO1xcclxcblxcclxcblxcdFxcdGNvbnN0IGZsb2F0IFBfRkVBVEhFUiA9IDAuNDtcXHJcXG5cXHRcXHRjb25zdCBmbG9hdCBOX0ZFQVRIRVIgPSAtUF9GRUFUSEVSO1xcclxcblxcclxcblxcdFxcdGZsb2F0IGluT3JPdXQgPSAtNC4wO1xcclxcblxcclxcblxcdFxcdHZlYzQgUCA9IHZlYzQoY29vcmRzLCB2ZWMyKFJJTkdTX0ZMT0FUIC0gMS4zKSk7XFxyXFxuXFxyXFxuXFx0XFx0dmVjNCBkaXN0ID0gdmVjNChcXHJcXG5cXHRcXHRcXHRkb3QoUCwgSFMwKSxcXHJcXG5cXHRcXHRcXHRkb3QoUCwgSFMxKSxcXHJcXG5cXHRcXHRcXHRkb3QoUCwgSFMyKSxcXHJcXG5cXHRcXHRcXHRkb3QoUCwgSFMzKVxcclxcblxcdFxcdCk7XFxyXFxuXFxyXFxuXFx0XFx0ZGlzdCA9IHNtb290aHN0ZXAoTl9GRUFUSEVSLCBQX0ZFQVRIRVIsIGRpc3QpO1xcclxcblxcclxcblxcdFxcdGluT3JPdXQgKz0gZG90KGRpc3QsIE9ORSk7XFxyXFxuXFxyXFxuXFx0XFx0ZGlzdC54ID0gZG90KFAsIEhTNCk7XFxyXFxuXFx0XFx0ZGlzdC55ID0gSFM1LncgLSBhYnMoUC56KTtcXHJcXG5cXHJcXG5cXHRcXHRkaXN0ID0gc21vb3Roc3RlcChOX0ZFQVRIRVIsIFBfRkVBVEhFUiwgZGlzdCk7XFxyXFxuXFx0XFx0aW5Pck91dCArPSBkaXN0Lng7XFxyXFxuXFxyXFxuXFx0XFx0cmV0dXJuIGNsYW1wKGluT3JPdXQsIDAuMCwgMS4wKTtcXHJcXG5cXHJcXG5cXHR9XFxyXFxuXFxyXFxuI2VuZGlmXFxyXFxuXFxyXFxuI2lmZGVmIFNIT1dfRk9DVVNcXHJcXG5cXHJcXG5cXHR2ZWMzIGRlYnVnRm9jdXModmVjMyBjLCBmbG9hdCBibHVyLCBmbG9hdCBkZXB0aCkge1xcclxcblxcclxcblxcdFxcdGZsb2F0IGVkZ2UgPSAwLjAwMiAqIGRlcHRoO1xcclxcblxcdFxcdGZsb2F0IG0gPSBjbGFtcChzbW9vdGhzdGVwKDAuMCwgZWRnZSwgYmx1ciksIDAuMCwgMS4wKTtcXHJcXG5cXHRcXHRmbG9hdCBlID0gY2xhbXAoc21vb3Roc3RlcCgxLjAgLSBlZGdlLCAxLjAsIGJsdXIpLCAwLjAsIDEuMCk7XFxyXFxuXFxyXFxuXFx0XFx0YyA9IG1peChjLCB2ZWMzKDEuMCwgMC41LCAwLjApLCAoMS4wIC0gbSkgKiAwLjYpO1xcclxcblxcdFxcdGMgPSBtaXgoYywgdmVjMygwLjAsIDAuNSwgMS4wKSwgKCgxLjAgLSBlKSAtICgxLjAgLSBtKSkgKiAwLjIpO1xcclxcblxcclxcblxcdFxcdHJldHVybiBjO1xcclxcblxcclxcblxcdH1cXHJcXG5cXHJcXG4jZW5kaWZcXHJcXG5cXHJcXG4jaWZkZWYgVklHTkVUVEVcXHJcXG5cXHJcXG5cXHRmbG9hdCB2aWduZXR0ZSgpIHtcXHJcXG5cXHJcXG5cXHRcXHRjb25zdCB2ZWMyIENFTlRFUiA9IHZlYzIoMC41KTtcXHJcXG5cXHJcXG5cXHRcXHRjb25zdCBmbG9hdCBWSUdORVRURV9PVVQgPSAxLjM7XFxyXFxuXFx0XFx0Y29uc3QgZmxvYXQgVklHTkVUVEVfSU4gPSAwLjA7XFxyXFxuXFx0XFx0Y29uc3QgZmxvYXQgVklHTkVUVEVfRkFERSA9IDIyLjA7IFxcclxcblxcclxcblxcdFxcdGZsb2F0IGQgPSBkaXN0YW5jZSh2VXYsIENFTlRFUik7XFxyXFxuXFx0XFx0ZCA9IHNtb290aHN0ZXAoVklHTkVUVEVfT1VUICsgKGZvY2FsU3RvcCAvIFZJR05FVFRFX0ZBREUpLCBWSUdORVRURV9JTiArIChmb2NhbFN0b3AgLyBWSUdORVRURV9GQURFKSwgZCk7XFxyXFxuXFxyXFxuXFx0XFx0cmV0dXJuIGNsYW1wKGQsIDAuMCwgMS4wKTtcXHJcXG5cXHJcXG5cXHR9XFxyXFxuXFxyXFxuI2VuZGlmXFxyXFxuXFxyXFxudmVjMiByYW5kMih2ZWMyIGNvb3JkKSB7XFxyXFxuXFxyXFxuXFx0dmVjMiBub2lzZTtcXHJcXG5cXHJcXG5cXHQjaWZkZWYgTk9JU0VcXHJcXG5cXHJcXG5cXHRcXHRjb25zdCBmbG9hdCBhID0gMTIuOTg5ODtcXHJcXG5cXHRcXHRjb25zdCBmbG9hdCBiID0gNzguMjMzO1xcclxcblxcdFxcdGNvbnN0IGZsb2F0IGMgPSA0Mzc1OC41NDUzO1xcclxcblxcclxcblxcdFxcdG5vaXNlLnggPSBjbGFtcChmcmFjdChzaW4obW9kKGRvdChjb29yZCwgdmVjMihhLCBiKSksIDMuMTQpKSAqIGMpLCAwLjAsIDEuMCkgKiAyLjAgLSAxLjA7XFxyXFxuXFx0XFx0bm9pc2UueSA9IGNsYW1wKGZyYWN0KHNpbihtb2QoZG90KGNvb3JkLCB2ZWMyKGEsIGIpICogMi4wKSwgMy4xNCkpICogYyksIDAuMCwgMS4wKSAqIDIuMCAtIDEuMDtcXHJcXG5cXHJcXG5cXHQjZWxzZVxcclxcblxcclxcblxcdFxcdG5vaXNlLnggPSAoKGZyYWN0KDEuMCAtIGNvb3JkLnMgKiBoYWxmVGV4ZWxTaXplLngpICogMC4yNSkgKyAoZnJhY3QoY29vcmQudCAqIGhhbGZUZXhlbFNpemUueSkgKiAwLjc1KSkgKiAyLjAgLSAxLjA7XFxyXFxuXFx0XFx0bm9pc2UueSA9ICgoZnJhY3QoMS4wIC0gY29vcmQucyAqIGhhbGZUZXhlbFNpemUueCkgKiAwLjc1KSArIChmcmFjdChjb29yZC50ICogaGFsZlRleGVsU2l6ZS55KSAqIDAuMjUpKSAqIDIuMCAtIDEuMDtcXHJcXG5cXHJcXG5cXHQjZW5kaWZcXHJcXG5cXHJcXG5cXHRyZXR1cm4gbm9pc2U7XFxyXFxuXFxyXFxufVxcclxcblxcclxcbnZlYzMgcHJvY2Vzc1RleGVsKHZlYzIgY29vcmRzLCBmbG9hdCBibHVyKSB7XFxyXFxuXFxyXFxuXFx0dmVjMyBjO1xcclxcblxcdGMuciA9IHRleHR1cmUyRCh0RGlmZnVzZSwgY29vcmRzICsgdmVjMigwLjAsIDEuMCkgKiB0ZXhlbFNpemUgKiBmcmluZ2UgKiBibHVyKS5yO1xcclxcblxcdGMuZyA9IHRleHR1cmUyRCh0RGlmZnVzZSwgY29vcmRzICsgdmVjMigtMC44NjYsIC0wLjUpICogdGV4ZWxTaXplICogZnJpbmdlICogYmx1cikuZztcXHJcXG5cXHRjLmIgPSB0ZXh0dXJlMkQodERpZmZ1c2UsIGNvb3JkcyArIHZlYzIoMC44NjYsIC0wLjUpICogdGV4ZWxTaXplICogZnJpbmdlICogYmx1cikuYjtcXHJcXG5cXHJcXG5cXHQvLyBDYWxjdWxhdGUgdGhlIGx1bWluYW5jZSBvZiB0aGUgY29uc3RydWN0ZWQgY29sb3VyLlxcclxcblxcdGZsb2F0IGx1bWluYW5jZSA9IGxpbmVhclRvUmVsYXRpdmVMdW1pbmFuY2UoYyk7XFxyXFxuXFx0ZmxvYXQgdGhyZXNob2xkID0gbWF4KChsdW1pbmFuY2UgLSBsdW1pbmFuY2VUaHJlc2hvbGQpICogbHVtaW5hbmNlR2FpbiwgMC4wKTtcXHJcXG5cXHJcXG5cXHRyZXR1cm4gYyArIG1peCh2ZWMzKDAuMCksIGMsIHRocmVzaG9sZCAqIGJsdXIpO1xcclxcblxcclxcbn1cXHJcXG5cXHJcXG5mbG9hdCBsaW5lYXJpemUoZmxvYXQgZGVwdGgpIHtcXHJcXG5cXHJcXG5cXHRyZXR1cm4gLWNhbWVyYUZhciAqIGNhbWVyYU5lYXIgLyAoZGVwdGggKiAoY2FtZXJhRmFyIC0gY2FtZXJhTmVhcikgLSBjYW1lcmFGYXIpO1xcclxcblxcclxcbn1cXHJcXG5cXHJcXG5mbG9hdCBnYXRoZXIoZmxvYXQgaSwgZmxvYXQgaiwgZmxvYXQgcmluZ1NhbXBsZXMsIGlub3V0IHZlYzMgY29sb3IsIGZsb2F0IHcsIGZsb2F0IGgsIGZsb2F0IGJsdXIpIHtcXHJcXG5cXHJcXG5cXHRjb25zdCBmbG9hdCBUV09fUEkgPSA2LjI4MzE4NTMxO1xcclxcblxcclxcblxcdGZsb2F0IHN0ZXAgPSBUV09fUEkgLyByaW5nU2FtcGxlcztcXHJcXG5cXHRmbG9hdCBwdyA9IGNvcyhqICogc3RlcCkgKiBpO1xcclxcblxcdGZsb2F0IHBoID0gc2luKGogKiBzdGVwKSAqIGk7XFxyXFxuXFxyXFxuXFx0I2lmZGVmIFBFTlRBR09OXFxyXFxuXFxyXFxuXFx0XFx0ZmxvYXQgcCA9IHBlbnRhKHZlYzIocHcsIHBoKSk7XFxyXFxuXFxyXFxuXFx0I2Vsc2VcXHJcXG5cXHJcXG5cXHRcXHRmbG9hdCBwID0gMS4wO1xcclxcblxcclxcblxcdCNlbmRpZlxcclxcblxcclxcblxcdGNvbG9yICs9IHByb2Nlc3NUZXhlbCh2VXYgKyB2ZWMyKHB3ICogdywgcGggKiBoKSwgYmx1cikgKiBtaXgoMS4wLCBpIC8gUklOR1NfRkxPQVQsIGJpYXMpICogcDtcXHJcXG5cXHJcXG5cXHRyZXR1cm4gbWl4KDEuMCwgaSAvIFJJTkdTX0ZMT0FULCBiaWFzKSAqIHA7XFxyXFxuXFxyXFxufVxcclxcblxcclxcbnZvaWQgbWFpbigpIHtcXHJcXG5cXHJcXG5cXHQjaWZkZWYgVVNFX0xPR0RFUFRIQlVGXFxyXFxuXFxyXFxuXFx0XFx0ZmxvYXQgZGVwdGggPSBsaW5lYXJpemUodGV4dHVyZTJEKHREZXB0aCwgdlV2KS54KTtcXHJcXG5cXHJcXG5cXHQjZWxzZVxcclxcblxcclxcblxcdFxcdGZsb2F0IGRlcHRoID0gbGluZWFyaXplKHJlYWREZXB0aCh0RGVwdGgsIHZVdikpO1xcclxcblxcclxcblxcdCNlbmRpZlxcclxcblxcclxcblxcdCNpZmRlZiBTSEFERVJfRk9DVVNcXHJcXG5cXHJcXG5cXHRcXHQjaWZkZWYgVVNFX0xPR0RFUFRIQlVGXFxyXFxuXFxyXFxuXFx0XFx0XFx0ZmxvYXQgZkRlcHRoID0gbGluZWFyaXplKHRleHR1cmUyRCh0RGVwdGgsIGZvY3VzQ29vcmRzKS54KTtcXHJcXG5cXHJcXG5cXHRcXHQjZWxzZVxcclxcblxcclxcblxcdFxcdFxcdGZsb2F0IGZEZXB0aCA9IGxpbmVhcml6ZShyZWFkRGVwdGgodERlcHRoLCBmb2N1c0Nvb3JkcykpO1xcclxcblxcclxcblxcdFxcdCNlbmRpZlxcclxcblxcclxcblxcdCNlbHNlXFxyXFxuXFxyXFxuXFx0XFx0ZmxvYXQgZkRlcHRoID0gZm9jYWxEZXB0aDtcXHJcXG5cXHJcXG5cXHQjZW5kaWZcXHJcXG5cXHJcXG5cXHQjaWZkZWYgTUFOVUFMX0RPRlxcclxcblxcclxcblxcdFxcdGNvbnN0IGZsb2F0IG5Eb0ZTdGFydCA9IDEuMDsgXFxyXFxuXFx0XFx0Y29uc3QgZmxvYXQgbkRvRkRpc3QgPSAyLjA7XFxyXFxuXFx0XFx0Y29uc3QgZmxvYXQgZkRvRlN0YXJ0ID0gMS4wO1xcclxcblxcdFxcdGNvbnN0IGZsb2F0IGZEb0ZEaXN0ID0gMy4wO1xcclxcblxcclxcblxcdFxcdGZsb2F0IGZvY2FsUGxhbmUgPSBkZXB0aCAtIGZEZXB0aDtcXHJcXG5cXHRcXHRmbG9hdCBmYXJEb0YgPSAoZm9jYWxQbGFuZSAtIGZEb0ZTdGFydCkgLyBmRG9GRGlzdDtcXHJcXG5cXHRcXHRmbG9hdCBuZWFyRG9GID0gKC1mb2NhbFBsYW5lIC0gbkRvRlN0YXJ0KSAvIG5Eb0ZEaXN0O1xcclxcblxcclxcblxcdFxcdGZsb2F0IGJsdXIgPSAoZm9jYWxQbGFuZSA+IDAuMCkgPyBmYXJEb0YgOiBuZWFyRG9GO1xcclxcblxcclxcblxcdCNlbHNlXFxyXFxuXFxyXFxuXFx0XFx0Y29uc3QgZmxvYXQgQ0lSQ0xFX09GX0NPTkZVU0lPTiA9IDAuMDM7IC8vIDM1bW0gZmlsbSA9IDAuMDNtbSBDb0MuXFxyXFxuXFxyXFxuXFx0XFx0ZmxvYXQgZm9jYWxQbGFuZU1NID0gZkRlcHRoICogMTAwMC4wO1xcclxcblxcdFxcdGZsb2F0IGRlcHRoTU0gPSBkZXB0aCAqIDEwMDAuMDtcXHJcXG5cXHJcXG5cXHRcXHRmbG9hdCBmb2NhbFBsYW5lID0gKGRlcHRoTU0gKiBmb2NhbExlbmd0aCkgLyAoZGVwdGhNTSAtIGZvY2FsTGVuZ3RoKTtcXHJcXG5cXHRcXHRmbG9hdCBmYXJEb0YgPSAoZm9jYWxQbGFuZU1NICogZm9jYWxMZW5ndGgpIC8gKGZvY2FsUGxhbmVNTSAtIGZvY2FsTGVuZ3RoKTtcXHJcXG5cXHRcXHRmbG9hdCBuZWFyRG9GID0gKGZvY2FsUGxhbmVNTSAtIGZvY2FsTGVuZ3RoKSAvIChmb2NhbFBsYW5lTU0gKiBmb2NhbFN0b3AgKiBDSVJDTEVfT0ZfQ09ORlVTSU9OKTtcXHJcXG5cXHJcXG5cXHRcXHRmbG9hdCBibHVyID0gYWJzKGZvY2FsUGxhbmUgLSBmYXJEb0YpICogbmVhckRvRjtcXHJcXG5cXHJcXG5cXHQjZW5kaWZcXHJcXG5cXHJcXG5cXHRibHVyID0gY2xhbXAoYmx1ciwgMC4wLCAxLjApO1xcclxcblxcclxcblxcdC8vIERpdGhlcmluZy5cXHJcXG5cXHR2ZWMyIG5vaXNlID0gcmFuZDIodlV2KSAqIGRpdGhlclN0cmVuZ3RoICogYmx1cjtcXHJcXG5cXHJcXG5cXHRmbG9hdCBibHVyRmFjdG9yWCA9IHRleGVsU2l6ZS54ICogYmx1ciAqIG1heEJsdXIgKyBub2lzZS54O1xcclxcblxcdGZsb2F0IGJsdXJGYWN0b3JZID0gdGV4ZWxTaXplLnkgKiBibHVyICogbWF4Qmx1ciArIG5vaXNlLnk7XFxyXFxuXFxyXFxuXFx0Y29uc3QgaW50IE1BWF9SSU5HX1NBTVBMRVMgPSBSSU5HU19JTlQgKiBTQU1QTEVTX0lOVDtcXHJcXG5cXHJcXG5cXHQvLyBDYWxjdWxhdGlvbiBvZiBmaW5hbCBjb2xvci5cXHJcXG5cXHR2ZWM0IGNvbG9yO1xcclxcblxcclxcblxcdGlmKGJsdXIgPCAwLjA1KSB7XFxyXFxuXFxyXFxuXFx0XFx0Y29sb3IgPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdik7XFxyXFxuXFxyXFxuXFx0fSBlbHNlIHtcXHJcXG5cXHJcXG5cXHRcXHRjb2xvciA9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2KTtcXHJcXG5cXHJcXG5cXHRcXHRmbG9hdCBzID0gMS4wO1xcclxcblxcdFxcdGludCByaW5nU2FtcGxlcztcXHJcXG5cXHJcXG5cXHRcXHRmb3IoaW50IGkgPSAxOyBpIDw9IFJJTkdTX0lOVDsgKytpKSB7XFxyXFxuXFxyXFxuXFx0XFx0XFx0cmluZ1NhbXBsZXMgPSBpICogU0FNUExFU19JTlQ7XFxyXFxuXFxyXFxuXFx0XFx0XFx0Ly8gQ29uc3RhbnQgbG9vcC5cXHJcXG5cXHRcXHRcXHRmb3IoaW50IGogPSAwOyBqIDwgTUFYX1JJTkdfU0FNUExFUzsgKytqKSB7XFxyXFxuXFxyXFxuXFx0XFx0XFx0XFx0Ly8gQnJlYWsgZWFybGllci5cXHJcXG5cXHRcXHRcXHRcXHRpZihqID49IHJpbmdTYW1wbGVzKSB7IGJyZWFrOyB9XFxyXFxuXFxyXFxuXFx0XFx0XFx0XFx0cyArPSBnYXRoZXIoZmxvYXQoaSksIGZsb2F0KGopLCBmbG9hdChyaW5nU2FtcGxlcyksIGNvbG9yLnJnYiwgYmx1ckZhY3RvclgsIGJsdXJGYWN0b3JZLCBibHVyKTtcXHJcXG5cXHJcXG5cXHRcXHRcXHR9XFxyXFxuXFxyXFxuXFx0XFx0fVxcclxcblxcclxcblxcdFxcdGNvbG9yLnJnYiAvPSBzOyAvLyBEaXZpZGUgYnkgc2FtcGxlIGNvdW50LlxcclxcblxcclxcblxcdH1cXHJcXG5cXHJcXG5cXHQjaWZkZWYgU0hPV19GT0NVU1xcclxcblxcclxcblxcdFxcdGNvbG9yLnJnYiA9IGRlYnVnRm9jdXMoY29sb3IucmdiLCBibHVyLCBkZXB0aCk7XFxyXFxuXFxyXFxuXFx0I2VuZGlmXFxyXFxuXFxyXFxuXFx0I2lmZGVmIFZJR05FVFRFXFxyXFxuXFxyXFxuXFx0XFx0Y29sb3IucmdiICo9IHZpZ25ldHRlKCk7XFxyXFxuXFxyXFxuXFx0I2VuZGlmXFxyXFxuXFxyXFxuXFx0Z2xfRnJhZ0NvbG9yID0gY29sb3I7XFxyXFxuXFxyXFxufVxcclxcblwiO1xyXG5jb25zdCB2ZXJ0ZXggPSBcInZhcnlpbmcgdmVjMiB2VXY7XFxyXFxuXFxyXFxudm9pZCBtYWluKCkge1xcclxcblxcclxcblxcdHZVdiA9IHV2O1xcclxcblxcdGdsX1Bvc2l0aW9uID0gcHJvamVjdGlvbk1hdHJpeCAqIG1vZGVsVmlld01hdHJpeCAqIHZlYzQocG9zaXRpb24sIDEuMCk7XFxyXFxuXFxyXFxufVxcclxcblwiO1xyXG5cclxuLyoqXHJcbiAqIERlcHRoIG9mIEZpZWxkIHNoYWRlciB2Mi40LlxyXG4gKlxyXG4gKiBPcmlnaW5hbCBzaGFkZXIgY29kZSBieSBNYXJ0aW5zIFVwaXRpczpcclxuICogIGh0dHA6Ly9ibGVuZGVyYXJ0aXN0cy5vcmcvZm9ydW0vc2hvd3RocmVhZC5waHA/MjM3NDg4LUdMU0wtZGVwdGgtb2YtZmllbGQtd2l0aC1ib2tlaC12Mi00LSh1cGRhdGUpXHJcbiAqL1xyXG5cclxuZXhwb3J0IGNsYXNzIFJlYWxpc3RpY0Jva2VoTWF0ZXJpYWwgZXh0ZW5kcyBTaGFkZXJNYXRlcmlhbCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgYm9rZWgyIG1hdGVyaWFsLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtQZXJzcGVjdGl2ZUNhbWVyYX0gW2NhbWVyYV0gLSBUaGUgbWFpbiBjYW1lcmEuXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIEFkZGl0aW9uYWwgb3B0aW9ucy5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjJ9IFtvcHRpb25zLnRleGVsU2l6ZV0gLSBUaGUgYWJzb2x1dGUgc2NyZWVuIHRleGVsIHNpemUuXHJcblx0ICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5yaW5ncz0zXSAtIFRoZSBudW1iZXIgb2YgYmx1cnJpbmcgaXRlcmF0aW9ucy5cclxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnNhbXBsZXM9Ml0gLSBUaGUgYW1vdW50IG9mIHNhbXBsZXMgdGFrZW4gcGVyIHJpbmcuXHJcblx0ICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5zaG93Rm9jdXM9ZmFsc2VdIC0gV2hldGhlciB0aGUgZm9jdXMgcG9pbnQgc2hvdWxkIGJlIGhpZ2hsaWdodGVkLlxyXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMubWFudWFsRG9GPWZhbHNlXSAtIEVuYWJsZXMgbWFudWFsIGRlcHRoIG9mIGZpZWxkIGJsdXIuXHJcblx0ICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy52aWduZXR0ZT1mYWxzZV0gLSBFbmFibGVzIGEgdmlnbmV0dGUgZWZmZWN0LlxyXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMucGVudGFnb249ZmFsc2VdIC0gRW5hYmxlIHRvIHVzZSBhIHBlbnRhZ29uYWwgc2hhcGUgdG8gc2NhbGUgZ2F0aGVyZWQgdGV4ZWxzLlxyXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuc2hhZGVyRm9jdXM9dHJ1ZV0gLSBEaXNhYmxlIGlmIHlvdSBjb21wdXRlIHlvdXIgb3duIGZvY2FsRGVwdGggKGluIG1ldHJlcyEpLlxyXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMubm9pc2U9dHJ1ZV0gLSBEaXNhYmxlIGlmIHlvdSBkb24ndCB3YW50IG5vaXNlIHBhdHRlcm5zIGZvciBkaXRoZXJpbmcuXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLm1heEJsdXI9MS4wXSAtIFRoZSBtYXhpbXVtIGJsdXIgc3RyZW5ndGguXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmx1bWluYW5jZVRocmVzaG9sZD0wLjVdIC0gQSBsdW1pbmFuY2UgdGhyZXNob2xkLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5sdW1pbmFuY2VHYWluPTIuMF0gLSBBIGx1bWluYW5jZSBnYWluIGZhY3Rvci5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuYmlhcz0wLjVdIC0gQSBibHVyIGJpYXMuXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmZyaW5nZT0wLjddIC0gQSBibHVyIG9mZnNldC5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuZGl0aGVyU3RyZW5ndGg9MC4wMDAxXSAtIFRoZSBkaXRoZXIgc3RyZW5ndGguXHJcblx0ICovXHJcblxyXG5cdGNvbnN0cnVjdG9yKGNhbWVyYSA9IG51bGwsIG9wdGlvbnMgPSB7fSkge1xyXG5cclxuXHRcdGNvbnN0IHNldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7XHJcblx0XHRcdHRleGVsU2l6ZTogbnVsbCxcclxuXHRcdFx0cmluZ3M6IDMsXHJcblx0XHRcdHNhbXBsZXM6IDIsXHJcblx0XHRcdHNob3dGb2N1czogZmFsc2UsXHJcblx0XHRcdG1hbnVhbERvRjogZmFsc2UsXHJcblx0XHRcdHZpZ25ldHRlOiBmYWxzZSxcclxuXHRcdFx0cGVudGFnb246IGZhbHNlLFxyXG5cdFx0XHRzaGFkZXJGb2N1czogdHJ1ZSxcclxuXHRcdFx0bm9pc2U6IHRydWUsXHJcblx0XHRcdG1heEJsdXI6IDEuMCxcclxuXHRcdFx0bHVtaW5hbmNlVGhyZXNob2xkOiAwLjUsXHJcblx0XHRcdGx1bWluYW5jZUdhaW46IDIuMCxcclxuXHRcdFx0YmlhczogMC41LFxyXG5cdFx0XHRmcmluZ2U6IDAuNyxcclxuXHRcdFx0ZGl0aGVyU3RyZW5ndGg6IDAuMDAwMVxyXG5cdFx0fSwgb3B0aW9ucyk7XHJcblxyXG5cdFx0c3VwZXIoe1xyXG5cclxuXHRcdFx0dHlwZTogXCJSZWFsaXN0aWNCb2tlaE1hdGVyaWFsXCIsXHJcblxyXG5cdFx0XHRkZWZpbmVzOiB7XHJcblxyXG5cdFx0XHRcdFJJTkdTX0lOVDogc2V0dGluZ3MucmluZ3MudG9GaXhlZCgwKSxcclxuXHRcdFx0XHRSSU5HU19GTE9BVDogc2V0dGluZ3MucmluZ3MudG9GaXhlZCgxKSxcclxuXHRcdFx0XHRTQU1QTEVTX0lOVDogc2V0dGluZ3Muc2FtcGxlcy50b0ZpeGVkKDApLFxyXG5cdFx0XHRcdFNBTVBMRVNfRkxPQVQ6IHNldHRpbmdzLnNhbXBsZXMudG9GaXhlZCgxKVxyXG5cclxuXHRcdFx0fSxcclxuXHJcblx0XHRcdHVuaWZvcm1zOiB7XHJcblxyXG5cdFx0XHRcdHREaWZmdXNlOiBuZXcgVW5pZm9ybShudWxsKSxcclxuXHRcdFx0XHR0RGVwdGg6IG5ldyBVbmlmb3JtKG51bGwpLFxyXG5cclxuXHRcdFx0XHR0ZXhlbFNpemU6IG5ldyBVbmlmb3JtKG5ldyBWZWN0b3IyKCkpLFxyXG5cdFx0XHRcdGhhbGZUZXhlbFNpemU6IG5ldyBVbmlmb3JtKG5ldyBWZWN0b3IyKCkpLFxyXG5cclxuXHRcdFx0XHRjYW1lcmFOZWFyOiBuZXcgVW5pZm9ybSgwLjEpLFxyXG5cdFx0XHRcdGNhbWVyYUZhcjogbmV3IFVuaWZvcm0oMjAwMCksXHJcblxyXG5cdFx0XHRcdGZvY2FsTGVuZ3RoOiBuZXcgVW5pZm9ybSgyNC4wKSxcclxuXHRcdFx0XHRmb2NhbFN0b3A6IG5ldyBVbmlmb3JtKDAuOSksXHJcblxyXG5cdFx0XHRcdG1heEJsdXI6IG5ldyBVbmlmb3JtKHNldHRpbmdzLm1heEJsdXIpLFxyXG5cdFx0XHRcdGx1bWluYW5jZVRocmVzaG9sZDogbmV3IFVuaWZvcm0oc2V0dGluZ3MubHVtaW5hbmNlVGhyZXNob2xkKSxcclxuXHRcdFx0XHRsdW1pbmFuY2VHYWluOiBuZXcgVW5pZm9ybShzZXR0aW5ncy5sdW1pbmFuY2VHYWluKSxcclxuXHRcdFx0XHRiaWFzOiBuZXcgVW5pZm9ybShzZXR0aW5ncy5iaWFzKSxcclxuXHRcdFx0XHRmcmluZ2U6IG5ldyBVbmlmb3JtKHNldHRpbmdzLmZyaW5nZSksXHJcblx0XHRcdFx0ZGl0aGVyU3RyZW5ndGg6IG5ldyBVbmlmb3JtKHNldHRpbmdzLmRpdGhlclN0cmVuZ3RoKSxcclxuXHJcblx0XHRcdFx0Zm9jdXNDb29yZHM6IG5ldyBVbmlmb3JtKG5ldyBWZWN0b3IyKDAuNSwgMC41KSksXHJcblx0XHRcdFx0Zm9jYWxEZXB0aDogbmV3IFVuaWZvcm0oMS4wKVxyXG5cclxuXHRcdFx0fSxcclxuXHJcblx0XHRcdGZyYWdtZW50U2hhZGVyOiBmcmFnbWVudCxcclxuXHRcdFx0dmVydGV4U2hhZGVyOiB2ZXJ0ZXgsXHJcblxyXG5cdFx0XHRkZXB0aFdyaXRlOiBmYWxzZSxcclxuXHRcdFx0ZGVwdGhUZXN0OiBmYWxzZVxyXG5cclxuXHRcdH0pO1xyXG5cclxuXHRcdHRoaXMuc2V0U2hvd0ZvY3VzRW5hYmxlZChzZXR0aW5ncy5zaG93Rm9jdXMpO1xyXG5cdFx0dGhpcy5zZXRNYW51YWxEZXB0aE9mRmllbGRFbmFibGVkKHNldHRpbmdzLm1hbnVhbERvRik7XHJcblx0XHR0aGlzLnNldFZpZ25ldHRlRW5hYmxlZChzZXR0aW5ncy52aWduZXR0ZSk7XHJcblx0XHR0aGlzLnNldFBlbnRhZ29uRW5hYmxlZChzZXR0aW5ncy5wZW50YWdvbik7XHJcblx0XHR0aGlzLnNldFNoYWRlckZvY3VzRW5hYmxlZChzZXR0aW5ncy5zaGFkZXJGb2N1cyk7XHJcblx0XHR0aGlzLnNldE5vaXNlRW5hYmxlZChzZXR0aW5ncy5ub2lzZSk7XHJcblxyXG5cdFx0aWYoc2V0dGluZ3MudGV4ZWxTaXplICE9PSBudWxsKSB7XHJcblxyXG5cdFx0XHR0aGlzLnNldFRleGVsU2l6ZShzZXR0aW5ncy50ZXhlbFNpemUueCwgc2V0dGluZ3MudGV4ZWxTaXplLnkpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLmFkb3B0Q2FtZXJhU2V0dGluZ3MoY2FtZXJhKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEZWZpbmVzIHdoZXRoZXIgdGhlIGZvY3VzIHNob3VsZCBiZSBzaG93bi5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gZW5hYmxlZCAtIFRydWUgaWYgdGhlIGZvY3VzIHNob3VsZCBiZSBzaG93biwgZmFsc2Ugb3RoZXJ3aXNlLlxyXG5cdCAqL1xyXG5cclxuXHRzZXRTaG93Rm9jdXNFbmFibGVkKGVuYWJsZWQpIHtcclxuXHJcblx0XHRpZihlbmFibGVkKSB7XHJcblxyXG5cdFx0XHR0aGlzLmRlZmluZXMuU0hPV19GT0NVUyA9IFwiMVwiO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRkZWxldGUgdGhpcy5kZWZpbmVzLlNIT1dfRk9DVVM7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERlZmluZXMgd2hldGhlciBtYW51YWwgRGVwdGggb2YgRmllbGQgc2hvdWxkIGJlIGVuYWJsZWQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IGVuYWJsZWQgLSBXaGV0aGVyIG1hbnVhbCBEb0Ygc2hvdWxkIGJlIGVuYWJsZWQuXHJcblx0ICovXHJcblxyXG5cdHNldE1hbnVhbERlcHRoT2ZGaWVsZEVuYWJsZWQoZW5hYmxlZCkge1xyXG5cclxuXHRcdGlmKGVuYWJsZWQpIHtcclxuXHJcblx0XHRcdHRoaXMuZGVmaW5lcy5NQU5VQUxfRE9GID0gXCIxXCI7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGRlbGV0ZSB0aGlzLmRlZmluZXMuTUFOVUFMX0RPRjtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGVmaW5lcyB3aGV0aGVyIHRoZSBWaWduZXR0ZSBlZmZlY3Qgc2hvdWxkIGJlIGVuYWJsZWQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IGVuYWJsZWQgLSBXaGV0aGVyIHRoZSBWaWduZXR0ZSBlZmZlY3Qgc2hvdWxkIGJlIGVuYWJsZWQuXHJcblx0ICovXHJcblxyXG5cdHNldFZpZ25ldHRlRW5hYmxlZChlbmFibGVkKSB7XHJcblxyXG5cdFx0aWYoZW5hYmxlZCkge1xyXG5cclxuXHRcdFx0dGhpcy5kZWZpbmVzLlZJR05FVFRFID0gXCIxXCI7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGRlbGV0ZSB0aGlzLmRlZmluZXMuVklHTkVUVEU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERlZmluZXMgd2hldGhlciB0aGUgcGVudGFnb25hbCBibHVyIGVmZmVjdCBzaG91bGQgYmUgZW5hYmxlZC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gZW5hYmxlZCAtIFdoZXRoZXIgdGhlIHBlbnRhZ29uYWwgYmx1ciBlZmZlY3Qgc2hvdWxkIGJlIGVuYWJsZWQuXHJcblx0ICovXHJcblxyXG5cdHNldFBlbnRhZ29uRW5hYmxlZChlbmFibGVkKSB7XHJcblxyXG5cdFx0aWYoZW5hYmxlZCkge1xyXG5cclxuXHRcdFx0dGhpcy5kZWZpbmVzLlBFTlRBR09OID0gXCIxXCI7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdGRlbGV0ZSB0aGlzLmRlZmluZXMuUEVOVEFHT047XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIGF1dG9tYXRpYyBzaGFkZXIgZm9jdXMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IGVuYWJsZWQgLSBXaGV0aGVyIHRoZSBzaGFkZXIgZm9jdXMgc2hvdWxkIGJlIGVuYWJsZWQuXHJcblx0ICovXHJcblxyXG5cdHNldFNoYWRlckZvY3VzRW5hYmxlZChlbmFibGVkKSB7XHJcblxyXG5cdFx0aWYoZW5hYmxlZCkge1xyXG5cclxuXHRcdFx0dGhpcy5kZWZpbmVzLlNIQURFUl9GT0NVUyA9IFwiMVwiO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRkZWxldGUgdGhpcy5kZWZpbmVzLlNIQURFUl9GT0NVUztcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGVmaW5lcyB3aGV0aGVyIHRoZSBkaXRoZXJpbmcgc2hvdWxkIGNvbXB1dGUgbm9pc2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IGVuYWJsZWQgLSBXaGV0aGVyIG5vaXNlLWJhc2VkIGRpdGhlcmluZyBzaG91bGQgYmUgZW5hYmxlZC5cclxuXHQgKi9cclxuXHJcblx0c2V0Tm9pc2VFbmFibGVkKGVuYWJsZWQpIHtcclxuXHJcblx0XHRpZihlbmFibGVkKSB7XHJcblxyXG5cdFx0XHR0aGlzLmRlZmluZXMuTk9JU0UgPSBcIjFcIjtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0ZGVsZXRlIHRoaXMuZGVmaW5lcy5OT0lTRTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgdGV4ZWwgc2l6ZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSB4IC0gVGhlIHRleGVsIHdpZHRoLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSB5IC0gVGhlIHRleGVsIGhlaWdodC5cclxuXHQgKi9cclxuXHJcblx0c2V0VGV4ZWxTaXplKHgsIHkpIHtcclxuXHJcblx0XHR0aGlzLnVuaWZvcm1zLnRleGVsU2l6ZS52YWx1ZS5zZXQoeCwgeSk7XHJcblx0XHR0aGlzLnVuaWZvcm1zLmhhbGZUZXhlbFNpemUudmFsdWUuc2V0KHgsIHkpLm11bHRpcGx5U2NhbGFyKDAuNSk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQWRvcHRzIHRoZSBuZWFyIGFuZCBmYXIgcGxhbmUgYW5kIHRoZSBmb2NhbCBsZW5ndGggb2YgdGhlIGdpdmVuIGNhbWVyYS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7UGVyc3BlY3RpdmVDYW1lcmF9IGNhbWVyYSAtIFRoZSBtYWluIGNhbWVyYS5cclxuXHQgKi9cclxuXHJcblx0YWRvcHRDYW1lcmFTZXR0aW5ncyhjYW1lcmEpIHtcclxuXHJcblx0XHRpZihjYW1lcmEgIT09IG51bGwpIHtcclxuXHJcblx0XHRcdHRoaXMudW5pZm9ybXMuY2FtZXJhTmVhci52YWx1ZSA9IGNhbWVyYS5uZWFyO1xyXG5cdFx0XHR0aGlzLnVuaWZvcm1zLmNhbWVyYUZhci52YWx1ZSA9IGNhbWVyYS5mYXI7XHJcblx0XHRcdHRoaXMudW5pZm9ybXMuZm9jYWxMZW5ndGgudmFsdWUgPSBjYW1lcmEuZ2V0Rm9jYWxMZW5ndGgoKTsgLy8gdW5pdDogbW0uXHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG59XHJcbiIsImltcG9ydCB7IFNoYWRlck1hdGVyaWFsLCBVbmlmb3JtLCBWZWN0b3IyIH0gZnJvbSBcInRocmVlXCI7XHJcblxyXG5jb25zdCBmcmFnbWVudCA9IFwiI2luY2x1ZGUgPGNvbW1vbj5cXHJcXG5cXHJcXG51bmlmb3JtIHNhbXBsZXIyRCB0RGlmZnVzZTtcXHJcXG51bmlmb3JtIHZlYzIgY2VudGVyO1xcclxcbnVuaWZvcm0gZmxvYXQgYXNwZWN0O1xcclxcbnVuaWZvcm0gZmxvYXQgd2F2ZVNpemU7XFxyXFxudW5pZm9ybSBmbG9hdCByYWRpdXM7XFxyXFxudW5pZm9ybSBmbG9hdCBtYXhSYWRpdXM7XFxyXFxudW5pZm9ybSBmbG9hdCBhbXBsaXR1ZGU7XFxyXFxuXFxyXFxudmFyeWluZyB2ZWMyIHZVdjtcXHJcXG52YXJ5aW5nIGZsb2F0IHZTaXplO1xcclxcblxcclxcbnZvaWQgbWFpbigpIHtcXHJcXG5cXHJcXG5cXHR2ZWMyIGFzcGVjdENvcnJlY3Rpb24gPSB2ZWMyKGFzcGVjdCwgMS4wKTtcXHJcXG5cXHJcXG5cXHR2ZWMyIGRpZmZlcmVuY2UgPSB2VXYgKiBhc3BlY3RDb3JyZWN0aW9uIC0gY2VudGVyICogYXNwZWN0Q29ycmVjdGlvbjtcXHJcXG5cXHRmbG9hdCBkaXN0YW5jZSA9IHNxcnQoZG90KGRpZmZlcmVuY2UsIGRpZmZlcmVuY2UpKSAqIHZTaXplO1xcclxcblxcclxcblxcdHZlYzIgZGlzcGxhY2VtZW50ID0gdmVjMigwLjApO1xcclxcblxcclxcblxcdGlmKGRpc3RhbmNlID4gcmFkaXVzKSB7XFxyXFxuXFxyXFxuXFx0XFx0aWYoZGlzdGFuY2UgPCByYWRpdXMgKyB3YXZlU2l6ZSkge1xcclxcblxcclxcblxcdFxcdFxcdGZsb2F0IGFuZ2xlID0gKGRpc3RhbmNlIC0gcmFkaXVzKSAqIFBJMiAvIHdhdmVTaXplO1xcclxcblxcdFxcdFxcdGZsb2F0IGNvc1NpbiA9ICgxLjAgLSBjb3MoYW5nbGUpKSAqIDAuNTtcXHJcXG5cXHJcXG5cXHRcXHRcXHRmbG9hdCBleHRlbnQgPSBtYXhSYWRpdXMgKyB3YXZlU2l6ZTtcXHJcXG5cXHRcXHRcXHRmbG9hdCBkZWNheSA9IG1heChleHRlbnQgLSBkaXN0YW5jZSAqIGRpc3RhbmNlLCAwLjApIC8gZXh0ZW50O1xcclxcblxcclxcblxcdFxcdFxcdGRpc3BsYWNlbWVudCA9ICgoY29zU2luICogYW1wbGl0dWRlICogZGlmZmVyZW5jZSkgLyBkaXN0YW5jZSkgKiBkZWNheTtcXHJcXG5cXHJcXG5cXHRcXHR9XFxyXFxuXFxyXFxuXFx0fVxcclxcblxcclxcblxcdGdsX0ZyYWdDb2xvciA9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2IC0gZGlzcGxhY2VtZW50KTtcXHJcXG5cXHJcXG59XFxyXFxuXCI7XHJcbmNvbnN0IHZlcnRleCA9IFwidW5pZm9ybSBmbG9hdCBzaXplO1xcclxcbnVuaWZvcm0gZmxvYXQgc2NhbGU7XFxyXFxudW5pZm9ybSBmbG9hdCBjYW1lcmFEaXN0YW5jZTtcXHJcXG5cXHJcXG52YXJ5aW5nIHZlYzIgdlV2O1xcclxcbnZhcnlpbmcgZmxvYXQgdlNpemU7XFxyXFxuXFxyXFxudm9pZCBtYWluKCkge1xcclxcblxcclxcblxcdHZVdiA9IHV2O1xcclxcblxcdHZTaXplID0gKDAuMSAqIGNhbWVyYURpc3RhbmNlKSAvIHNpemU7XFxyXFxuXFx0Z2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbW9kZWxWaWV3TWF0cml4ICogdmVjNChwb3NpdGlvbiwgMS4wKTtcXHJcXG5cXHJcXG59XFxyXFxuXCI7XHJcblxyXG4vKipcclxuICogQSBzaG9jayB3YXZlIHNoYWRlciBtYXRlcmlhbC5cclxuICpcclxuICogQmFzZWQgb24gYSBHaXN0IGJ5IEplYW4tUGhpbGlwcGUgU2FyZGE6XHJcbiAqICBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9qcHNhcmRhLzMzY2VhNjdhOWYyZWNiMGEwZWRhXHJcbiAqL1xyXG5cclxuZXhwb3J0IGNsYXNzIFNob2NrV2F2ZU1hdGVyaWFsIGV4dGVuZHMgU2hhZGVyTWF0ZXJpYWwge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHNob2NrIHdhdmUgbWF0ZXJpYWwuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gVGhlIG9wdGlvbnMuXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLndhdmVTaXplPTAuMl0gLSBUaGUgd2F2ZSBzaXplLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5hbXBsaXR1ZGU9MC4wNV0gLSBUaGUgZGlzdG9ydGlvbiBhbXBsaXR1ZGUuXHJcblx0ICovXHJcblxyXG5cdGNvbnN0cnVjdG9yKG9wdGlvbnMgPSB7fSkge1xyXG5cclxuXHRcdGNvbnN0IHNldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7XHJcblx0XHRcdG1heFJhZGl1czogMS4wLFxyXG5cdFx0XHR3YXZlU2l6ZTogMC4yLFxyXG5cdFx0XHRhbXBsaXR1ZGU6IDAuMDVcclxuXHRcdH0sIG9wdGlvbnMpO1xyXG5cclxuXHRcdHN1cGVyKHtcclxuXHJcblx0XHRcdHR5cGU6IFwiU2hvY2tXYXZlTWF0ZXJpYWxcIixcclxuXHJcblx0XHRcdHVuaWZvcm1zOiB7XHJcblxyXG5cdFx0XHRcdHREaWZmdXNlOiBuZXcgVW5pZm9ybShudWxsKSxcclxuXHJcblx0XHRcdFx0Y2VudGVyOiBuZXcgVW5pZm9ybShuZXcgVmVjdG9yMigwLjUsIDAuNSkpLFxyXG5cdFx0XHRcdGFzcGVjdDogbmV3IFVuaWZvcm0oMS4wKSxcclxuXHRcdFx0XHRjYW1lcmFEaXN0YW5jZTogbmV3IFVuaWZvcm0oMS4wKSxcclxuXHJcblx0XHRcdFx0c2l6ZTogbmV3IFVuaWZvcm0oMS4wKSxcclxuXHRcdFx0XHRyYWRpdXM6IG5ldyBVbmlmb3JtKC1zZXR0aW5ncy53YXZlU2l6ZSksXHJcblx0XHRcdFx0bWF4UmFkaXVzOiBuZXcgVW5pZm9ybShzZXR0aW5ncy5tYXhSYWRpdXMpLFxyXG5cdFx0XHRcdHdhdmVTaXplOiBuZXcgVW5pZm9ybShzZXR0aW5ncy53YXZlU2l6ZSksXHJcblx0XHRcdFx0YW1wbGl0dWRlOiBuZXcgVW5pZm9ybShzZXR0aW5ncy5hbXBsaXR1ZGUpXHJcblxyXG5cdFx0XHR9LFxyXG5cclxuXHRcdFx0ZnJhZ21lbnRTaGFkZXI6IGZyYWdtZW50LFxyXG5cdFx0XHR2ZXJ0ZXhTaGFkZXI6IHZlcnRleCxcclxuXHJcblx0XHRcdGRlcHRoV3JpdGU6IGZhbHNlLFxyXG5cdFx0XHRkZXB0aFRlc3Q6IGZhbHNlXHJcblxyXG5cdFx0fSk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuIiwiaW1wb3J0IHsgU2hhZGVyTWF0ZXJpYWwsIFVuaWZvcm0sIFZlY3RvcjIgfSBmcm9tIFwidGhyZWVcIjtcclxuXHJcbmNvbnN0IGZyYWdtZW50ID0gXCJ1bmlmb3JtIHNhbXBsZXIyRCB0RGlmZnVzZTtcXHJcXG51bmlmb3JtIHNhbXBsZXIyRCB0V2VpZ2h0cztcXHJcXG5cXHJcXG51bmlmb3JtIHZlYzIgdGV4ZWxTaXplO1xcclxcblxcclxcbnZhcnlpbmcgdmVjMiB2VXY7XFxyXFxudmFyeWluZyB2ZWM0IHZPZmZzZXQ7XFxyXFxuXFxyXFxudm9pZCBtYWluKCkge1xcclxcblxcclxcblxcdC8vIEZldGNoIHRoZSBibGVuZGluZyB3ZWlnaHRzIGZvciBjdXJyZW50IHBpeGVsLlxcclxcblxcdHZlYzQgYTtcXHJcXG5cXHRhLnh6ID0gdGV4dHVyZTJEKHRXZWlnaHRzLCB2VXYpLnh6O1xcclxcblxcdGEueSA9IHRleHR1cmUyRCh0V2VpZ2h0cywgdk9mZnNldC56dykuZztcXHJcXG5cXHRhLncgPSB0ZXh0dXJlMkQodFdlaWdodHMsIHZPZmZzZXQueHkpLmE7XFxyXFxuXFxyXFxuXFx0dmVjNCBjb2xvcjtcXHJcXG5cXHJcXG5cXHQvLyBDaGVjayBpZiB0aGVyZSBpcyBhbnkgYmxlbmRpbmcgd2VpZ2h0IHdpdGggYSB2YWx1ZSBncmVhdGVyIHRoYW4gMC4wLlxcclxcblxcdGlmKGRvdChhLCB2ZWM0KDEuMCkpIDwgMWUtNSkge1xcclxcblxcclxcblxcdFxcdGNvbG9yID0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYsIDAuMCk7XFxyXFxuXFxyXFxuXFx0fSBlbHNlIHtcXHJcXG5cXHJcXG5cXHRcXHQvKiBVcCB0byBmb3VyIGxpbmVzIGNhbiBiZSBjcm9zc2luZyBhIHBpeGVsIChvbmUgdGhyb3VnaCBlYWNoIGVkZ2UpLlxcclxcblxcdFxcdCAqIFRoZSBsaW5lIHdpdGggdGhlIG1heGltdW0gd2VpZ2h0IGZvciBlYWNoIGRpcmVjdGlvbiBpcyBmYXZvdXJlZC5cXHJcXG5cXHRcXHQgKi9cXHJcXG5cXHJcXG5cXHRcXHR2ZWMyIG9mZnNldDtcXHJcXG5cXHRcXHRvZmZzZXQueCA9IGEuYSA+IGEuYiA/IGEuYSA6IC1hLmI7IC8vIExlZnQgdnMuIHJpZ2h0LlxcclxcblxcdFxcdG9mZnNldC55ID0gYS5nID4gYS5yID8gLWEuZyA6IGEucjsgLy8gVG9wIHZzLiBib3R0b20gKGNoYW5nZWQgc2lnbnMpLlxcclxcblxcclxcblxcdFxcdC8vIEdvIGluIHRoZSBkaXJlY3Rpb24gd2l0aCB0aGUgbWF4aW11bSB3ZWlnaHQgKGhvcml6b250YWwgdnMuIHZlcnRpY2FsKS5cXHJcXG5cXHRcXHRpZihhYnMob2Zmc2V0LngpID4gYWJzKG9mZnNldC55KSkge1xcclxcblxcclxcblxcdFxcdFxcdG9mZnNldC55ID0gMC4wO1xcclxcblxcclxcblxcdFxcdH0gZWxzZSB7XFxyXFxuXFxyXFxuXFx0XFx0XFx0b2Zmc2V0LnggPSAwLjA7XFxyXFxuXFxyXFxuXFx0XFx0fVxcclxcblxcclxcblxcdFxcdC8vIEZldGNoIHRoZSBvcHBvc2l0ZSBjb2xvciBhbmQgbGVycCBieSBoYW5kLlxcclxcblxcdFxcdGNvbG9yID0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYsIDAuMCk7XFxyXFxuXFx0XFx0dmVjMiBjb29yZCA9IHZVdiArIHNpZ24ob2Zmc2V0KSAqIHRleGVsU2l6ZTtcXHJcXG5cXHRcXHR2ZWM0IG9wcG9zaXRlQ29sb3IgPSB0ZXh0dXJlMkQodERpZmZ1c2UsIGNvb3JkLCAwLjApO1xcclxcblxcdFxcdGZsb2F0IHMgPSBhYnMob2Zmc2V0LngpID4gYWJzKG9mZnNldC55KSA/IGFicyhvZmZzZXQueCkgOiBhYnMob2Zmc2V0LnkpO1xcclxcblxcclxcblxcdFxcdC8vIEdhbW1hIGNvcnJlY3Rpb24uXFxyXFxuXFx0XFx0Y29sb3IucmdiID0gcG93KGFicyhjb2xvci5yZ2IpLCB2ZWMzKDIuMikpO1xcclxcblxcdFxcdG9wcG9zaXRlQ29sb3IucmdiID0gcG93KGFicyhvcHBvc2l0ZUNvbG9yLnJnYiksIHZlYzMoMi4yKSk7XFxyXFxuXFx0XFx0Y29sb3IgPSBtaXgoY29sb3IsIG9wcG9zaXRlQ29sb3IsIHMpO1xcclxcblxcdFxcdGNvbG9yLnJnYiA9IHBvdyhhYnMoY29sb3IucmdiKSwgdmVjMygxLjAgLyAyLjIpKTtcXHJcXG5cXHJcXG5cXHR9XFxyXFxuXFxyXFxuXFx0Z2xfRnJhZ0NvbG9yID0gY29sb3I7XFxyXFxuXFxyXFxufVxcclxcblwiO1xyXG5jb25zdCB2ZXJ0ZXggPSBcInVuaWZvcm0gdmVjMiB0ZXhlbFNpemU7XFxyXFxuXFxyXFxudmFyeWluZyB2ZWMyIHZVdjtcXHJcXG52YXJ5aW5nIHZlYzQgdk9mZnNldDtcXHJcXG5cXHJcXG52b2lkIG1haW4oKSB7XFxyXFxuXFxyXFxuXFx0dlV2ID0gdXY7XFxyXFxuXFxyXFxuXFx0dk9mZnNldCA9IHV2Lnh5eHkgKyB0ZXhlbFNpemUueHl4eSAqIHZlYzQoMS4wLCAwLjAsIDAuMCwgLTEuMCk7IC8vIENoYW5nZWQgc2lnbiBpbiBXIGNvbXBvbmVudC5cXHJcXG5cXHJcXG5cXHRnbF9Qb3NpdGlvbiA9IHByb2plY3Rpb25NYXRyaXggKiBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KHBvc2l0aW9uLCAxLjApO1xcclxcblxcclxcbn1cXHJcXG5cIjtcclxuXHJcbi8qKlxyXG4gKiBTdWJwaXhlbCBNb3JwaG9sb2dpY2FsIEFudGlhbGlhc2luZy5cclxuICpcclxuICogVGhpcyBtYXRlcmlhbCBpcyB1c2VkIHRvIHJlbmRlciB0aGUgZmluYWwgYW50aWFsaWFzaW5nLlxyXG4gKi9cclxuXHJcbmV4cG9ydCBjbGFzcyBTTUFBQmxlbmRNYXRlcmlhbCBleHRlbmRzIFNoYWRlck1hdGVyaWFsIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBTTUFBIGJsZW5kIG1hdGVyaWFsLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IyfSBbdGV4ZWxTaXplXSAtIFRoZSBhYnNvbHV0ZSBzY3JlZW4gdGV4ZWwgc2l6ZS5cclxuXHQgKi9cclxuXHJcblx0Y29uc3RydWN0b3IodGV4ZWxTaXplID0gbmV3IFZlY3RvcjIoKSkge1xyXG5cclxuXHRcdHN1cGVyKHtcclxuXHJcblx0XHRcdHR5cGU6IFwiU01BQUJsZW5kTWF0ZXJpYWxcIixcclxuXHJcblx0XHRcdHVuaWZvcm1zOiB7XHJcblxyXG5cdFx0XHRcdHREaWZmdXNlOiBuZXcgVW5pZm9ybShudWxsKSxcclxuXHRcdFx0XHR0V2VpZ2h0czogbmV3IFVuaWZvcm0obnVsbCksXHJcblx0XHRcdFx0dGV4ZWxTaXplOiBuZXcgVW5pZm9ybSh0ZXhlbFNpemUpXHJcblxyXG5cdFx0XHR9LFxyXG5cclxuXHRcdFx0ZnJhZ21lbnRTaGFkZXI6IGZyYWdtZW50LFxyXG5cdFx0XHR2ZXJ0ZXhTaGFkZXI6IHZlcnRleCxcclxuXHJcblx0XHRcdGRlcHRoV3JpdGU6IGZhbHNlLFxyXG5cdFx0XHRkZXB0aFRlc3Q6IGZhbHNlXHJcblxyXG5cdFx0fSk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuIiwiaW1wb3J0IHsgU2hhZGVyTWF0ZXJpYWwsIFVuaWZvcm0sIFZlY3RvcjIgfSBmcm9tIFwidGhyZWVcIjtcclxuXHJcbmNvbnN0IGZyYWdtZW50ID0gXCIjZGVmaW5lIHNhbXBsZUxldmVsWmVyb09mZnNldCh0LCBjb29yZCwgb2Zmc2V0KSB0ZXh0dXJlMkQodCwgY29vcmQgKyBmbG9hdChvZmZzZXQpICogdGV4ZWxTaXplLCAwLjApXFxyXFxuXFxyXFxudW5pZm9ybSBzYW1wbGVyMkQgdERpZmZ1c2U7XFxyXFxudW5pZm9ybSBzYW1wbGVyMkQgdEFyZWE7XFxyXFxudW5pZm9ybSBzYW1wbGVyMkQgdFNlYXJjaDtcXHJcXG5cXHJcXG51bmlmb3JtIHZlYzIgdGV4ZWxTaXplO1xcclxcblxcclxcbnZhcnlpbmcgdmVjMiB2VXY7XFxyXFxudmFyeWluZyB2ZWM0IHZPZmZzZXRbM107XFxyXFxudmFyeWluZyB2ZWMyIHZQaXhDb29yZDtcXHJcXG5cXHJcXG52ZWMyIHJvdW5kKHZlYzIgeCkge1xcclxcblxcclxcblxcdHJldHVybiBzaWduKHgpICogZmxvb3IoYWJzKHgpICsgMC41KTtcXHJcXG5cXHJcXG59XFxyXFxuXFxyXFxuZmxvYXQgc2VhcmNoTGVuZ3RoKHZlYzIgZSwgZmxvYXQgYmlhcywgZmxvYXQgc2NhbGUpIHtcXHJcXG5cXHJcXG5cXHQvLyBOb3QgcmVxdWlyZWQgaWYgdFNlYXJjaCBhY2Nlc3NlcyBhcmUgc2V0IHRvIHBvaW50LlxcclxcblxcdC8vIGNvbnN0IHZlYzIgU0VBUkNIX1RFWF9QSVhFTF9TSVpFID0gMS4wIC8gdmVjMig2Ni4wLCAzMy4wKTtcXHJcXG5cXHQvLyBlID0gdmVjMihiaWFzLCAwLjApICsgMC41ICogU0VBUkNIX1RFWF9QSVhFTF9TSVpFICsgZSAqIHZlYzIoc2NhbGUsIDEuMCkgKiB2ZWMyKDY0LjAsIDMyLjApICogU0VBUkNIX1RFWF9QSVhFTF9TSVpFO1xcclxcblxcclxcblxcdGUuciA9IGJpYXMgKyBlLnIgKiBzY2FsZTtcXHJcXG5cXHJcXG5cXHRyZXR1cm4gMjU1LjAgKiB0ZXh0dXJlMkQodFNlYXJjaCwgZSwgMC4wKS5yO1xcclxcblxcclxcbn1cXHJcXG5cXHJcXG5mbG9hdCBzZWFyY2hYTGVmdCh2ZWMyIHRleENvb3JkLCBmbG9hdCBlbmQpIHtcXHJcXG5cXHJcXG5cXHQvKiBAUFNFVURPX0dBVEhFUjRcXHJcXG5cXHQgKiBUaGlzIHRleENvb3JkIGhhcyBiZWVuIG9mZnNldCBieSAoLTAuMjUsIC0wLjEyNSkgaW4gdGhlIHZlcnRleCBzaGFkZXIgdG9cXHJcXG5cXHQgKiBzYW1wbGUgYmV0d2VlbiBlZGdlLCB0aHVzIGZldGNoaW5nIGZvdXIgZWRnZXMgaW4gYSByb3cuXFxyXFxuXFx0ICogU2FtcGxpbmcgd2l0aCBkaWZmZXJlbnQgb2Zmc2V0cyBpbiBlYWNoIGRpcmVjdGlvbiBhbGxvd3MgdG8gZGlzYW1iaWd1YXRlXFxyXFxuXFx0ICogd2hpY2ggZWRnZXMgYXJlIGFjdGl2ZSBmcm9tIHRoZSBmb3VyIGZldGNoZWQgb25lcy5cXHJcXG5cXHQgKi9cXHJcXG5cXHJcXG5cXHR2ZWMyIGUgPSB2ZWMyKDAuMCwgMS4wKTtcXHJcXG5cXHJcXG5cXHRmb3IoaW50IGkgPSAwOyBpIDwgTUFYX1NFQVJDSF9TVEVQU19JTlQ7ICsraSkge1xcclxcblxcclxcblxcdFxcdGUgPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHRleENvb3JkLCAwLjApLnJnO1xcclxcblxcdFxcdHRleENvb3JkIC09IHZlYzIoMi4wLCAwLjApICogdGV4ZWxTaXplO1xcclxcblxcclxcblxcdFxcdGlmKCEodGV4Q29vcmQueCA+IGVuZCAmJiBlLmcgPiAwLjgyODEgJiYgZS5yID09IDAuMCkpIHsgYnJlYWs7IH1cXHJcXG5cXHJcXG5cXHR9XFxyXFxuXFxyXFxuXFx0Ly8gQ29ycmVjdCB0aGUgcHJldmlvdXNseSBhcHBsaWVkIG9mZnNldCAoLTAuMjUsIC0wLjEyNSkuXFxyXFxuXFx0dGV4Q29vcmQueCArPSAwLjI1ICogdGV4ZWxTaXplLng7XFxyXFxuXFxyXFxuXFx0Ly8gVGhlIHNlYXJjaGVzIGFyZSBiaWFzZWQgYnkgMSwgc28gYWRqdXN0IHRoZSBjb29yZHMgYWNjb3JkaW5nbHkuXFxyXFxuXFx0dGV4Q29vcmQueCArPSB0ZXhlbFNpemUueDtcXHJcXG5cXHJcXG5cXHQvLyBEaXNhbWJpZ3VhdGUgdGhlIGxlbmd0aCBhZGRlZCBieSB0aGUgbGFzdCBzdGVwLlxcclxcblxcdHRleENvb3JkLnggKz0gMi4wICogdGV4ZWxTaXplLng7IC8vIFVuZG8gbGFzdCBzdGVwLlxcclxcblxcdHRleENvb3JkLnggLT0gdGV4ZWxTaXplLnggKiBzZWFyY2hMZW5ndGgoZSwgMC4wLCAwLjUpO1xcclxcblxcclxcblxcdHJldHVybiB0ZXhDb29yZC54O1xcclxcblxcclxcbn1cXHJcXG5cXHJcXG5mbG9hdCBzZWFyY2hYUmlnaHQodmVjMiB0ZXhDb29yZCwgZmxvYXQgZW5kKSB7XFxyXFxuXFxyXFxuXFx0dmVjMiBlID0gdmVjMigwLjAsIDEuMCk7XFxyXFxuXFxyXFxuXFx0Zm9yKGludCBpID0gMDsgaSA8IE1BWF9TRUFSQ0hfU1RFUFNfSU5UOyArK2kpIHtcXHJcXG5cXHJcXG5cXHRcXHRlID0gdGV4dHVyZTJEKHREaWZmdXNlLCB0ZXhDb29yZCwgMC4wKS5yZztcXHJcXG5cXHRcXHR0ZXhDb29yZCArPSB2ZWMyKDIuMCwgMC4wKSAqIHRleGVsU2l6ZTtcXHJcXG5cXHJcXG5cXHRcXHRpZighKHRleENvb3JkLnggPCBlbmQgJiYgZS5nID4gMC44MjgxICYmIGUuciA9PSAwLjApKSB7IGJyZWFrOyB9XFxyXFxuXFxyXFxuXFx0fVxcclxcblxcclxcblxcdHRleENvb3JkLnggLT0gMC4yNSAqIHRleGVsU2l6ZS54O1xcclxcblxcdHRleENvb3JkLnggLT0gdGV4ZWxTaXplLng7XFxyXFxuXFx0dGV4Q29vcmQueCAtPSAyLjAgKiB0ZXhlbFNpemUueDtcXHJcXG5cXHR0ZXhDb29yZC54ICs9IHRleGVsU2l6ZS54ICogc2VhcmNoTGVuZ3RoKGUsIDAuNSwgMC41KTtcXHJcXG5cXHJcXG5cXHRyZXR1cm4gdGV4Q29vcmQueDtcXHJcXG5cXHJcXG59XFxyXFxuXFxyXFxuZmxvYXQgc2VhcmNoWVVwKHZlYzIgdGV4Q29vcmQsIGZsb2F0IGVuZCkge1xcclxcblxcclxcblxcdHZlYzIgZSA9IHZlYzIoMS4wLCAwLjApO1xcclxcblxcclxcblxcdGZvcihpbnQgaSA9IDA7IGkgPCBNQVhfU0VBUkNIX1NURVBTX0lOVDsgKytpKSB7XFxyXFxuXFxyXFxuXFx0XFx0ZSA9IHRleHR1cmUyRCh0RGlmZnVzZSwgdGV4Q29vcmQsIDAuMCkucmc7XFxyXFxuXFx0XFx0dGV4Q29vcmQgKz0gdmVjMigwLjAsIDIuMCkgKiB0ZXhlbFNpemU7IC8vIENoYW5nZWQgc2lnbi5cXHJcXG5cXHJcXG5cXHRcXHRpZighKHRleENvb3JkLnkgPiBlbmQgJiYgZS5yID4gMC44MjgxICYmIGUuZyA9PSAwLjApKSB7IGJyZWFrOyB9XFxyXFxuXFxyXFxuXFx0fVxcclxcblxcclxcblxcdHRleENvb3JkLnkgLT0gMC4yNSAqIHRleGVsU2l6ZS55OyAvLyBDaGFuZ2VkIHNpZ24uXFxyXFxuXFx0dGV4Q29vcmQueSAtPSB0ZXhlbFNpemUueTsgLy8gQ2hhbmdlZCBzaWduLlxcclxcblxcdHRleENvb3JkLnkgLT0gMi4wICogdGV4ZWxTaXplLnk7IC8vIENoYW5nZWQgc2lnbi5cXHJcXG5cXHR0ZXhDb29yZC55ICs9IHRleGVsU2l6ZS55ICogc2VhcmNoTGVuZ3RoKGUuZ3IsIDAuMCwgMC41KTsgLy8gQ2hhbmdlZCBzaWduLlxcclxcblxcclxcblxcdHJldHVybiB0ZXhDb29yZC55O1xcclxcblxcclxcbn1cXHJcXG5cXHJcXG5mbG9hdCBzZWFyY2hZRG93bih2ZWMyIHRleENvb3JkLCBmbG9hdCBlbmQpIHtcXHJcXG5cXHJcXG5cXHR2ZWMyIGUgPSB2ZWMyKDEuMCwgMC4wKTtcXHJcXG5cXHJcXG5cXHRmb3IoaW50IGkgPSAwOyBpIDwgTUFYX1NFQVJDSF9TVEVQU19JTlQ7ICsraSApIHtcXHJcXG5cXHJcXG5cXHRcXHRlID0gdGV4dHVyZTJEKHREaWZmdXNlLCB0ZXhDb29yZCwgMC4wKS5yZztcXHJcXG5cXHRcXHR0ZXhDb29yZCAtPSB2ZWMyKDAuMCwgMi4wKSAqIHRleGVsU2l6ZTsgLy8gQ2hhbmdlZCBzaWduLlxcclxcblxcclxcblxcdFxcdGlmKCEodGV4Q29vcmQueSA8IGVuZCAmJiBlLnIgPiAwLjgyODEgJiYgZS5nID09IDAuMCkpIHsgYnJlYWs7IH1cXHJcXG5cXHJcXG5cXHR9XFxyXFxuXFxyXFxuXFx0dGV4Q29vcmQueSArPSAwLjI1ICogdGV4ZWxTaXplLnk7IC8vIENoYW5nZWQgc2lnbi5cXHJcXG5cXHR0ZXhDb29yZC55ICs9IHRleGVsU2l6ZS55OyAvLyBDaGFuZ2VkIHNpZ24uXFxyXFxuXFx0dGV4Q29vcmQueSArPSAyLjAgKiB0ZXhlbFNpemUueTsgLy8gQ2hhbmdlZCBzaWduLlxcclxcblxcdHRleENvb3JkLnkgLT0gdGV4ZWxTaXplLnkgKiBzZWFyY2hMZW5ndGgoZS5nciwgMC41LCAwLjUpOyAvLyBDaGFuZ2VkIHNpZ24uXFxyXFxuXFxyXFxuXFx0cmV0dXJuIHRleENvb3JkLnk7XFxyXFxuXFxyXFxufVxcclxcblxcclxcbnZlYzIgYXJlYSh2ZWMyIGRpc3QsIGZsb2F0IGUxLCBmbG9hdCBlMiwgZmxvYXQgb2Zmc2V0KSB7XFxyXFxuXFxyXFxuXFx0Ly8gUm91bmRpbmcgcHJldmVudHMgcHJlY2lzaW9uIGVycm9ycyBvZiBiaWxpbmVhciBmaWx0ZXJpbmcuXFxyXFxuXFx0dmVjMiB0ZXhDb29yZCA9IEFSRUFURVhfTUFYX0RJU1RBTkNFICogcm91bmQoNC4wICogdmVjMihlMSwgZTIpKSArIGRpc3Q7XFxyXFxuXFxyXFxuXFx0Ly8gU2NhbGUgYW5kIGJpYXMgZm9yIHRleGVsIHNwYWNlIHRyYW5zbGF0aW9uLlxcclxcblxcdHRleENvb3JkID0gQVJFQVRFWF9QSVhFTF9TSVpFICogdGV4Q29vcmQgKyAoMC41ICogQVJFQVRFWF9QSVhFTF9TSVpFKTtcXHJcXG5cXHJcXG5cXHQvLyBNb3ZlIHRvIHByb3BlciBwbGFjZSwgYWNjb3JkaW5nIHRvIHRoZSBzdWJwaXhlbCBvZmZzZXQuXFxyXFxuXFx0dGV4Q29vcmQueSArPSBBUkVBVEVYX1NVQlRFWF9TSVpFICogb2Zmc2V0O1xcclxcblxcclxcblxcdHJldHVybiB0ZXh0dXJlMkQodEFyZWEsIHRleENvb3JkLCAwLjApLnJnO1xcclxcblxcclxcbn1cXHJcXG5cXHJcXG52b2lkIG1haW4oKSB7XFxyXFxuXFxyXFxuXFx0dmVjNCB3ZWlnaHRzID0gdmVjNCgwLjApO1xcclxcblxcdHZlYzQgc3Vic2FtcGxlSW5kaWNlcyA9IHZlYzQoMC4wKTtcXHJcXG5cXHR2ZWMyIGUgPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdikucmc7XFxyXFxuXFxyXFxuXFx0aWYoZS5nID4gMC4wKSB7XFxyXFxuXFxyXFxuXFx0XFx0Ly8gRWRnZSBhdCBub3J0aC5cXHJcXG5cXHRcXHR2ZWMyIGQ7XFxyXFxuXFxyXFxuXFx0XFx0Ly8gRmluZCB0aGUgZGlzdGFuY2UgdG8gdGhlIGxlZnQuXFxyXFxuXFx0XFx0dmVjMiBjb29yZHM7XFxyXFxuXFx0XFx0Y29vcmRzLnggPSBzZWFyY2hYTGVmdCh2T2Zmc2V0WzBdLnh5LCB2T2Zmc2V0WzJdLngpO1xcclxcblxcdFxcdGNvb3Jkcy55ID0gdk9mZnNldFsxXS55OyAvLyB2T2Zmc2V0WzFdLnkgPSB2VXYueSAtIDAuMjUgKiB0ZXhlbFNpemUueSAoQENST1NTSU5HX09GRlNFVClcXHJcXG5cXHRcXHRkLnggPSBjb29yZHMueDtcXHJcXG5cXHJcXG5cXHRcXHQvKiBOb3cgZmV0Y2ggdGhlIGxlZnQgY3Jvc3NpbmcgZWRnZXMsIHR3byBhdCBhIHRpbWUgdXNpbmcgYmlsaW5lYXJcXHJcXG5cXHRcXHRmaWx0ZXJpbmcuIFNhbXBsaW5nIGF0IC0wLjI1IChzZWUgQENST1NTSU5HX09GRlNFVCkgZW5hYmxlcyB0byBkaXNjZXJuIHdoYXRcXHJcXG5cXHRcXHR2YWx1ZSBlYWNoIGVkZ2UgaGFzLiAqL1xcclxcblxcdFxcdGZsb2F0IGUxID0gdGV4dHVyZTJEKHREaWZmdXNlLCBjb29yZHMsIDAuMCkucjtcXHJcXG5cXHJcXG5cXHRcXHQvLyBGaW5kIHRoZSBkaXN0YW5jZSB0byB0aGUgcmlnaHQuXFxyXFxuXFx0XFx0Y29vcmRzLnggPSBzZWFyY2hYUmlnaHQodk9mZnNldFswXS56dywgdk9mZnNldFsyXS55KTtcXHJcXG5cXHRcXHRkLnkgPSBjb29yZHMueDtcXHJcXG5cXHJcXG5cXHRcXHQvKiBUcmFuc2xhdGUgZGlzdGFuY2VzIHRvIHBpeGVsIHVuaXRzIGZvciBiZXR0ZXIgaW50ZXJsZWF2ZSBhcml0aG1ldGljIGFuZFxcclxcblxcdFxcdG1lbW9yeSBhY2Nlc3Nlcy4gKi9cXHJcXG5cXHRcXHRkID0gZCAvIHRleGVsU2l6ZS54IC0gdlBpeENvb3JkLng7XFxyXFxuXFxyXFxuXFx0XFx0Ly8gVGhlIGFyZWEgdGV4dHVyZSBpcyBjb21wcmVzc2VkIHF1YWRyYXRpY2FsbHkuXFxyXFxuXFx0XFx0dmVjMiBzcXJ0RCA9IHNxcnQoYWJzKGQpKTtcXHJcXG5cXHJcXG5cXHRcXHQvLyBGZXRjaCB0aGUgcmlnaHQgY3Jvc3NpbmcgZWRnZXMuXFxyXFxuXFx0XFx0Y29vcmRzLnkgLT0gdGV4ZWxTaXplLnk7IC8vIFdlYkdMIHBvcnQgbm90ZTogQWRkZWQuXFxyXFxuXFx0XFx0ZmxvYXQgZTIgPSBzYW1wbGVMZXZlbFplcm9PZmZzZXQodERpZmZ1c2UsIGNvb3JkcywgaXZlYzIoMSwgMCkpLnI7XFxyXFxuXFxyXFxuXFx0XFx0Ly8gUGF0dGVybiByZWNvZ25pc2VkLCBub3cgZ2V0IHRoZSBhY3R1YWwgYXJlYS5cXHJcXG5cXHRcXHR3ZWlnaHRzLnJnID0gYXJlYShzcXJ0RCwgZTEsIGUyLCBzdWJzYW1wbGVJbmRpY2VzLnkpO1xcclxcblxcclxcblxcdH1cXHJcXG5cXHJcXG5cXHRpZihlLnIgPiAwLjApIHtcXHJcXG5cXHJcXG5cXHRcXHQvLyBFZGdlIGF0IHdlc3QuXFxyXFxuXFx0XFx0dmVjMiBkO1xcclxcblxcclxcblxcdFxcdC8vIEZpbmQgdGhlIGRpc3RhbmNlIHRvIHRoZSB0b3AuXFxyXFxuXFx0XFx0dmVjMiBjb29yZHM7XFxyXFxuXFx0XFx0Y29vcmRzLnkgPSBzZWFyY2hZVXAodk9mZnNldFsxXS54eSwgdk9mZnNldFsyXS56KTtcXHJcXG5cXHRcXHRjb29yZHMueCA9IHZPZmZzZXRbMF0ueDsgLy8gdk9mZnNldFsxXS54ID0gdlV2LnggLSAwLjI1ICogdGV4ZWxTaXplLng7XFxyXFxuXFx0XFx0ZC54ID0gY29vcmRzLnk7XFxyXFxuXFxyXFxuXFx0XFx0Ly8gRmV0Y2ggdGhlIHRvcCBjcm9zc2luZyBlZGdlcy5cXHJcXG5cXHRcXHRmbG9hdCBlMSA9IHRleHR1cmUyRCh0RGlmZnVzZSwgY29vcmRzLCAwLjApLmc7XFxyXFxuXFxyXFxuXFx0XFx0Ly8gRmluZCB0aGUgZGlzdGFuY2UgdG8gdGhlIGJvdHRvbS5cXHJcXG5cXHRcXHRjb29yZHMueSA9IHNlYXJjaFlEb3duKHZPZmZzZXRbMV0uencsIHZPZmZzZXRbMl0udyk7XFxyXFxuXFx0XFx0ZC55ID0gY29vcmRzLnk7XFxyXFxuXFxyXFxuXFx0XFx0Ly8gRGlzdGFuY2VzIGluIHBpeGVsIHVuaXRzLlxcclxcblxcdFxcdGQgPSBkIC8gdGV4ZWxTaXplLnkgLSB2UGl4Q29vcmQueTtcXHJcXG5cXHJcXG5cXHRcXHQvLyBUaGUgYXJlYSB0ZXh0dXJlIGlzIGNvbXByZXNzZWQgcXVhZHJhdGljYWxseS5cXHJcXG5cXHRcXHR2ZWMyIHNxcnREID0gc3FydChhYnMoZCkpO1xcclxcblxcclxcblxcdFxcdC8vIEZldGNoIHRoZSBib3R0b20gY3Jvc3NpbmcgZWRnZXMuXFxyXFxuXFx0XFx0Y29vcmRzLnkgLT0gdGV4ZWxTaXplLnk7IC8vIFdlYkdMIHBvcnQgbm90ZTogQWRkZWQuXFxyXFxuXFx0XFx0ZmxvYXQgZTIgPSBzYW1wbGVMZXZlbFplcm9PZmZzZXQodERpZmZ1c2UsIGNvb3JkcywgaXZlYzIoMCwgMSkpLmc7XFxyXFxuXFxyXFxuXFx0XFx0Ly8gR2V0IHRoZSBhcmVhIGZvciB0aGlzIGRpcmVjdGlvbi5cXHJcXG5cXHRcXHR3ZWlnaHRzLmJhID0gYXJlYShzcXJ0RCwgZTEsIGUyLCBzdWJzYW1wbGVJbmRpY2VzLngpO1xcclxcblxcclxcblxcdH1cXHJcXG5cXHJcXG5cXHRnbF9GcmFnQ29sb3IgPSB3ZWlnaHRzO1xcclxcblxcclxcbn1cXHJcXG5cIjtcclxuY29uc3QgdmVydGV4ID0gXCJ1bmlmb3JtIHZlYzIgdGV4ZWxTaXplO1xcclxcblxcclxcbnZhcnlpbmcgdmVjMiB2VXY7XFxyXFxudmFyeWluZyB2ZWM0IHZPZmZzZXRbM107XFxyXFxudmFyeWluZyB2ZWMyIHZQaXhDb29yZDtcXHJcXG5cXHJcXG52b2lkIG1haW4oKSB7XFxyXFxuXFxyXFxuXFx0dlV2ID0gdXY7XFxyXFxuXFxyXFxuXFx0dlBpeENvb3JkID0gdXYgLyB0ZXhlbFNpemU7XFxyXFxuXFxyXFxuXFx0Ly8gT2Zmc2V0cyBmb3IgdGhlIHNlYXJjaGVzIChzZWUgQFBTRVVET19HQVRIRVI0KS5cXHJcXG5cXHR2T2Zmc2V0WzBdID0gdXYueHl4eSArIHRleGVsU2l6ZS54eXh5ICogdmVjNCgtMC4yNSwgMC4xMjUsIDEuMjUsIDAuMTI1KTsgLy8gQ2hhbmdlZCBzaWduIGluIFkgYW5kIFcgY29tcG9uZW50cy5cXHJcXG5cXHR2T2Zmc2V0WzFdID0gdXYueHl4eSArIHRleGVsU2l6ZS54eXh5ICogdmVjNCgtMC4xMjUsIDAuMjUsIC0wLjEyNSwgLTEuMjUpOyAvL0NoYW5nZWQgc2lnbiBpbiBZIGFuZCBXIGNvbXBvbmVudHMuXFxyXFxuXFxyXFxuXFx0Ly8gVGhpcyBpbmRpY2F0ZXMgdGhlIGVuZHMgb2YgdGhlIGxvb3BzLlxcclxcblxcdHZPZmZzZXRbMl0gPSB2ZWM0KHZPZmZzZXRbMF0ueHosIHZPZmZzZXRbMV0ueXcpICsgdmVjNCgtMi4wLCAyLjAsIC0yLjAsIDIuMCkgKiB0ZXhlbFNpemUueHh5eSAqIE1BWF9TRUFSQ0hfU1RFUFNfRkxPQVQ7XFxyXFxuXFxyXFxuXFx0Z2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbW9kZWxWaWV3TWF0cml4ICogdmVjNChwb3NpdGlvbiwgMS4wKTtcXHJcXG5cXHJcXG59XFxyXFxuXCI7XHJcblxyXG4vKipcclxuICogU3VicGl4ZWwgTW9ycGhvbG9naWNhbCBBbnRpYWxpYXNpbmcuXHJcbiAqXHJcbiAqIFRoaXMgbWF0ZXJpYWwgY29tcHV0ZXMgd2VpZ2h0cyBmb3IgZGV0ZWN0ZWQgZWRnZXMuXHJcbiAqL1xyXG5cclxuZXhwb3J0IGNsYXNzIFNNQUFXZWlnaHRzTWF0ZXJpYWwgZXh0ZW5kcyBTaGFkZXJNYXRlcmlhbCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgU01BQSB3ZWlnaHRzIG1hdGVyaWFsLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtWZWN0b3IyfSBbdGV4ZWxTaXplXSAtIFRoZSBhYnNvbHV0ZSBzY3JlZW4gdGV4ZWwgc2l6ZS5cclxuXHQgKi9cclxuXHJcblx0Y29uc3RydWN0b3IodGV4ZWxTaXplID0gbmV3IFZlY3RvcjIoKSkge1xyXG5cclxuXHRcdHN1cGVyKHtcclxuXHJcblx0XHRcdHR5cGU6IFwiU01BQVdlaWdodHNNYXRlcmlhbFwiLFxyXG5cclxuXHRcdFx0ZGVmaW5lczoge1xyXG5cclxuXHRcdFx0XHQvLyBDb25maWd1cmFibGUgc2V0dGluZ3M6XHJcblx0XHRcdFx0TUFYX1NFQVJDSF9TVEVQU19JTlQ6IFwiOFwiLFxyXG5cdFx0XHRcdE1BWF9TRUFSQ0hfU1RFUFNfRkxPQVQ6IFwiOC4wXCIsXHJcblxyXG5cdFx0XHRcdC8vIE5vbi1jb25maWd1cmFibGUgc2V0dGluZ3M6XHJcblx0XHRcdFx0QVJFQVRFWF9NQVhfRElTVEFOQ0U6IFwiMTYuMFwiLFxyXG5cdFx0XHRcdEFSRUFURVhfUElYRUxfU0laRTogXCIoMS4wIC8gdmVjMigxNjAuMCwgNTYwLjApKVwiLFxyXG5cdFx0XHRcdEFSRUFURVhfU1VCVEVYX1NJWkU6IFwiKDEuMCAvIDcuMClcIixcclxuXHRcdFx0XHRTRUFSQ0hURVhfU0laRTogXCJ2ZWMyKDY2LjAsIDMzLjApXCIsXHJcblx0XHRcdFx0U0VBUkNIVEVYX1BBQ0tFRF9TSVpFOiBcInZlYzIoNjQuMCwgMTYuMClcIlxyXG5cclxuXHRcdFx0fSxcclxuXHJcblx0XHRcdHVuaWZvcm1zOiB7XHJcblxyXG5cdFx0XHRcdHREaWZmdXNlOiBuZXcgVW5pZm9ybShudWxsKSxcclxuXHRcdFx0XHR0QXJlYTogbmV3IFVuaWZvcm0obnVsbCksXHJcblx0XHRcdFx0dFNlYXJjaDogbmV3IFVuaWZvcm0obnVsbCksXHJcblx0XHRcdFx0dGV4ZWxTaXplOiBuZXcgVW5pZm9ybSh0ZXhlbFNpemUpXHJcblxyXG5cdFx0XHR9LFxyXG5cclxuXHRcdFx0ZnJhZ21lbnRTaGFkZXI6IGZyYWdtZW50LFxyXG5cdFx0XHR2ZXJ0ZXhTaGFkZXI6IHZlcnRleCxcclxuXHJcblx0XHRcdGRlcHRoV3JpdGU6IGZhbHNlLFxyXG5cdFx0XHRkZXB0aFRlc3Q6IGZhbHNlXHJcblxyXG5cdFx0fSk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgbWF4aW11bSBhbW91bnQgb2Ygc3RlcHMgcGVyZm9ybWVkIGluIHRoZSBob3Jpem9udGFsL3ZlcnRpY2FsXHJcblx0ICogcGF0dGVybiBzZWFyY2hlcywgYXQgZWFjaCBzaWRlIG9mIHRoZSBwaXhlbC5cclxuXHQgKlxyXG5cdCAqIEluIG51bWJlciBvZiBwaXhlbHMsIGl0J3MgYWN0dWFsbHkgdGhlIGRvdWJsZS4gU28gdGhlIG1heGltdW0gbGluZSBsZW5ndGhcclxuXHQgKiBwZXJmZWN0bHkgaGFuZGxlZCBieSwgZm9yIGV4YW1wbGUgMTYsIGlzIDY0IChwZXJmZWN0bHkgbWVhbnMgdGhhdCBsb25nZXJcclxuXHQgKiBsaW5lcyB3b24ndCBsb29rIGFzIGdvb2QsIGJ1dCBhcmUgc3RpbGwgYW50aWFsaWFzZWQpLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IHN0ZXBzIC0gVGhlIHNlYXJjaCBzdGVwcy4gUmFuZ2U6IFswLCAxMTJdLlxyXG5cdCAqL1xyXG5cclxuXHRzZXRPcnRob2dvbmFsU2VhcmNoU3RlcHMoc3RlcHMpIHtcclxuXHJcblx0XHR0aGlzLmRlZmluZXMuTUFYX1NFQVJDSF9TVEVQU19JTlQgPSBzdGVwcy50b0ZpeGVkKFwiMFwiKTtcclxuXHRcdHRoaXMuZGVmaW5lcy5NQVhfU0VBUkNIX1NURVBTX0ZMT0FUID0gc3RlcHMudG9GaXhlZChcIjFcIik7XHJcblxyXG5cdFx0dGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuIiwiaW1wb3J0IHsgU2hhZGVyTWF0ZXJpYWwsIFVuaWZvcm0gfSBmcm9tIFwidGhyZWVcIjtcclxuXHJcbmNvbnN0IGZyYWdtZW50ID0gXCIjaW5jbHVkZSA8Y29tbW9uPlxcclxcbiNpbmNsdWRlIDxkaXRoZXJpbmdfcGFyc19mcmFnbWVudD5cXHJcXG5cXHJcXG51bmlmb3JtIHNhbXBsZXIyRCB0RGlmZnVzZTtcXHJcXG51bmlmb3JtIGZsb2F0IG1pZGRsZUdyZXk7XFxyXFxudW5pZm9ybSBmbG9hdCBtYXhMdW1pbmFuY2U7XFxyXFxuXFxyXFxuI2lmZGVmIEFEQVBURURfTFVNSU5BTkNFXFxyXFxuXFxyXFxuXFx0dW5pZm9ybSBzYW1wbGVyMkQgbHVtaW5hbmNlTWFwO1xcclxcblxcclxcbiNlbHNlXFxyXFxuXFxyXFxuXFx0dW5pZm9ybSBmbG9hdCBhdmVyYWdlTHVtaW5hbmNlO1xcclxcblxcclxcbiNlbmRpZlxcclxcblxcclxcbnZhcnlpbmcgdmVjMiB2VXY7XFxyXFxuXFxyXFxudmVjMyB0b25lTWFwKHZlYzMgYykge1xcclxcblxcclxcblxcdCNpZmRlZiBBREFQVEVEX0xVTUlOQU5DRVxcclxcblxcclxcblxcdFxcdC8vIEdldCB0aGUgY2FsY3VsYXRlZCBhdmVyYWdlIGx1bWluYW5jZSBieSBzYW1wbGluZyB0aGUgY2VudGVyLlxcclxcblxcdFxcdGZsb2F0IGx1bUF2ZyA9IHRleHR1cmUyRChsdW1pbmFuY2VNYXAsIHZlYzIoMC41KSkucjtcXHJcXG5cXHJcXG5cXHQjZWxzZVxcclxcblxcclxcblxcdFxcdGZsb2F0IGx1bUF2ZyA9IGF2ZXJhZ2VMdW1pbmFuY2U7XFxyXFxuXFxyXFxuXFx0I2VuZGlmXFxyXFxuXFxyXFxuXFx0Ly8gQ2FsY3VsYXRlIHRoZSBsdW1pbmFuY2Ugb2YgdGhlIGN1cnJlbnQgcGl4ZWwuXFxyXFxuXFx0ZmxvYXQgbHVtUGl4ZWwgPSBsaW5lYXJUb1JlbGF0aXZlTHVtaW5hbmNlKGMpO1xcclxcblxcclxcblxcdC8vIEFwcGx5IHRoZSBtb2RpZmllZCBvcGVyYXRvciAoUmVpbmhhcmQgRXEuIDQpLlxcclxcblxcdGZsb2F0IGx1bVNjYWxlZCA9IChsdW1QaXhlbCAqIG1pZGRsZUdyZXkpIC8gbHVtQXZnO1xcclxcblxcclxcblxcdGZsb2F0IGx1bUNvbXByZXNzZWQgPSAobHVtU2NhbGVkICogKDEuMCArIChsdW1TY2FsZWQgLyAobWF4THVtaW5hbmNlICogbWF4THVtaW5hbmNlKSkpKSAvICgxLjAgKyBsdW1TY2FsZWQpO1xcclxcblxcclxcblxcdHJldHVybiBsdW1Db21wcmVzc2VkICogYztcXHJcXG5cXHJcXG59XFxyXFxuXFxyXFxudm9pZCBtYWluKCkge1xcclxcblxcclxcblxcdHZlYzQgdGV4ZWwgPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdik7XFxyXFxuXFx0Z2xfRnJhZ0NvbG9yID0gdmVjNCh0b25lTWFwKHRleGVsLnJnYiksIHRleGVsLmEpO1xcclxcblxcclxcblxcdCNpbmNsdWRlIDxkaXRoZXJpbmdfZnJhZ21lbnQ+XFxyXFxuXFxyXFxufVxcclxcblwiO1xyXG5jb25zdCB2ZXJ0ZXggPSBcInZhcnlpbmcgdmVjMiB2VXY7XFxyXFxuXFxyXFxudm9pZCBtYWluKCkge1xcclxcblxcclxcblxcdHZVdiA9IHV2O1xcclxcblxcdGdsX1Bvc2l0aW9uID0gcHJvamVjdGlvbk1hdHJpeCAqIG1vZGVsVmlld01hdHJpeCAqIHZlYzQocG9zaXRpb24sIDEuMCk7XFxyXFxuXFxyXFxufVxcclxcblwiO1xyXG5cclxuLyoqXHJcbiAqIEZ1bGwtc2NyZWVuIHRvbmUtbWFwcGluZyBzaGFkZXIgbWF0ZXJpYWwuXHJcbiAqXHJcbiAqIFRoaXMgbWF0ZXJpYWwgc3VwcG9ydHMgZGl0aGVyaW5nLlxyXG4gKlxyXG4gKiBSZWZlcmVuY2U6XHJcbiAqICBodHRwOi8vd3d3LmNpcy5yaXQuZWR1L3Blb3BsZS9mYWN1bHR5L2ZlcndlcmRhL3B1YmxpY2F0aW9ucy9zaWcwMl9wYXBlci5wZGZcclxuICovXHJcblxyXG5leHBvcnQgY2xhc3MgVG9uZU1hcHBpbmdNYXRlcmlhbCBleHRlbmRzIFNoYWRlck1hdGVyaWFsIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyB0b25lIG1hcHBpbmcgbWF0ZXJpYWwuXHJcblx0ICovXHJcblxyXG5cdGNvbnN0cnVjdG9yKCkge1xyXG5cclxuXHRcdHN1cGVyKHtcclxuXHJcblx0XHRcdHR5cGU6IFwiVG9uZU1hcHBpbmdNYXRlcmlhbFwiLFxyXG5cclxuXHRcdFx0dW5pZm9ybXM6IHtcclxuXHJcblx0XHRcdFx0dERpZmZ1c2U6IG5ldyBVbmlmb3JtKG51bGwpLFxyXG5cdFx0XHRcdGx1bWluYW5jZU1hcDogbmV3IFVuaWZvcm0obnVsbCksXHJcblx0XHRcdFx0YXZlcmFnZUx1bWluYW5jZTogbmV3IFVuaWZvcm0oMS4wKSxcclxuXHRcdFx0XHRtYXhMdW1pbmFuY2U6IG5ldyBVbmlmb3JtKDE2LjApLFxyXG5cdFx0XHRcdG1pZGRsZUdyZXk6IG5ldyBVbmlmb3JtKDAuNilcclxuXHJcblx0XHRcdH0sXHJcblxyXG5cdFx0XHRmcmFnbWVudFNoYWRlcjogZnJhZ21lbnQsXHJcblx0XHRcdHZlcnRleFNoYWRlcjogdmVydGV4LFxyXG5cclxuXHRcdFx0ZGVwdGhXcml0ZTogZmFsc2UsXHJcblx0XHRcdGRlcHRoVGVzdDogZmFsc2VcclxuXHJcblx0XHR9KTtcclxuXHJcblx0fVxyXG5cclxufVxyXG4iLCIvKipcclxuICogQSBjb2xsZWN0aW9uIG9mIHNoYWRlciBtYXRlcmlhbHMgdGhhdCBhcmUgdXNlZCBpbiB0aGUgcG9zdCBwcm9jZXNzaW5nIHBhc3Nlcy5cclxuICpcclxuICogQG1vZHVsZSBwb3N0cHJvY2Vzc2luZy9tYXRlcmlhbHNcclxuICovXHJcblxyXG5leHBvcnQgeyBBZGFwdGl2ZUx1bWlub3NpdHlNYXRlcmlhbCB9IGZyb20gXCIuL0FkYXB0aXZlTHVtaW5vc2l0eU1hdGVyaWFsLmpzXCI7XHJcbmV4cG9ydCB7IEJva2VoTWF0ZXJpYWwgfSBmcm9tIFwiLi9Cb2tlaE1hdGVyaWFsLmpzXCI7XHJcbmV4cG9ydCB7IENvbG9yRWRnZXNNYXRlcmlhbCB9IGZyb20gXCIuL0NvbG9yRWRnZXNNYXRlcmlhbC5qc1wiO1xyXG5leHBvcnQgeyBDb21iaW5lTWF0ZXJpYWwgfSBmcm9tIFwiLi9Db21iaW5lTWF0ZXJpYWwuanNcIjtcclxuZXhwb3J0IHsgQ29udm9sdXRpb25NYXRlcmlhbCwgS2VybmVsU2l6ZSB9IGZyb20gXCIuL0NvbnZvbHV0aW9uTWF0ZXJpYWwuanNcIjtcclxuZXhwb3J0IHsgQ29weU1hdGVyaWFsIH0gZnJvbSBcIi4vQ29weU1hdGVyaWFsLmpzXCI7XHJcbmV4cG9ydCB7IERlcHRoQ29tcGFyaXNvbk1hdGVyaWFsIH0gZnJvbSBcIi4vRGVwdGhDb21wYXJpc29uTWF0ZXJpYWwuanNcIjtcclxuZXhwb3J0IHsgRG90U2NyZWVuTWF0ZXJpYWwgfSBmcm9tIFwiLi9Eb3RTY3JlZW5NYXRlcmlhbC5qc1wiO1xyXG5leHBvcnQgeyBGaWxtTWF0ZXJpYWwgfSBmcm9tIFwiLi9GaWxtTWF0ZXJpYWwuanNcIjtcclxuZXhwb3J0IHsgR2xpdGNoTWF0ZXJpYWwgfSBmcm9tIFwiLi9HbGl0Y2hNYXRlcmlhbC5qc1wiO1xyXG5leHBvcnQgeyBHb2RSYXlzTWF0ZXJpYWwgfSBmcm9tIFwiLi9Hb2RSYXlzTWF0ZXJpYWwuanNcIjtcclxuZXhwb3J0IHsgTHVtaW5vc2l0eU1hdGVyaWFsIH0gZnJvbSBcIi4vTHVtaW5vc2l0eU1hdGVyaWFsLmpzXCI7XHJcbmV4cG9ydCB7IE91dGxpbmVCbGVuZE1hdGVyaWFsIH0gZnJvbSBcIi4vT3V0bGluZUJsZW5kTWF0ZXJpYWwuanNcIjtcclxuZXhwb3J0IHsgT3V0bGluZUVkZ2VzTWF0ZXJpYWwgfSBmcm9tIFwiLi9PdXRsaW5lRWRnZXNNYXRlcmlhbC5qc1wiO1xyXG5leHBvcnQgeyBQaXhlbGF0aW9uTWF0ZXJpYWwgfSBmcm9tIFwiLi9QaXhlbGF0aW9uTWF0ZXJpYWwuanNcIjtcclxuZXhwb3J0IHsgUmVhbGlzdGljQm9rZWhNYXRlcmlhbCB9IGZyb20gXCIuL1JlYWxpc3RpY0Jva2VoTWF0ZXJpYWwuanNcIjtcclxuZXhwb3J0IHsgU2hvY2tXYXZlTWF0ZXJpYWwgfSBmcm9tIFwiLi9TaG9ja1dhdmVNYXRlcmlhbC5qc1wiO1xyXG5leHBvcnQgeyBTTUFBQmxlbmRNYXRlcmlhbCB9IGZyb20gXCIuL1NNQUFCbGVuZE1hdGVyaWFsLmpzXCI7XHJcbmV4cG9ydCB7IFNNQUFXZWlnaHRzTWF0ZXJpYWwgfSBmcm9tIFwiLi9TTUFBV2VpZ2h0c01hdGVyaWFsLmpzXCI7XHJcbmV4cG9ydCB7IFRvbmVNYXBwaW5nTWF0ZXJpYWwgfSBmcm9tIFwiLi9Ub25lTWFwcGluZ01hdGVyaWFsLmpzXCI7XHJcbiIsImltcG9ydCB7IFNjZW5lLCBNZXNoLCBPcnRob2dyYXBoaWNDYW1lcmEsIFBsYW5lQnVmZmVyR2VvbWV0cnkgfSBmcm9tIFwidGhyZWVcIjtcclxuXHJcbi8qKlxyXG4gKiBBbiBhYnN0cmFjdCBwYXNzLlxyXG4gKlxyXG4gKiBQYXNzZXMgdGhhdCBkbyBub3QgcmVseSBvbiB0aGUgZGVwdGggYnVmZmVyIHNob3VsZCBleHBsaWNpdGx5IGRpc2FibGUgdGhlXHJcbiAqIGRlcHRoIHRlc3QgYW5kIGRlcHRoIHdyaXRlIGluIHRoZWlyIHJlc3BlY3RpdmUgc2hhZGVyIG1hdGVyaWFscy5cclxuICpcclxuICogQGltcGxlbWVudHMge1Jlc2l6YWJsZX1cclxuICogQGltcGxlbWVudHMge0Rpc3Bvc2FibGV9XHJcbiAqL1xyXG5cclxuZXhwb3J0IGNsYXNzIFBhc3Mge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHBhc3MuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1N0cmluZ30gW25hbWVdIC0gVGhlIG5hbWUgb2YgdGhpcyBwYXNzLlxyXG5cdCAqIEBwYXJhbSB7U2NlbmV9IFtzY2VuZV0gLSBUaGUgc2NlbmUgdG8gcmVuZGVyLlxyXG5cdCAqIEBwYXJhbSB7Q2FtZXJhfSBbY2FtZXJhXSAtIFRoZSBjYW1lcmEuXHJcblx0ICogQHBhcmFtIHtNZXNofSBbcXVhZF0gLSBBIHF1YWQgdGhhdCBmaWxscyB0aGUgc2NyZWVuIHRvIHJlbmRlciAyRCBmaWx0ZXIgZWZmZWN0cy4gU2V0IHRoaXMgdG8gbnVsbCwgaWYgeW91IGRvbid0IG5lZWQgaXQgKHNlZSB7QGxpbmsgUmVuZGVyUGFzc30pLlxyXG5cdCAqL1xyXG5cclxuXHRjb25zdHJ1Y3RvcihcclxuXHRcdG5hbWUgPSBcIlBhc3NcIixcclxuXHRcdHNjZW5lID0gbmV3IFNjZW5lKCksXHJcblx0XHRjYW1lcmEgPSBuZXcgT3J0aG9ncmFwaGljQ2FtZXJhKC0xLCAxLCAxLCAtMSwgMCwgMSksXHJcblx0XHRxdWFkID0gbmV3IE1lc2gobmV3IFBsYW5lQnVmZmVyR2VvbWV0cnkoMiwgMiksIG51bGwpXHJcblx0KSB7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbmFtZSBvZiB0aGlzIHBhc3MuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1N0cmluZ31cclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMubmFtZSA9IG5hbWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgc2NlbmUgdG8gcmVuZGVyLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtTY2VuZX1cclxuXHRcdCAqIEBwcm90ZWN0ZWRcclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMuc2NlbmUgPSBzY2VuZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBjYW1lcmEuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0NhbWVyYX1cclxuXHRcdCAqIEBwcm90ZWN0ZWRcclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMuY2FtZXJhID0gY2FtZXJhO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBxdWFkIG1lc2ggdGhhdCBmaWxscyB0aGUgc2NyZWVuLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtNZXNofVxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMucXVhZCA9IHF1YWQ7XHJcblxyXG5cdFx0aWYodGhpcy5xdWFkICE9PSBudWxsKSB7XHJcblxyXG5cdFx0XHR0aGlzLnF1YWQuZnJ1c3R1bUN1bGxlZCA9IGZhbHNlO1xyXG5cclxuXHRcdFx0aWYodGhpcy5zY2VuZSAhPT0gbnVsbCkge1xyXG5cclxuXHRcdFx0XHR0aGlzLnNjZW5lLmFkZCh0aGlzLnF1YWQpO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgcGFzcyBzaG91bGQgcmVuZGVyIHRvIHNjcmVlbi5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Qm9vbGVhbn1cclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMucmVuZGVyVG9TY3JlZW4gPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgcGFzcyBzaG91bGQgYmUgZXhlY3V0ZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0Jvb2xlYW59XHJcblx0XHQgKi9cclxuXHJcblx0XHR0aGlzLmVuYWJsZWQgPSB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHtAbGluayBFZmZlY3RDb21wb3Nlcn0gc2hvdWxkIHN3YXAgdGhlIGZyYW1lXHJcblx0XHQgKiBidWZmZXJzIGFmdGVyIHRoaXMgcGFzcyBoYXMgZmluaXNoZWQgcmVuZGVyaW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIFNldCB0aGlzIHRvIGBmYWxzZWAgaWYgdGhpcyBwYXNzIGRvZXNuJ3QgcmVuZGVyIHRvIHRoZSBvdXRwdXQgYnVmZmVyIG9yXHJcblx0XHQgKiB0aGUgc2NyZWVuLiBPdGhlcndpc2UsIHRoZSBjb250ZW50cyBvZiB0aGUgaW5wdXQgYnVmZmVyIHdpbGwgYmUgbG9zdC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Qm9vbGVhbn1cclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMubmVlZHNTd2FwID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgZnVsbHNjcmVlbiBtYXRlcmlhbC5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtNYXRlcmlhbH1cclxuXHQgKi9cclxuXHJcblx0Z2V0IG1hdGVyaWFsKCkge1xyXG5cclxuXHRcdHJldHVybiAodGhpcy5xdWFkICE9PSBudWxsKSA/IHRoaXMucXVhZC5tYXRlcmlhbCA6IG51bGw7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgZnVsbHNjcmVlbiBtYXRlcmlhbC5cclxuXHQgKlxyXG5cdCAqIFRoZSBtYXRlcmlhbCB3aWxsIGJlIGFzc2lnbmVkIHRvIHRoZSBxdWFkIG1lc2ggdGhhdCBmaWxscyB0aGUgc2NyZWVuLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge01hdGVyaWFsfVxyXG5cdCAqL1xyXG5cclxuXHRzZXQgbWF0ZXJpYWwodmFsdWUpIHtcclxuXHJcblx0XHRpZih0aGlzLnF1YWQgIT09IG51bGwpIHtcclxuXHJcblx0XHRcdHRoaXMucXVhZC5tYXRlcmlhbCA9IHZhbHVlO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZW5kZXJzIHRoZSBlZmZlY3QuXHJcblx0ICpcclxuXHQgKiBUaGlzIGlzIGFuIGFic3RyYWN0IG1ldGhvZCB0aGF0IG11c3QgYmUgb3ZlcnJpZGRlbi5cclxuXHQgKlxyXG5cdCAqIEBhYnN0cmFjdFxyXG5cdCAqIEB0aHJvd3Mge0Vycm9yfSBBbiBlcnJvciBpcyB0aHJvd24gaWYgdGhlIG1ldGhvZCBpcyBub3Qgb3ZlcnJpZGRlbi5cclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IGlucHV0QnVmZmVyIC0gQSBmcmFtZSBidWZmZXIgdGhhdCBjb250YWlucyB0aGUgcmVzdWx0IG9mIHRoZSBwcmV2aW91cyBwYXNzLlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IG91dHB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgc2VydmVzIGFzIHRoZSBvdXRwdXQgcmVuZGVyIHRhcmdldCB1bmxlc3MgdGhpcyBwYXNzIHJlbmRlcnMgdG8gc2NyZWVuLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbZGVsdGFdIC0gVGhlIHRpbWUgYmV0d2VlbiB0aGUgbGFzdCBmcmFtZSBhbmQgdGhlIGN1cnJlbnQgb25lIGluIHNlY29uZHMuXHJcblx0ICogQHBhcmFtIHtCb29sZWFufSBbc3RlbmNpbFRlc3RdIC0gSW5kaWNhdGVzIHdoZXRoZXIgYSBzdGVuY2lsIG1hc2sgaXMgYWN0aXZlLlxyXG5cdCAqL1xyXG5cclxuXHRyZW5kZXIocmVuZGVyZXIsIGlucHV0QnVmZmVyLCBvdXRwdXRCdWZmZXIsIGRlbHRhLCBzdGVuY2lsVGVzdCkge1xyXG5cclxuXHRcdHRocm93IG5ldyBFcnJvcihcIlJlbmRlciBtZXRob2Qgbm90IGltcGxlbWVudGVkIVwiKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBVcGRhdGVzIHRoaXMgcGFzcyB3aXRoIHRoZSByZW5kZXJlcidzIHNpemUuXHJcblx0ICpcclxuXHQgKiBZb3UgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGluIGNhc2UgeW91IHdhbnQgdG8gYmUgaW5mb3JtZWQgYWJvdXQgdGhlIG1haW5cclxuXHQgKiByZW5kZXIgc2l6ZS5cclxuXHQgKlxyXG5cdCAqIFRoZSB7QGxpbmsgRWZmZWN0Q29tcG9zZXJ9IGNhbGxzIHRoaXMgbWV0aG9kIGJlZm9yZSB0aGlzIHBhc3MgaXNcclxuXHQgKiBpbml0aWFsaXplZCBhbmQgZXZlcnkgdGltZSBpdHMgb3duIHNpemUgaXMgdXBkYXRlZC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSB3aWR0aCAtIFRoZSByZW5kZXJlcidzIHdpZHRoLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBoZWlnaHQgLSBUaGUgcmVuZGVyZXIncyBoZWlnaHQuXHJcblx0ICogQGV4YW1wbGUgdGhpcy5teVJlbmRlclRhcmdldC5zZXRTaXplKHdpZHRoLCBoZWlnaHQpO1xyXG5cdCAqL1xyXG5cclxuXHRzZXRTaXplKHdpZHRoLCBoZWlnaHQpIHt9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFBlcmZvcm1zIGluaXRpYWxpemF0aW9uIHRhc2tzLlxyXG5cdCAqXHJcblx0ICogQnkgb3ZlcnJpZGluZyB0aGlzIG1ldGhvZCB5b3UgZ2FpbiBhY2Nlc3MgdG8gdGhlIHJlbmRlcmVyLiBZb3UnbGwgYWxzbyBiZVxyXG5cdCAqIGFibGUgdG8gY29uZmlndXJlIHlvdXIgY3VzdG9tIHJlbmRlciB0YXJnZXRzIHRvIHVzZSB0aGUgYXBwcm9wcmlhdGUgZm9ybWF0XHJcblx0ICogKFJHQiBvciBSR0JBKS5cclxuXHQgKlxyXG5cdCAqIFRoZSBwcm92aWRlZCByZW5kZXJlciBjYW4gYmUgdXNlZCB0byB3YXJtIHVwIHNwZWNpYWwgb2ZmLXNjcmVlbiByZW5kZXJcclxuXHQgKiB0YXJnZXRzIGJ5IHBlcmZvcm1pbmcgYSBwcmVsaW1pbmFyeSByZW5kZXIgb3BlcmF0aW9uLlxyXG5cdCAqXHJcblx0ICogVGhlIHtAbGluayBFZmZlY3RDb21wb3Nlcn0gY2FsbHMgdGhpcyBtZXRob2Qgd2hlbiB0aGlzIHBhc3MgaXMgYWRkZWQgdG8gaXRzXHJcblx0ICogcXVldWUsIGJ1dCBub3QgYmVmb3JlIGl0cyBzaXplIGhhcyBiZWVuIHNldC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJlcn0gcmVuZGVyZXIgLSBUaGUgcmVuZGVyZXIuXHJcblx0ICogQHBhcmFtIHtCb29sZWFufSBhbHBoYSAtIFdoZXRoZXIgdGhlIHJlbmRlcmVyIHVzZXMgdGhlIGFscGhhIGNoYW5uZWwgb3Igbm90LlxyXG5cdCAqIEBleGFtcGxlIGlmKCFhbHBoYSkgeyB0aGlzLm15UmVuZGVyVGFyZ2V0LnRleHR1cmUuZm9ybWF0ID0gUkdCRm9ybWF0OyB9XHJcblx0ICovXHJcblxyXG5cdGluaXRpYWxpemUocmVuZGVyZXIsIGFscGhhKSB7fVxyXG5cclxuXHQvKipcclxuXHQgKiBQZXJmb3JtcyBhIHNoYWxsb3cgc2VhcmNoIGZvciBwcm9wZXJ0aWVzIHRoYXQgZGVmaW5lIGEgZGlzcG9zZSBtZXRob2QgYW5kXHJcblx0ICogZGVsZXRlcyB0aGVtLiBUaGUgcGFzcyB3aWxsIGJlIGlub3BlcmF0aXZlIGFmdGVyIHRoaXMgbWV0aG9kIHdhcyBjYWxsZWQhXHJcblx0ICpcclxuXHQgKiBEaXNwb3NhYmxlIG9iamVjdHM6XHJcblx0ICogIC0gcmVuZGVyIHRhcmdldHNcclxuXHQgKiAgLSBtYXRlcmlhbHNcclxuXHQgKiAgLSB0ZXh0dXJlc1xyXG5cdCAqXHJcblx0ICogVGhlIHtAbGluayBFZmZlY3RDb21wb3Nlcn0gY2FsbHMgdGhpcyBtZXRob2Qgd2hlbiBpdCBpcyBiZWluZyBkZXN0cm95ZWQuXHJcblx0ICogWW91IG1heSwgaG93ZXZlciwgdXNlIGl0IGluZGVwZW5kZW50bHkgdG8gZnJlZSBtZW1vcnkgd2hlbiB5b3UgYXJlIGNlcnRhaW5cclxuXHQgKiB0aGF0IHlvdSBkb24ndCBuZWVkIHRoaXMgcGFzcyBhbnltb3JlLlxyXG5cdCAqL1xyXG5cclxuXHRkaXNwb3NlKCkge1xyXG5cclxuXHRcdGxldCBrZXk7XHJcblxyXG5cdFx0Zm9yKGtleSBvZiBPYmplY3Qua2V5cyh0aGlzKSkge1xyXG5cclxuXHRcdFx0aWYodGhpc1trZXldICE9PSBudWxsICYmIHR5cGVvZiB0aGlzW2tleV0uZGlzcG9zZSA9PT0gXCJmdW5jdGlvblwiKSB7XHJcblxyXG5cdFx0XHRcdHRoaXNba2V5XS5kaXNwb3NlKCk7XHJcblx0XHRcdFx0dGhpc1trZXldID0gbnVsbDtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYodGhpcy5tYXRlcmlhbCAhPT0gbnVsbCkge1xyXG5cclxuXHRcdFx0dGhpcy5tYXRlcmlhbC5kaXNwb3NlKCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG59XHJcbiIsImltcG9ydCB7IExpbmVhckZpbHRlciwgUkdCRm9ybWF0LCBXZWJHTFJlbmRlclRhcmdldCB9IGZyb20gXCJ0aHJlZVwiO1xyXG5pbXBvcnQgeyBDb252b2x1dGlvbk1hdGVyaWFsLCBLZXJuZWxTaXplIH0gZnJvbSBcIi4uL21hdGVyaWFsc1wiO1xyXG5pbXBvcnQgeyBQYXNzIH0gZnJvbSBcIi4vUGFzcy5qc1wiO1xyXG5cclxuLyoqXHJcbiAqIEFuIGVmZmljaWVudCwgaW5jcmVtZW50YWwgYmx1ciBwYXNzLlxyXG4gKlxyXG4gKiBOb3RlOiBUaGlzIHBhc3MgYWxsb3dzIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlciB0byBiZSB0aGUgc2FtZS5cclxuICovXHJcblxyXG5leHBvcnQgY2xhc3MgQmx1clBhc3MgZXh0ZW5kcyBQYXNzIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBibHVyIHBhc3MuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gVGhlIG9wdGlvbnMuXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLnJlc29sdXRpb25TY2FsZT0wLjVdIC0gVGhlIHJlbmRlciB0ZXh0dXJlIHJlc29sdXRpb24gc2NhbGUsIHJlbGF0aXZlIHRvIHRoZSBzY3JlZW4gcmVuZGVyIHNpemUuXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmtlcm5lbFNpemU9S2VybmVsU2l6ZS5MQVJHRV0gLSBUaGUgYmx1ciBrZXJuZWwgc2l6ZS5cclxuXHQgKi9cclxuXHJcblx0Y29uc3RydWN0b3Iob3B0aW9ucyA9IHt9KSB7XHJcblxyXG5cdFx0c3VwZXIoXCJCbHVyUGFzc1wiKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgcmVuZGVyIHRhcmdldC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7V2ViR0xSZW5kZXJUYXJnZXR9XHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy5yZW5kZXJUYXJnZXRYID0gbmV3IFdlYkdMUmVuZGVyVGFyZ2V0KDEsIDEsIHtcclxuXHRcdFx0bWluRmlsdGVyOiBMaW5lYXJGaWx0ZXIsXHJcblx0XHRcdG1hZ0ZpbHRlcjogTGluZWFyRmlsdGVyLFxyXG5cdFx0XHRzdGVuY2lsQnVmZmVyOiBmYWxzZSxcclxuXHRcdFx0ZGVwdGhCdWZmZXI6IGZhbHNlXHJcblx0XHR9KTtcclxuXHJcblx0XHR0aGlzLnJlbmRlclRhcmdldFgudGV4dHVyZS5uYW1lID0gXCJCbHVyLlRhcmdldFhcIjtcclxuXHRcdHRoaXMucmVuZGVyVGFyZ2V0WC50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBzZWNvbmQgcmVuZGVyIHRhcmdldC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7V2ViR0xSZW5kZXJUYXJnZXR9XHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy5yZW5kZXJUYXJnZXRZID0gdGhpcy5yZW5kZXJUYXJnZXRYLmNsb25lKCk7XHJcblxyXG5cdFx0dGhpcy5yZW5kZXJUYXJnZXRZLnRleHR1cmUubmFtZSA9IFwiQmx1ci5UYXJnZXRZXCI7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgcmVzb2x1dGlvbiBzY2FsZS5cclxuXHRcdCAqXHJcblx0XHQgKiBZb3UgbmVlZCB0byBjYWxsIHtAbGluayBFZmZlY3RDb21wb3NlciNzZXRTaXplfSBhZnRlciBjaGFuZ2luZyB0aGlzXHJcblx0XHQgKiB2YWx1ZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7TnVtYmVyfVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy5yZXNvbHV0aW9uU2NhbGUgPSAob3B0aW9ucy5yZXNvbHV0aW9uU2NhbGUgIT09IHVuZGVmaW5lZCkgPyBvcHRpb25zLnJlc29sdXRpb25TY2FsZSA6IDAuNTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgY29udm9sdXRpb24gc2hhZGVyIG1hdGVyaWFsLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtDb252b2x1dGlvbk1hdGVyaWFsfVxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMuY29udm9sdXRpb25NYXRlcmlhbCA9IG5ldyBDb252b2x1dGlvbk1hdGVyaWFsKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIGNvbnZvbHV0aW9uIHNoYWRlciBtYXRlcmlhbCB0aGF0IHVzZXMgZGl0aGVyaW5nLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtDb252b2x1dGlvbk1hdGVyaWFsfVxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMuZGl0aGVyZWRDb252b2x1dGlvbk1hdGVyaWFsID0gbmV3IENvbnZvbHV0aW9uTWF0ZXJpYWwoKTtcclxuXHRcdHRoaXMuZGl0aGVyZWRDb252b2x1dGlvbk1hdGVyaWFsLmRpdGhlcmluZyA9IHRydWU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBXaGV0aGVyIHRoZSBibHVycmVkIHJlc3VsdCBzaG91bGQgYWxzbyBiZSBkaXRoZXJlZCB1c2luZyBub2lzZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Qm9vbGVhbn1cclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMuZGl0aGVyaW5nID0gZmFsc2U7XHJcblxyXG5cdFx0dGhpcy5rZXJuZWxTaXplID0gb3B0aW9ucy5rZXJuZWxTaXplO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBhYnNvbHV0ZSB3aWR0aCBvZiB0aGUgaW50ZXJuYWwgcmVuZGVyIHRhcmdldHMuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7TnVtYmVyfVxyXG5cdCAqL1xyXG5cclxuXHRnZXQgd2lkdGgoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMucmVuZGVyVGFyZ2V0WC53aWR0aDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgYWJzb2x1dGUgaGVpZ2h0IG9mIHRoZSBpbnRlcm5hbCByZW5kZXIgdGFyZ2V0cy5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtOdW1iZXJ9XHJcblx0ICovXHJcblxyXG5cdGdldCBoZWlnaHQoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMucmVuZGVyVGFyZ2V0WC5oZWlnaHQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIGtlcm5lbCBzaXplLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge0tlcm5lbFNpemV9XHJcblx0ICovXHJcblxyXG5cdGdldCBrZXJuZWxTaXplKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmNvbnZvbHV0aW9uTWF0ZXJpYWwua2VybmVsU2l6ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBAdHlwZSB7S2VybmVsU2l6ZX1cclxuXHQgKi9cclxuXHJcblx0c2V0IGtlcm5lbFNpemUodmFsdWUgPSBLZXJuZWxTaXplLkxBUkdFKSB7XHJcblxyXG5cdFx0dGhpcy5jb252b2x1dGlvbk1hdGVyaWFsLmtlcm5lbFNpemUgPSB2YWx1ZTtcclxuXHRcdHRoaXMuZGl0aGVyZWRDb252b2x1dGlvbk1hdGVyaWFsLmtlcm5lbFNpemUgPSB2YWx1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBCbHVycyB0aGUgaW5wdXQgYnVmZmVyIGFuZCB3cml0ZXMgdGhlIHJlc3VsdCB0byB0aGUgb3V0cHV0IGJ1ZmZlci4gVGhlXHJcblx0ICogaW5wdXQgYnVmZmVyIHJlbWFpbnMgaW50YWN0LCB1bmxlc3MgaXRzIGFsc28gdGhlIG91dHB1dCBidWZmZXIuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IGlucHV0QnVmZmVyIC0gQSBmcmFtZSBidWZmZXIgdGhhdCBjb250YWlucyB0aGUgcmVzdWx0IG9mIHRoZSBwcmV2aW91cyBwYXNzLlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IG91dHB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgc2VydmVzIGFzIHRoZSBvdXRwdXQgcmVuZGVyIHRhcmdldCB1bmxlc3MgdGhpcyBwYXNzIHJlbmRlcnMgdG8gc2NyZWVuLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbZGVsdGFdIC0gVGhlIHRpbWUgYmV0d2VlbiB0aGUgbGFzdCBmcmFtZSBhbmQgdGhlIGN1cnJlbnQgb25lIGluIHNlY29uZHMuXHJcblx0ICogQHBhcmFtIHtCb29sZWFufSBbc3RlbmNpbFRlc3RdIC0gSW5kaWNhdGVzIHdoZXRoZXIgYSBzdGVuY2lsIG1hc2sgaXMgYWN0aXZlLlxyXG5cdCAqL1xyXG5cclxuXHRyZW5kZXIocmVuZGVyZXIsIGlucHV0QnVmZmVyLCBvdXRwdXRCdWZmZXIsIGRlbHRhLCBzdGVuY2lsVGVzdCkge1xyXG5cclxuXHRcdGNvbnN0IHNjZW5lID0gdGhpcy5zY2VuZTtcclxuXHRcdGNvbnN0IGNhbWVyYSA9IHRoaXMuY2FtZXJhO1xyXG5cclxuXHRcdGNvbnN0IHJlbmRlclRhcmdldFggPSB0aGlzLnJlbmRlclRhcmdldFg7XHJcblx0XHRjb25zdCByZW5kZXJUYXJnZXRZID0gdGhpcy5yZW5kZXJUYXJnZXRZO1xyXG5cclxuXHRcdGxldCBtYXRlcmlhbCA9IHRoaXMuY29udm9sdXRpb25NYXRlcmlhbDtcclxuXHRcdGxldCB1bmlmb3JtcyA9IG1hdGVyaWFsLnVuaWZvcm1zO1xyXG5cdFx0Y29uc3Qga2VybmVsID0gbWF0ZXJpYWwuZ2V0S2VybmVsKCk7XHJcblxyXG5cdFx0bGV0IGxhc3RSVCA9IGlucHV0QnVmZmVyO1xyXG5cdFx0bGV0IGRlc3RSVDtcclxuXHRcdGxldCBpLCBsO1xyXG5cclxuXHRcdHRoaXMubWF0ZXJpYWwgPSBtYXRlcmlhbDtcclxuXHJcblx0XHQvLyBBcHBseSB0aGUgbXVsdGktcGFzcyBibHVyLlxyXG5cdFx0Zm9yKGkgPSAwLCBsID0ga2VybmVsLmxlbmd0aCAtIDE7IGkgPCBsOyArK2kpIHtcclxuXHJcblx0XHRcdC8vIEFsdGVybmF0ZSBiZXR3ZWVuIHRhcmdldHMuXHJcblx0XHRcdGRlc3RSVCA9ICgoaSAlIDIpID09PSAwKSA/IHJlbmRlclRhcmdldFggOiByZW5kZXJUYXJnZXRZO1xyXG5cclxuXHRcdFx0dW5pZm9ybXMua2VybmVsLnZhbHVlID0ga2VybmVsW2ldO1xyXG5cdFx0XHR1bmlmb3Jtcy50RGlmZnVzZS52YWx1ZSA9IGxhc3RSVC50ZXh0dXJlO1xyXG5cdFx0XHRyZW5kZXJlci5yZW5kZXIoc2NlbmUsIGNhbWVyYSwgZGVzdFJUKTtcclxuXHJcblx0XHRcdGxhc3RSVCA9IGRlc3RSVDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYodGhpcy5kaXRoZXJpbmcpIHtcclxuXHJcblx0XHRcdG1hdGVyaWFsID0gdGhpcy5kaXRoZXJlZENvbnZvbHV0aW9uTWF0ZXJpYWw7XHJcblx0XHRcdHVuaWZvcm1zID0gbWF0ZXJpYWwudW5pZm9ybXM7XHJcblx0XHRcdHRoaXMubWF0ZXJpYWwgPSBtYXRlcmlhbDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dW5pZm9ybXMua2VybmVsLnZhbHVlID0ga2VybmVsW2ldO1xyXG5cdFx0dW5pZm9ybXMudERpZmZ1c2UudmFsdWUgPSBsYXN0UlQudGV4dHVyZTtcclxuXHRcdHJlbmRlcmVyLnJlbmRlcihzY2VuZSwgY2FtZXJhLCB0aGlzLnJlbmRlclRvU2NyZWVuID8gbnVsbCA6IG91dHB1dEJ1ZmZlcik7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBkYXRlcyB0aGUgc2l6ZSBvZiB0aGlzIHBhc3MuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge051bWJlcn0gd2lkdGggLSBUaGUgd2lkdGguXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IGhlaWdodCAtIFRoZSBoZWlnaHQuXHJcblx0ICovXHJcblxyXG5cdHNldFNpemUod2lkdGgsIGhlaWdodCkge1xyXG5cclxuXHRcdHdpZHRoID0gTWF0aC5tYXgoMSwgTWF0aC5mbG9vcih3aWR0aCAqIHRoaXMucmVzb2x1dGlvblNjYWxlKSk7XHJcblx0XHRoZWlnaHQgPSBNYXRoLm1heCgxLCBNYXRoLmZsb29yKGhlaWdodCAqIHRoaXMucmVzb2x1dGlvblNjYWxlKSk7XHJcblxyXG5cdFx0dGhpcy5yZW5kZXJUYXJnZXRYLnNldFNpemUod2lkdGgsIGhlaWdodCk7XHJcblx0XHR0aGlzLnJlbmRlclRhcmdldFkuc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KTtcclxuXHJcblx0XHR0aGlzLmNvbnZvbHV0aW9uTWF0ZXJpYWwuc2V0VGV4ZWxTaXplKDEuMCAvIHdpZHRoLCAxLjAgLyBoZWlnaHQpO1xyXG5cdFx0dGhpcy5kaXRoZXJlZENvbnZvbHV0aW9uTWF0ZXJpYWwuc2V0VGV4ZWxTaXplKDEuMCAvIHdpZHRoLCAxLjAgLyBoZWlnaHQpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFBlcmZvcm1zIGluaXRpYWxpemF0aW9uIHRhc2tzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtXZWJHTFJlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlci5cclxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IGFscGhhIC0gV2hldGhlciB0aGUgcmVuZGVyZXIgdXNlcyB0aGUgYWxwaGEgY2hhbm5lbCBvciBub3QuXHJcblx0ICovXHJcblxyXG5cdGluaXRpYWxpemUocmVuZGVyZXIsIGFscGhhKSB7XHJcblxyXG5cdFx0aWYoIWFscGhhKSB7XHJcblxyXG5cdFx0XHR0aGlzLnJlbmRlclRhcmdldFgudGV4dHVyZS5mb3JtYXQgPSBSR0JGb3JtYXQ7XHJcblx0XHRcdHRoaXMucmVuZGVyVGFyZ2V0WS50ZXh0dXJlLmZvcm1hdCA9IFJHQkZvcm1hdDtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcbn1cclxuIiwiaW1wb3J0IHsgTGluZWFyRmlsdGVyLCBSR0JGb3JtYXQsIFdlYkdMUmVuZGVyVGFyZ2V0IH0gZnJvbSBcInRocmVlXCI7XHJcbmltcG9ydCB7IENvbWJpbmVNYXRlcmlhbCwgS2VybmVsU2l6ZSwgTHVtaW5vc2l0eU1hdGVyaWFsIH0gZnJvbSBcIi4uL21hdGVyaWFsc1wiO1xyXG5pbXBvcnQgeyBCbHVyUGFzcyB9IGZyb20gXCIuL0JsdXJQYXNzLmpzXCI7XHJcbmltcG9ydCB7IFBhc3MgfSBmcm9tIFwiLi9QYXNzLmpzXCI7XHJcblxyXG4vKipcclxuICogQSBibG9vbSBwYXNzLlxyXG4gKlxyXG4gKiBUaGlzIHBhc3MgcmVuZGVycyBhIHNjZW5lIHdpdGggc3VwZXJpbXBvc2VkIGJsdXIgYnkgdXRpbGl6aW5nIHRoZSBmYXN0IEthd2FzZVxyXG4gKiBjb252b2x1dGlvbiBhcHByb2FjaC5cclxuICovXHJcblxyXG5leHBvcnQgY2xhc3MgQmxvb21QYXNzIGV4dGVuZHMgUGFzcyB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgYmxvb20gcGFzcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gLSBUaGUgb3B0aW9ucy5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMucmVzb2x1dGlvblNjYWxlPTAuNV0gLSBUaGUgcmVuZGVyIHRleHR1cmUgcmVzb2x1dGlvbiBzY2FsZSwgcmVsYXRpdmUgdG8gdGhlIHNjcmVlbiByZW5kZXIgc2l6ZS5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMua2VybmVsU2l6ZT1LZXJuZWxTaXplLkxBUkdFXSAtIFRoZSBibHVyIGtlcm5lbCBzaXplLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5pbnRlbnNpdHk9MS4wXSAtIFRoZSBzdHJlbmd0aCBvZiB0aGUgYmxvb20gZWZmZWN0LlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5kaXN0aW5jdGlvbj0xLjBdIC0gVGhlIGx1bWluYW5jZSBkaXN0aW5jdGlvbiBmYWN0b3IuIFJhaXNlIHRoaXMgdmFsdWUgdG8gYnJpbmcgb3V0IHRoZSBicmlnaHRlciBlbGVtZW50cyBpbiB0aGUgc2NlbmUuXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLnNjcmVlbk1vZGU9dHJ1ZV0gLSBXaGV0aGVyIHRoZSBzY3JlZW4gYmxlbmQgbW9kZSBzaG91bGQgYmUgdXNlZCBmb3IgY29tYmluaW5nIHRoZSBibG9vbSB0ZXh0dXJlIHdpdGggdGhlIHNjZW5lIGNvbG9ycy5cclxuXHQgKi9cclxuXHJcblx0Y29uc3RydWN0b3Iob3B0aW9ucyA9IHt9KSB7XHJcblxyXG5cdFx0c3VwZXIoXCJCbG9vbVBhc3NcIik7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHJlbmRlciB0YXJnZXQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1dlYkdMUmVuZGVyVGFyZ2V0fVxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMucmVuZGVyVGFyZ2V0ID0gbmV3IFdlYkdMUmVuZGVyVGFyZ2V0KDEsIDEsIHtcclxuXHRcdFx0bWluRmlsdGVyOiBMaW5lYXJGaWx0ZXIsXHJcblx0XHRcdG1hZ0ZpbHRlcjogTGluZWFyRmlsdGVyLFxyXG5cdFx0XHRzdGVuY2lsQnVmZmVyOiBmYWxzZSxcclxuXHRcdFx0ZGVwdGhCdWZmZXI6IGZhbHNlXHJcblx0XHR9KTtcclxuXHJcblx0XHR0aGlzLnJlbmRlclRhcmdldC50ZXh0dXJlLm5hbWUgPSBcIkJsb29tLlRhcmdldFwiO1xyXG5cdFx0dGhpcy5yZW5kZXJUYXJnZXQudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgYmx1ciBwYXNzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtCbHVyUGFzc31cclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKi9cclxuXHJcblx0XHR0aGlzLmJsdXJQYXNzID0gbmV3IEJsdXJQYXNzKG9wdGlvbnMpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBjb21iaW5lIHNoYWRlciBtYXRlcmlhbC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Q29tYmluZU1hdGVyaWFsfVxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMuY29tYmluZU1hdGVyaWFsID0gbmV3IENvbWJpbmVNYXRlcmlhbCgob3B0aW9ucy5zY3JlZW5Nb2RlICE9PSB1bmRlZmluZWQpID8gb3B0aW9ucy5zY3JlZW5Nb2RlIDogdHJ1ZSk7XHJcblxyXG5cdFx0dGhpcy5pbnRlbnNpdHkgPSBvcHRpb25zLmludGVuc2l0eTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgbHVtaW5vc2l0eSBzaGFkZXIgbWF0ZXJpYWwuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0x1bWlub3NpdHlNYXRlcmlhbH1cclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKi9cclxuXHJcblx0XHR0aGlzLmx1bWlub3NpdHlNYXRlcmlhbCA9IG5ldyBMdW1pbm9zaXR5TWF0ZXJpYWwodHJ1ZSk7XHJcblxyXG5cdFx0dGhpcy5kaXN0aW5jdGlvbiA9IG9wdGlvbnMuZGlzdGluY3Rpb247XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIHJlc29sdXRpb24gc2NhbGUuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7TnVtYmVyfVxyXG5cdCAqL1xyXG5cclxuXHRnZXQgcmVzb2x1dGlvblNjYWxlKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmJsdXJQYXNzLnJlc29sdXRpb25TY2FsZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBZb3UgbmVlZCB0byBjYWxsIHtAbGluayBFZmZlY3RDb21wb3NlciNzZXRTaXplfSBhZnRlciBjaGFuZ2luZyB0aGlzIHZhbHVlLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge051bWJlcn1cclxuXHQgKi9cclxuXHJcblx0c2V0IHJlc29sdXRpb25TY2FsZSh2YWx1ZSA9IDAuNSkge1xyXG5cclxuXHRcdHRoaXMuYmx1clBhc3MucmVzb2x1dGlvblNjYWxlID0gdmFsdWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIGJsdXIga2VybmVsIHNpemUuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7S2VybmVsU2l6ZX1cclxuXHQgKi9cclxuXHJcblx0Z2V0IGtlcm5lbFNpemUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuYmx1clBhc3Mua2VybmVsU2l6ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBAdHlwZSB7S2VybmVsU2l6ZX1cclxuXHQgKi9cclxuXHJcblx0c2V0IGtlcm5lbFNpemUodmFsdWUgPSBLZXJuZWxTaXplLkxBUkdFKSB7XHJcblxyXG5cdFx0dGhpcy5ibHVyUGFzcy5rZXJuZWxTaXplID0gdmFsdWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIG92ZXJhbGwgaW50ZW5zaXR5IG9mIHRoZSBlZmZlY3QuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7TnVtYmVyfVxyXG5cdCAqL1xyXG5cclxuXHRnZXQgaW50ZW5zaXR5KCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmNvbWJpbmVNYXRlcmlhbC51bmlmb3Jtcy5vcGFjaXR5Mi52YWx1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBAdHlwZSB7TnVtYmVyfVxyXG5cdCAqL1xyXG5cclxuXHRzZXQgaW50ZW5zaXR5KHZhbHVlID0gMS4wKSB7XHJcblxyXG5cdFx0dGhpcy5jb21iaW5lTWF0ZXJpYWwudW5pZm9ybXMub3BhY2l0eTIudmFsdWUgPSB2YWx1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgbHVtaW5hbmNlIGRpc3RpbmN0aW9uIGZhY3Rvci5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtOdW1iZXJ9XHJcblx0ICovXHJcblxyXG5cdGdldCBkaXN0aW5jdGlvbigpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5sdW1pbm9zaXR5TWF0ZXJpYWwudW5pZm9ybXMuZGlzdGluY3Rpb24udmFsdWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQHR5cGUge051bWJlcn1cclxuXHQgKi9cclxuXHJcblx0c2V0IGRpc3RpbmN0aW9uKHZhbHVlID0gMS4wKSB7XHJcblxyXG5cdFx0dGhpcy5sdW1pbm9zaXR5TWF0ZXJpYWwudW5pZm9ybXMuZGlzdGluY3Rpb24udmFsdWUgPSB2YWx1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBJbmRpY2F0ZXMgd2hldGhlciBkaXRoZXJpbmcgaXMgZW5hYmxlZC5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtCb29sZWFufVxyXG5cdCAqL1xyXG5cclxuXHRnZXQgZGl0aGVyaW5nKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmJsdXJQYXNzLmRpdGhlcmluZztcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBJZiBlbmFibGVkLCB0aGUgcmVzdWx0IHdpbGwgYmUgZGl0aGVyZWQgdG8gcmVtb3ZlIGJhbmRpbmcgYXJ0aWZhY3RzLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge0Jvb2xlYW59XHJcblx0ICovXHJcblxyXG5cdHNldCBkaXRoZXJpbmcodmFsdWUpIHtcclxuXHJcblx0XHR0aGlzLmJsdXJQYXNzLmRpdGhlcmluZyA9IHZhbHVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBlZmZlY3Qgc2hvdWxkIGJlIGFwcGxpZWQgdG8gdGhlIGlucHV0IGJ1ZmZlci5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtCb29sZWFufVxyXG5cdCAqL1xyXG5cclxuXHRnZXQgYmxlbmQoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMubmVlZHNTd2FwO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIElmIGRpc2FibGVkLCB0aGUgaW5wdXQgYnVmZmVyIHdpbGwgcmVtYWluIHVuYWZmZWN0ZWQuXHJcblx0ICpcclxuXHQgKiBZb3UgbWF5IHVzZSB0aGUge0BsaW5rIEJsb29tUGFzcyNvdmVybGF5fSB0ZXh0dXJlIHRvIGFwcGx5IHRoZSBlZmZlY3QgdG9cclxuXHQgKiB5b3VyIHNjZW5lLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge0Jvb2xlYW59XHJcblx0ICovXHJcblxyXG5cdHNldCBibGVuZCh2YWx1ZSkge1xyXG5cclxuXHRcdHRoaXMubmVlZHNTd2FwID0gdmFsdWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIGVmZmVjdCBvdmVybGF5IHRleHR1cmUuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7VGV4dHVyZX1cclxuXHQgKi9cclxuXHJcblx0Z2V0IG92ZXJsYXkoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMucmVuZGVyVGFyZ2V0LnRleHR1cmU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVuZGVycyB0aGUgZWZmZWN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtXZWJHTFJlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlci5cclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyVGFyZ2V0fSBpbnB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgY29udGFpbnMgdGhlIHJlc3VsdCBvZiB0aGUgcHJldmlvdXMgcGFzcy5cclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyVGFyZ2V0fSBvdXRwdXRCdWZmZXIgLSBBIGZyYW1lIGJ1ZmZlciB0aGF0IHNlcnZlcyBhcyB0aGUgb3V0cHV0IHJlbmRlciB0YXJnZXQgdW5sZXNzIHRoaXMgcGFzcyByZW5kZXJzIHRvIHNjcmVlbi5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW2RlbHRhXSAtIFRoZSB0aW1lIGJldHdlZW4gdGhlIGxhc3QgZnJhbWUgYW5kIHRoZSBjdXJyZW50IG9uZSBpbiBzZWNvbmRzLlxyXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gW3N0ZW5jaWxUZXN0XSAtIEluZGljYXRlcyB3aGV0aGVyIGEgc3RlbmNpbCBtYXNrIGlzIGFjdGl2ZS5cclxuXHQgKi9cclxuXHJcblx0cmVuZGVyKHJlbmRlcmVyLCBpbnB1dEJ1ZmZlciwgb3V0cHV0QnVmZmVyLCBkZWx0YSwgc3RlbmNpbFRlc3QpIHtcclxuXHJcblx0XHRjb25zdCBzY2VuZSA9IHRoaXMuc2NlbmU7XHJcblx0XHRjb25zdCBjYW1lcmEgPSB0aGlzLmNhbWVyYTtcclxuXHRcdGNvbnN0IGJsdXJQYXNzID0gdGhpcy5ibHVyUGFzcztcclxuXHJcblx0XHRjb25zdCBsdW1pbm9zaXR5TWF0ZXJpYWwgPSB0aGlzLmx1bWlub3NpdHlNYXRlcmlhbDtcclxuXHRcdGNvbnN0IGNvbWJpbmVNYXRlcmlhbCA9IHRoaXMuY29tYmluZU1hdGVyaWFsO1xyXG5cdFx0Y29uc3QgcmVuZGVyVGFyZ2V0ID0gdGhpcy5yZW5kZXJUYXJnZXQ7XHJcblxyXG5cdFx0Ly8gTHVtaW5hbmNlIGZpbHRlci5cclxuXHRcdHRoaXMubWF0ZXJpYWwgPSBsdW1pbm9zaXR5TWF0ZXJpYWw7XHJcblx0XHRsdW1pbm9zaXR5TWF0ZXJpYWwudW5pZm9ybXMudERpZmZ1c2UudmFsdWUgPSBpbnB1dEJ1ZmZlci50ZXh0dXJlO1xyXG5cdFx0cmVuZGVyZXIucmVuZGVyKHNjZW5lLCBjYW1lcmEsIHJlbmRlclRhcmdldCk7XHJcblxyXG5cdFx0Ly8gQ29udm9sdXRpb24gcGhhc2UuXHJcblx0XHRibHVyUGFzcy5yZW5kZXIocmVuZGVyZXIsIHJlbmRlclRhcmdldCwgcmVuZGVyVGFyZ2V0KTtcclxuXHJcblx0XHRpZih0aGlzLmJsZW5kKSB7XHJcblxyXG5cdFx0XHQvLyBSZW5kZXIgdGhlIG9yaWdpbmFsIHNjZW5lIHdpdGggc3VwZXJpbXBvc2VkIGJsdXIuXHJcblx0XHRcdHRoaXMubWF0ZXJpYWwgPSBjb21iaW5lTWF0ZXJpYWw7XHJcblx0XHRcdGNvbWJpbmVNYXRlcmlhbC51bmlmb3Jtcy50ZXh0dXJlMS52YWx1ZSA9IGlucHV0QnVmZmVyLnRleHR1cmU7XHJcblx0XHRcdGNvbWJpbmVNYXRlcmlhbC51bmlmb3Jtcy50ZXh0dXJlMi52YWx1ZSA9IHJlbmRlclRhcmdldC50ZXh0dXJlO1xyXG5cclxuXHRcdFx0cmVuZGVyZXIucmVuZGVyKHNjZW5lLCBjYW1lcmEsIHRoaXMucmVuZGVyVG9TY3JlZW4gPyBudWxsIDogb3V0cHV0QnVmZmVyKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBkYXRlcyB0aGUgc2l6ZSBvZiB0aGlzIHBhc3MuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge051bWJlcn0gd2lkdGggLSBUaGUgd2lkdGguXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IGhlaWdodCAtIFRoZSBoZWlnaHQuXHJcblx0ICovXHJcblxyXG5cdHNldFNpemUod2lkdGgsIGhlaWdodCkge1xyXG5cclxuXHRcdHRoaXMuYmx1clBhc3Muc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KTtcclxuXHJcblx0XHR3aWR0aCA9IHRoaXMuYmx1clBhc3Mud2lkdGg7XHJcblx0XHRoZWlnaHQgPSB0aGlzLmJsdXJQYXNzLmhlaWdodDtcclxuXHJcblx0XHR0aGlzLnJlbmRlclRhcmdldC5zZXRTaXplKHdpZHRoLCBoZWlnaHQpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFBlcmZvcm1zIGluaXRpYWxpemF0aW9uIHRhc2tzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtXZWJHTFJlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlci5cclxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IGFscGhhIC0gV2hldGhlciB0aGUgcmVuZGVyZXIgdXNlcyB0aGUgYWxwaGEgY2hhbm5lbCBvciBub3QuXHJcblx0ICovXHJcblxyXG5cdGluaXRpYWxpemUocmVuZGVyZXIsIGFscGhhKSB7XHJcblxyXG5cdFx0dGhpcy5ibHVyUGFzcy5pbml0aWFsaXplKHJlbmRlcmVyLCBhbHBoYSk7XHJcblxyXG5cdFx0aWYoIWFscGhhKSB7XHJcblxyXG5cdFx0XHR0aGlzLnJlbmRlclRhcmdldC50ZXh0dXJlLmZvcm1hdCA9IFJHQkZvcm1hdDtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcbn1cclxuIiwiaW1wb3J0IHsgQm9rZWhNYXRlcmlhbCB9IGZyb20gXCIuLi9tYXRlcmlhbHNcIjtcclxuaW1wb3J0IHsgUGFzcyB9IGZyb20gXCIuL1Bhc3MuanNcIjtcclxuXHJcbi8qKlxyXG4gKiBBIERlcHRoIG9mIEZpZWxkIChEb0YpIHBhc3MgdXNpbmcgYSBib2tlaCBzaGFkZXIuXHJcbiAqXHJcbiAqIFRoaXMgcGFzcyByZXF1aXJlcyBhIHtAbGluayBFZmZlY3RDb21wb3NlciNkZXB0aFRleHR1cmV9LlxyXG4gKi9cclxuXHJcbmV4cG9ydCBjbGFzcyBCb2tlaFBhc3MgZXh0ZW5kcyBQYXNzIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBib2tlaCBwYXNzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtQZXJzcGVjdGl2ZUNhbWVyYX0gY2FtZXJhIC0gVGhlIG1haW4gY2FtZXJhLiBVc2VkIHRvIG9idGFpbiB0aGUgYXNwZWN0IHJhdGlvIGFuZCB0aGUgbmVhciBhbmQgZmFyIHBsYW5lIHNldHRpbmdzLlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gLSBBZGRpdGlvbmFsIHBhcmFtZXRlcnMuIFNlZSB7QGxpbmsgQm9rZWhNYXRlcmlhbH0gZm9yIGRldGFpbHMuXHJcblx0ICovXHJcblxyXG5cdGNvbnN0cnVjdG9yKGNhbWVyYSwgb3B0aW9ucyA9IHt9KSB7XHJcblxyXG5cdFx0c3VwZXIoXCJCb2tlaFBhc3NcIik7XHJcblxyXG5cdFx0dGhpcy5tYXRlcmlhbCA9IG5ldyBCb2tlaE1hdGVyaWFsKGNhbWVyYSwgb3B0aW9ucyk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVuZGVycyB0aGUgZWZmZWN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtXZWJHTFJlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlci5cclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyVGFyZ2V0fSBpbnB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgY29udGFpbnMgdGhlIHJlc3VsdCBvZiB0aGUgcHJldmlvdXMgcGFzcy5cclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyVGFyZ2V0fSBvdXRwdXRCdWZmZXIgLSBBIGZyYW1lIGJ1ZmZlciB0aGF0IHNlcnZlcyBhcyB0aGUgb3V0cHV0IHJlbmRlciB0YXJnZXQgdW5sZXNzIHRoaXMgcGFzcyByZW5kZXJzIHRvIHNjcmVlbi5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW2RlbHRhXSAtIFRoZSB0aW1lIGJldHdlZW4gdGhlIGxhc3QgZnJhbWUgYW5kIHRoZSBjdXJyZW50IG9uZSBpbiBzZWNvbmRzLlxyXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gW3N0ZW5jaWxUZXN0XSAtIEluZGljYXRlcyB3aGV0aGVyIGEgc3RlbmNpbCBtYXNrIGlzIGFjdGl2ZS5cclxuXHQgKi9cclxuXHJcblx0cmVuZGVyKHJlbmRlcmVyLCBpbnB1dEJ1ZmZlciwgb3V0cHV0QnVmZmVyLCBkZWx0YSwgc3RlbmNpbFRlc3QpIHtcclxuXHJcblx0XHR0aGlzLm1hdGVyaWFsLnVuaWZvcm1zLnREaWZmdXNlLnZhbHVlID0gaW5wdXRCdWZmZXIudGV4dHVyZTtcclxuXHRcdHRoaXMubWF0ZXJpYWwudW5pZm9ybXMudERlcHRoLnZhbHVlID0gaW5wdXRCdWZmZXIuZGVwdGhUZXh0dXJlO1xyXG5cclxuXHRcdHJlbmRlcmVyLnJlbmRlcih0aGlzLnNjZW5lLCB0aGlzLmNhbWVyYSwgdGhpcy5yZW5kZXJUb1NjcmVlbiA/IG51bGwgOiBvdXRwdXRCdWZmZXIpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVwZGF0ZXMgdGhlIHNpemUgb2YgdGhpcyBwYXNzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0LlxyXG5cdCAqL1xyXG5cclxuXHRzZXRTaXplKHdpZHRoLCBoZWlnaHQpIHtcclxuXHJcblx0XHR0aGlzLm1hdGVyaWFsLnVuaWZvcm1zLmFzcGVjdC52YWx1ZSA9IHdpZHRoIC8gaGVpZ2h0O1xyXG5cclxuXHR9XHJcblxyXG59XHJcbiIsImltcG9ydCB7IFBhc3MgfSBmcm9tIFwiLi9QYXNzLmpzXCI7XHJcblxyXG4vKipcclxuICogQSBwYXNzIHRoYXQgZGlzYWJsZXMgdGhlIHN0ZW5jaWwgdGVzdC5cclxuICovXHJcblxyXG5leHBvcnQgY2xhc3MgQ2xlYXJNYXNrUGFzcyBleHRlbmRzIFBhc3Mge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGNsZWFyIG1hc2sgcGFzcy5cclxuXHQgKi9cclxuXHJcblx0Y29uc3RydWN0b3IoKSB7XHJcblxyXG5cdFx0c3VwZXIoXCJDbGVhck1hc2tQYXNzXCIsIG51bGwsIG51bGwsIG51bGwpO1xyXG5cclxuXHRcdHRoaXMubmVlZHNTd2FwID0gZmFsc2U7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGlzYWJsZXMgdGhlIGdsb2JhbCBzdGVuY2lsIHRlc3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IGlucHV0QnVmZmVyIC0gQSBmcmFtZSBidWZmZXIgdGhhdCBjb250YWlucyB0aGUgcmVzdWx0IG9mIHRoZSBwcmV2aW91cyBwYXNzLlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IG91dHB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgc2VydmVzIGFzIHRoZSBvdXRwdXQgcmVuZGVyIHRhcmdldCB1bmxlc3MgdGhpcyBwYXNzIHJlbmRlcnMgdG8gc2NyZWVuLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbZGVsdGFdIC0gVGhlIHRpbWUgYmV0d2VlbiB0aGUgbGFzdCBmcmFtZSBhbmQgdGhlIGN1cnJlbnQgb25lIGluIHNlY29uZHMuXHJcblx0ICogQHBhcmFtIHtCb29sZWFufSBbc3RlbmNpbFRlc3RdIC0gSW5kaWNhdGVzIHdoZXRoZXIgYSBzdGVuY2lsIG1hc2sgaXMgYWN0aXZlLlxyXG5cdCAqL1xyXG5cclxuXHRyZW5kZXIocmVuZGVyZXIsIGlucHV0QnVmZmVyLCBvdXRwdXRCdWZmZXIsIGRlbHRhLCBzdGVuY2lsVGVzdCkge1xyXG5cclxuXHRcdHJlbmRlcmVyLnN0YXRlLmJ1ZmZlcnMuc3RlbmNpbC5zZXRUZXN0KGZhbHNlKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG4iLCJpbXBvcnQgeyBDb2xvciB9IGZyb20gXCJ0aHJlZVwiO1xyXG5pbXBvcnQgeyBQYXNzIH0gZnJvbSBcIi4vUGFzcy5qc1wiO1xyXG5cclxuLyoqXHJcbiAqIFVzZWQgZm9yIHNhdmluZyB0aGUgb3JpZ2luYWwgY2xlYXIgY29sb3Igb2YgdGhlIHJlbmRlcmVyLlxyXG4gKlxyXG4gKiBAdHlwZSB7Q29sb3J9XHJcbiAqIEBwcml2YXRlXHJcbiAqL1xyXG5cclxuY29uc3QgY29sb3IgPSBuZXcgQ29sb3IoKTtcclxuXHJcbi8qKlxyXG4gKiBBIHBhc3MgdGhhdCBjbGVhcnMgdGhlIGlucHV0IGJ1ZmZlciBvciB0aGUgc2NyZWVuLlxyXG4gKlxyXG4gKiBZb3UgY2FuIHByZXZlbnQgc3BlY2lmaWMgYml0cyBmcm9tIGJlaW5nIGNsZWFyZWQgYnkgc2V0dGluZyBlaXRoZXIgdGhlXHJcbiAqIGF1dG9DbGVhckNvbG9yLCBhdXRvQ2xlYXJTdGVuY2lsIG9yIGF1dG9DbGVhckRlcHRoIHByb3BlcnRpZXMgb2YgdGhlIHJlbmRlcmVyXHJcbiAqIHRvIGZhbHNlLlxyXG4gKi9cclxuXHJcbmV4cG9ydCBjbGFzcyBDbGVhclBhc3MgZXh0ZW5kcyBQYXNzIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBjbGVhciBwYXNzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIEFkZGl0aW9uYWwgb3B0aW9ucy5cclxuXHQgKiBAcGFyYW0ge0NvbG9yfSBbb3B0aW9ucy5jbGVhckNvbG9yPW51bGxdIC0gQW4gb3ZlcnJpZGUgY2xlYXIgY29sb3IuXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmNsZWFyQWxwaGE9MC4wXSAtIEFuIG92ZXJyaWRlIGNsZWFyIGFscGhhLlxyXG5cdCAqL1xyXG5cclxuXHRjb25zdHJ1Y3RvcihvcHRpb25zID0ge30pIHtcclxuXHJcblx0XHRzdXBlcihcIkNsZWFyUGFzc1wiLCBudWxsLCBudWxsLCBudWxsKTtcclxuXHJcblx0XHR0aGlzLm5lZWRzU3dhcCA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGNsZWFyIGNvbG9yLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtDb2xvcn1cclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMuY2xlYXJDb2xvciA9IChvcHRpb25zLmNsZWFyQ29sb3IgIT09IHVuZGVmaW5lZCkgPyBvcHRpb25zLmNsZWFyQ29sb3IgOiBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGNsZWFyIGFscGhhLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtOdW1iZXJ9XHJcblx0XHQgKi9cclxuXHJcblx0XHR0aGlzLmNsZWFyQWxwaGEgPSAob3B0aW9ucy5jbGVhckFscGhhICE9PSB1bmRlZmluZWQpID8gb3B0aW9ucy5jbGVhckFscGhhIDogMC4wO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENsZWFycyB0aGUgaW5wdXQgYnVmZmVyIG9yIHRoZSBzY3JlZW4uXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IGlucHV0QnVmZmVyIC0gQSBmcmFtZSBidWZmZXIgdGhhdCBjb250YWlucyB0aGUgcmVzdWx0IG9mIHRoZSBwcmV2aW91cyBwYXNzLlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IG91dHB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgc2VydmVzIGFzIHRoZSBvdXRwdXQgcmVuZGVyIHRhcmdldCB1bmxlc3MgdGhpcyBwYXNzIHJlbmRlcnMgdG8gc2NyZWVuLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbZGVsdGFdIC0gVGhlIHRpbWUgYmV0d2VlbiB0aGUgbGFzdCBmcmFtZSBhbmQgdGhlIGN1cnJlbnQgb25lIGluIHNlY29uZHMuXHJcblx0ICogQHBhcmFtIHtCb29sZWFufSBbc3RlbmNpbFRlc3RdIC0gSW5kaWNhdGVzIHdoZXRoZXIgYSBzdGVuY2lsIG1hc2sgaXMgYWN0aXZlLlxyXG5cdCAqL1xyXG5cclxuXHRyZW5kZXIocmVuZGVyZXIsIGlucHV0QnVmZmVyLCBvdXRwdXRCdWZmZXIsIGRlbHRhLCBzdGVuY2lsVGVzdCkge1xyXG5cclxuXHRcdGNvbnN0IGNsZWFyQ29sb3IgPSB0aGlzLmNsZWFyQ29sb3I7XHJcblxyXG5cdFx0bGV0IGNsZWFyQWxwaGE7XHJcblxyXG5cdFx0aWYoY2xlYXJDb2xvciAhPT0gbnVsbCkge1xyXG5cclxuXHRcdFx0Y29sb3IuY29weShyZW5kZXJlci5nZXRDbGVhckNvbG9yKCkpO1xyXG5cdFx0XHRjbGVhckFscGhhID0gcmVuZGVyZXIuZ2V0Q2xlYXJBbHBoYSgpO1xyXG5cdFx0XHRyZW5kZXJlci5zZXRDbGVhckNvbG9yKGNsZWFyQ29sb3IsIHRoaXMuY2xlYXJBbHBoYSk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJlbmRlcmVyLnNldFJlbmRlclRhcmdldCh0aGlzLnJlbmRlclRvU2NyZWVuID8gbnVsbCA6IGlucHV0QnVmZmVyKTtcclxuXHRcdHJlbmRlcmVyLmNsZWFyKCk7XHJcblxyXG5cdFx0aWYoY2xlYXJDb2xvciAhPT0gbnVsbCkge1xyXG5cclxuXHRcdFx0cmVuZGVyZXIuc2V0Q2xlYXJDb2xvcihjb2xvciwgY2xlYXJBbHBoYSk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG59XHJcbiIsImltcG9ydCB7IERvdFNjcmVlbk1hdGVyaWFsIH0gZnJvbSBcIi4uL21hdGVyaWFsc1wiO1xyXG5pbXBvcnQgeyBQYXNzIH0gZnJvbSBcIi4vUGFzcy5qc1wiO1xyXG5cclxuLyoqXHJcbiAqIEEgZG90IHNjcmVlbiBwYXNzLlxyXG4gKi9cclxuXHJcbmV4cG9ydCBjbGFzcyBEb3RTY3JlZW5QYXNzIGV4dGVuZHMgUGFzcyB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgZG90IHNjcmVlbiBwYXNzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIFRoZSBvcHRpb25zLlxyXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuYXZlcmFnZT1mYWxzZV0gLSBXaGV0aGVyIHRoZSBzaGFkZXIgc2hvdWxkIG91dHB1dCBhIGNvbG91ciBhdmVyYWdlIChibGFjayBhbmQgd2hpdGUpLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5hbmdsZT0xLjU3XSAtIFRoZSBhbmdsZSBvZiB0aGUgcGF0dGVybi5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuc2NhbGU9MS4wXSAtIFRoZSBzY2FsZSBvZiB0aGUgb3ZlcmFsbCBlZmZlY3QuXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmludGVuc2l0eT0xLjBdIC0gVGhlIGludGVuc2l0eSBvZiB0aGUgZWZmZWN0LlxyXG5cdCAqL1xyXG5cclxuXHRjb25zdHJ1Y3RvcihvcHRpb25zID0ge30pIHtcclxuXHJcblx0XHRzdXBlcihcIkRvdFNjcmVlblBhc3NcIik7XHJcblxyXG5cdFx0dGhpcy5tYXRlcmlhbCA9IG5ldyBEb3RTY3JlZW5NYXRlcmlhbChvcHRpb25zKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZW5kZXJzIHRoZSBlZmZlY3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IGlucHV0QnVmZmVyIC0gQSBmcmFtZSBidWZmZXIgdGhhdCBjb250YWlucyB0aGUgcmVzdWx0IG9mIHRoZSBwcmV2aW91cyBwYXNzLlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IG91dHB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgc2VydmVzIGFzIHRoZSBvdXRwdXQgcmVuZGVyIHRhcmdldCB1bmxlc3MgdGhpcyBwYXNzIHJlbmRlcnMgdG8gc2NyZWVuLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbZGVsdGFdIC0gVGhlIHRpbWUgYmV0d2VlbiB0aGUgbGFzdCBmcmFtZSBhbmQgdGhlIGN1cnJlbnQgb25lIGluIHNlY29uZHMuXHJcblx0ICogQHBhcmFtIHtCb29sZWFufSBbc3RlbmNpbFRlc3RdIC0gSW5kaWNhdGVzIHdoZXRoZXIgYSBzdGVuY2lsIG1hc2sgaXMgYWN0aXZlLlxyXG5cdCAqL1xyXG5cclxuXHRyZW5kZXIocmVuZGVyZXIsIGlucHV0QnVmZmVyLCBvdXRwdXRCdWZmZXIsIGRlbHRhLCBzdGVuY2lsVGVzdCkge1xyXG5cclxuXHRcdHRoaXMubWF0ZXJpYWwudW5pZm9ybXMudERpZmZ1c2UudmFsdWUgPSBpbnB1dEJ1ZmZlci50ZXh0dXJlO1xyXG5cclxuXHRcdHJlbmRlcmVyLnJlbmRlcih0aGlzLnNjZW5lLCB0aGlzLmNhbWVyYSwgdGhpcy5yZW5kZXJUb1NjcmVlbiA/IG51bGwgOiBvdXRwdXRCdWZmZXIpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVwZGF0ZXMgdGhlIHNpemUgb2YgdGhpcyBwYXNzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0LlxyXG5cdCAqL1xyXG5cclxuXHRzZXRTaXplKHdpZHRoLCBoZWlnaHQpIHtcclxuXHJcblx0XHR3aWR0aCA9IE1hdGgubWF4KDEsIHdpZHRoKTtcclxuXHRcdGhlaWdodCA9IE1hdGgubWF4KDEsIGhlaWdodCk7XHJcblxyXG5cdFx0dGhpcy5tYXRlcmlhbC51bmlmb3Jtcy5vZmZzZXRSZXBlYXQudmFsdWUueiA9IHdpZHRoO1xyXG5cdFx0dGhpcy5tYXRlcmlhbC51bmlmb3Jtcy5vZmZzZXRSZXBlYXQudmFsdWUudyA9IGhlaWdodDtcclxuXHJcblx0fVxyXG5cclxufVxyXG4iLCJpbXBvcnQgeyBGaWxtTWF0ZXJpYWwgfSBmcm9tIFwiLi4vbWF0ZXJpYWxzXCI7XHJcbmltcG9ydCB7IFBhc3MgfSBmcm9tIFwiLi9QYXNzLmpzXCI7XHJcblxyXG4vKipcclxuICogQSBmaWxtIHBhc3MuXHJcbiAqXHJcbiAqIFByb3ZpZGVzIHZhcmlvdXMgY2luZW1hdGljIGVmZmVjdHMuXHJcbiAqL1xyXG5cclxuZXhwb3J0IGNsYXNzIEZpbG1QYXNzIGV4dGVuZHMgUGFzcyB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgZmlsbSBwYXNzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIFRoZSBvcHRpb25zLiBTZWUge0BsaW5rIEZpbG1NYXRlcmlhbH0gZm9yIG1vcmUgb3B0aW9ucy5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuc2NhbmxpbmVEZW5zaXR5PTEuMjVdIC0gVGhlIHNjYW5saW5lIGRlbnNpdHksIHJlbGF0aXZlIHRvIHRoZSBzY3JlZW4gaGVpZ2h0LlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5ncmlkU2NhbGU9MS4wXSAtIFRoZSBncmlkIHNjYWxlLCByZWxhdGl2ZSB0byB0aGUgc2NyZWVuIGhlaWdodC5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuZ3JpZExpbmVXaWR0aD0wLjBdIC0gVGhlIGdyaWQgbGluZSB3aWR0aC4gVGhpcyB2YWx1ZSB3aWxsIGJlIGFkZGVkIHRvIHRoZSBiYXNlIGxpbmUgd2lkdGguXHJcblx0ICovXHJcblxyXG5cdGNvbnN0cnVjdG9yKG9wdGlvbnMgPSB7fSkge1xyXG5cclxuXHRcdHN1cGVyKFwiRmlsbVBhc3NcIik7XHJcblxyXG5cdFx0dGhpcy5tYXRlcmlhbCA9IG5ldyBGaWxtTWF0ZXJpYWwob3B0aW9ucyk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgYW1vdW50IG9mIHNjYW5saW5lcywgcmVsYXRpdmUgdG8gdGhlIHNjcmVlbiBoZWlnaHQuXHJcblx0XHQgKlxyXG5cdFx0ICogWW91IG5lZWQgdG8gY2FsbCB7QGxpbmsgRWZmZWN0Q29tcG9zZXIjc2V0U2l6ZX0gYWZ0ZXIgY2hhbmdpbmcgdGhpc1xyXG5cdFx0ICogdmFsdWUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge051bWJlcn1cclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMuc2NhbmxpbmVEZW5zaXR5ID0gKG9wdGlvbnMuc2NhbmxpbmVEZW5zaXR5ID09PSB1bmRlZmluZWQpID8gMS4yNSA6IG9wdGlvbnMuc2NhbmxpbmVEZW5zaXR5O1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGdyaWQgc2NhbGUsIHJlbGF0aXZlIHRvIHRoZSBzY3JlZW4gaGVpZ2h0LlxyXG5cdFx0ICpcclxuXHRcdCAqIFlvdSBuZWVkIHRvIGNhbGwge0BsaW5rIEVmZmVjdENvbXBvc2VyI3NldFNpemV9IGFmdGVyIGNoYW5naW5nIHRoaXNcclxuXHRcdCAqIHZhbHVlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtOdW1iZXJ9XHJcblx0XHQgKi9cclxuXHJcblx0XHR0aGlzLmdyaWRTY2FsZSA9IChvcHRpb25zLmdyaWRTY2FsZSA9PT0gdW5kZWZpbmVkKSA/IDEuMCA6IE1hdGgubWF4KG9wdGlvbnMuZ3JpZFNjYWxlLCAxZS02KTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBncmlkIGxpbmUgd2lkdGguXHJcblx0XHQgKlxyXG5cdFx0ICogWW91IG5lZWQgdG8gY2FsbCB7QGxpbmsgRWZmZWN0Q29tcG9zZXIjc2V0U2l6ZX0gYWZ0ZXIgY2hhbmdpbmcgdGhpc1xyXG5cdFx0ICogdmFsdWUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge051bWJlcn1cclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMuZ3JpZExpbmVXaWR0aCA9IChvcHRpb25zLmdyaWRMaW5lV2lkdGggPT09IHVuZGVmaW5lZCkgPyAwLjAgOiBNYXRoLm1heChvcHRpb25zLmdyaWRMaW5lV2lkdGgsIDAuMCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVuZGVycyB0aGUgZWZmZWN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtXZWJHTFJlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlci5cclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyVGFyZ2V0fSBpbnB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgY29udGFpbnMgdGhlIHJlc3VsdCBvZiB0aGUgcHJldmlvdXMgcGFzcy5cclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyVGFyZ2V0fSBvdXRwdXRCdWZmZXIgLSBBIGZyYW1lIGJ1ZmZlciB0aGF0IHNlcnZlcyBhcyB0aGUgb3V0cHV0IHJlbmRlciB0YXJnZXQgdW5sZXNzIHRoaXMgcGFzcyByZW5kZXJzIHRvIHNjcmVlbi5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW2RlbHRhXSAtIFRoZSB0aW1lIGJldHdlZW4gdGhlIGxhc3QgZnJhbWUgYW5kIHRoZSBjdXJyZW50IG9uZSBpbiBzZWNvbmRzLlxyXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gW3N0ZW5jaWxUZXN0XSAtIEluZGljYXRlcyB3aGV0aGVyIGEgc3RlbmNpbCBtYXNrIGlzIGFjdGl2ZS5cclxuXHQgKi9cclxuXHJcblx0cmVuZGVyKHJlbmRlcmVyLCBpbnB1dEJ1ZmZlciwgb3V0cHV0QnVmZmVyLCBkZWx0YSwgc3RlbmNpbFRlc3QpIHtcclxuXHJcblx0XHR0aGlzLm1hdGVyaWFsLnVuaWZvcm1zLnREaWZmdXNlLnZhbHVlID0gaW5wdXRCdWZmZXIudGV4dHVyZTtcclxuXHRcdHRoaXMubWF0ZXJpYWwudW5pZm9ybXMudGltZS52YWx1ZSArPSBkZWx0YTtcclxuXHJcblx0XHRyZW5kZXJlci5yZW5kZXIodGhpcy5zY2VuZSwgdGhpcy5jYW1lcmEsIHRoaXMucmVuZGVyVG9TY3JlZW4gPyBudWxsIDogb3V0cHV0QnVmZmVyKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBVcGRhdGVzIHRoZSBzaXplIG9mIHRoaXMgcGFzcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSB3aWR0aCAtIFRoZSB3aWR0aC5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gaGVpZ2h0IC0gVGhlIGhlaWdodC5cclxuXHQgKi9cclxuXHJcblx0c2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KSB7XHJcblxyXG5cdFx0Y29uc3QgYXNwZWN0ID0gd2lkdGggLyBoZWlnaHQ7XHJcblx0XHRjb25zdCBncmlkU2NhbGUgPSB0aGlzLmdyaWRTY2FsZSAqIChoZWlnaHQgKiAwLjEyNSk7XHJcblxyXG5cdFx0dGhpcy5tYXRlcmlhbC51bmlmb3Jtcy5zY2FubGluZUNvdW50LnZhbHVlID0gTWF0aC5yb3VuZChoZWlnaHQgKiB0aGlzLnNjYW5saW5lRGVuc2l0eSk7XHJcblx0XHR0aGlzLm1hdGVyaWFsLnVuaWZvcm1zLmdyaWRTY2FsZS52YWx1ZS5zZXQoYXNwZWN0ICogZ3JpZFNjYWxlLCBncmlkU2NhbGUpO1xyXG5cdFx0dGhpcy5tYXRlcmlhbC51bmlmb3Jtcy5ncmlkTGluZVdpZHRoLnZhbHVlID0gKGdyaWRTY2FsZSAvIGhlaWdodCkgKyB0aGlzLmdyaWRMaW5lV2lkdGg7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuIiwiaW1wb3J0IHsgRGF0YVRleHR1cmUsIFJHQkZvcm1hdCwgRmxvYXRUeXBlIH0gZnJvbSBcInRocmVlXCI7XHJcbmltcG9ydCB7IEdsaXRjaE1hdGVyaWFsIH0gZnJvbSBcIi4uL21hdGVyaWFsc1wiO1xyXG5pbXBvcnQgeyBQYXNzIH0gZnJvbSBcIi4vUGFzcy5qc1wiO1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgYSByYW5kb20gaW50ZWdlciBpbiB0aGUgc3BlY2lmaWVkIHJhbmdlLlxyXG4gKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbG93IC0gVGhlIGxvd2VzdCBwb3NzaWJsZSB2YWx1ZS5cclxuICogQHBhcmFtIHtOdW1iZXJ9IGhpZ2ggLSBUaGUgaGlnaGVzdCBwb3NzaWJsZSB2YWx1ZS5cclxuICogQHJldHVybiB7TnVtYmVyfSBUaGUgcmFuZG9tIHZhbHVlLlxyXG4gKi9cclxuXHJcbmZ1bmN0aW9uIHJhbmRvbUludChsb3csIGhpZ2gpIHtcclxuXHJcblx0cmV0dXJuIGxvdyArIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChoaWdoIC0gbG93ICsgMSkpO1xyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgYSByYW5kb20gZmxvYXQgaW4gdGhlIHNwZWNpZmllZCByYW5nZS5cclxuICpcclxuICogQHByaXZhdGVcclxuICogQHBhcmFtIHtOdW1iZXJ9IGxvdyAtIFRoZSBsb3dlc3QgcG9zc2libGUgdmFsdWUuXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBoaWdoIC0gVGhlIGhpZ2hlc3QgcG9zc2libGUgdmFsdWUuXHJcbiAqIEByZXR1cm4ge051bWJlcn0gVGhlIHJhbmRvbSB2YWx1ZS5cclxuICovXHJcblxyXG5mdW5jdGlvbiByYW5kb21GbG9hdChsb3csIGhpZ2gpIHtcclxuXHJcblx0cmV0dXJuIGxvdyArIE1hdGgucmFuZG9tKCkgKiAoaGlnaCAtIGxvdyk7XHJcblxyXG59XHJcblxyXG4vKipcclxuICogQSBnbGl0Y2ggcGFzcy5cclxuICovXHJcblxyXG5leHBvcnQgY2xhc3MgR2xpdGNoUGFzcyBleHRlbmRzIFBhc3Mge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGdsaXRjaCBwYXNzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIFRoZSBvcHRpb25zLlxyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZX0gW29wdGlvbnMucGVydHVyYk1hcF0gLSBBIHBlcnR1cmJhdGlvbiBtYXAuIElmIG5vbmUgaXMgcHJvdmlkZWQsIGEgbm9pc2UgdGV4dHVyZSB3aWxsIGJlIGNyZWF0ZWQuXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmR0U2l6ZT02NF0gLSBUaGUgc2l6ZSBvZiB0aGUgZ2VuZXJhdGVkIG5vaXNlIG1hcC4gV2lsbCBiZSBpZ25vcmVkIGlmIGEgcGVydHVyYmF0aW9uIG1hcCBpcyBwcm92aWRlZC5cclxuXHQgKi9cclxuXHJcblx0Y29uc3RydWN0b3Iob3B0aW9ucyA9IHt9KSB7XHJcblxyXG5cdFx0c3VwZXIoXCJHbGl0Y2hQYXNzXCIpO1xyXG5cclxuXHRcdHRoaXMubWF0ZXJpYWwgPSBuZXcgR2xpdGNoTWF0ZXJpYWwoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgcGVydHVyYmF0aW9uIG1hcC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7VGV4dHVyZX1cclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKi9cclxuXHJcblx0XHR0aGlzLnRleHR1cmUgPSBudWxsO1xyXG5cclxuXHRcdHRoaXMucGVydHVyYk1hcCA9IChvcHRpb25zLnBlcnR1cmJNYXAgIT09IHVuZGVmaW5lZCkgPyBvcHRpb25zLnBlcnR1cmJNYXAgOiB0aGlzLmdlbmVyYXRlUGVydHVyYk1hcChvcHRpb25zLmR0U2l6ZSk7XHJcblx0XHR0aGlzLnBlcnR1cmJNYXAubmFtZSA9IFwiR2xpdGNoLlBlcnR1cmJhdGlvblwiO1xyXG5cdFx0dGhpcy5wZXJ0dXJiTWFwLmdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGVmZmVjdCBtb2RlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtHbGl0Y2hNb2RlfVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy5tb2RlID0gR2xpdGNoTW9kZS5TUE9SQURJQztcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgY291bnRlciBmb3IgdGhlIGdsaXRjaCBhY3RpdmF0aW9uIGFuZCBkZWFjdGl2YXRpb24uXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge051bWJlcn1cclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKi9cclxuXHJcblx0XHR0aGlzLmNvdW50ZXIgPSAwO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSByYW5kb20gYnJlYWsgcG9pbnQgZm9yIHRoZSBzcG9yYWRpYyBnbGl0Y2ggYWN0aXZhdGlvbi5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7TnVtYmVyfVxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMuYnJlYWtQb2ludCA9IHJhbmRvbUludCgxMjAsIDI0MCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIGN1cnJlbnQgcGVydHVyYmF0aW9uIG1hcC5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtUZXh0dXJlfVxyXG5cdCAqL1xyXG5cclxuXHRnZXQgcGVydHVyYk1hcCgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy50ZXh0dXJlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFzc2lnbmluZyBhIG5ldyBwZXJ0dXJiYXRpb24gbWFwIGRvZXMgbm90IGRlc3Ryb3kgdGhlIGN1cnJlbnQgb25lIVxyXG5cdCAqXHJcblx0ICogQHR5cGUge1RleHR1cmV9XHJcblx0ICovXHJcblxyXG5cdHNldCBwZXJ0dXJiTWFwKHZhbHVlKSB7XHJcblxyXG5cdFx0dGhpcy50ZXh0dXJlID0gdmFsdWU7XHJcblx0XHR0aGlzLm1hdGVyaWFsLnVuaWZvcm1zLnRQZXJ0dXJiLnZhbHVlID0gdmFsdWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGVzdHJveXMgdGhlIGN1cnJlbnQgcGVydHVyYmF0aW9uIG1hcCBhbmQgcmVwbGFjZXMgaXQgd2l0aCBhIG5ldyBvbmUuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW3NpemU9NjRdIC0gVGhlIHRleHR1cmUgc2l6ZS5cclxuXHQgKiBAcmV0dXJuIHtEYXRhVGV4dHVyZX0gVGhlIHBlcnR1cmJhdGlvbiB0ZXh0dXJlLlxyXG5cdCAqL1xyXG5cclxuXHRnZW5lcmF0ZVBlcnR1cmJNYXAoc2l6ZSA9IDY0KSB7XHJcblxyXG5cdFx0Y29uc3QgcGl4ZWxzID0gc2l6ZSAqIHNpemU7XHJcblx0XHRjb25zdCBkYXRhID0gbmV3IEZsb2F0MzJBcnJheShwaXhlbHMgKiAzKTtcclxuXHJcblx0XHRsZXQgZHQgPSB0aGlzLnBlcnR1cmJNYXA7XHJcblx0XHRsZXQgaSwgeDtcclxuXHJcblx0XHRmb3IoaSA9IDA7IGkgPCBwaXhlbHM7ICsraSkge1xyXG5cclxuXHRcdFx0eCA9IE1hdGgucmFuZG9tKCk7XHJcblxyXG5cdFx0XHRkYXRhW2kgKiAzXSA9IHg7XHJcblx0XHRcdGRhdGFbaSAqIDMgKyAxXSA9IHg7XHJcblx0XHRcdGRhdGFbaSAqIDMgKyAyXSA9IHg7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmKGR0ICE9PSBudWxsKSB7XHJcblxyXG5cdFx0XHRkdC5kaXNwb3NlKCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdGR0ID0gbmV3IERhdGFUZXh0dXJlKGRhdGEsIHNpemUsIHNpemUsIFJHQkZvcm1hdCwgRmxvYXRUeXBlKTtcclxuXHRcdGR0Lm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0XHR0aGlzLnBlcnR1cmJNYXAgPSBkdDtcclxuXHJcblx0XHRyZXR1cm4gZHQ7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVuZGVycyB0aGUgZWZmZWN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtXZWJHTFJlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlci5cclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyVGFyZ2V0fSBpbnB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgY29udGFpbnMgdGhlIHJlc3VsdCBvZiB0aGUgcHJldmlvdXMgcGFzcy5cclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyVGFyZ2V0fSBvdXRwdXRCdWZmZXIgLSBBIGZyYW1lIGJ1ZmZlciB0aGF0IHNlcnZlcyBhcyB0aGUgb3V0cHV0IHJlbmRlciB0YXJnZXQgdW5sZXNzIHRoaXMgcGFzcyByZW5kZXJzIHRvIHNjcmVlbi5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW2RlbHRhXSAtIFRoZSB0aW1lIGJldHdlZW4gdGhlIGxhc3QgZnJhbWUgYW5kIHRoZSBjdXJyZW50IG9uZSBpbiBzZWNvbmRzLlxyXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gW3N0ZW5jaWxUZXN0XSAtIEluZGljYXRlcyB3aGV0aGVyIGEgc3RlbmNpbCBtYXNrIGlzIGFjdGl2ZS5cclxuXHQgKi9cclxuXHJcblx0cmVuZGVyKHJlbmRlcmVyLCBpbnB1dEJ1ZmZlciwgb3V0cHV0QnVmZmVyLCBkZWx0YSwgc3RlbmNpbFRlc3QpIHtcclxuXHJcblx0XHRjb25zdCBtb2RlID0gdGhpcy5tb2RlO1xyXG5cdFx0Y29uc3QgY291bnRlciA9IHRoaXMuY291bnRlcjtcclxuXHRcdGNvbnN0IGJyZWFrUG9pbnQgPSB0aGlzLmJyZWFrUG9pbnQ7XHJcblx0XHRjb25zdCB1bmlmb3JtcyA9IHRoaXMubWF0ZXJpYWwudW5pZm9ybXM7XHJcblxyXG5cdFx0dW5pZm9ybXMudERpZmZ1c2UudmFsdWUgPSBpbnB1dEJ1ZmZlci50ZXh0dXJlO1xyXG5cdFx0dW5pZm9ybXMuc2VlZC52YWx1ZSA9IE1hdGgucmFuZG9tKCk7XHJcblx0XHR1bmlmb3Jtcy5hY3RpdmUudmFsdWUgPSB0cnVlO1xyXG5cclxuXHRcdGlmKGNvdW50ZXIgJSBicmVha1BvaW50ID09PSAwIHx8IG1vZGUgPT09IEdsaXRjaE1vZGUuQ09OU1RBTlRfV0lMRCkge1xyXG5cclxuXHRcdFx0dW5pZm9ybXMuYW1vdW50LnZhbHVlID0gTWF0aC5yYW5kb20oKSAvIDMwLjA7XHJcblx0XHRcdHVuaWZvcm1zLmFuZ2xlLnZhbHVlID0gcmFuZG9tRmxvYXQoLU1hdGguUEksIE1hdGguUEkpO1xyXG5cdFx0XHR1bmlmb3Jtcy5zZWVkWC52YWx1ZSA9IHJhbmRvbUZsb2F0KC0xLjAsIDEuMCk7XHJcblx0XHRcdHVuaWZvcm1zLnNlZWRZLnZhbHVlID0gcmFuZG9tRmxvYXQoLTEuMCwgMS4wKTtcclxuXHRcdFx0dW5pZm9ybXMuZGlzdG9ydGlvblgudmFsdWUgPSByYW5kb21GbG9hdCgwLjAsIDEuMCk7XHJcblx0XHRcdHVuaWZvcm1zLmRpc3RvcnRpb25ZLnZhbHVlID0gcmFuZG9tRmxvYXQoMC4wLCAxLjApO1xyXG5cclxuXHRcdFx0dGhpcy5icmVha1BvaW50ID0gcmFuZG9tSW50KDEyMCwgMjQwKTtcclxuXHRcdFx0dGhpcy5jb3VudGVyID0gMDtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0aWYoY291bnRlciAlIGJyZWFrUG9pbnQgPCBicmVha1BvaW50IC8gNSB8fCBtb2RlID09PSBHbGl0Y2hNb2RlLkNPTlNUQU5UX01JTEQpIHtcclxuXHJcblx0XHRcdFx0dW5pZm9ybXMuYW1vdW50LnZhbHVlID0gTWF0aC5yYW5kb20oKSAvIDkwLjA7XHJcblx0XHRcdFx0dW5pZm9ybXMuYW5nbGUudmFsdWUgPSByYW5kb21GbG9hdCgtTWF0aC5QSSwgTWF0aC5QSSk7XHJcblx0XHRcdFx0dW5pZm9ybXMuZGlzdG9ydGlvblgudmFsdWUgPSByYW5kb21GbG9hdCgwLjAsIDEuMCk7XHJcblx0XHRcdFx0dW5pZm9ybXMuZGlzdG9ydGlvblkudmFsdWUgPSByYW5kb21GbG9hdCgwLjAsIDEuMCk7XHJcblx0XHRcdFx0dW5pZm9ybXMuc2VlZFgudmFsdWUgPSByYW5kb21GbG9hdCgtMC4zLCAwLjMpO1xyXG5cdFx0XHRcdHVuaWZvcm1zLnNlZWRZLnZhbHVlID0gcmFuZG9tRmxvYXQoLTAuMywgMC4zKTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRcdC8vIFNwb3JhZGljLlxyXG5cdFx0XHRcdHVuaWZvcm1zLmFjdGl2ZS52YWx1ZSA9IGZhbHNlO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0XHQrK3RoaXMuY291bnRlcjtcclxuXHJcblx0XHRyZW5kZXJlci5yZW5kZXIodGhpcy5zY2VuZSwgdGhpcy5jYW1lcmEsIHRoaXMucmVuZGVyVG9TY3JlZW4gPyBudWxsIDogb3V0cHV0QnVmZmVyKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIEEgZ2xpdGNoIG1vZGUgZW51bWVyYXRpb24uXHJcbiAqXHJcbiAqIEB0eXBlIHtPYmplY3R9XHJcbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBTUE9SQURJQyAtIFNwb3JhZGljIGdsaXRjaGVzLlxyXG4gKiBAcHJvcGVydHkge051bWJlcn0gQ09OU1RBTlRfTUlMRCAtIENvbnN0YW50IG1pbGQgZ2xpdGNoZXMuXHJcbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBDT05TVEFOVF9XSUxEIC0gQ29uc3RhbnQgd2lsZCBnbGl0Y2hlcy5cclxuICovXHJcblxyXG5leHBvcnQgY29uc3QgR2xpdGNoTW9kZSA9IHtcclxuXHJcblx0U1BPUkFESUM6IDAsXHJcblx0Q09OU1RBTlRfTUlMRDogMSxcclxuXHRDT05TVEFOVF9XSUxEOiAyXHJcblxyXG59O1xyXG4iLCJpbXBvcnQgeyBDbGVhclBhc3MgfSBmcm9tIFwiLi9DbGVhclBhc3MuanNcIjtcclxuaW1wb3J0IHsgUGFzcyB9IGZyb20gXCIuL1Bhc3MuanNcIjtcclxuXHJcbi8qKlxyXG4gKiBBIHBhc3MgdGhhdCByZW5kZXJzIGEgZ2l2ZW4gc2NlbmUgZGlyZWN0bHkgb24gc2NyZWVuIG9yIGludG8gdGhlIHJlYWQgYnVmZmVyXHJcbiAqIGZvciBmdXJ0aGVyIHByb2Nlc3NpbmcuXHJcbiAqL1xyXG5cclxuZXhwb3J0IGNsYXNzIFJlbmRlclBhc3MgZXh0ZW5kcyBQYXNzIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyByZW5kZXIgcGFzcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7U2NlbmV9IHNjZW5lIC0gVGhlIHNjZW5lIHRvIHJlbmRlci5cclxuXHQgKiBAcGFyYW0ge0NhbWVyYX0gY2FtZXJhIC0gVGhlIGNhbWVyYSB0byB1c2UgdG8gcmVuZGVyIHRoZSBzY2VuZS5cclxuXHQgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gQWRkaXRpb25hbCBvcHRpb25zLlxyXG5cdCAqIEBwYXJhbSB7TWF0ZXJpYWx9IFtvcHRpb25zLm92ZXJyaWRlTWF0ZXJpYWw9bnVsbF0gLSBBbiBvdmVycmlkZSBtYXRlcmlhbCBmb3IgdGhlIHNjZW5lLlxyXG5cdCAqIEBwYXJhbSB7Q29sb3J9IFtvcHRpb25zLmNsZWFyQ29sb3I9bnVsbF0gLSBBbiBvdmVycmlkZSBjbGVhciBjb2xvci5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuY2xlYXJBbHBoYT0xLjBdIC0gQW4gb3ZlcnJpZGUgY2xlYXIgYWxwaGEuXHJcblx0ICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5jbGVhckRlcHRoPWZhbHNlXSAtIFdoZXRoZXIgZGVwdGggc2hvdWxkIGJlIGNsZWFyZWQgZXhwbGljaXRseS5cclxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmNsZWFyPXRydWVdIC0gV2hldGhlciBhbGwgYnVmZmVycyBzaG91bGQgYmUgY2xlYXJlZC5cclxuXHQgKi9cclxuXHJcblx0Y29uc3RydWN0b3Ioc2NlbmUsIGNhbWVyYSwgb3B0aW9ucyA9IHt9KSB7XHJcblxyXG5cdFx0c3VwZXIoXCJSZW5kZXJQYXNzXCIsIHNjZW5lLCBjYW1lcmEsIG51bGwpO1xyXG5cclxuXHRcdHRoaXMubmVlZHNTd2FwID0gZmFsc2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIGNsZWFyIHBhc3MuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0NsZWFyUGFzc31cclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMuY2xlYXJQYXNzID0gbmV3IENsZWFyUGFzcyhvcHRpb25zKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEFuIG92ZXJyaWRlIG1hdGVyaWFsLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtNYXRlcmlhbH1cclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMub3ZlcnJpZGVNYXRlcmlhbCA9IChvcHRpb25zLm92ZXJyaWRlTWF0ZXJpYWwgIT09IHVuZGVmaW5lZCkgPyBvcHRpb25zLm92ZXJyaWRlTWF0ZXJpYWwgOiBudWxsO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGRlcHRoIGJ1ZmZlciBzaG91bGQgYmUgY2xlYXJlZCBleHBsaWNpdGx5LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtCb29sZWFufVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy5jbGVhckRlcHRoID0gKG9wdGlvbnMuY2xlYXJEZXB0aCAhPT0gdW5kZWZpbmVkKSA/IG9wdGlvbnMuY2xlYXJEZXB0aCA6IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNvbG9yLCBkZXB0aCBhbmQgc3RlbmNpbCBidWZmZXJzIHNob3VsZCBiZSBjbGVhcmVkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEV2ZW4gd2l0aCBjbGVhciBzZXQgdG8gdHJ1ZSB5b3UgY2FuIHByZXZlbnQgc3BlY2lmaWMgYnVmZmVycyBmcm9tIGJlaW5nXHJcblx0XHQgKiBjbGVhcmVkIGJ5IHNldHRpbmcgZWl0aGVyIHRoZSBhdXRvQ2xlYXJDb2xvciwgYXV0b0NsZWFyU3RlbmNpbCBvclxyXG5cdFx0ICogYXV0b0NsZWFyRGVwdGggcHJvcGVydGllcyBvZiB0aGUgcmVuZGVyZXIgdG8gZmFsc2UuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0Jvb2xlYW59XHJcblx0XHQgKi9cclxuXHJcblx0XHR0aGlzLmNsZWFyID0gKG9wdGlvbnMuY2xlYXIgIT09IHVuZGVmaW5lZCkgPyBvcHRpb25zLmNsZWFyIDogdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZW5kZXJzIHRoZSBzY2VuZS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJlcn0gcmVuZGVyZXIgLSBUaGUgcmVuZGVyZXIuXHJcblx0ICogQHBhcmFtIHtXZWJHTFJlbmRlclRhcmdldH0gaW5wdXRCdWZmZXIgLSBBIGZyYW1lIGJ1ZmZlciB0aGF0IGNvbnRhaW5zIHRoZSByZXN1bHQgb2YgdGhlIHByZXZpb3VzIHBhc3MuXHJcblx0ICogQHBhcmFtIHtXZWJHTFJlbmRlclRhcmdldH0gb3V0cHV0QnVmZmVyIC0gQSBmcmFtZSBidWZmZXIgdGhhdCBzZXJ2ZXMgYXMgdGhlIG91dHB1dCByZW5kZXIgdGFyZ2V0IHVubGVzcyB0aGlzIHBhc3MgcmVuZGVycyB0byBzY3JlZW4uXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtkZWx0YV0gLSBUaGUgdGltZSBiZXR3ZWVuIHRoZSBsYXN0IGZyYW1lIGFuZCB0aGUgY3VycmVudCBvbmUgaW4gc2Vjb25kcy5cclxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IFtzdGVuY2lsVGVzdF0gLSBJbmRpY2F0ZXMgd2hldGhlciBhIHN0ZW5jaWwgbWFzayBpcyBhY3RpdmUuXHJcblx0ICovXHJcblxyXG5cdHJlbmRlcihyZW5kZXJlciwgaW5wdXRCdWZmZXIsIG91dHB1dEJ1ZmZlciwgZGVsdGEsIHN0ZW5jaWxUZXN0KSB7XHJcblxyXG5cdFx0Y29uc3Qgc2NlbmUgPSB0aGlzLnNjZW5lO1xyXG5cdFx0Y29uc3QgcmVuZGVyVGFyZ2V0ID0gdGhpcy5yZW5kZXJUb1NjcmVlbiA/IG51bGwgOiBpbnB1dEJ1ZmZlcjtcclxuXHRcdGNvbnN0IG92ZXJyaWRlTWF0ZXJpYWwgPSBzY2VuZS5vdmVycmlkZU1hdGVyaWFsO1xyXG5cclxuXHRcdGlmKHRoaXMuY2xlYXIpIHtcclxuXHJcblx0XHRcdHRoaXMuY2xlYXJQYXNzLnJlbmRlclRvU2NyZWVuID0gdGhpcy5yZW5kZXJUb1NjcmVlbjtcclxuXHRcdFx0dGhpcy5jbGVhclBhc3MucmVuZGVyKHJlbmRlcmVyLCBpbnB1dEJ1ZmZlcik7XHJcblxyXG5cdFx0fSBlbHNlIGlmKHRoaXMuY2xlYXJEZXB0aCkge1xyXG5cclxuXHRcdFx0cmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KHJlbmRlclRhcmdldCk7XHJcblx0XHRcdHJlbmRlcmVyLmNsZWFyRGVwdGgoKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0c2NlbmUub3ZlcnJpZGVNYXRlcmlhbCA9IHRoaXMub3ZlcnJpZGVNYXRlcmlhbDtcclxuXHRcdHJlbmRlcmVyLnJlbmRlcihzY2VuZSwgdGhpcy5jYW1lcmEsIHJlbmRlclRhcmdldCk7XHJcblx0XHRzY2VuZS5vdmVycmlkZU1hdGVyaWFsID0gb3ZlcnJpZGVNYXRlcmlhbDtcclxuXHJcblx0fVxyXG5cclxufVxyXG4iLCJpbXBvcnQge1xyXG5cdENvbG9yLFxyXG5cdExpbmVhckZpbHRlcixcclxuXHRNZXNoQmFzaWNNYXRlcmlhbCxcclxuXHRSR0JGb3JtYXQsXHJcblx0U2NlbmUsXHJcblx0VmVjdG9yMyxcclxuXHRXZWJHTFJlbmRlclRhcmdldFxyXG59IGZyb20gXCJ0aHJlZVwiO1xyXG5cclxuaW1wb3J0IHsgQ29tYmluZU1hdGVyaWFsLCBHb2RSYXlzTWF0ZXJpYWwsIEtlcm5lbFNpemUgfSBmcm9tIFwiLi4vbWF0ZXJpYWxzXCI7XHJcbmltcG9ydCB7IFJlbmRlclBhc3MgfSBmcm9tIFwiLi9SZW5kZXJQYXNzLmpzXCI7XHJcbmltcG9ydCB7IEJsdXJQYXNzIH0gZnJvbSBcIi4vQmx1clBhc3MuanNcIjtcclxuaW1wb3J0IHsgUGFzcyB9IGZyb20gXCIuL1Bhc3MuanNcIjtcclxuXHJcbi8qKlxyXG4gKiBDbGFtcHMgYSBnaXZlbiB2YWx1ZS5cclxuICpcclxuICogQHByaXZhdGVcclxuICogQHBhcmFtIHtOdW1iZXJ9IHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNsYW1wLlxyXG4gKiBAcGFyYW0ge051bWJlcn0gbWluIC0gVGhlIGxvd2VzdCBwb3NzaWJsZSB2YWx1ZS5cclxuICogQHBhcmFtIHtOdW1iZXJ9IG1heCAtIFRoZSBoaWdoZXN0IHBvc3NpYmxlIHZhbHVlLlxyXG4gKiBAcmV0dXJuIHtOdW1iZXJ9IFRoZSBjbGFtcGVkIHZhbHVlLlxyXG4gKi9cclxuXHJcbmZ1bmN0aW9uIGNsYW1wKHZhbHVlLCBtaW4sIG1heCkge1xyXG5cclxuXHRyZXR1cm4gTWF0aC5tYXgobWluLCBNYXRoLm1pbihtYXgsIHZhbHVlKSk7XHJcblxyXG59XHJcblxyXG4vKipcclxuICogQSBjcmVwdXNjdWxhciByYXlzIHBhc3MuXHJcbiAqL1xyXG5cclxuZXhwb3J0IGNsYXNzIEdvZFJheXNQYXNzIGV4dGVuZHMgUGFzcyB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgZ29kIHJheXMgcGFzcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7U2NlbmV9IHNjZW5lIC0gVGhlIG1haW4gc2NlbmUuXHJcblx0ICogQHBhcmFtIHtDYW1lcmF9IGNhbWVyYSAtIFRoZSBtYWluIGNhbWVyYS5cclxuXHQgKiBAcGFyYW0ge09iamVjdDNEfSBsaWdodFNvdXJjZSAtIFRoZSBtYWluIGxpZ2h0IHNvdXJjZS5cclxuXHQgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gVGhlIG9wdGlvbnMuXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmRlbnNpdHk9MC45Nl0gLSBUaGUgZGVuc2l0eSBvZiB0aGUgbGlnaHQgcmF5cy5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuZGVjYXk9MC45M10gLSBBbiBpbGx1bWluYXRpb24gZGVjYXkgZmFjdG9yLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy53ZWlnaHQ9MC40XSAtIEEgbGlnaHQgcmF5IHdlaWdodCBmYWN0b3IuXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmV4cG9zdXJlPTAuNl0gLSBBIGNvbnN0YW50IGF0dGVudWF0aW9uIGNvZWZmaWNpZW50LlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5jbGFtcE1heD0xLjBdIC0gQW4gdXBwZXIgYm91bmQgZm9yIHRoZSBzYXR1cmF0aW9uIG9mIHRoZSBvdmVyYWxsIGVmZmVjdC5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuaW50ZW5zaXR5PTEuMF0gLSBBIGNvbnN0YW50IGZhY3RvciBmb3IgYWRkaXRpdmUgYmxlbmRpbmcuXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLnJlc29sdXRpb25TY2FsZT0wLjVdIC0gVGhlIHJlbmRlciB0ZXh0dXJlIHJlc29sdXRpb24gc2NhbGUsIHJlbGF0aXZlIHRvIHRoZSBzY3JlZW4gcmVuZGVyIHNpemUuXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmtlcm5lbFNpemU9S2VybmVsU2l6ZS5MQVJHRV0gLSBUaGUgYmx1ciBrZXJuZWwgc2l6ZS5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuc2FtcGxlcz02MF0gLSBUaGUgbnVtYmVyIG9mIHNhbXBsZXMgcGVyIHBpeGVsLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5zY3JlZW5Nb2RlPXRydWVdIC0gV2hldGhlciB0aGUgc2NyZWVuIGJsZW5kIG1vZGUgc2hvdWxkIGJlIHVzZWQgZm9yIGNvbWJpbmluZyB0aGUgZ29kIHJheXMgdGV4dHVyZSB3aXRoIHRoZSBzY2VuZSBjb2xvcnMuXHJcblx0ICovXHJcblxyXG5cdGNvbnN0cnVjdG9yKHNjZW5lLCBjYW1lcmEsIGxpZ2h0U291cmNlLCBvcHRpb25zID0ge30pIHtcclxuXHJcblx0XHRzdXBlcihcIkdvZFJheXNQYXNzXCIpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBzY2VuZSB0aGF0IG9ubHkgY29udGFpbnMgdGhlIGxpZ2h0IHNvdXJjZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7U2NlbmV9XHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy5saWdodFNjZW5lID0gbmV3IFNjZW5lKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbWFpbiBzY2VuZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7U2NlbmV9XHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy5tYWluU2NlbmUgPSBzY2VuZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBtYWluIGNhbWVyYS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Q2FtZXJhfVxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMubWFpbkNhbWVyYSA9IGNhbWVyYTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgcmVuZGVyIHRhcmdldC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7V2ViR0xSZW5kZXJUYXJnZXR9XHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy5yZW5kZXJUYXJnZXRYID0gbmV3IFdlYkdMUmVuZGVyVGFyZ2V0KDEsIDEsIHtcclxuXHRcdFx0bWluRmlsdGVyOiBMaW5lYXJGaWx0ZXIsXHJcblx0XHRcdG1hZ0ZpbHRlcjogTGluZWFyRmlsdGVyLFxyXG5cdFx0XHRzdGVuY2lsQnVmZmVyOiBmYWxzZSxcclxuXHRcdFx0ZGVwdGhCdWZmZXI6IGZhbHNlXHJcblx0XHR9KTtcclxuXHJcblx0XHR0aGlzLnJlbmRlclRhcmdldFgudGV4dHVyZS5uYW1lID0gXCJHb2RSYXlzLlRhcmdldFhcIjtcclxuXHRcdHRoaXMucmVuZGVyVGFyZ2V0WC50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBzZWNvbmQgcmVuZGVyIHRhcmdldC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7V2ViR0xSZW5kZXJUYXJnZXR9XHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy5yZW5kZXJUYXJnZXRZID0gdGhpcy5yZW5kZXJUYXJnZXRYLmNsb25lKCk7XHJcblxyXG5cdFx0dGhpcy5yZW5kZXJUYXJnZXRZLnRleHR1cmUubmFtZSA9IFwiR29kUmF5cy5UYXJnZXRZXCI7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHJlbmRlciB0YXJnZXQgZm9yIHRoZSBtYXNrZWQgbGlnaHQgc2NlbmUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1dlYkdMUmVuZGVyVGFyZ2V0fVxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMucmVuZGVyVGFyZ2V0TWFzayA9IG5ldyBXZWJHTFJlbmRlclRhcmdldCgxLCAxLCB7XHJcblx0XHRcdG1pbkZpbHRlcjogTGluZWFyRmlsdGVyLFxyXG5cdFx0XHRtYWdGaWx0ZXI6IExpbmVhckZpbHRlclxyXG5cdFx0fSk7XHJcblxyXG5cdFx0dGhpcy5yZW5kZXJUYXJnZXRNYXNrLnRleHR1cmUubmFtZSA9IFwiR29kUmF5cy5NYXNrXCI7XHJcblx0XHR0aGlzLnJlbmRlclRhcmdldE1hc2sudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgcGFzcyB0aGF0IG9ubHkgcmVuZGVycyB0aGUgbGlnaHQgc291cmNlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtSZW5kZXJQYXNzfVxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMucmVuZGVyUGFzc0xpZ2h0ID0gbmV3IFJlbmRlclBhc3ModGhpcy5saWdodFNjZW5lLCB0aGlzLm1haW5DYW1lcmEsIHtcclxuXHRcdFx0Y2xlYXJDb2xvcjogbmV3IENvbG9yKDB4MDAwMDAwKVxyXG5cdFx0fSk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHBhc3MgdGhhdCByZW5kZXJzIHRoZSBtYXNrZWQgc2NlbmUgb3ZlciB0aGUgbGlnaHQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1JlbmRlclBhc3N9XHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy5yZW5kZXJQYXNzTWFzayA9IG5ldyBSZW5kZXJQYXNzKHRoaXMubWFpblNjZW5lLCB0aGlzLm1haW5DYW1lcmEsIHtcclxuXHRcdFx0b3ZlcnJpZGVNYXRlcmlhbDogbmV3IE1lc2hCYXNpY01hdGVyaWFsKHsgY29sb3I6IDB4MDAwMDAwIH0pXHJcblx0XHR9KTtcclxuXHJcblx0XHR0aGlzLnJlbmRlclBhc3NNYXNrLmNsZWFyID0gZmFsc2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIGJsdXIgcGFzcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Qmx1clBhc3N9XHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy5ibHVyUGFzcyA9IG5ldyBCbHVyUGFzcyhvcHRpb25zKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBsaWdodCBzb3VyY2UuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge09iamVjdDNEfVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy5saWdodFNvdXJjZSA9IGxpZ2h0U291cmNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGxpZ2h0IHBvc2l0aW9uIGluIHNjcmVlbiBzcGFjZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7VmVjdG9yM31cclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKi9cclxuXHJcblx0XHR0aGlzLnNjcmVlblBvc2l0aW9uID0gbmV3IFZlY3RvcjMoKTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgZ29kIHJheXMgc2hhZGVyIG1hdGVyaWFsLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtHb2RSYXlzTWF0ZXJpYWx9XHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy5nb2RSYXlzTWF0ZXJpYWwgPSBuZXcgR29kUmF5c01hdGVyaWFsKG9wdGlvbnMpO1xyXG5cdFx0dGhpcy5nb2RSYXlzTWF0ZXJpYWwudW5pZm9ybXMubGlnaHRQb3NpdGlvbi52YWx1ZSA9IHRoaXMuc2NyZWVuUG9zaXRpb247XHJcblxyXG5cdFx0dGhpcy5zYW1wbGVzID0gb3B0aW9ucy5zYW1wbGVzO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBjb21iaW5lIHNoYWRlciBtYXRlcmlhbC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Q29tYmluZU1hdGVyaWFsfVxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMuY29tYmluZU1hdGVyaWFsID0gbmV3IENvbWJpbmVNYXRlcmlhbCgob3B0aW9ucy5zY3JlZW5Nb2RlICE9PSB1bmRlZmluZWQpID8gb3B0aW9ucy5zY3JlZW5Nb2RlIDogdHJ1ZSk7XHJcblxyXG5cdFx0dGhpcy5pbnRlbnNpdHkgPSBvcHRpb25zLmludGVuc2l0eTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgcmVzb2x1dGlvbiBzY2FsZS5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtOdW1iZXJ9XHJcblx0ICovXHJcblxyXG5cdGdldCByZXNvbHV0aW9uU2NhbGUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuYmx1clBhc3MucmVzb2x1dGlvblNjYWxlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFlvdSBuZWVkIHRvIGNhbGwge0BsaW5rIEVmZmVjdENvbXBvc2VyI3NldFNpemV9IGFmdGVyIGNoYW5naW5nIHRoaXMgdmFsdWUuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7TnVtYmVyfVxyXG5cdCAqL1xyXG5cclxuXHRzZXQgcmVzb2x1dGlvblNjYWxlKHZhbHVlID0gMC41KSB7XHJcblxyXG5cdFx0dGhpcy5ibHVyUGFzcy5yZXNvbHV0aW9uU2NhbGUgPSB2YWx1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgYmx1ciBrZXJuZWwgc2l6ZS5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtLZXJuZWxTaXplfVxyXG5cdCAqL1xyXG5cclxuXHRnZXQga2VybmVsU2l6ZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5ibHVyUGFzcy5rZXJuZWxTaXplO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEB0eXBlIHtLZXJuZWxTaXplfVxyXG5cdCAqL1xyXG5cclxuXHRzZXQga2VybmVsU2l6ZSh2YWx1ZSA9IEtlcm5lbFNpemUuTEFSR0UpIHtcclxuXHJcblx0XHR0aGlzLmJsdXJQYXNzLmtlcm5lbFNpemUgPSB2YWx1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgb3ZlcmFsbCBpbnRlbnNpdHkgb2YgdGhlIGVmZmVjdC5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtOdW1iZXJ9XHJcblx0ICovXHJcblxyXG5cdGdldCBpbnRlbnNpdHkoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuY29tYmluZU1hdGVyaWFsLnVuaWZvcm1zLm9wYWNpdHkyLnZhbHVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEB0eXBlIHtOdW1iZXJ9XHJcblx0ICovXHJcblxyXG5cdHNldCBpbnRlbnNpdHkodmFsdWUgPSAxLjApIHtcclxuXHJcblx0XHR0aGlzLmNvbWJpbmVNYXRlcmlhbC51bmlmb3Jtcy5vcGFjaXR5Mi52YWx1ZSA9IHZhbHVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBudW1iZXIgb2Ygc2FtcGxlcyBwZXIgcGl4ZWwuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7TnVtYmVyfVxyXG5cdCAqL1xyXG5cclxuXHRnZXQgc2FtcGxlcygpIHtcclxuXHJcblx0XHRyZXR1cm4gTnVtYmVyLnBhcnNlSW50KHRoaXMuZ29kUmF5c01hdGVyaWFsLmRlZmluZXMuTlVNX1NBTVBMRVNfSU5UKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGlzIHZhbHVlIG11c3QgYmUgY2FyZWZ1bGx5IGNob3Nlbi4gQSBoaWdoZXIgdmFsdWUgZGlyZWN0bHkgaW5jcmVhc2VzIHRoZVxyXG5cdCAqIEdQVSBsb2FkLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge051bWJlcn1cclxuXHQgKi9cclxuXHJcblx0c2V0IHNhbXBsZXModmFsdWUgPSA2MCkge1xyXG5cclxuXHRcdHZhbHVlID0gTWF0aC5mbG9vcih2YWx1ZSk7XHJcblxyXG5cdFx0dGhpcy5nb2RSYXlzTWF0ZXJpYWwuZGVmaW5lcy5OVU1fU0FNUExFU19GTE9BVCA9IHZhbHVlLnRvRml4ZWQoMSk7XHJcblx0XHR0aGlzLmdvZFJheXNNYXRlcmlhbC5kZWZpbmVzLk5VTV9TQU1QTEVTX0lOVCA9IHZhbHVlLnRvRml4ZWQoMCk7XHJcblx0XHR0aGlzLmdvZFJheXNNYXRlcmlhbC5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSW5kaWNhdGVzIHdoZXRoZXIgZGl0aGVyaW5nIGlzIGVuYWJsZWQuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7Qm9vbGVhbn1cclxuXHQgKi9cclxuXHJcblx0Z2V0IGRpdGhlcmluZygpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5nb2RSYXlzTWF0ZXJpYWwuZGl0aGVyaW5nO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIElmIGVuYWJsZWQsIHRoZSByZXN1bHQgd2lsbCBiZSBkaXRoZXJlZCB0byByZW1vdmUgYmFuZGluZyBhcnRpZmFjdHMuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7Qm9vbGVhbn1cclxuXHQgKi9cclxuXHJcblx0c2V0IGRpdGhlcmluZyh2YWx1ZSkge1xyXG5cclxuXHRcdGlmKHRoaXMuZGl0aGVyaW5nICE9PSB2YWx1ZSkge1xyXG5cclxuXHRcdFx0dGhpcy5nb2RSYXlzTWF0ZXJpYWwuZGl0aGVyaW5nID0gdmFsdWU7XHJcblx0XHRcdHRoaXMuZ29kUmF5c01hdGVyaWFsLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVmZmVjdCBzaG91bGQgYmUgYXBwbGllZCB0byB0aGUgaW5wdXQgYnVmZmVyLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge0Jvb2xlYW59XHJcblx0ICovXHJcblxyXG5cdGdldCBibGVuZCgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5uZWVkc1N3YXA7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSWYgZGlzYWJsZWQsIHRoZSBpbnB1dCBidWZmZXIgd2lsbCByZW1haW4gdW5hZmZlY3RlZC5cclxuXHQgKlxyXG5cdCAqIFlvdSBtYXkgdXNlIHRoZSB7QGxpbmsgQmxvb21QYXNzI292ZXJsYXl9IHRleHR1cmUgdG8gYXBwbHkgdGhlIGVmZmVjdCB0b1xyXG5cdCAqIHlvdXIgc2NlbmUuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7Qm9vbGVhbn1cclxuXHQgKi9cclxuXHJcblx0c2V0IGJsZW5kKHZhbHVlKSB7XHJcblxyXG5cdFx0dGhpcy5uZWVkc1N3YXAgPSB2YWx1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgZWZmZWN0IG92ZXJsYXkgdGV4dHVyZS5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtUZXh0dXJlfVxyXG5cdCAqL1xyXG5cclxuXHRnZXQgb3ZlcmxheSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5yZW5kZXJUYXJnZXRZLnRleHR1cmU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVuZGVycyB0aGUgZWZmZWN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtXZWJHTFJlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlci5cclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyVGFyZ2V0fSBpbnB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgY29udGFpbnMgdGhlIHJlc3VsdCBvZiB0aGUgcHJldmlvdXMgcGFzcy5cclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyVGFyZ2V0fSBvdXRwdXRCdWZmZXIgLSBBIGZyYW1lIGJ1ZmZlciB0aGF0IHNlcnZlcyBhcyB0aGUgb3V0cHV0IHJlbmRlciB0YXJnZXQgdW5sZXNzIHRoaXMgcGFzcyByZW5kZXJzIHRvIHNjcmVlbi5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW2RlbHRhXSAtIFRoZSB0aW1lIGJldHdlZW4gdGhlIGxhc3QgZnJhbWUgYW5kIHRoZSBjdXJyZW50IG9uZSBpbiBzZWNvbmRzLlxyXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gW3N0ZW5jaWxUZXN0XSAtIEluZGljYXRlcyB3aGV0aGVyIGEgc3RlbmNpbCBtYXNrIGlzIGFjdGl2ZS5cclxuXHQgKi9cclxuXHJcblx0cmVuZGVyKHJlbmRlcmVyLCBpbnB1dEJ1ZmZlciwgb3V0cHV0QnVmZmVyLCBkZWx0YSwgc3RlbmNpbFRlc3QpIHtcclxuXHJcblx0XHRjb25zdCBzY2VuZSA9IHRoaXMuc2NlbmU7XHJcblx0XHRjb25zdCBjYW1lcmEgPSB0aGlzLmNhbWVyYTtcclxuXHRcdGNvbnN0IG1haW5TY2VuZSA9IHRoaXMubWFpblNjZW5lO1xyXG5cclxuXHRcdGNvbnN0IGxpZ2h0U291cmNlID0gdGhpcy5saWdodFNvdXJjZTtcclxuXHRcdGNvbnN0IHNjcmVlblBvc2l0aW9uID0gdGhpcy5zY3JlZW5Qb3NpdGlvbjtcclxuXHJcblx0XHRjb25zdCBnb2RSYXlzTWF0ZXJpYWwgPSB0aGlzLmdvZFJheXNNYXRlcmlhbDtcclxuXHRcdGNvbnN0IGNvbWJpbmVNYXRlcmlhbCA9IHRoaXMuY29tYmluZU1hdGVyaWFsO1xyXG5cclxuXHRcdGNvbnN0IHJlbmRlclRhcmdldE1hc2sgPSB0aGlzLnJlbmRlclRhcmdldE1hc2s7XHJcblx0XHRjb25zdCByZW5kZXJUYXJnZXRYID0gdGhpcy5yZW5kZXJUYXJnZXRYO1xyXG5cdFx0Y29uc3QgcmVuZGVyVGFyZ2V0WSA9IHRoaXMucmVuZGVyVGFyZ2V0WTtcclxuXHJcblx0XHRsZXQgYmFja2dyb3VuZCwgcGFyZW50O1xyXG5cclxuXHRcdC8vIENvbXB1dGUgdGhlIHNjcmVlbiBsaWdodCBwb3NpdGlvbiBhbmQgdHJhbnNsYXRlIGl0IHRvIFswLjAsIDEuMF0uXHJcblx0XHRzY3JlZW5Qb3NpdGlvbi5jb3B5KGxpZ2h0U291cmNlLnBvc2l0aW9uKS5wcm9qZWN0KHRoaXMubWFpbkNhbWVyYSk7XHJcblx0XHRzY3JlZW5Qb3NpdGlvbi54ID0gY2xhbXAoKHNjcmVlblBvc2l0aW9uLnggKyAxLjApICogMC41LCAwLjAsIDEuMCk7XHJcblx0XHRzY3JlZW5Qb3NpdGlvbi55ID0gY2xhbXAoKHNjcmVlblBvc2l0aW9uLnkgKyAxLjApICogMC41LCAwLjAsIDEuMCk7XHJcblxyXG5cdFx0cGFyZW50ID0gbGlnaHRTb3VyY2UucGFyZW50O1xyXG5cdFx0YmFja2dyb3VuZCA9IG1haW5TY2VuZS5iYWNrZ3JvdW5kO1xyXG5cdFx0bWFpblNjZW5lLmJhY2tncm91bmQgPSBudWxsO1xyXG5cdFx0dGhpcy5saWdodFNjZW5lLmFkZChsaWdodFNvdXJjZSk7XHJcblxyXG5cdFx0LyogRmlyc3QsIHJlbmRlciB0aGUgbGlnaHQgc291cmNlLiBUaGVuIHJlbmRlciB0aGUgc2NlbmUgaW50byB0aGUgc2FtZVxyXG5cdFx0YnVmZmVyIHVzaW5nIGEgbWFzayBvdmVycmlkZSBtYXRlcmlhbCB3aXRoIGRlcHRoIHRlc3QgZW5hYmxlZC4gKi9cclxuXHRcdHRoaXMucmVuZGVyUGFzc0xpZ2h0LnJlbmRlcihyZW5kZXJlciwgcmVuZGVyVGFyZ2V0TWFzayk7XHJcblx0XHR0aGlzLnJlbmRlclBhc3NNYXNrLnJlbmRlcihyZW5kZXJlciwgcmVuZGVyVGFyZ2V0TWFzayk7XHJcblxyXG5cdFx0aWYocGFyZW50ICE9PSBudWxsKSB7XHJcblxyXG5cdFx0XHRwYXJlbnQuYWRkKGxpZ2h0U291cmNlKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0bWFpblNjZW5lLmJhY2tncm91bmQgPSBiYWNrZ3JvdW5kO1xyXG5cclxuXHRcdC8vIEJsdXIgdGhlIG1hc2tlZCBzY2VuZSB0byByZWR1Y2UgYXJ0aWZhY3RzLlxyXG5cdFx0dGhpcy5ibHVyUGFzcy5yZW5kZXIocmVuZGVyZXIsIHRoaXMucmVuZGVyVGFyZ2V0TWFzaywgcmVuZGVyVGFyZ2V0WCk7XHJcblxyXG5cdFx0Ly8gQmx1ciB0aGUgbWFza2VkIHNjZW5lIGFsb25nIHJhZGlhbCBsaW5lcyB0b3dhcmRzIHRoZSBsaWdodCBzb3VyY2UuXHJcblx0XHR0aGlzLm1hdGVyaWFsID0gZ29kUmF5c01hdGVyaWFsO1xyXG5cdFx0Z29kUmF5c01hdGVyaWFsLnVuaWZvcm1zLnREaWZmdXNlLnZhbHVlID0gcmVuZGVyVGFyZ2V0WC50ZXh0dXJlO1xyXG5cdFx0cmVuZGVyZXIucmVuZGVyKHNjZW5lLCBjYW1lcmEsIHJlbmRlclRhcmdldFkpO1xyXG5cclxuXHRcdGlmKHRoaXMuYmxlbmQpIHtcclxuXHJcblx0XHRcdC8vIENvbWJpbmUgdGhlIGdvZCByYXlzIHdpdGggdGhlIHNjZW5lIGNvbG9ycy5cclxuXHRcdFx0dGhpcy5tYXRlcmlhbCA9IGNvbWJpbmVNYXRlcmlhbDtcclxuXHRcdFx0Y29tYmluZU1hdGVyaWFsLnVuaWZvcm1zLnRleHR1cmUxLnZhbHVlID0gaW5wdXRCdWZmZXIudGV4dHVyZTtcclxuXHRcdFx0Y29tYmluZU1hdGVyaWFsLnVuaWZvcm1zLnRleHR1cmUyLnZhbHVlID0gcmVuZGVyVGFyZ2V0WS50ZXh0dXJlO1xyXG5cclxuXHRcdFx0cmVuZGVyZXIucmVuZGVyKHNjZW5lLCBjYW1lcmEsIHRoaXMucmVuZGVyVG9TY3JlZW4gPyBudWxsIDogb3V0cHV0QnVmZmVyKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBkYXRlcyB0aGUgc2l6ZSBvZiB0aGlzIHBhc3MuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge051bWJlcn0gd2lkdGggLSBUaGUgd2lkdGguXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IGhlaWdodCAtIFRoZSBoZWlnaHQuXHJcblx0ICovXHJcblxyXG5cdHNldFNpemUod2lkdGgsIGhlaWdodCkge1xyXG5cclxuXHRcdHRoaXMucmVuZGVyUGFzc0xpZ2h0LnNldFNpemUod2lkdGgsIGhlaWdodCk7XHJcblx0XHR0aGlzLnJlbmRlclBhc3NNYXNrLnNldFNpemUod2lkdGgsIGhlaWdodCk7XHJcblx0XHR0aGlzLmJsdXJQYXNzLnNldFNpemUod2lkdGgsIGhlaWdodCk7XHJcblxyXG5cdFx0d2lkdGggPSB0aGlzLmJsdXJQYXNzLndpZHRoO1xyXG5cdFx0aGVpZ2h0ID0gdGhpcy5ibHVyUGFzcy5oZWlnaHQ7XHJcblxyXG5cdFx0dGhpcy5yZW5kZXJUYXJnZXRNYXNrLnNldFNpemUod2lkdGgsIGhlaWdodCk7XHJcblx0XHR0aGlzLnJlbmRlclRhcmdldFguc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KTtcclxuXHRcdHRoaXMucmVuZGVyVGFyZ2V0WS5zZXRTaXplKHdpZHRoLCBoZWlnaHQpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFBlcmZvcm1zIGluaXRpYWxpemF0aW9uIHRhc2tzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtXZWJHTFJlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlci5cclxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IGFscGhhIC0gV2hldGhlciB0aGUgcmVuZGVyZXIgdXNlcyB0aGUgYWxwaGEgY2hhbm5lbCBvciBub3QuXHJcblx0ICovXHJcblxyXG5cdGluaXRpYWxpemUocmVuZGVyZXIsIGFscGhhKSB7XHJcblxyXG5cdFx0dGhpcy5yZW5kZXJQYXNzTGlnaHQuaW5pdGlhbGl6ZShyZW5kZXJlciwgYWxwaGEpO1xyXG5cdFx0dGhpcy5yZW5kZXJQYXNzTWFzay5pbml0aWFsaXplKHJlbmRlcmVyLCBhbHBoYSk7XHJcblx0XHR0aGlzLmJsdXJQYXNzLmluaXRpYWxpemUocmVuZGVyZXIsIGFscGhhKTtcclxuXHJcblx0XHRpZighYWxwaGEpIHtcclxuXHJcblx0XHRcdHRoaXMucmVuZGVyVGFyZ2V0TWFzay50ZXh0dXJlLmZvcm1hdCA9IFJHQkZvcm1hdDtcclxuXHRcdFx0dGhpcy5yZW5kZXJUYXJnZXRYLnRleHR1cmUuZm9ybWF0ID0gUkdCRm9ybWF0O1xyXG5cdFx0XHR0aGlzLnJlbmRlclRhcmdldFkudGV4dHVyZS5mb3JtYXQgPSBSR0JGb3JtYXQ7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG59XHJcbiIsImltcG9ydCB7IFBhc3MgfSBmcm9tIFwiLi9QYXNzLmpzXCI7XHJcblxyXG4vKipcclxuICogQSBtYXNrIHBhc3MuXHJcbiAqL1xyXG5cclxuZXhwb3J0IGNsYXNzIE1hc2tQYXNzIGV4dGVuZHMgUGFzcyB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgbWFzayBwYXNzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtTY2VuZX0gc2NlbmUgLSBUaGUgc2NlbmUgdG8gcmVuZGVyLlxyXG5cdCAqIEBwYXJhbSB7Q2FtZXJhfSBjYW1lcmEgLSBUaGUgY2FtZXJhIHRvIHVzZS5cclxuXHQgKi9cclxuXHJcblx0Y29uc3RydWN0b3Ioc2NlbmUsIGNhbWVyYSkge1xyXG5cclxuXHRcdHN1cGVyKFwiTWFza1Bhc3NcIiwgc2NlbmUsIGNhbWVyYSwgbnVsbCk7XHJcblxyXG5cdFx0dGhpcy5uZWVkc1N3YXAgPSBmYWxzZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEludmVyc2UgZmxhZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Qm9vbGVhbn1cclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMuaW52ZXJzZSA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogU3RlbmNpbCBidWZmZXIgY2xlYXIgZmxhZy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Qm9vbGVhbn1cclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMuY2xlYXJTdGVuY2lsID0gdHJ1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZW5kZXJzIHRoZSBlZmZlY3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IGlucHV0QnVmZmVyIC0gQSBmcmFtZSBidWZmZXIgdGhhdCBjb250YWlucyB0aGUgcmVzdWx0IG9mIHRoZSBwcmV2aW91cyBwYXNzLlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IG91dHB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgc2VydmVzIGFzIHRoZSBvdXRwdXQgcmVuZGVyIHRhcmdldCB1bmxlc3MgdGhpcyBwYXNzIHJlbmRlcnMgdG8gc2NyZWVuLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbZGVsdGFdIC0gVGhlIHRpbWUgYmV0d2VlbiB0aGUgbGFzdCBmcmFtZSBhbmQgdGhlIGN1cnJlbnQgb25lIGluIHNlY29uZHMuXHJcblx0ICogQHBhcmFtIHtCb29sZWFufSBbc3RlbmNpbFRlc3RdIC0gSW5kaWNhdGVzIHdoZXRoZXIgYSBzdGVuY2lsIG1hc2sgaXMgYWN0aXZlLlxyXG5cdCAqL1xyXG5cclxuXHRyZW5kZXIocmVuZGVyZXIsIGlucHV0QnVmZmVyLCBvdXRwdXRCdWZmZXIsIGRlbHRhLCBzdGVuY2lsVGVzdCkge1xyXG5cclxuXHRcdGNvbnN0IGNvbnRleHQgPSByZW5kZXJlci5jb250ZXh0O1xyXG5cdFx0Y29uc3Qgc3RhdGUgPSByZW5kZXJlci5zdGF0ZTtcclxuXHJcblx0XHRjb25zdCBzY2VuZSA9IHRoaXMuc2NlbmU7XHJcblx0XHRjb25zdCBjYW1lcmEgPSB0aGlzLmNhbWVyYTtcclxuXHJcblx0XHRjb25zdCB3cml0ZVZhbHVlID0gdGhpcy5pbnZlcnNlID8gMCA6IDE7XHJcblx0XHRjb25zdCBjbGVhclZhbHVlID0gMSAtIHdyaXRlVmFsdWU7XHJcblxyXG5cdFx0Ly8gRG9uJ3QgdXBkYXRlIGNvbG9yIG9yIGRlcHRoLlxyXG5cdFx0c3RhdGUuYnVmZmVycy5jb2xvci5zZXRNYXNrKGZhbHNlKTtcclxuXHRcdHN0YXRlLmJ1ZmZlcnMuZGVwdGguc2V0TWFzayhmYWxzZSk7XHJcblxyXG5cdFx0Ly8gTG9jayB0aGUgYnVmZmVycy5cclxuXHRcdHN0YXRlLmJ1ZmZlcnMuY29sb3Iuc2V0TG9ja2VkKHRydWUpO1xyXG5cdFx0c3RhdGUuYnVmZmVycy5kZXB0aC5zZXRMb2NrZWQodHJ1ZSk7XHJcblxyXG5cdFx0Ly8gQ29uZmlndXJlIHRoZSBzdGVuY2lsLlxyXG5cdFx0c3RhdGUuYnVmZmVycy5zdGVuY2lsLnNldFRlc3QodHJ1ZSk7XHJcblx0XHRzdGF0ZS5idWZmZXJzLnN0ZW5jaWwuc2V0T3AoY29udGV4dC5SRVBMQUNFLCBjb250ZXh0LlJFUExBQ0UsIGNvbnRleHQuUkVQTEFDRSk7XHJcblx0XHRzdGF0ZS5idWZmZXJzLnN0ZW5jaWwuc2V0RnVuYyhjb250ZXh0LkFMV0FZUywgd3JpdGVWYWx1ZSwgMHhmZmZmZmZmZik7XHJcblx0XHRzdGF0ZS5idWZmZXJzLnN0ZW5jaWwuc2V0Q2xlYXIoY2xlYXJWYWx1ZSk7XHJcblxyXG5cdFx0Ly8gQ2xlYXIgdGhlIHN0ZW5jaWwuXHJcblx0XHRpZih0aGlzLmNsZWFyU3RlbmNpbCkge1xyXG5cclxuXHRcdFx0aWYodGhpcy5yZW5kZXJUb1NjcmVlbikge1xyXG5cclxuXHRcdFx0XHRyZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQobnVsbCk7XHJcblx0XHRcdFx0cmVuZGVyZXIuY2xlYXJTdGVuY2lsKCk7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRyZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoaW5wdXRCdWZmZXIpO1xyXG5cdFx0XHRcdHJlbmRlcmVyLmNsZWFyU3RlbmNpbCgpO1xyXG5cclxuXHRcdFx0XHRyZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQob3V0cHV0QnVmZmVyKTtcclxuXHRcdFx0XHRyZW5kZXJlci5jbGVhclN0ZW5jaWwoKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gRHJhdyB0aGUgbWFzay5cclxuXHRcdGlmKHRoaXMucmVuZGVyVG9TY3JlZW4pIHtcclxuXHJcblx0XHRcdHJlbmRlcmVyLnJlbmRlcihzY2VuZSwgY2FtZXJhLCBudWxsKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0cmVuZGVyZXIucmVuZGVyKHNjZW5lLCBjYW1lcmEsIGlucHV0QnVmZmVyKTtcclxuXHRcdFx0cmVuZGVyZXIucmVuZGVyKHNjZW5lLCBjYW1lcmEsIG91dHB1dEJ1ZmZlcik7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIFVubG9jayB0aGUgYnVmZmVycy5cclxuXHRcdHN0YXRlLmJ1ZmZlcnMuY29sb3Iuc2V0TG9ja2VkKGZhbHNlKTtcclxuXHRcdHN0YXRlLmJ1ZmZlcnMuZGVwdGguc2V0TG9ja2VkKGZhbHNlKTtcclxuXHJcblx0XHQvLyBPbmx5IHJlbmRlciB3aGVyZSB0aGUgc3RlbmNpbCBpcyBzZXQgdG8gMS5cclxuXHRcdHN0YXRlLmJ1ZmZlcnMuc3RlbmNpbC5zZXRGdW5jKGNvbnRleHQuRVFVQUwsIDEsIDB4ZmZmZmZmZmYpO1xyXG5cdFx0c3RhdGUuYnVmZmVycy5zdGVuY2lsLnNldE9wKGNvbnRleHQuS0VFUCwgY29udGV4dC5LRUVQLCBjb250ZXh0LktFRVApO1xyXG5cclxuXHR9XHJcblxyXG59XHJcbiIsImltcG9ydCB7IFBhc3MgfSBmcm9tIFwiLi9QYXNzLmpzXCI7XHJcblxyXG4vKipcclxuICogQSBzaGFkZXIgcGFzcy5cclxuICpcclxuICogVXNlZCB0byByZW5kZXIgYW55IHNoYWRlciBtYXRlcmlhbCBhcyBhIDJEIGZpbHRlci5cclxuICovXHJcblxyXG5leHBvcnQgY2xhc3MgU2hhZGVyUGFzcyBleHRlbmRzIFBhc3Mge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IHNoYWRlciBwYXNzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtTaGFkZXJNYXRlcmlhbH0gbWF0ZXJpYWwgLSBUaGUgc2hhZGVyIG1hdGVyaWFsIHRvIHVzZS5cclxuXHQgKiBAcGFyYW0ge1N0cmluZ30gW3RleHR1cmVJRD1cInREaWZmdXNlXCJdIC0gVGhlIHRleHR1cmUgdW5pZm9ybSBpZGVudGlmaWVyLlxyXG5cdCAqL1xyXG5cclxuXHRjb25zdHJ1Y3RvcihtYXRlcmlhbCwgdGV4dHVyZUlEID0gXCJ0RGlmZnVzZVwiKSB7XHJcblxyXG5cdFx0c3VwZXIoXCJTaGFkZXJQYXNzXCIpO1xyXG5cclxuXHRcdHRoaXMubWF0ZXJpYWwgPSBtYXRlcmlhbDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBuYW1lIG9mIHRoZSBjb2xvciBzYW1wbGVyIHVuaWZvcm0gb2YgdGhlIGdpdmVuIG1hdGVyaWFsLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtTdHJpbmd9XHJcblx0XHQgKi9cclxuXHJcblx0XHR0aGlzLnRleHR1cmVJRCA9IHRleHR1cmVJRDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZW5kZXJzIHRoZSBlZmZlY3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IGlucHV0QnVmZmVyIC0gQSBmcmFtZSBidWZmZXIgdGhhdCBjb250YWlucyB0aGUgcmVzdWx0IG9mIHRoZSBwcmV2aW91cyBwYXNzLlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IG91dHB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgc2VydmVzIGFzIHRoZSBvdXRwdXQgcmVuZGVyIHRhcmdldCB1bmxlc3MgdGhpcyBwYXNzIHJlbmRlcnMgdG8gc2NyZWVuLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbZGVsdGFdIC0gVGhlIHRpbWUgYmV0d2VlbiB0aGUgbGFzdCBmcmFtZSBhbmQgdGhlIGN1cnJlbnQgb25lIGluIHNlY29uZHMuXHJcblx0ICogQHBhcmFtIHtCb29sZWFufSBbc3RlbmNpbFRlc3RdIC0gSW5kaWNhdGVzIHdoZXRoZXIgYSBzdGVuY2lsIG1hc2sgaXMgYWN0aXZlLlxyXG5cdCAqL1xyXG5cclxuXHRyZW5kZXIocmVuZGVyZXIsIGlucHV0QnVmZmVyLCBvdXRwdXRCdWZmZXIsIGRlbHRhLCBzdGVuY2lsVGVzdCkge1xyXG5cclxuXHRcdGlmKHRoaXMubWF0ZXJpYWwudW5pZm9ybXNbdGhpcy50ZXh0dXJlSURdICE9PSB1bmRlZmluZWQpIHtcclxuXHJcblx0XHRcdHRoaXMubWF0ZXJpYWwudW5pZm9ybXNbdGhpcy50ZXh0dXJlSURdLnZhbHVlID0gaW5wdXRCdWZmZXIudGV4dHVyZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0cmVuZGVyZXIucmVuZGVyKHRoaXMuc2NlbmUsIHRoaXMuY2FtZXJhLCB0aGlzLnJlbmRlclRvU2NyZWVuID8gbnVsbCA6IG91dHB1dEJ1ZmZlcik7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuIiwiaW1wb3J0IHtcclxuXHRDb2xvcixcclxuXHRMaW5lYXJGaWx0ZXIsXHJcblx0TWVzaERlcHRoTWF0ZXJpYWwsXHJcblx0UkdCQURlcHRoUGFja2luZyxcclxuXHRSR0JGb3JtYXQsXHJcblx0V2ViR0xSZW5kZXJUYXJnZXRcclxufSBmcm9tIFwidGhyZWVcIjtcclxuXHJcbmltcG9ydCB7XHJcblx0Q29weU1hdGVyaWFsLFxyXG5cdERlcHRoQ29tcGFyaXNvbk1hdGVyaWFsLFxyXG5cdE91dGxpbmVCbGVuZE1hdGVyaWFsLFxyXG5cdE91dGxpbmVFZGdlc01hdGVyaWFsLFxyXG5cdEtlcm5lbFNpemVcclxufSBmcm9tIFwiLi4vbWF0ZXJpYWxzXCI7XHJcblxyXG5pbXBvcnQgeyBCbHVyUGFzcyB9IGZyb20gXCIuL0JsdXJQYXNzLmpzXCI7XHJcbmltcG9ydCB7IFBhc3MgfSBmcm9tIFwiLi9QYXNzLmpzXCI7XHJcbmltcG9ydCB7IFJlbmRlclBhc3MgfSBmcm9tIFwiLi9SZW5kZXJQYXNzLmpzXCI7XHJcbmltcG9ydCB7IFNoYWRlclBhc3MgfSBmcm9tIFwiLi9TaGFkZXJQYXNzLmpzXCI7XHJcblxyXG4vKipcclxuICogQW4gb3V0bGluZSBwYXNzLlxyXG4gKi9cclxuXHJcbmV4cG9ydCBjbGFzcyBPdXRsaW5lUGFzcyBleHRlbmRzIFBhc3Mge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IG91dGxpbmUgcGFzcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7U2NlbmV9IHNjZW5lIC0gVGhlIG1haW4gc2NlbmUuXHJcblx0ICogQHBhcmFtIHtDYW1lcmF9IGNhbWVyYSAtIFRoZSBtYWluIGNhbWVyYS5cclxuXHQgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gQWRkaXRpb25hbCBwYXJhbWV0ZXJzLiBTZWUge0BsaW5rIEJsdXJQYXNzfSwge0BsaW5rIE91dGxpbmVCbGVuZE1hdGVyaWFsfSBhbmQge0BsaW5rIE91dGxpbmVFZGdlc01hdGVyaWFsfSBmb3IgZGV0YWlscy5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMucHVsc2VTcGVlZD0wLjBdIC0gVGhlIHB1bHNlIHNwZWVkLiBBIHZhbHVlIG9mIHplcm8gZGlzYWJsZXMgdGhlIHB1bHNlIGVmZmVjdC5cclxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmJsdXI9dHJ1ZV0gLSBXaGV0aGVyIHRoZSBvdXRsaW5lIHNob3VsZCBiZSBibHVycmVkLlxyXG5cdCAqL1xyXG5cclxuXHRjb25zdHJ1Y3RvcihzY2VuZSwgY2FtZXJhLCBvcHRpb25zID0ge30pIHtcclxuXHJcblx0XHRzdXBlcihcIk91dGxpbmVQYXNzXCIpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIG1haW4gc2NlbmUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1NjZW5lfVxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMubWFpblNjZW5lID0gc2NlbmU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgbWFpbiBjYW1lcmEuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0NhbWVyYX1cclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKi9cclxuXHJcblx0XHR0aGlzLm1haW5DYW1lcmEgPSBjYW1lcmE7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHJlbmRlciB0YXJnZXQgZm9yIGRlcHRoIGluZm9ybWF0aW9uLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtXZWJHTFJlbmRlclRhcmdldH1cclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKi9cclxuXHJcblx0XHR0aGlzLnJlbmRlclRhcmdldERlcHRoID0gbmV3IFdlYkdMUmVuZGVyVGFyZ2V0KDEsIDEsIHtcclxuXHRcdFx0bWluRmlsdGVyOiBMaW5lYXJGaWx0ZXIsXHJcblx0XHRcdG1hZ0ZpbHRlcjogTGluZWFyRmlsdGVyXHJcblx0XHR9KTtcclxuXHJcblx0XHR0aGlzLnJlbmRlclRhcmdldERlcHRoLnRleHR1cmUubmFtZSA9IFwiT3V0bGluZS5EZXB0aFwiO1xyXG5cdFx0dGhpcy5yZW5kZXJUYXJnZXREZXB0aC50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSByZW5kZXIgdGFyZ2V0IGZvciB0aGUgb3V0bGluZSBtYXNrLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtXZWJHTFJlbmRlclRhcmdldH1cclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKi9cclxuXHJcblx0XHR0aGlzLnJlbmRlclRhcmdldE1hc2sgPSB0aGlzLnJlbmRlclRhcmdldERlcHRoLmNsb25lKCk7XHJcblxyXG5cdFx0dGhpcy5yZW5kZXJUYXJnZXRNYXNrLnRleHR1cmUuZm9ybWF0ID0gUkdCRm9ybWF0O1xyXG5cdFx0dGhpcy5yZW5kZXJUYXJnZXRNYXNrLnRleHR1cmUubmFtZSA9IFwiT3V0bGluZS5NYXNrXCI7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHJlbmRlciB0YXJnZXQgZm9yIHRoZSBlZGdlIGRldGVjdGlvbi5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7V2ViR0xSZW5kZXJUYXJnZXR9XHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy5yZW5kZXJUYXJnZXRFZGdlcyA9IG5ldyBXZWJHTFJlbmRlclRhcmdldCgxLCAxLCB7XHJcblx0XHRcdG1pbkZpbHRlcjogTGluZWFyRmlsdGVyLFxyXG5cdFx0XHRtYWdGaWx0ZXI6IExpbmVhckZpbHRlcixcclxuXHRcdFx0c3RlbmNpbEJ1ZmZlcjogZmFsc2UsXHJcblx0XHRcdGRlcHRoQnVmZmVyOiBmYWxzZSxcclxuXHRcdFx0Zm9ybWF0OiBSR0JGb3JtYXRcclxuXHRcdH0pO1xyXG5cclxuXHRcdHRoaXMucmVuZGVyVGFyZ2V0RWRnZXMudGV4dHVyZS5uYW1lID0gXCJPdXRsaW5lLkVkZ2VzXCI7XHJcblx0XHR0aGlzLnJlbmRlclRhcmdldEVkZ2VzLnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzID0gZmFsc2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHJlbmRlciB0YXJnZXQgZm9yIHRoZSBibHVycmVkIG91dGxpbmUgb3ZlcmxheS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7V2ViR0xSZW5kZXJUYXJnZXR9XHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy5yZW5kZXJUYXJnZXRCbHVycmVkRWRnZXMgPSB0aGlzLnJlbmRlclRhcmdldEVkZ2VzLmNsb25lKCk7XHJcblxyXG5cdFx0dGhpcy5yZW5kZXJUYXJnZXRCbHVycmVkRWRnZXMudGV4dHVyZS5uYW1lID0gXCJPdXRsaW5lLkJsdXJyZWRFZGdlc1wiO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBkZXB0aCBwYXNzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtSZW5kZXJQYXNzfVxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMucmVuZGVyUGFzc0RlcHRoID0gbmV3IFJlbmRlclBhc3ModGhpcy5tYWluU2NlbmUsIHRoaXMubWFpbkNhbWVyYSwge1xyXG5cdFx0XHRvdmVycmlkZU1hdGVyaWFsOiBuZXcgTWVzaERlcHRoTWF0ZXJpYWwoe1xyXG5cdFx0XHRcdGRlcHRoUGFja2luZzogUkdCQURlcHRoUGFja2luZyxcclxuXHRcdFx0XHRtb3JwaFRhcmdldHM6IHRydWUsXHJcblx0XHRcdFx0c2tpbm5pbmc6IHRydWVcclxuXHRcdFx0fSksXHJcblx0XHRcdGNsZWFyQ29sb3I6IG5ldyBDb2xvcigweGZmZmZmZiksXHJcblx0XHRcdGNsZWFyQWxwaGE6IDEuMFxyXG5cdFx0fSk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIGRlcHRoIGNvbXBhcmlzb24gbWFzayBwYXNzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtSZW5kZXJQYXNzfVxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMucmVuZGVyUGFzc01hc2sgPSBuZXcgUmVuZGVyUGFzcyh0aGlzLm1haW5TY2VuZSwgdGhpcy5tYWluQ2FtZXJhLCB7XHJcblx0XHRcdG92ZXJyaWRlTWF0ZXJpYWw6IG5ldyBEZXB0aENvbXBhcmlzb25NYXRlcmlhbCh0aGlzLnJlbmRlclRhcmdldERlcHRoLnRleHR1cmUsIHRoaXMubWFpbkNhbWVyYSksXHJcblx0XHRcdGNsZWFyQ29sb3I6IG5ldyBDb2xvcigweGZmZmZmZiksXHJcblx0XHRcdGNsZWFyQWxwaGE6IDEuMFxyXG5cdFx0fSk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIGJsdXIgcGFzcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Qmx1clBhc3N9XHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy5ibHVyUGFzcyA9IG5ldyBCbHVyUGFzcyhvcHRpb25zKTtcclxuXHJcblx0XHR0aGlzLmtlcm5lbFNpemUgPSBvcHRpb25zLmtlcm5lbFNpemU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIGNvcHkgcGFzcyB0aGF0IHJlbmRlcnMgdGhlIHJlYWQgYnVmZmVyIHRvIHNjcmVlbiBpZiBuZWVkZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1NoYWRlclBhc3N9XHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy5jb3B5UGFzcyA9IG5ldyBTaGFkZXJQYXNzKG5ldyBDb3B5TWF0ZXJpYWwoKSk7XHJcblx0XHR0aGlzLmNvcHlQYXNzLnJlbmRlclRvU2NyZWVuID0gdHJ1ZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEFuIG91dGxpbmUgZWRnZSBkZXRlY3Rpb24gbWF0ZXJpYWwuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge091dGxpbmVFZGdlc01hdGVyaWFsfVxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMub3V0bGluZUVkZ2VzTWF0ZXJpYWwgPSBuZXcgT3V0bGluZUVkZ2VzTWF0ZXJpYWwob3B0aW9ucyk7XHJcblx0XHR0aGlzLm91dGxpbmVFZGdlc01hdGVyaWFsLnVuaWZvcm1zLnRNYXNrLnZhbHVlID0gdGhpcy5yZW5kZXJUYXJnZXRNYXNrLnRleHR1cmU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBbiBvdXRsaW5lIGJsZW5kIG1hdGVyaWFsLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtPdXRsaW5lQmxlbmRNYXRlcmlhbH1cclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKi9cclxuXHJcblx0XHR0aGlzLm91dGxpbmVCbGVuZE1hdGVyaWFsID0gbmV3IE91dGxpbmVCbGVuZE1hdGVyaWFsKG9wdGlvbnMpO1xyXG5cdFx0dGhpcy5vdXRsaW5lQmxlbmRNYXRlcmlhbC51bmlmb3Jtcy50TWFzay52YWx1ZSA9IHRoaXMucmVuZGVyVGFyZ2V0TWFzay50ZXh0dXJlO1xyXG5cclxuXHRcdHRoaXMuYmx1ciA9IChvcHRpb25zLmJsdXIgIT09IHVuZGVmaW5lZCkgPyBvcHRpb25zLmJsdXIgOiB0cnVlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBsaXN0IG9mIG9iamVjdHMgdG8gb3V0bGluZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7T2JqZWN0M0RbXX1cclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKi9cclxuXHJcblx0XHR0aGlzLnNlbGVjdGlvbiA9IFtdO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGN1cnJlbnQgYW5pbWF0aW9uIHRpbWUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge051bWJlcn1cclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKi9cclxuXHJcblx0XHR0aGlzLnRpbWUgPSAwLjA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgcHVsc2Ugc3BlZWQuIEEgdmFsdWUgb2YgemVybyBkaXNhYmxlcyB0aGUgcHVsc2UgZWZmZWN0LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtOdW1iZXJ9XHJcblx0XHQgKi9cclxuXHJcblx0XHR0aGlzLnB1bHNlU3BlZWQgPSAob3B0aW9ucy5wdWxzZVNwZWVkICE9PSB1bmRlZmluZWQpID8gb3B0aW9ucy5wdWxzZVNwZWVkIDogMC4wO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBkZWRpY2F0ZWQgcmVuZGVyIGxheWVyIGZvciBzZWxlY3RlZCBvYmplY3RzLlxyXG5cdFx0ICpcclxuXHRcdCAqIFRoaXMgbGF5ZXIgaXMgc2V0IHRvIDEwIGJ5IGRlZmF1bHQuIElmIHRoaXMgY29sbGlkZXMgd2l0aCB5b3VyIG93biBjdXN0b21cclxuXHRcdCAqIGxheWVycywgcGxlYXNlIGNoYW5nZSBpdCB0byBhIGZyZWUgbGF5ZXIgYmVmb3JlIHJlbmRlcmluZyFcclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7TnVtYmVyfVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy5zZWxlY3Rpb25MYXllciA9IDEwO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSByZXNvbHV0aW9uIHNjYWxlLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge051bWJlcn1cclxuXHQgKi9cclxuXHJcblx0Z2V0IHJlc29sdXRpb25TY2FsZSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5ibHVyUGFzcy5yZXNvbHV0aW9uU2NhbGU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogWW91IG5lZWQgdG8gY2FsbCB7QGxpbmsgRWZmZWN0Q29tcG9zZXIjc2V0U2l6ZX0gYWZ0ZXIgY2hhbmdpbmcgdGhpcyB2YWx1ZS5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtOdW1iZXJ9XHJcblx0ICovXHJcblxyXG5cdHNldCByZXNvbHV0aW9uU2NhbGUodmFsdWUgPSAwLjUpIHtcclxuXHJcblx0XHR0aGlzLmJsdXJQYXNzLnJlc29sdXRpb25TY2FsZSA9IHZhbHVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBibHVyIGtlcm5lbCBzaXplLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge0tlcm5lbFNpemV9XHJcblx0ICovXHJcblxyXG5cdGdldCBrZXJuZWxTaXplKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLmJsdXJQYXNzLmtlcm5lbFNpemU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQHR5cGUge0tlcm5lbFNpemV9XHJcblx0ICovXHJcblxyXG5cdHNldCBrZXJuZWxTaXplKHZhbHVlID0gS2VybmVsU2l6ZS5WRVJZX1NNQUxMKSB7XHJcblxyXG5cdFx0dGhpcy5ibHVyUGFzcy5rZXJuZWxTaXplID0gdmFsdWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIG91dGxpbmUgb3ZlcmxheSBzaG91bGQgYmUgYmx1cnJlZC5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtCb29sZWFufVxyXG5cdCAqL1xyXG5cclxuXHRnZXQgYmx1cigpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5ibHVyUGFzcy5lbmFibGVkO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEB0eXBlIHtCb29sZWFufVxyXG5cdCAqL1xyXG5cclxuXHRzZXQgYmx1cih2YWx1ZSkge1xyXG5cclxuXHRcdHRoaXMuYmx1clBhc3MuZW5hYmxlZCA9IHZhbHVlO1xyXG5cclxuXHRcdHRoaXMub3V0bGluZUJsZW5kTWF0ZXJpYWwudW5pZm9ybXMudEVkZ2VzLnZhbHVlID0gdmFsdWUgP1xyXG5cdFx0XHR0aGlzLnJlbmRlclRhcmdldEJsdXJyZWRFZGdlcy50ZXh0dXJlIDpcclxuXHRcdFx0dGhpcy5yZW5kZXJUYXJnZXRFZGdlcy50ZXh0dXJlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEluZGljYXRlcyB3aGV0aGVyIGRpdGhlcmluZyBpcyBlbmFibGVkLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge0Jvb2xlYW59XHJcblx0ICovXHJcblxyXG5cdGdldCBkaXRoZXJpbmcoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuYmx1clBhc3MuZGl0aGVyaW5nO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIElmIGVuYWJsZWQsIHRoZSByZXN1bHQgd2lsbCBiZSBkaXRoZXJlZCB0byByZW1vdmUgYmFuZGluZyBhcnRpZmFjdHMuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7Qm9vbGVhbn1cclxuXHQgKi9cclxuXHJcblx0c2V0IGRpdGhlcmluZyh2YWx1ZSkge1xyXG5cclxuXHRcdHRoaXMuYmx1clBhc3MuZGl0aGVyaW5nID0gdmFsdWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVmZmVjdCBzaG91bGQgYmUgYXBwbGllZCB0byB0aGUgaW5wdXQgYnVmZmVyLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge0Jvb2xlYW59XHJcblx0ICovXHJcblxyXG5cdGdldCBibGVuZCgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5uZWVkc1N3YXA7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSWYgZGlzYWJsZWQsIHRoZSBpbnB1dCBidWZmZXIgd2lsbCByZW1haW4gdW5hZmZlY3RlZC5cclxuXHQgKlxyXG5cdCAqIFlvdSBtYXkgdXNlIHRoZSB7QGxpbmsgQmxvb21QYXNzI292ZXJsYXl9IHRleHR1cmUgdG8gYXBwbHkgdGhlIGVmZmVjdCB0b1xyXG5cdCAqIHlvdXIgc2NlbmUuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7Qm9vbGVhbn1cclxuXHQgKi9cclxuXHJcblx0c2V0IGJsZW5kKHZhbHVlKSB7XHJcblxyXG5cdFx0dGhpcy5uZWVkc1N3YXAgPSB2YWx1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgZWZmZWN0IG92ZXJsYXkgdGV4dHVyZS5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtUZXh0dXJlfVxyXG5cdCAqL1xyXG5cclxuXHRnZXQgb3ZlcmxheSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5vdXRsaW5lQmxlbmRNYXRlcmlhbC51bmlmb3Jtcy50RWRnZXMudmFsdWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyBhIHBhdHRlcm4gdGV4dHVyZSB0byB1c2UgYXMgYW4gb3ZlcmxheSBmb3Igc2VsZWN0ZWQgb2JqZWN0cy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7VGV4dHVyZX0gW3RleHR1cmU9bnVsbF0gLSBBIHBhdHRlcm4gdGV4dHVyZS4gU2V0IHRvIG51bGwgdG8gZGlzYWJsZSB0aGUgcGF0dGVybi5cclxuXHQgKi9cclxuXHJcblx0c2V0UGF0dGVyblRleHR1cmUodGV4dHVyZSA9IG51bGwpIHtcclxuXHJcblx0XHR0aGlzLm91dGxpbmVCbGVuZE1hdGVyaWFsLnNldFBhdHRlcm5UZXh0dXJlKHRleHR1cmUpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENsZWFycyB0aGUgY3VycmVudCBzZWxlY3Rpb24gYW5kIHNlbGVjdHMgYSBsaXN0IG9mIG9iamVjdHMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge09iamVjdDNEW119IG9iamVjdHMgLSBUaGUgb2JqZWN0cyB0aGF0IHNob3VsZCBiZSBvdXRsaW5lZC4gVGhpcyBhcnJheSB3aWxsIGJlIGNvcGllZC5cclxuXHQgKiBAcmV0dXJuIHtPdXRsaW5lUGFzc30gVGhpcyBwYXNzLlxyXG5cdCAqL1xyXG5cclxuXHRzZXRTZWxlY3Rpb24ob2JqZWN0cykge1xyXG5cclxuXHRcdGNvbnN0IHNlbGVjdGlvbiA9IG9iamVjdHMuc2xpY2UoMCk7XHJcblx0XHRjb25zdCBzZWxlY3Rpb25MYXllciA9IHRoaXMuc2VsZWN0aW9uTGF5ZXI7XHJcblxyXG5cdFx0bGV0IGksIGw7XHJcblxyXG5cdFx0dGhpcy5jbGVhclNlbGVjdGlvbigpO1xyXG5cclxuXHRcdGZvcihpID0gMCwgbCA9IHNlbGVjdGlvbi5sZW5ndGg7IGkgPCBsOyArK2kpIHtcclxuXHJcblx0XHRcdHNlbGVjdGlvbltpXS5sYXllcnMuZW5hYmxlKHNlbGVjdGlvbkxheWVyKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ2xlYXJzIHRoZSBsaXN0IG9mIHNlbGVjdGVkIG9iamVjdHMuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJuIHtPdXRsaW5lUGFzc30gVGhpcyBwYXNzLlxyXG5cdCAqL1xyXG5cclxuXHRjbGVhclNlbGVjdGlvbigpIHtcclxuXHJcblx0XHRjb25zdCBzZWxlY3Rpb24gPSB0aGlzLnNlbGVjdGlvbjtcclxuXHRcdGNvbnN0IHNlbGVjdGlvbkxheWVyID0gdGhpcy5zZWxlY3Rpb25MYXllcjtcclxuXHJcblx0XHRsZXQgaSwgbDtcclxuXHJcblx0XHRmb3IoaSA9IDAsIGwgPSBzZWxlY3Rpb24ubGVuZ3RoOyBpIDwgbDsgKytpKSB7XHJcblxyXG5cdFx0XHRzZWxlY3Rpb25baV0ubGF5ZXJzLmRpc2FibGUoc2VsZWN0aW9uTGF5ZXIpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLnNlbGVjdGlvbiA9IFtdO1xyXG5cdFx0dGhpcy50aW1lID0gMC4wO1xyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNlbGVjdHMgYW4gb2JqZWN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtPYmplY3QzRH0gb2JqZWN0IC0gVGhlIG9iamVjdCB0aGF0IHNob3VsZCBiZSBvdXRsaW5lZC5cclxuXHQgKiBAcmV0dXJuIHtPdXRsaW5lUGFzc30gVGhpcyBwYXNzLlxyXG5cdCAqL1xyXG5cclxuXHRzZWxlY3RPYmplY3Qob2JqZWN0KSB7XHJcblxyXG5cdFx0b2JqZWN0LmxheWVycy5lbmFibGUodGhpcy5zZWxlY3Rpb25MYXllcik7XHJcblx0XHR0aGlzLnNlbGVjdGlvbi5wdXNoKG9iamVjdCk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGVzZWxlY3RzIGFuIG9iamVjdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0M0R9IG9iamVjdCAtIFRoZSBvYmplY3QgdGhhdCBzaG91bGQgbm8gbG9uZ2VyIGJlIG91dGxpbmVkLlxyXG5cdCAqIEByZXR1cm4ge091dGxpbmVQYXNzfSBUaGlzIHBhc3MuXHJcblx0ICovXHJcblxyXG5cdGRlc2VsZWN0T2JqZWN0KG9iamVjdCkge1xyXG5cclxuXHRcdGNvbnN0IHNlbGVjdGlvbiA9IHRoaXMuc2VsZWN0aW9uO1xyXG5cdFx0Y29uc3QgaW5kZXggPSBzZWxlY3Rpb24uaW5kZXhPZihvYmplY3QpO1xyXG5cclxuXHRcdGlmKGluZGV4ID49IDApIHtcclxuXHJcblx0XHRcdHNlbGVjdGlvbltpbmRleF0ubGF5ZXJzLmRpc2FibGUodGhpcy5zZWxlY3Rpb25MYXllcik7XHJcblx0XHRcdHNlbGVjdGlvbi5zcGxpY2UoaW5kZXgsIDEpO1xyXG5cclxuXHRcdFx0aWYoc2VsZWN0aW9uLmxlbmd0aCA9PT0gMCkge1xyXG5cclxuXHRcdFx0XHR0aGlzLnRpbWUgPSAwLjA7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgdGhlIHZpc2liaWxpdHkgb2YgYWxsIHNlbGVjdGVkIG9iamVjdHMuXHJcblx0ICpcclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gdmlzaWJsZSAtIFdoZXRoZXIgdGhlIHNlbGVjdGVkIG9iamVjdHMgc2hvdWxkIGJlIHZpc2libGUuXHJcblx0ICovXHJcblxyXG5cdHNldFNlbGVjdGlvblZpc2libGUodmlzaWJsZSkge1xyXG5cclxuXHRcdGNvbnN0IHNlbGVjdGlvbiA9IHRoaXMuc2VsZWN0aW9uO1xyXG5cclxuXHRcdGxldCBpLCBsO1xyXG5cclxuXHRcdGZvcihpID0gMCwgbCA9IHNlbGVjdGlvbi5sZW5ndGg7IGkgPCBsOyArK2kpIHtcclxuXHJcblx0XHRcdGlmKHZpc2libGUpIHtcclxuXHJcblx0XHRcdFx0c2VsZWN0aW9uW2ldLmxheWVycy5lbmFibGUoMCk7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRzZWxlY3Rpb25baV0ubGF5ZXJzLmRpc2FibGUoMCk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlbmRlcnMgdGhlIGVmZmVjdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJlcn0gcmVuZGVyZXIgLSBUaGUgcmVuZGVyZXIuXHJcblx0ICogQHBhcmFtIHtXZWJHTFJlbmRlclRhcmdldH0gaW5wdXRCdWZmZXIgLSBBIGZyYW1lIGJ1ZmZlciB0aGF0IGNvbnRhaW5zIHRoZSByZXN1bHQgb2YgdGhlIHByZXZpb3VzIHBhc3MuXHJcblx0ICogQHBhcmFtIHtXZWJHTFJlbmRlclRhcmdldH0gb3V0cHV0QnVmZmVyIC0gQSBmcmFtZSBidWZmZXIgdGhhdCBzZXJ2ZXMgYXMgdGhlIG91dHB1dCByZW5kZXIgdGFyZ2V0IHVubGVzcyB0aGlzIHBhc3MgcmVuZGVycyB0byBzY3JlZW4uXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtkZWx0YV0gLSBUaGUgdGltZSBiZXR3ZWVuIHRoZSBsYXN0IGZyYW1lIGFuZCB0aGUgY3VycmVudCBvbmUgaW4gc2Vjb25kcy5cclxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IFtzdGVuY2lsVGVzdF0gLSBJbmRpY2F0ZXMgd2hldGhlciBhIHN0ZW5jaWwgbWFzayBpcyBhY3RpdmUuXHJcblx0ICovXHJcblxyXG5cdHJlbmRlcihyZW5kZXJlciwgaW5wdXRCdWZmZXIsIG91dHB1dEJ1ZmZlciwgZGVsdGEsIHN0ZW5jaWxUZXN0KSB7XHJcblxyXG5cdFx0Y29uc3QgbWFpblNjZW5lID0gdGhpcy5tYWluU2NlbmU7XHJcblx0XHRjb25zdCBtYWluQ2FtZXJhID0gdGhpcy5tYWluQ2FtZXJhO1xyXG5cdFx0Y29uc3QgcHVsc2UgPSB0aGlzLm91dGxpbmVCbGVuZE1hdGVyaWFsLnVuaWZvcm1zLnB1bHNlO1xyXG5cclxuXHRcdGxldCBiYWNrZ3JvdW5kLCBtYXNrO1xyXG5cclxuXHRcdGlmKHRoaXMuc2VsZWN0aW9uLmxlbmd0aCA+IDApIHtcclxuXHJcblx0XHRcdGJhY2tncm91bmQgPSBtYWluU2NlbmUuYmFja2dyb3VuZDtcclxuXHRcdFx0bWFzayA9IG1haW5DYW1lcmEubGF5ZXJzLm1hc2s7XHJcblx0XHRcdG1haW5TY2VuZS5iYWNrZ3JvdW5kID0gbnVsbDtcclxuXHJcblx0XHRcdHB1bHNlLnZhbHVlID0gMS4wO1xyXG5cclxuXHRcdFx0aWYodGhpcy5wdWxzZVNwZWVkID4gMC4wKSB7XHJcblxyXG5cdFx0XHRcdHB1bHNlLnZhbHVlID0gMC42MjUgKyBNYXRoLmNvcyh0aGlzLnRpbWUgKiB0aGlzLnB1bHNlU3BlZWQgKiAxMC4wKSAqIDAuMzc1O1xyXG5cdFx0XHRcdHRoaXMudGltZSArPSBkZWx0YTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIFJlbmRlciBhIGN1c3RvbSBkZXB0aCB0ZXh0dXJlIGFuZCBpZ25vcmUgc2VsZWN0ZWQgb2JqZWN0cy5cclxuXHRcdFx0dGhpcy5zZXRTZWxlY3Rpb25WaXNpYmxlKGZhbHNlKTtcclxuXHRcdFx0dGhpcy5yZW5kZXJQYXNzRGVwdGgucmVuZGVyKHJlbmRlcmVyLCB0aGlzLnJlbmRlclRhcmdldERlcHRoKTtcclxuXHRcdFx0dGhpcy5zZXRTZWxlY3Rpb25WaXNpYmxlKHRydWUpO1xyXG5cclxuXHRcdFx0Ly8gQ3JlYXRlIGEgbWFzayBmb3IgdGhlIHNlbGVjdGVkIG9iamVjdHMgdXNpbmcgdGhlIGRlcHRoIGluZm9ybWF0aW9uLlxyXG5cdFx0XHRtYWluQ2FtZXJhLmxheWVycy5tYXNrID0gMSA8PCB0aGlzLnNlbGVjdGlvbkxheWVyO1xyXG5cdFx0XHR0aGlzLnJlbmRlclBhc3NNYXNrLnJlbmRlcihyZW5kZXJlciwgdGhpcy5yZW5kZXJUYXJnZXRNYXNrKTtcclxuXHJcblx0XHRcdC8vIFJlc3RvcmUgdGhlIGNhbWVyYSBsYXllciBtYXNrIGFuZCB0aGUgc2NlbmUgYmFja2dyb3VuZC5cclxuXHRcdFx0bWFpbkNhbWVyYS5sYXllcnMubWFzayA9IG1hc2s7XHJcblx0XHRcdG1haW5TY2VuZS5iYWNrZ3JvdW5kID0gYmFja2dyb3VuZDtcclxuXHJcblx0XHRcdC8vIERldGVjdCB0aGUgb3V0bGluZS5cclxuXHRcdFx0dGhpcy5tYXRlcmlhbCA9IHRoaXMub3V0bGluZUVkZ2VzTWF0ZXJpYWw7XHJcblx0XHRcdHJlbmRlcmVyLnJlbmRlcih0aGlzLnNjZW5lLCB0aGlzLmNhbWVyYSwgdGhpcy5yZW5kZXJUYXJnZXRFZGdlcyk7XHJcblxyXG5cdFx0XHRpZih0aGlzLmJsdXJQYXNzLmVuYWJsZWQpIHtcclxuXHJcblx0XHRcdFx0Ly8gQmx1ciB0aGUgZWRnZXMuXHJcblx0XHRcdFx0dGhpcy5ibHVyUGFzcy5yZW5kZXIocmVuZGVyZXIsIHRoaXMucmVuZGVyVGFyZ2V0RWRnZXMsIHRoaXMucmVuZGVyVGFyZ2V0Qmx1cnJlZEVkZ2VzKTtcclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmKHRoaXMuYmxlbmQpIHtcclxuXHJcblx0XHRcdFx0Ly8gRHJhdyB0aGUgZmluYWwgb3ZlcmxheSBvbnRvIHRoZSBzY2VuZSBjb2xvdXJzLlxyXG5cdFx0XHRcdHRoaXMubWF0ZXJpYWwgPSB0aGlzLm91dGxpbmVCbGVuZE1hdGVyaWFsO1xyXG5cdFx0XHRcdHRoaXMub3V0bGluZUJsZW5kTWF0ZXJpYWwudW5pZm9ybXMudERpZmZ1c2UudmFsdWUgPSBpbnB1dEJ1ZmZlci50ZXh0dXJlO1xyXG5cdFx0XHRcdHJlbmRlcmVyLnJlbmRlcih0aGlzLnNjZW5lLCB0aGlzLmNhbWVyYSwgdGhpcy5yZW5kZXJUb1NjcmVlbiA/IG51bGwgOiB0aGlzLm91dHB1dEJ1ZmZlcik7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIGlmKHRoaXMucmVuZGVyVG9TY3JlZW4pIHtcclxuXHJcblx0XHRcdC8vIERyYXcgdGhlIHJlYWQgYnVmZmVyIHRvIHNjcmVlbi5cclxuXHRcdFx0dGhpcy5jb3B5UGFzcy5yZW5kZXIocmVuZGVyZXIsIGlucHV0QnVmZmVyKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBkYXRlcyB0aGUgc2l6ZSBvZiB0aGlzIHBhc3MuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge051bWJlcn0gd2lkdGggLSBUaGUgd2lkdGguXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IGhlaWdodCAtIFRoZSBoZWlnaHQuXHJcblx0ICovXHJcblxyXG5cdHNldFNpemUod2lkdGgsIGhlaWdodCkge1xyXG5cclxuXHRcdHRoaXMucmVuZGVyVGFyZ2V0RGVwdGguc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KTtcclxuXHRcdHRoaXMucmVuZGVyVGFyZ2V0TWFzay5zZXRTaXplKHdpZHRoLCBoZWlnaHQpO1xyXG5cclxuXHRcdHRoaXMucmVuZGVyUGFzc0RlcHRoLnNldFNpemUod2lkdGgsIGhlaWdodCk7XHJcblx0XHR0aGlzLnJlbmRlclBhc3NNYXNrLnNldFNpemUod2lkdGgsIGhlaWdodCk7XHJcblx0XHR0aGlzLmJsdXJQYXNzLnNldFNpemUod2lkdGgsIGhlaWdodCk7XHJcblxyXG5cdFx0d2lkdGggPSB0aGlzLmJsdXJQYXNzLndpZHRoO1xyXG5cdFx0aGVpZ2h0ID0gdGhpcy5ibHVyUGFzcy5oZWlnaHQ7XHJcblxyXG5cdFx0dGhpcy5yZW5kZXJUYXJnZXRFZGdlcy5zZXRTaXplKHdpZHRoLCBoZWlnaHQpO1xyXG5cdFx0dGhpcy5yZW5kZXJUYXJnZXRCbHVycmVkRWRnZXMuc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KTtcclxuXHJcblx0XHR0aGlzLm91dGxpbmVCbGVuZE1hdGVyaWFsLnVuaWZvcm1zLmFzcGVjdC52YWx1ZSA9IHdpZHRoIC8gaGVpZ2h0O1xyXG5cdFx0dGhpcy5vdXRsaW5lRWRnZXNNYXRlcmlhbC5zZXRUZXhlbFNpemUoMS4wIC8gd2lkdGgsIDEuMCAvIGhlaWdodCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUGVyZm9ybXMgaW5pdGlhbGl6YXRpb24gdGFza3MuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gYWxwaGEgLSBXaGV0aGVyIHRoZSByZW5kZXJlciB1c2VzIHRoZSBhbHBoYSBjaGFubmVsIG9yIG5vdC5cclxuXHQgKi9cclxuXHJcblx0aW5pdGlhbGl6ZShyZW5kZXJlciwgYWxwaGEpIHtcclxuXHJcblx0XHR0aGlzLnJlbmRlclBhc3NEZXB0aC5pbml0aWFsaXplKHJlbmRlcmVyLCBhbHBoYSk7XHJcblx0XHR0aGlzLnJlbmRlclBhc3NNYXNrLmluaXRpYWxpemUocmVuZGVyZXIsIGFscGhhKTtcclxuXHRcdHRoaXMuYmx1clBhc3MuaW5pdGlhbGl6ZShyZW5kZXJlciwgYWxwaGEpO1xyXG5cclxuXHR9XHJcblxyXG59XHJcbiIsImltcG9ydCB7IFBpeGVsYXRpb25NYXRlcmlhbCB9IGZyb20gXCIuLi9tYXRlcmlhbHNcIjtcclxuaW1wb3J0IHsgUGFzcyB9IGZyb20gXCIuL1Bhc3MuanNcIjtcclxuXHJcbi8qKlxyXG4gKiBBIHBpeGVsYXRpb24gcGFzcy5cclxuICovXHJcblxyXG5leHBvcnQgY2xhc3MgUGl4ZWxhdGlvblBhc3MgZXh0ZW5kcyBQYXNzIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBwaXhlbGF0aW9uIHBhc3MuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW2dyYW51bGFyaXR5PTMwLjBdIC0gVGhlIGludGVuc2l0eSBvZiB0aGUgZWZmZWN0LlxyXG5cdCAqL1xyXG5cclxuXHRjb25zdHJ1Y3RvcihncmFudWxhcml0eSA9IDMwLjApIHtcclxuXHJcblx0XHRzdXBlcihcIlBpeGVsYXRpb25QYXNzXCIpO1xyXG5cclxuXHRcdHRoaXMubWF0ZXJpYWwgPSBuZXcgUGl4ZWxhdGlvbk1hdGVyaWFsKCk7XHJcblxyXG5cdFx0dGhpcy5ncmFudWxhcml0eSA9IGdyYW51bGFyaXR5O1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBwaXhlbCBncmFudWxhcml0eS5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtOdW1iZXJ9XHJcblx0ICovXHJcblxyXG5cdGdldCBncmFudWxhcml0eSgpIHtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5tYXRlcmlhbC5ncmFudWxhcml0eTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBIGhpZ2hlciB2YWx1ZSB5aWVsZHMgY29hcnNlciB2aXN1YWxzLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge051bWJlcn1cclxuXHQgKi9cclxuXHJcblx0c2V0IGdyYW51bGFyaXR5KHZhbHVlID0gMzApIHtcclxuXHJcblx0XHR2YWx1ZSA9IE1hdGguZmxvb3IodmFsdWUpO1xyXG5cclxuXHRcdGlmKHZhbHVlICUgMiA+IDApIHtcclxuXHJcblx0XHRcdHZhbHVlICs9IDE7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMubWF0ZXJpYWwuZ3JhbnVsYXJpdHkgPSB2YWx1ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZW5kZXJzIHRoZSBlZmZlY3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IGlucHV0QnVmZmVyIC0gQSBmcmFtZSBidWZmZXIgdGhhdCBjb250YWlucyB0aGUgcmVzdWx0IG9mIHRoZSBwcmV2aW91cyBwYXNzLlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IG91dHB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgc2VydmVzIGFzIHRoZSBvdXRwdXQgcmVuZGVyIHRhcmdldCB1bmxlc3MgdGhpcyBwYXNzIHJlbmRlcnMgdG8gc2NyZWVuLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbZGVsdGFdIC0gVGhlIHRpbWUgYmV0d2VlbiB0aGUgbGFzdCBmcmFtZSBhbmQgdGhlIGN1cnJlbnQgb25lIGluIHNlY29uZHMuXHJcblx0ICogQHBhcmFtIHtCb29sZWFufSBbc3RlbmNpbFRlc3RdIC0gSW5kaWNhdGVzIHdoZXRoZXIgYSBzdGVuY2lsIG1hc2sgaXMgYWN0aXZlLlxyXG5cdCAqL1xyXG5cclxuXHRyZW5kZXIocmVuZGVyZXIsIGlucHV0QnVmZmVyLCBvdXRwdXRCdWZmZXIsIGRlbHRhLCBzdGVuY2lsVGVzdCkge1xyXG5cclxuXHRcdHRoaXMubWF0ZXJpYWwudW5pZm9ybXMudERpZmZ1c2UudmFsdWUgPSBpbnB1dEJ1ZmZlci50ZXh0dXJlO1xyXG5cclxuXHRcdHJlbmRlcmVyLnJlbmRlcih0aGlzLnNjZW5lLCB0aGlzLmNhbWVyYSwgdGhpcy5yZW5kZXJUb1NjcmVlbiA/IG51bGwgOiBvdXRwdXRCdWZmZXIpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVwZGF0ZXMgdGhlIHNpemUgb2YgdGhpcyBwYXNzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0LlxyXG5cdCAqL1xyXG5cclxuXHRzZXRTaXplKHdpZHRoLCBoZWlnaHQpIHtcclxuXHJcblx0XHR0aGlzLm1hdGVyaWFsLnNldFJlc29sdXRpb24od2lkdGgsIGhlaWdodCk7XHJcblxyXG5cdH1cclxuXHJcbn1cclxuIiwiaW1wb3J0IHsgUmVhbGlzdGljQm9rZWhNYXRlcmlhbCB9IGZyb20gXCIuLi9tYXRlcmlhbHNcIjtcclxuaW1wb3J0IHsgUGFzcyB9IGZyb20gXCIuL1Bhc3MuanNcIjtcclxuXHJcbi8qKlxyXG4gKiBBbiBhZHZhbmNlZCBEZXB0aCBvZiBGaWVsZCAoRG9GKSBwYXNzLlxyXG4gKlxyXG4gKiBZaWVsZHMgbW9yZSByZWFsaXN0aWMgcmVzdWx0cyBidXQgaXMgYWxzbyBtb3JlIGRlbWFuZGluZy5cclxuICpcclxuICogVGhpcyBwYXNzIHJlcXVpcmVzIGEge0BsaW5rIEVmZmVjdENvbXBvc2VyI2RlcHRoVGV4dHVyZX0uXHJcbiAqL1xyXG5cclxuZXhwb3J0IGNsYXNzIFJlYWxpc3RpY0Jva2VoUGFzcyBleHRlbmRzIFBhc3Mge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGJva2VoIHBhc3MuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1BlcnNwZWN0aXZlQ2FtZXJhfSBjYW1lcmEgLSBUaGUgbWFpbiBjYW1lcmEuIFVzZWQgdG8gb2J0YWluIHRoZSBmb2NhbCBsZW5ndGggYW5kIHRoZSBuZWFyIGFuZCBmYXIgcGxhbmUgc2V0dGluZ3MuXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIEFkZGl0aW9uYWwgcGFyYW1ldGVycy4gU2VlIHtAbGluayBSZWFsaXN0aWNCb2tlaE1hdGVyaWFsfSBmb3IgZGV0YWlscy5cclxuXHQgKi9cclxuXHJcblx0Y29uc3RydWN0b3IoY2FtZXJhLCBvcHRpb25zID0ge30pIHtcclxuXHJcblx0XHRzdXBlcihcIlJlYWxpc3RpY0Jva2VoUGFzc1wiKTtcclxuXHJcblx0XHR0aGlzLm1hdGVyaWFsID0gbmV3IFJlYWxpc3RpY0Jva2VoTWF0ZXJpYWwoY2FtZXJhLCBvcHRpb25zKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZW5kZXJzIHRoZSBlZmZlY3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IGlucHV0QnVmZmVyIC0gQSBmcmFtZSBidWZmZXIgdGhhdCBjb250YWlucyB0aGUgcmVzdWx0IG9mIHRoZSBwcmV2aW91cyBwYXNzLlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IG91dHB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgc2VydmVzIGFzIHRoZSBvdXRwdXQgcmVuZGVyIHRhcmdldCB1bmxlc3MgdGhpcyBwYXNzIHJlbmRlcnMgdG8gc2NyZWVuLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbZGVsdGFdIC0gVGhlIHRpbWUgYmV0d2VlbiB0aGUgbGFzdCBmcmFtZSBhbmQgdGhlIGN1cnJlbnQgb25lIGluIHNlY29uZHMuXHJcblx0ICogQHBhcmFtIHtCb29sZWFufSBbc3RlbmNpbFRlc3RdIC0gSW5kaWNhdGVzIHdoZXRoZXIgYSBzdGVuY2lsIG1hc2sgaXMgYWN0aXZlLlxyXG5cdCAqL1xyXG5cclxuXHRyZW5kZXIocmVuZGVyZXIsIGlucHV0QnVmZmVyLCBvdXRwdXRCdWZmZXIsIGRlbHRhLCBzdGVuY2lsVGVzdCkge1xyXG5cclxuXHRcdHRoaXMubWF0ZXJpYWwudW5pZm9ybXMudERpZmZ1c2UudmFsdWUgPSBpbnB1dEJ1ZmZlci50ZXh0dXJlO1xyXG5cdFx0dGhpcy5tYXRlcmlhbC51bmlmb3Jtcy50RGVwdGgudmFsdWUgPSBpbnB1dEJ1ZmZlci5kZXB0aFRleHR1cmU7XHJcblxyXG5cdFx0cmVuZGVyZXIucmVuZGVyKHRoaXMuc2NlbmUsIHRoaXMuY2FtZXJhLCB0aGlzLnJlbmRlclRvU2NyZWVuID8gbnVsbCA6IG91dHB1dEJ1ZmZlcik7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBkYXRlcyB0aGUgc2l6ZSBvZiB0aGlzIHBhc3MuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge051bWJlcn0gd2lkdGggLSBUaGUgd2lkdGguXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IGhlaWdodCAtIFRoZSBoZWlnaHQuXHJcblx0ICovXHJcblxyXG5cdHNldFNpemUod2lkdGgsIGhlaWdodCkge1xyXG5cclxuXHRcdHRoaXMubWF0ZXJpYWwuc2V0VGV4ZWxTaXplKDEuMCAvIHdpZHRoLCAxLjAgLyBoZWlnaHQpO1xyXG5cclxuXHR9XHJcblxyXG59XHJcbiIsImltcG9ydCB7IExpbmVhckZpbHRlciwgUkdCRm9ybWF0LCBXZWJHTFJlbmRlclRhcmdldCB9IGZyb20gXCJ0aHJlZVwiO1xyXG5pbXBvcnQgeyBDb3B5TWF0ZXJpYWwgfSBmcm9tIFwiLi4vbWF0ZXJpYWxzXCI7XHJcbmltcG9ydCB7IFBhc3MgfSBmcm9tIFwiLi9QYXNzLmpzXCI7XHJcblxyXG4vKipcclxuICogQSBwYXNzIHRoYXQgcmVuZGVycyB0aGUgcmVzdWx0IGZyb20gYSBwcmV2aW91cyBwYXNzIHRvIGFub3RoZXIgcmVuZGVyIHRhcmdldC5cclxuICovXHJcblxyXG5leHBvcnQgY2xhc3MgU2F2ZVBhc3MgZXh0ZW5kcyBQYXNzIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyBzYXZlIHBhc3MuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyVGFyZ2V0fSBbcmVuZGVyVGFyZ2V0XSAtIFRoZSByZW5kZXIgdGFyZ2V0IHRvIHVzZSBmb3Igc2F2aW5nIHRoZSBpbnB1dCBidWZmZXIuXHJcblx0ICogQHBhcmFtIHtCb29sZWFufSBbcmVzaXplPXRydWVdIC0gV2hldGhlciB0aGUgcmVuZGVyIHRhcmdldCBzaG91bGQgYWRqdXN0IHRvIHRoZSBzaXplIG9mIHRoZSBpbnB1dCBidWZmZXIuXHJcblx0ICovXHJcblxyXG5cdGNvbnN0cnVjdG9yKHJlbmRlclRhcmdldCwgcmVzaXplID0gdHJ1ZSkge1xyXG5cclxuXHRcdHN1cGVyKFwiU2F2ZVBhc3NcIik7XHJcblxyXG5cdFx0dGhpcy5tYXRlcmlhbCA9IG5ldyBDb3B5TWF0ZXJpYWwoKTtcclxuXHJcblx0XHR0aGlzLm5lZWRzU3dhcCA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHJlbmRlciB0YXJnZXQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1dlYkdMUmVuZGVyVGFyZ2V0fVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy5yZW5kZXJUYXJnZXQgPSAocmVuZGVyVGFyZ2V0ICE9PSB1bmRlZmluZWQpID8gcmVuZGVyVGFyZ2V0IDogbmV3IFdlYkdMUmVuZGVyVGFyZ2V0KDEsIDEsIHtcclxuXHRcdFx0bWluRmlsdGVyOiBMaW5lYXJGaWx0ZXIsXHJcblx0XHRcdG1hZ0ZpbHRlcjogTGluZWFyRmlsdGVyLFxyXG5cdFx0XHRzdGVuY2lsQnVmZmVyOiBmYWxzZSxcclxuXHRcdFx0ZGVwdGhCdWZmZXI6IGZhbHNlXHJcblx0XHR9KTtcclxuXHJcblx0XHR0aGlzLnJlbmRlclRhcmdldC50ZXh0dXJlLm5hbWUgPSBcIlNhdmUuVGFyZ2V0XCI7XHJcblx0XHR0aGlzLnJlbmRlclRhcmdldC50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHJlbmRlciB0YXJnZXQgc2hvdWxkIGJlIHJlc2l6ZWQgd2hlbiB0aGUgc2l6ZSBvZlxyXG5cdFx0ICogdGhlIGNvbXBvc2VyJ3MgZnJhbWUgYnVmZmVyIGNoYW5nZXMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge0Jvb2xlYW59XHJcblx0XHQgKi9cclxuXHJcblx0XHR0aGlzLnJlc2l6ZSA9IHJlc2l6ZTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZW5kZXJzIHRoZSBlZmZlY3QuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IGlucHV0QnVmZmVyIC0gQSBmcmFtZSBidWZmZXIgdGhhdCBjb250YWlucyB0aGUgcmVzdWx0IG9mIHRoZSBwcmV2aW91cyBwYXNzLlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IG91dHB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgc2VydmVzIGFzIHRoZSBvdXRwdXQgcmVuZGVyIHRhcmdldCB1bmxlc3MgdGhpcyBwYXNzIHJlbmRlcnMgdG8gc2NyZWVuLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbZGVsdGFdIC0gVGhlIHRpbWUgYmV0d2VlbiB0aGUgbGFzdCBmcmFtZSBhbmQgdGhlIGN1cnJlbnQgb25lIGluIHNlY29uZHMuXHJcblx0ICogQHBhcmFtIHtCb29sZWFufSBbc3RlbmNpbFRlc3RdIC0gSW5kaWNhdGVzIHdoZXRoZXIgYSBzdGVuY2lsIG1hc2sgaXMgYWN0aXZlLlxyXG5cdCAqL1xyXG5cclxuXHRyZW5kZXIocmVuZGVyZXIsIGlucHV0QnVmZmVyLCBvdXRwdXRCdWZmZXIsIGRlbHRhLCBzdGVuY2lsVGVzdCkge1xyXG5cclxuXHRcdHRoaXMubWF0ZXJpYWwudW5pZm9ybXMudERpZmZ1c2UudmFsdWUgPSBpbnB1dEJ1ZmZlci50ZXh0dXJlO1xyXG5cclxuXHRcdHJlbmRlcmVyLnJlbmRlcih0aGlzLnNjZW5lLCB0aGlzLmNhbWVyYSwgdGhpcy5yZW5kZXJUYXJnZXQpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVwZGF0ZXMgdGhlIHNpemUgb2YgdGhpcyBwYXNzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0LlxyXG5cdCAqL1xyXG5cclxuXHRzZXRTaXplKHdpZHRoLCBoZWlnaHQpIHtcclxuXHJcblx0XHRpZih0aGlzLnJlc2l6ZSkge1xyXG5cclxuXHRcdFx0d2lkdGggPSBNYXRoLm1heCgxLCB3aWR0aCk7XHJcblx0XHRcdGhlaWdodCA9IE1hdGgubWF4KDEsIGhlaWdodCk7XHJcblxyXG5cdFx0XHR0aGlzLnJlbmRlclRhcmdldC5zZXRTaXplKHdpZHRoLCBoZWlnaHQpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBQZXJmb3JtcyBpbml0aWFsaXphdGlvbiB0YXNrcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJlcn0gcmVuZGVyZXIgLSBUaGUgcmVuZGVyZXIuXHJcblx0ICogQHBhcmFtIHtCb29sZWFufSBhbHBoYSAtIFdoZXRoZXIgdGhlIHJlbmRlcmVyIHVzZXMgdGhlIGFscGhhIGNoYW5uZWwgb3Igbm90LlxyXG5cdCAqL1xyXG5cclxuXHRpbml0aWFsaXplKHJlbmRlcmVyLCBhbHBoYSkge1xyXG5cclxuXHRcdGlmKCFhbHBoYSkge1xyXG5cclxuXHRcdFx0dGhpcy5yZW5kZXJUYXJnZXQudGV4dHVyZS5mb3JtYXQgPSBSR0JGb3JtYXQ7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG59XHJcbiIsImltcG9ydCB7IFZlY3RvcjMgfSBmcm9tIFwidGhyZWVcIjtcclxuaW1wb3J0IHsgQ29weU1hdGVyaWFsLCBTaG9ja1dhdmVNYXRlcmlhbCB9IGZyb20gXCIuLi9tYXRlcmlhbHNcIjtcclxuaW1wb3J0IHsgUGFzcyB9IGZyb20gXCIuL1Bhc3MuanNcIjtcclxuXHJcbi8qKlxyXG4gKiBIYWxmIFBJLlxyXG4gKlxyXG4gKiBAdHlwZSB7TnVtYmVyfVxyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cclxuXHJcbmNvbnN0IEhBTEZfUEkgPSBNYXRoLlBJICogMC41O1xyXG5cclxuLyoqXHJcbiAqIEEgdmVjdG9yLlxyXG4gKlxyXG4gKiBAdHlwZSB7VmVjdG9yM31cclxuICogQHByaXZhdGVcclxuICovXHJcblxyXG5jb25zdCB2ID0gbmV3IFZlY3RvcjMoKTtcclxuXHJcbi8qKlxyXG4gKiBBIHZlY3Rvci5cclxuICpcclxuICogQHR5cGUge1ZlY3RvcjN9XHJcbiAqIEBwcml2YXRlXHJcbiAqL1xyXG5cclxuY29uc3QgYWIgPSBuZXcgVmVjdG9yMygpO1xyXG5cclxuLyoqXHJcbiAqIEEgc2hvY2sgd2F2ZSBwYXNzLlxyXG4gKi9cclxuXHJcbmV4cG9ydCBjbGFzcyBTaG9ja1dhdmVQYXNzIGV4dGVuZHMgUGFzcyB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgc2hvY2sgd2F2ZSBwYXNzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtDYW1lcmF9IGNhbWVyYSAtIFRoZSBtYWluIGNhbWVyYS5cclxuXHQgKiBAcGFyYW0ge1ZlY3RvcjN9IFtlcGljZW50ZXJdIC0gVGhlIHdvcmxkIHBvc2l0aW9uIG9mIHRoZSBzaG9jayB3YXZlIGVwaWNlbnRlci5cclxuXHQgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gVGhlIG9wdGlvbnMuXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLnNwZWVkPTEuMF0gLSBUaGUgYW5pbWF0aW9uIHNwZWVkLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5tYXhSYWRpdXM9MS4wXSAtIFRoZSBleHRlbnQgb2YgdGhlIHNob2NrIHdhdmUuXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLndhdmVTaXplPTAuMl0gLSBUaGUgd2F2ZSBzaXplLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5hbXBsaXR1ZGU9MC4wNV0gLSBUaGUgZGlzdG9ydGlvbiBhbXBsaXR1ZGUuXHJcblx0ICovXHJcblxyXG5cdGNvbnN0cnVjdG9yKGNhbWVyYSwgZXBpY2VudGVyID0gbmV3IFZlY3RvcjMoKSwgb3B0aW9ucyA9IHt9KSB7XHJcblxyXG5cdFx0c3VwZXIoXCJTaG9ja1dhdmVQYXNzXCIpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIG1haW4gY2FtZXJhLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtPYmplY3QzRH1cclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMubWFpbkNhbWVyYSA9IGNhbWVyYTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBlcGljZW50ZXIuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1ZlY3RvcjN9XHJcblx0XHQgKiBAZXhhbXBsZSBzaG9ja1dhdmVQYXNzLmVwaWNlbnRlciA9IG15TWVzaC5wb3NpdGlvbjtcclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMuZXBpY2VudGVyID0gZXBpY2VudGVyO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIG9iamVjdCBwb3NpdGlvbiBpbiBzY3JlZW4gc3BhY2UuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1ZlY3RvcjN9XHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy5zY3JlZW5Qb3NpdGlvbiA9IG5ldyBWZWN0b3IzKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgc3BlZWQgb2YgdGhlIHNob2NrIHdhdmUgYW5pbWF0aW9uLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtOdW1iZXJ9XHJcblx0XHQgKi9cclxuXHJcblx0XHR0aGlzLnNwZWVkID0gKG9wdGlvbnMuc3BlZWQgIT09IHVuZGVmaW5lZCkgPyBvcHRpb25zLnNwZWVkIDogMi4wO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSB0aW1lIGFjY3VtdWxhdG9yLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtOdW1iZXJ9XHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy50aW1lID0gMC4wO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHNob2NrIHdhdmUgYW5pbWF0aW9uIGlzIGFjdGl2ZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Qm9vbGVhbn1cclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKi9cclxuXHJcblx0XHR0aGlzLmFjdGl2ZSA9IGZhbHNlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBzaG9jayB3YXZlIHNoYWRlciBtYXRlcmlhbC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7U2hvY2tXYXZlTWF0ZXJpYWx9XHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy5zaG9ja1dhdmVNYXRlcmlhbCA9IG5ldyBTaG9ja1dhdmVNYXRlcmlhbChvcHRpb25zKTtcclxuXHJcblx0XHR0aGlzLnNob2NrV2F2ZU1hdGVyaWFsLnVuaWZvcm1zLmNlbnRlci52YWx1ZSA9IHRoaXMuc2NyZWVuUG9zaXRpb247XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIGNvcHkgc2hhZGVyIG1hdGVyaWFsLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtDb3B5TWF0ZXJpYWx9XHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy5jb3B5TWF0ZXJpYWwgPSBuZXcgQ29weU1hdGVyaWFsKCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRW1pdHMgdGhlIHNob2NrIHdhdmUuXHJcblx0ICovXHJcblxyXG5cdGV4cGxvZGUoKSB7XHJcblxyXG5cdFx0dGhpcy50aW1lID0gMC4wO1xyXG5cdFx0dGhpcy5hY3RpdmUgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlbmRlcnMgdGhlIGVmZmVjdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJlcn0gcmVuZGVyZXIgLSBUaGUgcmVuZGVyZXIuXHJcblx0ICogQHBhcmFtIHtXZWJHTFJlbmRlclRhcmdldH0gaW5wdXRCdWZmZXIgLSBBIGZyYW1lIGJ1ZmZlciB0aGF0IGNvbnRhaW5zIHRoZSByZXN1bHQgb2YgdGhlIHByZXZpb3VzIHBhc3MuXHJcblx0ICogQHBhcmFtIHtXZWJHTFJlbmRlclRhcmdldH0gb3V0cHV0QnVmZmVyIC0gQSBmcmFtZSBidWZmZXIgdGhhdCBzZXJ2ZXMgYXMgdGhlIG91dHB1dCByZW5kZXIgdGFyZ2V0IHVubGVzcyB0aGlzIHBhc3MgcmVuZGVycyB0byBzY3JlZW4uXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtkZWx0YV0gLSBUaGUgdGltZSBiZXR3ZWVuIHRoZSBsYXN0IGZyYW1lIGFuZCB0aGUgY3VycmVudCBvbmUgaW4gc2Vjb25kcy5cclxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IFtzdGVuY2lsVGVzdF0gLSBJbmRpY2F0ZXMgd2hldGhlciBhIHN0ZW5jaWwgbWFzayBpcyBhY3RpdmUuXHJcblx0ICovXHJcblxyXG5cdHJlbmRlcihyZW5kZXJlciwgaW5wdXRCdWZmZXIsIG91dHB1dEJ1ZmZlciwgZGVsdGEsIHN0ZW5jaWxUZXN0KSB7XHJcblxyXG5cdFx0Y29uc3QgZXBpY2VudGVyID0gdGhpcy5lcGljZW50ZXI7XHJcblx0XHRjb25zdCBtYWluQ2FtZXJhID0gdGhpcy5tYWluQ2FtZXJhO1xyXG5cdFx0Y29uc3Qgc2NyZWVuUG9zaXRpb24gPSB0aGlzLnNjcmVlblBvc2l0aW9uO1xyXG5cclxuXHRcdGNvbnN0IHNob2NrV2F2ZU1hdGVyaWFsID0gdGhpcy5zaG9ja1dhdmVNYXRlcmlhbDtcclxuXHRcdGNvbnN0IHVuaWZvcm1zID0gc2hvY2tXYXZlTWF0ZXJpYWwudW5pZm9ybXM7XHJcblx0XHRjb25zdCBjZW50ZXIgPSB1bmlmb3Jtcy5jZW50ZXI7XHJcblx0XHRjb25zdCByYWRpdXMgPSB1bmlmb3Jtcy5yYWRpdXM7XHJcblx0XHRjb25zdCBtYXhSYWRpdXMgPSB1bmlmb3Jtcy5tYXhSYWRpdXM7XHJcblx0XHRjb25zdCB3YXZlU2l6ZSA9IHVuaWZvcm1zLndhdmVTaXplO1xyXG5cclxuXHRcdHRoaXMuY29weU1hdGVyaWFsLnVuaWZvcm1zLnREaWZmdXNlLnZhbHVlID0gaW5wdXRCdWZmZXIudGV4dHVyZTtcclxuXHRcdHRoaXMubWF0ZXJpYWwgPSB0aGlzLmNvcHlNYXRlcmlhbDtcclxuXHJcblx0XHRpZih0aGlzLmFjdGl2ZSkge1xyXG5cclxuXHRcdFx0Ly8gQ2FsY3VsYXRlIGRpcmVjdGlvbiB2ZWN0b3JzLlxyXG5cdFx0XHRtYWluQ2FtZXJhLmdldFdvcmxkRGlyZWN0aW9uKHYpO1xyXG5cdFx0XHRhYi5jb3B5KG1haW5DYW1lcmEucG9zaXRpb24pLnN1YihlcGljZW50ZXIpO1xyXG5cclxuXHRcdFx0Ly8gRG9uJ3QgcmVuZGVyIHRoZSBlZmZlY3QgaWYgdGhlIG9iamVjdCBpcyBiZWhpbmQgdGhlIGNhbWVyYS5cclxuXHRcdFx0aWYodi5hbmdsZVRvKGFiKSA+IEhBTEZfUEkpIHtcclxuXHJcblx0XHRcdFx0Ly8gU2NhbGUgdGhlIGVmZmVjdCBiYXNlZCBvbiBkaXN0YW5jZSB0byB0aGUgb2JqZWN0LlxyXG5cdFx0XHRcdHVuaWZvcm1zLmNhbWVyYURpc3RhbmNlLnZhbHVlID0gbWFpbkNhbWVyYS5wb3NpdGlvbi5kaXN0YW5jZVRvKGVwaWNlbnRlcik7XHJcblxyXG5cdFx0XHRcdC8vIENhbGN1bGF0ZSB0aGUgc2NyZWVuIHBvc2l0aW9uIG9mIHRoZSBlcGljZW50ZXIuXHJcblx0XHRcdFx0c2NyZWVuUG9zaXRpb24uY29weShlcGljZW50ZXIpLnByb2plY3QobWFpbkNhbWVyYSk7XHJcblx0XHRcdFx0Y2VudGVyLnZhbHVlLnggPSAoc2NyZWVuUG9zaXRpb24ueCArIDEuMCkgKiAwLjU7XHJcblx0XHRcdFx0Y2VudGVyLnZhbHVlLnkgPSAoc2NyZWVuUG9zaXRpb24ueSArIDEuMCkgKiAwLjU7XHJcblxyXG5cdFx0XHRcdHVuaWZvcm1zLnREaWZmdXNlLnZhbHVlID0gaW5wdXRCdWZmZXIudGV4dHVyZTtcclxuXHRcdFx0XHR0aGlzLm1hdGVyaWFsID0gc2hvY2tXYXZlTWF0ZXJpYWw7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBVcGRhdGUgdGhlIHNob2NrIHdhdmUgcmFkaXVzIGJhc2VkIG9uIHRpbWUuXHJcblx0XHRcdHRoaXMudGltZSArPSBkZWx0YSAqIHRoaXMuc3BlZWQ7XHJcblx0XHRcdHJhZGl1cy52YWx1ZSA9IHRoaXMudGltZSAtIHdhdmVTaXplLnZhbHVlO1xyXG5cclxuXHRcdFx0aWYocmFkaXVzLnZhbHVlID49IChtYXhSYWRpdXMudmFsdWUgKyB3YXZlU2l6ZS52YWx1ZSkgKiAyKSB7XHJcblxyXG5cdFx0XHRcdHRoaXMuYWN0aXZlID0gZmFsc2U7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJlbmRlcmVyLnJlbmRlcih0aGlzLnNjZW5lLCB0aGlzLmNhbWVyYSwgdGhpcy5yZW5kZXJUb1NjcmVlbiA/IG51bGwgOiBvdXRwdXRCdWZmZXIpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVwZGF0ZXMgdGhlIHNpemUgb2YgdGhpcyBwYXNzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0LlxyXG5cdCAqL1xyXG5cclxuXHRzZXRTaXplKHdpZHRoLCBoZWlnaHQpIHtcclxuXHJcblx0XHR0aGlzLnNob2NrV2F2ZU1hdGVyaWFsLnVuaWZvcm1zLmFzcGVjdC52YWx1ZSA9IHdpZHRoIC8gaGVpZ2h0O1xyXG5cclxuXHR9XHJcblxyXG59XHJcbiIsIi8vIEdlbmVyYXRlZCB3aXRoIFNNQUFTZWFyY2hJbWFnZURhdGEuZ2VuZXJhdGUoKS50b0NhbnZhcygpLnRvRGF0YVVSTCgpLCBub3QgY3JvcHBlZCwgbG93IGR5bmFtaWMgcmFuZ2UuXHJcbmV4cG9ydCBkZWZhdWx0IFwiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFFSUFBQUFoQ0FBQUFBQklYeUxBQUFBQU9FbEVRVlJJeDJOZ0dBV2pZQlNNZ2xFd0VJQ1JFWVJnRkJaQnFEQ1NMQTJNR1BVSVZRRVRFOWlOVUFxTFI1Z0llb1FLUmd3WGp3QUFHbjRBdGFGZVlMRUFBQUFBU1VWT1JLNUNZSUlcIjtcclxuIiwiLy8gR2VuZXJhdGVkIHdpdGggU01BQUFyZWFJbWFnZURhdGEuZ2VuZXJhdGUoKS50b0NhbnZhcygpLnRvRGF0YVVSTCgpLlxyXG5leHBvcnQgZGVmYXVsdCBcImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBS0FBQUFJd0NBWUFBQUFCTm1CSEFBQWdBRWxFUVZSNFh1eTlDYmhsVjFrdE92YnBxMDlEa2lJa1VCSTZreEFTSUgwRGxBUWlJSzF3UmZTSlR4K2k0Slg3dktJaWdzOEhYcFh2cVZjdnJjQzlhZ1E3SURUU1NXZ3FDUVFsaURSQkpLa2toRFNrcVZQTnFWT25QKzhiLy9ySDNQK2VaKzE5OXRsem5WVGx2VnJmdDcrMVQ3T2F1ZVpZNDIvbTM3UUFMS05rMndIZzFwSVRsQjE3bUMrUHAxMVczWC9MSHlUMzJ2aGc0OC81U092K1Bud3BzSEE3MEpvR2x1ZUIxaUtBcGVxenZPem40NEdhdFRCNzZYemhkN3N1QlI3K1dXQURnREVBd3dDRy9MNTRiL3BvRExySHV2dm03MFoyQXZoc2MrUFZjeHNjQlU4RjhDOEFEZzUraXBJakQvUGxHd2ZnanU4QjkyNEU1c2VBUlVmTHNpTm1xUVcwSWpMOCs3TDJOWUQvN0NPQnpmY0NtK2FCOFNWZ2RBa1lJUkNYS3lEYXg0RWRBYW5MNVB1TlBsbE52WERsQUh3RmdQOEFjQzJBaFJJb0RYYnNZYjQ4ZGw1V2tWRlRFM0xHRGNDOW00Q1pDV0J1RkZnZUFaYUdBWUpRUUNScURIVCtNY0pyVmI4endBVFVYSDAyTUhZZk1IRUlHRnNBeGdqQXBRcUFDWVFPUmp0ZC9CN0F4dC96NzlzQzArY01QZ2pqbHdQd1Z3SGNBK0RmQUh6VHhjVmdXQnJvcU1OOCtjWUJlTTcxd0gwVHdLRXhZSFlVV0NJQUhZUkxUbGtDWWdjSUJjQWdVL24zcXk4R1J1NEhSZ25BT1dCa0VSaGRkUEFKaEdKREJ4a3Z3N2NxaW1yK3pGTS9aTG5aRjY0Y2dMOEJZRCtBV3dCOHgvZGxXdVdhZ0hpWUw5ODRBSi8wUldCeTFBRTRBaXp5TTF5eFlBY1RpZ1c1NXhNYkFreEVpd0Vka0ovWkNReFBBaU9IZ0JFQ2NLRUM0VEJaY0trU3YrbVRpZU5jTlBOQzI2bUxOc2o0NVFEOExRRFRBTzRHY0p0LzdpdzJiZm9HNFdHK3ZBR3dtOUV4aUVnNjl6cGcvd2d3UFFMTWpnQUx6bjRFNGFJem9KalE5ZzQwMjR1eWdraitweXVBb1gwVkFJZm5nT0g1TmdDSE1oQW04U3YyeTNYRFplQmhOSXA4T3pKRThPc0J6QUtZQkhBWGdEdDgvNE8rTVZUMGo0ZjU4bzBEOFB4cmdmM0R3TXdJTUVQUUVZUmtOd2Znc3V1RFpMc2tpcDBObzBnV01ELzlIR0RvQURBa0FDNEF3L3dzQWdaQWdzMlowQUJJMEdVNklWbUt2K2YyOEtEbkh4a0EvRzBBOHk2RzczTjlrT0NqWG5oL0ViYjZPdmd3WDc1eEFGNXdMVEExVklIUEFEZ01MRGo0eUlBNUFBbTZhQ1VudjRvejQ2ZWVEd3hOQVVNendKQXo0QkFCU05ERlR3U2ZnN0RES0hFMjNNRzVQcUlZOEExdS9kSU5zOWRCZHk4QWduR1BNMk5mVUJyc253N3o1UnNINElYWEFBY0p2aUZnbHVBYnlnQklOblNMV09Bakd4SjRwZ09LRFYwdi9PU0xLcDhpR1hCb3ZoTEJCT0NRTTJBQ29UT2huWXJBZEl0WWJDaWo1SkZ6UnlJQXFSY2NBbkRBUVVqZzZVTlE3aHNNWFAwY1JRQWV4c3MzRHNDTENFQ0NMd0NRek1jUHdVaTJNd0FTY0FLYmZuWS9ZUkxGUThESFgrSUFKQU1TZkRrQUYxM2tMdmxlSWpoalFRSHhVVlMzampnR3BLZWVOellWUUVqZ1VTOGsrUGdoT05kaEl3QVA0K1hYQllDSEtJSmJ3SnlEVGdhSUFkQ0JKeDNRMk04dFlBSFA5bTRkZi95bFFPc1EwSnF0UkxDeDMwSzF3dExCZ2dTY1FPZ3NLQkdjV0hBSmVPd1JDMEJTTTFtUUlLUmJoaCtCajk4SlFQNnQ0VTBBUEV5WFh4Y0FFbnhrUUFGd29WVXhJRDlrdlFnK2MxQzd2aWRSYklEa2MyNEIvL2hUUUd1bURjQ1dBNURnTXhBU2ROSUZCVUk1cENNTDh2OEFQSTV6ZkVReDRCdWRncWljenZpU25KaFF3Q1A0Qk1DR2wrd084K1U3QUppL1c0TzRZUzYrcG1LLzJjaUFEc0FPQmhUSUlpQUpuUEI3QXZOalArMEFuQU5hWWtBSFgySkJBYyt0WWFKWE9xQlp2MjRWYzM4NlhXNWR0a0hHVys0SEZBSm9ucE9lK1lZUVpBU2hnS2p2M1BOdlBRYXhWb0k4ekpkZkZ3QVNmUHpNVXdTM0t0MXYwVUZJbG9zNm9ERmRBR0ZjbGlNQVAvcnlBRUFHTndRUm5ET2dMYmRsSUV3cklzNkFaL1Fna01NSFFGNlpBS1FjSkFzU1lQd0llQUlrOXdKZ29QSzFnaTcrUHdGNEdDL2ZPQUF2SVFQU3MwVVJUUEJKL1BwM0dTRUdSSGZCQ0lRMHhvd0J0VWJjQWo3eXM1WDRKZnUxSElBR1FySWdRUlhFc0FGUUlPUkRGaGlEWS9yTUhtclU0UVVnUjA4QWtnVWpDQVc2Q0Q2Q2t3QnNBSVFDNEdHNmZQTUEzT1hpTnpDZzJJOWdOQ01rc21BQW9lbUR6b2ltRndMNDhNODVBS2tpdVFWTUFBcDhDWVJSREF0OEdRaUo2N042R0pPREFYQUhsc0dndXNjQTJBSmcxSVBHWW14T3BCeEZXa1JOOUxzQVRnSXdYbk5zL3YvNXovOVhDZjhCTzNZQXR4YmMvNDYvS0R0KzUrZWExWWt1MlZVeEh6L3owdjI0RndNR0sxZ1dzSzJPVVV4SEhkQ0JlUlVCNk94SEFCcjRaSUNJQmQwUVdTRitYUmRNVEFqZ0NkVHJHOWNCTndFNEY4Q3BEa0lDeVlMR3N1aEZ0NnpzK2dJU3dVZW44ekVBamdNdzRjZngySDZPLzkweUFGbzg0Q2JnNElEMy85VGZMVHQrNStlYm5SQUJrT0RqeDBTd1BpNWVjL0ZyWXBtcVNBeE04RG42MENzcUFGSTZHZmhxQU1pREUvZ29rbXZFcjBDNFBnRGtCUW00MHdFOHpNRkVVREtFVm94SU1MbC9LUzczbUU3SDlkK3ZjS0hRUWNqd1cwWXU5blA4bThzQW1PSUJ1V1k2d1AyLzRzMGV6ampnOFR1dmFSNkFCSjcwdnhVQXBHcm03RWJHRStpNDcyQkFCK1dIZnFIUy9lb0FhRXdZMkU5K3dMU1hUcWhJN0NYZ25CNkxDb09KNEJpU1QraFRuRzBIY0N3QWdsQ3gzQVJvWkVWRlhuQlBwL08vQS9oWEFDYzdDUHM5L2kxbEFPeUlCK1JEWCtQOS8rcGJRampqQU1mdi9QTDZBRkRzMXdGQWdzLzlmZ0tmZ2RFL1pFcHVpUWxid0FkZTZRQU1CZ2lSbXNTd0E5QlkwSmZqb3ZHUkRCTUg0VGxjWEdoY0JPYzZIa0YwZ2pQaFpnY2h4VExaTUFjaS8wNFcvQjZBYjN0MDlFUFhjUHlmbGdGd1JUd2dKMk1OOS84YmY1cUZNNjd4K0IvYVc0WFF6NDJGZUwwWXJSeWlrenRVRncwNzA0bWY5a1hneGhPQXFjM0FBc1B5Unh4UUNzL1BkWE9GWTBXMUtIeTNRSVVHdHgrNnZkbngxdnNCK2RzVG5jbTJBb2dnbEZnVkVBbFVXck9NQjJSeUVtTUNHUS9ZNy9IdktuczZ0ZkdBbkpRK3IvOWI3Nm9KWjF6RDhXZHlRallCaDhhQmhWRUhqRUxvdVE4dWtRN1ZSU0NKQUFMd2tyK3NBTGhuR3pERDNKQUpZSkhnOXVob2k0Yng4eXRrV1V0dkhULzcrWmM0ZHcxdVozNjEyZkgyZGtRZjd5eElFRW9ja3drSlFuNElRb3E4dW5oQWhtUFJLS0Z4MHV2NEs4dWVUczk0d0Q3dS8vVlg5Z2huN09QNGMrNEc3aDhIcHNlQitkRjJBS2xGTHd1QUlaOGpENk5Qck9oQWZmbWZBOS9aQnV6WkNreVJXU2VxQkNXeW9ZR1E1eVFyQnBEYnVtL01FMUhvUG8wWEVrU0QyemxmYm5hOHE2K0VVSmNUQ3hLRXRITDVFUWpQNkJFUHlJZ1lBWkJ2WXQzeEh5eDdPcXZHQTY1eS83Lzl3VlhDR1ZjNS9zbDdxeEQ2NmRFcWlZZ1J6QXFoTjFBNENCTkFBbER5QUZJK2laOS9OM0RMSnVDK2pjRFVCbUNXeVVuT3JtVFlDTUlPa05jbExnMEI4L1JzTkxnOStVdk5qbmQxQVBMbW1RcEZIeUVCUk91V0FDUVQ4bk4rSC9HQXZZNy9WTm5UNlNzZXNNZjEzL0NwYWhHblp6aGpqK1BQbXdYMk1ZZERJZlFleFd5QkF3RVVPUURyUkROLzk4cDNBN2R2QU82ZkFBNXNxSEpEQkVBeW9VVkdrd0VkNkhSMTJYVTRrd3pmbDZmQ1hUWnpqeTU3dnZuUjUxM1g3SGo3QXlEdmdnQVVpOUV5RmdpWnFOeFBRRjYzNDVuT1diRDFIUS9ZNWZwdnVMYS8yKzgyL3ZOSGdBUERGUURuaG9GNWoyQzJxQldDSThidzFlUnc1Q0w1bDk0TDNERU9USTREQjhZOU9XbXNFdS96QkozcmdzYXlicUJvYi83QTRDN2p0V2Nvb1JyY3pyK3UyZkgyRDBBT1FnQVVDeEtFUDdhR2dMeTY0K202S2RqV0ZBOVljLzAzL09zYTRnbHJqcitBdXBxSHoxc0VzMGN4RzBCQzlISWVQTG9pdDllTmtWZjlMK0R1VVdCeURKZ2FxNHliR1lMUEFXZ2lYbUxlZFVFN2R3QzdzYUw3Q3FmUEtYaTROWWRheWtDRDQxMGJBSGxERXNOaXdaOXdBUFlia0pjZno2VDJnbTNOOFlEWjlkL3dIeFVBKzczOWZQd1hQclNLWUdiK0J1UDNqQUZERWxGSDlISVd3YnpDSUdrQnIvb3I0SjRSWU84b01PVzZaVmNBdXZpMUNnb2hhMDRCQ3dUNWdmTUtIbTdOb1JkZTIreDQxdzVBM2hRWmtBRGs1K2NHaUFlTXgzKy83QUVORkE4WXJ2L0c3MWNBWEZNNFl6aitvdE9BYVFMUUEwZ1p4YUlJWnRNREZUaWdLSlY4SDlJcTZhWjU5WlhBdlNQQXZwRUtnQlR0Qk9EY1NDV0NaZVJZdHB6cm1MeWVHTkNBeUZsMXYrSGVpOHFlYjM3MFJkYzJPOTdCQU1pN0VnQi8yUUc0MW5oQUhVOUx1V0FiT0I3UXIvL0dQUlVBMTNyN0d2OUZad0lNb1ZjRXN3RXdmRG9pbUVQMHNoS0t0SXBoYVpRQVh2MStZTSt3QTNERWRjdlJLa0dKQURRUUVzUXVoaTFUanQ5NXZCc2g1bngySU81OVNzSERyVG1VT1N0TmpuZHdBQXFFcnkwSXlDTUlDa095aXVJQk53QnZQRlFRVDdnQnVQamM5b1JZQUlIeU9FTDR2SUZFWVZOYU9vdTV2Q0dFL3RWL0Ewd09WY25wekk0N05PcmkzUUZJQnBTZWFTRFVkWUxPU1d2WUltU0dnZnRwSkRhNE1XSmJBR3hpdkdVQTVNQU9jMEJlNmVWTGo3LzRNaytoekNPWVBZcFpEQmlOa0xoK0cvTTN5Rnl2L2x0Z0wzVzNZUWZnY0ZVaGdSWTJQd1krWjcvRWhBUjFTRnlYQ09iNTdyMjhRZlFCc0pRQk1uNUQ0eTBIWUxQamU5Q2Q3UklDMFBNM0VpTW9mRjRnVkNCcDFQODQwaXgvZ3l6NTZyK3ZBTWprOUdsMzc1aUI0K0N6dmV1WmRMa2tFUEo4WkVmWC82Ujczdk9qelQ1U2k5aHVjTHhIQVZnNFB3SmdSd2g5Q0tPWEs4WUE0WkVxS1pYU1FXaDVQKzVBZnRYZkEvdUdLdllqQ0tuNzJjY3RiRnJaTkVDa2E1TDVDUHdJUHRNSDNUVnoxN01MQjVnZExnQTJOZDZqQUN5Y0h3TFF4RkVVU1I1QVN2QVJEQjBoOUFRYjliWElnQ0drNmxVZkFQWVRnRVBBSVRLZ2cxQk9iazU4c3JUSmdHNThXTWtXTWFBYlFRVDFuYzhySEdBTkFKc2M3MUVBRnM0UEFhZ1Flc3RnQzFsc0JKNEJNQ1NPSzZkRFVjd3FxYUZpUXIvMFFlQUFBZGp5K2pCaVFRZWVNU0JaVDNuQ1BVRElhOXorL01JQjFnQ3d5ZkVlQldEaC9CQ0FlUVN6Z2tqRmZHTEJCRDVueFE0RHhOMHd2M2hWeFg1VEJHRHdMNW9ieHZWQTVZcVlMNUJlTUxkNjZZWXhKcFJCMGdLKzk2TENBZFlBc01ueEhnVmc0ZndJZ01yaFVQS1EyQytCejBQbUJUcUJNUWVoQWJEbElqajRGODBLSmd1U1ZaMEZ1WHBqb0NPZ1hhd0xqQUxoYlQ5ZU9NQXVBR3hxdkVjQldEZy9sMUlFMDVFZDB5Z1pueUhkejBWd0NxRVBJZk55eDBRUXZ2TERGUUNwKzhuZlprNXVuZDh0WHdJZ1djSFNOWDBOMkNKbW5BbDN2NlJ3Z05uaGwxN1Q3SGlQQXJCd2ZnaEFTN21WL2hleTJKUzlGdk0zQkxwVVVpMVl3RFJNWHZrUllKb0FsQWgybDBkY1owNHM2SlVURElqeUJjcmw0eURjL2RMQ0FkWUFzTW54SGdWZzRmeHdLVndKZ0dFSk5tV3R4cFFNcFg5b24yZVJoVkErTzU2QWpNZm5QK2UzWHZmM053RzR4SVBUbGVpWTU1YnBHaDZVYmFmTlUwbDB6MHArNUpoNUhxWUo2YjUxblA2WFA4Y3gxMlhOSFFWZ0lRQi9iRlBWZzJPQzdRK1dnVkZXbmcvRnZ0V0xJMDZ1V2g1b2d1S0VjWFZTLzlzRUFGLy9WR0Q3dDRFVERnSmJGNENOaThDR1pXQnMyZlBML0g2VndwMktFdFZrNGZKK3YvRUlZUE45d0thNXF1K0luY2ZQd1hIVlplL2FPTDNFYndTN3h2OEExclF2bk8wajhQQXJUZ1RHWjRCeEZ2OW1JeGhPQ0dzdiswT1BZRFJnaGNMZmtXa0V1cTArRzAweDRPdGZER3orZDJEYkhtRExqTDhzaThBWVAvN0NHSUFpRUVNVEc5MnpYcVNiSCtkOVIyYUEwWG52TytKanRoaUlyT1ZESEhQT2tCcnpVUUFXQVBzWnAzb1BEcGEvWGFnNkVWa0xCSys1ckFuSkMzL25Zay9BUEQ3MDRXaUVBVjhPVEh3WDJMUUgyRGdGYkpnRk5yQmhqZDhyNzlkZUdvRXdzbGxnTkJPenk4Q2Rqd2VHOXdCajA4QUlBY2kyRDZIYWZteUFrNC9aN1NKNzJoR1lSd0ZZQU1ETFR3T0dwNEZSRmdEM0hoenFSR1FpeWV1cnFPZEc2cjBSbThJRVpqelJsa2lxQ1dvRWdLOEF4bTRCSnU0SEpoeUFiRmhEeG1iREduWk80ajBTZ0xHRGtwaWJnRXE2NlRKdy8xbkEwRjVnZExwcSt6RHFGZmQ1TE1lV3F1NUhOU1QwdUpPSWxsZytxZ01XZ0krSFB2MHh3TEEzZ1dIcFcyc0M0NDFnQ0VDYm1LemlhR3JuVWRNTzRhSGVoNk14QVA0U01ISTdNTDRIR0Q4QWpIdkhKR05BZ3BEZ1kvY2szc3RpcFJlbXZWaGMrdUFTTVBVRVlHaC85ZElSZ0d4OFkrTU5iUi8wMHVWdEgwd0V4OTRqL3Ywb0F4YUE4RWQrR0JpZUFZWlpnNWtBREMwUVdHT0Z6R0psY0dQemwxQnhOTFhEOHNrNHhmdHdOQWJBL3d3TTN3R01VbXhPT1FCbkhYemV0SVl2aWJvbm1TaXVZVE5qcmlWZzdnbEFpd0JrMGZOWkg2K1BtWDlQNmtmTm1DWEdwZnRKN1RnS3dCSUFubG4xNEJBQVl4TVltNUM2UmpDeUNvT3lyMHFrRC9jK0hJMEI4RFhBOE4zQXlDUXdlc0QxVlFLSDdFY0FTbTFRK3k0Q2tOOXBVS2lWRjVuTHZ5K2ZCYlRVZDhRQmFIMUh2TkJST2ladmZzTm5yRjRrY3ZQd3Bkc0JMQmVVMThOZjdBQjIzRHA0ZWNIQzhvQmdVbEpKZWNMUys3K1dPcEUzZ2JFK0hLdyt5b2V2Q1lrTUdLcVBKcmRFS0FSdXRhRllSczFmaUVaMHdQOENETjhMRE84RlJxWXEzVzEwcGdLZ2ZZTGFZQ3pvb3RnQTZLWGFUQTkweTM3NFRLQjFzQm96eTc3eEhGWjUzNnV0UmdBbUVhdzZnNWtVU0Zad1NYbkEzMzBxc09sZmdITVBEbFplc0xBOElPam9MeXBQV0hqLzExRW5DaVZ3a3o3a0FFeHRzR3JhWVVXZFNEWDVUbXNhZ0w4S0RCR0E3QmQzMEpzVzBvV2l2bkVPUU5QN3lHVFNCUjEwMUFsWlNVdEd5ZmdaRGtDV1kxSG5KZGNCVmU2MzI1aFR2ZWxnMkNRalpORHlnRy8yQW4wajF3S25MNnk5dkdCaGVVQzhwclE4WWVIOVgzOU9WUVNjN01jNmZDYUt2QWVIZENJVmY0eU1ZQ3luVHBYK25iOTdOSm1sU1FiOHI4RFFIbTlZT0ZVWlRLT3pvWEdoczZBeEYwSElleGNMQnZXQnVpSE44czJuZTk4UjNxYzZMNFZ5YjJvQlZqZm05TUlGSGJqRENoNmtQT0JiUW9HK29XOENPNWJXVmw2d3NEd2dmcjIwUEdIaC9YLzFpYUVJdURjQ1RJVy8xUTRyRnY4T25ZaVczYytXMmlLd1VqS2J5alFOd0wxdXVSNnNBRWdEZ3ExYnJYT21WODFQeGhOQjZEVURCU1l6UUp3RnR6NjIzWGNrdFgxUTFWV0thVEYvelpoVmF6QlZZQTF0WDVNYXpzR3ZvYndlL2pRcjBOZTZCVGg1dWYveWdvWGxBZkc2MHZLRWhmZi9yU2UxaTREblRXRFVBQ1kxZ3VGVERxTFlkQ0J2ZjZESllTTVlBVEJmT3gxa0xmajF2MWF4SDEwblEzU2QwR1VrQm5UZnBlbXRCSmdzZUlLUUFITFFjVnhhMlRudU1XMEFxdWk1ZXM4eEJJZWdWZFZWRThWaHpIbkxoNjVXTUI5QW4rWDE4SzZhQW4ydE80RVRsNnZxYkt1VkZ5d3NEd2hldnFnOFllSDkzL1JrNzBKRTkwbm93eFpiSUpqdlMzV1lOU0dVd0dISlRwUHh3d2NiQnVCcmdSWUJlS0FDbjdWdHBkVXUvYzBOSnhPOUJJeGNLdTRUVE9EemJrb25QTG9hTDB2eVVRUmIyeThIc0wxY2tmV3pNZXVGaTQwUWV6cWkreWlQaHl0N0ZPanI2L2dDRndnUDdYYjV2c3NURnQ3L25RUmc2TUdSV21EUm9leVRscGd3NjhHUlR3Z1pnbzFnR21YQVg2LzhkdGF5bFNLWS9rb3lJRDlCaHpNTDNxMWdBb3MyQWNPclpZU29xL3BKcDFWdE9EUm05WjNMUy83V2pWa3ZYT3pFdE9wS3lHcmxBVCs0U29HK1ZZOHZCR0N2eS9kVm5yRHcvdmVlNjVOQkppQWpCSVZjQUpRak9tK0RrQ1pFZWlHQU13NnNBd0Rac0pyQWRoRk05clBHaGQ0OTA0Q281b1Z1Q1pQVjZrRDQwRWM2KzlXOGRCVEJzZmRjM25rcHZuQjgyZnAyUlBjczc5ZEhnYjUxTEE5b2ZzRFY2dnV0NS8zUG54Y0FtTFZCaURxZ2V2RGFKTGtZcnB1UXh6Y053TjhBV2dJZ1JiQjhsb0VCelhEd2w0Y0dpREdmdDU4U0NPV0dlZGdqdk9KK2JQdmdSa2l1QStaanpoblFRT2lGTlZibG9hN2wvZm9zMExkTzVRRU5nRVhsQ2ZzOFFiZjdIeU1BM1FWallpaFloTEVOZ2pYOXkvcXd4UW1SVS9hc2ZkMFpjTFUyQ0hWR3l1c0pRTEtmVmk5OENTMTJUNWY3aUVDa0hwc01rQWhDRjgrbnNoV0gySS9qWHNPWU8xNDRHVi85QXBBSXJTM3Z0NFlDZmV0UUh0QUEyRysvNFBXNC8yUFBiek1nbVVNaTJOb2VTQ1J4SXQyL0Z2dXhXVVJJV0NYZzM1N2dmVGpFRE5JSG5UUlhSQ3BINXVnS3dHbDNIcE1CWFFjMHY2V0xZVm0vNWxpbWowNHJHNzYySzJ1WVk5akJrcjkrckkwM05MNVpiY3pTL2RKK0xReW9nYTRvNzdmR0FuME5sd2RNQU95M3ZsL1Q5MzhLQWNqMTIxejhCbitZOWVXUUpSejhZNmtOYWdEaDJleTVFdnhqeFFEOFRXZEF1bmVDQ080QW4xdnc1dmR6UU1tZGt0d3E3cExaUVIrZE0zNCtadW1BeHZZMVkwNHVxT0FKNkZzRXh6ZXRvN3pmQUFYNkdpd1BhTFdSMWxyZnI4bjdmL1JsM1FHem1zaXMrL3VPNzFWOU9GZ1AyZ3BQaGdyN1RHUnFSVVQ2ZHl2cjRhSXMvcG0vMnpWVU5iQlN2Nkc4ZTVwRXYwQ3ZlYzdQbzcrYlR0amxCUmxrdkFNQmtEZVF5dnNOV0tDdm9mS0FDWUJycmUvWDFQMC9vV0VBbm5GRDFZZGpodFh4UjczbVgxMEZmQ0hIRTlwVldjR0FJL1MwZ0tzZkEyeSt0d3JGWnc2SHhmL0YwUGs4Umkva3BHU25NdUR4NVQwaUFDZ1FIaW9vME5kQWVjQlVIVzZRZHNWMi9jTDd2L0N5cXI1Z25jNDJDQ09jZlgxVklaL1Y4V2U5SURtVHpWWHdQREppWHVLWFB4dERCbWE4K2x6UDRXQWdLa1B4Q1VBUEU0djVHekV1TVgwUFlKUExoQjZGSnNjN01BTW1rVnhhWUMvSzlnRytGMSsrOEFRN0d3YmdrNzhJN0dGcFhnSXdGaVJYT3dhSlpQVWJpUjB5Q1VEUmsrY0hmK1lwd01qOUhnZkk4Q2xHUHl2c1NpSDBXU0tSdVlsaXRMYi96SE0vSk9TczVDL1lJQzljTVFEWnIvZHd4Z09XOWd0R1lVQmkwd0E4bDMwNHZEUXZBY2hpbEZicElCUWhaN0VqcTZaUTAvWWhpbDh5NGo4OUF4aWU5REFzRDZGWDlIT0szUXRST1RGa3ZpTjgza0c0ZmVsSVk4RENlTHJTZU1EU2ZzRW92QUVDVUZzVGpIRCt0Y0IrdGtGZ2NYS3ZCUmlyN3F0Rmw5b3dtTzRYeS8xRzNiQUZmUHJaSG9yRk5XQkZ3SGpRQUZjdElnaGoya0JhcncwNklmLytNTTlacVRONkRnc0RvakNlcmpRZXNMUmZNQXB2b0drQVdoOE9iL3RnQVBTS1dDcDhuZ05RdGFkam1UZGx0dk52bjNwZUZZaGdRUWdoK2lVbUVhVUFVb1hNMXlSTG1XdUZMYUU5WitYSUFXQmhQRjFwUEdCcHYyQVUza0RUQUx6d21xbzZxdFZoOWtKRXJBdWRBQmlhMzhUQzV3SmdTMnhJaEF3Qm4zeWhCeUw0RWh6WGZSWHhZc0RUSjRJdnJOTjJKRk14WmNCelZvNGNBQmJHMDVYR0E1YjJDMGJoRFRRTlFMWkJZSDFBVnNRU0FBVStpbUkxb2JIeWJsbmpHL2tKazNVOEJIejh4VlVRQWhuUUlsNUN5TmdLQUdwNUxLU1NDb0F5U2g1Smo3OXZUYWdjeFVhSUJlUk5lNzlnOWdxK0RYaWc0d0d6eStQT05mVDdSV0ZBNG5vQWtHWFpWQWhjQmNrSlFnTmdyTGlhTmIzcGFJRG8xdkhIWCtvQTlMUUJpNER4SmNPVVBKVW5UZ1UyTkpVeVJPczhpckdBUnhRQUMrUHBDdHNGZDQwSC9BRWYwZ01Ra0xnZUFDVDQxUGlHb0xPS3F5ckpxM0svWWE5bU55cjVGdXNOL3VQTFBJZURhOEJjK3czcnR5bDRWRkhhTVpjM2k5UldCTTlqanpnQUZzYlRGYllMUm1tL1lCVGVRTk1BdEQ0Y0JLRFhCVFFHZEFCMk1HQm84U0NMbUV1UzFBRlZBSjNBL05oUHQwUG9DY0E4YlNERzc2WEk3YXlTZzZKWXVHZkt3SkhGZ0gwRTVCM3VlTUNlL1k0TCt4VkhBT1orOUVIY0VnUWd3YmVpRVl4Nmp3VGR6NHFmdTdFaEVKcXhHcXJ1Zi9SbkhJQUVueGd3Qk0wYUM4YVVBWVdOQlJDbW9JbGw0SFRxTzEyMlFjWmJyZ01XeHRNVnRndnVPeDZ3YTcvandodG9Hb0RXaDRNQkoxNldONGxmcjhBcUkwVFZWMU8xZmE5QmJRem92a0F5NEVkK05nQ1FVU3haQ0ZXdkNPYU9GUkVYeVV3Wk9QSUEyR2RBM3VHT0I2d1BhT3orUVB2NVMrTUEzT1hpTjlhY2xnaFcrZDNJZ3VwQkYycFBxeGN4R2VuRFB4ZlNSaDJBU2lLS2lWUDJQYVpTY3ZBS29BMFZEYzZjT2xJQjJHZEEzdUdPQjF6Ujc3aXdYL0Y2QUZCOU9OU09RVzBmckE1MHNJTFZjY2tXSnlJRFNnd1BBVmNKZ0ZiWXVaM0ZKdkFsRUhiSjNJc2dKTEdlZGVCSUErQUFBWG1IT3g2d285OXhZYi9pOVFLZzJpQUlmREpFSkhxajRTRXhiRXR5MGdrZGhCLzZQOW9aYkJaSUdpS1lWYjlHS2FONTBsUkhCTE92aER4aC81RUt3RFVHNUIzdWVNQjJRR00vZ3JiNy82d0hBUE5HTUFZK0dTR1VqQzUyVlgyZjJDRDQrSE8wZ3FrWmZlZ1hLZ0JhSGtjV3RTMEFXaWk5eEcxSW1yTGxONVhSOEw4Zm1RRDA1QlZybUVFTm1wWVNQOVFYK0tIaXFqMi84MitIcXFEV3duYkJSZkdBVGR6QWVnR3dydTJEcFJxN016cTJmcEFmME5xMFJsMndCWHpnbFo0eVVBUEFtRFNWV0RCUEhRakxjZ1RxT1o2elV2ZEtIaDRydURDZXJveC9EbnU3WXF3WEFDMU5JL1FjRVF1SzZXSy9rZGdDVEdDMFBZQVAvS0lETUJnZ2xxK2hJa3JPZnNhQ3ZpTFNvZmNKZ0o1QWRNN2trU2FDai9IcVFLVklHdkQ0c3dGOGJjQmptempzYVEySDVELzZhY0JkOXdBTEI0REZXV0I1QVZoZXJNcDRHS0lZRU9wNysyNlVGMGFTZlQveFl1REc3d0RqcklwQUVSeXRYZjJ2YWpqN3VlcnlRWFNGbDEwSy9PTjNnSVdEd0NMdmpmR0I4WjU0TytFZTR2ZTY1MTN1QjJSMXl6c3FDK3R3YkM4SGNOVmhmQWVhQnVEUC9Udnd0UzNBL2VQQUlmWUZWbFBxMkhIVHV5dWxaQ1RsaGJqaEVURjV5eFRRR2dQR2hvSGhJV0M0VlNYR0QzbjB0TGtNSFhIeHUrWXlCK01sUHdEdVpzNUs2RmxzYkN6ZFZPOUR1S2ZrSE04QUVrUDdCOGZPa3dEY0QrQjducDQyK0prR092S2RBTDRFNEs4UDB6dlFkRVQwYjE0RDNEZ0IzRDBCN0I4SFprYTlXenJEODhONnNGbStZY1Vqcm43RTFaRHZNdEY5REJnZUFZYUhnU0dCMFBOSENENEJMd0xSc0J5QXlYL2lqMC9kRFV4dXFsSUc1aGl4N2VGaHZMY09WVUF0eVBTeWRBRm1PUU5lNkVZR1YvOVpFU2lLZ0lFZ3RiYUQvZ0hBTFFDNG92WTVyNUt3dGpPVS9YZlRBSHp6THVDbUllRHVNV0R2S0hCd3BNb04wV1F6TnRBYVlTczBLNFpsT1NBakdHOWtQakNCUndaMEFCS0VCSmV4WUFaRUFVM0E3T2kxQmVEeW00RURualExVHdDR1dNVzhNWGNLa3MwWU95Wk5sUU9RamNnWUlVSGxsRXpZUTBrdG0rcjZvejhHNEY0QVh3WHdSZDgva085QTB3Qjh5NjVLbVB4Z0dKZ2NxWUpUS1lwVHYyQ0N6eWRkUUpSRE9qS2l2bitEZWg4QkY4Qm53QnRhQ1VBK1lZRXlBVThoK2M2QXo5Z05ISFJtcmdPZ21EQTNqSFEraVd1cENlVUF2TlNyQTlITndxeCttdWs5bkpWTmcvQ1Rmcm1iQVB3YmdLOEQrUGNIa0lpYmpvYjVvMTNBM1h5cFdzQWtHMWNQQTlQREZRRFpNMWlkMGkxS3hzV2ZPcktuQUZYbGlmQ0ZGTU1SY0FTaWdPY3MyTUdBSWZFOWlXWHBsUzZPbjdVYm1QYVVVVFhRcmdzVk16Y1JqNUZvbGcyVjVheVVBNUJXWUt3T3hLVWFmbm9zV2pjSndrKzdXNUYyRUt2bEUzeGNYYU5ZZmlDWXNHa0Evc211cXVnNmhjbGVBbkFJbVBiTzZZd1JwTWdqQ0FWQW0veVFtS1R2NWhOc0FmL2k3U3lOQlNsMmE4UXYvNC9NMXlGK0JaU1lsTlFDbm5WcnBiQyttVG9BQUNBQVNVUkJWSmNhSTdzT1NFWTJOcGFEWExxcFIrdkUvT1Zrc0RnSW1nR2dnaEhvWUpiVFdjN29KdEZXYzY1L2NnMkFZdmgyQUxzQjNBemdWdjk1blMvZjRRZHNJa1Q5VDNjQnJHdElUV1pmQzVocXRRSEluc0VHUW4zVUREdkVERVkvSUNmN1N4TU9yQWc4VCtjMDBKR2t2SEdkMkRBQlVZWklBT056Q1VEcHBDRmhTdWtDQnNMUXJGdFplL0lpeFlRcFN5RW9Kb3FudVBXclZSQXViUWg4M0hObFpCMjN6N2oxeXdtajZDSUlxVVB4dzJYZXU5YngyangxMHd6NFo3c3FUWVphREQ4RUlEdW9FM2hNVkVwaFdnNjZKSXA5MGswc0J4QmN5K2lQSUlhVDFSdEVzSFMveUlBcXcrVlNOUFdRZmU1dGxWRWs4YXVYZ1ZhNUJVc0VKdVQ1dW9saUFiRTVBR290bUlBakNQblI5eERHM1RRZXJuWUFVdXBUZEJHRUZNZjgzT2tBcEhHK1hsdlRBUHdmdXlyZ1NaT2hhczN1NmN3VHNVQlZuMmdUd3lGTWk4d2pIWkFBMU05ZllHSERVTEpEMW04Q3BhOGZSeERhZCtsK1lrZi8zWE52ZDExVStxaUwzOVN4WGV2U3NzaGRERnZnYkkxTzJBd0F0UlpNWnpUQlJ1REZqeGUxWGc4UUVJQjh5eWo1eVlJVXhmUUlrZmtJUm5tSENNNzEySm9HNEZzZGdISHAzQUNvTUgyRzZqTTRsV3pvUWFyU3Z3UTZNU0IvdnBvclZhRmtoK21DTGxwVlI4WitkcURaTG9ET3BIU2lRZUFGRGtCalBybGdDSGdDVWFGaWZnNjdILzl1WWpuNEFpMXZwVEVSVEFBU0Jhb1FKQkFLZU5xSGxMNm13UERaWUFPUk9hZy9FWVJrUFgzNE13SEl2elc5clFjQStUTHBJMjJHN0VjUUtsSkdzWUlKaEM2Q2xVTWlYZkJUYkZVUUFlajZuUFMvT3VBbDlwT09xSWMyQkx6ZysrM1ZtV2dJRVV6ODJjUnVDQXRMSUhRUW0wZ081MnVPQWIyMnNDM0pFV2dSZlBwWmYyc1FCUUlnTHlkUEVJRkd3UEVqOE1sRjJiU2JzdWxnaExmdHFzQ1hxOUhHZ0h5c3puckdnaTVxelRVVEZIOEZMaEFVbjNoSUp3Q04wSExuY3czN3FhRjJ6b1l2dUtOaXZtUUl1VU5jN0d2V3Q2c0hOczI2dHdBNnZoeXE4TkVNQUhseW50RnJEQ2NRZWh5YVBUbCtGd0FiWERjbUFLTVJUaGFrRWs4UThrUGc4U1BMMHF6TEJsK0E5UUNnUjZ1WkdzM3ZmSHo4VHRCWnZrZ0dRckVQQlZBVWcyU2lqNTBRQU9qaVZLSTNzYUFESlJtN2RTTFlXZlNGRGtDZW0vZGhaZU15OXBQWTVRdlNEWVF5VUpvRElLOHFNZXpoM3dZNmZTTDQ5UGNHZ0NBQThwU2NKTElnQVVZUUVtejhSUEExN1N0dkdvQnYzOVcyNGVSRWlCb05RU2dXTkkxSEJrZGd4SlN3MUFJK2RGSWJnT1lta2ppbVExcjZYWEMzckFiQ0h5Y0FneXRvaGY4dnNCL3IyS1JhUnE3enBaK0QzN0hNWDBzM0REY0NVR0xZYXc1M01KNFlVT0R6dXNxbEdDUUFPUUNlanV4QThVVUxVa3hJd0FtTUFwOFdhM3FrTi9SOVcrc0J3T2hJRVBqazVTTHI4SGVLRmJUUWZiNzdjc1BJTUhHbC80TVBiUmVzbFBoTmU0K01pVHBpOUFGR1Y0bkk3TWZ2YWdOUUxoL3BmclluREFTOGFKUTQyQTJ3NGVtMmNBeVdRVXVKVlFUR1dMczF1TDdERzlKMVJqaEEranZZazR0M0tYZU1xaWpwenJ1ZDRBdDl6M1h0UDE2eUdmaktabUNHb29ZaDF0Wnp2djh4WFBGbDRQb0pZQzk3azlGbHdaV0QrQXppL2RlTVpXZVAxM2VRQ0dFeW9FUnVkQ2hJamJiM21KWXdIN1YwUUlLdUN3ai9nZk1qMGFzbjJJMEZYUlNIWGZML2lSa05nTHllVmo4Y2NNWS8vSjFmeXh6VEFYVDIreG9RVmlLWUQvMWhEcUx4UGlZeFRnU3ZRcnBocGhHOTd0ejRTbHFhZm5qN3VrMWtJUURacnZXVHc4QjNqd0VXK1JMeFBnU2lDRVJkUHdQUjcrd0NQZy9ndWxGZ2ZydURrT01Ra0ZjNXg4NGU3MDhKQU1tQ3VSTkJYaTRUSWc1Q0dSekdpQkdFL0Q0RS9DMnIydmNBWUpvaWZ5NjJpMGFKU01oQisySUhvTnd1MGZrY2pRODVwdTNhY2s1bklCUkVxbmVZRnlXTGtBWElKSEVTZTAwQ3l4NVF5ZUw2Ri90eUVjRGNyT1cybjdmWDhkZjBtTUUrL3ZRL1BRamhveTNnem8zQUlTWWY4ME1RYVF4MXBlSDl3Yjd2Mm1ydG1DQmtJTU1lanAzaklKRDFNc2F4YU1aOHY1Ti82N0lOQXNCM0JBWVU0Skw0RFNvMUoxNUFGUEFFd3VRSFpKemtLZlVBdE9ITEpTT1FSV25kQllRdkNRQTAxY2ZuTm9wZnNhQ0phRDJiYUJuNzlRalNUaU9FUDFFY2F3SXBrcTJrZWdCVE5nSFdFcE9LRjhVd3EyTlJGUE00QXFDZjQ2L3JBMlU5L3VWRHZ1ckIwMXp2QUpwaWl3T2wzZkVlY2lDR0YrSWoxMWYrUWtiU2ZNUGZJenF3NTdtRUZaOURsM1BzNUhYV0FZQnlISkFKS1Y3TitzMGNDUVFod1NsZm00bEdaMEtCOEMvckFCZ1pVUzZaSElUQlNFaENvd1VZQUFrc0Y3Y1N0V1JFeXhSd3R1UHBPbGd3KzVzOXNxNk9hSUpJSWxVZ0VoQTFlZG9UZ0h4YTlIVnc1amliWk5GK2ovOXlHUUEvN3BidWpaNGJ3djIrY1dCNnRGbzBOellua3hGQStjdkVBbzQzVkJvRW8yZSs0OEVNWEVPbUQ5RjZ4aENFOFJ3WkVKODBWYmxLdkRsbXp3aWNmcXk5My9vKzhLOFR3QjJqVlNnVzEzOEZySlFUWEJObG5KZ21yalp3YW5vdzlDQlAvckw5d0YwandBR1dEdEZ5b045UEh1dG5JSFQwNW1QWHo5M2RNR1FBUG5pSnNqaUJYaVRieERaRk1GOU5MVVBReEtSNXFlenoxWTYvWVpESDBENkdrZEFrWUpJdlJhbEFkSEFNbVBab1loYjZOaERXdkV5Zi9tYTczN0NYTjdSMVpDN2hVYlBnY0ZncXQvWlpqQURuTTF4cUVWaFlCcGI0Q1VrNVVzTDdqUXZqLy8vNWJ1RHJMZUNPRWVEK1lRY2hZd0c5VklmeWcxTmFac3pGaUNINkRrUkdMemU1L2RnazhJTVdjTUNqZENpQ3pSOG9kMUI4T1R3dkpNOEpFU2hGdXQxZnpNaGkrZVJKcjZMSTdoWVAyTS94Vkx3S05vWmpVVHdSTUFRUW1ZeWhXR1F4c1NBRE9mbFo0a3VrajdQaFo3NWJFVGpCcGtBR2FoTWtjckdnd2hzWGVDeUJIQmoxd21PQlF3dkF3cUt6b0ZlUlY4WmFlcmpLWUF1aXJtUFkvbzlYN3E1Q3lyN2ZBdllNQWZ0Q1BHQUVvWWxCaVZ0RndManRwMlU0aXJqN3lPQU5iaStjckh5cmZDYlRxdUpWNDRPMEYxRnJ3UUdJTVpGcWRRRHlQL2dHU1o4VEMwWlJSc09sVnp6Z2FzZC91K3pwTUJ5TGVoQWZDZ01RQ0R5R1pKSEZDQ2dMWjJmOG1nSTVxYXVFY1Z4OWU1dkFDVGdDVHdFTVdyNVRkSXBXS0piNU12cm5vb2NEc3d2QVBBRzRWTEdnNlVLZXFtaTRpdUR6NGVyMzBvWDBGUDd1NW1vTXZJZjdXOEIrandsVU5BekZubFpDSWh2R0ZSQ2VXenJnWFNTSUJyZVhURlpTZ1ZMSEFwNFVIT0Z1b2NpRUVzbjJQSndsL1hFazBkemZTb2plZXJGZzFJT281QktBdmVJQmV4MVA2N2xnVXpnV1FhSndMQUtSSDA0aTE0SXRnREtFdEdzUm5XeDQ5YjJWa2s5d1VlZlRHcktDRjdSMEp4Wk1xeE44Y21QQXhXY0FjeEdBQktFQUtQQTV1OWxFYUFiQ21LTUkrc0ROMVgzeitybzI0d0VaRmMwVkVFNjRBQmdUMTgwUEY5WmRCY0RiNkpwcWNQdFBrKzFBQ2JtS2pKbmxsd3l1SUx1bkVBV2paSGtCc3JzUlVuZkQwcUVpQzVJSmZ5aXNnTWh6V2hjUDJPMTRSbzRXYkFTZ0FNUUo0OFNKd2NobUJDREZhOHFweUJiU1A3T3ZVNFBRMHAyVzcrTFNuU0pVRk9ySTRWN3c1SW9CVFFRVGZKNm9UU1lrMm1RY3BHUnlIMnN5R2pJRjZFTTNWL2ZNKytDMUNmd1VFeGhDc216Q2FRVDQzbFpDM2UxaEJwRUhoMzZYRXFyQjdTY21xNWRWMFhaeG1WOFd1REZ6QUY5aXdob3c5c2VBR29CY0d0S2pxQWMrMWw5ckxiLzFpZ2VzTzU1eXNtQ3JDOGVpNkl4Uk1BS1RXTkJpNlh3OTh4TlRGVWkwakVjbXBZZ1JBUGhkZHBWaTlPSUVQUDVjWUQ0Q2NMa0Nvb0hQd2FXOWtWK2l3V3JRSFQ4dUExZmQzRjdERnZnVUhVUDJrOGpUaW9nQXFMb3hGcERnYk1qOWpYU3VON2k5ZExJZGF4ekJwNVhWQk1JTWdGRW5GQVBLVDlxUGQ2QTlCSUdJN01mUG1mNFUrNDBIekk4bldncTJQQnhMNEZFa2pLSml4R1JSRnlRUVB6emQxaUFVekNBUWFzMVlPbUFFb0Zqd2tlY0RDL1BBd2hLdzZDeElrQ1h3T2RWSkx4VG9iTWpCZHlJZ2Z2aW1Odk5KN0V2ZjRqV3RkblJZRDFZTkdWdUc5M1ZXdVdzNEpmK21sWkNDWnh3UC9jbko2bVhWS2syK3RLOGxRUVZIUlRHYzY0U0RBWkIzRXkzSmN4eUFDa1RvSng0d0hsK1l3cWxvR0RJQ21ZbVRGZ01RRkJFVDh5eVl6eUFHL0FmV1g4bUNHUWcwQlRSb0h3dDlLVmFQRS9IUTg5MEFJZmdXSytDUkFhTVJZblZkeEhiaGRZOFdzbHcxVjkzVURzbVBJajlHeGdpQWlvUlJNSUpOdm90aStTVy9Ja2QwZ3dBVTgrWHhKY2JHSVRKUER2STZYZENGUkVGU2tuVEI4M3hrYTQwSDFQR0Y5ZG55Y0N4Rnd5Z2tLMGJBU0pRU1ZBYkFZZUQ5OHhVQWU1VTNqS0l3Qm9zU2dOc3VBQllvZ2wzL0l3Z0ZQck9JZzFYYzRacnBBc1NydnJ1eWtsMnVjeWthcGtNTWg0Q0V4RDVEd0pmV0FZQXh3azRNS1BBSmdPSWpHU0VHd3VDYWtSaGVtdzZZdjBVVXdSZjdMMDBMOXBuc054NlF4NGZlWTRPOHBERWNpeE9qc29US0twTVlqU0ZZWWpPQzhFcTNXbm5yMFlZUyswVG1pMkh5c3JQR0xxd0FTTll6Qm5UMk16MlFEOTFsYXhMQjBnczEyR0FoODFjZi9vL09jSHlKK3FqMFMvenhuaFVaYlN5WVdhTDgrUnEyUzI5d293aVdrSlBhbjRNdmdyRERHQWxSZTdLSXl3RElnUjNtZUVEV2c5SGJKZ0FwTlRrWG84bzBpN29WZ3huRWdGcjhGN2pFZG5VNUd2cWZKUUtRS3lFT1Bsc05JUXZ5dnVwQUdIUy9Pa3Y0cXY5b2grUEh4TUxrOGdnQkNSeHZBbUVOK0FpRXp6MmlRZlFCZU5ta2g0SzUyaEpCS09hTmUvRlNMb2JMUlhDejQzclFudTJ5aTlvTVNNRHhzMmpvODMwM0VSejF3c0NHWkVDRjRrZDNEd0VZWXdKamhvTmxRcmdJamxZb2RiQlByd01BWmZFbXl6Y0l2MjdnczZYRHpDL0lSMURPZ0E5YTZEUno0d1pBc1orTFlYdlFZc0hvRDR6aU9Ga2xuYTZZRDMrbm5VNmRaN2JHREFjQlVJbUlBbUVVdy96YkoxaS9zY0dOREppTFhtbGUzUmhRK2wvYXE1N2dVUUNXend3QktQZUxzWi9MRnJHZy9TaFJYQWU2NEFqa3YzMGtBTEFqRjhSMTFEeTNLN0tSd0pjc1VUYXFXU2NBUm91M3cvSU5WbkNIK0EzNm44UnZNM25CNVhQNG9ENkRBVEJZd0diNWFqbE9MT2g2WDhKYUJLUkc3Nys3eWdHWXAxYm4rVjI1LzAxQXpCbndRMXlwYW5EN0tXZkExUURZQzN6SklqN0tnT1V6YzluRmJldFgvcitPNWJpd05oeVg1dVNFRHI1bzB4c0p3THA4L200QTdHYUpVdi9qMy81K0hRRllKM29GUFBraG8vaE5lcUJjTWtjQjJCQUE2WHJ4bU1Ca2ZGQWNpL20wSnB3elh3MFRYdlh0enJ6K1BLYy9NbC91Z3pNOU1EcUNBYnova2VWampHY1FBL1lMdmpvZ3VvMW1Sc2xSSTZSd2ZzaUE1bnFoTDVENm5zY0Y4Z2ZUZGZ4cFMrL2hMenZXZnpNUUNvQjFGcS84YjNWV2FQSURacXNSVjY0REFMc1pIVkhzMWdFdnNxRkFlQlNBcFFDOHBISzkwT3FsNFVFQXl2Q3dOZUdjQlhOTE9QTUxmdGdac0k3NW91VXI5b3VzcDJURXlJSi9zVTRBekMxZStXSUZzaHlBSFBaUkVWd0l0cnJEM3dHQWhpYlRZQmh4VnBlL3hlUHlyTkJ1V2FvTnAzRGdGd0M4MU8rUkFlcEsvYTVMZmU1MWp4cjdKd0E4M25QWFlncTFhc2wweVg1TjQ4K2Y0VkVHTEFUbEsxdkFvNVlCMWdCU1Jtc00rTkZFNTdsY2ZQRDVwUEZXQ0pJbXR5dkdnR2ZPQWFjQllPNTl6RmdsZ0hnUGVmWnNYVjYvZ1BYQlllQzBSVmd5Sk5PR1l1SmpQa2E5ZUhXZ2pMOWJXemhXazAvbi93UG4razhiZ0ZObWdZY3NWZmxabkJSbUlTaHRKTS9tN0pHaWJHQm9PSUllejl3S1BQNEFjTnB5bGZiTmxHZmRJKzlOakJqejhKVnpwcGNrWnVKK2RCdzRhUTQ0ZHJrNmoxTElZOUprUEQ3UDRzMmx3VkVHTEh3Sm5uY3NjTkloNE5oNVlNc1NzSG01bmRPdTFCR0ZUaEo4L0s2SnJadG9zbFNUMitYSEE2ZnRCMDVaQUU1Y3JnQXVwczVUZmFMNkVGK1V5SWlmM2dBY093dHNYZXA4MmVJWVk5SmtYcE1nTXAvQWVaUUJDMmI4T2R1Qll3OEMyK2FBTFF2QVJnSndHWmhZN3N3RXpiTmE4OElSdkFWTzFxa0Y5MUozNkROT0JFN2VEMnlmQjQ1ZnFwaExuZXZ6ZEdlQktCZkw4VVg1L0NaZ3l5eXdlUkhZc0Z3eFlIelJOSzZvZXRTQk1ETGpVUUFXVFBxUG5ncHNuUUsyemdLYkNNQWxZTU1TTUU0QUxyY25SNkpZUUl3c29VbmpwRFJzdE9MeTdjQkpCNENIVUd3dUF0dVcyblVEVkgxRUZVaHljU3dXakdENjRtWmcweHl3Y2FFQ29JMHo1UDNYNVA2bldsSGRnSGdVZ0FVQWZPWU9ZTXRCWU5Nc3NIRWUyTGdJVEJDQURrSXpTSlpYcENPbklnMjV1UHJoZ251cE8vVHlod0xISHdTT213VzJMVlNpazJwQ3JEc1Fza3pOSUJHSXBCZEdJK1ZmTmdNYjVvRU5DeFg0eVBSalBqNHhhSjArV0dlRUhSWEJEVXoyTXg0RmJEb0liSnlwQURpeFVBRnd6QUZJOEtVSkNoTVYyU1VhQUdjMWNFL3hGSmVmM0ZZUnRpNjRua3FXRHJxcUVoYnJzbTV6dlpDZFBDZDhuSHpKT0xadUFCUno5aFRIWndQTDdMbkxub05NSVkyVnlhS2NqdFpMSE9BYk5nTlBuZ0tlNEJhY2ZHRjFwbnlkRCtocGhRLzhYVjVVaUV1ZUxHbkROMXRXWGovMy80Y1R3QVV6d0dQY1JjRkppRHBQdDNGTG1mNXZqd0UySEFRMnpQckV6RHY3T1FnNU9TTStTY1lReTVYYm84NDY1dS9aZkxUSjdmS0hBZHVtS3hWaDh3S3dlYWxTRTZpbkVvU3kyTVdDZGJVSElnaHYzQXFNendIamk5VkxadUR6RDhjWHh4V1pzNWM3YXBtVzBmTUJuSUhLbjVYN2Q2STVucHZSejk0TzdMZ1h1R0lSZUpTYitYbDF0enFmbHlid1J3cWY5aTk3QlFSV29tV0pRN29aVkZ0Sm9xRFgvYi9vR09Ec3ZjQlRBVEI5Z3NmR3FtemRqdFZ6K0crUEF5YW1nWW1aQ29EakZFMmFuQ1ZnMUNlSndPTW5UUkIvRG1VSU5Wa2tnaWEzeTA4QnRrd0RXK1lxQUZKRk1EMVZBQXc2WEc2MVIzMU85L2ZkcmNEWVBERG1ZMHpqYzFVaml2QnVBTXgxUWRNQitXQVlYVThkaEVVMTZkT1NrcHBiY0hGU3JuZzhNSHduc0dNUGNONXlwVVJIcDJ4TUlhN3pEejJ6OEduL2tWZTBZb21PMHdFd0JZS3VqTDd2L3pIQTZDM0F4Zk9WaDU4ZzVBc1p4eDRmWk03c2YzaDZCY0R4V1dlR0JaK2NNRUZpd0dFSEhSbkR6dW43T05Icy9kamtSZ0J1bnFsMFZET1NISURVM2N4U0Q0YUVhamhGWFM0SDRTMWJnVkdOMFY4d2U3RTBGaDlqVkRHNk9icjFMSk1Sd24ra09DYVRFWVQwZHNmcVpIWGwvcDdQckxpOXdJWTdnTzBIMnlBZ0NBV0NXQ293S3JZRThuTUxuL2E3UFFuOVg3eklKUFBrQ2NLKzc1OHk3eDdndU5zQjZsOThnWmpMTFlldDNBeTVuMHN2NFIrZkNZeFBBMk1Pd0xFQVFMSURQeVA4dUJnMmNSWW16RndlQVlpbEtrbitPQzgvRmRoMENOaEVBNG5HQTQwa2Q2RkVTMTNXTE84djFxSEtBZmg5QitEb1lqVTJBay9qcy84TkFJd2c3T1ViN0xDQytXQWZCNENwQkpvSWlUUk5SbVMxbDEza3FXaDNBZHYyQThjZHFxcDFNQithSU9TeFd2NnBxNUQya2tJQXZ0OHJGN0JMSmtzTi9qTXFmYTd2KzcvQWs0QjNBNmNlcXBhc0tNcTVha0FtbExXWTM3dDhaVzk3UERCMnFBTGcyQnhnQUZ3QU5FR2NuSTVKY3JEWlJQbGthWEw0dTFLSlVBZkFqYlRRNTl4NmRTdmRMUFhBZ0dZc2haV1I2SklSYVhCL053Rkk4QzFXd0xNWHpNZVN3TGZjWHVLckEyRyt3ckxDRGNOL0lJZzRFUlJuMHF2eXlTQVFYNm1HMVh1QTRmdUFiVE9Wd2t0UlJyMk1MQ29ReXZFWi9VWS9Xd2pBajNqdEZKWmtVNzlnMWdoa2dFQmY5OCswVW1iLzNBMk0zbGtCbC9mT2NkTW9rMkVqa1p5djg3NzNMQWZnSERES2p3Tnd4RVV3OXlhaWxwd2R4QkFFWWhCYkF1R3pHM2FLa1FFSndBa0NrT0NqbGI3WTZTWXlmMlV3bEFTK3ZLWW5BWGpmTm1ERVg3REVmQTVDalVjc256dmJ1MW5EdFVNbUNEa1JaRUV5R2RsQWs2RzZsUVRTYTZtME1QNkh1WTczQXhOVGxjSkxaNldPSllDNS9DTnhMcEhNZ2RLSUtObDY5UXZ1Ni83NUFqSE9pVFU4N2dLT09WaUpiNzQ4QktDV3JuSy9tYVRBKzU4QWpNMEFvN1BBNkx4L3hCQXVwb1lEQzlva0JSQW1QZEJaNDdsTkEvRGh3TVJzeFg3bVBnbCtTcm1LNUVhUk5Sc2xYRlE5Q0tCOURrQURuNzljWnRrSEZreXNKMTAzZUJicWxoOTdEcG1UUVRZZ2s5Vk54dSt4WWJYS1UzbGhGb0pQT2dkRkdZK2xQa2dReG9ra2dGOVhnajRBdmZvRnM4NGVYNEtlOXg5ZklDK3RSZkR4dnZuaWlmMzU4c1NpcjJMQ2o1d05qQktBYzhDSWkyQXh4TEN6SUFHWTlMN0FoR0lLZ3BBVHc0bDh3VG9CMEpqUHJmVGtwK1NMUWJIck9xbTVqTnlhalM2VkNNSXBBcERBV3dRNExyR2dYcXpJZm5xNWN2MHZOMFpYSFRJbk1FNUdCTkxiMURHZE9ZUXNJN0FmR0tGamxncXZlOHdKd0c0VCtmdUZBRnl0WHpDTGIrVmdXbkgvZklHWWZjNDZIczdpSEM4WmtQY2RYeDRWZlZYSnc4K2NBNHdJZ002QUhTTEtXWkNURVNmTGZnN1dzSXlSRjNja2lSUStIQUNYa3dIcHR5UDRLSHJwSnZLVkduT2hSRjllQkY5d0UwbVVFb2d6MndDK1dHSS92VnhpUVFJeEFzOStybUhBNkUxWUZZQjhESndRTVpsME9yTForK2k3c2ZUOHpyb1lITFM5ZGY0UkFDV0t4U1p2TFh6Ry9mUUxacWsyZ3FuMi92VUNVUTlVWmFNOXdEYVBlU1ByQzRBNUMxS1YrTklUS3dDUy9TaUNSL2pSQkRsTG1QN25IeW5zeG5vMUlQd0pTeVJwYmlNQURYenVQRFlmWmZCVEVvQW1jdVZRZGlhVzB6d1h3UXNDWURZbU1hREExd0c4VEJTdmFvUjBHNzdFY0dTRVQ2aGpPdlZBcGZSUEFVTjB6anI0NUp6VmNTcWlUeEQrVmVHelhrdS80TnI3SndESk9reEZJd3Q2ajYrUnFVcmxrTzRiWHpwMWdDQUF2MDRBemdMRERzQmhLdWdMRlV2UVVoVHdDRUtibktDdzE0SHdKOWNEZ0dROVdlZ1JnREk4WEVjVkVEdkFsN2xWbGdsQWdpK0k0Q1IrWmYxbUxHZ01tREZoQkdGZkRDaWNSSkZFUnZpU0FCakxTN0ZDME1GS01VKzA3d09QRTBrR3Zhb1FnR3Z0Rjl6MS9pT0Rrd24zVldvRVh4cmVzNWliOXh4MXdadWZCQXdMZ0FRZXhiQUQwSmlRd0pPdUpCQTY4L0gzWmhrNiszQ2lmcXF3V05NS044d2pLZ2JrNmdXSmdDK0ZNYUJiNXZKVm1zVWJWMnZDcW8zY1JXWmNDSUFDb2F4NTMrdWxrcU5kN2lxT2NVMVdjQzljeEVtNWtRQlVkWitzVG5TTC9qRXRUV25naTIxamhKTkpCaXZaQnVrWHZPTCt5WUJrY09xeEtqSjRBR2d4ek1yQlZ3ZEFNbUhyWk9BWUYybDZ5L213VjZ4RDE3em1XbzZNYlJ5ZVd0T0h3eEo5MUlJaHI2cnFaUzcwRFBQTFhEVlVyZkJ3ekhLcjFFVXA2L2gwVC82TC9HY0Nxc2x0NElob1Rjd2RBcURTczdJNjBXUUg2UjMyOXBIdUZ5dVhESm1FanVPU2JkQit3U3Z1UDViR1VqbXNBNVhvVXZjdkJYS0tBUW5BcFVkWHdhaDBiOGpYUjJZekpUc0MwWkhCMzNGTCsyeWlYM2gvMVllRDFmRlpHVDgxZy9INnlxa1ZhOVlFcHFNaFRBRGxlOGVySEE2dDdNaDZqNFpCWGRCR2pGeU80Q1NJbTl3R0JpQnZncXh3SUFKUWxYSXlFSkx5SS9pMFNrQUcvRmJoYUVyNkJYZmN2KzVkTEtoQ2c0ejFDMUhFQko4K0JPRFFHWlhmay9xdUFaQzZrZXRBWkVRQ1RXQVU4UElKdDBmZ3dIelp2VldOYUtxaTdKTE9tdERXRnk0MmcxRnhIL1hmcUdrSUkwQythMHRuRGtmc0d4UWpuM1ZQc2s3dFhtdXkrWHAwSmh0b0pvc0FhRmNVQUpVWUtpWUp4Y3FIcUtBSDlyUGxHMmNNcm1DVWJNWDlndU1McEdUY0NNS0RsWkdoTUs4SVBuUEluMVg1UEEyQXdlZ3dFRVltREdCTWpPSTV3aEdRUDNOUEJUN1ZKbFJOYUt2RjR0MklXSGJERXJ0RGxTazFwNGxKNy96ZDI0NnRnbEdacnlJZnJGaFE3cFU4V0NBWDBaRU5HKzU3VTE0WjRZckNlTHJTeFhkZXY2VGZMd3JieFQ3em5NcmZLUVhmSExRQ255dm1SSXYwUTM0MzBlek1tTDk4UDM5M0czd3F6NmFtMU5ZenpvR24rc3ZxUm1UQVUyY2l0Y3RxQVgvMkVJOEY5QUNFbUxIWExaR29GeHRTbDJ4eUsyYkFZd3JqNlhyMTIrMW5vTC9qVVRDRDl2dkZybjZ1MHYxL252R2thb1ZCQVFpMGV1bW1NQXVYUUhNV0pBQTdnQ2l4RzhVMGdGZmNYZGxCS2s0WjZ6RUxnQUpmWkVLcnhwQzF4T0lsLytTazdqa2NkWWxTY285MHk5K2dLNnZKclJpQUREMHBpYWQ3UnVGbzN1ZE5DZ2Z0OTR2Q2RyR1huK3R1amdWM1FBY0hMY0Zucm9lbGl2SGtjaEVMOHVlMHVRNzRTM2V1YkFJVFMzSVFoS2tNUmpCTW9rZ1dHM0wvLzJ6M1ZTblA0VkRnUVd4VUVFVXhBWkZITDBlUjNIRGZtM0lSYkRIa0JmRjB6eTRFSUtOaFN2cjlnb0dFQmR2VHovTUlZUUxRZFZzVHdSVEZEajVqUW1kQXJSRFlKUU5EU3M5NjFSM3RQaHg1TlhvVmdveGxlSG5hcmpvaGdMZWMzRDJISTQ5MnlRTnZJd3ZxTzlmSm05ektHYkF3bnU2RmhhUDVwRnVNZy9iN3RUYnBCZHZUejY4Y3ovekk4YXpWajhpQUhUcWdtRkhYRFVCODlSMmR0YUM3dFVHdzRrRE9nRmIwUjJ3WVJER1o4ZzlPOGFVNFh3UE9jemhpd0dsTWpxcUxXaUZZR3U1NzB3QURGc2JUdmF4Zzhua293N0U4bk0vYXRmS3psbjYvMW1TNFlIdjZCUTQrWjBCYnFIY2QwTnd3WWJWRDMrMXlXaFhKeFBCcmJxOEFxRS9YQXBTcUF4aUJWMk1aLzU0RE1PWndLRTAwcm5EVVdjUjVLaVYvYnJqdFNBTUFMSXluKy9tQ3llZWhqSVlwNmZkcnZWRUx0aDhSQUNseUhYeG1oUGk2cjFtOEZNMHVjZ2s4K3k0UkhDMWtBSy81WGdXKzJoWllvZmFmV2NQcTFCNUFxRHFFWXNRM25lcFIyZ3FoVjJ5aW9sMUNPa0QwQythT2FvR3g0YUw3RFFDd01KN3VWd29tbjRmbTdWclgydS9YQWxFTHRoKzVzSFB0TitsL0FwNnNYMmRDc1ovcGhaa0lKZ3Y5bCsrMXdiY3ErMldGdjJOWElqTktBUHp1dzdNVUFWOERUdXluRklFc1F5ODNSZ1RBaGl2K05nQkFCYVFPR0UvM213V1RMd0FxSG5hUWZyOUdud1ViQVJnRE5CVWxrcHpRYm95WUN5WURZZElMZGYwbDROZHVXOWtHb2E0Z2VOZGF6TEVsS29BM1ByeDdEb2ZpRVR0QzZYdkU3aEdFekpscGNpczNRZ3JqNmQ1VU9Kb1lEY01nbHJYMit5ME5QdGw1VVpVamtmeC9IcWJlY29lME9aemRGMWdIUXJsbjlCaGVlNHMzZjNaeG00TXZBazlWU0ZkVUl3MGkrUTJQYUJ0SVNpQlNTRmdDWU1qTVcwME1QN3B3dnZMRG13RmdRVHpkSHhjT1NHdkJnL2I3WlJaQnlXWUFsT0VSbHVLTTNSYTlDS1djMHE3M2RUQmhNRlQ0WndJdzlsNUxycGVzK0hqZUJpR0NVT0tYZXVCdlBjS1RpRUlPUjBmK1JoREJNWWkwTGhlYTRHVGFhNU5iT1FBVkR6aGdQQjFMYTVSc3NWM3JJUDErN3l5NU9BQURvQWNoRUhCa0ZiS2ZHUnBpd2VBUHRNczVJRk5va3lPR2svN3JBWUM5T2hCRndOWFZZMWF0NXRmdENCSGFXVlMyQUpkRWNFaW5yRE5DK0x1bWl5YzFCOEFCNCttdUxBUkFYVERDV3ZyOTNsUjQvWjBYdDZPREZRa2o4V3R1bUV3SFRLRExRZWpBZk4zdWRzL2Rmam9RZGF0R0x4YjhqUUJBWXo2L2JveGlGZ0FWdWR6TkljMi9zM3hMazFzekFPUm9CNHluKzJEaGFBVEFHSkN0YnBrQ1lxOSt2NFYrYUJnQVE0aTY2WHRhQzg1WWtEb2cvemRadnpVZ2ZOMU43YTYzM1hxdjZmZTltc0RJSGZOYUI2QXkySlJFMUFIQUVESWZJNW56WkNMZU40TmJtOXlhQStDQThYU3N1bDZ5cVYwckoyV1FmcitzcGxDeUNZQlIvSEp5S1g0cGhzMFBLQlowbHFPWVRwdm5pQWlVQW1BZCtIS2pvMWN2RGpIZ3IrM3dQSlFzVkN5bVVaclBNdVJzUkJERzRBUUNzdW55SnRGR0h3QUFJQUJKUkVGVWNjMEJVSmx4UW9INjJxOFNUOGNnZ3BLTkFGUkd3Q0Q5Zmt1dmJ3QWt5R2dKRTNDK056MVAxcTkvVDNGMUVaQnh2Wmg1MHM2QUVZQzV5eVVIWHQ1L1E4ekk1L0tyQW1BSWtraXBreUdQWXdYejFhUlQ4djVaTzZqSnJSeUF2S092TlhsTGF6c1hzOWJvL3p0YzI5UG9oZ290cDVKNDlSY2ovcHpmSXdHUy8vM09NNENOZDFkcG50UXBGVW1qRUg0TFlJZ255bi9PTGpMOEZlREdod0piTmdGakk4RElFREE4QkF5MVBGSzdGU0tmNDNjTktydkh4KzhDL3ZteHdNZ21ZSGdFYUEzNUowU3RwdnZ6TC9uUDhSYkxBZmh5VDIwN1RDaGdEUml1L1pMOURzZldOQUJ2WXpiaENEQktvQkFrL3BFb2JHV1RxcDgxOWh6UTEvMGswUG9hTURFSmJKanhWWkZnRGFkMFNhVU81TGtzV1ZqK1hTY0RtdzVVRVVESjZVNGQwblZiQzkxUzNvdmZWSHA1YWw2NGNnQytrN21aQVA3NjhLQ0EwV0QzQS9pZUx6MDkwQ0RjZVZtbEF1aEJsakxncmZjQXc2UEF5REF3UEZ3QmtDQWJJdE00YS9GaU50RVJqQmw3Nlc5ZmZEMkFid0pEZHdGais2c3lJbVJYcmQ1WTJGaklZY256V1BMRXFuc2ZDMHpzcjZxQk1RbWZJRFIvcHlKNnhNaEt5TXJTRGlLRDJ4amE2VEFEVHQwL0FHQXMxS2NBVUNGck9MRjZ0YnRpUlZGYXZUL3d1TUNhN01mVlRsSDA5OFlCZUJjd05BSU1FWUFVbFM0dUJVTE9tSzNMQ253T1BBTmxFSU9Tb0Y5K0M0RHZWb1dYaHZkV1pWT1lxV2dpM3ZPWERVUWhnaWVCMEVFbFZpTVlKMDhIeHFlcW5HOEQ0SUlEa0F6bzUxREtRUUp2QktVbUtBQ3piTTQrNWhVaXZ3cmdpd0M0THp2am1nQ2g2bkJjZ2lNVGN2OUFibzBEOEU2ZzVlQ2pmcFVBNkF4b1FJemdpOEFMbVd3QzR6Ly9EeGNQUHdCYWs4RFFGREI4eUpQcFBaSGVHQ3lDMEtONURGQ0J5Zmg5LytPQXNla0tnRXpDVHdEMDQ3WDBTQ1BNMUlZUWpDdjJFL01Kb0dWd1VVUW9QYm9xME1kcWtXVm43UnRERE1haEI0ZytQNnFoWEZwalZ0a0R0UkdBMm5Lam9zN0l5T3lIRlViSXJYZTBGWHNUdXpJWWZOYjRPMk0zQVRHSVlRT21QbjZoRzZnaTNlVWtRUUFlQUlZT0FVT3pBTE1WaDJwQWxFU3FHRkJBWEFZT01RVmp4bGwwM2lPL3lZS1JBVDBGUVhrd1pranAxcHo1MUxPMlhBVDNLdEQzQUlBd2o0V2cwNWtmaXVVSFlsc1hBSkxWblAwSU5MTTBPWUZ4NzhBemNSeVNlVHN3MkFKdWVJK0RqMkZuZTRFV0t6NU1BME16RGtDQ2tBQnlVV3FzSnphckVhbnpqMnpYd2pFR0ZIdUdZK3BZc01vanpaTDFHOUVCZXhYb3UzMzlJUkJyQzNsSkdtTkR1U0hYK3c3V0M0Q202d1d4bThEbmdMVEltZ0M4cEJjR0J1VFhmLzFmWG55VHVnbkZ3eFRRT2dpMENFQ3lJRmxzdnZKZkVuaDBtaHNZSS9zNXV4RllpMXhab2Y3b09xU0Fhd3dZalJHQnpZR1hidFdYYUNJcmx2SFVhZ1g2U1AvcnVNVllDRWJFcUVDWEFNamZyZWUySGdBMEVTdXIxLzB2dG5Od0dTc0cwUnNaTUUyMC8rL1hXSDZNdWdrL3luZ1BBR3k1R0RZQUxqaUlISWdSVUlyc1pqTTdBeCtCU3gxUzRwZmZmUVZJZXA4ZEw3ZE1Ec1RHakpCK0N2UXhUSG1kdHJ3NGwwQ292RnJ1QzJOT2U5NzVlZ0RRc0NYUksvZUs2MzRKaEJLOTBxMkM3STFpK0d0MGp4RjQwazFjUEpBQjdVUDJtM01HSkFBRlFyR2VpOWlVVEg5eUJVRFRIZlUzQjUrQk9JS1E0M0JXdE50UGNXSU96RVpFOEZvSzlLMERDR054TGkzRnFhS0E5Z1RnZW9Gd1BRQW9JME91bFdUMTFvRXdpRno3Y3diRXJ6TnhXdEVZQkIrVlk3NlZoNERXckg4SU9vR1E3T2NnMUNxTVJMUGx0bXh2czEvU0hhUDRkY0FKZVBZeXlVQ1JJenJUQjh0RThGb0w5RFVNd2w2MWtRUTg3Um15MlBTMnJnQjBhMWNpMThSdWRFSkg1N09zWTAyeS8rODMvc1pkQktyNEZYUVRBcEJ2cHJHZ1FDZzlVRUFNK2g5RjZ1Z0pEa0MzZ0pQQkV2UkdyWW9ZQ0JYOUl4RWNTNUs0aTZjWkFISXc4b1hRNG1MQmIzNVlINWQ3T2VrYWR0VFYxVVpTamFFSVBING5RellOd2dqQUhOd0R1V0dZcFpjN2x6UGZYMWNRdXI1b0JvcmZ6RGYremkweVZUdVNrdXhCSTJRK1BoUURJVUVuTUxvMVRCQ1pMdWZHdy9peGJRYTBLQjhDVE9EalBvaGRZNzhJUW1mRGptVzdZby9kb0FYNkdxSWlBdERIYVlzd1NtZU11YlY4MWtwMTFMNmh5MlBkQWNnYmxmc2xPS0MxSWlLUm15UnhaZ1YvOCsrRFM4QkZyeFhpNUhkL1U2TWVTS2RxRXNFS2hwQlJzZ1JNYkF0dUc0S1UvKzlyeTVicnpQL2xQVk12MUVQT1FlZ2hhcnJWY2daVWhWSEZ4TlBjcDlWRnRsT1drTDQzN0MwV0FCV3lwRlJHc1Ywc2I1SG4yellCd3ZVR29LbDEwdjFrbkRnbzB5N1hBOFBmdjBVQUNuamFLMzNDbzlnSlFBT2U2NEZrTnZ0WkFIUWRqejl2Mk56MkdTYTNqWWVqMlczS0d1WjlpeEdkSVZTb0tUMTNCMnM1QUhrR2hlU1Q2cW4wZXJIdjVBSWdBQVUrTFZmdy93cTNDRUFWN2NsQktEREdaRzkvNW9WWHgvb3lZQVJjemNxSDVHeUg4ZUZwbFRhd0Z2QXRydFhMR3BOclFER2JlanVwQjNvbWxJSFFHYy9FcnpPY0dTUnM4enJoQWJidUwxVGNvL0pmYkxsTndIT21pMmtJY3Mzb3diZHdOcFl0eW5EUWhzRmNndnVHOS9ZYXBHRnZZWDIyelpjQVUwL0d3QTJMSi80QW1HRjltd0ViQnU5OFkzY01GK3VBR1FDajJIVnAzQmJQdW8zSWxxeEF5NXdIQXE0T2ZBUm1FQlhHZk5JQmEwQklzRzBlY3dDNjdtZXJIZ1JwWkx3b2NyV2FvdnVUeGV3L1YwdHhKUTJEV2VhZTNXQUdiZGhiMkRCNCt3Unc3dzVnOFFwdjg4bGl5R3RvV0h6TWk0QzlmQUVIYkJpOGt3VUt1MnhOQWRCeGFHQkxiSmRadXgxTHdBR0VDWUFFbTZ3eWZwZWxKckVnRm5SRHhFU3dneVV4SVVzVk13alZ5NUFZTzBiRzg5QXV1MS81QkYzOEtxakJIbFVBWVhzdGVOQ0d3VGVXTnV3dGs0Sk1rcmx6R05pekExaG02OWcxTml4K3pET0JXMGFCZVJaWkdxQmg4TTRlbWZXTkFERFQrenFNalF5RVNkUUZIZkRiWkVDQ0xSZ2RIZUNUZThDQmFLSlkxckRuQlJDSUF1R1c0VFlBWmVGRzhadU1rR2lRMUlFd0dDSnRIWkJteTFvYkJzdlZNbkREM2pJQWVydGkzTEVCT01qR2NPcGEzV2ZENGljOXQ2b3ZlRHRMZnc3UU1Iam5INndQQXliVzZ5YUc0KzhENEhJUWZ2dERJVnRMZWpwQkZzVnZVSTdOSUJIdzNEVWpSekwzckRWdHNZUE9rQVNjdVgzY29ORHluVDJWWUpDa24rUGpxdlVEOGhWYlM4TmdqcGhHeGNBTmU4c0FHTm9WWS84MjRCQ0J0SWFHeFJlOHBMS1pkcE1rVHZYaUoydG9HSHpTTkhEUFNjQXlxM2VyNHFQeUdhTmM3SkNSWFdMVDJUandHbUNPZVFhc2hxNitxU3BabXA4dm9qUXBoZUY1OG5jZFpWakxualdQSHI0VldLVEt4ckhHVXFxOTdxWHUzanAwd1B5K2VFQy9EWU5ac1pBTzZJRWI5cFk5bE5DdUdQY05WODMwWm1rTTlkbXcrT0tmYmRjWHZKTVBkWTBOZzAvN0duRFhLY0RNY2NCUzdNd2RLejhLQ0FLUUlnWTBNV0dDdHI0VE9IQWFzTXdPa1RxZjZ1bnl1THlrZmQyNTRua2I3cXN3L2lWZzdqaGdtU1gzMVZwZDl5UkhlTHgrelJoakVHUmJCNndEWVQ4TmR5bXl1YnpEekNDR2ZwTUpXZlNSWWZyOUhQL2FNZ0JtN1lveE5RSE1iUUhtK0lENmFGaDh5UzkzdEF2R1FiN2RhMmdZZlBvWGdidFBBcWFQQSthM0FFdWJnR1UxUk02QjA2MGZna1JvQ3pqK1RjRCswNENGRTRCbGRaZFJjNC9ZeGx4Z2pKTWV3U2l3TjF6V2ZzT25nZGxqcTNFbVkwOHZtNWkvN2o1eUlNcXB2dXBLeUdvTmc5bG5nWW9zbDl3WS8wZFpkck16WWw4TmU4c0FXTk91Mk1BM3p3L0YyQ29OaXk5OVhidmZ0cmNMcml6NlBoc0duM1U5Y005eE1PRE9iUVlXQ01BTndQSjQ5VWxpdVc2U2FxcUJuL2dHWVA4cHdQeUp3Tkl4d0RLNzZhaERlTjZ1WFlDdVl5QUJrRXphNExicFk1V0VXZFNMeGpGMjYvZFFCMFNKNnI0QnlBTjZOUXhta1djcXJuUTAweDFERURKRmpSOENjTldHdldWUHA2WmRNUTZPVk9DYjN3QXNjUEo2TkN5KzdQZXJrUDVRM3RCWTFQclQ5dEV3K0p3YmdQdTJBbE5iZ1ZrQ2NDT3d0QUZZY2dBdWl3V2xNL1hxRGpNRWJQOXQ0TUIyWU81NFlKRk1vLzVnSEljQUxWMVRSWjE3RlhPaFB0dmd0dmtxZjlINGt2SERseUtLNGw2Vnp2VlNCRjIydXdqT2I3cGJ3K0NmY3dCU2t5ZUZFSEFVeC95dzlKVHlFYm8yN0MxN09sM2FGV051QWxnSW45UXhPMnRZZk5sYks2TXZheGVNUllxdXZMOXJUY1BnSjMwVHVIOExjSEF6TU91Z1gzUUFMbzIxV1hCWkxFSHdSRjFPZ0hTMmVPZ2JnSVBIQTdQSEFlek51N1FGV0ZaN0puWEo1cm5xeEhFdWx2bHp3eVZOTjMrd2VybjVZb3ZsN1NYTEd3dm40cmlMV080ZmdNUkpYY1BkLytwbU95bUVMRWhSekJ4SkFvOWdWTDRrd1ZuYnNMY2NnSEVwV2kzZXBvY0NBTWVCUlU1ZVRjUGl5LzZxdGwwd3B2aEErMmdZZk83TndPUW00T0JHWUdhRHMrNUV4WURHZ3FQK2NjQWtJTmFWcEI4R1R2NGQ0T0J4d053MllHRnJ4WUNtVjBZeExOWWhlQ1hhdTdFaFYzZ2EzTGI4ZzQrUjQ1dW9HTEFEZ0hXcWhzQlhBOEsxQVpBRHlSdnV2dGtCU0FyaCtpOURzUWhDT3RmMFVVZ1cvN2FpWVcvWjArblJyaGl6b3hYd0ZoeUFpNXk0ckdIeFU2NnFBRmhUM3JEU0lWZHBHSHplbmNEZWpjREJEY0RzQkRCUDF1WDFDTUpSd0ZpUUlCenhpZUwzS0lZMVlXNU1QT3hOd0xSYjhnczBhZ2hBc3MxR1oxTytTRkhzZFJQdDBpL1BMSHUrK2RGYi94NG1YZmhjYld4aGZDdFlNRnIvdVd2S3hmRGFBY2c3aXBQQ3ZGT1ZwdW8zSHJDallXL1pBK3JScnRpNlRTNk1WUStMNE5QSDJueDY5OEduWEYwQnNLYThJYWI0ZEZacEdIeitKTEJ2QXBpZXFBQTRKOENQT1F1T0JCQU9WMENVWWJJc2tSa0FlY3J2QWROYlhjL2FEQ3hTcHlUNENFSXlUZ1JnbmVpTElwM25QNmZzK2E0QTROOEI4LzQ4Q1VDK1pHSkEyOWZwdUxteEpXKzVoNWtORmcyamlXSFNpMHIwVXY0cENvWnN4dzhEVWZuaGQ0VmswWEdkR3ZhV1BhQlYyaFZqZGpnQTBCbHBrUS9LOWJtbi9IT1ZxdENsdktFQnFsZkQ0QXRtZ1AzakRzQnhCNkRBN3RkYmN2WXpKdlFKa2lpMm40Tk9lTXBiZ0prdGJZUEdBQ2lGM3dGb0V4MVpNTmUvNGpuUExYdStLd0Q0dC81U08vaU1CY1h1ZXNIeWx5QUNNQlBEZ3pHZzdvcE04bUVISUdkd3JmR0ExckMzN0FIMTBhNjRZcjRBUHZ2T1Nkd0VQT1ZiS3h1K0sycGRLUlRtZEkzZHFrUFBWZ2JTVEJHQVk4QXNBVGpXbmlCZHgwUXhKeWxPRkNjcjZIQml3MVAvQ0RnVTNFZ0VJTVc1Mk04WWtMb2xRUmRkSU4xQXlLV2lCcmV0ZjlNSlFONkhzYUNQeGU0cnZnRGRIT2NPeERJQWNtREZEWHZMbms0ZjdZcXQ2M2dFSUIvWW9qKzRwOXhhQWJCSGVVUE04cUYyYVJoODRRUXdOUVljR2dkbXg0QzUwV3FDRm5nTnNnU3ZRK0R4dTRNdWlhd2h3SUFYVmsxTytlL0E3Q1pnVGhZMWRjbm8xbkhMMm9ESXlaVUxwQnNBRlRCWjlwalQwUVFnbjJWNnVmUmljUzhRUmdiczVaWXBFc0VORGVqQmZwb0xyd0FPamdJelpNQlJaMEFIb1VDK1NPQTU2eEp3TmxFeVRGdzVGeEJQZVd2bHpwbmJBTkNkUTFlU0dUUnliTXV5ZGdNZ2dWQnNLbXRZb0M2TXQ4em5aeHNaTUx6QXhvQU92c2greWREcXRYeDRGSURsOEwvb21RN0EwUXFBODJTL0VSZFRJMjJtTmZhVHVCSUl4UjRCaEtlK3k2MXB1blFDK015dEkvWnovYzlFdXZ5QmVldExBZkdaNVdPTVo5ajIvZ3FBQkIxZk1Mc0hBVkJxaGZUY3lINWQ5TUJ5RWR6cytCNTBaN3ZvR1pYK056TlNzZDhjd1VjRzVBU1JLWWJkSFJOWXdoaERJSFJnR21PMGdGUCtISmgxNWpPWGpueUtibFZUNUNiZm9xK3lKT3N6RjhQOCtWbk5QbElDa01BemRzL1lMeGxZem5ySndJcE82ZWdUUE1xQTVaTkRBQjZpQ0NZQXlZQmNCcVRSUTBlNDYzMFN4WnlRSlFJdk1KOG1TZUxyWWUrcC9HekdmblRwRUlCeTZVUy9vdXQrSzF3ZyticnM4OHJIbURPZ0FWQ01uckVmeHhNdGUxTXQ2ajd1OXp6S2dJWHpjekVCT0pJQjBCbkNKb3FnSWZERWhNNThTV3pKRVBHSmU5aGZWSDQydW4vTWZ4bDliZ1NpQnlTSUJXbkFKQkRHRURBQjhRV0ZBOHdPMy9hK3dINCtyZzRSTFBZTHVsOHRDSThDc0ptSk1RQU91d0ZDOXFNSTlnOVowQ3hoWno2NUswd2ZGQlBxdTdQRXlWZFdBT1RIVmxUY3B4aFhIWkx6MXcwWkE2RURMaGtDc2tSZjBzdzRkUllDMFBRL3ZWU1JBWVBvN1FDZGo3R3FWT1NNZUJTQXpVek14WmNETXdMZ2NLWC96YnY0NVNRbEhYRElnYWdKYytialpCcUFXaFVvSC9ZK0IyRDBKN3JGYTZMWURSbXpvbXNBYU9lS3F4RXZiV2FjSFFCMDhKa1JJdGVTWGlTQkxZSk9MQitYNHhyekF6WTd2Z2ZkMlM0UkFLa0REZ1B6TkVBSXhNQVNTV0YzOFdzZ2t1WEx5WFRSU1JDZS9EZHVTWk1CTXdlNk9iVGQ4SkJqMjRBb3QwN3VET2JQUDlYc0l6VUdGUHM1K0pKL002b1Q0YnV4SHY5WDdCZVk4S2dPV0RnL1o1OEdUQzlYcTVGeFRYT3c5YzNDbTZrNWZQY2pnYkhiZ0FsdlZHMnRIMVQzT2F2b3E2QmxuaVorMTJuNXUvMnNEYk92YXNxb0ZnOHgyTG5iY2QxR2RoU0FoWE4rN3FNckFDNHNBOHNPUko2eUh3RDI4eitGdDRmZHY4VXlxVURyRG1DRUJjcFozOWtMUzZhcTlsNEQyckxiL0tZc0ZUUFdkZmJ2aDg2dlF1MnMxSy9LK3pJalRzWElWUTlhNTlFZ3M0WTZzWmZJQS9FY1NwL2pFWHY4QldjQWh4YUErU1ZnU1FBa0dBTUlDY3dWbE5MbHFUYzlHYnYvSEFBN01yTDQrZjFWbFh3clVxN1N2Q295R2NycldwR2h1dXIyZk5HWXdNOFlUNjdoVDNzMUxhWnZxbjVNTE0wYnptSE1tSUZTZ2RGTmovbUlCY3Q2M05oRlp3RXpEc0JGZ3BEUGVhbk5nQVRmQ3RHc1g5VElLd05yZzl0dVZraGxuZzdUSS9ZQXJYMVZrWEtyRWUxbDJTeW5OMVJDc0ZKc3FuUXYzVUlNeGh3SVJqVTVBR045UVV0ZVZ6M0JVQXZhaHVOZ2pDM0h4TEFORDduQnAvY2dPTlhGNXdDejh4VURHZ0NqS1BidmV2bHpjS1VISDJhZzZjbll6ZXBZQkI5WmkyRnhESmRqb1hKdjFXREZpTEo2TUtxS1pVem9RRlRmajJIbXdUS2NUcFZXdmN4SEttNmtLZ29PUkFFdlZjbFBENk5kekxYcE1UOElZTlBjTFY3eUpHQjJBVmhZckFDNFNOQTVBeEtNOXJ5RFBFNWZzNmVlVktXR1oyTTNTM01RZkV5SlVLVjhMMVpwSlhwVko5cExpbG1sQXhXa1ZKSEt3SWhqakQ5VHRWWFZtMUhkT3kvcEppYU1GUldNK2JvMHJXbDR5TTFON29QaFRKZWNDOHdSZ0F0dEJqUVdkQkJHRVN3Z1NpVjBQYjlEUmd1MFRZMTlOK00xbVJLaDhuaXFGeDNyUkRzTHFqZ2w5eWFHWFQ4MHZjTDF3bkUyNTJQQVpDekFIUUNvaXFvVzN5WVdGSXQ2NjRmVXBLYVJFcjFOUGFrSDZYa3VPUStZRHd5NEZNU3dnVThHU1JTejBVSngzVngvNXZGTmJycy9FaUxSWSt2NEFDSVR3dzZpSkVvZFFLd0JJeUJSdjl2d2hLelVXNno2NlRVR0V3aERTM2V6cXVzQXlOeG5Kbjh4YTFLUlBTRnRzOVlmRkIvUURaY0FtNzhDbkRCVDVVOHJDcWpmYzN5aDhHbi9oR2QvTXNLZjErUXpZSjQ4OTFKeWUxM2l5MWNBRTljREorNkZwWXJFa2lkeEROM090WFIrRndCR01lem9NbXhKTE91bUF1RDRKNHJ4SnJmZEgvWENvTEdGVktpVWJ3K0xBUFFxV1dhTU1McmQ2LytKeWNTSW04NXc5bE9wdDFqMU13QXdGVGlxQVdFVXhlWUg1RU5uL2pJblVWSGVNWFEvZi9qUmVQdkNhNERoVHdMSGZCYzRmckdxcWFOSnpMUHc2aVp4VitIVHBsRkd2WnJYWlQ0NU4zOStIVzNUdWpsWnY4RDZmcDhIUnE4RHRzOVhJT1I1WXRha2dCZ2RycnJ0NVFzcThTc2QwQmhRNEhNd21WaXRBV0hBWS9MYkxEUU5RRGFUVko4UTZXNHFWQjUxT09xRFpEUFZCM1RMT0JlcFc1am1xYUxiZWMzakdnQkdNU3h2dmVtRFlrUTlHb0tGMVNoVUNTS0NxQmVRcnZtZlZaUEMxa2VCalhjQ213OTExdFRKOHE1WGdPTGFRZ0EreC9PZFdBMkVHWjk4Z2JqbGVUSGRRSFFOKzJpd2xzM25LMy9aaGozVmVRaG92WXpkeG1BclN3UWdEUkEzUWlTQ0pVclRuamZsNEtvelJDU0NDZVltdDkwRW9KSmJWQ2svMStGaUN3Rlp4TGs0ZFJmTEZpYTZ4OExiWWtEOXY5Y1h0TEc2K080QVlRUmZyZ1B5Z1ZJY3F5aFRYY1dGT0pIOGZoM3J6N0VLd25VQXJxOG1jR3dLMk1DQzFpN1dZN1plbmg1NmZlSFQvakUzeWxpRTRUWm5jZDYzNmdQRkNLV2F2R2hjUngySitjdnM5TWxTdzBUeTNjQ20rYzduMEcwTUV4ZFc0Qk1JYlRYRTlVQ3ludnlDQ1grT3ZtNGdiQnlBL3hpc1ZnSlBwWHJ6TGo0RW9SSmpKSVpyV0hBclM5aXBySytLY2VmZ2l5QjBYVktHak9tQ21XOXhoUlZNVVN5UkZuTmVGR0VkSTJxKy9IRlhjbGtwOVdzQWJnVEc5d0dqMDhDSTY0V3hSay9PVERjVUF2QkhYU0xReGNWQ0RNUVNXYnp2KzFlN1dWYnorazV3MnRKdHNiY0NZVjZXSlk3aG1Bc0RBN3IxU3ozT2dPZ29NK0tUT0piY2pTSTV5R0lhTkUxdXV3bEFBVS9NRit0RjUvMHNJZ2hWTGRWZE0yUzBiU3pIeDJNaStGVHhYZjhYOTI1TkM0QnljSzhRd2ZtZ1ZYMUxsY0ZpeWtFTWNMMkJuZEpKN2FRZmlqS2Z4TEdEd0FoQnlNN2FDNVU0cXdQek53dWZObk51T0g0VlphQ1BsUG8yQWFocUZxb1BWRmMxNGdhMm0rV0VFTDBjQXo5a2RQck9tTXU4cjFvL3JUc1h6N2Y5b3N3RnMrak82TEFxa3ZDM0dnZzVGZzZtd1cwM0NVSTZYMTJoOGx5ZmN6M1FIcXIzRElsNjREYnFhUUtjOW1JODdRWEFDRDZ2cEpxWTBFVnh6MkNFeUNJNWVNU0dYMmU3VnRJNUo0eVRSeVpoc2NydnQxblF1aXZPQWFOTGxZRVN3Y3lTZ2lWYnIzN0JmZDAvdTMxeUVnZzJGVmFpUENlVk9ndXFBZkdvdjBpUjBSOUpBQkowYm53azluTXh3K2ZPaDU1RWJnUmh6b3pyQlVBMXBvbE45Q0x3b2s1SEVFVVFCakZNUUI3RCtqNjU2UFcrSXJKOE8vYkJDbzRzR0ZkR2VqcWl5WUN4M21LZTkvSnRUaUJ2bUk1T0ZpVGlzZzlMdEpGRjdnWkdEclViSEtzNzkraHl1NWhTYVV2aDFmb0ZyM3IvNnZaSkNpWGdDRHdWVkZKN01WbVJMc3JHbHR1RkNjNjh5RmRBQ01EQWZsd1I0UU0zSFBvS2dJRXh0NGd6NDJTdWFRYjhoQk9FMm9abWx1K0tGbEtSM1FTc3NNSnhEUFdiYmpwZkxvSnJ4RzhDWVQ4TUtHWlNWVEN4WUZUSWI4NG5rQ3hDSVBMRGlieTMwZ1hGZ2hhRjRjMlJlUjQ2NlV1MmZ2b0ZyM3IvZktBRUZ4dnBxTWNkOXlvbklya3VLNUxMVjdNVkNNKy91REpDeUlDMko4YTB6MWl3cXlFU2dNbDE1U2EzM1FLZ210UEVCbnAxMW13dVhnTzcwVWQ0REhXemZnRFlDM3pCRU9rN0hsQTZYS3lIUXpiOEhnR29DU1FMcXN4b3JJeTFCeGllN1d4MHJGYWYrd3I5WHYzMkMrNTYvN0hiSjVWSHRSWVQrR0pyc2VoSGN5YTU3UHlLQVFrNit2QmtCWlBwalBFRXhsd1U1OWF3ZzNDMjRXNktCc0M2dHFIUitNaWR5VkczaTNyZEFuQXNIMlQwOTNYVCt6THIxOTdNVEE4MGgzU2ZzWlAyVXFwQ3JQUTQ2b0YzMTdWcnBlaUtYVEo5TWhNTGtnR2RDYWNLRy9tdXBWOXcxL3Zud3lHZ0NEQ0tXekplM2xxc3l6TFdaV2U2L2tjL29LemdLSDRqQzdvb2xoZEM0aml1ek0wV1BvK2NQUTJBc1gxb2JGQ1RPNUp6bjU2NlB3YlJlaXduZlRXakk0S3ZEb2gxanVoK2FUK1dLU1lEM2k4QXFsMnJKaytWc1ZRbHk1a2tkZHYyRnZIVDYxaWNxTzdGcjcxL0lrTE5YT2kwRlFqVjAwNDZvQnk2d1o5MjJROTVJQ3FERWFMNFhXdzNDT2NmOU13NzNERkI5QXFFNndaQUFTOFh1ekdRSURLZitvVmtxeHQwMHR0QWMrWVQwUEo5cVJGU0I4eG95ZTVYdTFaVmVDU2dDTGJZTFZOc3dvbmNIeG9lTHdDekJHakJOa2kvNEJYM3o5bFhnVUN5SUlHbWhvdmE4M2NSZ081VGU5eUxnUDNNZm1zQlM4eHM4L1U2N2VQUU9xeTl1bUJVcnVEY2hxbzhzSFNkM1BNZlQ1aWZvK2FjazhlRkhJNlFFY25UNUd2ZE9uVmRYb2YrcHRKK0JWUFdjZWlhUkhBOFVzL25rQUNvOG16cWxxbVdyYkZEcHBUNUE1VUlabTdDUEEyVmdtM1Fmc0VkOTA5a0tJcUIxcUpBS0NCRzhac3RaejN4SE9BQWl3bXBESWRuZzFtYVpRQWtaenNIWjUzN1lmUXJ3Tnl4b1ErSGFrcm5TMGgxbVVBMUM5NlRkSlRtT1J5aEMzb2VxZHdST2krR0Roa0ZJNmJZTnJjTkRFRGVBa1h3UWl6UFJwbW5JczNPZHFaUFNhUkZVY2JjaEhsZ2llNmFncTJrWDdEZC8rZDhsVUpWWHVVems4RVJtUysydmZkNHV2TjJWT1Y1clN3YjB5M0poZ0loOXdKZU4zWU1RQ0lnUjc4UStuREVWWUJZWlVyVXBiWEZuTTdDT1NkZjdONElQdnREblQyQlkvaDhDaGgxME1YUWVZR1MrN0dHamFRaUFCcHVOSUZpRUNuemRXSk1JVUhjYXpMcHRDN1lpdnNGOC83RmdMRk1xcGlRTDVUdU5iS2ZBL0RDNDZycXFBYkF3SUtXSyt0aW1SVUJFaU5Hc09Rc3lRbStHcGpkNG4wNDZoYlQ4NEtQdVlqT21ISHlwOTJnY2dEUzJPb0l1VkllaC94eVVrYVZ3eUVXZExyZXdIRTN1QlVEY0tJd25xNDBIcERYTCtuM0N6YmFLZGd1ZWw1Vm5GSmwyYXdhZ2hMUUJUenRlWjBjakxxMkEybjBNNkVQaDJwQzU3V2c0MXBvTHpac0FaTnNvMEh3NmVWUi9KOGJGOVlqV0dtVkNwR0t3UUxCUkNjcmJpU3hOTGdWQXhDRjhYU2w4WURISEZQVzd4ZUZCUnd2L3JHcU9LVUJrT0R6cWdkV1BZQU01M3ZUQVNNUXU0Qng5Sis2OU9ISUYrTjcxRjFPMWdVQitBc0JmRnFLQys0V2k0QldYK0NZZ09UQVUzNndkTVZOVktrYTNNb0JXQmhQeHlpdWtvM3hrU1g5ZnZHTWtxc0RsenpIQzFONlNRNERvSU5PZTdLZWxXV1RoZXppT2JlS0NkQVJBcEQxQWRWblJIMDQ4Z0tVQW1BRVlpNk9oNERKVjRWb0dEV3FqcTRYTGJPNW8xakJvaW1FUGhQSm13dTlGdm5UTGdkZ1lUd2Qyd3lYYk15UktlbjNpMmVYWEIyNDVGbFZZVXBWeFVwR2lMdG1HQmxyVEVoVlV3VjhkRWtWS0FxM01ISjF1elJiUngrT09nRFdGWDZNc1hKVS8zNmxKb0VvQTJBS3Z3OCt1d1RFRElCYlN0ZE9zOGRkRHNEQ2VEb203WmRzekJJczZmY0w5cm9yMkM3NVVTOUl4SkpzRXNIZEdGQmlsNHlZdVV3a25vZkpnRjRYY0VVZmpyeitYN2ZLbzRFSkovL1BrTU9STzZGclZqUU1lTDVrSmhaTU1Yekx3TlpDdDFuekRGZ1lUOGNRd3BMdDRoRE9OMGkvWDd5czVPckFKVmUwUy9JU2dGWTdqOVp2blE3STMrbHlxcFlhTDk4Q1dwL04rbkRrWmRoaTZiVzhBbjFrUDNmUlRMS1ZXbHdGNlJaQ0gyTDR6RERSMGsxSXFlVE5iMk9RU1lOYk9RTVd4dE14ZXF0a1k2SStueTlWRXo2YnRmYjd4YytYWEIyNDlBb1h2ODUrdElCVmdKSjZuNGxmNm9WK21mamRESk5NSDB3QVZGWDkwR01rMWY1VHhsUzNGZ2doOTJEeU4wSU9SeTU2NjVLSWZDa3RzbCtLM1ZzR3RwVk9XT01pdURDZXJsU25qUTJyQituM0MrcElCZHVsejh3cW9uck5QTEtnd0thQzVCM3M1M3FoWFZxNm9ETmc2c09ocXZxaEVyM1YyVk5MQmptblNTTmRyT0xKMXprQXU2VlBSakZjRno0ZlhESjhpNDVoRzk0R3QzSUdqT0ZZQThUVGxRWi9xR0gxb1AxKzhadGxUMU1BdEhLOG1RZzI1ek9aVVNDTElsaVdjYnc4d2ZXNUxuMDRzc3FuSFgwNGV1aUNrNi8zZGU2Nk1QcHVBUVZaQUVGa3cyTUtGdzZhMXdFTDQrbFNCdm1BT01oRDh2a09rRlg3N2ZlTE53MTRZVC9zc21jNEE2b09kSEJFa3dYbGdqSDJrNE5hbDZ3QjRmSXVYOUx6WmpBbW9yTmVITW81VGMwT2V3SHdEVFVoOUhYeGZHSnNZa0FiQUFBZ0FFbEVRVlMvdXZDcG9BY2V3NnpCQnJkeUJsUXd3b0R4ZExaV1hMREZrSHlGOHhHRS9mYjd4UjhYWEJ5QUFWQzFvQjE4SFFZSVQrOHVHZlA3NVNDVXMxbzY0aGU4djRqNmNJUStJcWtQaHhyQkNIamRqQkg2QWJsUWtBZVkxb25kdWtTaUVMbXNVUHBqYnlwN1h1dkRnQVh4ZE5aVnZXQ0xJZm1LZzZCYmhyanVwOTh2M2xWd2NRTHc4Z3FBNXY5ekM5akVydXRsdGc4Z014RFdXTUJhTVZrbUFOV0Z5RVY2UjB1SDJJMUl6Vzd5cGJrUU9UUDVmMmNoOUtzRmt3cDBrUWxEQU9teHpIcHNjR3VHQVF2aTZWRDRSZ21BZy9iN3haVmxUNU1BVE5Yd3FRYzZLR3dmMlUydUdWMnV6ZzNENHVhN2ZEblB3WmNLZ0lkcTlHYUlCUFpiMFlkRDdoZ3lJRldNWGlIMGVRNXZYUzVIY01rYysrOWx6MnQ5R0xBZ25zN0t4eFpzQ2tnZHROOHZXRCt2WURNQVVwY2phN2xPUjllTFZjSVA0dGN1b2IvM0FPSENkVzAyVlRYNjJBcEI0TXYxdjI0Z25QeTlIaUgwM2ZKMzY2S1lIWVRIc2dCQmcxczVBeGJHMCtITFphT3A2NWkrbG42L1lNNUV3ZFlCd0dqMWNtVWtFNys4VEhMTmRBSGh3clVPWHRjck8vcHdoRjRjY3Qyb042OEJNRENmbXNKTS9uNlBFUG9ZUHA4Ykgza0NrYnRqamkydEpKQTk2MllBV0JCUFowV0JDcmJZc0ZvT2Y5cERBaUVOazE3OWZrdXZmOW5UWGV3S2NCU2pzbjdsZG9uV2JnUXB4KzI2b3RhTEl3QWxmaTJRUVNKWTNZank1aTlkbXNGTS9vRURNTS9aN1VmMFJpWVVBN0orVG9OYk9RQzNlMFdCQm05cUxhZDZISUNHMVpLMVhCNVBveG51T09JY3hTWGUvT2Y4eEhWL1ArRnB3TjQ3Z0tVcFlIbXVTdmUwcEtaZ0NLU3E1d3FuaVdFMVdaei94b3VCbTc0S1RNd0JJMTdsVkJYd3RXU3MrOC92TDQ1RmYzdmhwY0FudndvczhkNDhEWlgzTTJoeDlYSUFudTBJSU8wY2h1MzVBT2dMTDB5dUcvak9td2JnMDI4Ry9tTnoxWVdkRVRibTRJNUJyRmxvditFdEQyd0lvN2wrQXRnOEQyeFk3aXczVjVkaUVxTzU0bW5qNlhkTUFZY1UrNmdvbjdBM05TTzJxRmpseVpZRGtBWDZ1RDVJYW00NFlhVWZWTkROeGFKY0xJUFhjR0dwZmk2UG5aZFZEMXdQc3BRQlgvd2w0T2FOd042SnFnK3h3cnhzbGNWRnVZSmJsZWhrY1lZWkdQUzNMMjBCeHVlQmNTOG53ZzVINWtaa3g2VFFTYlhGWmNDUUthZHg1Q3o1bVB1ckFGeHJSYWExN3BBUjJQRkMrRWxTSEtRLzBRalFjZ0N5R3lNOXYzU25zREJSSmdMNm1zV0NmNklmV2VVSmFjOFVGbHBZODUwMERjQ2Z2Z2I0M2hpd1p3eVlWaGQyRC9WU3JLR0FtSURuQmtpYWZFY045Y3BySGdLTXpnTmpTMVY3clJqUmxjZXlycWlmNktBa01nWElNKzZ0QW5EbCt6U0wzNk85K1U4cDlqR0hRbzI4NS8yWEEvQW5YZU5uS0FvckRYSC9BSUx3YlN2TEV6NlFsMitjQWYvM1hjQ2R3OERrS0hCd3BPcEZiRTJ3YWR6SWR5aDNqak5RaXJZV0V3WXErL3pKd01oOHBmK3hLTlN3TTZEWk1tek5SUmJNMksrMklpNlRsRnJBV2ZkNVYzaS9GN0lnVDJMQkY1TGJJZGtxeExQV3Z0emxBR1EzUnBVM1k3QWlpeE14TE9VQjJ0N3BLUThNMHFDVG5wOEhrb2pKZ05xYU1FSmVzUXY0QVIzSXc4REI0UXFBcys2U1dSaXFnSmdZMEhWREFkQkE0QmE0eE43bmRsU0ZBQWpBWVg0SVBPNWRCRE1BZFMyaStKeDdYVGYxZUVkVERmZ0FRblIzNHAvd1FrUm1qTkFvQnlEVC91Z0ZwaFhBbWpBRW44cWFQUUFnWkNzMGxTY2tDTm1WaWdFYkZNc1BCQkUzRGNCWDdnTHVhd0g3aG9BRDdFTThETXc0OEFoQVRyanRRd2lYb3FrVEV3V2Q3TE9uZVhOQ2J6NlRpcS9USW5iMk04WnpJRnJUUWJHaXk5Mm9HejdwWGwvN2p2ZEFKbmIyNDcwSWJCM1Q3N1NhaStoeUFQNXZvVHFXNnNLd0ZBYy9UQWRjNSszZHZjc1RydlBWWVNLNFNRYjh4VjMrNklhQXFTSGcwRkRWaDNpT0lGVElGeHRpdDlvckw1Wi9MRDFRNHMrQjhPbkhWdVh3aGhkZDVEb0xHc2dDQ0owNHE2NlgvSnUvdlNhZUF4RFB2YmR0bWR0S0RWOTBnVkVQSWwveHlTa3ZpT2htQUVqcmx6U2t3ajQwU2xRWllaMzlJKzhKQk14OG1acnloT3NLd3FZQitLcGRWU0RGdmhZd1BWUjlCRDd1eVg0U3dSUzU5bk5JK2JSY2svRHpKMDV2MTJNMG5ZOGZBazhpV0w1QkI1cUFTUEdSQ2k4RVZqenYzbXFwa0M5QUNycndoS3VrQjY3R2hwcVJSb3dRTXFDaVliajhvT29IZVVXcGRZSUJBVWo4YzhXanJqeWhOSUoxdW56akRQanFYZFVqSkFBUDhUTUV6TFlxOXVPSElDUUFMZS9Fd1dlK1FnZGRBcUN6ekQ4K3ZnSWdnMHFwKzVuWWphRHpDZ2ptbkNZb25lMGtscVA0SlNndnZLKzZMb0ZQb0ZNbGtQR2grMHJQV3RhNFJIVE5KSlF6NE04RUFHb05UUFZVOG9wUzY0Q0M5em9BV1RGQ2hjcTdsQ2RjaDZzM0w0Si8yUUZJRUJLQTFQOW1ISUJtaFBoM0FpMzU0UnlBQW1Xc1IvUFJzNnZPUjhaOEZNUFM5N3l4dElsWWdWQi9JN2pDMHJJS1NmTFhGMUVFQitCRkZqUTNqQ0xBNDlPV3NSVFRFUHp2elFFd3J5N1ZyWjVLd3pBUUFQc3NUOWp3MWRjSGdDck9SUUNTL2JnbisxSHNDWVFTdmVhSGt6dkd2MXNjZ1UvNlI1NVkxWUl4aHZPbTFFWmVrUVdsOHdWRHhKZ3djODhRaUpjNkFLWC9tZUhEYXdYOXoxNk0vRW03Yk84UTA4R0JQL2pFa0FFVmpNQm9BRldYVWpSQTNLdE53T0JYVzNFa0FaaHJBTGt0cEM2bEt0VFY0T1U3UkhCKzNrSFdndi96cm5ZWmwya0NrRjR1RjhNR1FHYytNcUVZVUNBMG4xdGt3eGJ3NFNjSEFIcjcxUTdXNCsrYzhjendjQkFtSFZCL2M3QmNlazliM0Z1d2JkRC9rakdXZ3pKalEzdGhHbVZBM2poZk95VStSeEI2RmFtT0ZwOE5yaHNUZ0x5OENwem01UWxWcHRBVSs2Q2lOZ1hDYUlRMEJjRFlWOGIwUDRwaTMwdmZJeEQ1K3c3MkM5YWxpZWdXOE1IenFybWgvbWV1RmhZaTBwS2JzNkQ5ZnNoL24xWEZNcllNYlBnVUJ5Q1p6NkordUVrbkRBOUFvcm5XRlJiMDFXWkVzQUNvSGhPcXlDN3dkZXRUMFFBSzJLcU9iNU1DVXZQeWhMRTBvUXh6cWFZTlhMNXhCdnlWWGUxMnZCeUxBRGpYQXZneEJ2U1BHRkdNSWpDbUpiRVc4SGZudHh0UW14VDBjbXhwOVVQQWRLQVoxdXBBNkVCN3FnRG82b0NVeFhSdFBWU3BBd0pwblVodXhBcVdDQ1lLMU1CRXhabGpZNVM4U1lyK3B4QUZBdUJheWhORzI2anc4dXNDUUxYMFNBQWt3d2NBRW5neVFpemFYb3ppSWxpK09lNy85a0p2TmsxTG1CTWU5RUNPM1hSQjdhUGVGMEVZSE5WUGRUOGdqMDE2WUJjV3RCZkJWWUp1ejdtRjdWZ0dZL3BPOGY1V2RRMS83VTY3bklLTlM3ajB3SWJEUEZac3lOSEhZN29kL3hkbEVIajhDY0MzVGdDV0hnR0FQU3hpU2R0NDMxMnUvOFNQQWw4L0RsaDRwRGVaVzJQRDRKMWM5K3V5RGFJRGtnRUpRS25UZkcvTjhuVUFtdTVIVW5NVzVBUmJQZkV1SUh5L0FDalJLN0ZMNXBPUjRSYXhnVEhvZktsOHIvUzFaV0JuQUdES2VmYm4zQUZJUFJQWEI3c0ZpVlFpbUtWZ0dkbDVvb053TFExLzFVK0RRR1NYUTlyNUV2eTFxOXJaYlAxbEdRRFpzUHB6SThBUEhnWGdvZDdxVXgxMVl0QmJGekMrL0MrQkw3U0FXd2hnZG9Ma09OU0xxeTVvTG9nWWZ0M1pJMUY3RUFDK3Boc0FuZWtva2hQNEhJem1sL1B2dGhRV21QQjlMSjdqeGtjU3IxNGpXajQvMHdGbGdKRDVlb0R3NmZlNER6QVlQSG9rV2hISlozVEZTa240aDdZT1NPQndFdGlNVHYxYVkwdWt0RllUbUkyLzQzRU1RbUN1QUptVUUwZ21WRDhFRmRQcGRueGhWaHF6RHI4RjROTXRZTTlKZmc5OEVWVGVOdTlRMk9GWkJYN3ZyOXZ0Z20vbGNlemN6WjYxWk5OOERDdmlsWUNkUFhxTkRRcEFsZkdUS20wTTZBQTBQVEF5b01TeDY0Y1JmUFFIWHNuaU9USStmRVdERkdwK1FiOUJleVNSQlYya3BsMFF4eEdBbEhEbWtJNTZYNnorRVA3VURZU2RSZ2gvSW91d0laMzZsSGFiQkUwR0owcjEwUmdiL3hBL3R0L2ovNmFNQWYrN1I0Q3h6dUJYV1JHVUx3QmZJclk2VU5mcHZMYWU3bjBJK0xPL3Jlb0xNcWlWTWJXMzhvVWhrTmtRSXpaTzd0SXdlR2VQY21XbEFGVGpBWUhQVkd3WHhXb0xZYmxFRGtMdVRUOE1EUGhYTEo0akFMcGFKQitnZ1U2eGZnSmtuVDdJS1hJUVhoNFkwRlpDb2crd3hpVVR3U2tYVWJTTVYxckIvQTMxT1hXdUZwUFVkYS9tUkhLaTFlNlUraEE3WnE3bCtBK1VBZkR0SGcvTHJwdGtRcFo3MjdjUldPTDk1NDJQYTNyT3Z1T3FhZ1VsdGd0bUpNMDhqNC9QSUxiSURLejZ3NVBBSHNicmFUbk1HZFpXSXdJenhJZmVLMHJuNTc4SjNMQVZ1SDhDT0RSYWhWL0ZGUS8xSXVtSXZYUDFRdWROZnlOVDhvVnFjSHZpUGNCZDQ4QTBnMlJEdW9EcUhkYjJTYWxaQWRHOWRuZkRrQUUwZ1huSDVpaldDRGJLQ3E1L01SaVYwUUQ4SGdIUTYzakcwaGRzTEd4QTN4OUJ3MUFzbGk3aE8zQndBcGduZy9HanZxMDFJSHJYSjdxM0N6N0UrK1l6aUYycnMxWkxaKzhIOWpKc1NvRUNXWGo2aWdtUjg3YUxnZmJHcTRHdmJnTHUyZ2pzSHdkbUNFSVBTSTFoK1NrQ1JqcGZVQzNpTldjcG9ScmNucllidUdzVU9NQm83UUJDeFNURy9pZ3hWY0JJVkdQV00xaDFKWVFQbnlLTkV4R1pNRElKOWI2NmVFQkd4UERZMVk1bnYrR0NqZkdBeEQrRERwaWF3cGhBQldaUGp3TnpOTEFFSUg0WENIME03LzVjOTNiQmZJOFlrMmNnVkFkdmRUMTBpZkRrQldDL3I5bEdINTFOaElzbnNXSE9mUG1FVUtUOTRXZUFHOGVBTzhhQWZXUEF3VkVISVNOUWxLUVVnbEpqSkV4cUMrSDZOcTkza09wVWc5c3pid0x1SGE2NlF6RldrYUZpZVh4aTZoZ1ZIT01DWUdSdUorNVY0allKSURLSTlLbHNBdkZEcThRRHJuYjhOV1ZQaDlFd2RGa1E3OVRsU01Jc04wTWk1czlNb09Hbm80VTZmM1lBdmVmTDdZN3J2ZG9GTHhPQU5TQThmN3hTZ1dtZDBrQ1FibVo2bVRMRW5KMFVxV0xoVWt4bHJCbjZuM3dXdUdrWXVHdWtDc3VmR3EyaW9qblJGcGFmc1U3TUR4RXJKdVpoWUNzSm9zSHRXVGNCZTFvZXEraHhpZ0pnWEJyTW1UQlBuSktMcnIrVkVENTRpYkhZdlpvczhzTytETmNySHJEWDhZVlZ5Z2xBS3VkMEx0TWpGUHROTXo2UUxEWTdWb21MSmQ2NzFBRUg0WHUrM2c3bldxMjhJU3ZYNTgvaGd1T0JnOHZ0RlF2Vi9oRXp4ZnFPZXZ1VGZwanJpOHZBV3o4TDNOWUNmakJjNlpZSG1CY2l0bkZkMDZweHliOFc0Z1BsZ29uQnFmZlR0ZFRnOXB5YnFpVk5Cc3N5VXNkVUQ3ZUdPOWFtbmYzc1h0eFFpcGw3V2cvc0Q0QThBd0hJeVpNWWt5NTBUcC94Z04yT0w4eTA1MXF3MmhYendSQ0VkVDJubWNrMVJ4SEcrdzVqZU85TkZRQnBSNmxkTUlNWGxGV2dWbmRxRjJkVkZzSnp1T2dSd01FbEI2RGNJNnJ6bmVtRDBSbmJ3UWlTUlMzZzdaK3RWSWw3UEM5a2FoaVlabTZJaXp1TGlnbGlUL1ZvVW9nK3A4UDlsM3dKN3FHRWFuQjc3azNWY3pyb1VUb1dMQ3NBQnVkNHlwYUxDVW94ZjlpLzl3OUFEaUlDVUxyUVJXdUlCNnc3bnVacndhWndMQkd3Q2xTcVN5ejNBaEhiYVJHRUZHT21DNDRENzJVVmdqVzJDMlo0bElGNEFyam9kT0RRY3FVR3FBeGZjcEc0bUpWdVZxY0w1dGJzMnovdmVWMHRZSy9uaFRBcWVzWU5IZE81UENKWm9zK1d1enhISklWaXVYRnlKeHVwTkxnOTc2WksybGl6VUtvZGlsR1VnenlHaG9rRjh5dzVNZitxUmtqZGpmdUR0d2trbTdEVGtOYUJhUTJveDFxM2VNRDgrQjZPM0g2ZW04S3gxQ2N4OXB0V2w5aVlJVUFBV3JJM0kzbkhnUGRPdHNPNWVPdXhYWEJkajBWMXZPTC9zbzNDeGVmNjB0bFNwWXd2ZUtmMHBBdTZvaGZkSjhrNENVcWd2cjVqVjZWR1RCS0FMZUNBaCtWYlpMVG5oNWd1NkQ0NEE2SDhjVmxrTks5NU8xV2tCcmZuMzFSNUhTeStKQ3dQcGxBeFJlZ0UvMlQrQWxvR25jTm1iUXlvZ1VReC9Ld0I0Z0hqOFlXTlR3UkFPVzBGSUlJbmRvcU5rVEF4ei9iZDA5WERHTEJkTU02L3BMS2k1d2hBWDYwZ0NLMnVqeHpFQXFHTDJwUTFKaXM1QUpFQUZIdlR1allBS2pSZitTRXVnbTFkMkNPUUxVL0RBd1E0NGNhRXc4QXRaelNJUGdBdnVLa2RyV01NNk03eENNQm9pQm40WXBDRTJOQ2Z4V0FBNU1FdXd2Q0NFSUN3bG5oQUhWK1lPUmZEc1dKR2dQcE1Ld2cxYjlRcEZuekhiRDJCSzJKR3VsOXM4S2tZVzE3dkxBTFFSVENCcHpYWnBTNGd0Q1hYTUFrZHV1QXk4RTdQaWpQV3ByWEo1Q1IzOHlndzFmSkRvaGgyQmxSQWdxMk9lTjd1VFdjMUQwQUZOdG1MNTRFU0JzQ2FKY0xrRGFqeGo1WlhSaUNJR0Ewd2FEd2dqeThzazUrSFkrWDlwcFViSlNDcDZUbkZDTVh3bnkxV0FGUThyVUFjMndVclJMNm1YVEFlZlduRmZuejNGcGJhZ1FLTEFxQXpvWmpBS2trcFhrTk81R0NFdk9NTEZYT25uQzR4SUtPam5RR05kV1NNK0dxSFFHZDdKU3N4VWYrSnpRTHdoVGRWNGplMW5RdnIxTWtQR3RsZjl5UDJEeStnQXFaNnJReXRmdmRIU0R4Z0x3QkY4QW1BWWpIV2x1RURpS0dNaXFPVnZ0ZWpYVEJPdVJTWUp3REpBQVJnWkFHV0w5TmsrSU0zU3pnVHlkRTRlZWMxblpIYnREYU5BZjFEcGQvU014MkVORDZrRDBvWHRGaEJYbWNZK09ZNkFGQ2huS256bDdOZmRNUjNxQ0FhZTJCK1ZWTVlYQVN2RHMzL1gvekhKWmNCODR2dWlxQUJFbzBRUG5obndxUUx5UlVSbVpCUHl0bndIZGUwTTF2TjJsUjZwaWNvS1VMYXhIRElFZEhrVzJpV2c0LzdiNXpiN0RTUUFWZDAvZ3JpVjJKWW9qZnB3UkdFWXNHQnJPQm14L09nUDVzQUtBTmtjYkZ6TldUUm5YL0dTR0ltTVlIL0xZbGsrZ0d2ZFQrYlcrU1dIK0lnMUdxTDVRZVR0UjJFWWo1TFZIZmp3L1pEd0w4eUo2VEI3VVUzVlZvVGpUWXhZREsrSXZ2N2R6TkFaSXhwWlNpVThqaktnSVdUY3lrWmtCYXdEQkJuUWRNcjVRZVRLSTVpV0NCMDlBbUViNyt1Y25PUS9hVFBXbjZ3dXp5UzR1K1IwT2I2Q1VHcUpwSURBOTdBZHFJTmJnUmdCSjY5Q0c0SnA2cS9ja2pYcUIvUktsYTRXcGtPMk9EZ0hveW5pZ0EwSmlMd2FOaUV0OTVZUUtKNEZSQys3YnJLelJIOWpaYk42aUpZdVNIbTlJNWlPQU9oSE5KZlpraCtneHNCS1BiTHUzK0pnYVdEZG9qaE1PNWtrRFdTbE5UZzRCNk1weUlBamYzSWdnSmdNRDRNQ0FSakZNVTlRQ2dBeWtoU0tuVUNZSEI5SkIwd3k1YVRSVXhtdXA0aCtRMXVBbURzK2hwWGdGTG5CNlVMT05PbjV4QUNOSnF4Z2hzYzNJUHhWQkdBaVFHOWFMZWlsV1VKVzFGdlZYRU4wVEtwMUM2QXQxOVRNU0NCcHoxZEh0VC9KSDdOOXlheHA2UWtGNzNLQnhZSXIxMG5BTXByb0I0NHFRR1RqNnNqVXJ0T0ZQdExlRlFITEVTOUFkREZycTFFNk0xM01heFZDVE5BWE5GVGhJeWxMY29yNDB6eHRnREFQS3VWd0RNck9LdytTQlRidFIyTU5EN3Nad0M3UXZtNHdxSGE0VC91SXJoYis3bjBFZ2JRZFRpam95ZythZ1dYVDhsbERzQUZXci9COHFQMUs3YlQwcHZ0VndIaFc2K3QyQy9tOHN2dlpsYXdpMkNLZTM3bmhGdGFwa0RuSUxScUJRQSt2MDRBak15bjc5RUlrWE8vRG56eUNCd1Z3ZVg0d3hzOUI0clJaZ3lQVkZxeWtnRGQrNUpTcEJVNXIwdkh5SHoranNjM3ViMEtBQnNaTUN5UWdlRXhLeUZQVkl6M2xtY002T2ZQQUdDQURZUEU2N0pmczZoN0cwbyt4dmk3b3lLNGNMWmZPZ3BzWHdDMkxxOU13dXVWRVJvbktuNG5TSnJjWG5RS2NNN2R3TU1YZ1ljc1Z4a1NlYkpnek9XUHFkQjFhZDJmM2dwc253SzJMWFdlUjltM2RhblVJVjFsQlNDUEFyQnd0cCs3RFRodUJ0aTZVRFdEbVdBL0R2WGs4TFJwdGZQdE5VbGloWVpUT1BDaTA0R0gzd0ZzbndHT1c2aUFzNW4zR2VKSitLTG9FKzlWRENsUThSNnZPUUhZZWdEWXd1WTNTNkgvaUo4amIxMWNrMHE5UWhvYzlRTVdnUEJaSndGYnBvRk44OERHUldCaXFRSWdXeUpZM2xQb3phR0oxS1RFUGgzNnpwVGtKcmNYUFJFNDRTN2crQ25nMkRsZ3l5S3dhY2xmRm9Jd3ZDd3g5Wm4zUTFEbUlQeC8yL3NTYU11dXNzenZqZlhxMVpSVUVsSmtLc0JFR1F5WWhKQ0JTa1VxQVcxdHNCZHB1eEVWYUJ6b3dYWnFlMWc5MEcyTG90alFkbU1qS3F0QnhRRVJkQVdVQWtVbFpOQkdrUVJOeUlBRU1Ba3hwRktwcWpmVUczdDkvL20vYy8rNzM3bmpQcTl1VmVxY3RlNjZiN2pubm4zMi9zNi8vLzN2Ly8rK1R6MGRtRDBLekM0RE02dkFGcGQvMEwzR2g2eVREZ252THdLekFXREdpSC9UaGNDMk9XRHJFckIxcFJnUWlzSVFoQWErQUVEK0hFRVk2dU5MeXJSblpMU2w2dFNicmdMT2VCUTQ0eWl3OHppd2ZhVjRVR2JkZWdtQTVRTVRMRmxxc2ZuN1hlY0RXK2VBbWVQQWx0WGlYbmt1WlNCa1JjbTRVR1h0VTJ1bzN4c0FaZ3o2eTU0SnpNd0RXemtnQk9BcU1NVkJDU0FVT2JoOFF1Ti9DaVRnY1dBdXlXaEwxYW12dkJiWStWZ3hiVzQ3N3BhYTdnSUJxQ25VcmJVQmlRdWhBS0RVb3QxM0liQmxEdGl5QkV5dnRPNVZEeHZ2VmZ4Vy9Ka1dORnJDZUs4TkFHc1k3QnN2S1FDNGhRQ2tKTmFLeTJMUklzZzZTSjNJUVNlMW9uS0tDMkNzT1lNZU4rMER0ajBPYkRzR2JGc0VabVdwNVM3NGcySXIydUEyMkJTY0FKR0ErZEpGd1BROE1MMEVUQVVBa2dEVFBxOXpkSy8rc01XcFBGMTlOeFl3QTRnM1B0c0h4QUU0U1FDNkZkU2dtR1dSUklKTFpKbGw4RUdLakhpWDFqd2FOMTBIekQ0QmJEMEd6QzRXcnNLTVcycE5vYlpvQ3U2Q0xDRGZDVHF6Z2c2c3Ird0ZwaGFBS1FmZ1pIS3ZwUlNZZzdITjVYQ0wyQWJBWndQclpHYWo2aXBwWGhnbjBrcW1VMXdveG5IZWRnNUFBVHVXSGlnMkZFMXVWUndveG9YK1djYmc4OVMzQXFDS1BPTmNDaThvUHRWUCs5KytHM2orb1NLMnhSQkZERWxVeGJUUyszbnZjNEZwRHNqeGxsWFFvSmc4RmdkQ1FvR0pKVFRpY0xjUTZ2UEw2d2JnOWNETTRjSnYyN29BekZBNWt5OS9VT1N2bWc4b1A4Nm4wZElDQm4yNUp3akFSV0RTQVVnQkhONnZmZGJ2MTBBYkFSaDhYOTF2RE0yc3MrTnZBRUNLUFZMQ3NIb3lVZ1JxcmxiblJ3QjkzM09CYys0RFhySUMwSUVtaUxuRTc1ZGk4SHN5QWNqeldVVkdVaTZ1SUNNcFZ3d0pWTVhkZU9rM1hBeGMrSG5nK3ZWMmVzQVl3K3NXb1AzMXIzZUxjTHdRQmVRVXJFSGg0Sm8yaDR2RG1KUHVBeU1MR0FlRW43dXFiZ0IrSTdEbFNXQkdDd2UzMUdiOWFMMjBrR0RiL0VHUnhZNldUejhmMnd0TThsNHBnTDFTZ004ZXNIQ3ZzdXlsTUU0bm45Y2ZRTHRsZGc2VFowa1VLb3JBZmlqMjN2QVBDbXFwM2ZjQ2w2MFhGSU5pZDFQbFpyZjQxL2RuQXBCNndTUWp1dFVmSURKUjhDR0lRT3dXRUg3RHl3cEtyV2M4Q0Z6cVJMSGtWWXJCMmpTMkZRSDV2a3VCeWNYQ0FsSVVVQUFrQ00yaVJCQTYrQVJDZTdEalltUWR1TFlUbGVpUS9YVFRTNERwSSs2bkxoWlcybnpWQ0VCYU1MZCtzb0lHcWpEMWFtcGR1Z2lZV0NwZUJLQTliQkpDOUFjdEFrOExFUzI2U3FzZnRJbkxaNDRkUWlmNElnZGh5bTVXTHJQRHl1WUgvN0hUQ053RG5Qa284TFhyQmNjalFhaW9lNkJpS2FkMytRWS9NR1RINnJTM09CdkNuUUR1QUl5cWhpRGtROVJYKzI5eUUzb244SXdqeFFQSTh6a1RpQXBHVTNvVmtELzRmR0RpZUF1QWRNdzVNRlFqRWdnMURZc1VrdSthM3VJMFRHQmZWN1BvdHdId2FPRW1iSEVBVHZ1REl1dG5pNlVBUW9GUklGUlloZmUvZGhFdzd0YmU5T2YwU2kxZzhIa3J3UmNldkRhanowN2dJSjduMDVyWXlXSXBiNHlhLzd2djhQUmRGcGovTFhEbWtRTEFuQTRqQ0NPbFRCUk4vckZNQUpLZ2trVkhwR1VqeVNTQlNGZWc3L2F6cWs4RWdiU0VxOFVEUkFDTEtEWFN5YVE3QnIvL0RjQTRMU0N0d25LaFRFa1FjbUFJUWh0TStVYWFqbDB1UzlOYXRJVFhXenB6ZmNkTkI0RHBZKzZuQmdEYUN0YW5ZTE42ZkNqNHUxYXkwUUlxdE1ML0VZQzYxd1NBOXRBSmVQNmVXc0FvRHlzRnBnMWVCMEhJUVJDSUlrVmVDcVFmLzA1UDNXQ0IrVVBBK0NQQXp2bUNhRldES0V1WWNsMXlNTitZMmRja3FHVGVIUEV2dldEU05oT0FmYmVmWDBBNnJTOENVdzhYOTA2NmJGSWZkcU1ISklEKytESmdMQUNRdW15YzNneUFFWVJSS0ZDTEQxZXU1T0RMRjZRdlhlZHgwdzNBMUJ3d3hkQUpMVFhqZDhzZVFuR3JaOWJQRnhMeUE3V0lLT042M3RZdENRQk4vc3Y5UVBtNkJrTHAwdmw5dC9tNmlldFI2ZmJ5QkE0Z25YdE9Sd1JScE5uVHRQcFc2Z1dMSDgzbEtxY09GVEVuRGlLdG9Id3k4Uk5GaHJlZnllenRibnJCZmJXZmd0dHNQK2tJeU8zMkVMRDFjSEh2SW5ybHZXczZUc25CN3FBVWxnL3N1RnRBV2tFNTV6WVEwUXBxY0FMb05DWFRFdDdBM0tvYUR3R1FmcW9BT0VVQmE3ZlViS2N0bHR3Q2FqVmJ4dlNpeXZvYXNNMEJhQkt3d2RLYjlmTjdOZmNxQldHaVNXeWtXWEVSMHVtZWFjVUVvblFnQ0tSZklnREZqeWE1eXE4V2ZzZnM4ZFlnaXVNeGdwQWcvdm5NenU2bUYwejZaajVBUGR2UFFlYzBURW9zbnZRb3NHT2hhTHVJWXZud0VZU2l0aEU1MkYxWEZBQTBwNXlpZ0Q0b3RDcXlnRktucEhVcExZUDBPY0tVUll2Nk1qNE1OUjQzM1FoTTBnTDZRb25nYXdPZys2cmw5Q3N3S29Ta0VJeFB5VHN1QVBpZ0NZQm1BWFZmWWNWZituMFNSWXc2ZFAxWXdOZ0hzZ1NhamlKUDQyOVJycFdPTTZjeERpSkI2TklOTTR3N0xiVUdNUVV3Qi9NOW1aM2RTeStZVkcwRW9CaURCU1Q1ZGRaK1BrQ3NBaUlsUVpEYTNMVmF0SjBXWEcyUGJMOThBQis0b21CM29QL0hnVFVobUdnQmZScVdmMlRUclVTakV4RFNQL3FXelFEZ2ZBRkFXeXpSOHJrRnREQUtYNzVqbzZuVWd1WnhaOE5CeUhidnZxQlEzNlQxc3djc0JhQkFHR1JnNDBJcitydDlXVURoUTVaQVU3RXMyZTlMTHpnbHFIUnhOa2JldVcrb1FSUmxzNWphTWpuSzBhOWVjTmYyUjRMQXdPODI5a1FCM0xUdEVZUVBVd3pRQVdnVzBBR284QVFIMGxqcC9WMTdwbTBLUmNFaWZHdU5Pbm9jTzFyQUNRYktQWGhzOFR0TndWcjV1aCtuNlpmM3dEZ3UyOWcyRmRNdE9jOEI2UGRwRmowOFpGcnBsdytaQTVGVHZBUVEwL0JUMzZGUERrUnFCVDlKYWc3eFlsUUl0WTBmODhqNzhzWnpDY0tQWmxyQVFmU0NLOXV2QjRoNTc3U0NvdFVpRUo4b3BxOElRRmwvUFVCUEVvQkx4YlJFNjJMU3FHNGRGQjhyNWJIY090aU9RU3FUNVQ3Ukt6WURnSngrQlVDQ1R4WlFDd2hhUWM5b0tjRW5FQktrbmo1RnNKMUxBUG85eG9XV1BXRHkrNklJb3FiZWFPMFZBK3pIQjB6eElRREtrbjFHZ3RYaVJ4TUlBeDBWbjBEYitsa3VGakxSQ3Q1V0V3RDcxUXZ1Mkg1T2Zla0Q1RmFjaVFheS9HSWJGZ0JYcml3QXlHbUpBRFIxY2szRHdURTNUUTRCMExldHpCSkVyVFlBcjJCQlNJM0hUUzh0TEtCWlBvL2ZXUURacDE5N1ozc2NqR2I1QkRwL0wzK25qTXdlQjZCODNHajl3ajNhdE9zUFdpbjlXZ1hDRmxWTy8zY3RmNGlEOFhrQmtINVVTbEFabE5QWkFRcUFScjV2eHUxeWptSDBnaXZiWDBVUUtJNjNvMFd1bi94SHVSOEU0Vm5QSzVKUUxkNFZOdHRUQnZLMnVvaUtPVWYvZitHandNTkJoME5NVjZKMGMwTnBjUnY3bXJZdjNraDgvdUh4WXArYlZwd0xwM1I3c3RzMll6b3VTcTNLR2ErcTcreDdDbzRuYXpBZXJSS3NWbFYxUWl0RjU5ZHl5RlphWVkwSE11OW1XTDNndHZaWE1ieW1CSUZNWjFvdjJoMEIrTFRMaXN4Z1crRXE1dVU5MmlaNzJ1ZDl2dlIrNEpGcDROamtSaDJPTmkwT0IxL1VCQ2t2RVlSaGZ1TnM0T21oaGlQS25GUWx4NmFBak1uU1hKVUFBQ0FBU1VSQlZQam16MXc0MW5ud080Y0NJQnZCd1pnVEFPVUhScTNneURFeEQ0elJHVllFbnBtNUxxbVFjME01ZXNGdDdhY0ZsMFNsSGlCeHVUa1l4eGRhaWhVQzRRVlhGdTVGQ1VENVF0Smw4NXNqR0EwemlReHFldS9mZW0raHcwRjJmTExRR3hGbFlNUnZvN3YxV21JVnRwdDFERmtYdk9SN0x3SjJIU2t5b1ptRXlwb1ZWZThwN2I2cUVNbmlkR0cvVmwvTDJhUE9Jd3VBMXBBSVFFM0RBbUZhNGo5ZjdDUGFGcENIS3VqcjV4elplc0dkSHFBcUt6NVgrRkxSQWw1OGxlK2p1aStrVEJBTE1jZ1o3M0NEQmtwTjIvNytiZmNXT2h3VXlDRUFqUVRjQVZoS2Rqa1BjMlJhamV3S3l1L24xLy9xSmNBMnVoQk1SR1hRT2NuOVU2SklPalhIUXFTWU9zVm9RcDFITmdBdno4eW55ODBINVBWejlINlJxVmQ4NDlXdFhRL3pBME93MmF5R0xKNDc0TDBHNzl2dmJ1bHdrSmk4QkdDZzRTMDFTS3FvZm9OdlNJQys1emtoRlV1cFY4clVUcEpOMDZLcGFCa0ZRbTVNMUhsa0EzQXlNNS91OVpsMzh6cms2ZjBpVTYvNGhtc2NnSzVJU1V0Q1Rvd3lEcWI3VXh3c3FGSlczZm8vdmJ1SUJKRVoxWVJneUh3UUtOaTBLRWwxT0tUQ1pKZHh0UERuLy92OG9vYURhVmdxRnlpVEQySUtmY2paUzRGbys3ZytIWE9Qdjg0akc0REl6S2ZMelFmOEtWZkkvRk5LclE2aDk0dGZ6K3ZPQTljR0FBYnJweWxZMlNEbFZUVHQrdUNuVjMvVjNhN0RRUUF5c0pBd29iWkpnVVhpNzhRYXloZDgxMldlaU9BWnpFeVVpQWtITWV1NUJGNUZ3WlFBV0xQd2tua0xReTlDclBNeTgrbElIWkZ6dk4zVCtZYlYrOFg3YzY0T0hIaXg3NFY2ekl4QitSSjB3UStVVTk5MnRZb0Z5M2ZjWGNURHhRa29Qc0NVaEZJY3pLVkNlZ1NnNUI4QS9QSUxOOVp3eEJTeHRpS2lVQU9pN0pXMGRMVHVzdEY4QUdibTAvMW8zdmpqblNHZGorbFlsR3dkUk84WE4rYzF3QUJJb0hrNms2MXl1U0NKSVRxM2pEWTlWeDBCcUsrK3V3QWZYNkprSS9oTUUwU0MxRUdndWlRK2lzcWNRUkxyRjYvMGpPMncrNkZNblpoeVpZc1ExVzUwcU9IZ1BYMU5YbmR0T0RzZmdNd0h6TWluKzArWk4wUzlZT2xsTXpXZkx3S1FTUzM5NlAzaVkza05PTERQTTF5MDY1SDRnT1czcDR1VERrQjh6V2RiN0ZnYmREaEVnSmtDVURSdm9nVG1kL3ZQdjNCVkFVQnV2eWxOekFBWWk0aGlzVlFuRUhvSXFXYmxyeHFtNE14OHVqZmxqVCtZanNXQllnSU9jMG9KUHNxMXNsQ3BINzFmS3liSk9Fb0F1dVZUUlNDbllsbVU2UC9aNGlTSkVjYkx2K1l1OS8xRUFoN0pLRVhES3hxNENoVWlLeW1SYndqZ0hkY1VXVEFSZ0xZWEhTcjJMT1UrQlY3TVZ3enh3T2ZrT1d5YllBR1pENWlSVDBlZGpweEQ2VmhjT1E2ajk0dFA1MXdkT0hCZE1lWGE5T3FXUmNtV1hBMVhMVUlVSDZ6eUN3bEFzM3orWUJrZnMxdStWSWVqSkVGM2NrcmpJOVQweS9hTUEyKy90Z0FnMDhWVVJLVDh2YktNVWdBTUlHenpBY09pNUhrbkhRQXo4K2wrTVcvODI5S3hodEg3dFR6K2pJTUFKUENZTVVMQVdkNmZ2aStFWTlvdW9aQk0vS3gvNExVQmdGTGdOQzVvMTZGckU4SkpWSmdraUZoYVFRQnYzK2RWYk1yV1ZzQzhVeEZSa2pqYVZzVzJEdFJkT0ovdkF5b2hWWUs3QStiVHZUZGo4SGxxVE1jYVJ1L1h4SGt6amdOa0lPV3VEcjhqbllZREtEdXRncFVocmEwdUFsQXlDQ1VBSzhCWGNqQlhnTENrL2gwRC9oY0J5RHhGQWRBem9GVXFVQllSSlRVY01XZFBQN09OTDZpNWJMUWVBTEpSUStiVC9XN0c0QXVBT1hxL2xzR2RjUmdBWStnbExrWWNsSlZUc2E2cHRDWDN1UWpBS0lOUXN0RnJBWktJd1d4UUloSUp1b3ZCL054K3IyTHpGQ3dsajhZMGV2bC9NWWswa2llVnRjdnJ3R1VuSFFDVmpqVmtQbDNtSXRRc0lQdUVseDlHNzlkT3pEZ01nR2tBV2xOeUJKbjh4S3ByQlJDK3pnRW80TFdSZ2NkVmNPQ2pqbE52bXg4NERyek5BYWhhRlpXTHlnS1d4VU5pYkloVGNQRDlCTUxMYTY1YnpyZUFNU0dWb1h2Si9DZ2gxV1VmTytYVFpTNUNEWURzOUdIMWZuT3JJRGNBa0FCVFREQ0NMWUswQ3dpLzU4NldjS0pVaUVwQzhDQ0JZRHNpaVNwbHFVSVVtT2pmK28ydElpS1ZVSmJnVTV1U1dsNERXd1g0K1BjWG5yUUFUQk5TKzh5bnkxeUVvcGRjYXkrOTMweTVZaGdBZys5bjJPb1VlSTVUZFFlciszMmZkaG1Hb09CWmFuQm8rZzF5RUtVNGRZZ0ZTdnFCLy92WkJJQnQ5UnNoa1RiVzhaWloyaFVndkRMM2lVM3V1eDRMU0JNMFpEN2RQUm5USDA4VkFJZlYrMlhBT3VjUUFNdVZjS2ZGU0QvK0lBQUJzRW9Hd1lBb0haSUtFRVl4UklId0xTOHBVdWhqRlZzNi9aWmhJVld5eFZLQkJJUlhuYlFBVEJOUys4eW5JNHRCemtFQUN2K2NobFVWSUtFLzVjUkdzV21sS2ZJenVkYzNBUExRU2xnM0UyT0N5VlJjMWtwVTNEZ0JtS29Rc1d0bEJjc3dqUHUrbmZUWXRCTCtHUWRnT2YxNkdDWlc2cFhsQkNxV1NncUp5cG9PQUZmWFhEaWZid0ZKTHZpNUhBamxuVXNpSWU2QWpPcDRpUU5RSFJsVDJQbGdKQ1ViYmMycyt2L2hGd0ZiL3E3Z202SGxZcEJibVRWMnNzY1F5eS9xRkJqMnYwL2NBZHovSEdEN05EQTFBVXlPT1UrMUN3V09ld05qS2o2L08wM0YxL1d1dWdXNC9YSmdmQm9ZbXdER2RIN0l4QjVrTFBJQitJOEFmTndaZ2dhNWNrMmZKYkVtOFY5ek5XUGZyYXNiZ011UEFjdXNlSjhFeHNiOUZkQmhBKzdnYVFOS0I2VGZjZ0NZdWcrWUpUK2c4OWFvQkRNbUlNU2NQMTJ1VEtqMTN1RHY4enNLaWcvdUoxdVFPc25vam0zcUI1UDVBQ1JCSDNPaFB1enpSTjlEVjg4SHFRTEVXUEpudlR5NW5tL3QvMXM0QmN1U3BSWnRHQXU0Zmkrd3RCVllFeWNjcll3bjZoRjgvRmtKcDliS3hBS1ZGc24vZDh1cmdiSFBBOU5QT0VPV2w0KzJjZm9GSGhmVnJKVFpQS0hTajVkYU90dXA2SnlDcFB4OHJIV1JWUTdXT2xyWUNNeDhBSEl6bHhrQUxQRDljMFZCK3gvQTNFLytFMmZVWUhYZEY3S1RHd2R2VGQwQUhQOXI0UGdXWUcwS1dCZGZzQmRzTVBmUHJLS3NvTDlYQVZMQXZPMmZGeWxDRTRjS2xpeXJEVlpOY0dTMUNxRVloV0ZpQVpWK1hudGFVUmRUTG1wQ0VicGNoVFlMcWk2TnJrTUN6THp0NVhjNEh3eUptbWtKK1o3M2pRT2g0TldlRFVaaUsxSzA4ZjBFWHQ3Q01IVmF3SWs3Z2FWcFlKVUE5TEkxQW84YnpLWDFjeXRvRnRGZnBkQ0lXejdyZ3pIZ3RoOHUwb1BHRHdFVGM4Q0VNeVNVekZhaWtndGxwVzFUYThKcU5iYTdsVmxqU1JnVytRNlpQLzU3V1F2ajZmeWRCalhmQWpLYmdFdk1Md1dDdmhOb2lwZ05wblFzaGxTNElHRld6SWs2eWxXd0F6OTNFVEx4R1dCNUNsaWRMQUJvSU9TN3BtR2ZHKzMzWUFHNW1ORDBHOEY0Njc4dmtpUEpjek5PQUM0VXlRbTJOOHc5NGtpckZsZklBbDdpNDAyZDZkYlBXV0F0cnNqT0ZpdUN2QUpaT1FFMHBIVEZzY2tIWURlQ3ZoTmdpcFFOeG9BejgvOElQcjVuYnZIMmpkKzZBVGhKQUU0QXF3VGRaS0VCTERvRGdVNCtZVmtQSElCb1B3YXJlT3QvQmtEZXhzTUZBRm5iek5KWW0wSURuVndidDR1eXVyMWt3TDdUcCtpWk0vMDhXVDlSYzdESFVtdVlUci94KzZvNG92dnU5ZmpCYmdSOUp5QStvbXd3eHZaSTVVTGc2Wlc3eTlGUGY5UU53S20vQ2dDY0tBQm92aDhCeVZ5L1VDdEpxMmYrWDF5WUpQR1UyN2xJWkxidUVXRHNXQkhlc1plRHo0aVVSTFVXYTFURTQ3THFLMTJmWm1kM09YaWRGY3RxbTkyS2F0VnMxakFFc052NnNkeW1hYTJnOCt4VUw0SStQbjJiZUNnYkxHV0hJL2g4RzNvVHI0NWlLODZQT2xiQlU5eUtJL0FjZkxSK291UXdIOUJmbW1iTGxUSGJvT25aL1Q5KzV2YWY4RlVhQVRoWHNGT1E0NW1VY2daQ1dUQXhlMFVRK3VyWU1PMS8zN0d0eFFtb0xDQnRSU3AzMExyRHAyU0ZkellNZ2svUitWTnd2d1I5bXdRRHNhc3BHU2ZKZ1lEWU5UYnA4cHNDUUZKeEVJQmtRakRyeHQ4ZFhDVUlZK0NPSDVNVkZQaThTT24ybi9RWUxaOUdwMGN4QU5JUDVJdkFrelZ6eGl2UnlkbktOekJhOGZkZE04NGI2QUZ5QXJpTUYycGFqazlrWUllb0NsWG1BM0FRZ3I1TlFFSE1CcU1WRk1OYUlPYXlOUkwvdmhsSDNSWndtaGJRUVVjQWFzclZWR3o0RXRqQ3UvM2RmYi9JRDNQYlQ3dUtBWi9NaGNJQzB2cVJUbzRXMElCSUVBbUV0RndDWXFqVzAzYmNtZHdCWWVvV2dldFViclI4c25ybG9pUjJkcnBBQ2YrckQ0RDlFdlRWaklKdTdIQlYrNzgxWDc1MkN6ajlsd1Vaa1RFZ2NQb05QcDVOdjRvQlJoQ0c2ZGQrMURrTXoxSkloUjFCQUhKN3p3cU8zZklSUk01dG1ESzVDb1FLc1NnT2VCWUJLRlpVTFRxY0I5cjZOaTVLWW1kM1dLRFVBMEJsaE5MTThFYlQxUUJYQlU3MmFJNVpqVWNWT3h6N1dMa1E4ZDM3dnNhcnQvdUE2UmNQc3hOU0F0QVhIRFlOQzFBRXBmOXMwMWtLd3VCd0dVN0hnVnQvMWp0RDFlNjBmZ1FpZ1NlL2o1YlFwK0tZcEdCK0g2MmpUN1A4L1p5cEJJQzhEaGN4OGVZOXdGMDE1YWJobW5vQXlKNVdTcktlTmdLTzlTSHhuVC9MU2FzSkJpbTVsUmpXQkVJVmVST0luS0wxcXVueWJSYXdMZ0FTZEV5NzRxamFOTnpKQ2dxRUVZekJHdkswMjk3bUFGU0hFSUI2ZWJLRGdjOEoxa3NtVjh0MjlmMWVuNkw1djZjeElLNWlLNlhuZS81akNUaUZjVHFWbi9yL3RXRFBXd1huRVBUVmdJS1VIVTdsakFTYXdLZWZJd0RwTWRSeFJCK3dGZ0QrUlJFREpBQnB3U3p6MmMwTGZ4Y3pWamtWS3dhWWd0QkJlenUzU3ZYMDhkMzlQNXVPM1FLYWhYTVFjaW91clpSQUdLWldhci9ZWjF4WFJQZTh3UXIyQVVLN1R2Yk9WVFpCWHg0TUJFQ1JuQ29uVUJTRkVYVDZtZi9USysvcW16QUYvMFVCT1BxQlpZRjUySHJURkN3MkxINUc4VUN6SkVrbzVuWnFtUm5QaC91Q1htcG5WcERUc0lQUHdLQXBPYVNBMlFMRExTSGY5N2lQeDB0cElTTGZ6N2JsNGlGZnNVc25qK0haV0VlT1lEQ0RuRG1DdlprRWdlZGNDanhHc2VJaEJZdDN2eDA0OUh3TUxSaDhnQTlnaDJNb0g5QUJxS0p6eGYwTWNPN1hsU0FVNEh6aFlZRnErNUQ3aHdCdS85OE9RTGxJQkNLblczOVNsWE5ZK25xZWlxMmRrUWcrZ25HUGI5L1pwVDBscTZNVjVEOTZnTEN3Z0RtQ3diZG5DdlptQ2dZL2R4eTQ3eHhnNVNXdVVqaWdZUEhGYndBK2Z5R3dmcjJyWHJNdlBCK3ZwM0wzR0hDZ2k5Sk9IUUNrUlZQcHBlVUJpZ1hMRnlteWVqWVRCNFlzZ2ZBMjBvZlJBbFlCMEZmQWx2UXFQMC9Uc1g1UExPQjVETnU0NzFjbUl3aUJhUnd3L0YwMUorbXoycHFDaHhVTVp2cEpsbUJ2M2lUb2NzVzRkemV3ZmhrR0ZpeCsyZmViWERBZUpPL1lFSUxCQjdwVTFnOExRRm85OFFBU1ZHWU5RNkRaZkVHM2ZuRXFyZ0xoYmYvSFYxNWFuYmtGTkN2b2hXU2w5WFBRMlhUTS8yczNJNER3UElad0JFRGZnaXRIMEVrNk42eCt1L2lEN1Q0Zy9ZZEJCWVBwV0hFYUhscXdOdytBUWE0WWo1NEpySk8rYVFEQjRwdCtvQ0F5WXZPUEVJUURDZ1lmZUYvOVUzQWJBTVg3SXRBbFZ0QXNwS1pkejVTT2x2QTJwc3R4akVTM3dKKzkyTmdBR0syZ3dpNzhRb1ZmRWhCZVFBQ3FOTlAxUmRvQTE4a0tkZ0RoeGtVSS96S0lZRENucXl6QjNqd0FKbkxGT0VJVzdRRUVpMS8xWTIxeXdWZ2xDQWNRREQ1L0VmajdNNENWclo1QUtsa2h4ZVFVYXhCSTRudkZ6eGY4SWZDVkM0SFY3Y0M2WkVYNW5lbjNWWDF2QUdMWnE4eXNydkhZK1FCd2JHZkkyRTZKcEx2ZFgra3N0aHBVdlFybVgvc1ZER1pWVUpaZ2IxN3ZKSExGZUdRY21DZFZiNStDeGQvNXhqWjZRenpNTE9RQkJJT2ZUVjJQczRIRkhRN0NMUVVRbVVyVjByZ0tKTXNDanN4R0FxVG4vaHp3MEVYQTR0bkF5ZzVnYlRZQm9yS2tVeUxua0I5WVZoVHh1K2tUMTNpY2N3dHdkQmV3UEF1cytiMmFyOXhKQWFmcWZnTVFPNGRoK0o5K0JIZTVncVpaWnpZb2sxSkpVY3BhUjZicDkzUCtXL042cDBLdUdJZW1nRVdLZ1BRaFdQeGRQN05CTGhpSEtZSFVwMkR3cFo4ckxPRDh0bUpRVnBsT0x4QXFtYlJLQzZFRFlDNy9DZUNSUGNDeDNjRFNyc0lTcnMwNENQbTlBclprNTVVdktBc3BZTHFQYVBkUjQvSDBnOERSSGNEeVZyL1g2VmFiTEhrMlBoanBQVlpZN2Q1eHdGNkN3Uzl5LzRMYmJWeVFzRUtJdWZHaUtlMHAySnZYT3gza2luRjBHamhPUVkrb05SdGxqamk5VFFQZi9mT1Y5SVpZNEdxNEQ4SGd5LzRXK09vMllHNWJVVXkwNHZVY0xDcVNKVlJXc3pKYk5neFNtTWF1K3EvQW8yY0JSODhFanRPcWJnTldXYVRrSUZ6M1lpV3JGNG5BanROMG5CWnJKblUrLzhQQTNDeHdmTVlCNkxVcmEzb2dsTDB0cHM2d2xWaGE1ckxpcWQ5QWREZkI0SmU2VTBzLzBCWFREWWg4MFNyMkZPek5BMkFYdVdJc3pBQkwxSmFLV3ExUitud0dlTTE3T3NvRlk1WFRWdy9CNEN2K0RqZzBDOHh2TFlxSkNFQ3pnc3htWmxxOVQ4ZTBYR1V5YVVpemF2UHR4b0ZyL3p2dzJCbkEwWjNBOGUyRlZWM3g2YzRzcXdPYmNrZXloaVhBb3dVU0FEaEQxWGhjZURNd3gzN2x2VTRYeFZOMm4zckpJb2N5Z2tyL1ZiczdmZStFZEJMY2ZhWFhRM0lQV0lycEJCNlhsbndwUjc2allHOWU3L1NRS3phcnhNN3FKRmo4bWc4VWFyTVY5SVo0Z3ZOREQ4SGdLeDhIRHM4QTh6TUZBRm5QWVFQRGwwQ28yZzRmcERaTHFLQ3hUMC83ZmhKNGZDZHdiRnZoUml3UmdKcnVDT3dVZ0NwZUN2VWpabUVGeGhmazlXOTY5a1cvQjh4dktRcW5WZ2crQjZDQjBNc0k3UDcwQUhnbWQybjFOUTBydjdGdkFMSWxWWUs3M01uUUNETFRoU0dab0RwdVA3dUNldVg1bjh6cm9CNXl4VGhHblEwQ2d5Qk14WTYzQXEvNWFCSEc2RUJ2aURsT0xWMEVnMSswQUJ5WkxnYmwrSFJ4blpYSm9xcXR0QTRPRG92bEpaVnVTalRRRnRxK053TlBiSE1BenJhbWRWcFZzNndFb1B0ZE5nMzd3SmZ2c1lpSlA5TkZxdkhZKzd2QXdqU3d4QWVOeFZPOFQ2YU5WUlJSbFQ2aEhySjBPdmF3MFdESkNLbmc3Zzg2QVB2TkI5d2cySnZYTzMzSUZXT0JnbjhFSWYyblJMRDR0YmUxK0FVN3lBV2JaZXNrR0h3VmRkMm1nQVVDY05LbkpnTFFyWi9WOS9Kbm41SlVZbW5BRTNoQ212Myt0OEFXUWZTenlQSy9QT09nSmdEZHNncUE1bmZKQXZMZExWK2J6MGtLNFJxUFozd1FXSnh5QVBxRFZoWlF5UXI3Z3lhWEk5YXhXQ0ZWQUdMdlJVaFY0NlBnTG5VV0JzMEhiQlBzemV1ZFB1V0tzVFJaQUpEVG84bDh1aS80Mmp1TDV2ZVFDN1pwc0VvdytPclpRbHFWVnVINEZMQThXVnlEQU9UQW1IVVFDQVdRa09sc1FBd0R0LzkvQUU4U2dQUXBOYTA3K0FoQUE2SExYYmI1WHI0SWFBTWZ2L2VHdlA1Tnp5WUE3VUdqQldUV2poNDB2OWZTeXNjSEx0YXhoSld4RlZzTk5BWEgxa2h3OTgzK0RZUG1BNWFDdlhrZE5JQmNjZW1mY2Vvb0FmaEFBY0ErNkEyeEx1QUd1Y3hyemdLT01leERmVjlPd2JTMkJCL0JFb3FMU3JCb1lHZ0ozRThxTGNJRXNQL25nQ1B1VXk3UzEzTDN3YjZQVTU2L20vWGo0UHMwVEtDWFFBNkFYdU5lWlkzSE16NVFBTkFlTkQxa3djS1hsajZ3T1pRK2I3UitQaTBQRDBEZUZBZms1OTBDS2c4cW5jZm9GeklSVldWcWZGZkJoZ24yNXZYT0FITEZXQ0RidlBzdEJzSlo0TFVQdCtqZGVzZ0ZnK3FWcHRXcTExYmcyZ3RnZnVMaVJBQWdRZWcrb0Vtc091anNYYjVTc0FvQ0lOLzN2eDA0T2xOTTZZdjB0ZHgxTUt2SzcvVEZqVm1lQ0Q0SFFRUWhmMTU5ZVY3L3BtYy9rd0NjS0FCb2VZdlIwb2VwdDdTRW9aUTBUcjFsUHVQUUZsQXRPMG55QWNXaHB6dy9GU2pGekdqTHgrUkd2eHpvU2VDMWh3c0E5a2x2YUZONUZBeSs5bUpnbmhhUTBxcWFnZ2xBRG80YzlBaENEcEpQbDVab21tUTg3MzhIY0d3NkFKQlcxVmVjWnYwY2VQd09ZMC93bDFsQUQvV1VDeDBtTWxETHI4YmptYitEd3AzeDRua0RZYkQwdGhJTzVhTnRmbURpL3hHRWVSYXd4aHM3VmIvcTJodUFCUUp3QWxoeXkyY0MweG9nZ2pBQVVDV1dBa2tzT2lJWTk3OFRtT09xZXFxd3FBeDNXR2hISzA2bjdURHdPY0FWL2lpcFBBS2p3Z3JabTJvOG5rVUEwZ0ttQUhUcnArbzlNVHJFWXZxNDRvOXBaSU90Z211OG1hZkNWNzJZQUtUL1J3QXk1T1BPdVZsQUFrOU91bGU2eFFSVFdVS2xXdGtVL0l2QUhBSHRpNW9Jd0RLODQxWlBGdENtZHIwVThQYUM5aFZ1bHRkNENJQzhQMlp0dC9tNS9xQzExVEpYbEpER0dwZkdBbVlPRGdGb0N4QUNrTHB1V2gzS0NncUU4Z05WWks0S3R4Z2pKQUIvMlgxS3JhbzFyZk43Q1daZjNMU0JUNHVBRUl5V0JWcGlwTDdHZ3dBMEFXMjVHYkdFTkJUUngzcm0xTTJ3MzltbXJGVndqVGQxS24rVkFaQUxFRTVMdElEeU1XVUJ2YkxOTEdIZ2Q1SC9WMDdCRHA3cjN1VStKYWRnbjNwdHhla0E1TUJyaTAvV3A0d3pCakRiQ25rTVdNcVZwRThHSndMUXF2ZmMwcHFia1ZqNWFOazdnYkN4Z0pubzMwY0FqbnRvd3RYTmFaMXN1dlNLTmhzWVRjVkttdzlGNXhHRSs5NGRmRW9QK0pZaEQvOE9DOGVJUFVzVUhva1ZWS0I3OFhzemJ6QUY0UHZkLy9QQ0tWR0lwT0FyNzhtbjREWk9tOFlDMWpjbyt3NkVGVEREUEpxZUNFQlpCYTVHZmZWYmhtUThEdFpXNVRZT3ZQaFhpcDBHVHV1MjJsVE1MU3crYUFWbDlRaEVXanVySS9hUWlMSmtUTUxzWDlSM3IveW1aNzNmcDErMzdPVTlodW5YU2tkbDdUM1FyaEtDdGxDTTU5azJpNUNNTVNJQUdkcXhFSXdybXB0elRzQ0V1dDV5aWxLb0pMQWN4Q3EzZmU4dExDREJGd08rdEtqeXV4U0NNZFlFWG9lRHJIY0h2dTB0VHdMem13SEE0Ti9HaDZ6TkNxcWVPU3hDMmxiOHRRU2lNd2J1cVhJcUFjakZoMkpqQktHSnlTaFFHNnlnVmJmSmVnVUxXQlljTVIzcnZiNm9DUmFRd0ZQZ2wxTTVyUjcvSnRCWk9JWld4LzArczRRZVk1ei8xL1gydEZuQXhQcEZFTGFWa2RMTjhNV0dWcjRwQ0JzZk1ITjhibVRLZkNqWjBOY3A0NTYveDU4ekx6Znc2UWYzQUJkOHBVZ0VZbXFrNWJHeWVrMDZJUWwxYmtYU2NubE4vdThMMjRHZHgxcVZxOTFLUXZycGd3YUFBdzlwK3duWFB3MVlqeVdNR3REbzJBU09GR01VN1NJRVV6ZFlEMzR2TVBtWHdMYkhnZGtGWUF0bEdpaW02RHB4SnR2cTlMdGxWci9hV0tFQjhwVVhBT09QQUZQendCVFo5cjA0dmRROVRzNHBBWjNjZCt5SHhnZk1BT0grdmNBNjkvOVV4aWptei9BZXJZcGRhcjFsTlNNWXpWK3ZXWS8zNEk4RFk1OEdwaDhCcG84QTA0dkFGRUZJa25JSG9oR1ZSNjJRaEZSU1lqUUU2cUZyaTJ6M2lhUEFoSE5ObHhLd0FySTBRMUlBeHdmUmVhY2JDNWdCUHA2Ni81SUNnTEtDdHFuc3JLS2xyRlpVRlBLT3I3b3NNVHRkc3h6cVFSWjkzUTFNUEFSTVBsbG9oVXhScWtFSzZnU2hPUDBTK2RZMmhsUnY5OXkrb3ZSaTdJaVRuVHZMcW1nNnhEUFlwcUFVZ1Jnc29SN014Z0ptZ0hEL2M0RTFGWHU3RlJSYnZFZ2Q3ZXZYV2xiUHBwOUVnVWppSnB3ZTZ6d09NbHZwQVdDTVZ1c0pZUElZTU9sU0RaUnBvR2lOeEt6YmRJUWxYT05NV0piR3R3NHN2ZGd6M0VsNDduelRSdlBycktwdEFKVDZacnpmaW50dkFKZ3g0dnN2ZFF2SVhLNVZZRjNzVVp4bUpVdmdBMUZPdndGOHNwS3lCdE0xeTZFZXBJNExxVk1lZGJFYVRwMEVJS2RQS2g1RnFZWXFTeGdvMmpnRnIxM2o2WFhIbk9pU1pPZUJWU3Z5QzhxQzJyMDVGVnZWdzljQU1BT0ExNzhBV1BNcDJMSmFhZWtpQ1BYRXh3SHc2NjBuMW9CL25pR1FhendPa2tTZXBiSi83MkkxeDRDSitjSjZsWUkxcmljY3JWaWNVdVZTbUlXODJwa3duSEhWT0tiRnNPb3pRR2tGa3dld25CRVMzN0FCWU1hQVgzOVpBVUNDYjgybklsbys0MHAyZ05udnNvS3VueEgxeEd3QS9MT3pkUU9RSlBJdUh6VjJHQmc3Q293N0FJMGwzM1hmak9zdjZvVm9kZXM2SVNiQnNBWk1YK2tKeFU1NktZN3BrbUZWaE9jaXV2VHpTdDA1djArcnl1VC85Z0RyWk5lNHdQTXNJN1ZKUDNHY1A3Z1VPT2R2Z0wxclJZSjBaSTVJVjNoVjQvd3JHWVBQVTMvQWlSaFl1c3kySzdtVTk5OVArejkwT2JEN0x1QlpLMFhka2VxOU5TWDIrbzRITHdmV2xvcEZDQzBmZ2NpQk10QUZDOENHcllYVm9Wam5VMkc3clRYcnpoNGtmUnpMWTFreUd3Qm9laUdjUGlYYjVlQXpkWFduYXpQQ1NTY2I0ajN4Zm1hdjhDeDJwNTBsQU1XMFZYSU5pdENvZ2wycjlIMmRjY3RXd1F4UXNuNlpUQmJNTnRjZ2RLSWJpWmo1MVZjQmszOENYUHhvUWNmQ1VnOHBqY1lnWlNjdy9tb21BQ25YeXI0bGVCaHM1UWFCVEhwZjdYOGRNUFlKWU84WGdBdjllOFFKbEFaWnE4RDR4U3VBTllLUEpRbjBBUjJBSEt5MU1BQ0tlOW5mRkk2SUVxZHVFV29ISUo5d2xzVktMZWtvTUNhOUVBZWdTVFlRZU00VFhjbzJTRU1rQUhFYkJab2o0YmJZdGR5Q1ZyRnFHWGdUU3hnWFlUWmVITGk5QU1qRVFSQ1ZVWFAvbjRLVWFhVDh2VlRpK1J0ZzdHUEF1WWNBV2xNQ2dVVmtRZkoyUTEyeUJ2UFhNd0hJbWhEV3dmODFpbXNUaUxTRXZIWmtyK2pZL3A5Q1FSRDRwOERPQnd0ZUl0YWkwNXFuMzFGRmRmTGxGeFlXZ0NEVUlrUmtqL1R4YkNFaS84OWpmUFozWDJWcVlTSlFibVVOUVkzSFFUN2hidjJzTG9lclZ3S1FITkVFb0NzbThSNE1oUFJqWFVHelZFSUtJb1k3eWFFWXVZNGRnR2I1UlhydW9TZ3RTQ0xMYXJrSUNROWY2UU55a0dqRmRqc0lCYUk0a0dsdDhXK1JnNWcwSEo4cUFwNDduaWhBekZwdVd0UElNQlpKbEFTSUx2UjZmUTBEQ1ZiSkNrSk9KQ3FuazRwR3BiOTl0WjhNb3B5aUtEWDdXV0Rpd1lLWGlFUU9laENyZ0toK2VKUStFUUhvMUxieS96Umx5ZjhUSWJmOVhTNWZ0SWI4STkyWXVnSDRheTJwTHVzb3JsN2RBb29uV3RNd1FTVGRPRnVRU0xUR0h5SUM4a3hTSVF1QTRod1UyV1VBb080L2dyQmNEYnNmV0VsU3pnK0pDb1lEb0VHTTFpeFNrSHpnRi93Rzd5OHNJYTNKN0pQQUdXdUZKU1FJYVUwMWlKSFVpWVA0ZTMzQnJQT0htRy9KTWFPZlRaVllSaHdHYXY4N3ZXS1BKOS9yU0g0SU9HTzVzSVRxZy9nZ3hYczRUT2FCQUVDYmVvT3NnZmwrRHJRU2hGcWNFSWh5eXQwTWJNdXNFa3g3NmlBWlhLTThCdlhpWkFHbEYrS2FJYmFhZFlwZW00YURncEpaUXo2WUpBQlY1VmNIQUpaMHY0RnhYNktHNVVwWXMwS25xamhSdWFnRVZnUGdsWUFsOWNpSGY4bWRVckpoMFF4OXZrREJ6Qnl3ZmJrWVFJR3dhaEEva2dsQVRzSHNEektBMEJBVGlQeVo0TkVEd0llb2EvdUZZS0tYTDJmMjRuUW9JZ2Q5UjN5UUNNVEZxd0lBZmRCV0k3K3lCNVpMRUNZTEVUZDg1WUpsKzJZQVVOb3NMSWVsL3hZbHU0SnNsNmJoTmhENml0NFdKQ3ZBMlpjNEd4bzczUmNnSmVPcUZtR1I2cmNDaExZQUN5R29qbUVZZGo1OUtuWit0SVFSaEg5SXZXQTJoaVJFakRlUkk5Q2x5N2ZNRjNFdFdSRmF3aFFJZjVJSndFNTZ3ZFRJWWR0N3RwOXlzMUs4Sm5vSnZvZDlXbjY4MlBOa1A0aFV5MW5kV2dzdEF0QkRNTFlONS82UEFjNURHTm9GNFNyWmZOKzQrSWhUOGpxd2cyQ3A4VGhJSjV2ZlNXQlhBVkNyV045U014REsrc2thT3Zob0FjOG1lNjU0cG1VQjNmMHd5dCtFOEZ5UkFHbVBsT0VvaVNEMnFndm1BS29PbTUyZkF1aVRESFN5SVJ4eCtsSTBReHhBRHViZkY1dmZmTW1TYWpyV2xQN25tWjNkU3krNHIvWnpBVUVIblE4UjcwSHNYbEsrUGdKc1c2OEc0WFlHWmowRVkyRVlBVENBVDZ0QWhtRTBEWGNDNGZhYXBjd01nQUlmTGIwa3V6VDlRbXc1dXdBQUlBQkpSRUZVU2krRWZlQUxrU3JwQm92YnJRRG5rbTh3QW84L0UzaStDQ3NaOThOQ3BBcDhjVWVrWnlCYXZJNEVUL1RuYUFrL1JRQ3lBWHk2dU5TUEEwaSt3TWVCNmVQQTVIRmdacTJ3cE5HSzNGVURBSG12M2ZTQ2U3YWZYOENCNFVORUVPb2xWaS8zb2Jhc3ROd0o5Y081Qk9CS0VRTXNBY2lmSFd6UkFpZ1dXQWxDbjVLMmJRWUFPZTFLTWpUSVIya1JVaEtWUzdJckxpYTB2KzN4d0hNWk1DYllOUDBLZkc3OXpBcUs1RHhPdnlFdVd1NlZENUtTSHkyWUFFUUFmcGFSZGw1VWt1VWN0SXBCbkNJSWw0cHNEMDNGdElJUDFBREFsQnVKTTQ3RXFxVVgzTFg5a1NCUWN1dXlmdEs3OHhVa0h5UStSTHFIWjNGdjFLY2dMajVrQVExczBRbzZJQTFuSGhOTFF6QThaeHZCWHVOeDhEY1M1VVlwTm5vWXhzQ25VSXF2Wm8wRjN3UFRNYTdIdjUzSE9KVmJTL2wrNWJ1bVg3ZCs1V0xFNDRoeElSSkIyTk1DcWo5aXh3dUU5MHN2V0NhSUE2YkFwOTU5RUtlV0NoQXlBMFBUT1YydW5HTVF2ZUNPN2JmcUhiY1M0ckpSN0V3cW53NUFXaEx1SW1nMnVGUUFYQVZzOFJHbW50VzQrZzJoQjNQNzlML0VKOXpHdnFyeE9QaWJpVmloQU9ncldRT2YvRUJmQmNzUE5CQnFXOUh2Nnp6R3FGem1vWHozQjlBZVBnWGlxNmJnaXY0WU9COVFIUzhBZnBrQUZNTWpyV0FjUUEwaU85WEppUXlBbm9zMnZWN0VTSE9PUWZXQ083WmY3RjQwbVpGUVNjUktBWUJhU1U2dkFWY1RnTjd4WEhpVUZwRFRNSzJkRmg1NjkxMkJUaURjdnBrQVRJWHpDTDRnM1dYVFo0anBHZmpvRi9vaWhMK2Z4KzB5V1VBQkx3SXd0WUtLSWFiZ0N6SFF2aTJnZ0JLbjBNY0VRRGFLVDVjR2tJT282U3V5WXpFZmpRQjBFTTVuWmdBUG94ZThvZjNzZ1NxQ1FNM2prZEZMdnBSdlIxMys3VVZSdWhVRlNhdk5PNm90d3A4OFpaMyt0NE02SEx0Y2g2T1Q5QUcvcTljbXRmLy9nVjFKRFljblEyelk2L1lha2ZTclUrUGcxTTQ1TnFQdDNJRXRvTTdXRkhva3lyV0trb29nbENNV0xZamlVWE10SzNnOFV6ZDFXTDNnRGUzdlJSQ29VRVlDd0d0WUZ4eHFnQTJFL2pJMjBGNWhobVFvZDk4QkhObmx4T1RpZzFhR2lEYW5PMjF5VjREeWdXdUI4WWVCNmZuQzlXRXRpS1ZWS2VFMFpHaVhXY3plSm9XTUlpZzVhOVY1REExQU5vS0RlRHlsWjlOU1h4eUFzaUthd3JRcW1DdjJIVmY1ZThhUm94ZmMxbjd4cytraEl0QVV2b2p2eVdyeXhWY1dKWmtzVlN5Wm9RUkEzZGNBb0h6YXg0R2oyd3R1NkZWS003Z01ndGkwMmpiVjQ3Nm9VSkpzMWovQWJBMW1RM1BtOGVUUnNvWkR0Uit4WktDaUVLbU1YVEllWEhQR2RoWUFyWDhGd0c0REdNRW5BSElLNHl2VDU4bldDMmI3M2NleGFaZ1dXYUVLZ1UxZ2pOYlBQN1B2T1lHc1VTQmt2M2hCdG1SV056eGpUazlSV2t0dnhwNlBPajB2QVJqWTlzV2tGZWw4Uld4ZWdqSUY0Ump3QU9uWldNUEJUR2pxdkhtc3p4Sk9CVUQzeHl6bkwyYnFST3ZvUDNOM3E4NGpHNEM3TS9QcGN2TUJlZjBjdlY5azZoWHYrMllubzVRZkdBclJiYUNDMG1XdjJZdEYzZWNlck5EaGtOWklJc1hRUnY1ZGxUdEdBREpTejJnRUUxRUpRTS8vMDI2SGRJRVpMQzhCNkEwdGswZzFKYThEdXpKZHBoUzgyUUJFWmo1ZGJqN2d4Wk41ZXIvSVpJKzY3cHNjZ0U3UWFET1VNeUMwV2I4K2dYanVSNEY1SjZZc2FYbkZoQm9BR0VWdlVoYjYwaklTZ0NRbm9oL09MQmd2SXJMOHY3RGRGa0VZTTVkdE5nOTd0dno1ekpxemRmSUJtSmxQbDVzUCtESlA1eHRXN3hmZm56ZWg3SCtaKzMrUnBreVdUMVl4dVVSSllWdHg2VDBmQ1RvY291UVY4NVZrSFJJR2VnRXVFdi9ZS3BrQS9KY2VWbUw4a3Y2dDUvOXB1NjJ0ZmlQV2NGUVZFYTBEWjlXY0xKRVB3TXg4dXZmbmpUOUlnWnlqOTR0L2xkZUEvUzl0TWFHYTlTTmRtc0l4YnZWc2NWSjFHU2NvTXQ0VVB3aEFzbU1aMGFYelFCc3ZkR1JCalF6MEZVcEVKUkFKUU9xNEtBbkJkeitzZmlQSjNiT1luOGZzeWt5VldNZmlOM0JPemNrUytRRE16S2U3T1cvODhhcVF6c2ZFNWtIMWZ2R2plUTB3QURvZG1WR3dPZWlNc1VxSHJHT25TNFVGeTlQL3dBRW9qa0VuSStJcU9JSlFOTGdwQ1hoY21MQXREL0Qra2dRRTIzNUw5M3RqK1lCcWdUWDlCaUNlVy9OZWRUNEFtUStZa1UvM3NienhCeW1RdVpobThnMVQrUWJWK3dXRmRqS08vVGUybUVGTmxDYjZnUEY3MDhWSjFUWEhnS2Q5MUduWnBEZmkxay9nTTJ2cVUzRFVuQ3VCbU5RZTNQOXZ3NnBlMjI5S092QjBLMWsrWlMrcm5yZk0yQWxBM0pNWnRhaC9FWktaVDNkcnh1RHoxTy95eEF3dTlKZ0p4cjNsUWZSKzhhYThCdXkvd2RXUVpBVmwrWnpDckczcTljL1lya21IeTNJUllyeUFBcUFrRUJJbG9wSnhOTlViRVIrZkEvSCsvK0FBZFA5UG1TOWRhemljSnlibTdtbEI4blIyZEkxSHZnVmtPbFpHUHQybk0yOUdDYW1jR1pqQXdsUSt2dnJWKzhYL3pHc0FBVWlMVlBwL3dkK3phVE1GV3crL2tBQTBHUVFucEN3NW1Ec0FNSXJjUkI1bUMvK01BZmZUd2dmd0tZMktmbUNaNlpJa1VTaHJ4WHhCWDR5WWFWOEh6bWNuMTNqVUE4Q01mRHFXWWVRY1NraFZPbDhVNnV4SDd4ZWtyc2c0OWg4b2lDRU5nQzVUVUc1dkt4eFQ4ZjJhUnRPdGNBS1Exczhzb1B1T1ZVSXdwY2hObEVFSU95TlNJcnJ2djNod25ja1dJWlBac25iY0R5elRwdmczbFU4bXBaUXFvenlmSzc0YWozd0FLaDFMZ3JzRDV0TXhpei9ua0dEMXNIcS9ZTkZPeGtFQWN1VzdvcW1YbGlzdVFPVDdWVjJqd2kva1RnajFSa29aaEJqZThaODNTQ0FFRUpaVzBDM2dmZjh0QURDdDRWQVNhV0lCSzBISTlxOEJGNXlVQU16SXA4dE54NUpnOWJCNnYvamREUFNSbnMwQldJWmVVaXRJbzlJaEhtaFhUdnpDUFFkZGNjblo3NlUxVi9JdkM0U0JDRnlnMjZERk5nN2MrK01oaGI2cWlDaWtUN1dWVW1yNmxZbjJuUkt5cmRaNTFHTUJsWkljMDdHVUJkTWpueTZYQ2lVbXBBNmo5NHZNWmJnQk1GbzU1MnB1MjdQWEFxWFR5QVVRY2l0T1FqQW05eFgwTjlwSXdJUG1TQ21INVF1UHFFUjBMNGtEWWdwOXpPVUw2Zll4a2JaY0ZjZXlBcmVBRjNHbFYrTlJEd0F6OHVrc25UM2ppSUxWU21wV05saE16ZStrOTR2TVpmZ0dBUEplSERqcENyZ00wMVRkcnk5T3p2bVlBekFxTFZXSXdFU2h3emJSd3dTRW4rTXFQNmJRSzV0WmxXeWhqQ0NDc0MxOVh2N2dPbkJSYmdwN2N1LzVBT3lWanFWTW1BNzVkSlo5bkhGMHlvaFdObGhNeEtuUyswWG1NdHdBbUZxNGltbllickVxTkpQYys5a2ZkNjJSS2gwT244cVY5aFhaOWFza0VQZ0FmSTU2emlvY1VnVmJ6R1QyOGxFdFJNb0t0ZzdsQkh0em5mWk5BK0NRK1hRV004azR1Z2xXSy9OTFlLelMrOFU5R1JlWEQwZy9UeXZoNE5lMTdZYjRaYnI2ZzZ5Ny9hTldjb1BwaktSVHNKSWFnczVJSndrRUF2NmVuMDVTNkdVQmZSV3NVRXhaeVZaVlFDUXdyZ043V2ZkZDQxR1BCY3pJcDhPRGVYZlRTYkJhNllZeGxZOC9wM3EvdWRjM0MralRidHZxdDJvYWRuQjJtNG9OZ01uMFcwcCtoWVdIV2J3Zzl5VS8wS2I5RUl5KzV5MmhpQ2l0NFVnS3lUZUFrTjhWYWxrNExlL2xkbE9OUno0QVdXQlJNNmZkSVBmSHN0dy9HK1NFNXJNblZRL2tBNUFrTEhTMGFrN1Y3cmVYZmhnQUNhQnFEdEQzZS9ubWM1azlrQS9BODBKUmVxK1UzOHpHVnAzT2JKby9CdkFPRDNkdHdpV2FyOXpFSHNnSElHbEZ1YnFTeDcrSmphMzZhbkxMY0R2dmd3QStORHBEZklMditxbHp1WHdBWHVTanJrS2VtbE8yZTNVMXVXVVluTDhkd0IvNWUyYXBjYTlMTnYrdnNRZnlBVWhlWDRWZ3VCK216SXNhRzludHF4aEY0WGJlM1FEK243L3VITEFXOXdRMXRibE1SUS9VQTBDYUhDN3BsWEVoK3E0VDBPV2NmaGxlWVRTSEJLMEVIL21pK2ZjUnVLUW40STZmV3Blb0I0QWV2Q3ozSE9PbTl5YjNGNW1CbFpCTmNsWUNqMWFSZnlmcmJnUENUUjZBeksrdkQ0Q3lnbFg3anBtTjdIWTY2ZDFFMGN0ZElyRUVFNHdFSU1sYW0rUGs3WUY2QU1qN0V3QVZiVTgydlRlckN3aEFYb3BKTjl6VkkrQVlyT2VVTExaZ0VyWTJ4OG5aQS9rQUpHV3IwbmFVV2RGcHkyY1Qrb0NXanBkakxGeEU1VXpZSUJCcEVVWDVuTG5sdkFrdGI3NlNQVkFmQU9VSHBpQU1tOTZic1Z0Q0FNYUtBTElDTXl4RHE2Y1hmeWNBK2IvbU9MbDZvRjRBaXFCUklFekJwNy9YMkFmMCtmaTFYSWlvTUlsQUkrQUlQSUdQbWVST1dWM2oxWnV2eXUyQitnSG9GZlppRFMybEMwTGlZNTJXVUFEa1FvVFRNSDFCRlNZUmRIb1JmS1N1NXY5cXJpek1IWVBUK3Z4NkFSaFN1RGNBenptRG81WkdIVDFQQUtZTXdReE1FMmppU28vZ0V3QnJycSt1NDFaT3krK29ENEJhQ2NzWFRQaVNJM2V5OHM0S0dvRzhRd0NNRk0rMGdnUWhMUjBCRjE5U1h1RC9heWFrejd1UjAvVHNNY3hnM1NqZnFXTkEwaHNyZ2Evb2phcS84V1BjQytZSWs0S2U0Q01TdUIyWFZodDFPajh6SWZYbFU4QnRVOERobVlSWFdkZnJkRjFmZ3IzK1M4QXQ0OENEMDREVmpYUVNETzcwUFRVbmFKNXVPQ3dzSUlGSFNTRnkxcEtQV0NEc1p4Q3B3OFVWZ0tTUHhMWE05MzdPenh4QWxqemNQQWJjc3dVNFFoNFYzVU44bUtvZUttL2J1NzhJZktKUWE4VkQ0OEN5bEhRaUwzTzMvcWc1UmYzMEJLQUNNdEpYalhLUWNmQlNLOERmcWMzS1ZDd3VOMlZGR1JubS95S1p0cTRSZTVpZnlRUWdNMkErQmVCM0dIYVpCbzVNQUl1ZTBsN0t0M2NDNHhodys1ZUw3VHVDa0prMWpCdHllcmJVZllHNUV4alovcHFyeEU1ZkFPck9xNVNtb3dWSXJScDFJeVQyUjYrZmcwYmdWWUc0Q3N5WmUyVXNhaU9HS1hyNFNmcDlrOEN4Q1lBRlNLeXZYZVkxbzFCeFF1eDkxeU10ZnNIUHV0Z25ueVV1VXZoYzBac2dVWGliK25Wa3E2K1pLYUFCSUhzZ1ZabnV3RDlzVm82NnJyUjRJbWRoTEdTUTh6UEwvSmdCUXhlVTFvdVdrTzlQVGdEemJnbVh4cnpNa2F0bDNrZWl2Zkc1eDRyNElSY3o1QmZrTzV2RVowa2dwSWZCWjh5S2psTDE3c3l5MHRNTmNPbjlkbDRGeTZkTEZhYmoxTXB2b3c5SWZ5K0k0TmxvOVh0K1pxVTlWZEpwcVpoNFFERHl4VXlZT1lKd0hEZytEaGdJL1dVVlpsN2FTRXQ5MytHTzlJYTJpdVpLT2ZBN2xocDlKcHZBVnk2MXcybU93TzVobUNnTUhDMUg5TzI0Z3U2VUQ5alArWm1idExSYVNzZWk5U0w0WERQYkFFaC9rR1EvcFNVY2MwbGJBcEZXYjY3bFFVaHBWbkxCc29LcXFaY2xGTW1VdHJ4UGN3eGwzWDd2T0NBdFlMU0NjdWdGUW1xaGRzc0g3SFUrUnpuamlPbFlYQTh3cWtPZmtJdFRBb20rb0t5Z2NhNEVTOGpZK04zejdmU0c0aGZVdHAzaWhVSHJ1VlNzRnkxaVJ2TlArMU43QTVCZEpBQ21WcEFnWlBoR095Q2lnRWpsUEx1ZG43a3ZGdE94dUI0ZzZPakQ4VVdMUmtDWkZSd3JMQ0VYSlFRaHAySyszN2xRZUJDUlgxQTdLUFF0bzFwckZFbVNZbjJtQjlFQXNPK2tZZms4S1FoWkY4eWpWejVncC9NenR5T1VqaVc5YkNVaEVCaEtSQ0NnU2lzNDV1US9QaFgveGZGV01nT25XdTJneEIwVEYvbzBrRVova0NETTFUcyszUkhZbndWVUw2WGhERnJBc3dmSUI2dzZQMU1yVHVsWTBzdW0xVklDZ2xLd0NFQUNxdlFGQ1VLM2dIY3NGUUNNL0lMYXlxUDFrOUpzaFZxcm5jTWFsT1lZdmdjR0F5Q3ZJd3VvZDhZQkpRbVpwbUdKZXlSd2tHdzRuOGpKT0pRTnczaWRMRmhNUk5CMFNnQVNUSnlLb3kvNGllWENlRmZKQlVlVjJTb0FjbEZ5UjBiYm0xT0hUVWlOMC9EVEF3RDd6UWVNNTJkcWo4VnNHRWtWRTJqS2V0RzdBRWhRMGZySkF2NlJDMHRyQzFza2wrSVdsTmluR0xiU2FaZzdNYzB4ZkE4TWJnRjFMUVYxejA4QTJHOCtvTTdQVkY5TXMyR1VFMGdReXArTHd1MnlhZ0xnUjlaYVlwa1N5cFE2YTZRMkRDcXpwa3ZpZXRYSUZkb1pmdWllR21jT0QwRGVQMEhFYkJoTndZUG1BL0w4ekpRc0FUQUtuZ3VFcVMrWFRxa0U0WWZXV3dDVUZaVGtzWUFZd1pmSUJlTjlUdzBjak93dThnRElacXNvU1N2aEVlUURpaUdZRm95V2lTRFJ5cFdnaTY5VVA1c2M1ZkljcXVTQ05lWHFlMlg5WkFIZk03S2hlMnBjT0IrQVQ0MSthTzVpUkQzUUFIQkVIZDljdHVpQkJvQU5Fa2JhQXcwQVI5cjl6Y1ViQURZWUdHa1BOQUFjYWZjM0YyOEEyR0JncEQzUUFIQ2szZDljdkFGZ2c0R1I5a0FEd0pGMmYzUHhCb0FOQmtiYUF3MEFSOXI5emNVYkFEWVlHR2tQTkFBY2FmYzNGMjhBMkdCZ3BEM1FBSENrM2Q5Y2ZPeHFZSjJhdTlSZFB0ZHAva2hvRU9sZ2xEWVQzOVYxUHpRRlhMc01YQWxndDlQQ3hKS1BidWZ5ZjgvS0hJUGZCUEFaQUJmNzlYYzVYUTBaUTFRNzM2ME5ieG9IcmxzRHZzNVpSc2dvMHVuZTA2Ynk2WDFtWnZ0UDk5UE5BcDRGNExzQlhBNWdqdzhFR1RlcWFHRjRRaHpRRjgwQ1g3Y0F2R0lkZURZQWZoZFoyc1RLVWNWcnBFN25kMzFONWdqOGUyZElvMm9zazdOWnBNZEswWjE5dHYrYko0RjlLOEQxQUNqOHlmTlNpa0hlZys1Wjk2OW01N1kvOC9aUCtkUExLWmhQL3JjQStBWUFGN2cxb1JVaEVNVXpGTXQ2ZVNKZlg3OGIyRGtQZk0waThHSUFYK3VXbEFNcHByZVVVRXJuOHAyZ3pUbCsyZmxnL3NEYlRrdklPaWsrQ1AyMC8vbXp3QVh6d0RjQ3VOVFBKZUZYcEVwTTZRRWpJSG0velRGOEQ3VDVnQVRZTlFDZTY5YUFsb1JUR3VsZkJFU0JTWU55eFI1Zy9CaHc3aEt3WndsNHZrOUxuTTVKbXNCelV5REdBWDNCOEcyM016L2c5QnVVYS8wSWl1dGZNa2o3endLbW5nQXVYU3ZPcFV2QVdZQnRGNEJUbnNwSWovTzh6UGFmN3FkdldJVHc2ZVpBMEpMUUVoS0VHZ3haaFVqL2R6M056U0t3YlI0NGV4bll2VktjeSttTTVLbTBKaHhJblV0ckdrbXpDUGljZzNXNUxNR2tRaVpaVG05eFM5WjMrNG0ybzhDNWM0WDE1cFRLVzJMYitmQ3g3V0x0all4enFpcWwyOUljdy9kQTVTcVlmNlJUVGlsZytsWUNJWG1JQ0tRNElLOXd4ZlNKWThBWks4Q3VGV0RuYW5FdWE5WlRBTXNhQ29nM0R0OTJPL012blJHQnRHd2txS1JtTUVrcUNhYSsyayswTFFEVGg0clA4OFVIajc0a0YxV2FBVG85UUhRN21tUDRIdWdZaHRFS2o0UEI2WlErRlMwaFFhaHBsZFB5YTFrWFRPcU5ZOERzY2dHK0hhdkF0dFVDdkJ4SW5pdHJrZ0w0bGNPMzNjN3NwQmRNM2tBdVNucTJueDlnUWZBaDRKeVZ3dnJ4d2VsMnozcDRhTWx6SDZETTJ6L2xUKzhhQitRL09UNEVFcWNrV1FTQmtHRDZFUUtRbkRDTHdCU25ZZ2NmMzJmWGlvR1VGYXdDNGVzeXU3Q1hYbkRQOXRPQ3N5RDRLTEIxcm1ndlg3emZidTJXRy9KdG1lMC8zVS92S3hCTkFNb2kwS2Nqa0FUQ04zSE9FcjNVQWpEcndPUDcxclhpeFlFa2VLTUZsU1g4b2N3UjZLVVhUSjdBYU5FMnRGOFdmQTRZZTdLdzFtd3ZYL3labitlS252Y3JmekM2SUsvT2JQL3BmbnBmQUdRbnlTb0lTQnFVWHlBQVNTMUFLMEpmYWdXWWNSRE9yQUY2NlR4WlFVN2pCT0ViTTBlZ0g3MWdjZ1hTRlpBVjU0TlF0ajlZY05JcGJPTkN5aDhZZ2k4Q1Zvc3BBcER1QjYzZzkyVzIvM1Evdlc4QXNxTTRnTElLQkJJSDhiY0p3TUNOTVg2OEJUcUJiOHM2c0dXdHNJQTZqd0RrNjYyWkk5Q3ZYakE1QTZOVmEydC9JQWljbkMvYUdWKzhUNzRJUVBtL0FtR3VCYys4L1ZQKzlJRUF5THNsQUtNVi9MZ0F5SVVJbmZuandQUXFNT09nSS9Ec3RRNU1yN1VBcU1GOFYyWVhEcW9YWE5sK0VRUTZOOXYyOWFLZGVzVXBXSlpiQVB5UG1lMC8zVThmR0lEc3NEaWQvcFVBU0N2Q2FYZ0ptRmd1QUVmZ0VYVDI3Z0RrdXdhVWcvbmJtU013akY3d2h2YkxoU0RMNVR3d3ZkUnFvOW9xSHpBQ2tDQjhVMmI3VC9mVGh3SWdPMDFUMUlNQ29BWnhHUmhiS29BWFFVY1FUamtJK2E0QjVlNUZ6akdzWHZDRzlnZHFyTEdGWXJwVkcvVXVIekJPdzIvTGFYeHpiaDQzREtlb0p3bEFIcUxuZFNzNHVkb0NvSUJIUUU0NUVQazNEdWl0bVlPUW94ZGN0cDgrckZ3SVdzR0ZZaUZGb0xHTmNoY0VRQzZlK09KQzVKMlo3VC9kVHgvYUFwWWRKMzdBeUpLL0RJd3ZGeFl2V3IwSXdFbi9IMU9wY281c3ZlRFVoU0FBRjRISnBRSmtXaXhwNmsybjRJWWZNR2YwYW1ESGV2Mkk4K2w0L1Vidk53OEVvenc3MndKZVBPSjh1bmQ3RWtLajl6dEtHQTEvN1d3QVRvNDRuNDVwV0kzZTcvQUFHUFdaMlFCa1lIQ1UrWFRNZkdHUW1ZSXhqZDd2cU9FMCtQWHpBVGppZkRyS3RUWjZ2NE1QL01seVJqNEFSNXhQRitWYXFaTEpGMVV6S2RQVjZQMmVMRERyM0k1OEFJNDRuMDdaTUFSYm8vZDc4Z011YldFK0FFZWNUOGU5WU9uMlVoZXUwZnM5dFVDWUQ4QVI1OU1wRzZiUit6MjFnS2ZXMWdOQXo0Z2VSVDVkVEVabzlINVBQUkRtQXpCbVJNOEJKenFmTGlZalNLS3IwZnM5ZFlCWUR3QkhtRTlYdFJmTXNJejA0YVFaMStqOW5weWdyQStBa3FzOHdmbDBCQ0NUV1JxOTM1TVRZTDFhVlE4QW8xemxBbkFpOCtrRVFHWlROWHEvdlliNzVQdC9mUUFjVVQ1ZEJHQ2o5M3Z5QWF4WGkrb0RvRkx5VDNBKzNSY2F2ZDllWTN4Uy96OGZnQ1FYL0xQUjNTT3prb241NWpnMWV5QWZnRDhNNE5jQVBENmFEbUJ0QjFlNE5NRE5jZXIxUUQ0QWJ3Ynd4d0RlNFV2UkU5d0haRzFnTlNYRExsd0xOY2VwMVFQNUFQeHp6d2o5SUlBUG5YaFQ1T1JjNUVZQ0E5SE5jV3IxUUQ0QW1SSDZGUUJNVFNaWkg5OFptRDVCaDVnMUZvcGlObnMxeDZuVEEva0F2QWZBRXdEdWRuSStFdlF4UGZrRXpZZmFDWFJTQmx1UU1CN1lIS2RHRCtRRHNCTkJILzkrQWtBb2JxVEFER0s3SW53MXg4bmZBL2tBN0VYUXQ4a2dyR0FHTWZCeFo1Q3Y1amk1ZXlBZmdMMEkrcjY4dVIwUW1VRm9CUVU4dmZOdnpYSHk5a0E5QU9Sb013N0NkR1FDam9VWkR3TDRrdi8rOE9aMWdKaEJJakdEZ01oM3ZUYXZCYzAzNS9SQVBnRDdKZWdqT0RmaGlNd2dvcWVKd05QUFRhQjZFenEvaHErc0I0QWNYZVhFUCtaaEdWbzl2UmltSVFENXY1b1BBWkN1cGdESTl3ZzgvcXovMVh6NTV1c3lleUFmZ01NUTlHVTJPcDRlQWNocE9JSlFRRXovVnVQbG02L0s3SUg2QU1qZ0d6ZGw2UXR5WDVqV2pwUUZldkYzbHEzeGY2eWhyT2xJQVVnUUNvalI4Z21FK2w5TmwyKytKck1INmdFZ1I1VUE1S1lzYytBWm1DYlFDRGkrSXZnRVFNb2IxWEJFQUhJYWpnQk1MViswa0Nkd3M2YUd1M3pxZmtWOUFHVHdqZnRnM0pSVlZSQXRIUUVYWC93YkFjb1hQNWQ1Q0lEOEdvSkt2cURBbG9LT29Jei95N3g4YzNwbUQ0emhhcXdqUnpDWXlRZzVncjJaZ3NGVEx3ZVdyOFhRZ3NYamJ3TFdybk50TWxLZ05vTEJtWkFhN1BUQ0F1WUlCbE12bFdRc3d3cjJVbFV3NDVqZERTeDhIYkQrQ3RkK0hWQ3dlUEtiZ0pWOWFBU0RNOFlnNTlUV0ZEeXNZUEJ0bVlLOTFJYk5PSGFQQS9NN2dVWEtYQTRoV0R6NzljQTgrVzBhd2VDTVVSaisxSFlmY0JqQllPNTRNTVkzdEdEdjhJM25tV1NIT3pZT0xKMExMUEdYQVFXTHozb0I4TVFVc0VhMTZrWXdPRzh3aGpoNzR5SmtVTUZnYnNObENmWU8wZXB3aXNzVlkzNGJzSHcyc0VJUmtBRUVpL2RjVTBTUDVxaEYxZ2dHNXczR0VHZFhyNEw1MTM0Rmc0a0FqdURRZ3IxRHREcWNVbVpFVHdBclp3QXJ1NEJWcXN2MEtWaDgvbzNGNHYwUVhaQkdNRGh2TUlZNHUzTVlodjk1WmgrQ3UxeEJjeHVPVS9IZmVESXE1Y3Y3RnV3ZG90WGhsQ0JYak9YWkFueXJPNEJWNmluMElWaDh3U3RMdVdDc1VBeXZFUXpPRzVBQnorNGVCK1IvZXdudS9rT1AvM0cvbDRrSlRFUmxsalF0SW90MmU1My9Jd08yT1BsNEZMdGNuQ3FBcDljYWhUNTZDQlpmK0xwU0xoaHoxTjVxQklQekJtVEFzL3NMUkhjVERLYmlOSGRCR0d5bU9DLzNoZ2xFdmdqQW5vSzlBN1k0K1hnaVY0elZXWURBcy9ldHhhdWJZUEZGUDFRa0x0Q0lQOG5lYUFTRDh3Wmt3TFA3QXlDL3RKTmc4TC94TE5CdStZQmRCWHNIYkhFRkFJTmNNVmFtZ2RXWkFvUnJmUGRYbThLaXRMZG1nWXZlV0FxKzJ5N2lNcWZ1UmpBNGIxQUdPTHQvQVBKTHF3U0QzK3k1VDF5STBBb1NiQXhNTXpHVjFvOC9NeTJybzJEdkFLMnQrR2dpVjR6ajQrM0FJd0RYdHdCclZKZXVFQ3plKzlhVzREdXQ0UHhrSWhZc2RldEdNRGh2b0RxY1BSZ0ErU1dwNE80dmVRNVV2L21BR3dSNzgrNnJRcTRZcTlQQU9pMmZBNC92QmtLdWRLVlU3Vlp3Nzd1S3ZXRnVaYnRjTU5iNXYwWXdPRzlnK2p4N2NBRHlpNlBnN2djY2dJeGxjQTVUS2hhRDAxeVlLQm1WRnBCWk1meC9tMkJ2bnkzdDhMR3FvcVRsaVpiVkkrZ01nSHduTUFuQ0lGaTg5N2NMQUFaNlF5ekZ6elNDd1hrRDFPUHM0UURJTDVYZ0xtazVKSGsvU0Q1Z0tkaWJkMzhWY3NWWUdtdUJUYUF6RUhMSGd5Q2Nhb2tCNy8xSWtVRVQ1SUt4d0Y1cEJJUHpCcWJQczRjSElDL0FhZXF2UEw5cG1IeEFFK3p0czZWZExDRC9sY2dWWTNVeVdEMEJqMVp3cWdDZ2dYQTdzUGZXQW9BSnZhRXRaQnJCNEx5eDZlZnNQQUR5Q3RtQ3ZmMDBzL05uT3NnVlkzbThCVFJaUFp1R0JVQUNkQXJZKzVsV0RxR21ZYklyTEhFeDBnZ0c1dzFPSDJmbkE3Q1BpelFmYVhxZ1V3ODBBR3l3TWRJZWFBQTQwdTV2THQ0QXNNSEFTSHVnQWVCSXU3KzVlQVBBQmdNajdZRUdnQ1B0L3ViaURRQWJESXkwQnhvQWpyVDdtNHMzQUd3d01OSWVhQUE0MHU1dkx0NEFzTUhBU0h1Z0FlQkl1Nys1ZUFQQUJnTWo3WUVHZ0NQdC91YmlEUUFiREl5MEI4WllOTWJrWCtaZWtwdUlpT1FyUGFyK3hzODg5SEpnNmpaZzVqQXd2Vlo4QitsbDlQbE81L0ZjL28rRUNqbkhmaTh6WWZrdk01dWxtcDRxSlhWcXg1ZGVENHpmQWt3L0NHeGRBWmdvSGZ1aDEzMVFrYUk1aHU4QnM0RHM4QjBBV0xuSVJHQ0JzRmZuODdKZmZETXdkak93NVI1ZzhnaXdaYTM0am5RUVV3RG85OXdCZko0VE03Q09pTmRsYWoyckEvamVWL3ZmRGVBVEFQNFVHSDhJMkxyYzZnYytTSHFZNG9NWjc0VlNLTTB4ZkErVVV6Qi9vQlVVQ0tNbDZ6U1EvUHNYcVpENUtRQy9BMHcvREV3Y0FjWVhnWW5Wd3Bwd0FEdUJrZWZuQ2ltOTBGbUJXWHduSzg3VWVuNTNCSThzYnV3cWF6OXA1VWduUWhCUytaTjF6RThBazB1dHZpQ3dxOERJOC9ueDVoaStCemI0Z0p6S1pFMVNFRlpaZ1M5LzJwV1IvZ1RBSjRISlE4REVNV0I4QVJoZkJzYVdDd0RxdXdRS3Z2TmdIWHZPY1lWYlBGSlBrdytkRHhDL1cxWTR0V0Rwdy9SbGdvNGxvMVQ0L0t4VGloRE5wSndqMy9VaU1MWGVtcHJqZmZDN2VXcHpETjhEbFlzUURpS3RWeHpFcW9Ia3lYOUhSaXpXK25JZ2FRbnZBaWFlQkNibUMwczR0Z1NNdTJyTWVQQVI5WDI1MmpYa2xhVEZVMTA4SzBNSGF2L252SjZaeFZWazlPSTdHUjJJWm9HUU5jL0hnYkhnSXdxSUxJVnVqdUY3b09NcVdGYXdDb1J4a2ZFSUI1Q1dna1JFQkNOZjl3TVRjOEE0UWNpQld5b0d6MTZyd05nYU1MNWVXS3BjdFlaTDNOK1RXTFgwZ3Z0dVAwSEhrMm4xNkpEeXhYbVZoZlUwcXl3YkpicjVHU3VYS3hBL3NWNVk5VVlXZG5qd3lTM3FLS2dhcldBNjlXZzZmalFPSUswSGFkbklqUFZGQitBaU1FNEF1aVVrQ0ZuRVN5Q1NrbUF1VTdDam0xNXdYKzJYMmlmQlJuOUE4bUtjVzJVRmpVTFZRY2dWRGw4MHU0MFNZaDc2M0ZmdnF1aExDeGl0b0JZVXNvSmZqWEt0dEJ5TXE5Q0tjSG40c1B1Q2JnWE5Kd3lXa0VDY3o1UTM3NlVYM0xObmNaeVFBQUFERWtsRVFWVDlmRmdJSnM2bEJCd3RuM1R0NkZwSXo0UldudVF4UGgyWElHem00Q3dROWhXSUZnQlRLMGdRSGlJQUpkZEtxMEVMUWgrS0wxcVVSNE12U0Vzb0VOSUtyZ0FMSE5pTW94Kzk0Szd0bDlxbm5NaW84TVNmNlNOd0dwWVZqQ0RrL0p1N2lzcTQ5NmZDcVgwQmtEZXFsV3dLd2ljMWdBUVNwekdSRW5GZ1JFejAxZUFMTHZ2cTJLZmk0NW02Y2YzcUJYZHNmeFJiSk1obzhkaW1xT2hFSzhjWFFScjlRVnB2UG9ETk1YUVA5QTNBQ0VMRnhQaCtqQUNrUDBmTElLRkNDUlJxS3VQVWRxamxDOW8wN0pad0tWTkhlQkM5NERRY1pPMFhBQWttZ290QWs5UVlyUjlmL0J2QnlZZk1TQVREVk16d1RYTU0zUU1EQVZBZ1ZIQ1o3L01hUUs0UVpVSGlOQ2JCUWxxVXc3NFlDYjdnY21Za2VsQzlZRmx3dlZ2N1JSQW9yVHVCa0VDVTlhc0NJRDkveDlCOTM1ell6eUtrcXBmaU5IeGNBMGdMUWd2QkFhUFZrQ3FtM2gyQXRDNW0vUnlFcXp3LzR4aEdMM2hEKytNbXNsZ3FDYmdVZkxLQWNScm1UbEJ6RE4wREExdEFYVWxXY0RtMUlPSUlKQWpsVC9GZDA1bGJGUUZ3amR0Z0djZXdlc0Z0N1JjL0d4OGlXalVDakdDVDFZdldUMU13Z1VxcmYzTkc0NXRUYmN1MGF4aW1XeDl4RU5jRVFIR2JjWUFFd3RTWFNxWTBnbkNkZ2V1TUkwY3Z1R3gvRlVHZ0Zod0VZclI4MFFja1dOK1gwZmptMUR3QVd2OFJnSkZpbEpaQnpuejBwUWcrQVpBQWxWV2gxR3ZHa2EwWHpCMGNDUWkzMGFTR1ZhOUFGNjJmTE9CN01ocmZuSm9Qd1BFUjU5UHgrbzNlNzZtTDVLd3AyRzU3eFBsMGt4YzNlcituTHZ5S3RMbWhmVUM3OFJIbjA4MU9ObnEvcHpjQVI1eFBSOW1SUnUvMzFJVmd2Z1VjY1Q0ZE5hb2J2ZC9UR1lBanpxZWp1bXFqOTNzNkEzREUrWFJVZzJWU0NqZGFHcjNmVXcrSStWUHdpUFBwcUpqTzhKMU53NDNlN3ltSHdIb0FLTUZkN1FFckFlRUU1Tk5KTWIzUit6M2xzR2NOemdmZ2lQUHBvbUo2by9kNzZvR3dQZ0NPS0o4dUtxWTNlcituS3dCSG1FK25vcVJHNy9mVUExOTlVL0FJOCtrRXdFYnY5M1FIb0VoWlRuQStuWXFTR3IzZkJvQXRhaXFCVUltZG01aFBKd0EyZXIrbkt3QkhuRStYMWdVelNiblIrejExd1BqL0FlQ3BQREQzdDdydkFBQUFBRWxGVGtTdVFtQ0NcIjtcclxuIiwiaW1wb3J0IHtcclxuXHRDb2xvcixcclxuXHRMaW5lYXJGaWx0ZXIsXHJcblx0TmVhcmVzdEZpbHRlcixcclxuXHRSR0JBRm9ybWF0LFxyXG5cdFJHQkZvcm1hdCxcclxuXHRUZXh0dXJlLFxyXG5cdFdlYkdMUmVuZGVyVGFyZ2V0XHJcbn0gZnJvbSBcInRocmVlXCI7XHJcblxyXG5pbXBvcnQgeyBDb2xvckVkZ2VzTWF0ZXJpYWwsIFNNQUFCbGVuZE1hdGVyaWFsLCBTTUFBV2VpZ2h0c01hdGVyaWFsIH0gZnJvbSBcIi4uL21hdGVyaWFsc1wiO1xyXG5pbXBvcnQgeyBDbGVhclBhc3MgfSBmcm9tIFwiLi9DbGVhclBhc3MuanNcIjtcclxuaW1wb3J0IHsgUGFzcyB9IGZyb20gXCIuL1Bhc3MuanNcIjtcclxuXHJcbmltcG9ydCBzZWFyY2hJbWFnZURhdGFVUkwgZnJvbSBcIi4uL21hdGVyaWFscy9pbWFnZXMvc21hYS9zZWFyY2hJbWFnZURhdGFVUkwuanNcIjtcclxuaW1wb3J0IGFyZWFJbWFnZURhdGFVUkwgZnJvbSBcIi4uL21hdGVyaWFscy9pbWFnZXMvc21hYS9hcmVhSW1hZ2VEYXRhVVJMLmpzXCI7XHJcblxyXG4vKipcclxuICogU3VicGl4ZWwgTW9ycGhvbG9naWNhbCBBbnRpYWxpYXNpbmcgKFNNQUEpIHYyLjguXHJcbiAqXHJcbiAqIFByZXNldDogU01BQSAxeCBNZWRpdW0gKHdpdGggY29sb3IgZWRnZSBkZXRlY3Rpb24pLlxyXG4gKiAgaHR0cHM6Ly9naXRodWIuY29tL2lyeW9rdS9zbWFhL3JlbGVhc2VzL3RhZy92Mi44XHJcbiAqL1xyXG5cclxuZXhwb3J0IGNsYXNzIFNNQUFQYXNzIGV4dGVuZHMgUGFzcyB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdHMgYSBuZXcgU01BQSBwYXNzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtJbWFnZX0gc2VhcmNoSW1hZ2UgLSBUaGUgU01BQSBzZWFyY2ggaW1hZ2UuIFByZWxvYWQgdGhpcyBpbWFnZSB1c2luZyB0aGUge0BsaW5rIHNlYXJjaEltYWdlRGF0YVVSTH0uXHJcblx0ICogQHBhcmFtIHtJbWFnZX0gYXJlYUltYWdlIC0gVGhlIFNNQUEgYXJlYSBpbWFnZS4gUHJlbG9hZCB0aGlzIGltYWdlIHVzaW5nIHRoZSB7QGxpbmsgYXJlYUltYWdlRGF0YVVSTH0uXHJcblx0ICovXHJcblxyXG5cdGNvbnN0cnVjdG9yKHNlYXJjaEltYWdlLCBhcmVhSW1hZ2UpIHtcclxuXHJcblx0XHRzdXBlcihcIlNNQUFQYXNzXCIpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBjbGVhciBwYXNzIGZvciB0aGUgY29sb3IgZWRnZXMgYnVmZmVyLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtDbGVhclBhc3N9XHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy5jbGVhclBhc3MgPSBuZXcgQ2xlYXJQYXNzKHtcclxuXHRcdFx0Y2xlYXJDb2xvcjogbmV3IENvbG9yKDB4MDAwMDAwKSxcclxuXHRcdFx0Y2xlYXJBbHBoYTogMS4wXHJcblx0XHR9KTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgcmVuZGVyIHRhcmdldCBmb3IgdGhlIGNvbG9yIGVkZ2UgZGV0ZWN0aW9uLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtXZWJHTFJlbmRlclRhcmdldH1cclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKi9cclxuXHJcblx0XHR0aGlzLnJlbmRlclRhcmdldENvbG9yRWRnZXMgPSBuZXcgV2ViR0xSZW5kZXJUYXJnZXQoMSwgMSwge1xyXG5cdFx0XHRtaW5GaWx0ZXI6IExpbmVhckZpbHRlcixcclxuXHRcdFx0Zm9ybWF0OiBSR0JGb3JtYXQsXHJcblx0XHRcdHN0ZW5jaWxCdWZmZXI6IGZhbHNlLFxyXG5cdFx0XHRkZXB0aEJ1ZmZlcjogZmFsc2VcclxuXHRcdH0pO1xyXG5cclxuXHRcdHRoaXMucmVuZGVyVGFyZ2V0Q29sb3JFZGdlcy50ZXh0dXJlLm5hbWUgPSBcIlNNQUEuQ29sb3JFZGdlc1wiO1xyXG5cdFx0dGhpcy5yZW5kZXJUYXJnZXRDb2xvckVkZ2VzLnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzID0gZmFsc2U7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIHJlbmRlciB0YXJnZXQgZm9yIHRoZSBTTUFBIHdlaWdodHMuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1dlYkdMUmVuZGVyVGFyZ2V0fVxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMucmVuZGVyVGFyZ2V0V2VpZ2h0cyA9IHRoaXMucmVuZGVyVGFyZ2V0Q29sb3JFZGdlcy5jbG9uZSgpO1xyXG5cclxuXHRcdHRoaXMucmVuZGVyVGFyZ2V0V2VpZ2h0cy50ZXh0dXJlLm5hbWUgPSBcIlNNQUEuV2VpZ2h0c1wiO1xyXG5cdFx0dGhpcy5yZW5kZXJUYXJnZXRXZWlnaHRzLnRleHR1cmUuZm9ybWF0ID0gUkdCQUZvcm1hdDtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIENvbG9yIGVkZ2UgZGV0ZWN0aW9uIHNoYWRlciBtYXRlcmlhbC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7Q29sb3JFZGdlc01hdGVyaWFsfVxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMuY29sb3JFZGdlc01hdGVyaWFsID0gbmV3IENvbG9yRWRnZXNNYXRlcmlhbCgpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogU01BQSB3ZWlnaHRzIHNoYWRlciBtYXRlcmlhbC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7U01BQVdlaWdodHNNYXRlcmlhbH1cclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKi9cclxuXHJcblx0XHR0aGlzLndlaWdodHNNYXRlcmlhbCA9IG5ldyBTTUFBV2VpZ2h0c01hdGVyaWFsKCk7XHJcblxyXG5cdFx0dGhpcy53ZWlnaHRzTWF0ZXJpYWwudW5pZm9ybXMudERpZmZ1c2UudmFsdWUgPSB0aGlzLnJlbmRlclRhcmdldENvbG9yRWRnZXMudGV4dHVyZTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSBTTUFBIHNlYXJjaCB0ZXh0dXJlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtUZXh0dXJlfVxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMuc2VhcmNoVGV4dHVyZSA9IG5ldyBUZXh0dXJlKHNlYXJjaEltYWdlKTtcclxuXHJcblx0XHR0aGlzLnNlYXJjaFRleHR1cmUubmFtZSA9IFwiU01BQS5TZWFyY2hcIjtcclxuXHRcdHRoaXMuc2VhcmNoVGV4dHVyZS5tYWdGaWx0ZXIgPSBOZWFyZXN0RmlsdGVyO1xyXG5cdFx0dGhpcy5zZWFyY2hUZXh0dXJlLm1pbkZpbHRlciA9IE5lYXJlc3RGaWx0ZXI7XHJcblx0XHR0aGlzLnNlYXJjaFRleHR1cmUuZm9ybWF0ID0gUkdCQUZvcm1hdDtcclxuXHRcdHRoaXMuc2VhcmNoVGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgPSBmYWxzZTtcclxuXHRcdHRoaXMuc2VhcmNoVGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblx0XHR0aGlzLnNlYXJjaFRleHR1cmUuZmxpcFkgPSBmYWxzZTtcclxuXHJcblx0XHR0aGlzLndlaWdodHNNYXRlcmlhbC51bmlmb3Jtcy50U2VhcmNoLnZhbHVlID0gdGhpcy5zZWFyY2hUZXh0dXJlO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIFNNQUEgYXJlYSB0ZXh0dXJlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtUZXh0dXJlfVxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMuYXJlYVRleHR1cmUgPSBuZXcgVGV4dHVyZShhcmVhSW1hZ2UpO1xyXG5cclxuXHRcdHRoaXMuYXJlYVRleHR1cmUubmFtZSA9IFwiU01BQS5BcmVhXCI7XHJcblx0XHR0aGlzLmFyZWFUZXh0dXJlLm1pbkZpbHRlciA9IExpbmVhckZpbHRlcjtcclxuXHRcdHRoaXMuYXJlYVRleHR1cmUuZm9ybWF0ID0gUkdCQUZvcm1hdDtcclxuXHRcdHRoaXMuYXJlYVRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzID0gZmFsc2U7XHJcblx0XHR0aGlzLmFyZWFUZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuXHRcdHRoaXMuYXJlYVRleHR1cmUuZmxpcFkgPSBmYWxzZTtcclxuXHJcblx0XHR0aGlzLndlaWdodHNNYXRlcmlhbC51bmlmb3Jtcy50QXJlYS52YWx1ZSA9IHRoaXMuYXJlYVRleHR1cmU7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBTTUFBIGJsZW5kIHNoYWRlciBtYXRlcmlhbC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7U01BQUJsZW5kTWF0ZXJpYWx9XHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy5ibGVuZE1hdGVyaWFsID0gbmV3IFNNQUFCbGVuZE1hdGVyaWFsKCk7XHJcblxyXG5cdFx0dGhpcy5ibGVuZE1hdGVyaWFsLnVuaWZvcm1zLnRXZWlnaHRzLnZhbHVlID0gdGhpcy5yZW5kZXJUYXJnZXRXZWlnaHRzLnRleHR1cmU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVuZGVycyB0aGUgZWZmZWN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtXZWJHTFJlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlci5cclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyVGFyZ2V0fSBpbnB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgY29udGFpbnMgdGhlIHJlc3VsdCBvZiB0aGUgcHJldmlvdXMgcGFzcy5cclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyVGFyZ2V0fSBvdXRwdXRCdWZmZXIgLSBBIGZyYW1lIGJ1ZmZlciB0aGF0IHNlcnZlcyBhcyB0aGUgb3V0cHV0IHJlbmRlciB0YXJnZXQgdW5sZXNzIHRoaXMgcGFzcyByZW5kZXJzIHRvIHNjcmVlbi5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW2RlbHRhXSAtIFRoZSB0aW1lIGJldHdlZW4gdGhlIGxhc3QgZnJhbWUgYW5kIHRoZSBjdXJyZW50IG9uZSBpbiBzZWNvbmRzLlxyXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gW3N0ZW5jaWxUZXN0XSAtIEluZGljYXRlcyB3aGV0aGVyIGEgc3RlbmNpbCBtYXNrIGlzIGFjdGl2ZS5cclxuXHQgKi9cclxuXHJcblx0cmVuZGVyKHJlbmRlcmVyLCBpbnB1dEJ1ZmZlciwgb3V0cHV0QnVmZmVyLCBkZWx0YSwgc3RlbmNpbFRlc3QpIHtcclxuXHJcblx0XHQvLyBEZXRlY3QgY29sb3IgZWRnZXMuXHJcblx0XHR0aGlzLm1hdGVyaWFsID0gdGhpcy5jb2xvckVkZ2VzTWF0ZXJpYWw7XHJcblx0XHR0aGlzLmNvbG9yRWRnZXNNYXRlcmlhbC51bmlmb3Jtcy50RGlmZnVzZS52YWx1ZSA9IGlucHV0QnVmZmVyLnRleHR1cmU7XHJcblx0XHR0aGlzLmNsZWFyUGFzcy5yZW5kZXIocmVuZGVyZXIsIHRoaXMucmVuZGVyVGFyZ2V0Q29sb3JFZGdlcyk7XHJcblx0XHRyZW5kZXJlci5yZW5kZXIodGhpcy5zY2VuZSwgdGhpcy5jYW1lcmEsIHRoaXMucmVuZGVyVGFyZ2V0Q29sb3JFZGdlcyk7XHJcblxyXG5cdFx0Ly8gQ29tcHV0ZSBlZGdlIHdlaWdodHMuXHJcblx0XHR0aGlzLm1hdGVyaWFsID0gdGhpcy53ZWlnaHRzTWF0ZXJpYWw7XHJcblx0XHRyZW5kZXJlci5yZW5kZXIodGhpcy5zY2VuZSwgdGhpcy5jYW1lcmEsIHRoaXMucmVuZGVyVGFyZ2V0V2VpZ2h0cyk7XHJcblxyXG5cdFx0Ly8gQXBwbHkgdGhlIGFudGlhbGlhc2luZyBmaWx0ZXIgdG8gdGhlIGNvbG9ycy5cclxuXHRcdHRoaXMubWF0ZXJpYWwgPSB0aGlzLmJsZW5kTWF0ZXJpYWw7XHJcblx0XHR0aGlzLmJsZW5kTWF0ZXJpYWwudW5pZm9ybXMudERpZmZ1c2UudmFsdWUgPSBpbnB1dEJ1ZmZlci50ZXh0dXJlO1xyXG5cclxuXHRcdHJlbmRlcmVyLnJlbmRlcih0aGlzLnNjZW5lLCB0aGlzLmNhbWVyYSwgdGhpcy5yZW5kZXJUb1NjcmVlbiA/IG51bGwgOiBvdXRwdXRCdWZmZXIpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVwZGF0ZXMgdGhlIHNpemUgb2YgdGhpcyBwYXNzLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0LlxyXG5cdCAqL1xyXG5cclxuXHRzZXRTaXplKHdpZHRoLCBoZWlnaHQpIHtcclxuXHJcblx0XHR0aGlzLnJlbmRlclRhcmdldENvbG9yRWRnZXMuc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KTtcclxuXHRcdHRoaXMucmVuZGVyVGFyZ2V0V2VpZ2h0cy5zZXRTaXplKHdpZHRoLCBoZWlnaHQpO1xyXG5cclxuXHRcdHRoaXMuY29sb3JFZGdlc01hdGVyaWFsLnVuaWZvcm1zLnRleGVsU2l6ZS52YWx1ZS5jb3B5KFxyXG5cdFx0XHR0aGlzLndlaWdodHNNYXRlcmlhbC51bmlmb3Jtcy50ZXhlbFNpemUudmFsdWUuY29weShcclxuXHRcdFx0XHR0aGlzLmJsZW5kTWF0ZXJpYWwudW5pZm9ybXMudGV4ZWxTaXplLnZhbHVlLnNldChcclxuXHRcdFx0XHRcdDEuMCAvIHdpZHRoLCAxLjAgLyBoZWlnaHQpKSk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIFNNQUEgc2VhcmNoIGltYWdlLCBlbmNvZGVkIGFzIGEgYmFzZTY0IGRhdGEgVVJMLlxyXG5cdCAqXHJcblx0ICogVXNlIHRoaXMgaW1hZ2UgZGF0YSB0byBjcmVhdGUgYW4gSW1hZ2UgaW5zdGFuY2UgYW5kIHVzZSBpdCB0b2dldGhlciB3aXRoXHJcblx0ICogdGhlIGFyZWEgaW1hZ2UgdG8gY3JlYXRlIGFuIFNNQUFQYXNzLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge1N0cmluZ31cclxuXHQgKiBAZXhhbXBsZVxyXG5cdCAqIGNvbnN0IHNlYXJjaEltYWdlID0gbmV3IEltYWdlKCk7XHJcblx0ICogc2VhcmNoSW1hZ2UuYWRkRXZlbnRMaXN0ZW5lcihcImxvYWRcIiwgcHJvZ3Jlc3MpO1xyXG5cdCAqIHNlYXJjaEltYWdlLnNyYyA9IFNNQUFQYXNzLnNlYXJjaEltYWdlRGF0YVVSTDtcclxuXHQgKi9cclxuXHJcblx0c3RhdGljIGdldCBzZWFyY2hJbWFnZURhdGFVUkwoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHNlYXJjaEltYWdlRGF0YVVSTDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgU01BQSBhcmVhIGltYWdlLCBlbmNvZGVkIGFzIGEgYmFzZTY0IGRhdGEgVVJMLlxyXG5cdCAqXHJcblx0ICogVXNlIHRoaXMgaW1hZ2UgZGF0YSB0byBjcmVhdGUgYW4gSW1hZ2UgaW5zdGFuY2UgYW5kIHVzZSBpdCB0b2dldGhlciB3aXRoXHJcblx0ICogdGhlIHNlYXJjaCBpbWFnZSB0byBjcmVhdGUgYW4gU01BQVBhc3MuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7U3RyaW5nfVxyXG5cdCAqIEBleGFtcGxlXHJcblx0ICogY29uc3QgYXJlYUltYWdlID0gbmV3IEltYWdlKCk7XHJcblx0ICogYXJlYUltYWdlLmFkZEV2ZW50TGlzdGVuZXIoXCJsb2FkXCIsIHByb2dyZXNzKTtcclxuXHQgKiBhcmVhSW1hZ2Uuc3JjID0gU01BQVBhc3MuYXJlYUltYWdlRGF0YVVSTDtcclxuXHQgKi9cclxuXHJcblx0c3RhdGljIGdldCBhcmVhSW1hZ2VEYXRhVVJMKCkge1xyXG5cclxuXHRcdHJldHVybiBhcmVhSW1hZ2VEYXRhVVJMO1xyXG5cclxuXHR9XHJcblxyXG59XHJcbiIsImltcG9ydCB7IENvbWJpbmVNYXRlcmlhbCB9IGZyb20gXCIuLi9tYXRlcmlhbHNcIjtcclxuaW1wb3J0IHsgUGFzcyB9IGZyb20gXCIuL1Bhc3MuanNcIjtcclxuXHJcbi8qKlxyXG4gKiBBIHBhc3MgdGhhdCByZW5kZXJzIGEgZ2l2ZW4gdGV4dHVyZS5cclxuICovXHJcblxyXG5leHBvcnQgY2xhc3MgVGV4dHVyZVBhc3MgZXh0ZW5kcyBQYXNzIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyB0ZXh0dXJlIHBhc3MuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1RleHR1cmV9IHRleHR1cmUgLSBUaGUgdGV4dHVyZS5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW29wYWNpdHk9MS4wXSAtIFRoZSB0ZXh0dXJlIG9wYWNpdHkuXHJcblx0ICogQHBhcmFtIHtCb29sZWFufSBbc2NyZWVuTW9kZT10cnVlXSAtIFdoZXRoZXIgdGhlIHNjcmVlbiBibGVuZCBtb2RlIHNob3VsZCBiZSB1c2VkIGZvciBjb21iaW5pbmcgdGhlIHRleHR1cmUgd2l0aCB0aGUgc2NlbmUgY29sb3JzLlxyXG5cdCAqL1xyXG5cclxuXHRjb25zdHJ1Y3Rvcih0ZXh0dXJlLCBvcGFjaXR5ID0gMS4wLCBzY3JlZW5Nb2RlID0gdHJ1ZSkge1xyXG5cclxuXHRcdHN1cGVyKFwiVGV4dHVyZVBhc3NcIik7XHJcblxyXG5cdFx0dGhpcy5tYXRlcmlhbCA9IG5ldyBDb21iaW5lTWF0ZXJpYWwoc2NyZWVuTW9kZSk7XHJcblxyXG5cdFx0dGhpcy50ZXh0dXJlID0gdGV4dHVyZTtcclxuXHRcdHRoaXMub3BhY2l0eVNvdXJjZSA9IG9wYWNpdHk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIHRleHR1cmUuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7VGV4dHVyZX1cclxuXHQgKi9cclxuXHJcblx0Z2V0IHRleHR1cmUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMubWF0ZXJpYWwudW5pZm9ybXMudGV4dHVyZTIudmFsdWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQHR5cGUge1RleHR1cmV9XHJcblx0ICovXHJcblxyXG5cdHNldCB0ZXh0dXJlKHZhbHVlKSB7XHJcblxyXG5cdFx0dGhpcy5tYXRlcmlhbC51bmlmb3Jtcy50ZXh0dXJlMi52YWx1ZSA9IHZhbHVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBvcGFjaXR5IG9mIHRoZSBpbnB1dCBidWZmZXIuXHJcblx0ICpcclxuXHQgKiBUaGUgZGVzdGluYXRpb24gY29sb3IgaXMgdGhlIGNvbG9yIGZyb20gdGhlIGltYWdlIGluIHRoZSBpbnB1dCBidWZmZXIuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7TnVtYmVyfVxyXG5cdCAqL1xyXG5cclxuXHRnZXQgb3BhY2l0eURlc3RpbmF0aW9uKCkge1xyXG5cclxuXHRcdHJldHVybiB0aGlzLm1hdGVyaWFsLnVuaWZvcm1zLm9wYWNpdHkxLnZhbHVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEB0eXBlIHtOdW1iZXJ9XHJcblx0ICovXHJcblxyXG5cdHNldCBvcGFjaXR5RGVzdGluYXRpb24odmFsdWUgPSAxLjApIHtcclxuXHJcblx0XHR0aGlzLm1hdGVyaWFsLnVuaWZvcm1zLm9wYWNpdHkxLnZhbHVlID0gdmFsdWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIG9wYWNpdHkgb2YgdGhlIHRleHR1cmUuXHJcblx0ICpcclxuXHQgKiBUaGUgc291cmNlIGNvbG9yIGlzIHRoZSBjb2xvciBmcm9tIHRoZSB0ZXh0dXJlLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge051bWJlcn1cclxuXHQgKi9cclxuXHJcblx0Z2V0IG9wYWNpdHlTb3VyY2UoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMubWF0ZXJpYWwudW5pZm9ybXMub3BhY2l0eTIudmFsdWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQHR5cGUge051bWJlcn1cclxuXHQgKi9cclxuXHJcblx0c2V0IG9wYWNpdHlTb3VyY2UodmFsdWUgPSAxLjApIHtcclxuXHJcblx0XHR0aGlzLm1hdGVyaWFsLnVuaWZvcm1zLm9wYWNpdHkyLnZhbHVlID0gdmFsdWU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVuZGVycyB0aGUgZWZmZWN0LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtXZWJHTFJlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlci5cclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyVGFyZ2V0fSBpbnB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgY29udGFpbnMgdGhlIHJlc3VsdCBvZiB0aGUgcHJldmlvdXMgcGFzcy5cclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyVGFyZ2V0fSBvdXRwdXRCdWZmZXIgLSBBIGZyYW1lIGJ1ZmZlciB0aGF0IHNlcnZlcyBhcyB0aGUgb3V0cHV0IHJlbmRlciB0YXJnZXQgdW5sZXNzIHRoaXMgcGFzcyByZW5kZXJzIHRvIHNjcmVlbi5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW2RlbHRhXSAtIFRoZSB0aW1lIGJldHdlZW4gdGhlIGxhc3QgZnJhbWUgYW5kIHRoZSBjdXJyZW50IG9uZSBpbiBzZWNvbmRzLlxyXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gW3N0ZW5jaWxUZXN0XSAtIEluZGljYXRlcyB3aGV0aGVyIGEgc3RlbmNpbCBtYXNrIGlzIGFjdGl2ZS5cclxuXHQgKi9cclxuXHJcblx0cmVuZGVyKHJlbmRlcmVyLCBpbnB1dEJ1ZmZlciwgb3V0cHV0QnVmZmVyLCBkZWx0YSwgc3RlbmNpbFRlc3QpIHtcclxuXHJcblx0XHR0aGlzLm1hdGVyaWFsLnVuaWZvcm1zLnRleHR1cmUxLnZhbHVlID0gaW5wdXRCdWZmZXIudGV4dHVyZTtcclxuXHRcdHJlbmRlcmVyLnJlbmRlcih0aGlzLnNjZW5lLCB0aGlzLmNhbWVyYSwgdGhpcy5yZW5kZXJUb1NjcmVlbiA/IG51bGwgOiBvdXRwdXRCdWZmZXIpO1xyXG5cclxuXHR9XHJcblxyXG59XHJcbiIsImltcG9ydCB7XHJcblx0TGluZWFyRmlsdGVyLFxyXG5cdExpbmVhck1pcE1hcExpbmVhckZpbHRlcixcclxuXHRNZXNoQmFzaWNNYXRlcmlhbCxcclxuXHRSR0JGb3JtYXQsXHJcblx0V2ViR0xSZW5kZXJUYXJnZXRcclxufSBmcm9tIFwidGhyZWVcIjtcclxuXHJcbmltcG9ydCB7XHJcblx0QWRhcHRpdmVMdW1pbm9zaXR5TWF0ZXJpYWwsXHJcblx0Q29weU1hdGVyaWFsLFxyXG5cdEx1bWlub3NpdHlNYXRlcmlhbCxcclxuXHRUb25lTWFwcGluZ01hdGVyaWFsXHJcbn0gZnJvbSBcIi4uL21hdGVyaWFsc1wiO1xyXG5cclxuaW1wb3J0IHsgUGFzcyB9IGZyb20gXCIuL1Bhc3MuanNcIjtcclxuXHJcbi8qKlxyXG4gKiBBIHRvbmUgbWFwcGluZyBwYXNzIHRoYXQgc3VwcG9ydHMgYWRhcHRpdmUgbHVtaW5vc2l0eS5cclxuICpcclxuICogSWYgYWRhcHRpdml0eSBpcyBlbmFibGVkLCB0aGlzIHBhc3MgZ2VuZXJhdGVzIGEgdGV4dHVyZSB0aGF0IHJlcHJlc2VudHMgdGhlXHJcbiAqIGx1bWlub3NpdHkgb2YgdGhlIGN1cnJlbnQgc2NlbmUgYW5kIGFkanVzdHMgaXQgb3ZlciB0aW1lIHRvIHNpbXVsYXRlIHRoZVxyXG4gKiBvcHRpYyBuZXJ2ZSByZXNwb25kaW5nIHRvIHRoZSBhbW91bnQgb2YgbGlnaHQgaXQgaXMgcmVjZWl2aW5nLlxyXG4gKlxyXG4gKiBSZWZlcmVuY2U6XHJcbiAqICBHREMyMDA3IC0gV29sZmdhbmcgRW5nZWwsIFBvc3QtUHJvY2Vzc2luZyBQaXBlbGluZVxyXG4gKiAgaHR0cDovL3BlcnNvLnVuaXYtbHlvbjEuZnIvamVhbi1jbGF1ZGUuaWVobC9QdWJsaWMvZWR1Yy9HQU1BLzIwMDcvZ2RjMDcvUG9zdC1Qcm9jZXNzaW5nX1BpcGVsaW5lLnBkZlxyXG4gKi9cclxuXHJcbmV4cG9ydCBjbGFzcyBUb25lTWFwcGluZ1Bhc3MgZXh0ZW5kcyBQYXNzIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0cyBhIG5ldyB0b25lIG1hcHBpbmcgcGFzcy5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gLSBUaGUgb3B0aW9ucy5cclxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmFkYXB0aXZlPXRydWVdIC0gV2hldGhlciB0aGUgdG9uZSBtYXBwaW5nIHNob3VsZCB1c2UgYW4gYWRhcHRpdmUgbHVtaW5hbmNlIG1hcC5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMucmVzb2x1dGlvbj0yNTZdIC0gVGhlIHJlbmRlciB0ZXh0dXJlIHJlc29sdXRpb24uXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmRpc3RpbmN0aW9uPTEuMF0gLSBBIGx1bWluYW5jZSBkaXN0aW5jdGlvbiBmYWN0b3IuXHJcblx0ICovXHJcblxyXG5cdGNvbnN0cnVjdG9yKG9wdGlvbnMgPSB7fSkge1xyXG5cclxuXHRcdHN1cGVyKFwiVG9uZU1hcHBpbmdQYXNzXCIpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHJlbmRlciB0YXJnZXQgZm9yIHRoZSBjdXJyZW50IGx1bWlub3NpdHkuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1dlYkdMUmVuZGVyVGFyZ2V0fVxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqIEB0b2RvIFVzZSBSRUQgZm9ybWF0IGluIFdlYkdMIDIuMC5cclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMucmVuZGVyVGFyZ2V0THVtaW5vc2l0eSA9IG5ldyBXZWJHTFJlbmRlclRhcmdldCgxLCAxLCB7XHJcblx0XHRcdG1pbkZpbHRlcjogTGluZWFyTWlwTWFwTGluZWFyRmlsdGVyLFxyXG5cdFx0XHRtYWdGaWx0ZXI6IExpbmVhckZpbHRlcixcclxuXHRcdFx0Zm9ybWF0OiBSR0JGb3JtYXQsXHJcblx0XHRcdHN0ZW5jaWxCdWZmZXI6IGZhbHNlLFxyXG5cdFx0XHRkZXB0aEJ1ZmZlcjogZmFsc2VcclxuXHRcdH0pO1xyXG5cclxuXHRcdHRoaXMucmVuZGVyVGFyZ2V0THVtaW5vc2l0eS50ZXh0dXJlLm5hbWUgPSBcIlRvbmVNYXBwaW5nLkx1bWlub3NpdHlcIjtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFRoZSByZW5kZXIgdGFyZ2V0IGZvciBhZGFwdGVkIGx1bWlub3NpdHkuXHJcblx0XHQgKlxyXG5cdFx0ICogQHR5cGUge1dlYkdMUmVuZGVyVGFyZ2V0fVxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMucmVuZGVyVGFyZ2V0QWRhcHRlZCA9IHRoaXMucmVuZGVyVGFyZ2V0THVtaW5vc2l0eS5jbG9uZSgpO1xyXG5cclxuXHRcdHRoaXMucmVuZGVyVGFyZ2V0QWRhcHRlZC50ZXh0dXJlLm5hbWUgPSBcIlRvbmVNYXBwaW5nLkFkYXB0ZWRMdW1pbm9zaXR5XCI7XHJcblx0XHR0aGlzLnJlbmRlclRhcmdldEFkYXB0ZWQudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgPSBmYWxzZTtcclxuXHRcdHRoaXMucmVuZGVyVGFyZ2V0QWRhcHRlZC50ZXh0dXJlLm1pbkZpbHRlciA9IExpbmVhckZpbHRlcjtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEEgcmVuZGVyIHRhcmdldCB0aGF0IGhvbGRzIGEgY29weSBvZiB0aGUgYWRhcHRlZCBsaW1vbm9zaXR5LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtXZWJHTFJlbmRlclRhcmdldH1cclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKi9cclxuXHJcblx0XHR0aGlzLnJlbmRlclRhcmdldFByZXZpb3VzID0gdGhpcy5yZW5kZXJUYXJnZXRBZGFwdGVkLmNsb25lKCk7XHJcblxyXG5cdFx0dGhpcy5yZW5kZXJUYXJnZXRQcmV2aW91cy50ZXh0dXJlLm5hbWUgPSBcIlRvbmVNYXBwaW5nLlByZXZpb3VzTHVtaW5vc2l0eVwiO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQ29weSBzaGFkZXIgbWF0ZXJpYWwgdXNlZCBmb3Igc2F2aW5nIHRoZSBsdW1pbmFuY2UgbWFwLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtDb3B5TWF0ZXJpYWx9XHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy5jb3B5TWF0ZXJpYWwgPSBuZXcgQ29weU1hdGVyaWFsKCk7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBIGx1bWlub3NpdHkgc2hhZGVyIG1hdGVyaWFsLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtMdW1pbm9zaXR5TWF0ZXJpYWx9XHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy5sdW1pbm9zaXR5TWF0ZXJpYWwgPSBuZXcgTHVtaW5vc2l0eU1hdGVyaWFsKCk7XHJcblxyXG5cdFx0dGhpcy5sdW1pbm9zaXR5TWF0ZXJpYWwudW5pZm9ybXMuZGlzdGluY3Rpb24udmFsdWUgPSAob3B0aW9ucy5kaXN0aW5jdGlvbiAhPT0gdW5kZWZpbmVkKSA/IG9wdGlvbnMuZGlzdGluY3Rpb24gOiAxLjA7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBBbiBhZGFwdGl2ZSBsdW1pbmFuY2Ugc2hhZGVyIG1hdGVyaWFsLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtBZGFwdGl2ZUx1bWlub3NpdHlNYXRlcmlhbH1cclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKi9cclxuXHJcblx0XHR0aGlzLmFkYXB0aXZlTHVtaW5vc2l0eU1hdGVyaWFsID0gbmV3IEFkYXB0aXZlTHVtaW5vc2l0eU1hdGVyaWFsKCk7XHJcblxyXG5cdFx0dGhpcy5yZXNvbHV0aW9uID0gb3B0aW9ucy5yZXNvbHV0aW9uO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSB0b25lIG1hcHBpbmcgc2hhZGVyIG1hdGVyaWFsLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtUb25lTWFwcGluZ01hdGVyaWFsfVxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMudG9uZU1hcHBpbmdNYXRlcmlhbCA9IG5ldyBUb25lTWFwcGluZ01hdGVyaWFsKCk7XHJcblxyXG5cdFx0dGhpcy5hZGFwdGl2ZSA9IG9wdGlvbnMuYWRhcHRpdmU7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIHJlc29sdXRpb24gb2YgdGhlIHJlbmRlciB0YXJnZXRzLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge051bWJlcn1cclxuXHQgKi9cclxuXHJcblx0Z2V0IHJlc29sdXRpb24oKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMucmVuZGVyVGFyZ2V0THVtaW5vc2l0eS53aWR0aDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgcmVzb2x1dGlvbiBvZiB0aGUgcmVuZGVyIHRhcmdldHMuIE11c3QgYmUgYSBwb3dlciBvZiB0d28gZm9yIG1pcG1hcHMuXHJcblx0ICpcclxuXHQgKiBAdHlwZSB7TnVtYmVyfVxyXG5cdCAqL1xyXG5cclxuXHRzZXQgcmVzb2x1dGlvbih2YWx1ZSA9IDI1Nikge1xyXG5cclxuXHRcdC8vIFJvdW5kIHRoZSBnaXZlbiB2YWx1ZSB0byB0aGUgbmV4dCBwb3dlciBvZiB0d28uXHJcblx0XHRjb25zdCBleHBvbmVudCA9IE1hdGgubWF4KDAsIE1hdGguY2VpbChNYXRoLmxvZzIodmFsdWUpKSk7XHJcblx0XHR2YWx1ZSA9IE1hdGgucG93KDIsIGV4cG9uZW50KTtcclxuXHJcblx0XHR0aGlzLnJlbmRlclRhcmdldEx1bWlub3NpdHkuc2V0U2l6ZSh2YWx1ZSwgdmFsdWUpO1xyXG5cdFx0dGhpcy5yZW5kZXJUYXJnZXRQcmV2aW91cy5zZXRTaXplKHZhbHVlLCB2YWx1ZSk7XHJcblx0XHR0aGlzLnJlbmRlclRhcmdldEFkYXB0ZWQuc2V0U2l6ZSh2YWx1ZSwgdmFsdWUpO1xyXG5cclxuXHRcdHRoaXMuYWRhcHRpdmVMdW1pbm9zaXR5TWF0ZXJpYWwuZGVmaW5lcy5NSVBfTEVWRUxfMVgxID0gZXhwb25lbnQudG9GaXhlZCgxKTtcclxuXHRcdHRoaXMuYWRhcHRpdmVMdW1pbm9zaXR5TWF0ZXJpYWwubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFdoZXRoZXIgdGhpcyBwYXNzIHVzZXMgYWRhcHRpdmUgbHVtaW5vc2l0eS5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtCb29sZWFufVxyXG5cdCAqIEBkZWZhdWx0IHRydWVcclxuXHQgKi9cclxuXHJcblx0Z2V0IGFkYXB0aXZlKCkge1xyXG5cclxuXHRcdHJldHVybiAodGhpcy50b25lTWFwcGluZ01hdGVyaWFsLmRlZmluZXMuQURBUFRFRF9MVU1JTkFOQ0UgIT09IHVuZGVmaW5lZCk7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogV2hldGhlciB0aGlzIHBhc3Mgc2hvdWxkIHVzZSBhZGFwdGl2ZSBsdW1pbm9zaXR5LlxyXG5cdCAqXHJcblx0ICogQHR5cGUge0Jvb2xlYW59XHJcblx0ICovXHJcblxyXG5cdHNldCBhZGFwdGl2ZSh2YWx1ZSA9IHRydWUpIHtcclxuXHJcblx0XHRpZih2YWx1ZSkge1xyXG5cclxuXHRcdFx0dGhpcy50b25lTWFwcGluZ01hdGVyaWFsLmRlZmluZXMuQURBUFRFRF9MVU1JTkFOQ0UgPSBcIjFcIjtcclxuXHRcdFx0dGhpcy50b25lTWFwcGluZ01hdGVyaWFsLnVuaWZvcm1zLmx1bWluYW5jZU1hcC52YWx1ZSA9IHRoaXMucmVuZGVyVGFyZ2V0QWRhcHRlZC50ZXh0dXJlO1xyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRkZWxldGUgdGhpcy50b25lTWFwcGluZ01hdGVyaWFsLmRlZmluZXMuQURBUFRFRF9MVU1JTkFOQ0U7XHJcblx0XHRcdHRoaXMudG9uZU1hcHBpbmdNYXRlcmlhbC51bmlmb3Jtcy5sdW1pbmFuY2VNYXAudmFsdWUgPSBudWxsO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLnRvbmVNYXBwaW5nTWF0ZXJpYWwubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEluZGljYXRlcyB3aGV0aGVyIGRpdGhlcmluZyBpcyBlbmFibGVkLlxyXG5cdCAqXHJcblx0ICogQHR5cGUge0Jvb2xlYW59XHJcblx0ICovXHJcblxyXG5cdGdldCBkaXRoZXJpbmcoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMudG9uZU1hcHBpbmdNYXRlcmlhbC5kaXRoZXJpbmc7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSWYgZW5hYmxlZCwgdGhlIHJlc3VsdCB3aWxsIGJlIGRpdGhlcmVkIHRvIHJlbW92ZSBiYW5kaW5nIGFydGlmYWN0cy5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtCb29sZWFufVxyXG5cdCAqL1xyXG5cclxuXHRzZXQgZGl0aGVyaW5nKHZhbHVlKSB7XHJcblxyXG5cdFx0aWYodGhpcy5kaXRoZXJpbmcgIT09IHZhbHVlKSB7XHJcblxyXG5cdFx0XHR0aGlzLnRvbmVNYXBwaW5nTWF0ZXJpYWwuZGl0aGVyaW5nID0gdmFsdWU7XHJcblx0XHRcdHRoaXMudG9uZU1hcHBpbmdNYXRlcmlhbC5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlbmRlcnMgdGhlIGVmZmVjdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJlcn0gcmVuZGVyZXIgLSBUaGUgcmVuZGVyZXIuXHJcblx0ICogQHBhcmFtIHtXZWJHTFJlbmRlclRhcmdldH0gaW5wdXRCdWZmZXIgLSBBIGZyYW1lIGJ1ZmZlciB0aGF0IGNvbnRhaW5zIHRoZSByZXN1bHQgb2YgdGhlIHByZXZpb3VzIHBhc3MuXHJcblx0ICogQHBhcmFtIHtXZWJHTFJlbmRlclRhcmdldH0gb3V0cHV0QnVmZmVyIC0gQSBmcmFtZSBidWZmZXIgdGhhdCBzZXJ2ZXMgYXMgdGhlIG91dHB1dCByZW5kZXIgdGFyZ2V0IHVubGVzcyB0aGlzIHBhc3MgcmVuZGVycyB0byBzY3JlZW4uXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtkZWx0YV0gLSBUaGUgdGltZSBiZXR3ZWVuIHRoZSBsYXN0IGZyYW1lIGFuZCB0aGUgY3VycmVudCBvbmUgaW4gc2Vjb25kcy5cclxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IFtzdGVuY2lsVGVzdF0gLSBJbmRpY2F0ZXMgd2hldGhlciBhIHN0ZW5jaWwgbWFzayBpcyBhY3RpdmUuXHJcblx0ICovXHJcblxyXG5cdHJlbmRlcihyZW5kZXJlciwgaW5wdXRCdWZmZXIsIG91dHB1dEJ1ZmZlciwgZGVsdGEsIHN0ZW5jaWxUZXN0KSB7XHJcblxyXG5cdFx0Y29uc3Qgc2NlbmUgPSB0aGlzLnNjZW5lO1xyXG5cdFx0Y29uc3QgY2FtZXJhID0gdGhpcy5jYW1lcmE7XHJcblxyXG5cdFx0Y29uc3QgYWRhcHRpdmVMdW1pbm9zaXR5TWF0ZXJpYWwgPSB0aGlzLmFkYXB0aXZlTHVtaW5vc2l0eU1hdGVyaWFsO1xyXG5cdFx0Y29uc3QgbHVtaW5vc2l0eU1hdGVyaWFsID0gdGhpcy5sdW1pbm9zaXR5TWF0ZXJpYWw7XHJcblx0XHRjb25zdCB0b25lTWFwcGluZ01hdGVyaWFsID0gdGhpcy50b25lTWFwcGluZ01hdGVyaWFsO1xyXG5cdFx0Y29uc3QgY29weU1hdGVyaWFsID0gdGhpcy5jb3B5TWF0ZXJpYWw7XHJcblxyXG5cdFx0Y29uc3QgcmVuZGVyVGFyZ2V0UHJldmlvdXMgPSB0aGlzLnJlbmRlclRhcmdldFByZXZpb3VzO1xyXG5cdFx0Y29uc3QgcmVuZGVyVGFyZ2V0THVtaW5vc2l0eSA9IHRoaXMucmVuZGVyVGFyZ2V0THVtaW5vc2l0eTtcclxuXHRcdGNvbnN0IHJlbmRlclRhcmdldEFkYXB0ZWQgPSB0aGlzLnJlbmRlclRhcmdldEFkYXB0ZWQ7XHJcblxyXG5cdFx0aWYodGhpcy5hZGFwdGl2ZSkge1xyXG5cclxuXHRcdFx0Ly8gUmVuZGVyIHRoZSBsdW1pbmFuY2Ugb2YgdGhlIGN1cnJlbnQgc2NlbmUgaW50byBhIHJlbmRlciB0YXJnZXQgd2l0aCBtaXBtYXBwaW5nIGVuYWJsZWQuXHJcblx0XHRcdHRoaXMubWF0ZXJpYWwgPSBsdW1pbm9zaXR5TWF0ZXJpYWw7XHJcblx0XHRcdGx1bWlub3NpdHlNYXRlcmlhbC51bmlmb3Jtcy50RGlmZnVzZS52YWx1ZSA9IGlucHV0QnVmZmVyLnRleHR1cmU7XHJcblx0XHRcdHJlbmRlcmVyLnJlbmRlcihzY2VuZSwgY2FtZXJhLCByZW5kZXJUYXJnZXRMdW1pbm9zaXR5KTtcclxuXHJcblx0XHRcdC8vIFVzZSB0aGUgbmV3IGx1bWluYW5jZSB2YWx1ZXMsIHRoZSBwcmV2aW91cyBsdW1pbmFuY2UgYW5kIHRoZSBmcmFtZSBkZWx0YSB0byBhZGFwdCB0aGUgbHVtaW5hbmNlIG92ZXIgdGltZS5cclxuXHRcdFx0dGhpcy5tYXRlcmlhbCA9IGFkYXB0aXZlTHVtaW5vc2l0eU1hdGVyaWFsO1xyXG5cdFx0XHRhZGFwdGl2ZUx1bWlub3NpdHlNYXRlcmlhbC51bmlmb3Jtcy5kZWx0YS52YWx1ZSA9IGRlbHRhO1xyXG5cdFx0XHRhZGFwdGl2ZUx1bWlub3NpdHlNYXRlcmlhbC51bmlmb3Jtcy50UHJldmlvdXNMdW0udmFsdWUgPSByZW5kZXJUYXJnZXRQcmV2aW91cy50ZXh0dXJlO1xyXG5cdFx0XHRhZGFwdGl2ZUx1bWlub3NpdHlNYXRlcmlhbC51bmlmb3Jtcy50Q3VycmVudEx1bS52YWx1ZSA9IHJlbmRlclRhcmdldEx1bWlub3NpdHkudGV4dHVyZTtcclxuXHRcdFx0cmVuZGVyZXIucmVuZGVyKHNjZW5lLCBjYW1lcmEsIHJlbmRlclRhcmdldEFkYXB0ZWQpO1xyXG5cclxuXHRcdFx0Ly8gQ29weSB0aGUgbmV3IGFkYXB0ZWQgbHVtaW5hbmNlIHZhbHVlIHNvIHRoYXQgaXQgY2FuIGJlIHVzZWQgYnkgdGhlIG5leHQgZnJhbWUuXHJcblx0XHRcdHRoaXMubWF0ZXJpYWwgPSBjb3B5TWF0ZXJpYWw7XHJcblx0XHRcdGNvcHlNYXRlcmlhbC51bmlmb3Jtcy50RGlmZnVzZS52YWx1ZSA9IHJlbmRlclRhcmdldEFkYXB0ZWQudGV4dHVyZTtcclxuXHRcdFx0cmVuZGVyZXIucmVuZGVyKHNjZW5lLCBjYW1lcmEsIHJlbmRlclRhcmdldFByZXZpb3VzKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gQXBwbHkgdGhlIHRvbmUgbWFwcGluZyB0byB0aGUgY29sb3Vycy5cclxuXHRcdHRoaXMubWF0ZXJpYWwgPSB0b25lTWFwcGluZ01hdGVyaWFsO1xyXG5cdFx0dG9uZU1hcHBpbmdNYXRlcmlhbC51bmlmb3Jtcy50RGlmZnVzZS52YWx1ZSA9IGlucHV0QnVmZmVyLnRleHR1cmU7XHJcblxyXG5cdFx0cmVuZGVyZXIucmVuZGVyKHRoaXMuc2NlbmUsIHRoaXMuY2FtZXJhLCB0aGlzLnJlbmRlclRvU2NyZWVuID8gbnVsbCA6IG91dHB1dEJ1ZmZlcik7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUGVyZm9ybXMgaW5pdGlhbGl6YXRpb24gdGFza3MuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gYWxwaGEgLSBXaGV0aGVyIHRoZSByZW5kZXJlciB1c2VzIHRoZSBhbHBoYSBjaGFubmVsIG9yIG5vdC5cclxuXHQgKi9cclxuXHJcblx0aW5pdGlhbGl6ZShyZW5kZXJlciwgYWxwaGEpIHtcclxuXHJcblx0XHR0aGlzLm1hdGVyaWFsID0gbmV3IE1lc2hCYXNpY01hdGVyaWFsKHsgY29sb3I6IDB4N2ZmZmZmIH0pO1xyXG5cdFx0cmVuZGVyZXIucmVuZGVyKHRoaXMuc2NlbmUsIHRoaXMuY2FtZXJhLCB0aGlzLnJlbmRlclRhcmdldFByZXZpb3VzKTtcclxuXHRcdHRoaXMubWF0ZXJpYWwuZGlzcG9zZSgpO1xyXG5cclxuXHR9XHJcblxyXG59XHJcbiIsIi8qKlxyXG4gKiBBIGNvbXBpbGF0aW9uIG9mIHRoZSBwb3N0IHByb2Nlc3NpbmcgcGFzc2VzLlxyXG4gKlxyXG4gKiBAbW9kdWxlIHBvc3Rwcm9jZXNzaW5nL3Bhc3Nlc1xyXG4gKi9cclxuXHJcbmV4cG9ydCB7IEJsb29tUGFzcyB9IGZyb20gXCIuL0Jsb29tUGFzcy5qc1wiO1xyXG5leHBvcnQgeyBCbHVyUGFzcyB9IGZyb20gXCIuL0JsdXJQYXNzLmpzXCI7XHJcbmV4cG9ydCB7IEJva2VoUGFzcyB9IGZyb20gXCIuL0Jva2VoUGFzcy5qc1wiO1xyXG5leHBvcnQgeyBDbGVhck1hc2tQYXNzIH0gZnJvbSBcIi4vQ2xlYXJNYXNrUGFzcy5qc1wiO1xyXG5leHBvcnQgeyBDbGVhclBhc3MgfSBmcm9tIFwiLi9DbGVhclBhc3MuanNcIjtcclxuZXhwb3J0IHsgRG90U2NyZWVuUGFzcyB9IGZyb20gXCIuL0RvdFNjcmVlblBhc3MuanNcIjtcclxuZXhwb3J0IHsgRmlsbVBhc3MgfSBmcm9tIFwiLi9GaWxtUGFzcy5qc1wiO1xyXG5leHBvcnQgeyBHbGl0Y2hNb2RlLCBHbGl0Y2hQYXNzIH0gZnJvbSBcIi4vR2xpdGNoUGFzcy5qc1wiO1xyXG5leHBvcnQgeyBHb2RSYXlzUGFzcyB9IGZyb20gXCIuL0dvZFJheXNQYXNzLmpzXCI7XHJcbmV4cG9ydCB7IE1hc2tQYXNzIH0gZnJvbSBcIi4vTWFza1Bhc3MuanNcIjtcclxuZXhwb3J0IHsgT3V0bGluZVBhc3MgfSBmcm9tIFwiLi9PdXRsaW5lUGFzcy5qc1wiO1xyXG5leHBvcnQgeyBQYXNzIH0gZnJvbSBcIi4vUGFzcy5qc1wiO1xyXG5leHBvcnQgeyBQaXhlbGF0aW9uUGFzcyB9IGZyb20gXCIuL1BpeGVsYXRpb25QYXNzLmpzXCI7XHJcbmV4cG9ydCB7IFJlYWxpc3RpY0Jva2VoUGFzcyB9IGZyb20gXCIuL1JlYWxpc3RpY0Jva2VoUGFzcy5qc1wiO1xyXG5leHBvcnQgeyBSZW5kZXJQYXNzIH0gZnJvbSBcIi4vUmVuZGVyUGFzcy5qc1wiO1xyXG5leHBvcnQgeyBTYXZlUGFzcyB9IGZyb20gXCIuL1NhdmVQYXNzLmpzXCI7XHJcbmV4cG9ydCB7IFNoYWRlclBhc3MgfSBmcm9tIFwiLi9TaGFkZXJQYXNzLmpzXCI7XHJcbmV4cG9ydCB7IFNob2NrV2F2ZVBhc3MgfSBmcm9tIFwiLi9TaG9ja1dhdmVQYXNzLmpzXCI7XHJcbmV4cG9ydCB7IFNNQUFQYXNzIH0gZnJvbSBcIi4vU01BQVBhc3MuanNcIjtcclxuZXhwb3J0IHsgVGV4dHVyZVBhc3MgfSBmcm9tIFwiLi9UZXh0dXJlUGFzcy5qc1wiO1xyXG5leHBvcnQgeyBUb25lTWFwcGluZ1Bhc3MgfSBmcm9tIFwiLi9Ub25lTWFwcGluZ1Bhc3MuanNcIjtcclxuIiwiaW1wb3J0IHtcclxuXHREZXB0aFN0ZW5jaWxGb3JtYXQsXHJcblx0RGVwdGhUZXh0dXJlLFxyXG5cdExpbmVhckZpbHRlcixcclxuXHRSR0JBRm9ybWF0LFxyXG5cdFJHQkZvcm1hdCxcclxuXHRVbnNpZ25lZEludDI0OFR5cGUsXHJcblx0V2ViR0xSZW5kZXJUYXJnZXRcclxufSBmcm9tIFwidGhyZWVcIjtcclxuXHJcbmltcG9ydCB7IENsZWFyTWFza1Bhc3MsIE1hc2tQYXNzLCBTaGFkZXJQYXNzIH0gZnJvbSBcIi4uL3Bhc3Nlc1wiO1xyXG5pbXBvcnQgeyBDb3B5TWF0ZXJpYWwgfSBmcm9tIFwiLi4vbWF0ZXJpYWxzXCI7XHJcblxyXG4vKipcclxuICogVGhlIEVmZmVjdENvbXBvc2VyIG1heSBiZSB1c2VkIGluIHBsYWNlIG9mIGEgbm9ybWFsIFdlYkdMUmVuZGVyZXIuXHJcbiAqXHJcbiAqIFRoZSBhdXRvIGNsZWFyIGJlaGF2aW91ciBvZiB0aGUgcHJvdmlkZWQgcmVuZGVyZXIgd2lsbCBiZSBkaXNhYmxlZCB0byBwcmV2ZW50XHJcbiAqIHVubmVjZXNzYXJ5IGNsZWFyIG9wZXJhdGlvbnMuXHJcbiAqXHJcbiAqIEl0IGlzIGNvbW1vbiBwcmFjdGljZSB0byB1c2UgYSB7QGxpbmsgUmVuZGVyUGFzc30gYXMgdGhlIGZpcnN0IHBhc3MgdG9cclxuICogYXV0b21hdGljYWxseSBjbGVhciB0aGUgc2NyZWVuIGFuZCByZW5kZXIgdGhlIHNjZW5lIHRvIGEgdGV4dHVyZSBmb3IgZnVydGhlclxyXG4gKiBwcm9jZXNzaW5nLlxyXG4gKlxyXG4gKiBAaW1wbGVtZW50cyB7UmVzaXphYmxlfVxyXG4gKiBAaW1wbGVtZW50cyB7RGlzcG9zYWJsZX1cclxuICovXHJcblxyXG5leHBvcnQgY2xhc3MgRWZmZWN0Q29tcG9zZXIge1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RzIGEgbmV3IGVmZmVjdCBjb21wb3Nlci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7V2ViR0xSZW5kZXJlcn0gW3JlbmRlcmVyXSAtIFRoZSByZW5kZXJlciB0aGF0IHNob3VsZCBiZSB1c2VkLlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gLSBUaGUgb3B0aW9ucy5cclxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmRlcHRoQnVmZmVyPXRydWVdIC0gV2hldGhlciB0aGUgbWFpbiByZW5kZXIgdGFyZ2V0cyBzaG91bGQgaGF2ZSBhIGRlcHRoIGJ1ZmZlci5cclxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnN0ZW5jaWxCdWZmZXI9ZmFsc2VdIC0gV2hldGhlciB0aGUgbWFpbiByZW5kZXIgdGFyZ2V0cyBzaG91bGQgaGF2ZSBhIHN0ZW5jaWwgYnVmZmVyLlxyXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuZGVwdGhUZXh0dXJlPWZhbHNlXSAtIFNldCB0byB0cnVlIGlmIG9uZSBvZiB5b3VyIHBhc3NlcyByZWxpZXMgb24gYSBkZXB0aCB0ZXh0dXJlLlxyXG5cdCAqL1xyXG5cclxuXHRjb25zdHJ1Y3RvcihyZW5kZXJlciA9IG51bGwsIG9wdGlvbnMgPSB7fSkge1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHJlbmRlcmVyLlxyXG5cdFx0ICpcclxuXHRcdCAqIFlvdSBtYXkgcmVwbGFjZSB0aGUgcmVuZGVyZXIgYXQgYW55IHRpbWUgYnkgdXNpbmdcclxuXHRcdCAqIHtAbGluayBFZmZlY3RDb21wb3NlciNyZXBsYWNlUmVuZGVyZXJ9LlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtXZWJHTFJlbmRlcmVyfVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy5yZW5kZXJlciA9IHJlbmRlcmVyO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIGlucHV0IGJ1ZmZlci5cclxuXHRcdCAqXHJcblx0XHQgKiBSZWFkaW5nIGZyb20gYW5kIHdyaXRpbmcgdG8gdGhlIHNhbWUgcmVuZGVyIHRhcmdldCBzaG91bGQgYmUgYXZvaWRlZC5cclxuXHRcdCAqIFRoZXJlZm9yZSwgdHdvIHNlcGVyYXRlIHlldCBpZGVudGljYWwgYnVmZmVycyBhcmUgdXNlZC5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7V2ViR0xSZW5kZXJUYXJnZXR9XHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy5pbnB1dEJ1ZmZlciA9IG51bGw7XHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUaGUgb3V0cHV0IGJ1ZmZlci5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7V2ViR0xSZW5kZXJUYXJnZXR9XHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblxyXG5cdFx0dGhpcy5vdXRwdXRCdWZmZXIgPSBudWxsO1xyXG5cclxuXHRcdGlmKHRoaXMucmVuZGVyZXIgIT09IG51bGwpIHtcclxuXHJcblx0XHRcdHRoaXMucmVuZGVyZXIuYXV0b0NsZWFyID0gZmFsc2U7XHJcblxyXG5cdFx0XHR0aGlzLmlucHV0QnVmZmVyID0gdGhpcy5jcmVhdGVCdWZmZXIoXHJcblx0XHRcdFx0KG9wdGlvbnMuZGVwdGhCdWZmZXIgIT09IHVuZGVmaW5lZCkgPyBvcHRpb25zLmRlcHRoQnVmZmVyIDogdHJ1ZSxcclxuXHRcdFx0XHQob3B0aW9ucy5zdGVuY2lsQnVmZmVyICE9PSB1bmRlZmluZWQpID8gb3B0aW9ucy5zdGVuY2lsQnVmZmVyIDogZmFsc2UsXHJcblx0XHRcdFx0KG9wdGlvbnMuZGVwdGhUZXh0dXJlICE9PSB1bmRlZmluZWQpID8gb3B0aW9ucy5kZXB0aFRleHR1cmUgOiBmYWxzZVxyXG5cdFx0XHQpO1xyXG5cclxuXHRcdFx0dGhpcy5vdXRwdXRCdWZmZXIgPSB0aGlzLmlucHV0QnVmZmVyLmNsb25lKCk7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQSBjb3B5IHBhc3MgdXNlZCBmb3IgY29weWluZyBtYXNrZWQgc2NlbmVzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEB0eXBlIHtTaGFkZXJQYXNzfVxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMuY29weVBhc3MgPSBuZXcgU2hhZGVyUGFzcyhuZXcgQ29weU1hdGVyaWFsKCkpO1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVGhlIHBhc3Nlcy5cclxuXHRcdCAqXHJcblx0XHQgKiBAdHlwZSB7UGFzc1tdfVxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqL1xyXG5cclxuXHRcdHRoaXMucGFzc2VzID0gW107XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIGRlcHRoIHRleHR1cmUgb2YgdGhlIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycy5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtEZXB0aFRleHR1cmV9XHJcblx0ICovXHJcblxyXG5cdGdldCBkZXB0aFRleHR1cmUoKSB7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuaW5wdXRCdWZmZXIuZGVwdGhUZXh0dXJlO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMgc2hhcmUgYSBzaW5nbGUgZGVwdGggdGV4dHVyZS4gRGVwdGggd2lsbCBiZVxyXG5cdCAqIHdyaXR0ZW4gdG8gdGhpcyB0ZXh0dXJlIHdoZW4gc29tZXRoaW5nIGlzIHJlbmRlcmVkIGludG8gb25lIG9mIHRoZSBidWZmZXJzXHJcblx0ICogYW5kIHRoZSBpbnZvbHZlZCBtYXRlcmlhbHMgaGF2ZSBkZXB0aCB3cml0ZSBlbmFibGVkLlxyXG5cdCAqXHJcblx0ICogWW91IG1heSBlbmFibGUgdGhpcyBtZWNoYW5pc20gZHVyaW5nIHRoZSBpbnN0YW50aWF0aW9uIG9mIHRoZSBjb21wb3NlciBvclxyXG5cdCAqIGJ5IGFzc2lnbmluZyBhIERlcHRoVGV4dHVyZSBpbnN0YW5jZSBsYXRlciBvbi4gWW91IG1heSBhbHNvIGRpc2FibGUgaXQgYnlcclxuXHQgKiBhc3NpZ25pbmcgbnVsbC5cclxuXHQgKlxyXG5cdCAqIEB0eXBlIHtEZXB0aFRleHR1cmV9XHJcblx0ICovXHJcblxyXG5cdHNldCBkZXB0aFRleHR1cmUoeCkge1xyXG5cclxuXHRcdHRoaXMuaW5wdXRCdWZmZXIuZGVwdGhUZXh0dXJlID0geDtcclxuXHRcdHRoaXMub3V0cHV0QnVmZmVyLmRlcHRoVGV4dHVyZSA9IHg7XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVwbGFjZXMgdGhlIGN1cnJlbnQgcmVuZGVyZXIgd2l0aCB0aGUgZ2l2ZW4gb25lLiBUaGUgRE9NIGVsZW1lbnQgb2YgdGhlXHJcblx0ICogY3VycmVudCByZW5kZXJlciB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgcmVtb3ZlZCBmcm9tIGl0cyBwYXJlbnQgbm9kZSBhbmQgdGhlXHJcblx0ICogRE9NIGVsZW1lbnQgb2YgdGhlIG5ldyByZW5kZXJlciB3aWxsIHRha2UgaXRzIHBsYWNlLlxyXG5cdCAqXHJcblx0ICogVGhlIGF1dG8gY2xlYXIgbWVjaGFuaXNtIG9mIHRoZSBwcm92aWRlZCByZW5kZXJlciB3aWxsIGJlIGRpc2FibGVkLlxyXG5cdCAqXHJcblx0ICogU3dpdGNoaW5nIGJldHdlZW4gcmVuZGVyZXJzIGFsbG93cyB5b3UgdG8gZHluYW1pY2FsbHkgZW5hYmxlIG9yIGRpc2FibGVcclxuXHQgKiBhbnRpYWxpYXNpbmcuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1dlYkdMUmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIG5ldyByZW5kZXJlci5cclxuXHQgKiBAcmV0dXJuIHtXZWJHTFJlbmRlcmVyfSBUaGUgb2xkIHJlbmRlcmVyLlxyXG5cdCAqL1xyXG5cclxuXHRyZXBsYWNlUmVuZGVyZXIocmVuZGVyZXIpIHtcclxuXHJcblx0XHRjb25zdCBvbGRSZW5kZXJlciA9IHRoaXMucmVuZGVyZXI7XHJcblxyXG5cdFx0bGV0IHBhcmVudCwgb2xkU2l6ZSwgbmV3U2l6ZTtcclxuXHJcblx0XHRpZihvbGRSZW5kZXJlciAhPT0gbnVsbCAmJiBvbGRSZW5kZXJlciAhPT0gcmVuZGVyZXIpIHtcclxuXHJcblx0XHRcdHRoaXMucmVuZGVyZXIgPSByZW5kZXJlcjtcclxuXHRcdFx0dGhpcy5yZW5kZXJlci5hdXRvQ2xlYXIgPSBmYWxzZTtcclxuXHJcblx0XHRcdHBhcmVudCA9IG9sZFJlbmRlcmVyLmRvbUVsZW1lbnQucGFyZW50Tm9kZTtcclxuXHRcdFx0b2xkU2l6ZSA9IG9sZFJlbmRlcmVyLmdldFNpemUoKTtcclxuXHRcdFx0bmV3U2l6ZSA9IHJlbmRlcmVyLmdldFNpemUoKTtcclxuXHJcblx0XHRcdGlmKHBhcmVudCAhPT0gbnVsbCkge1xyXG5cclxuXHRcdFx0XHRwYXJlbnQucmVtb3ZlQ2hpbGQob2xkUmVuZGVyZXIuZG9tRWxlbWVudCk7XHJcblx0XHRcdFx0cGFyZW50LmFwcGVuZENoaWxkKHJlbmRlcmVyLmRvbUVsZW1lbnQpO1xyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYob2xkU2l6ZS53aWR0aCAhPT0gbmV3U2l6ZS53aWR0aCB8fCBvbGRTaXplLmhlaWdodCAhPT0gbmV3U2l6ZS5oZWlnaHQpIHtcclxuXHJcblx0XHRcdFx0dGhpcy5zZXRTaXplKCk7XHJcblxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBvbGRSZW5kZXJlcjtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDcmVhdGVzIGEgbmV3IHJlbmRlciB0YXJnZXQgYnkgcmVwbGljYXRpbmcgdGhlIHJlbmRlcmVyJ3MgY2FudmFzLlxyXG5cdCAqXHJcblx0ICogVGhlIGNyZWF0ZWQgcmVuZGVyIHRhcmdldCB1c2VzIGEgbGluZWFyIGZpbHRlciBmb3IgdGV4ZWwgbWluaWZpY2F0aW9uIGFuZFxyXG5cdCAqIG1hZ25pZmljYXRpb24uIEl0cyByZW5kZXIgdGV4dHVyZSBmb3JtYXQgZGVwZW5kcyBvbiB3aGV0aGVyIHRoZSByZW5kZXJlclxyXG5cdCAqIHVzZXMgdGhlIGFscGhhIGNoYW5uZWwuIE1pcG1hcHMgYXJlIGRpc2FibGVkLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtCb29sZWFufSBkZXB0aEJ1ZmZlciAtIFdoZXRoZXIgdGhlIHJlbmRlciB0YXJnZXQgc2hvdWxkIGhhdmUgYSBkZXB0aCBidWZmZXIuXHJcblx0ICogQHBhcmFtIHtCb29sZWFufSBzdGVuY2lsQnVmZmVyIC0gV2hldGhlciB0aGUgcmVuZGVyIHRhcmdldCBzaG91bGQgaGF2ZSBhIHN0ZW5jaWwgYnVmZmVyLlxyXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gZGVwdGhUZXh0dXJlIC0gV2hldGhlciB0aGUgcmVuZGVyIHRhcmdldCBzaG91bGQgaGF2ZSBhIGRlcHRoIHRleHR1cmUuXHJcblx0ICogQHJldHVybiB7V2ViR0xSZW5kZXJUYXJnZXR9IEEgbmV3IHJlbmRlciB0YXJnZXQgdGhhdCBlcXVhbHMgdGhlIHJlbmRlcmVyJ3MgY2FudmFzLlxyXG5cdCAqL1xyXG5cclxuXHRjcmVhdGVCdWZmZXIoZGVwdGhCdWZmZXIsIHN0ZW5jaWxCdWZmZXIsIGRlcHRoVGV4dHVyZSkge1xyXG5cclxuXHRcdGNvbnN0IGRyYXdpbmdCdWZmZXJTaXplID0gdGhpcy5yZW5kZXJlci5nZXREcmF3aW5nQnVmZmVyU2l6ZSgpO1xyXG5cdFx0Y29uc3QgYWxwaGEgPSB0aGlzLnJlbmRlcmVyLmNvbnRleHQuZ2V0Q29udGV4dEF0dHJpYnV0ZXMoKS5hbHBoYTtcclxuXHJcblx0XHRjb25zdCByZW5kZXJUYXJnZXQgPSBuZXcgV2ViR0xSZW5kZXJUYXJnZXQoZHJhd2luZ0J1ZmZlclNpemUud2lkdGgsIGRyYXdpbmdCdWZmZXJTaXplLmhlaWdodCwge1xyXG5cdFx0XHRtaW5GaWx0ZXI6IExpbmVhckZpbHRlcixcclxuXHRcdFx0bWFnRmlsdGVyOiBMaW5lYXJGaWx0ZXIsXHJcblx0XHRcdGZvcm1hdDogYWxwaGEgPyBSR0JBRm9ybWF0IDogUkdCRm9ybWF0LFxyXG5cdFx0XHRkZXB0aEJ1ZmZlcjogZGVwdGhCdWZmZXIsXHJcblx0XHRcdHN0ZW5jaWxCdWZmZXI6IHN0ZW5jaWxCdWZmZXIsXHJcblx0XHRcdGRlcHRoVGV4dHVyZTogZGVwdGhUZXh0dXJlID8gbmV3IERlcHRoVGV4dHVyZSgpIDogbnVsbFxyXG5cdFx0fSk7XHJcblxyXG5cdFx0aWYoZGVwdGhUZXh0dXJlICYmIHN0ZW5jaWxCdWZmZXIpIHtcclxuXHJcblx0XHRcdHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUuZm9ybWF0ID0gRGVwdGhTdGVuY2lsRm9ybWF0O1xyXG5cdFx0XHRyZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlLnR5cGUgPSBVbnNpZ25lZEludDI0OFR5cGU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHJlbmRlclRhcmdldC50ZXh0dXJlLm5hbWUgPSBcIkVmZmVjdENvbXBvc2VyLkJ1ZmZlclwiO1xyXG5cdFx0cmVuZGVyVGFyZ2V0LnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzID0gZmFsc2U7XHJcblxyXG5cdFx0cmV0dXJuIHJlbmRlclRhcmdldDtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBZGRzIGEgcGFzcywgb3B0aW9uYWxseSBhdCBhIHNwZWNpZmljIGluZGV4LlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHtQYXNzfSBwYXNzIC0gQSBuZXcgcGFzcy5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW2luZGV4XSAtIEFuIGluZGV4IGF0IHdoaWNoIHRoZSBwYXNzIHNob3VsZCBiZSBpbnNlcnRlZC5cclxuXHQgKi9cclxuXHJcblx0YWRkUGFzcyhwYXNzLCBpbmRleCkge1xyXG5cclxuXHRcdGNvbnN0IHJlbmRlcmVyID0gdGhpcy5yZW5kZXJlcjtcclxuXHRcdGNvbnN0IGRyYXdpbmdCdWZmZXJTaXplID0gcmVuZGVyZXIuZ2V0RHJhd2luZ0J1ZmZlclNpemUoKTtcclxuXHJcblx0XHRwYXNzLnNldFNpemUoZHJhd2luZ0J1ZmZlclNpemUud2lkdGgsIGRyYXdpbmdCdWZmZXJTaXplLmhlaWdodCk7XHJcblx0XHRwYXNzLmluaXRpYWxpemUocmVuZGVyZXIsIHJlbmRlcmVyLmNvbnRleHQuZ2V0Q29udGV4dEF0dHJpYnV0ZXMoKS5hbHBoYSk7XHJcblxyXG5cdFx0aWYoaW5kZXggIT09IHVuZGVmaW5lZCkge1xyXG5cclxuXHRcdFx0dGhpcy5wYXNzZXMuc3BsaWNlKGluZGV4LCAwLCBwYXNzKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0dGhpcy5wYXNzZXMucHVzaChwYXNzKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVtb3ZlcyBhIHBhc3MuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge1Bhc3N9IHBhc3MgLSBUaGUgcGFzcy5cclxuXHQgKi9cclxuXHJcblx0cmVtb3ZlUGFzcyhwYXNzKSB7XHJcblxyXG5cdFx0dGhpcy5wYXNzZXMuc3BsaWNlKHRoaXMucGFzc2VzLmluZGV4T2YocGFzcyksIDEpO1xyXG5cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlbmRlcnMgYWxsIGVuYWJsZWQgcGFzc2VzIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IHdlcmUgYWRkZWQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge051bWJlcn0gZGVsdGEgLSBUaGUgdGltZSBiZXR3ZWVuIHRoZSBsYXN0IGZyYW1lIGFuZCB0aGUgY3VycmVudCBvbmUgaW4gc2Vjb25kcy5cclxuXHQgKi9cclxuXHJcblx0cmVuZGVyKGRlbHRhKSB7XHJcblxyXG5cdFx0Y29uc3QgcGFzc2VzID0gdGhpcy5wYXNzZXM7XHJcblx0XHRjb25zdCBjb3B5UGFzcyA9IHRoaXMuY29weVBhc3M7XHJcblx0XHRjb25zdCByZW5kZXJlciA9IHRoaXMucmVuZGVyZXI7XHJcblxyXG5cdFx0bGV0IGlucHV0QnVmZmVyID0gdGhpcy5pbnB1dEJ1ZmZlcjtcclxuXHRcdGxldCBvdXRwdXRCdWZmZXIgPSB0aGlzLm91dHB1dEJ1ZmZlcjtcclxuXHJcblx0XHRsZXQgc3RlbmNpbFRlc3QgPSBmYWxzZTtcclxuXHRcdGxldCBwYXNzLCBjb250ZXh0LCBzdGF0ZSwgYnVmZmVyO1xyXG5cdFx0bGV0IGksIGw7XHJcblxyXG5cdFx0Zm9yKGkgPSAwLCBsID0gcGFzc2VzLmxlbmd0aDsgaSA8IGw7ICsraSkge1xyXG5cclxuXHRcdFx0cGFzcyA9IHBhc3Nlc1tpXTtcclxuXHJcblx0XHRcdGlmKHBhc3MuZW5hYmxlZCkge1xyXG5cclxuXHRcdFx0XHRwYXNzLnJlbmRlcihyZW5kZXJlciwgaW5wdXRCdWZmZXIsIG91dHB1dEJ1ZmZlciwgZGVsdGEsIHN0ZW5jaWxUZXN0KTtcclxuXHJcblx0XHRcdFx0aWYocGFzcy5uZWVkc1N3YXApIHtcclxuXHJcblx0XHRcdFx0XHRpZihzdGVuY2lsVGVzdCkge1xyXG5cclxuXHRcdFx0XHRcdFx0Y29weVBhc3MucmVuZGVyVG9TY3JlZW4gPSBwYXNzLnJlbmRlclRvU2NyZWVuO1xyXG5cclxuXHRcdFx0XHRcdFx0Y29udGV4dCA9IHJlbmRlcmVyLmNvbnRleHQ7XHJcblx0XHRcdFx0XHRcdHN0YXRlID0gcmVuZGVyZXIuc3RhdGU7XHJcblxyXG5cdFx0XHRcdFx0XHQvLyBQcmVzZXJ2ZSB0aGUgdW5hZmZlY3RlZCBwaXhlbHMuXHJcblx0XHRcdFx0XHRcdHN0YXRlLmJ1ZmZlcnMuc3RlbmNpbC5zZXRGdW5jKGNvbnRleHQuTk9URVFVQUwsIDEsIDB4ZmZmZmZmZmYpO1xyXG5cdFx0XHRcdFx0XHRjb3B5UGFzcy5yZW5kZXIocmVuZGVyZXIsIGlucHV0QnVmZmVyLCBvdXRwdXRCdWZmZXIsIGRlbHRhLCBzdGVuY2lsVGVzdCk7XHJcblx0XHRcdFx0XHRcdHN0YXRlLmJ1ZmZlcnMuc3RlbmNpbC5zZXRGdW5jKGNvbnRleHQuRVFVQUwsIDEsIDB4ZmZmZmZmZmYpO1xyXG5cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRidWZmZXIgPSBpbnB1dEJ1ZmZlcjtcclxuXHRcdFx0XHRcdGlucHV0QnVmZmVyID0gb3V0cHV0QnVmZmVyO1xyXG5cdFx0XHRcdFx0b3V0cHV0QnVmZmVyID0gYnVmZmVyO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGlmKHBhc3MgaW5zdGFuY2VvZiBNYXNrUGFzcykge1xyXG5cclxuXHRcdFx0XHRcdHN0ZW5jaWxUZXN0ID0gdHJ1ZTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIGlmKHBhc3MgaW5zdGFuY2VvZiBDbGVhck1hc2tQYXNzKSB7XHJcblxyXG5cdFx0XHRcdFx0c3RlbmNpbFRlc3QgPSBmYWxzZTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH1cclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSBzaXplIG9mIHRoZSBidWZmZXJzIGFuZCB0aGUgcmVuZGVyZXIncyBvdXRwdXQgY2FudmFzLlxyXG5cdCAqXHJcblx0ICogRXZlcnkgcGFzcyB3aWxsIGJlIGluZm9ybWVkIG9mIHRoZSBuZXcgc2l6ZS4gSXQncyB1cCB0byBlYWNoIHBhc3MgaG93IHRoYXRcclxuXHQgKiBpbmZvcm1hdGlvbiBpcyB1c2VkLlxyXG5cdCAqXHJcblx0ICogSWYgbm8gd2lkdGggb3IgaGVpZ2h0IGlzIHNwZWNpZmllZCwgdGhlIHJlbmRlciB0YXJnZXRzIGFuZCBwYXNzZXMgd2lsbCBiZVxyXG5cdCAqIHVwZGF0ZWQgd2l0aCB0aGUgY3VycmVudCBzaXplIG9mIHRoZSByZW5kZXJlci5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbd2lkdGhdIC0gVGhlIHdpZHRoLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbaGVpZ2h0XSAtIFRoZSBoZWlnaHQuXHJcblx0ICovXHJcblxyXG5cdHNldFNpemUod2lkdGgsIGhlaWdodCkge1xyXG5cclxuXHRcdGNvbnN0IHBhc3NlcyA9IHRoaXMucGFzc2VzO1xyXG5cdFx0Y29uc3QgcmVuZGVyZXIgPSB0aGlzLnJlbmRlcmVyO1xyXG5cclxuXHRcdGxldCBzaXplLCBkcmF3aW5nQnVmZmVyU2l6ZTtcclxuXHRcdGxldCBpLCBsO1xyXG5cclxuXHRcdGlmKHdpZHRoID09PSB1bmRlZmluZWQgfHwgaGVpZ2h0ID09PSB1bmRlZmluZWQpIHtcclxuXHJcblx0XHRcdHNpemUgPSByZW5kZXJlci5nZXRTaXplKCk7XHJcblx0XHRcdHdpZHRoID0gc2l6ZS53aWR0aDtcclxuXHRcdFx0aGVpZ2h0ID0gc2l6ZS5oZWlnaHQ7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIFVwZGF0ZSB0aGUgbG9naWNhbCByZW5kZXIgc2l6ZS5cclxuXHRcdHJlbmRlcmVyLnNldFNpemUod2lkdGgsIGhlaWdodCk7XHJcblxyXG5cdFx0Ly8gVGhlIGRyYXdpbmcgYnVmZmVyIHNpemUgdGFrZXMgdGhlIGRldmljZSBwaXhlbCByYXRpbyBpbnRvIGFjY291bnQuXHJcblx0XHRkcmF3aW5nQnVmZmVyU2l6ZSA9IHJlbmRlcmVyLmdldERyYXdpbmdCdWZmZXJTaXplKCk7XHJcblxyXG5cdFx0dGhpcy5pbnB1dEJ1ZmZlci5zZXRTaXplKGRyYXdpbmdCdWZmZXJTaXplLndpZHRoLCBkcmF3aW5nQnVmZmVyU2l6ZS5oZWlnaHQpO1xyXG5cdFx0dGhpcy5vdXRwdXRCdWZmZXIuc2V0U2l6ZShkcmF3aW5nQnVmZmVyU2l6ZS53aWR0aCwgZHJhd2luZ0J1ZmZlclNpemUuaGVpZ2h0KTtcclxuXHJcblx0XHRmb3IoaSA9IDAsIGwgPSBwYXNzZXMubGVuZ3RoOyBpIDwgbDsgKytpKSB7XHJcblxyXG5cdFx0XHRwYXNzZXNbaV0uc2V0U2l6ZShkcmF3aW5nQnVmZmVyU2l6ZS53aWR0aCwgZHJhd2luZ0J1ZmZlclNpemUuaGVpZ2h0KTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVzZXRzIHRoaXMgY29tcG9zZXIgYnkgZGVsZXRpbmcgYWxsIHBhc3NlcyBhbmQgY3JlYXRpbmcgbmV3IGJ1ZmZlcnMuXHJcblx0ICovXHJcblxyXG5cdHJlc2V0KCkge1xyXG5cclxuXHRcdGNvbnN0IHJlbmRlclRhcmdldCA9IHRoaXMuY3JlYXRlQnVmZmVyKFxyXG5cdFx0XHR0aGlzLmlucHV0QnVmZmVyLmRlcHRoQnVmZmVyLFxyXG5cdFx0XHR0aGlzLmlucHV0QnVmZmVyLnN0ZW5jaWxCdWZmZXIsXHJcblx0XHRcdCh0aGlzLmlucHV0QnVmZmVyLmRlcHRoVGV4dHVyZSAhPT0gbnVsbClcclxuXHRcdCk7XHJcblxyXG5cdFx0dGhpcy5kaXNwb3NlKCk7XHJcblxyXG5cdFx0Ly8gUmVhbmltYXRlLlxyXG5cdFx0dGhpcy5pbnB1dEJ1ZmZlciA9IHJlbmRlclRhcmdldDtcclxuXHRcdHRoaXMub3V0cHV0QnVmZmVyID0gcmVuZGVyVGFyZ2V0LmNsb25lKCk7XHJcblx0XHR0aGlzLmNvcHlQYXNzID0gbmV3IFNoYWRlclBhc3MobmV3IENvcHlNYXRlcmlhbCgpKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEZXN0cm95cyB0aGlzIGNvbXBvc2VyIGFuZCBhbGwgcGFzc2VzLlxyXG5cdCAqXHJcblx0ICogVGhpcyBtZXRob2QgZGVhbGxvY2F0ZXMgYWxsIGRpc3Bvc2FibGUgb2JqZWN0cyBjcmVhdGVkIGJ5IHRoZSBwYXNzZXMuIEl0XHJcblx0ICogYWxzbyBkZWxldGVzIHRoZSBtYWluIGZyYW1lIGJ1ZmZlcnMgb2YgdGhpcyBjb21wb3Nlci5cclxuXHQgKi9cclxuXHJcblx0ZGlzcG9zZSgpIHtcclxuXHJcblx0XHRjb25zdCBwYXNzZXMgPSB0aGlzLnBhc3NlcztcclxuXHJcblx0XHRsZXQgaSwgbDtcclxuXHJcblx0XHRmb3IoaSA9IDAsIGwgPSBwYXNzZXMubGVuZ3RoOyBpIDwgbDsgKytpKSB7XHJcblxyXG5cdFx0XHRwYXNzZXNbaV0uZGlzcG9zZSgpO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLnBhc3NlcyA9IFtdO1xyXG5cclxuXHRcdGlmKHRoaXMuaW5wdXRCdWZmZXIgIT09IG51bGwpIHtcclxuXHJcblx0XHRcdHRoaXMuaW5wdXRCdWZmZXIuZGlzcG9zZSgpO1xyXG5cdFx0XHR0aGlzLmlucHV0QnVmZmVyID0gbnVsbDtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0aWYodGhpcy5vdXRwdXRCdWZmZXIgIT09IG51bGwpIHtcclxuXHJcblx0XHRcdHRoaXMub3V0cHV0QnVmZmVyLmRpc3Bvc2UoKTtcclxuXHRcdFx0dGhpcy5vdXRwdXRCdWZmZXIgPSBudWxsO1xyXG5cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLmNvcHlQYXNzLmRpc3Bvc2UoKTtcclxuXHJcblx0fVxyXG5cclxufVxyXG4iLCJpbXBvcnQge0VmZmVjdENvbXBvc2VyfSBmcm9tICdwb3N0cHJvY2Vzc2luZy9zcmMvY29yZS9FZmZlY3RDb21wb3Nlcic7XG5pbXBvcnQge1JlbmRlclBhc3N9IGZyb20gJ3Bvc3Rwcm9jZXNzaW5nL3NyYy9wYXNzZXMvUmVuZGVyUGFzcyc7XG5pbXBvcnQge1NoYWRlclBhc3N9IGZyb20gJ3Bvc3Rwcm9jZXNzaW5nL3NyYy9wYXNzZXMvU2hhZGVyUGFzcyc7XG5cbmltcG9ydCB7TG9vcH0gZnJvbSAnLi4vLi4vY29yZS9Mb29wJztcblxuY29uc3QgcG9seWZpbGwgPSAob2JqZWN0LCBtZXRob2QsIHNob3dXYXJuID0gdHJ1ZSkgPT4ge1xuICBpZiAob2JqZWN0W21ldGhvZF0pIHJldHVybjtcbiAgaWYgKHNob3dXYXJuKSBjb25zb2xlLndhcm4oYEBQb3N0UHJvY2Vzc29yTW9kdWxlOiBwYXNzLiR7bWV0aG9kfSgpIHdhcyBub3QgZm91bmQuYCwgb2JqZWN0KTtcbiAgb2JqZWN0W21ldGhvZF0gPSAoKSA9PiB7fTtcbn07XG5cbi8qKlxuICogQGNsYXNzIFBvc3RQcm9jZXNzb3JNb2R1bGVcbiAqIEBjYXRlZ29yeSBtb2R1bGVzL2FwcFxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXNdXG4gKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj4gQ3JlYXRpbmcgYSByZW5kZXJpbmcgbW9kdWxlIGFuZCBwYXNzaW5nIGl0IHRvIEFwcCdzIG1vZHVsZXM8L2NhcHRpb24+XG4gKiBuZXcgQXBwKFtcbiAqICAgbmV3IEVsZW1lbnRNb2R1bGUoKSxcbiAqICAgbmV3IFNjZW5lTW9kdWxlKCksXG4gKiAgIG5ldyBEZWZpbmVNb2R1bGUoJ2NhbWVyYScsIG5ldyBXSFMuUGVyc3BlY3RpdmVDYW1lcmEoe1xuICogICAgIHBvc2l0aW9uOiBuZXcgVEhSRUUuVmVjdG9yMygwLCA2LCAxOCksXG4gKiAgICAgZmFyOiAxMDAwMFxuICogICB9KSksXG4gKiAgIG5ldyBSZW5kZXJpbmdNb2R1bGUoKSxcbiAqICAgbmV3IFBvc3RQcm9jZXNzb3JNb2R1bGUoKVxuICogXSk7XG4gKlxuICogY29uc3QgcHJvY2Vzc29yID0gYXBwLnVzZSgncG9zdHByb2Nlc3NvcicpO1xuICpcbiAqIHByb2Nlc3NvclxuICogICAucmVuZGVyKClcbiAqICAgLnBhc3MobmV3IEdsaXRjaFBhc3MoKSlcbiAqICAgLnJlbmRlclRvU2NyZWVuKClcbiAqL1xuZXhwb3J0IGNsYXNzIFBvc3RQcm9jZXNzb3JNb2R1bGUge1xuICBjdXJyZW50UGFzcyA9IG51bGw7XG5cbiAgZGVmZXIgPSBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICB0aGlzLnJlc29sdmUgPSByZXNvbHZlO1xuICB9KTtcblxuICBzdGF0aWMgZGVmYXVsdHMgPSB7XG4gICAgZGVidWc6IHRydWVcbiAgfTtcblxuICBjb25zdHJ1Y3RvcihwYXJhbXMgPSBQb3N0UHJvY2Vzc29yTW9kdWxlLmRlZmF1bHRzKSB7XG4gICAgdGhpcy5kZWJ1ZyA9IHBhcmFtcy5kZWJ1ZztcbiAgICB0aGlzLnBhcmFtcyA9IHBhcmFtcztcbiAgfVxuXG4gIG1hbmFnZXIobWFuYWdlcikge1xuICAgIG1hbmFnZXIuZGVmaW5lKCdwb3N0cHJvY2Vzc29yJyk7XG5cbiAgICB0aGlzLmVmZmVjdHMgPSBtYW5hZ2VyLnVzZSgncmVuZGVyaW5nJykuZWZmZWN0cztcbiAgICB0aGlzLnJlbmRlcmVyID0gbWFuYWdlci5nZXQoJ3JlbmRlcmVyJyk7XG4gICAgdGhpcy5zY2VuZSA9IG1hbmFnZXIuZ2V0KCdzY2VuZScpO1xuICAgIHRoaXMuY2FtZXJhID0gbWFuYWdlci5nZXQoJ2NhbWVyYScpO1xuXG4gICAgdGhpcy5jb21wb3NlciA9IG5ldyBFZmZlY3RDb21wb3Nlcih0aGlzLnJlbmRlcmVyLCB0aGlzLnBhcmFtcyk7XG5cbiAgICBtYW5hZ2VyLnVzZSgncmVuZGVyaW5nJykuc3RvcCgpO1xuXG4gICAgY29uc3QgY29tcG9zZXIgPSB0aGlzLmNvbXBvc2VyO1xuICAgIHRoaXMucmVuZGVyTG9vcCA9IG5ldyBMb29wKGNsb2NrID0+IGNvbXBvc2VyLnJlbmRlcihjbG9jay5nZXREZWx0YSgpKSkuc3RhcnQobWFuYWdlci5oYW5kbGVyKTtcblxuICAgIG1hbmFnZXIudXBkYXRlKHtcbiAgICAgIHJlbmRlcmVyOiByZW5kZXJlciA9PiB7XG4gICAgICAgIHRoaXMuY29tcG9zZXIucmVwbGFjZVJlbmRlcmVyKHJlbmRlcmVyKTtcbiAgICAgIH0sXG5cbiAgICAgIHNjZW5lOiBzY2VuZSA9PiB7XG4gICAgICAgIHRoaXMuc2NlbmUgPSBzY2VuZTtcbiAgICAgIH0sXG5cbiAgICAgIGNhbWVyYTogY2FtZXJhID0+IHtcbiAgICAgICAgdGhpcy5jYW1lcmEgPSBjYW1lcmE7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLnJlc29sdmUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIHJlbmRlclxuICAgKiBAZGVzY3JpcHRpb24gQWRkcyBSZW5kZXJQYXNzXG4gICAqIEByZXR1cm4ge3RoaXN9XG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9hcHAuUG9zdFByb2Nlc3Nvck1vZHVsZVxuICAgKi9cbiAgcmVuZGVyKCkge1xuICAgIHRoaXMuZGVmZXIudGhlbigoKSA9PiB7XG4gICAgICBjb25zdCBwYXNzID0gbmV3IFJlbmRlclBhc3ModGhpcy5zY2VuZSwgdGhpcy5jYW1lcmEubmF0aXZlKTtcblxuICAgICAgLy8gVE9ETzogU3VwcG9ydCBmb3IgZWZmZWN0cy5cblxuICAgICAgdGhpcy5jb21wb3Nlci5hZGRQYXNzKHBhc3MpO1xuICAgICAgdGhpcy5jdXJyZW50UGFzcyA9IHBhc3M7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIHBhc3NcbiAgICogQGRlc2NyaXB0aW9uIEFkZHMgeW91ciBjdXN0b20gcGFzc1xuICAgKiBAcGFyYW0ge1Bhc3N9IHBhc3MgQSBjdXN0b20gcGFzc1xuICAgKiBAcmV0dXJuIHt0aGlzfVxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwLlBvc3RQcm9jZXNzb3JNb2R1bGVcbiAgICovXG4gIHBhc3MocGFzcykge1xuICAgIHRoaXMuZGVmZXIudGhlbigoKSA9PiB7XG4gICAgICBwb2x5ZmlsbChwYXNzLCAnc2V0U2l6ZScsIHRoaXMuZGVidWcpO1xuICAgICAgcG9seWZpbGwocGFzcywgJ2luaXRpYWxpc2UnLCB0aGlzLmRlYnVnKTtcblxuICAgICAgdGhpcy5jb21wb3Nlci5hZGRQYXNzKHBhc3MpO1xuICAgICAgdGhpcy5jdXJyZW50UGFzcyA9IHBhc3M7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIHNoYWRlclxuICAgKiBAZGVzY3JpcHRpb24gQWRkcyBhIHBhc3MgbWFkZSBmcm9tIHNoYWRlciBtYXRlcmlhbFxuICAgKiBAcGFyYW0ge01hdGVyaWFsfSBtYXRlcmlhbCBBIFNoYWRlck1hdGVyaWFsXG4gICAqIEBwYXJhbSB7U3RyaW5nfSB0ZXh0dXJlSUQgTmFtZSBvZiB0aGUgcmVhZEJ1ZmZlciB1bmlmb3JtXG4gICAqIEByZXR1cm4ge3RoaXN9XG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9hcHAuUG9zdFByb2Nlc3Nvck1vZHVsZVxuICAgKi9cbiAgc2hhZGVyKG1hdGVyaWFsLCB0ZXh0dXJlSUQgPSAncmVhZEJ1ZmZlcicpIHtcbiAgICB0aGlzLmRlZmVyLnRoZW4oKCkgPT4ge1xuICAgICAgaWYgKCFtYXRlcmlhbC51bmlmb3Jtc1t0ZXh0dXJlSURdKVxuICAgICAgICBtYXRlcmlhbC51bmlmb3Jtc1t0ZXh0dXJlSURdID0ge3ZhbHVlOiBudWxsfTtcblxuICAgICAgY29uc3QgcGFzcyA9IG5ldyBTaGFkZXJQYXNzKG1hdGVyaWFsLCB0ZXh0dXJlSUQpO1xuXG4gICAgICB0aGlzLmNvbXBvc2VyLmFkZFBhc3MocGFzcyk7XG4gICAgICB0aGlzLmN1cnJlbnRQYXNzID0gcGFzcztcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgZ2V0XG4gICAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIGEgcGFzcyBieSB0aGUgZ2l2ZW4gbmFtZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgcGFzc1xuICAgKiBAcmV0dXJuIHt0aGlzfVxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwLlBvc3RQcm9jZXNzb3JNb2R1bGVcbiAgICovXG4gIGdldChuYW1lKSB7XG4gICAgcmV0dXJuIG5hbWVcbiAgICAgID8gdGhpcy5jb21wb3Nlci5wYXNzZXMuZmlsdGVyKHBhc3MgPT4gcGFzcy5uYW1lID09PSBuYW1lKVswXVxuICAgICAgOiB0aGlzLmN1cnJlbnRQYXNzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgcmVuZGVyVG9TY3JlZW5cbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIHJlbmRlclRvU2NyZWVuIHByb3BlcnR5IG9mIGN1cnJlbnRQYXNzXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbbmFtZT10cnVlXSBUaGUgbmFtZSBvZiB0aGUgcGFzc1xuICAgKiBAcmV0dXJuIHt0aGlzfVxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwLlBvc3RQcm9jZXNzb3JNb2R1bGVcbiAgICovXG4gIHJlbmRlclRvU2NyZWVuKGJvb2wgPSB0cnVlKSB7XG4gICAgdGhpcy5kZWZlci50aGVuKCgpID0+IHtcbiAgICAgIHRoaXMuY3VycmVudFBhc3MucmVuZGVyVG9TY3JlZW4gPSBib29sO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cbiIsIi8qKlxuICogQGNsYXNzIEV2ZW50c1BhdGNoTW9kdWxlXG4gKiBAZGVzY3JpcHRpb24gVGhpcyBvbmUgaXMgdXNlZCBpbiB0aGUgY29yZSB0byBoYW5kbGUgZXZlbnRzIHVzZWQgYnkgbW9kdWxlcy4gSWYgeW91IHdhbnQgdG8gbWFrZSBjdXN0b20gZXZlbnRzIC0gcGxlYXNlIG1ha2UgYSBzaW1pbGFyIG9uZS5cbiAqIEBjYXRlZ29yeSBtb2R1bGVzL2FwcFxuICogQG1lbWJlcm9mIG1vZHVsZTptb2R1bGVzL2FwcFxuICovXG5leHBvcnQgY2xhc3MgRXZlbnRzUGF0Y2hNb2R1bGUge1xuICBtYW5hZ2VyKG1hbmFnZXIpIHtcbiAgICBtYW5hZ2VyLmRlZmluZSgnZXZlbnRzJyk7XG4gICAgdGhpcy5lbGVtZW50ID0gbWFuYWdlci5nZXQoJ3JlbmRlcmVyJykuZG9tRWxlbWVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZnVuY3Rpb24gcGF0Y2hFdmVudHNcbiAgICogQGRlc2NyaXB0aW9uIFRoaXMgbWV0aG9kcyBwYXRjaGVzIHRoZSBsaXN0IG9mIGV2ZW50cyBvbiBzcGVjaWZpYyBvYmplY3QuXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBvcmlnaW5PYmplY3QgLSBUaGUgb2JqZWN0IHRoYXQgZ2l2ZXMgZXZlbnRzLlxuICAgKiBAcGFyYW0ge051bWJlcn0gW2Rlc3RPYmplY3Q9dGhpc10gLSBUaGUgb2JqZWN0IHRoYXQgdGFrZXMgZXZlbnRzLlxuICAgKiBAcGFyYW0ge0FycmF5W1N0cmluZ3NdfSBbZXZlbnRzPVtdXSAtIFRoZSBsaXN0IG9mIGV2ZW50cyBieSBuYW1lcy5cbiAgICogQG1lbWJlcm9mIG1vZHVsZTptb2R1bGVzL2FwcC5FdmVudHNQYXRjaE1vZHVsZVxuICAgKi9cbiAgcGF0Y2hFdmVudHMob3JpZ2luT2JqZWN0LCBkZXN0T2JqZWN0ID0gdGhpcywgZXZlbnRzID0gW10pIHtcbiAgICBldmVudHMuZm9yRWFjaChldmVudCA9PlxuICAgICAgb3JpZ2luT2JqZWN0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGUgPT4gZGVzdE9iamVjdC5lbWl0KGV2ZW50LCBlKSlcbiAgICApO1xuICB9XG5cbiAgaW50ZWdyYXRlKHNlbGYpIHtcbiAgICBjb25zdCB7ZWxlbWVudCwgcGF0Y2hFdmVudHN9ID0gc2VsZjtcblxuICAgIHBhdGNoRXZlbnRzKGVsZW1lbnQsIHRoaXMsIFtcbiAgICAgICdtb3VzZW1vdmUnLFxuICAgICAgJ21vdXNldXAnLFxuICAgICAgJ2NvbnRleHRtZW51JyxcbiAgICAgICdtb3VzZWRvd24nLFxuICAgICAgJ2NsaWNrJyxcbiAgICAgICd3aGVlbCcsXG4gICAgICAndG91Y2hzdGFydCcsXG4gICAgICAndG91Y2hlbmQnLFxuICAgICAgJ3RvdWNobW92ZScsXG4gICAgICAna2V5ZG93bicsXG4gICAgICAna2V5dXAnLFxuICAgICAgJ2tleXByZXNzJ1xuICAgIF0pO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBWZWN0b3IyLFxuICBSYXljYXN0ZXIsXG4gIFBsYW5lLFxuICBWZWN0b3IzXG59IGZyb20gJ3RocmVlJztcblxuaW1wb3J0IEV2ZW50cyBmcm9tICdtaW5pdmVudHMnO1xuaW1wb3J0IHtFdmVudHNQYXRjaE1vZHVsZX0gZnJvbSAnLi9FdmVudHNQYXRjaE1vZHVsZSc7XG5cbi8qKlxuICogQGNsYXNzIFZpcnR1YWxNb3VzZU1vZHVsZVxuICogQGNhdGVnb3J5IG1vZHVsZXMvYXBwXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtnbG9iYWxNb3ZlbWVudD1mYWxzZV1cbiAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9hcHBcbiAqIEBleHRlbmRzIEV2ZW50c1xuICovXG5leHBvcnQgY2xhc3MgVmlydHVhbE1vdXNlTW9kdWxlIGV4dGVuZHMgRXZlbnRzIHtcbiAgbW91c2UgPSBuZXcgVmVjdG9yMigpO1xuICByYXljYXN0ZXIgPSBuZXcgUmF5Y2FzdGVyKCk7XG4gIHdvcmxkID0gbnVsbDtcbiAgY2FudmFzID0gbnVsbDtcbiAgcHJvamVjdGlvblBsYW5lID0gbmV3IFBsYW5lKG5ldyBWZWN0b3IzKDAsIDAsIDEpLCAwKTtcblxuICBjb25zdHJ1Y3RvcihnbG9iYWxNb3ZlbWVudCA9IGZhbHNlKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmdsb2JhbE1vdmVtZW50ID0gZ2xvYmFsTW92ZW1lbnQ7XG4gIH1cblxuICB1cGRhdGUoZSwgY3VzdG9tWCwgY3VzdG9tWSkge1xuICAgIGNvbnN0IHJlY3QgPSB0aGlzLmNhbnZhcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgIGNvbnN0IHggPSBjdXN0b21YIHx8IGUuY2xpZW50WDtcbiAgICBjb25zdCB5ID0gY3VzdG9tWSB8fCBlLmNsaWVudFk7XG5cbiAgICB0aGlzLm1vdXNlLnggPSAoKHggLSByZWN0LmxlZnQpIC8gKHJlY3QucmlnaHQgLSByZWN0LmxlZnQpKSAqIDIgLSAxO1xuICAgIHRoaXMubW91c2UueSA9IC0oKHkgLSByZWN0LnRvcCkgLyAocmVjdC5ib3R0b20gLSByZWN0LnRvcCkpICogMiArIDE7XG5cbiAgICB0aGlzLnByb2plY3Rpb25QbGFuZS5ub3JtYWwuY29weSh0aGlzLmNhbWVyYS5nZXRXb3JsZERpcmVjdGlvbigpKTtcblxuICAgIHRoaXMucmF5Y2FzdGVyLnNldEZyb21DYW1lcmEodGhpcy5tb3VzZSwgdGhpcy5jYW1lcmEpO1xuICAgIHRoaXMuZW1pdCgnbW92ZScpO1xuICB9XG5cbiAgbWFuYWdlcihtYW5hZ2VyKSB7XG4gICAgbWFuYWdlci5kZWZpbmUoJ21vdXNlJyk7XG4gICAgbWFuYWdlci5yZXF1aXJlKCdldmVudHMnLCAoKSA9PiBuZXcgRXZlbnRzUGF0Y2hNb2R1bGUoKSk7XG5cbiAgICB0aGlzLmNhbnZhcyA9IG1hbmFnZXIuZ2V0KCdyZW5kZXJlcicpLmRvbUVsZW1lbnQ7XG4gICAgdGhpcy5jYW1lcmEgPSBtYW5hZ2VyLmdldCgnY2FtZXJhJykubmF0aXZlO1xuICB9XG5cbiAgaW50ZWdyYXRlKHNlbGYpIHtcbiAgICBbXG4gICAgICAnY2xpY2snLFxuICAgICAgJ21vdXNlZG93bicsXG4gICAgICAnbW91c2V1cCcsXG4gICAgICAnbW91c2Vtb3ZlJ1xuICAgIF0uZm9yRWFjaChldiA9PiB0aGlzLm9uKGV2LCBlID0+IHNlbGYuZW1pdChldiwgZSkpKTtcblxuICAgIHNlbGYuZ2xvYmFsWCA9IDA7XG4gICAgc2VsZi5nbG9iYWxZID0gMDtcblxuICAgIHRoaXMub24oJ21vdXNlbW92ZScsIGUgPT4ge1xuICAgICAgaWYgKGRvY3VtZW50LnBvaW50ZXJMb2NrRWxlbWVudCAhPT0gbnVsbCkge1xuICAgICAgICBzZWxmLmdsb2JhbFggKz0gZS5tb3ZlbWVudFg7XG4gICAgICAgIHNlbGYuZ2xvYmFsWSArPSBlLm1vdmVtZW50WTtcblxuICAgICAgICBzZWxmLnVwZGF0ZShlLCBzZWxmLmdsb2JhbFgsIHNlbGYuZ2xvYmFsWSk7XG4gICAgICB9IGVsc2Ugc2VsZi51cGRhdGUoZSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCB0cmFja1xuICAgKiBAZGVzY3JpcHRpb24gU3RhcnRzIHRyYWNraW5nIGV2ZW50cyBvbiBhIGNvbXBvbmVudFxuICAgKiBAcGFyYW0ge0NvbXBvbmVudH0gY29tcG9uZW50IEEgY29tcG9uZW50LCB0aGF0IHNob3VsZCBiZSB0cmFja2VkIGJ5IHRoZSBtb3VzZVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IG5lc3RlZCBXaGV0aGVyIGNvbXBvbmVudCdzIGNoaWxkcmVuIHNob3VsZCBiZSB0cmFja2VkIG9yIG5vdFxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwLlZpcnR1YWxNb3VzZU1vZHVsZVxuICAgKi9cbiAgdHJhY2soY29tcG9uZW50LCBuZXN0ZWQgPSB0cnVlKSB7XG4gICAgbGV0IGlzSG92ZXJlZCA9IGZhbHNlO1xuXG4gICAgdGhpcy5vbignbW92ZScsICgpID0+IHtcbiAgICAgIGlmICh0aGlzLmhvdmVycyhjb21wb25lbnQsIG5lc3RlZCkpIHtcbiAgICAgICAgaWYgKGlzSG92ZXJlZCkgY29tcG9uZW50LmVtaXQoJ21vdXNlbW92ZScpO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBjb21wb25lbnQuZW1pdCgnbW91c2VvdmVyJyk7XG4gICAgICAgICAgaXNIb3ZlcmVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChpc0hvdmVyZWQpIHtcbiAgICAgICAgY29tcG9uZW50LmVtaXQoJ21vdXNlb3V0Jyk7XG4gICAgICAgIGlzSG92ZXJlZCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5vbignY2xpY2snLCAoKSA9PiB7XG4gICAgICBpZiAoaXNIb3ZlcmVkKSBjb21wb25lbnQuZW1pdCgnY2xpY2snKTtcbiAgICAgIGVsc2UgY29tcG9uZW50LmVtaXQoJ29mZkNsaWNrJyk7XG4gICAgfSk7XG5cbiAgICB0aGlzLm9uKCdtb3VzZWRvd24nLCAoKSA9PiB7XG4gICAgICBpZiAoaXNIb3ZlcmVkKSBjb21wb25lbnQuZW1pdCgnbW91c2Vkb3duJyk7XG4gICAgfSk7XG5cbiAgICB0aGlzLm9uKCdtb3VzZXVwJywgKCkgPT4ge1xuICAgICAgaWYgKGlzSG92ZXJlZCkgY29tcG9uZW50LmVtaXQoJ21vdXNldXAnKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGludGVyc2VjdGlvblxuICAgKiBAZGVzY3JpcHRpb24gUmV0dXJucyBhbiBpbnRlcnNlY3Rpb24gZGF0YVxuICAgKiBAcGFyYW0ge0NvbXBvbmVudH0gY29tcG9uZW50IEEgY29tcG9uZW50IHRoYXQgaW50ZXJzZWN0cyB3aXRoIG1vdXNlIHJheSAob3IgZG9lc24ndClcbiAgICogQHBhcmFtIHtCb29sZWFufSBuZXN0ZWQgV2hldGhlciBjb21wb25lbnQncyBjaGlsZHJlbiBzaG91bGQgYmUgdHJhY2tlZCBvciBub3RcbiAgICogQHJldHVybiB7QXJyYXl9IGludGVyc2VjdGlvbiBkYXRhLlxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwLlZpcnR1YWxNb3VzZU1vZHVsZVxuICAgKi9cbiAgaW50ZXJzZWN0aW9uKHtuYXRpdmV9LCBuZXN0ZWQgPSB0cnVlKSB7XG4gICAgaWYgKG5hdGl2ZS5jaGlsZHJlbi5sZW5ndGggPiAwICYmIG5lc3RlZCkge1xuICAgICAgY29uc3Qgb2JqZWN0cyA9IFtdO1xuICAgICAgbmF0aXZlLnRyYXZlcnNlKGNoaWxkID0+IG9iamVjdHMucHVzaChjaGlsZCkpO1xuXG4gICAgICByZXR1cm4gdGhpcy5yYXljYXN0ZXIuaW50ZXJzZWN0T2JqZWN0cyhvYmplY3RzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5yYXljYXN0ZXIuaW50ZXJzZWN0T2JqZWN0KG5hdGl2ZSk7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBwcm9qZWN0XG4gICAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIGEgdmVjdG9yIGJhc2VkIG9uIG1vdXNlIHJheSBpbnRlcnNlY3Rpb24gd2l0aCBwbGFuZVxuICAgKiBAcGFyYW0ge1RIUkVFLlBsYW5lfSBbcGxhbmU9dGhpcy5wcm9qZWN0aW9uUGxhbmVdIE1hdGggcGxhbmUgdGhhdCBpcyB1c2VkXG4gICAqIEBwYXJhbSB7VmVjdG9yM30gW3RhcmdldF0gT3B0aW9uYWwgdGFyZ2V0XG4gICAqIEByZXR1cm4ge1ZlY3RvcjN9IEFuIGludGVyc2VjdGlvbiBwb2ludC5cbiAgICogQG1lbWJlcm9mIG1vZHVsZTptb2R1bGVzL2FwcC5WaXJ0dWFsTW91c2VNb2R1bGVcbiAgICovXG4gIHByb2plY3QocGxhbmUgPSB0aGlzLnByb2plY3Rpb25QbGFuZSwgdGFyZ2V0KSB7XG4gICAgcmV0dXJuIHRoaXMucmF5Y2FzdGVyLnJheS5pbnRlcnNlY3RQbGFuZShwbGFuZSwgdGFyZ2V0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGhvdmVyc1xuICAgKiBAZGVzY3JpcHRpb24gUmV0dXJucyBhIGJvb2xlYW4gYmFzZWQgb24gaW50ZXJzZWN0aW9uIGRhdGEgKFdoZXRoZXIgbW91c2UgaG92ZXJzIHRoZSBjb21wb25lbnQpXG4gICAqIEBwYXJhbSB7Q29tcG9uZW50fSBjb21wb25lbnQgQSBjb21wb25lbnQgdGhhdCBpbnRlcnNlY3RzIHdpdGggbW91c2UgcmF5IChvciBkb2Vzbid0KVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IG5lc3RlZCBXaGV0aGVyIGNvbXBvbmVudCdzIGNoaWxkcmVuIHNob3VsZCBiZSB0cmFja2VkIG9yIG5vdFxuICAgKiBAcmV0dXJuIHtCb29sZWFufSBXaGV0aGVyIHRoZSBjb21wb25lbnQgaXMgaG92ZXJlZC5cbiAgICogQG1lbWJlcm9mIG1vZHVsZTptb2R1bGVzL2FwcC5WaXJ0dWFsTW91c2VNb2R1bGVcbiAgICovXG4gIGhvdmVycyhjb21wb25lbnQsIG5lc3RlZCA9IHRydWUpIHtcbiAgICByZXR1cm4gdGhpcy5pbnRlcnNlY3Rpb24oY29tcG9uZW50LCBuZXN0ZWQpLmxlbmd0aCA+IDA7XG4gIH1cblxuICAvKipcbiAgICogTW91c2UgcmF5XG4gICAqIEBtZW1iZXIge1RIUkVFLlJheX0gbW9kdWxlOm1vZHVsZXMvYXBwLlZpcnR1YWxNb3VzZU1vZHVsZSNyYXlcbiAgICogQHB1YmxpY1xuICAgKi9cbiAgZ2V0IHJheSgpIHtcbiAgICByZXR1cm4gdGhpcy5yYXljYXN0ZXIucmF5O1xuICB9XG5cbiAgLyoqXG4gICAqIE1vdXNlIHggWy0xOyAxXVxuICAgKiBAbWVtYmVyIHtOdW1iZXJ9IG1vZHVsZTptb2R1bGVzL2FwcC5WaXJ0dWFsTW91c2VNb2R1bGUjeFxuICAgKiBAcHVibGljXG4gICAqL1xuICBnZXQgeCgpIHtcbiAgICByZXR1cm4gdGhpcy5tb3VzZS54O1xuICB9XG5cbiAgLyoqXG4gICAqIE1vdXNlIHkgWy0xOyAxXVxuICAgKiBAbWVtYmVyIHtOdW1iZXJ9IG1vZHVsZTptb2R1bGVzL2FwcC5WaXJ0dWFsTW91c2VNb2R1bGUjeVxuICAgKiBAcHVibGljXG4gICAqL1xuICBnZXQgeSgpIHtcbiAgICByZXR1cm4gdGhpcy5tb3VzZS55O1xuICB9XG59XG4iLCJpbXBvcnQge0xvb3B9IGZyb20gJy4uLy4uL2NvcmUvTG9vcCc7XG5pbXBvcnQge0V2ZW50c1BhdGNoTW9kdWxlfSBmcm9tICcuL0V2ZW50c1BhdGNoTW9kdWxlJztcblxuLyoqXG4gKiBAY2xhc3MgQ29udHJvbHNNb2R1bGVcbiAqIEBjYXRlZ29yeSBtb2R1bGVzL2FwcFxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXNdXG4gKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj4gQ3JlYXRpbmcgYSByZW5kZXJpbmcgbW9kdWxlIGFuZCBwYXNzaW5nIGl0IHRvIEFwcCdzIG1vZHVsZXM8L2NhcHRpb24+XG4gKiBuZXcgQXBwKFtcbiAqICAgbmV3IEVsZW1lbnRNb2R1bGUoKSxcbiAqICAgbmV3IFNjZW5lTW9kdWxlKCksXG4gKiAgIG5ldyBEZWZpbmVNb2R1bGUoJ2NhbWVyYScsIG5ldyBXSFMuUGVyc3BlY3RpdmVDYW1lcmEoe1xuICogICAgIHBvc2l0aW9uOiBuZXcgVEhSRUUuVmVjdG9yMygwLCA2LCAxOCksXG4gKiAgICAgZmFyOiAxMDAwMFxuICogICB9KSksXG4gKiAgIG5ldyBSZW5kZXJpbmdNb2R1bGUoKSxcbiAqICAgbmV3IENvbnRyb2xzTW9kdWxlLmZyb20obmV3IFRIUkVFLlRyYWNrYmFsbENvbnRyb2xzKCkpXG4gKiBdKTtcbiAqL1xuZXhwb3J0IGNsYXNzIENvbnRyb2xzTW9kdWxlIHtcbiAgc3RhdGljIGZyb20oY29udHJvbHMpIHtcbiAgICByZXR1cm4gbmV3IENvbnRyb2xzTW9kdWxlKHtjb250cm9sc30pO1xuICB9XG5cbiAgY29uc3RydWN0b3IocGFyYW1zID0ge30pIHtcbiAgICB0aGlzLnBhcmFtcyA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgY29udHJvbHM6IGZhbHNlLFxuICAgICAgZml4OiBjb250cm9scyA9PiBjb250cm9scyxcblxuICAgICAgdXBkYXRlKGMpIHtcbiAgICAgICAgdGhpcy5jb250cm9scy51cGRhdGUoYy5nZXREZWx0YSgpKTtcbiAgICAgIH1cbiAgICB9LCBwYXJhbXMpO1xuXG4gICAgdGhpcy5jb250cm9scyA9IHRoaXMucGFyYW1zLmNvbnRyb2xzO1xuICAgIHRoaXMudXBkYXRlID0gdGhpcy5wYXJhbXMudXBkYXRlO1xuICB9XG5cbiAgbWFuYWdlcihtYW5hZ2VyKSB7XG4gICAgbWFuYWdlci5kZWZpbmUoJ2NvbnRyb2xzJyk7XG4gICAgbWFuYWdlci5yZXF1aXJlKCdldmVudHMnLCAoKSA9PiBuZXcgRXZlbnRzUGF0Y2hNb2R1bGUoKSk7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBzZXRDb250cm9sc1xuICAgKiBAZGVzY3JpcHRpb24gU2V0IHdvcmtpbmcgY29udHJvbHNcbiAgICogQHBhcmFtIHtPYmplY3R9IGNvbnRyb2xzIFdvcmtpbmcgdGhyZWUuanMgY29udHJvbHMgb2JqZWN0LlxuICAgKiBAcmV0dXJuIHt0aGlzfVxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwLkNvbnRyb2xzTW9kdWxlXG4gICAqL1xuICBzZXRDb250cm9scyhjb250cm9scykge1xuICAgIHRoaXMuY29udHJvbHMgPSBjb250cm9scztcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIHNldFVwZGF0ZVxuICAgKiBAZGVzY3JpcHRpb24gU2V0IGNvbnRyb2xzIHVwZGF0ZSBmdW5jdGlvblxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSB1cGRhdGUgVXBkYXRlIGZ1bmN0aW9uXG4gICAqIEByZXR1cm4ge3RoaXN9XG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9hcHAuQ29udHJvbHNNb2R1bGVcbiAgICovXG4gIHNldFVwZGF0ZSh1cGRhdGUpIHtcbiAgICB0aGlzLnVwZGF0ZSA9IHVwZGF0ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGludGVncmF0ZShzZWxmKSB7XG4gICAgc2VsZi51cGRhdGVMb29wID0gbmV3IExvb3Aoc2VsZi51cGRhdGUuYmluZChzZWxmKSk7XG4gICAgc2VsZi51cGRhdGVMb29wLnN0YXJ0KHRoaXMpO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBGb2dFeHAyLFxuICBGb2dcbn0gZnJvbSAndGhyZWUnO1xuXG4vKipcbiAqIEBjbGFzcyBGb2dNb2R1bGVcbiAqIEBjYXRlZ29yeSBtb2R1bGVzL2FwcFxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXM9e2NvbG9yOiAweGVmZDFiNSwgZGVuc2l0eTogMC4wMjAsIG5lYXI6IDEwLCBmYXI6IDEwMDB9XSAtIFRoZSBwYXJhbWV0ZXJzIG9iamVjdC5cbiAqIEBwYXJhbSB7U3RyaW5nfSBbdHlwZT1leHAyXSAtIFRoZSB0eXBlIG9mIGZvZyAtIGV4cDIgb3IgbGluZWFyXG4gKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5Ib3cgdG8gY3JlYXRlIGFuZCBhcHBseSBhIEZvZ01vZHVsZTwvY2FwdGlvbj5cbiAqIGNvbnN0IGZvZ01vZHVsZSA9IG5ldyBGb2dNb2R1bGUoe1xuICogICAgY29sb3I6IDB4ZmZmZmZmLFxuICogICAgZGVuc2l0eTogMC4wMyxcbiAqICAgIG5lYXI6IDIwLFxuICogICAgZmFyOiAyMDBcbiAqICB9LCAnZXhwMicpO1xuICpcbiAqIG5ldyBBcHAoW1xuICogIC4uLixcbiAqICBmb2dNb2R1bGVcbiAqIF0pO1xuICovXG5leHBvcnQgY2xhc3MgRm9nTW9kdWxlIHtcbiAgY29uc3RydWN0b3IocGFyYW1zID0ge30sIHR5cGUpIHtcbiAgICB0aGlzLnBhcmFtcyA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgY29sb3I6IDB4ZWZkMWI1LFxuICAgICAgZGVuc2l0eTogMC4wMjAsXG4gICAgICBuZWFyOiAxMCxcbiAgICAgIGZhcjogMTAwMFxuICAgIH0sIHBhcmFtcyk7XG4gICAgaWYgKCF0eXBlIHx8IHR5cGUgPT09ICdleHAyJykgdGhpcy5mb2cgPSBuZXcgRm9nRXhwMih0aGlzLnBhcmFtcy5jb2xvciwgdGhpcy5wYXJhbXMuZGVuc2l0eSk7XG4gICAgZWxzZSBpZiAodHlwZSA9PT0gJ2xpbmVhcicpIHRoaXMuZm9nID0gbmV3IEZvZyh0aGlzLnBhcmFtcy5jb2xvciwgdGhpcy5wYXJhbXMubmVhciwgdGhpcy5wYXJhbXMuZmFyKTtcbiAgfVxuXG4gIG1hbmFnZXIobWFuYWdlcikge1xuICAgIG1hbmFnZXIuc2V0KCdmb2cnLCB0aGlzLmZvZyk7XG4gICAgbWFuYWdlci5nZXQoJ3NjZW5lJykuZm9nID0gdGhpcy5mb2c7XG4gIH1cbn1cbiIsImltcG9ydCB7Y3JlYXRlU3RvcmV9IGZyb20gJ3JlZHV4JztcblxuY29uc3QgaXNFcXVhbERlZmF1bHQgPSAoYSwgYikgPT4ge1xuICBpZiAoYSA9PT0gYikgcmV0dXJuIHRydWU7XG4gIGVsc2UgaWYgKGEgJiYgYS5lcXVhbHMgJiYgYS5lcXVhbHMoYikpIHJldHVybiB0cnVlO1xuXG4gIHJldHVybiBmYWxzZTtcbn07XG5cbi8qKlxuICogQGNsYXNzIFN0YXRlTW9kdWxlXG4gKiBAZGVzY3JpcHRpb24gYFN0YXRlTW9kdWxlYCBpcyB1c2VmdWwgZm9yIGFwcHMsIHdoZXJlIHlvdSBuZWVkIHN0YXRlIG1hbmlwdWxhdGlvbi5cbiAqIFRoaXMgY2FuIGJlOiBfdHJhbnNpdGlvbnMgYmV0d2VlbiBzY3JlZW5zLCBnYW1lcywgZGV2ZWxvcG1lbnQgbW9tZW50c18uXG4gKiBZb3UgY2FuIGNoZWNrIFtiYXNpYy9zdGF0ZV0oaHR0cHM6Ly93aHMtZGV2LnN1cmdlLnNoL2V4YW1wbGVzLz9iYXNpYy9zdGF0ZSkgZXhhbXBsZS5cbiAqIEBjYXRlZ29yeSBtb2R1bGVzL2FwcFxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXNdXG4gKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj4gQ3JlYXRpbmcgYSBzdGF0ZSBtb2R1bGU8L2NhcHRpb24+XG4gKiBuZXcgQXBwKFtcbiAqICAgLy8gLi4uXG4gKiAgIG5ldyBTdGF0ZU1vZHVsZSgpLmRlZmF1bHQoe1xuICogICAgIHNwaGVyZUNvbG9yOiAweGZmMDAwMFxuICogICB9KVxuICogXSk7XG4gKi9cbmV4cG9ydCBjbGFzcyBTdGF0ZU1vZHVsZSB7XG4gIHN0YXRpYyBhY3Rpb25HZW5lcmF0ZShpc0VxdWFsKSB7XG4gICAgcmV0dXJuIChzdGF0ZSA9IFt7fSwgJyddLCB7a2V5LCBkYXRhfSkgPT4ge1xuICAgICAgaWYgKGlzRXF1YWwoc3RhdGVbMF1ba2V5XSwgZGF0YSkpIHJldHVybiBzdGF0ZTtcblxuICAgICAgc3RhdGVbMF1ba2V5XSA9IGRhdGE7XG4gICAgICBzdGF0ZVsxXSA9IGtleTtcblxuICAgICAgcmV0dXJuIHN0YXRlO1xuICAgIH07XG4gIH1cblxuICBjb25zdHJ1Y3RvcihlcXVhbENoZWNrID0gaXNFcXVhbERlZmF1bHQpIHtcbiAgICB0aGlzLnN0b3JlID0gY3JlYXRlU3RvcmUoXG4gICAgICBTdGF0ZU1vZHVsZS5hY3Rpb25HZW5lcmF0ZShlcXVhbENoZWNrKVxuICAgICk7XG5cbiAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSB7fTtcbiAgICB0aGlzLmN1cnJlbnRDb25maWcgPSAnZGVmYXVsdCc7XG4gICAgdGhpcy5wcmV2Q29uZmlnID0gJ2RlZmF1bHQnO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgZGVmYXVsdFxuICAgKiBAZGVzY3JpcHRpb24gQWRkIGRlZmF1bHQgY29uZmlndXJhdGlvbi5cbiAgICogQHBhcmFtIHtPYmplY3R9IGRhdGEgQ29uZmlndXJhdGlvbiBzZXR1cFxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwLlN0YXRlTW9kdWxlXG4gICAqIEBleGFtcGxlXG4gICAqIG5ldyBXSFMuU3RhdGVNb2R1bGUoKS5kZWZhdWx0KHtcbiAgICogICBzcGhlcmVDb2xvcjogVVRJTFMuJGNvbG9ycy5tZXNoLFxuICAgKiAgIHBsYW5lQ29sb3I6IDB4NDQ3RjhCXG4gICAqIH0pXG4gICAqL1xuICBkZWZhdWx0KGRhdGEpIHtcbiAgICB0aGlzLmNvbmZpZyh7ZGVmYXVsdDogZGF0YX0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2Qgc2V0RXF1YWxDaGVja1xuICAgKiBAZGVzY3JpcHRpb24gU2V0cyBhbiBlcXVhbENoZWNrIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgZnVuY3Rpb24gdG8gZ2VuZXJhdGUgZXF1YWwgY2hlY2tcbiAgICogQG1lbWJlcm9mIG1vZHVsZTptb2R1bGVzL2FwcC5TdGF0ZU1vZHVsZVxuICAgKi9cbiAgc2V0RXF1YWxDaGVjayhmdW5jKSB7XG4gICAgdGhpcy5zdG9yZS5yZXBsYWNlUmVkdWNlcihcbiAgICAgIFN0YXRlTW9kdWxlLmFjdGlvbkdlbmVyYXRlKGZ1bmMpXG4gICAgKTtcbiAgfVxuXG4gIG1hbmFnZXIobWFuYWdlcikge1xuICAgIG1hbmFnZXIuZGVmaW5lKCdzdGF0ZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgY29uZmlnXG4gICAqIEBkZXNjcmlwdGlvbiBMb2FkIGNvbmZpZ3VyYXRpb25zIGZyb20gb2JqZWN0LlxuICAgKiBAcGFyYW0ge09iamVjdH0gY29uZmlncyBDb25maWd1cmF0aW9uIGRhdGFcbiAgICogQG1lbWJlcm9mIG1vZHVsZTptb2R1bGVzL2FwcC5TdGF0ZU1vZHVsZVxuICAgKiBAZXhhbXBsZSA8Y2FwdGlvbj4gQWRkaW5nIGBncmVlbmAgY29uZmlndXJhdGlvbjwvY2FwdGlvbj5cbiAgICogc3RhdGUuY29uZmlnKHtcbiAgICogICBncmVlbjoge1xuICAgKiAgICAgc3BoZXJlQ29sb3I6IDB4MDBmZjAwLFxuICAgKiAgICAgcGxhbmVDb2xvcjogMHgwMGZmMDBcbiAgICogICB9XG4gICAqIH0pO1xuICAgKi9cbiAgY29uZmlnKGNvbmZpZ3MpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBjb25maWdzKSB7XG4gICAgICBpZiAoa2V5KSB7XG4gICAgICAgIHRoaXMuY29uZmlndXJhdGlvbltrZXldID0ga2V5ID09PSAnZGVmYXVsdCdcbiAgICAgICAgICA/IGNvbmZpZ3Nba2V5XVxuICAgICAgICAgIDogT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHQsIGNvbmZpZ3Nba2V5XSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgdXBkYXRlXG4gICAqIEBkZXNjcmlwdGlvbiBMb2FkIHVwZGF0ZXMgZnJvbSBvYmplY3QuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSB1cGRhdGVzIFVwZGF0ZXMgZGF0YVxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwLlN0YXRlTW9kdWxlXG4gICAqIEBleGFtcGxlIDxjYXB0aW9uPiBVcGRhdGUgY2FsbGJhY2sgZm9yIGBzcGhlcmVDb2xvcmA8L2NhcHRpb24+XG4gICAqIHN0YXRlLnVwZGF0ZSh7XG4gICAqICAgc3BoZXJlQ29sb3I6IGNvbG9yID0+IHNwaGVyZS5tYXRlcmlhbC5jb2xvci5zZXRIZXgoY29sb3IpXG4gICAqIH0pO1xuICAgKi9cbiAgdXBkYXRlKHVwZGF0ZXMgPSB7fSkge1xuICAgIHRoaXMuc3RvcmUuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIGNvbnN0IFtkYXRhLCBjaGFuZ2VkS2V5XSA9IHRoaXMuc3RvcmUuZ2V0U3RhdGUoKTtcbiAgICAgIGNvbnN0IGNhbGxiYWNrID0gdXBkYXRlc1tjaGFuZ2VkS2V5XTtcblxuICAgICAgaWYgKGNhbGxiYWNrKSBjYWxsYmFjayhkYXRhW2NoYW5nZWRLZXldKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIHRvXG4gICAqIEBkZXNjcmlwdGlvbiBTd2l0Y2ggdG8gY29uZmlndXJhdGlvbi5cbiAgICogQHBhcmFtIHtTdHJpbmd9IGNvbmZpZ05hbWUgQ29uZmlndXJhdGlvbiBuYW1lLlxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwLlN0YXRlTW9kdWxlXG4gICAqIEBleGFtcGxlIDxjYXB0aW9uPiBDaGFuZ2VzIGNvbmZpZ3VyYXRpb24gdG8gYGdyZWVuYDwvY2FwdGlvbj5cbiAgICogc3RhdGUudG8oJ2dyZWVuJyk7XG4gICAqL1xuICB0byhjb25maWdOYW1lKSB7XG4gICAgdGhpcy5wcmV2Q29uZmlnID0gdGhpcy5jdXJyZW50Q29uZmlnO1xuICAgIHRoaXMuY3VycmVudENvbmZpZyA9IGNvbmZpZ05hbWU7XG5cbiAgICBjb25zdCBjb25maWcgPSB0aGlzLmNvbmZpZ3VyYXRpb25bY29uZmlnTmFtZV1cbiAgICAgID8gdGhpcy5jb25maWd1cmF0aW9uW2NvbmZpZ05hbWVdXG4gICAgICA6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0O1xuXG4gICAgdGhpcy5zZXQoY29uZmlnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIHNldFxuICAgKiBAZGVzY3JpcHRpb24gU2V0IGN1cnJlbnQgcGFyYW1ldGVycy5cbiAgICogQHBhcmFtIHtPYmplY3R9IGRhdGEgQ29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzLlxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwLlN0YXRlTW9kdWxlXG4gICAqIEBleGFtcGxlXG4gICAqIHN0YXRlLnNldCh7XG4gICAqICAgc3BoZXJlQ29sb3I6IDB4MDBmZjAwXG4gICAqIH0pO1xuICAgKi9cbiAgc2V0KGRhdGEpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBkYXRhKVxuICAgICAgaWYgKGtleSkgdGhpcy5zdG9yZS5kaXNwYXRjaCh7dHlwZTogJ0FERCcsIGtleSwgZGF0YTogZGF0YVtrZXldfSk7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBnZXRcbiAgICogQGRlc2NyaXB0aW9uIFJldHVybiBkYXRhIG9mIHBhcmFtZXRlci5cbiAgICogQHBhcmFtIHtTdHJpbmd9IGtleSBQYXJhbWV0ZXIgbmFtZS5cbiAgICogQG1lbWJlcm9mIG1vZHVsZTptb2R1bGVzL2FwcC5TdGF0ZU1vZHVsZVxuICAgKiBAZXhhbXBsZVxuICAgKiBzdGF0ZS5nZXQoJ3NwaGVyZUNvbG9yJyk7IC8vIDB4MDBmZjAwXG4gICAqL1xuICBnZXQoa2V5KSB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0U3RhdGUoKVswXVtrZXldO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgcHJldlxuICAgKiBAZGVzY3JpcHRpb24gUmV0dXJuIGB0cnVlVmFsYCBpZiBgY29uZmlnYCBtYXRjaCBwcmV2aW91cyBjb25maWd1cmF0aW9uLCBpbiBvdGhlciBjYXNlIC0gcmV0dXJuIGBmYWxzZVZhbGAuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBjb25maWcgQ29uZmlndXJhdGlvbiBuYW1lLlxuICAgKiBAcGFyYW0ge0FueX0gdHJ1ZVZhbCBWYWx1ZSByZXR1cm5lZCBpZiBjb25kaXRpb24gaXMgdHJ1dGh5LlxuICAgKiBAcGFyYW0ge0FueX0gZmFsc2VWYWwgVmFsdWUgcmV0dXJuZWQgaWYgY29uZGl0aW9uIGlzIGZhbHN5LlxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwLlN0YXRlTW9kdWxlXG4gICAqL1xuICBwcmV2KGNvbmZpZywgdHJ1ZVZhbCwgZmFsc2VWYWwpIHtcbiAgICByZXR1cm4gdGhpcy5wcmV2Q29uZmlnID09PSBjb25maWcgPyB0cnVlVmFsIDogZmFsc2VWYWw7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBjdXJyZW50XG4gICAqIEBkZXNjcmlwdGlvbiBSZXR1cm4gYHRydWVWYWxgIGlmIGBjb25maWdgIG1hdGNoIGN1cnJlbnQgY29uZmlndXJhdGlvbiwgaW4gb3RoZXIgY2FzZSAtIHJldHVybiBgZmFsc2VWYWxgLlxuICAgKiBAcGFyYW0ge1N0cmluZ30gY29uZmlnIENvbmZpZ3VyYXRpb24gbmFtZS5cbiAgICogQHBhcmFtIHtBbnl9IHRydWVWYWwgVmFsdWUgcmV0dXJuZWQgaWYgY29uZGl0aW9uIGlzIHRydXRoeS5cbiAgICogQHBhcmFtIHtBbnl9IGZhbHNlVmFsIFZhbHVlIHJldHVybmVkIGlmIGNvbmRpdGlvbiBpcyBmYWxzeS5cbiAgICogQG1lbWJlcm9mIG1vZHVsZTptb2R1bGVzL2FwcC5TdGF0ZU1vZHVsZVxuICAgKi9cbiAgY3VycmVudChjb25maWcsIHRydWVWYWwsIGZhbHNlVmFsKSB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudENvbmZpZyA9PT0gY29uZmlnID8gdHJ1ZVZhbCA6IGZhbHNlVmFsO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBNT1VTRSxcbiAgUXVhdGVybmlvbixcbiAgU3BoZXJpY2FsLFxuICBWZWN0b3IyLFxuICBQZXJzcGVjdGl2ZUNhbWVyYSxcbiAgT3J0aG9ncmFwaGljQ2FtZXJhLFxuICBFdmVudERpc3BhdGNoZXIsXG4gIFZlY3RvcjNcbn0gZnJvbSAndGhyZWUnO1xuXG4vLyBUaGlzIHNldCBvZiBjb250cm9scyBwZXJmb3JtcyBvcmJpdGluZywgZG9sbHlpbmcgKHpvb21pbmcpLCBhbmQgcGFubmluZy5cbi8vIFVubGlrZSBUcmFja2JhbGxDb250cm9scywgaXQgbWFpbnRhaW5zIHRoZSBcInVwXCIgZGlyZWN0aW9uIG9iamVjdC51cCAoK1kgYnkgZGVmYXVsdCkuXG4vL1xuLy8gICAgT3JiaXQgLSBsZWZ0IG1vdXNlIC8gdG91Y2g6IG9uZSBmaW5nZXIgbW92ZVxuLy8gICAgWm9vbSAtIG1pZGRsZSBtb3VzZSwgb3IgbW91c2V3aGVlbCAvIHRvdWNoOiB0d28gZmluZ2VyIHNwcmVhZCBvciBzcXVpc2hcbi8vICAgIFBhbiAtIHJpZ2h0IG1vdXNlLCBvciBhcnJvdyBrZXlzIC8gdG91Y2g6IHRocmVlIGZpbnRlciBzd2lwZVxuXG5leHBvcnQgY2xhc3MgVGhyZWVPcmJpdENvbnRyb2xzIGV4dGVuZHMgRXZlbnREaXNwYXRjaGVyIHtcbiAgY29uc3RydWN0b3Iob2JqZWN0LCBkb21FbGVtZW50LCBldmVudEhhbmRsZXIpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5vYmplY3QgPSBvYmplY3Q7XG5cbiAgICB0aGlzLmRvbUVsZW1lbnQgPSAoZG9tRWxlbWVudCA9PT0gdW5kZWZpbmVkKSA/IGRvY3VtZW50IDogZG9tRWxlbWVudDtcbiAgICB0aGlzLmV2ZW50SGFuZGxlciA9IGV2ZW50SGFuZGxlcjtcblxuICAgIC8vIFNldCB0byBmYWxzZSB0byBkaXNhYmxlIHRoaXMgY29udHJvbFxuICAgIHRoaXMuZW5hYmxlZCA9IHRydWU7XG5cbiAgICAvLyBcInRhcmdldFwiIHNldHMgdGhlIGxvY2F0aW9uIG9mIGZvY3VzLCB3aGVyZSB0aGUgb2JqZWN0IG9yYml0cyBhcm91bmRcbiAgICB0aGlzLnRhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cbiAgICAvLyBIb3cgZmFyIHlvdSBjYW4gZG9sbHkgaW4gYW5kIG91dCAoIFBlcnNwZWN0aXZlQ2FtZXJhIG9ubHkgKVxuICAgIHRoaXMubWluRGlzdGFuY2UgPSAwO1xuICAgIHRoaXMubWF4RGlzdGFuY2UgPSBJbmZpbml0eTtcblxuICAgIC8vIEhvdyBmYXIgeW91IGNhbiB6b29tIGluIGFuZCBvdXQgKCBPcnRob2dyYXBoaWNDYW1lcmEgb25seSApXG4gICAgdGhpcy5taW5ab29tID0gMDtcbiAgICB0aGlzLm1heFpvb20gPSBJbmZpbml0eTtcblxuICAgIC8vIEhvdyBmYXIgeW91IGNhbiBvcmJpdCB2ZXJ0aWNhbGx5LCB1cHBlciBhbmQgbG93ZXIgbGltaXRzLlxuICAgIC8vIFJhbmdlIGlzIDAgdG8gTWF0aC5QSSByYWRpYW5zLlxuICAgIHRoaXMubWluUG9sYXJBbmdsZSA9IDA7IC8vIHJhZGlhbnNcbiAgICB0aGlzLm1heFBvbGFyQW5nbGUgPSBNYXRoLlBJOyAvLyByYWRpYW5zXG5cbiAgICAvLyBIb3cgZmFyIHlvdSBjYW4gb3JiaXQgaG9yaXpvbnRhbGx5LCB1cHBlciBhbmQgbG93ZXIgbGltaXRzLlxuICAgIC8vIElmIHNldCwgbXVzdCBiZSBhIHN1Yi1pbnRlcnZhbCBvZiB0aGUgaW50ZXJ2YWwgWyAtIE1hdGguUEksIE1hdGguUEkgXS5cbiAgICB0aGlzLm1pbkF6aW11dGhBbmdsZSA9IC1JbmZpbml0eTsgLy8gcmFkaWFuc1xuICAgIHRoaXMubWF4QXppbXV0aEFuZ2xlID0gSW5maW5pdHk7IC8vIHJhZGlhbnNcblxuICAgIC8vIFNldCB0byB0cnVlIHRvIGVuYWJsZSBkYW1waW5nIChpbmVydGlhKVxuICAgIC8vIElmIGRhbXBpbmcgaXMgZW5hYmxlZCwgeW91IG11c3QgY2FsbCBjb250cm9scy51cGRhdGUoKSBpbiB5b3VyIGFuaW1hdGlvbiBsb29wXG4gICAgdGhpcy5lbmFibGVEYW1waW5nID0gZmFsc2U7XG4gICAgdGhpcy5kYW1waW5nRmFjdG9yID0gMC4yNTtcblxuICAgIC8vIFRoaXMgb3B0aW9uIGFjdHVhbGx5IGVuYWJsZXMgZG9sbHlpbmcgaW4gYW5kIG91dDsgbGVmdCBhcyBcInpvb21cIiBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuXG4gICAgLy8gU2V0IHRvIGZhbHNlIHRvIGRpc2FibGUgem9vbWluZ1xuICAgIHRoaXMuZW5hYmxlWm9vbSA9IHRydWU7XG4gICAgdGhpcy56b29tU3BlZWQgPSAxLjA7XG5cbiAgICAvLyBTZXQgdG8gZmFsc2UgdG8gZGlzYWJsZSByb3RhdGluZ1xuICAgIHRoaXMuZW5hYmxlUm90YXRlID0gdHJ1ZTtcbiAgICB0aGlzLnJvdGF0ZVNwZWVkID0gMS4wO1xuXG4gICAgLy8gU2V0IHRvIGZhbHNlIHRvIGRpc2FibGUgcGFubmluZ1xuICAgIHRoaXMuZW5hYmxlUGFuID0gdHJ1ZTtcbiAgICB0aGlzLmtleVBhblNwZWVkID0gNy4wOyAvLyBwaXhlbHMgbW92ZWQgcGVyIGFycm93IGtleSBwdXNoXG5cbiAgICAvLyBTZXQgdG8gdHJ1ZSB0byBhdXRvbWF0aWNhbGx5IHJvdGF0ZSBhcm91bmQgdGhlIHRhcmdldFxuICAgIC8vIElmIGF1dG8tcm90YXRlIGlzIGVuYWJsZWQsIHlvdSBtdXN0IGNhbGwgY29udHJvbHMudXBkYXRlKCkgaW4geW91ciBhbmltYXRpb24gbG9vcFxuICAgIHRoaXMuYXV0b1JvdGF0ZSA9IGZhbHNlO1xuICAgIHRoaXMuYXV0b1JvdGF0ZVNwZWVkID0gMi4wOyAvLyAzMCBzZWNvbmRzIHBlciByb3VuZCB3aGVuIGZwcyBpcyA2MFxuXG4gICAgLy8gU2V0IHRvIGZhbHNlIHRvIGRpc2FibGUgdXNlIG9mIHRoZSBrZXlzXG4gICAgdGhpcy5lbmFibGVLZXlzID0gdHJ1ZTtcblxuICAgIC8vIFRoZSBmb3VyIGFycm93IGtleXNcbiAgICB0aGlzLmtleXMgPSB7TEVGVDogMzcsIFVQOiAzOCwgUklHSFQ6IDM5LCBCT1RUT006IDQwfTtcblxuICAgIC8vIE1vdXNlIGJ1dHRvbnNcbiAgICB0aGlzLm1vdXNlQnV0dG9ucyA9IHtPUkJJVDogTU9VU0UuTEVGVCwgWk9PTTogTU9VU0UuTUlERExFLCBQQU46IE1PVVNFLlJJR0hUfTtcblxuICAgIC8vIGZvciByZXNldFxuICAgIHRoaXMudGFyZ2V0MCA9IHRoaXMudGFyZ2V0LmNsb25lKCk7XG4gICAgdGhpcy5wb3NpdGlvbjAgPSB0aGlzLm9iamVjdC5wb3NpdGlvbi5jbG9uZSgpO1xuICAgIHRoaXMuem9vbTAgPSB0aGlzLm9iamVjdC56b29tO1xuXG4gICAgLy9cbiAgICAvLyBwdWJsaWMgbWV0aG9kc1xuICAgIC8vXG5cbiAgICB0aGlzLmdldFBvbGFyQW5nbGUgPSAoKSA9PiB7XG4gICAgICByZXR1cm4gc3BoZXJpY2FsLnBoaTtcbiAgICB9O1xuXG4gICAgdGhpcy5nZXRBemltdXRoYWxBbmdsZSA9ICgpID0+IHtcbiAgICAgIHJldHVybiBzcGhlcmljYWwudGhldGE7XG4gICAgfTtcblxuICAgIHRoaXMucmVzZXQgPSAoKSA9PiB7XG4gICAgICB0aGlzLnRhcmdldC5jb3B5KHRoaXMudGFyZ2V0MCk7XG4gICAgICB0aGlzLm9iamVjdC5wb3NpdGlvbi5jb3B5KHRoaXMucG9zaXRpb24wKTtcbiAgICAgIHRoaXMub2JqZWN0Lnpvb20gPSB0aGlzLnpvb20wO1xuXG4gICAgICB0aGlzLm9iamVjdC51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoY2hhbmdlRXZlbnQpO1xuXG4gICAgICB0aGlzLnVwZGF0ZSgpO1xuXG4gICAgICBzdGF0ZSA9IFNUQVRFLk5PTkU7XG4gICAgfTtcblxuICAgIC8vIHRoaXMgbWV0aG9kIGlzIGV4cG9zZWQsIGJ1dCBwZXJoYXBzIGl0IHdvdWxkIGJlIGJldHRlciBpZiB3ZSBjYW4gbWFrZSBpdCBwcml2YXRlLi4uXG4gICAgdGhpcy51cGRhdGUgPSAoKSA9PiB7XG4gICAgICBjb25zdCBvZmZzZXQgPSBuZXcgVmVjdG9yMygpO1xuXG4gICAgICAvLyBzbyBjYW1lcmEudXAgaXMgdGhlIG9yYml0IGF4aXNcbiAgICAgIGNvbnN0IHF1YXQgPSBuZXcgUXVhdGVybmlvbigpLnNldEZyb21Vbml0VmVjdG9ycyhvYmplY3QudXAsIG5ldyBWZWN0b3IzKDAsIDEsIDApKTtcbiAgICAgIGNvbnN0IHF1YXRJbnZlcnNlID0gcXVhdC5jbG9uZSgpLmludmVyc2UoKTtcblxuICAgICAgY29uc3QgbGFzdFBvc2l0aW9uID0gbmV3IFZlY3RvcjMoKTtcbiAgICAgIGNvbnN0IGxhc3RRdWF0ZXJuaW9uID0gbmV3IFF1YXRlcm5pb24oKTtcblxuICAgICAgcmV0dXJuICgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBvc2l0aW9uID0gdGhpcy5vYmplY3QucG9zaXRpb247XG5cbiAgICAgICAgb2Zmc2V0LmNvcHkocG9zaXRpb24pLnN1Yih0aGlzLnRhcmdldCk7XG5cbiAgICAgICAgLy8gcm90YXRlIG9mZnNldCB0byBcInktYXhpcy1pcy11cFwiIHNwYWNlXG4gICAgICAgIG9mZnNldC5hcHBseVF1YXRlcm5pb24ocXVhdCk7XG5cbiAgICAgICAgLy8gYW5nbGUgZnJvbSB6LWF4aXMgYXJvdW5kIHktYXhpc1xuICAgICAgICBzcGhlcmljYWwuc2V0RnJvbVZlY3RvcjMob2Zmc2V0KTtcblxuICAgICAgICBpZiAodGhpcy5hdXRvUm90YXRlICYmIHN0YXRlID09PSBTVEFURS5OT05FKVxuICAgICAgICAgIHJvdGF0ZUxlZnQoZ2V0QXV0b1JvdGF0aW9uQW5nbGUoKSk7XG5cbiAgICAgICAgc3BoZXJpY2FsLnRoZXRhICs9IHNwaGVyaWNhbERlbHRhLnRoZXRhO1xuICAgICAgICBzcGhlcmljYWwucGhpICs9IHNwaGVyaWNhbERlbHRhLnBoaTtcblxuICAgICAgICAvLyByZXN0cmljdCB0aGV0YSB0byBiZSBiZXR3ZWVuIGRlc2lyZWQgbGltaXRzXG4gICAgICAgIHNwaGVyaWNhbC50aGV0YSA9IE1hdGgubWF4KHRoaXMubWluQXppbXV0aEFuZ2xlLCBNYXRoLm1pbih0aGlzLm1heEF6aW11dGhBbmdsZSwgc3BoZXJpY2FsLnRoZXRhKSk7XG5cbiAgICAgICAgLy8gcmVzdHJpY3QgcGhpIHRvIGJlIGJldHdlZW4gZGVzaXJlZCBsaW1pdHNcbiAgICAgICAgc3BoZXJpY2FsLnBoaSA9IE1hdGgubWF4KHRoaXMubWluUG9sYXJBbmdsZSwgTWF0aC5taW4odGhpcy5tYXhQb2xhckFuZ2xlLCBzcGhlcmljYWwucGhpKSk7XG5cbiAgICAgICAgc3BoZXJpY2FsLm1ha2VTYWZlKCk7XG5cbiAgICAgICAgc3BoZXJpY2FsLnJhZGl1cyAqPSBzY2FsZTtcblxuICAgICAgICAvLyByZXN0cmljdCByYWRpdXMgdG8gYmUgYmV0d2VlbiBkZXNpcmVkIGxpbWl0c1xuICAgICAgICBzcGhlcmljYWwucmFkaXVzID0gTWF0aC5tYXgodGhpcy5taW5EaXN0YW5jZSwgTWF0aC5taW4odGhpcy5tYXhEaXN0YW5jZSwgc3BoZXJpY2FsLnJhZGl1cykpO1xuXG4gICAgICAgIC8vIG1vdmUgdGFyZ2V0IHRvIHBhbm5lZCBsb2NhdGlvblxuICAgICAgICB0aGlzLnRhcmdldC5hZGQocGFuT2Zmc2V0KTtcblxuICAgICAgICBvZmZzZXQuc2V0RnJvbVNwaGVyaWNhbChzcGhlcmljYWwpO1xuXG4gICAgICAgIC8vIHJvdGF0ZSBvZmZzZXQgYmFjayB0byBcImNhbWVyYS11cC12ZWN0b3ItaXMtdXBcIiBzcGFjZVxuICAgICAgICBvZmZzZXQuYXBwbHlRdWF0ZXJuaW9uKHF1YXRJbnZlcnNlKTtcblxuICAgICAgICBwb3NpdGlvbi5jb3B5KHRoaXMudGFyZ2V0KS5hZGQob2Zmc2V0KTtcblxuICAgICAgICB0aGlzLm9iamVjdC5sb29rQXQodGhpcy50YXJnZXQpO1xuXG4gICAgICAgIGlmICh0aGlzLmVuYWJsZURhbXBpbmcgPT09IHRydWUpIHtcbiAgICAgICAgICBzcGhlcmljYWxEZWx0YS50aGV0YSAqPSAoMSAtIHRoaXMuZGFtcGluZ0ZhY3Rvcik7XG4gICAgICAgICAgc3BoZXJpY2FsRGVsdGEucGhpICo9ICgxIC0gdGhpcy5kYW1waW5nRmFjdG9yKTtcbiAgICAgICAgfSBlbHNlXG4gICAgICAgICAgc3BoZXJpY2FsRGVsdGEuc2V0KDAsIDAsIDApO1xuXG4gICAgICAgIHNjYWxlID0gMTtcbiAgICAgICAgcGFuT2Zmc2V0LnNldCgwLCAwLCAwKTtcblxuICAgICAgICAvLyB1cGRhdGUgY29uZGl0aW9uIGlzOlxuICAgICAgICAvLyBtaW4oY2FtZXJhIGRpc3BsYWNlbWVudCwgY2FtZXJhIHJvdGF0aW9uIGluIHJhZGlhbnMpXjIgPiBFUFNcbiAgICAgICAgLy8gdXNpbmcgc21hbGwtYW5nbGUgYXBwcm94aW1hdGlvbiBjb3MoeC8yKSA9IDEgLSB4XjIgLyA4XG5cbiAgICAgICAgaWYgKHpvb21DaGFuZ2VkXG4gICAgICAgICAgfHwgbGFzdFBvc2l0aW9uLmRpc3RhbmNlVG9TcXVhcmVkKHRoaXMub2JqZWN0LnBvc2l0aW9uKSA+IEVQU1xuICAgICAgICAgIHx8IDggKiAoMSAtIGxhc3RRdWF0ZXJuaW9uLmRvdCh0aGlzLm9iamVjdC5xdWF0ZXJuaW9uKSkgPiBFUFMpIHtcbiAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoY2hhbmdlRXZlbnQpO1xuXG4gICAgICAgICAgbGFzdFBvc2l0aW9uLmNvcHkodGhpcy5vYmplY3QucG9zaXRpb24pO1xuICAgICAgICAgIGxhc3RRdWF0ZXJuaW9uLmNvcHkodGhpcy5vYmplY3QucXVhdGVybmlvbik7XG4gICAgICAgICAgem9vbUNoYW5nZWQgPSBmYWxzZTtcblxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSkoKTtcbiAgICB9O1xuXG4gICAgdGhpcy5kaXNwb3NlID0gKCkgPT4ge1xuICAgICAgdGhpcy5kb21FbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51Jywgb25Db250ZXh0TWVudSwgZmFsc2UpO1xuICAgICAgdGhpcy5kb21FbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIG9uTW91c2VEb3duLCBmYWxzZSk7XG4gICAgICB0aGlzLmRvbUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignd2hlZWwnLCBvbk1vdXNlV2hlZWwsIGZhbHNlKTtcblxuICAgICAgdGhpcy5kb21FbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCBvblRvdWNoU3RhcnQsIGZhbHNlKTtcbiAgICAgIHRoaXMuZG9tRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIG9uVG91Y2hFbmQsIGZhbHNlKTtcbiAgICAgIHRoaXMuZG9tRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCBvblRvdWNoTW92ZSwgZmFsc2UpO1xuXG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBvbk1vdXNlTW92ZSwgZmFsc2UpO1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIG9uTW91c2VVcCwgZmFsc2UpO1xuXG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIG9uS2V5RG93biwgZmFsc2UpO1xuXG4gICAgICAvLyB0aGlzLmRpc3BhdGNoRXZlbnQoIHsgdHlwZTogJ2Rpc3Bvc2UnIH0gKTsgLy8gc2hvdWxkIHRoaXMgYmUgYWRkZWQgaGVyZT9cbiAgICB9O1xuXG4gICAgLy9cbiAgICAvLyBpbnRlcm5hbHNcbiAgICAvL1xuXG4gICAgY29uc3QgY2hhbmdlRXZlbnQgPSB7dHlwZTogJ2NoYW5nZSd9O1xuICAgIGNvbnN0IHN0YXJ0RXZlbnQgPSB7dHlwZTogJ3N0YXJ0J307XG4gICAgY29uc3QgZW5kRXZlbnQgPSB7dHlwZTogJ2VuZCd9O1xuXG4gICAgY29uc3QgU1RBVEUgPSB7Tk9ORTogLTEsIFJPVEFURTogMCwgRE9MTFk6IDEsIFBBTjogMiwgVE9VQ0hfUk9UQVRFOiAzLCBUT1VDSF9ET0xMWTogNCwgVE9VQ0hfUEFOOiA1fTtcblxuICAgIGxldCBzdGF0ZSA9IFNUQVRFLk5PTkU7XG5cbiAgICBjb25zdCBFUFMgPSAwLjAwMDAwMTtcblxuICAgIC8vIGN1cnJlbnQgcG9zaXRpb24gaW4gc3BoZXJpY2FsIGNvb3JkaW5hdGVzXG4gICAgY29uc3Qgc3BoZXJpY2FsID0gbmV3IFNwaGVyaWNhbCgpO1xuICAgIGNvbnN0IHNwaGVyaWNhbERlbHRhID0gbmV3IFNwaGVyaWNhbCgpO1xuXG4gICAgbGV0IHNjYWxlID0gMTtcbiAgICBjb25zdCBwYW5PZmZzZXQgPSBuZXcgVmVjdG9yMygpO1xuICAgIGxldCB6b29tQ2hhbmdlZCA9IGZhbHNlO1xuXG4gICAgY29uc3Qgcm90YXRlU3RhcnQgPSBuZXcgVmVjdG9yMigpO1xuICAgIGNvbnN0IHJvdGF0ZUVuZCA9IG5ldyBWZWN0b3IyKCk7XG4gICAgY29uc3Qgcm90YXRlRGVsdGEgPSBuZXcgVmVjdG9yMigpO1xuXG4gICAgY29uc3QgcGFuU3RhcnQgPSBuZXcgVmVjdG9yMigpO1xuICAgIGNvbnN0IHBhbkVuZCA9IG5ldyBWZWN0b3IyKCk7XG4gICAgY29uc3QgcGFuRGVsdGEgPSBuZXcgVmVjdG9yMigpO1xuXG4gICAgY29uc3QgZG9sbHlTdGFydCA9IG5ldyBWZWN0b3IyKCk7XG4gICAgY29uc3QgZG9sbHlFbmQgPSBuZXcgVmVjdG9yMigpO1xuICAgIGNvbnN0IGRvbGx5RGVsdGEgPSBuZXcgVmVjdG9yMigpO1xuXG4gICAgY29uc3QgZ2V0QXV0b1JvdGF0aW9uQW5nbGUgPSAoKSA9PiB7XG4gICAgICByZXR1cm4gMiAqIE1hdGguUEkgLyA2MCAvIDYwICogdGhpcy5hdXRvUm90YXRlU3BlZWQ7XG4gICAgfTtcblxuICAgIGNvbnN0IGdldFpvb21TY2FsZSA9ICgpID0+IHtcbiAgICAgIHJldHVybiBNYXRoLnBvdygwLjk1LCB0aGlzLnpvb21TcGVlZCk7XG4gICAgfTtcblxuICAgIGNvbnN0IHJvdGF0ZUxlZnQgPSBhbmdsZSA9PiB7XG4gICAgICBzcGhlcmljYWxEZWx0YS50aGV0YSAtPSBhbmdsZTtcbiAgICB9O1xuXG4gICAgY29uc3Qgcm90YXRlVXAgPSBhbmdsZSA9PiB7XG4gICAgICBzcGhlcmljYWxEZWx0YS5waGkgLT0gYW5nbGU7XG4gICAgfTtcblxuICAgIGNvbnN0IHBhbkxlZnQgPSAoKCkgPT4ge1xuICAgICAgY29uc3QgdiA9IG5ldyBWZWN0b3IzKCk7XG5cbiAgICAgIHJldHVybiAoZGlzdGFuY2UsIG9iamVjdE1hdHJpeCkgPT4ge1xuICAgICAgICB2LnNldEZyb21NYXRyaXhDb2x1bW4ob2JqZWN0TWF0cml4LCAwKTsgLy8gZ2V0IFggY29sdW1uIG9mIG9iamVjdE1hdHJpeFxuICAgICAgICB2Lm11bHRpcGx5U2NhbGFyKC1kaXN0YW5jZSk7XG4gICAgICAgIHBhbk9mZnNldC5hZGQodik7XG4gICAgICB9O1xuICAgIH0pKCk7XG5cbiAgICBjb25zdCBwYW5VcCA9ICgoKSA9PiB7XG4gICAgICBjb25zdCB2ID0gbmV3IFZlY3RvcjMoKTtcblxuICAgICAgcmV0dXJuIChkaXN0YW5jZSwgb2JqZWN0TWF0cml4KSA9PiB7XG4gICAgICAgIHYuc2V0RnJvbU1hdHJpeENvbHVtbihvYmplY3RNYXRyaXgsIDEpOyAvLyBnZXQgWSBjb2x1bW4gb2Ygb2JqZWN0TWF0cml4XG4gICAgICAgIHYubXVsdGlwbHlTY2FsYXIoZGlzdGFuY2UpO1xuICAgICAgICBwYW5PZmZzZXQuYWRkKHYpO1xuICAgICAgfTtcbiAgICB9KSgpO1xuXG4gICAgLy8gZGVsdGFYIGFuZCBkZWx0YVkgYXJlIGluIHBpeGVsczsgcmlnaHQgYW5kIGRvd24gYXJlIHBvc2l0aXZlXG4gICAgY29uc3QgcGFuID0gKCgpID0+IHtcbiAgICAgIGNvbnN0IG9mZnNldCA9IG5ldyBWZWN0b3IzKCk7XG5cbiAgICAgIHJldHVybiAoZGVsdGFYLCBkZWx0YVkpID0+IHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZG9tRWxlbWVudCA9PT0gZG9jdW1lbnQgPyB0aGlzLmRvbUVsZW1lbnQuYm9keSA6IHRoaXMuZG9tRWxlbWVudDtcblxuICAgICAgICBpZiAodGhpcy5vYmplY3QgaW5zdGFuY2VvZiBQZXJzcGVjdGl2ZUNhbWVyYSkge1xuICAgICAgICAgIC8vIHBlcnNwZWN0aXZlXG4gICAgICAgICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLm9iamVjdC5wb3NpdGlvbjtcbiAgICAgICAgICBvZmZzZXQuY29weShwb3NpdGlvbikuc3ViKHRoaXMudGFyZ2V0KTtcbiAgICAgICAgICBsZXQgdGFyZ2V0RGlzdGFuY2UgPSBvZmZzZXQubGVuZ3RoKCk7XG5cbiAgICAgICAgICAvLyBoYWxmIG9mIHRoZSBmb3YgaXMgY2VudGVyIHRvIHRvcCBvZiBzY3JlZW5cbiAgICAgICAgICB0YXJnZXREaXN0YW5jZSAqPSBNYXRoLnRhbigodGhpcy5vYmplY3QuZm92IC8gMikgKiBNYXRoLlBJIC8gMTgwLjApO1xuXG4gICAgICAgICAgLy8gd2UgYWN0dWFsbHkgZG9uJ3QgdXNlIHNjcmVlbldpZHRoLCBzaW5jZSBwZXJzcGVjdGl2ZSBjYW1lcmEgaXMgZml4ZWQgdG8gc2NyZWVuIGhlaWdodFxuICAgICAgICAgIHBhbkxlZnQoMiAqIGRlbHRhWCAqIHRhcmdldERpc3RhbmNlIC8gZWxlbWVudC5jbGllbnRIZWlnaHQsIHRoaXMub2JqZWN0Lm1hdHJpeCk7XG4gICAgICAgICAgcGFuVXAoMiAqIGRlbHRhWSAqIHRhcmdldERpc3RhbmNlIC8gZWxlbWVudC5jbGllbnRIZWlnaHQsIHRoaXMub2JqZWN0Lm1hdHJpeCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5vYmplY3QgaW5zdGFuY2VvZiBPcnRob2dyYXBoaWNDYW1lcmEpIHtcbiAgICAgICAgICAvLyBvcnRob2dyYXBoaWNcbiAgICAgICAgICBwYW5MZWZ0KGRlbHRhWCAqICh0aGlzLm9iamVjdC5yaWdodCAtIHRoaXMub2JqZWN0LmxlZnQpIC8gdGhpcy5vYmplY3Quem9vbSAvIGVsZW1lbnQuY2xpZW50V2lkdGgsIHRoaXMub2JqZWN0Lm1hdHJpeCk7XG4gICAgICAgICAgcGFuVXAoZGVsdGFZICogKHRoaXMub2JqZWN0LnRvcCAtIHRoaXMub2JqZWN0LmJvdHRvbSkgLyB0aGlzLm9iamVjdC56b29tIC8gZWxlbWVudC5jbGllbnRIZWlnaHQsIHRoaXMub2JqZWN0Lm1hdHJpeCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gY2FtZXJhIG5laXRoZXIgb3J0aG9ncmFwaGljIG5vciBwZXJzcGVjdGl2ZVxuICAgICAgICAgIGNvbnNvbGUud2FybignV0FSTklORzogT3JiaXRDb250cm9sc01vZHVsZS5qcyBlbmNvdW50ZXJlZCBhbiB1bmtub3duIGNhbWVyYSB0eXBlIC0gcGFuIGRpc2FibGVkLicpO1xuICAgICAgICAgIHRoaXMuZW5hYmxlUGFuID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSkoKTtcblxuICAgIGNvbnN0IGRvbGx5SW4gPSBkb2xseVNjYWxlID0+IHtcbiAgICAgIGlmICh0aGlzLm9iamVjdCBpbnN0YW5jZW9mIFBlcnNwZWN0aXZlQ2FtZXJhKVxuICAgICAgICBzY2FsZSAvPSBkb2xseVNjYWxlO1xuXG4gICAgICBlbHNlIGlmICh0aGlzLm9iamVjdCBpbnN0YW5jZW9mIE9ydGhvZ3JhcGhpY0NhbWVyYSkge1xuICAgICAgICB0aGlzLm9iamVjdC56b29tID0gTWF0aC5tYXgodGhpcy5taW5ab29tLCBNYXRoLm1pbih0aGlzLm1heFpvb20sIHRoaXMub2JqZWN0Lnpvb20gKiBkb2xseVNjYWxlKSk7XG4gICAgICAgIHRoaXMub2JqZWN0LnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTtcbiAgICAgICAgem9vbUNoYW5nZWQgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdXQVJOSU5HOiBPcmJpdENvbnRyb2xzTW9kdWxlLmpzIGVuY291bnRlcmVkIGFuIHVua25vd24gY2FtZXJhIHR5cGUgLSBkb2xseS96b29tIGRpc2FibGVkLicpO1xuICAgICAgICB0aGlzLmVuYWJsZVpvb20gPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgZG9sbHlPdXQgPSBkb2xseVNjYWxlID0+IHtcbiAgICAgIGlmICh0aGlzLm9iamVjdCBpbnN0YW5jZW9mIFBlcnNwZWN0aXZlQ2FtZXJhKVxuICAgICAgICBzY2FsZSAqPSBkb2xseVNjYWxlO1xuXG4gICAgICBlbHNlIGlmICh0aGlzLm9iamVjdCBpbnN0YW5jZW9mIE9ydGhvZ3JhcGhpY0NhbWVyYSkge1xuICAgICAgICB0aGlzLm9iamVjdC56b29tID0gTWF0aC5tYXgodGhpcy5taW5ab29tLCBNYXRoLm1pbih0aGlzLm1heFpvb20sIHRoaXMub2JqZWN0Lnpvb20gLyBkb2xseVNjYWxlKSk7XG4gICAgICAgIHRoaXMub2JqZWN0LnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTtcbiAgICAgICAgem9vbUNoYW5nZWQgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdXQVJOSU5HOiBPcmJpdENvbnRyb2xzTW9kdWxlLmpzIGVuY291bnRlcmVkIGFuIHVua25vd24gY2FtZXJhIHR5cGUgLSBkb2xseS96b29tIGRpc2FibGVkLicpO1xuICAgICAgICB0aGlzLmVuYWJsZVpvb20gPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy9cbiAgICAvLyBldmVudCBjYWxsYmFja3MgLSB1cGRhdGUgdGhlIG9iamVjdCBzdGF0ZVxuICAgIC8vXG5cbiAgICBjb25zdCBoYW5kbGVNb3VzZURvd25Sb3RhdGUgPSBldmVudCA9PiB7XG4gICAgICAvLyBjb25zb2xlLmxvZyggJ2hhbmRsZU1vdXNlRG93blJvdGF0ZScgKTtcblxuICAgICAgcm90YXRlU3RhcnQuc2V0KGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFkpO1xuICAgIH07XG5cbiAgICBjb25zdCBoYW5kbGVNb3VzZURvd25Eb2xseSA9IGV2ZW50ID0+IHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKCAnaGFuZGxlTW91c2VEb3duRG9sbHknICk7XG5cbiAgICAgIGRvbGx5U3RhcnQuc2V0KGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFkpO1xuICAgIH07XG5cbiAgICBjb25zdCBoYW5kbGVNb3VzZURvd25QYW4gPSBldmVudCA9PiB7XG4gICAgICAvLyBjb25zb2xlLmxvZyggJ2hhbmRsZU1vdXNlRG93blBhbicgKTtcblxuICAgICAgcGFuU3RhcnQuc2V0KGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFkpO1xuICAgIH07XG5cbiAgICBjb25zdCBoYW5kbGVNb3VzZU1vdmVSb3RhdGUgPSBldmVudCA9PiB7XG4gICAgICAvLyBjb25zb2xlLmxvZyggJ2hhbmRsZU1vdXNlTW92ZVJvdGF0ZScgKTtcblxuICAgICAgcm90YXRlRW5kLnNldChldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZKTtcbiAgICAgIHJvdGF0ZURlbHRhLnN1YlZlY3RvcnMocm90YXRlRW5kLCByb3RhdGVTdGFydCk7XG5cbiAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmRvbUVsZW1lbnQgPT09IGRvY3VtZW50ID8gdGhpcy5kb21FbGVtZW50LmJvZHkgOiB0aGlzLmRvbUVsZW1lbnQ7XG5cbiAgICAgIC8vIHJvdGF0aW5nIGFjcm9zcyB3aG9sZSBzY3JlZW4gZ29lcyAzNjAgZGVncmVlcyBhcm91bmRcbiAgICAgIHJvdGF0ZUxlZnQoMiAqIE1hdGguUEkgKiByb3RhdGVEZWx0YS54IC8gZWxlbWVudC5jbGllbnRXaWR0aCAqIHRoaXMucm90YXRlU3BlZWQpO1xuXG4gICAgICAvLyByb3RhdGluZyB1cCBhbmQgZG93biBhbG9uZyB3aG9sZSBzY3JlZW4gYXR0ZW1wdHMgdG8gZ28gMzYwLCBidXQgbGltaXRlZCB0byAxODBcbiAgICAgIHJvdGF0ZVVwKDIgKiBNYXRoLlBJICogcm90YXRlRGVsdGEueSAvIGVsZW1lbnQuY2xpZW50SGVpZ2h0ICogdGhpcy5yb3RhdGVTcGVlZCk7XG5cbiAgICAgIHJvdGF0ZVN0YXJ0LmNvcHkocm90YXRlRW5kKTtcblxuICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICB9O1xuXG4gICAgY29uc3QgaGFuZGxlTW91c2VNb3ZlRG9sbHkgPSBldmVudCA9PiB7XG4gICAgICAvLyBjb25zb2xlLmxvZyggJ2hhbmRsZU1vdXNlTW92ZURvbGx5JyApO1xuXG4gICAgICBkb2xseUVuZC5zZXQoZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSk7XG5cbiAgICAgIGRvbGx5RGVsdGEuc3ViVmVjdG9ycyhkb2xseUVuZCwgZG9sbHlTdGFydCk7XG5cbiAgICAgIGlmIChkb2xseURlbHRhLnkgPiAwKVxuICAgICAgICBkb2xseUluKGdldFpvb21TY2FsZSgpKTtcblxuICAgICAgZWxzZSBpZiAoZG9sbHlEZWx0YS55IDwgMClcbiAgICAgICAgZG9sbHlPdXQoZ2V0Wm9vbVNjYWxlKCkpO1xuXG4gICAgICBkb2xseVN0YXJ0LmNvcHkoZG9sbHlFbmQpO1xuXG4gICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgIH07XG5cbiAgICBjb25zdCBoYW5kbGVNb3VzZU1vdmVQYW4gPSBldmVudCA9PiB7XG4gICAgICAvLyBjb25zb2xlLmxvZyggJ2hhbmRsZU1vdXNlTW92ZVBhbicgKTtcblxuICAgICAgcGFuRW5kLnNldChldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZKTtcblxuICAgICAgcGFuRGVsdGEuc3ViVmVjdG9ycyhwYW5FbmQsIHBhblN0YXJ0KTtcblxuICAgICAgcGFuKHBhbkRlbHRhLngsIHBhbkRlbHRhLnkpO1xuXG4gICAgICBwYW5TdGFydC5jb3B5KHBhbkVuZCk7XG5cbiAgICAgIHRoaXMudXBkYXRlKCk7XG4gICAgfTtcblxuICAgIGNvbnN0IGhhbmRsZU1vdXNlVXAgPSBldmVudCA9PiB7XG4gICAgICAvLyBjb25zb2xlLmxvZyggJ2hhbmRsZU1vdXNlVXAnICk7XG4gICAgfTtcblxuICAgIGNvbnN0IGhhbmRsZU1vdXNlV2hlZWwgPSBldmVudCA9PiB7XG4gICAgICAvLyBjb25zb2xlLmxvZyggJ2hhbmRsZU1vdXNlV2hlZWwnICk7XG5cbiAgICAgIGlmIChldmVudC5kZWx0YVkgPCAwKVxuICAgICAgICBkb2xseU91dChnZXRab29tU2NhbGUoKSk7XG5cbiAgICAgIGVsc2UgaWYgKGV2ZW50LmRlbHRhWSA+IDApXG4gICAgICAgIGRvbGx5SW4oZ2V0Wm9vbVNjYWxlKCkpO1xuXG4gICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgIH07XG5cbiAgICBjb25zdCBoYW5kbGVLZXlEb3duID0gZXZlbnQgPT4ge1xuICAgICAgLy8gY29uc29sZS5sb2coICdoYW5kbGVLZXlEb3duJyApO1xuXG4gICAgICBzd2l0Y2ggKGV2ZW50LmtleUNvZGUpIHtcbiAgICAgICAgY2FzZSB0aGlzLmtleXMuVVA6XG4gICAgICAgICAgcGFuKDAsIHRoaXMua2V5UGFuU3BlZWQpO1xuICAgICAgICAgIHRoaXMudXBkYXRlKCk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSB0aGlzLmtleXMuQk9UVE9NOlxuICAgICAgICAgIHBhbigwLCAtdGhpcy5rZXlQYW5TcGVlZCk7XG4gICAgICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIHRoaXMua2V5cy5MRUZUOlxuICAgICAgICAgIHBhbih0aGlzLmtleVBhblNwZWVkLCAwKTtcbiAgICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgdGhpcy5rZXlzLlJJR0hUOlxuICAgICAgICAgIHBhbigtdGhpcy5rZXlQYW5TcGVlZCwgMCk7XG4gICAgICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBoYW5kbGVUb3VjaFN0YXJ0Um90YXRlID0gZXZlbnQgPT4ge1xuICAgICAgLy8gY29uc29sZS5sb2coICdoYW5kbGVUb3VjaFN0YXJ0Um90YXRlJyApO1xuXG4gICAgICByb3RhdGVTdGFydC5zZXQoZXZlbnQudG91Y2hlc1swXS5wYWdlWCwgZXZlbnQudG91Y2hlc1swXS5wYWdlWSk7XG4gICAgfTtcblxuICAgIGNvbnN0IGhhbmRsZVRvdWNoU3RhcnREb2xseSA9IGV2ZW50ID0+IHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKCAnaGFuZGxlVG91Y2hTdGFydERvbGx5JyApO1xuXG4gICAgICBjb25zdCBkeCA9IGV2ZW50LnRvdWNoZXNbMF0ucGFnZVggLSBldmVudC50b3VjaGVzWzFdLnBhZ2VYO1xuICAgICAgY29uc3QgZHkgPSBldmVudC50b3VjaGVzWzBdLnBhZ2VZIC0gZXZlbnQudG91Y2hlc1sxXS5wYWdlWTtcblxuICAgICAgY29uc3QgZGlzdGFuY2UgPSBNYXRoLnNxcnQoZHggKiBkeCArIGR5ICogZHkpO1xuXG4gICAgICBkb2xseVN0YXJ0LnNldCgwLCBkaXN0YW5jZSk7XG4gICAgfTtcblxuICAgIGNvbnN0IGhhbmRsZVRvdWNoU3RhcnRQYW4gPSBldmVudCA9PiB7XG4gICAgICAvLyBjb25zb2xlLmxvZyggJ2hhbmRsZVRvdWNoU3RhcnRQYW4nICk7XG5cbiAgICAgIHBhblN0YXJ0LnNldChldmVudC50b3VjaGVzWzBdLnBhZ2VYLCBldmVudC50b3VjaGVzWzBdLnBhZ2VZKTtcbiAgICB9O1xuXG4gICAgY29uc3QgaGFuZGxlVG91Y2hNb3ZlUm90YXRlID0gZXZlbnQgPT4ge1xuICAgICAgLy8gY29uc29sZS5sb2coICdoYW5kbGVUb3VjaE1vdmVSb3RhdGUnICk7XG5cbiAgICAgIHJvdGF0ZUVuZC5zZXQoZXZlbnQudG91Y2hlc1swXS5wYWdlWCwgZXZlbnQudG91Y2hlc1swXS5wYWdlWSk7XG4gICAgICByb3RhdGVEZWx0YS5zdWJWZWN0b3JzKHJvdGF0ZUVuZCwgcm90YXRlU3RhcnQpO1xuXG4gICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5kb21FbGVtZW50ID09PSBkb2N1bWVudCA/IHRoaXMuZG9tRWxlbWVudC5ib2R5IDogdGhpcy5kb21FbGVtZW50O1xuXG4gICAgICAvLyByb3RhdGluZyBhY3Jvc3Mgd2hvbGUgc2NyZWVuIGdvZXMgMzYwIGRlZ3JlZXMgYXJvdW5kXG4gICAgICByb3RhdGVMZWZ0KDIgKiBNYXRoLlBJICogcm90YXRlRGVsdGEueCAvIGVsZW1lbnQuY2xpZW50V2lkdGggKiB0aGlzLnJvdGF0ZVNwZWVkKTtcblxuICAgICAgLy8gcm90YXRpbmcgdXAgYW5kIGRvd24gYWxvbmcgd2hvbGUgc2NyZWVuIGF0dGVtcHRzIHRvIGdvIDM2MCwgYnV0IGxpbWl0ZWQgdG8gMTgwXG4gICAgICByb3RhdGVVcCgyICogTWF0aC5QSSAqIHJvdGF0ZURlbHRhLnkgLyBlbGVtZW50LmNsaWVudEhlaWdodCAqIHRoaXMucm90YXRlU3BlZWQpO1xuXG4gICAgICByb3RhdGVTdGFydC5jb3B5KHJvdGF0ZUVuZCk7XG5cbiAgICAgIHRoaXMudXBkYXRlKCk7XG4gICAgfTtcblxuICAgIGNvbnN0IGhhbmRsZVRvdWNoTW92ZURvbGx5ID0gZXZlbnQgPT4ge1xuICAgICAgLy8gY29uc29sZS5sb2coICdoYW5kbGVUb3VjaE1vdmVEb2xseScgKTtcblxuICAgICAgY29uc3QgZHggPSBldmVudC50b3VjaGVzWzBdLnBhZ2VYIC0gZXZlbnQudG91Y2hlc1sxXS5wYWdlWDtcbiAgICAgIGNvbnN0IGR5ID0gZXZlbnQudG91Y2hlc1swXS5wYWdlWSAtIGV2ZW50LnRvdWNoZXNbMV0ucGFnZVk7XG5cbiAgICAgIGNvbnN0IGRpc3RhbmNlID0gTWF0aC5zcXJ0KGR4ICogZHggKyBkeSAqIGR5KTtcblxuICAgICAgZG9sbHlFbmQuc2V0KDAsIGRpc3RhbmNlKTtcblxuICAgICAgZG9sbHlEZWx0YS5zdWJWZWN0b3JzKGRvbGx5RW5kLCBkb2xseVN0YXJ0KTtcblxuICAgICAgaWYgKGRvbGx5RGVsdGEueSA+IDApXG4gICAgICAgIGRvbGx5T3V0KGdldFpvb21TY2FsZSgpKTtcblxuICAgICAgZWxzZSBpZiAoZG9sbHlEZWx0YS55IDwgMClcbiAgICAgICAgZG9sbHlJbihnZXRab29tU2NhbGUoKSk7XG5cbiAgICAgIGRvbGx5U3RhcnQuY29weShkb2xseUVuZCk7XG5cbiAgICAgIHRoaXMudXBkYXRlKCk7XG4gICAgfTtcblxuICAgIGNvbnN0IGhhbmRsZVRvdWNoTW92ZVBhbiA9IGV2ZW50ID0+IHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKCAnaGFuZGxlVG91Y2hNb3ZlUGFuJyApO1xuXG4gICAgICBwYW5FbmQuc2V0KGV2ZW50LnRvdWNoZXNbMF0ucGFnZVgsIGV2ZW50LnRvdWNoZXNbMF0ucGFnZVkpO1xuXG4gICAgICBwYW5EZWx0YS5zdWJWZWN0b3JzKHBhbkVuZCwgcGFuU3RhcnQpO1xuXG4gICAgICBwYW4ocGFuRGVsdGEueCwgcGFuRGVsdGEueSk7XG5cbiAgICAgIHBhblN0YXJ0LmNvcHkocGFuRW5kKTtcblxuICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICB9O1xuXG4gICAgY29uc3QgaGFuZGxlVG91Y2hFbmQgPSAoKSA9PiB7XG4gICAgICAvLyBjb25zb2xlLmxvZyggJ2hhbmRsZVRvdWNoRW5kJyApO1xuICAgIH07XG5cbiAgICAvL1xuICAgIC8vIGV2ZW50IGhhbmRsZXJzIC0gRlNNOiBsaXN0ZW4gZm9yIGV2ZW50cyBhbmQgcmVzZXQgc3RhdGVcbiAgICAvL1xuXG4gICAgY29uc3Qgb25Nb3VzZURvd24gPSBldmVudCA9PiB7XG4gICAgICBpZiAodGhpcy5lbmFibGVkID09PSBmYWxzZSkgcmV0dXJuO1xuXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICBpZiAoZXZlbnQuYnV0dG9uID09PSB0aGlzLm1vdXNlQnV0dG9ucy5PUkJJVCkge1xuICAgICAgICBpZiAodGhpcy5lbmFibGVSb3RhdGUgPT09IGZhbHNlKSByZXR1cm47XG5cbiAgICAgICAgaGFuZGxlTW91c2VEb3duUm90YXRlKGV2ZW50KTtcblxuICAgICAgICBzdGF0ZSA9IFNUQVRFLlJPVEFURTtcbiAgICAgIH0gZWxzZSBpZiAoZXZlbnQuYnV0dG9uID09PSB0aGlzLm1vdXNlQnV0dG9ucy5aT09NKSB7XG4gICAgICAgIGlmICh0aGlzLmVuYWJsZVpvb20gPT09IGZhbHNlKSByZXR1cm47XG5cbiAgICAgICAgaGFuZGxlTW91c2VEb3duRG9sbHkoZXZlbnQpO1xuXG4gICAgICAgIHN0YXRlID0gU1RBVEUuRE9MTFk7XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50LmJ1dHRvbiA9PT0gdGhpcy5tb3VzZUJ1dHRvbnMuUEFOKSB7XG4gICAgICAgIGlmICh0aGlzLmVuYWJsZVBhbiA9PT0gZmFsc2UpIHJldHVybjtcblxuICAgICAgICBoYW5kbGVNb3VzZURvd25QYW4oZXZlbnQpO1xuXG4gICAgICAgIHN0YXRlID0gU1RBVEUuUEFOO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3RhdGUgIT09IFNUQVRFLk5PTkUpIHtcbiAgICAgICAgdGhpcy5ldmVudEhhbmRsZXIub24oJ21vdXNlbW92ZScsIG9uTW91c2VNb3ZlLCBmYWxzZSk7XG4gICAgICAgIHRoaXMuZXZlbnRIYW5kbGVyLm9uKCdtb3VzZXVwJywgb25Nb3VzZVVwLCBmYWxzZSk7XG5cbiAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KHN0YXJ0RXZlbnQpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBvbk1vdXNlTW92ZSA9IGV2ZW50ID0+IHtcbiAgICAgIGlmICh0aGlzLmVuYWJsZWQgPT09IGZhbHNlKSByZXR1cm47XG5cbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgIGlmIChzdGF0ZSA9PT0gU1RBVEUuUk9UQVRFKSB7XG4gICAgICAgIGlmICh0aGlzLmVuYWJsZVJvdGF0ZSA9PT0gZmFsc2UpIHJldHVybjtcblxuICAgICAgICBoYW5kbGVNb3VzZU1vdmVSb3RhdGUoZXZlbnQpO1xuICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PT0gU1RBVEUuRE9MTFkpIHtcbiAgICAgICAgaWYgKHRoaXMuZW5hYmxlWm9vbSA9PT0gZmFsc2UpIHJldHVybjtcblxuICAgICAgICBoYW5kbGVNb3VzZU1vdmVEb2xseShldmVudCk7XG4gICAgICB9IGVsc2UgaWYgKHN0YXRlID09PSBTVEFURS5QQU4pIHtcbiAgICAgICAgaWYgKHRoaXMuZW5hYmxlUGFuID09PSBmYWxzZSkgcmV0dXJuO1xuXG4gICAgICAgIGhhbmRsZU1vdXNlTW92ZVBhbihldmVudCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IG9uTW91c2VVcCA9IGV2ZW50ID0+IHtcbiAgICAgIGlmICh0aGlzLmVuYWJsZWQgPT09IGZhbHNlKSByZXR1cm47XG5cbiAgICAgIGhhbmRsZU1vdXNlVXAoZXZlbnQpO1xuXG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBvbk1vdXNlTW92ZSwgZmFsc2UpO1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIG9uTW91c2VVcCwgZmFsc2UpO1xuXG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoZW5kRXZlbnQpO1xuXG4gICAgICBzdGF0ZSA9IFNUQVRFLk5PTkU7XG4gICAgfTtcblxuICAgIGNvbnN0IG9uTW91c2VXaGVlbCA9IGV2ZW50ID0+IHtcbiAgICAgIGlmICh0aGlzLmVuYWJsZWQgPT09IGZhbHNlIHx8IHRoaXMuZW5hYmxlWm9vbSA9PT0gZmFsc2UgfHwgKHN0YXRlICE9PSBTVEFURS5OT05FICYmIHN0YXRlICE9PSBTVEFURS5ST1RBVEUpKSByZXR1cm47XG5cbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgaGFuZGxlTW91c2VXaGVlbChldmVudCk7XG5cbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChzdGFydEV2ZW50KTsgLy8gbm90IHN1cmUgd2h5IHRoZXNlIGFyZSBoZXJlLi4uXG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoZW5kRXZlbnQpO1xuICAgIH07XG5cbiAgICBjb25zdCBvbktleURvd24gPSBldmVudCA9PiB7XG4gICAgICBpZiAodGhpcy5lbmFibGVkID09PSBmYWxzZSB8fCB0aGlzLmVuYWJsZUtleXMgPT09IGZhbHNlIHx8IHRoaXMuZW5hYmxlUGFuID09PSBmYWxzZSkgcmV0dXJuO1xuXG4gICAgICBoYW5kbGVLZXlEb3duKGV2ZW50KTtcbiAgICB9O1xuXG4gICAgY29uc3Qgb25Ub3VjaFN0YXJ0ID0gZXZlbnQgPT4ge1xuICAgICAgaWYgKHRoaXMuZW5hYmxlZCA9PT0gZmFsc2UpIHJldHVybjtcblxuICAgICAgc3dpdGNoIChldmVudC50b3VjaGVzLmxlbmd0aCkge1xuICAgICAgICBjYXNlIDE6IC8vIG9uZS1maW5nZXJlZCB0b3VjaDogcm90YXRlXG5cbiAgICAgICAgICBpZiAodGhpcy5lbmFibGVSb3RhdGUgPT09IGZhbHNlKSByZXR1cm47XG5cbiAgICAgICAgICBoYW5kbGVUb3VjaFN0YXJ0Um90YXRlKGV2ZW50KTtcblxuICAgICAgICAgIHN0YXRlID0gU1RBVEUuVE9VQ0hfUk9UQVRFO1xuXG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAyOiAvLyB0d28tZmluZ2VyZWQgdG91Y2g6IGRvbGx5XG5cbiAgICAgICAgICBpZiAodGhpcy5lbmFibGVab29tID09PSBmYWxzZSkgcmV0dXJuO1xuXG4gICAgICAgICAgaGFuZGxlVG91Y2hTdGFydERvbGx5KGV2ZW50KTtcblxuICAgICAgICAgIHN0YXRlID0gU1RBVEUuVE9VQ0hfRE9MTFk7XG5cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDM6IC8vIHRocmVlLWZpbmdlcmVkIHRvdWNoOiBwYW5cblxuICAgICAgICAgIGlmICh0aGlzLmVuYWJsZVBhbiA9PT0gZmFsc2UpIHJldHVybjtcblxuICAgICAgICAgIGhhbmRsZVRvdWNoU3RhcnRQYW4oZXZlbnQpO1xuXG4gICAgICAgICAgc3RhdGUgPSBTVEFURS5UT1VDSF9QQU47XG5cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBkZWZhdWx0OlxuXG4gICAgICAgICAgc3RhdGUgPSBTVEFURS5OT05FO1xuXG4gICAgICB9XG5cbiAgICAgIGlmIChzdGF0ZSAhPT0gU1RBVEUuTk9ORSlcbiAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KHN0YXJ0RXZlbnQpO1xuICAgIH07XG5cbiAgICBjb25zdCBvblRvdWNoTW92ZSA9IGV2ZW50ID0+IHtcbiAgICAgIGlmICh0aGlzLmVuYWJsZWQgPT09IGZhbHNlKSByZXR1cm47XG5cbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgc3dpdGNoIChldmVudC50b3VjaGVzLmxlbmd0aCkge1xuICAgICAgICBjYXNlIDE6IC8vIG9uZS1maW5nZXJlZCB0b3VjaDogcm90YXRlXG5cbiAgICAgICAgICBpZiAodGhpcy5lbmFibGVSb3RhdGUgPT09IGZhbHNlKSByZXR1cm47XG4gICAgICAgICAgaWYgKHN0YXRlICE9PSBTVEFURS5UT1VDSF9ST1RBVEUpIHJldHVybjsgLy8gaXMgdGhpcyBuZWVkZWQ/Li4uXG5cbiAgICAgICAgICBoYW5kbGVUb3VjaE1vdmVSb3RhdGUoZXZlbnQpO1xuXG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAyOiAvLyB0d28tZmluZ2VyZWQgdG91Y2g6IGRvbGx5XG5cbiAgICAgICAgICBpZiAodGhpcy5lbmFibGVab29tID09PSBmYWxzZSkgcmV0dXJuO1xuICAgICAgICAgIGlmIChzdGF0ZSAhPT0gU1RBVEUuVE9VQ0hfRE9MTFkpIHJldHVybjsgLy8gaXMgdGhpcyBuZWVkZWQ/Li4uXG5cbiAgICAgICAgICBoYW5kbGVUb3VjaE1vdmVEb2xseShldmVudCk7XG5cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDM6IC8vIHRocmVlLWZpbmdlcmVkIHRvdWNoOiBwYW5cblxuICAgICAgICAgIGlmICh0aGlzLmVuYWJsZVBhbiA9PT0gZmFsc2UpIHJldHVybjtcbiAgICAgICAgICBpZiAoc3RhdGUgIT09IFNUQVRFLlRPVUNIX1BBTikgcmV0dXJuOyAvLyBpcyB0aGlzIG5lZWRlZD8uLi5cblxuICAgICAgICAgIGhhbmRsZVRvdWNoTW92ZVBhbihldmVudCk7XG5cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBkZWZhdWx0OlxuXG4gICAgICAgICAgc3RhdGUgPSBTVEFURS5OT05FO1xuXG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IG9uVG91Y2hFbmQgPSBldmVudCA9PiB7XG4gICAgICBpZiAodGhpcy5lbmFibGVkID09PSBmYWxzZSkgcmV0dXJuO1xuXG4gICAgICBoYW5kbGVUb3VjaEVuZChldmVudCk7XG5cbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChlbmRFdmVudCk7XG5cbiAgICAgIHN0YXRlID0gU1RBVEUuTk9ORTtcbiAgICB9O1xuXG4gICAgY29uc3Qgb25Db250ZXh0TWVudSA9IGV2ZW50ID0+IHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfTtcblxuICAgIC8vXG5cbiAgICB0aGlzLmV2ZW50SGFuZGxlci5vbignY29udGV4dG1lbnUnLCBvbkNvbnRleHRNZW51LCBmYWxzZSk7XG5cbiAgICB0aGlzLmV2ZW50SGFuZGxlci5vbignbW91c2Vkb3duJywgb25Nb3VzZURvd24sIGZhbHNlKTtcbiAgICB0aGlzLmV2ZW50SGFuZGxlci5vbignd2hlZWwnLCBvbk1vdXNlV2hlZWwsIGZhbHNlKTtcblxuICAgIHRoaXMuZXZlbnRIYW5kbGVyLm9uKCd0b3VjaHN0YXJ0Jywgb25Ub3VjaFN0YXJ0LCBmYWxzZSk7XG4gICAgdGhpcy5ldmVudEhhbmRsZXIub24oJ3RvdWNoZW5kJywgb25Ub3VjaEVuZCwgZmFsc2UpO1xuICAgIHRoaXMuZXZlbnRIYW5kbGVyLm9uKCd0b3VjaG1vdmUnLCBvblRvdWNoTW92ZSwgZmFsc2UpO1xuXG4gICAgdGhpcy5ldmVudEhhbmRsZXIub24oJ2tleWRvd24nLCBvbktleURvd24sIGZhbHNlKTtcblxuICAgIC8vIGZvcmNlIGFuIHVwZGF0ZSBhdCBzdGFydFxuXG4gICAgdGhpcy51cGRhdGUoKTtcbiAgfVxuXG4gIGdldCBjZW50ZXIoKSB7XG4gICAgY29uc29sZS53YXJuKCdPcmJpdENvbnRyb2xzOiAuY2VudGVyIGhhcyBiZWVuIHJlbmFtZWQgdG8gLnRhcmdldCcpO1xuICAgIHJldHVybiB0aGlzLnRhcmdldDtcbiAgfVxuXG4gIGdldCBub1pvb20oKSB7XG4gICAgY29uc29sZS53YXJuKCdPcmJpdENvbnRyb2xzOiAubm9ab29tIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAuZW5hYmxlWm9vbSBpbnN0ZWFkLicpO1xuICAgIHJldHVybiAhdGhpcy5lbmFibGVab29tO1xuICB9XG5cbiAgc2V0IG5vWm9vbSh2YWx1ZSkge1xuICAgIGNvbnNvbGUud2FybignT3JiaXRDb250cm9sczogLm5vWm9vbSBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgLmVuYWJsZVpvb20gaW5zdGVhZC4nKTtcbiAgICB0aGlzLmVuYWJsZVpvb20gPSAhdmFsdWU7XG4gIH1cblxuICBnZXQgbm9Sb3RhdGUoKSB7XG4gICAgY29uc29sZS53YXJuKCdPcmJpdENvbnRyb2xzOiAubm9Sb3RhdGUgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIC5lbmFibGVSb3RhdGUgaW5zdGVhZC4nKTtcbiAgICByZXR1cm4gIXRoaXMuZW5hYmxlUm90YXRlO1xuICB9XG5cbiAgc2V0IG5vUm90YXRlKHZhbHVlKSB7XG4gICAgY29uc29sZS53YXJuKCdPcmJpdENvbnRyb2xzOiAubm9Sb3RhdGUgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIC5lbmFibGVSb3RhdGUgaW5zdGVhZC4nKTtcbiAgICB0aGlzLmVuYWJsZVJvdGF0ZSA9ICF2YWx1ZTtcbiAgfVxuXG4gIGdldCBub1BhbigpIHtcbiAgICBjb25zb2xlLndhcm4oJ09yYml0Q29udHJvbHM6IC5ub1BhbiBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgLmVuYWJsZVBhbiBpbnN0ZWFkLicpO1xuICAgIHJldHVybiAhdGhpcy5lbmFibGVQYW47XG4gIH1cblxuICBzZXQgbm9QYW4odmFsdWUpIHtcbiAgICBjb25zb2xlLndhcm4oJ09yYml0Q29udHJvbHM6IC5ub1BhbiBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgLmVuYWJsZVBhbiBpbnN0ZWFkLicpO1xuICAgIHRoaXMuZW5hYmxlUGFuID0gIXZhbHVlO1xuICB9XG5cbiAgZ2V0IG5vS2V5cygpIHtcbiAgICBjb25zb2xlLndhcm4oJ09yYml0Q29udHJvbHM6IC5ub0tleXMgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIC5lbmFibGVLZXlzIGluc3RlYWQuJyk7XG4gICAgcmV0dXJuICF0aGlzLmVuYWJsZUtleXM7XG4gIH1cblxuICBzZXQgbm9LZXlzKHZhbHVlKSB7XG4gICAgY29uc29sZS53YXJuKCdPcmJpdENvbnRyb2xzOiAubm9LZXlzIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAuZW5hYmxlS2V5cyBpbnN0ZWFkLicpO1xuICAgIHRoaXMuZW5hYmxlS2V5cyA9ICF2YWx1ZTtcbiAgfVxuXG4gIGdldCBzdGF0aWNNb3ZpbmcoKSB7XG4gICAgY29uc29sZS53YXJuKCdPcmJpdENvbnRyb2xzOiAuc3RhdGljTW92aW5nIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAuZW5hYmxlRGFtcGluZyBpbnN0ZWFkLicpO1xuICAgIHJldHVybiAhdGhpcy5lbmFibGVEYW1waW5nO1xuICB9XG5cbiAgc2V0IHN0YXRpY01vdmluZyh2YWx1ZSkge1xuICAgIGNvbnNvbGUud2FybignT3JiaXRDb250cm9sczogLnN0YXRpY01vdmluZyBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgLmVuYWJsZURhbXBpbmcgaW5zdGVhZC4nKTtcbiAgICB0aGlzLmVuYWJsZURhbXBpbmcgPSAhdmFsdWU7XG4gIH1cblxuICBnZXQgZHluYW1pY0RhbXBpbmdGYWN0b3IoKSB7XG4gICAgY29uc29sZS53YXJuKCdPcmJpdENvbnRyb2xzOiAuZHluYW1pY0RhbXBpbmdGYWN0b3IgaGFzIGJlZW4gcmVuYW1lZC4gVXNlIC5kYW1waW5nRmFjdG9yIGluc3RlYWQuJyk7XG4gICAgcmV0dXJuIHRoaXMuZGFtcGluZ0ZhY3RvcjtcbiAgfVxuXG4gIHNldCBkeW5hbWljRGFtcGluZ0ZhY3Rvcih2YWx1ZSkge1xuICAgIGNvbnNvbGUud2FybignT3JiaXRDb250cm9sczogLmR5bmFtaWNEYW1waW5nRmFjdG9yIGhhcyBiZWVuIHJlbmFtZWQuIFVzZSAuZGFtcGluZ0ZhY3RvciBpbnN0ZWFkLicpO1xuICAgIHRoaXMuZGFtcGluZ0ZhY3RvciA9IHZhbHVlO1xuICB9XG59XG4iLCJpbXBvcnQge1ZlY3RvcjN9IGZyb20gJ3RocmVlJztcbmltcG9ydCB7Q29udHJvbHNNb2R1bGV9IGZyb20gJy4uL0NvbnRyb2xzTW9kdWxlJztcblxuaW1wb3J0IHtUaHJlZU9yYml0Q29udHJvbHN9IGZyb20gJy4vbGliL1RocmVlT3JiaXRDb250cm9scyc7XG5cbi8qKlxuICogQGNsYXNzIE9yYml0Q29udHJvbHNNb2R1bGVcbiAqIEBjYXRlZ29yeSBtb2R1bGVzL2FwcFxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXNdXG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtcy5vYmplY3Q9Y2FtZXJhXSBPYmplY3QgdG8gd2hpY2ggY29udHJvbHMgYXJlIGFwcGxpZWQuXG4gKiBAcGFyYW0ge1RIUkVFLlZlY3RvcjN9IFtwYXJhbXMudGFyZ2V0PW5ldyBWZWN0b3IzKCldIENvbnRyb2xzIGNlbnRlciB2ZWN0b3IuXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtwYXJhbXMuZm9sbG93PWZhbHNlXSBGb2xsb3cgdGhlIHRhcmdldFxuICogQG1lbWJlcm9mIG1vZHVsZTptb2R1bGVzL2FwcFxuICogQGV4YW1wbGUgPGNhcHRpb24+IENyZWF0aW5nIGEgcmVuZGVyaW5nIG1vZHVsZSBhbmQgcGFzc2luZyBpdCB0byBBcHAncyBtb2R1bGVzPC9jYXB0aW9uPlxuICogbmV3IEFwcChbXG4gKiAgIG5ldyBFbGVtZW50TW9kdWxlKCksXG4gKiAgIG5ldyBTY2VuZU1vZHVsZSgpLFxuICogICBuZXcgRGVmaW5lTW9kdWxlKCdjYW1lcmEnLCBuZXcgV0hTLlBlcnNwZWN0aXZlQ2FtZXJhKHtcbiAqICAgICBwb3NpdGlvbjogbmV3IFRIUkVFLlZlY3RvcjMoMCwgNiwgMTgpLFxuICogICAgIGZhcjogMTAwMDBcbiAqICAgfSkpLFxuICogICBuZXcgUmVuZGVyaW5nTW9kdWxlKCksXG4gKiAgIG5ldyBPcmJpdENvbnRyb2xzTW9kdWxlKClcbiAqIF0pO1xuICovXG5leHBvcnQgY2xhc3MgT3JiaXRDb250cm9sc01vZHVsZSBleHRlbmRzIENvbnRyb2xzTW9kdWxlIHtcbiAgY29uc3RydWN0b3IocGFyYW1zID0ge30pIHtcbiAgICBzdXBlcihwYXJhbXMpO1xuXG4gICAgdGhpcy5wYXJhbXMgPSBPYmplY3QuYXNzaWduKHtcbiAgICAgIGZvbGxvdzogZmFsc2UsXG4gICAgICBvYmplY3Q6IG51bGwsXG4gICAgICB0YXJnZXQ6IG5ldyBWZWN0b3IzKClcbiAgICB9LCBwYXJhbXMpO1xuICB9XG5cbiAgbWFuYWdlcihtYW5hZ2VyKSB7XG4gICAgc3VwZXIubWFuYWdlcihtYW5hZ2VyKTtcblxuICAgIGNvbnN0IHtvYmplY3Q6IG9iaiwgZm9sbG93LCB0YXJnZXR9ID0gdGhpcy5wYXJhbXM7XG4gICAgY29uc3Qgb2JqZWN0ID0gb2JqID8gb2JqLm5hdGl2ZSA6IG1hbmFnZXIuZ2V0KCdjYW1lcmEnKS5uYXRpdmU7XG5cbiAgICBjb25zdCBjb250cm9scyA9IG5ldyBUaHJlZU9yYml0Q29udHJvbHMoXG4gICAgICBvYmplY3QsXG4gICAgICBtYW5hZ2VyLmdldCgnZWxlbWVudCcpLFxuICAgICAgbWFuYWdlci5oYW5kbGVyXG4gICAgKTtcblxuICAgIGNvbnN0IHVwZGF0ZVByb2Nlc3NvciA9IGZvbGxvdyA/IGMgPT4ge1xuICAgICAgY29udHJvbHMudXBkYXRlKGMuZ2V0RGVsdGEoKSk7XG4gICAgICBjb250cm9scy50YXJnZXQuY29weSh0YXJnZXQpO1xuICAgIH0gOiBjID0+IHtcbiAgICAgIGNvbnRyb2xzLnVwZGF0ZShjLmdldERlbHRhKCkpO1xuICAgIH07XG5cbiAgICB0aGlzLnNldENvbnRyb2xzKGNvbnRyb2xzKTtcbiAgICB0aGlzLnNldFVwZGF0ZSh1cGRhdGVQcm9jZXNzb3IpO1xuXG4gICAgbWFuYWdlci51cGRhdGUoe1xuICAgICAgY2FtZXJhOiBjYW1lcmEgPT4ge1xuICAgICAgICBpZiAob2JqKSByZXR1cm47XG4gICAgICAgIGNvbnRyb2xzLm9iamVjdCA9IGNhbWVyYS5uYXRpdmU7XG4gICAgICB9LFxuICAgICAgZWxlbWVudDogZWxlbWVudCA9PiB7XG4gICAgICAgIGNvbnRyb2xzLmRvbUVsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29udHJvbHMudGFyZ2V0LmNvcHkodGFyZ2V0KTtcbiAgfVxufVxuIiwiLyoqIEBtb2R1bGUgbW9kdWxlcy9hcHAvY29udHJvbHMgKi9cbmV4cG9ydCAqIGZyb20gJy4vT3JiaXRDb250cm9sc01vZHVsZSc7XG4iLCIvKiogQG1vZHVsZSBtb2R1bGVzL2FwcCAqL1xuZXhwb3J0ICogZnJvbSAnLi9FbGVtZW50TW9kdWxlJztcbmV4cG9ydCAqIGZyb20gJy4vUmVuZGVyaW5nTW9kdWxlJztcbmV4cG9ydCAqIGZyb20gJy4vU2NlbmVNb2R1bGUnO1xuZXhwb3J0ICogZnJvbSAnLi9SZXNpemVNb2R1bGUnO1xuZXhwb3J0ICogZnJvbSAnLi9Qb3N0UHJvY2Vzc29yTW9kdWxlJztcbmV4cG9ydCAqIGZyb20gJy4vVmlydHVhbE1vdXNlTW9kdWxlJztcbmV4cG9ydCAqIGZyb20gJy4vRXZlbnRzUGF0Y2hNb2R1bGUnO1xuZXhwb3J0ICogZnJvbSAnLi9Db250cm9sc01vZHVsZSc7XG5leHBvcnQgKiBmcm9tICcuL0ZvZ01vZHVsZSc7XG5leHBvcnQgKiBmcm9tICcuL1N0YXRlTW9kdWxlJztcblxuLy8gY29udHJvbHNcbmV4cG9ydCAqIGZyb20gJy4vY29udHJvbHMvaW5kZXgnO1xuIiwiLyoqXG4gKiBAY2xhc3MgRHluYW1pY0dlb21ldHJ5TW9kdWxlXG4gKiBAY2F0ZWdvcnkgbW9kdWxlcy9tZXNoXG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtcz17YXR0cmlidXRlczogZmFsc2V9XSAtIHBhcmFtc1xuICogQHBhcmFtIHtCb29sZWFufSBbcGF0Y2hFdmVudHM9dHJ1ZV1cbiAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9tZXNoXG4gKi9cbmV4cG9ydCBjbGFzcyBEeW5hbWljR2VvbWV0cnlNb2R1bGUge1xuICBjb25zdHJ1Y3RvcihwYXJhbXMgPSB7fSkge1xuICAgIHRoaXMucGFyYW1zID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICBhdHRyaWJ1dGVzOiBmYWxzZVxuICAgIH0sIHBhcmFtcyk7XG4gIH1cblxuICBpbnRlZ3JhdGUoc2VsZikge1xuICAgIGNvbnN0IHBhcmFtcyA9IHNlbGYucGFyYW1zO1xuXG4gICAgdGhpcy5nXyA9IGZ1bmN0aW9uIChwYXJhbXMgPSB7fSkge1xuICAgICAgaWYgKHRoaXMuYnVpbGRHZW9tZXRyeSkge1xuICAgICAgICB0aGlzLm5hdGl2ZS5nZW9tZXRyeSA9IHRoaXMuYnVpbGRHZW9tZXRyeShcbiAgICAgICAgICB0aGlzLnVwZGF0ZVBhcmFtcyh7Z2VvbWV0cnk6IHBhcmFtc30pXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGlmIChwYXJhbXMuYXR0cmlidXRlcykge1xuICAgICAgZm9yIChjb25zdCBrZXkgaW4gdGhpcy5wYXJhbXMuZ2VvbWV0cnkpIHtcbiAgICAgICAgaWYgKGtleSkge1xuICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBgZ18ke2tleX1gLCB7XG4gICAgICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLm5hdGl2ZS5nZW9tZXRyeS5wYXJhbWV0ZXJzW2tleV07XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0KHZhbHVlKSB7XG4gICAgICAgICAgICAgIHRoaXMubmF0aXZlLmdlb21ldHJ5ID0gdGhpcy5idWlsZEdlb21ldHJ5KHRoaXMudXBkYXRlUGFyYW1zKHtnZW9tZXRyeToge1trZXldOiB2YWx1ZX19KSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQge1xuICBSZXBlYXRXcmFwcGluZyxcbiAgVVZNYXBwaW5nLFxuICBOZWFyZXN0RmlsdGVyLFxuICBMaW5lYXJNaXBNYXBMaW5lYXJGaWx0ZXIsXG4gIFRleHR1cmVMb2FkZXIsXG4gIFZlY3RvcjJcbn0gZnJvbSAndGhyZWUnO1xuXG5jb25zdCBsb2FkZXIgPSBuZXcgVGV4dHVyZUxvYWRlcigpO1xuXG4vKipcbiAqIEBjbGFzcyBUZXh0dXJlTW9kdWxlXG4gKiBAY2F0ZWdvcnkgbW9kdWxlcy9tZXNoXG4gKiBAZGVzY3JpcHRpb24gQSBUZXh0dXJlTW9kdWxlIGNhbiBiZSBhcHBsaWVkIHRvIGFueSBNZXNoIG9yIE1vZGVsLlxuICogQHBhcmFtIHtBcnJheX0gW3RleHR1cmVzXSAtIGFycmF5IG9mIHRleHR1cmUgb2JqZWN0c1xuICogQG1lbWJlcm9mIG1vZHVsZTptb2R1bGVzL21lc2hcbiAqIEBleGFtcGxlIDxjYXB0aW9uPkNyZWF0aW5nIGFuIGluc3RhbmNlLiB1cmwgdGFrZXMgYSBwYXRoLCBvciBhIGRhdGEgb2JqZWN0LjwvY2FwdGlvbj5cbiAqIHZhciB3b29kVGV4dHVyZSA9IG5ldyBUZXh0dXJlTW9kdWxlKHtcbiAqICAgdXJsOiBgJHtwcm9jZXNzLmFzc2V0c1BhdGh9L3RleHR1cmVzL3dvb2QuanBnYFxuICogfSk7XG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5Nb3JlIGNvbXByZWhlbnNpdmUgZXhhbXBsZSwgd29vZCB0ZXh0dXJlIGFwcGxpZWQgdG8gYSBCb3guPC9jYXB0aW9uPlxuICogbmV3IEJveCh7XG4gKiAgIGdlb21ldHJ5OiB7XG4gKiAgICAgd2lkdGg6IDIsXG4gKiAgICAgaGVpZ2h0OiAyLFxuICogICAgIGRlcHRoOiAyXG4gKiAgIH0sXG4gKiAgIG1vZHVsZXM6IFtcbiAqICAgICBuZXcgVGV4dHVyZU1vZHVsZSh7XG4gKiAgICAgICB1cmw6IGBwYXRoL3RvL3RleHR1cmUuanBnYCxcbiAqICAgICAgIHJlcGVhdDogbmV3IFRIUkVFLlZlY3RvcjIoMSwgMSkgLy8gb3B0aW9uYWxcbiAqICAgICB9KVxuICogICBdLFxuICogICBtYXRlcmlhbDogbmV3IFRIUkVFLk1lc2hCYXNpY01hdGVyaWFsKHtcbiAqICAgICBjb2xvcjogMHhmZmZmZmZcbiAqICAgfSksXG4gKiAgIHBvc2l0aW9uOiBbNTAsIDYwLCA3MF1cbiAqIH0pLmFkZFRvKGFwcCk7XG4gKi9cbmV4cG9ydCBjbGFzcyBUZXh0dXJlTW9kdWxlIHtcbiAgc3RhdGljIGxvYWQodXJsKSB7XG4gICAgcmV0dXJuIG5ldyBUZXh0dXJlTW9kdWxlKHt1cmx9KS50ZXh0dXJlc1swXVsxXTtcbiAgfVxuXG4gIHRleHR1cmVzID0gW107XG5cbiAgY29uc3RydWN0b3IoLi4udGV4dHVyZXMpIHtcbiAgICB0ZXh0dXJlcy5mb3JFYWNoKCh7XG4gICAgICB1cmwsXG4gICAgICB0eXBlID0gJ21hcCcsXG4gICAgICBvZmZzZXQgPSBuZXcgVmVjdG9yMigwLCAwKSxcbiAgICAgIHJlcGVhdCA9IG5ldyBWZWN0b3IyKDEsIDEpLFxuICAgICAgd3JhcCA9IFJlcGVhdFdyYXBwaW5nLFxuICAgICAgbWFwcGluZyA9IFVWTWFwcGluZyxcbiAgICAgIGZpeCA9IHRleCA9PiB0ZXhcbiAgICB9KSA9PiB7XG4gICAgICBjb25zdCB0ZXh0dXJlID0gbG9hZGVyLmxvYWQodXJsKTtcblxuICAgICAgaWYgKHdyYXAubGVuZ3RoID4gMCkge1xuICAgICAgICB0ZXh0dXJlLndyYXBTID0gd3JhcFswXTtcbiAgICAgICAgdGV4dHVyZS53cmFwVCA9IHdyYXBbMV07XG4gICAgICB9IGVsc2VcbiAgICAgICAgdGV4dHVyZS53cmFwUyA9IHRleHR1cmUud3JhcFQgPSB3cmFwO1xuXG4gICAgICB0ZXh0dXJlLm1hcHBpbmcgPSBtYXBwaW5nO1xuXG4gICAgICB0ZXh0dXJlLm9mZnNldC5jb3B5KG9mZnNldCk7XG4gICAgICB0ZXh0dXJlLnJlcGVhdC5jb3B5KHJlcGVhdCk7XG5cbiAgICAgIHRleHR1cmUubWFnRmlsdGVyID0gTmVhcmVzdEZpbHRlcjtcbiAgICAgIHRleHR1cmUubWluRmlsdGVyID0gTGluZWFyTWlwTWFwTGluZWFyRmlsdGVyO1xuXG4gICAgICB0aGlzLnRleHR1cmVzLnB1c2goW3R5cGUsIGZpeCh0ZXh0dXJlKV0pO1xuICAgIH0pO1xuICB9XG5cbiAgYnJpZGdlID0ge1xuICAgIG1hdGVyaWFsKG1hdGVyaWFsLCBzZWxmKSB7XG4gICAgICBzZWxmLnRleHR1cmVzLmZvckVhY2godGV4dHVyZSA9PiB7XG4gICAgICAgIG1hdGVyaWFsW3RleHR1cmVbMF1dID0gdGV4dHVyZVsxXTtcbiAgICAgIH0pO1xuXG4gICAgICBtYXRlcmlhbC5uZWVkc1VwZGF0ZSA9IHRydWU7XG4gICAgICByZXR1cm4gbWF0ZXJpYWw7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQge1xuICBBbmltYXRpb25NaXhlcixcbiAgQW5pbWF0aW9uQ2xpcFxufSBmcm9tICd0aHJlZSc7XG5cbmltcG9ydCB7TG9vcH0gZnJvbSAnLi4vLi4vY29yZS9Mb29wJztcblxuLyoqXG4gKiBAY2xhc3MgQW5pbWF0aW9uTW9kdWxlXG4gKiBAY2F0ZWdvcnkgbW9kdWxlcy9tZXNoXG4gKiBAZGVzY3JpcHRpb24gQ29udmVuaWVuY2UgbW9kdWxlIHRoYXQgd3JhcHMgdGhlIDxhIGhyZWY9J2h0dHBzOi8vdGhyZWVqcy5vcmcvZG9jcy8jbWFudWFsL2ludHJvZHVjdGlvbi9BbmltYXRpb24tc3lzdGVtJz50aHJlZS5qcyBhbmltYXRpb24gc3lzdGVtPC9hPlxuICogQHBhcmFtIHtBcHB9IGFwcCAtIHRoZSBhcHBcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW2lzRGVmZXJyZWQ9ZmFsc2VdIC0gc2V0IHRvIHRydWUgaWYgYW5pbWF0aW9uIHNob3VsZCBub3Qgc3RhcnQgYXV0b21hdGljYWxseVxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXM9e3NwZWVkOiAxfV0gLSB0aGUgcGFyYW1zXG4gKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvbWVzaFxuICogQGV4YW1wbGUgPGNhcHRpb24+Q3JlYXRlIGFuaW1hdGlvbiBtb2R1bGUgYW5kIHBsYXkgYSBnaXZlbiBjbGlwIG9mIGFuIGltcG9ydGVkIG1vZGVsPC9jYXB0aW9uPlxuICogY29uc3QgYW5pbWF0aW9uTW9kdWxlID0gbmV3IEFuaW1hdGlvbk1vZHVsZShhcHAsIGZhbHNlLCB7XG4gKiAgIHNwZWVkOiAxLjIgLy8gc3BlZWQgdXAgYW5pbWF0aW9uIGJ5IDIwJVxuICogfSk7XG4gKlxuICogbmV3IEltcG9ydGVyKHtcbiAqICAgcGFyc2VyKGdlb21ldHJ5LCBtYXRlcmlhbHMpIHtcbiAqICAgICAvLyBPdmVycmlkZSBwYXJzZSB0byBnZW5lcmF0ZSBhIHNraW5uZWRNZXNoLCBuZWVkZWQgZm9yIHNraW5uZWQgbW9kZWxzXG4gKiAgICAgcmV0dXJuIG5ldyBUSFJFRS5Ta2lubmVkTWVzaChnZW9tZXRyeSwgbWF0ZXJpYWxzKTtcbiAqICAgfSxcbiAqXG4gKiAgIHVybDogYHBhdGgvdG8vbW9kZWwuanNvbmAsXG4gKiAgIHVzZUN1c3RvbU1hdGVyaWFsOiB0cnVlLFxuICpcbiAqICAgbWF0ZXJpYWw6IG5ldyBUSFJFRS5NZXNoU3RhbmRhcmRNYXRlcmlhbCh7XG4gKiAgICAgc2tpbm5pbmc6IHRydWVcbiAqICAgfSksXG4gKlxuICogICBtb2R1bGVzOiBbYW5pbWF0aW9uTW9kdWxlXVxuICogfSkuYWRkVG8oYXBwKS50aGVuKCgpID0+IHtcbiAqICAgLy8gYWRkaW5nIG1vZGVsIHRvIGFwcCByZXR1cm5zIGEgcHJvbWlzZSwgc28gcGlwZSB0aGUgZnVuY3Rpb24gdG8ga2ljayBvZmYgdGhlIGFuaW1hdGlvbiBjbGlwXG4gKiAgIGFuaW1hdGlvbk1vZHVsZS5wbGF5KCdjbGlwTmFtZScpO1xuICogfSk7XG4gKi9cbmV4cG9ydCBjbGFzcyBBbmltYXRpb25Nb2R1bGUge1xuICBjb25zdHJ1Y3RvcihhcHAsIGlzRGVmZXJyZWQsIHBhcmFtcyA9IHt9KSB7XG4gICAgdGhpcy5wYXJhbXMgPSBPYmplY3QuYXNzaWduKHtcbiAgICAgIHNwZWVkOiAxXG4gICAgfSwgcGFyYW1zKTtcblxuICAgIHRoaXMuYXBwID0gYXBwO1xuICAgIHRoaXMuaXNEZWZlcnJlZCA9IGlzRGVmZXJyZWQ7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBwbGF5XG4gICAqIEBpbnN0YW5jZVxuICAgKiBAZGVzY3JpcHRpb24gUGxheXMgdGhlIGdpdmVuIGNsaXAgbmFtZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gY2xpcE5hbWUgLSB0aGUgY2xpcCB0byBwbGF5XG4gICAqIEByZXR1cm4ge1RIUkVFLkFuaW1hdGlvbkFjdGlvbn0gUGxheWluZyBhY3Rpb24gXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9tZXNoLkFuaW1hdGlvbk1vZHVsZVxuICAgKi9cbiAgcGxheShjbGlwTmFtZSkge1xuICAgIGNvbnN0IGNsaXAgPSBBbmltYXRpb25DbGlwLmZpbmRCeU5hbWUodGhpcy5jbGlwcywgY2xpcE5hbWUpO1xuICAgIHJldHVybiB0aGlzLm1peGVyLmNsaXBBY3Rpb24oY2xpcCkucGxheSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgdXBkYXRlXG4gICAqIEBpbnN0YW5jZVxuICAgKiBAZGVzY3JpcHRpb24gVXBkYXRlIHRoZSBtaXhlciAoYmVpbmcgY2FsbGVkIG9uIGZyYW1lIGFuaW1hdGlvbiBsb29wKVxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvbWVzaC5BbmltYXRpb25Nb2R1bGVcbiAgICovXG4gIHVwZGF0ZShjbG9jaykge1xuICAgIGlmICh0aGlzLm1peGVyKSB0aGlzLm1peGVyLnVwZGF0ZShjbG9jay5nZXREZWx0YSgpICogdGhpcy5wYXJhbXMuc3BlZWQpO1xuICB9XG5cbiAgaW50ZWdyYXRlKHNlbGYpIHtcbiAgICBzZWxmLmxvb3AgPSBuZXcgTG9vcCgoY2xvY2spID0+IHNlbGYudXBkYXRlKGNsb2NrKSk7XG5cbiAgICBpZiAoIXNlbGYuaXNEZWZlcnJlZCkgc2VsZi5sb29wLnN0YXJ0KHNlbGYuYXBwKTtcbiAgfVxuXG4gIG1hbmFnZXIobWFuYWdlcikge1xuICAgIG1hbmFnZXIuZGVmaW5lKCdhbmltYXRpb24nKTtcbiAgfVxuXG4gIGJyaWRnZSA9IHtcbiAgICBtZXNoKG1lc2gsIHNlbGYpIHtcbiAgICAgIG1lc2guZ2VvbWV0cnkuc2tlbGV0b24gPSBtZXNoLnNrZWxldG9uO1xuXG4gICAgICBzZWxmLm1peGVyID0gbmV3IEFuaW1hdGlvbk1peGVyKG1lc2guZ2VvbWV0cnkpO1xuICAgICAgc2VsZi5jbGlwcyA9IG1lc2guZ2VvbWV0cnkuYW5pbWF0aW9ucztcblxuICAgICAgcmV0dXJuIG1lc2g7XG4gICAgfVxuICB9XG59XG4iLCIvKiogQG1vZHVsZSBtb2R1bGVzL21lc2ggKi9cbmV4cG9ydCAqIGZyb20gJy4vRHluYW1pY0dlb21ldHJ5TW9kdWxlJztcbmV4cG9ydCAqIGZyb20gJy4vVGV4dHVyZU1vZHVsZSc7XG5leHBvcnQgKiBmcm9tICcuL0FuaW1hdGlvbk1vZHVsZSc7XG4iLCIvKipcbiAqIEBjbGFzcyBEZWZpbmVNb2R1bGVcbiAqIEBjYXRlZ29yeSBtb2R1bGVzXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtPYmplY3R9IGRhdGFcbiAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlc1xuICogQGV4YW1wbGUgPGNhcHRpb24+IENyZWF0aW5nIGEgRGVmaW5lTW9kdWxlIHdpdGggUGVyc3BlY3RpdmVDYW1lcmEgYXMgY2FtZXJhIG1vZHVsZSBhbmQgcGFzc2luZyBpdCB0byBBcHAncyBtb2R1bGVzPC9jYXB0aW9uPlxuICogbmV3IEFwcChbXG4gKiAgIC8vIC4uLlxuICogICBuZXcgRGVmaW5lTW9kdWxlKCdjYW1lcmEnLCBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoKSlcbiAqIF0pO1xuICovXG5leHBvcnQgY2xhc3MgRGVmaW5lTW9kdWxlIHtcbiAgY29uc3RydWN0b3IobmFtZSwgZGF0YSkge1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgfVxuXG4gIG1hbmFnZXIobWFuYWdlcikge1xuICAgIG1hbmFnZXIuc2V0KHRoaXMubmFtZSwgdGhpcy5kYXRhKTtcbiAgfVxufVxuIiwiLyoqIEBtb2R1bGUgbW9kdWxlcyAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2FwcC9pbmRleCc7XG5leHBvcnQgKiBmcm9tICcuL21lc2gvaW5kZXgnO1xuXG4vLyBtb2R1bGVzXG5leHBvcnQgKiBmcm9tICcuL0RlZmluZU1vZHVsZSc7XG4iLCJpbXBvcnQge0ltcG9ydGVyfSBmcm9tICcuL2NvbXBvbmVudHMvbWVzaGVzL0ltcG9ydGVyJztcbmltcG9ydCB7UGVyc3BlY3RpdmVDYW1lcmF9IGZyb20gJy4vY29tcG9uZW50cy9jYW1lcmFzL1BlcnNwZWN0aXZlQ2FtZXJhJztcblxuZXhwb3J0IGNsYXNzIE1vZGVsIGV4dGVuZHMgSW1wb3J0ZXIge1xuICBjb25zdHJ1Y3RvcihwYXJhbXMsIC4uLmFkZGl0aW9uYWwpIHtcbiAgICBjb25zb2xlLndhcm4oJ01vZGVsIGlzIGRlcHJlY2F0ZWQuIFVzZSBJbXBvcnRlciBpbnN0ZWFkLicpO1xuXG4gICAgaWYgKHBhcmFtcy5nZW9tZXRyeSkge1xuICAgICAgcGFyYW1zLnVybCA9IHBhcmFtcy5nZW9tZXRyeS5wYXRoO1xuICAgICAgcGFyYW1zLmxvYWRlciA9IHBhcmFtcy5nZW9tZXRyeS5sb2FkZXI7XG4gICAgfVxuXG4gICAgc3VwZXIocGFyYW1zLCAuLi5hZGRpdGlvbmFsKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ2FtZXJhTW9kdWxlIHtcbiAgY29uc3RydWN0b3IocGFyYW1zID0ge30pIHtcbiAgICBjb25zb2xlLndhcm4oJ0NhbWVyYU1vZHVsZSBpcyBkZXByZWNhdGVkLiBVc2UgRGVmaW5lTW9kdWxlIGluc3RlYWQuJyk7XG4gICAgdGhpcy5jYW1lcmEgPSBuZXcgUGVyc3BlY3RpdmVDYW1lcmEocGFyYW1zKTtcbiAgfVxuXG4gIGludGVncmF0ZShzZWxmKSB7XG4gICAgdGhpcy5hZGQoc2VsZi5jYW1lcmEpO1xuICB9XG5cbiAgbWFuYWdlcihtYW5hZ2VyKSB7XG4gICAgbWFuYWdlci5zZXQoJ2NhbWVyYScsIHRoaXMuY2FtZXJhKTtcbiAgfVxufVxuIiwiLyoqXG4gKiBOYW1lc3BhY2UgY29udGFpbmluZyBhbGwgY2xhc3NlcyBmcm9tIGFsbCBtb2R1bGVzLiBVc2VkIGFzIGdsb2JhbCBpbiBVTUQgcGF0dGVybi5cbiAqIEBuYW1lc3BhY2UgV0hTXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5UaGUgdXNlIG9mIFdIUyBuYW1lc3BhY2UuPC9jYXB0aW9uPlxuICogbmV3IFdIUy5BcHAoKSAvLyBjb3JlXG4gKiBuZXcgV0hTLlBlcnNwZWN0aXZlQ2FtZXJhKCkgLy8gY29tcG9uZW50c1xuICogbmV3IFdIUy5SZXNpemVNb2R1bGUoKSAvLyBtb2R1bGVzXG4gKiBXSFMuZXh0ZW5kKCkgLy8gdXRpbHNcbiAqL1xuXG5cbmV4cG9ydCAqIGZyb20gJy4vY29yZS9pbmRleCc7XG5leHBvcnQgKiBmcm9tICcuL2NvbXBvbmVudHMvbGlnaHRzL2luZGV4JztcbmV4cG9ydCAqIGZyb20gJy4vY29tcG9uZW50cy9jYW1lcmFzL2luZGV4JztcbmV4cG9ydCAqIGZyb20gJy4vY29tcG9uZW50cy9tZXNoZXMvaW5kZXgnO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9pbmRleCc7XG5leHBvcnQgKiBmcm9tICcuL21vZHVsZXMvaW5kZXgnO1xuXG4vLyBERVBSRUNBVElPTlxuZXhwb3J0ICogZnJvbSAnLi9kZXByZWNhdGlvbic7XG4iXSwibmFtZXMiOlsicmVxdWlyZSQkMCIsImRlZmluZWQiLCJ0b0ludGVnZXIiLCJhRnVuY3Rpb24iLCJpc09iamVjdCIsImRvY3VtZW50IiwicmVxdWlyZSQkMSIsInJlcXVpcmUkJDIiLCJhbk9iamVjdCIsInRvUHJpbWl0aXZlIiwiSUU4X0RPTV9ERUZJTkUiLCJkUCIsImNyZWF0ZURlc2MiLCJjb3JlIiwiZ2xvYmFsIiwiaGFzIiwiY3R4IiwiaGlkZSIsImNvZiIsIklPYmplY3QiLCJtaW4iLCJ0b0lPYmplY3QiLCJ0b0xlbmd0aCIsInRvQWJzb2x1dGVJbmRleCIsInVpZCIsIiRrZXlzIiwiZW51bUJ1Z0tleXMiLCJnZXRLZXlzIiwiSUVfUFJPVE8iLCJQUk9UT1RZUEUiLCJkUHMiLCJjcmVhdGUiLCJkZXNjcmlwdG9yIiwic2V0VG9TdHJpbmdUYWciLCJ0b09iamVjdCIsIiRpdGVyQ3JlYXRlIiwiZ2V0UHJvdG90eXBlT2YiLCJMSUJSQVJZIiwiSXRlcmF0b3JzIiwicmVkZWZpbmUiLCIkZXhwb3J0Iiwic3RlcCIsIlRBRyIsIklURVJBVE9SIiwiY2xhc3NvZiIsImdldEl0ZXJGbiIsImlzQXJyYXlJdGVyIiwiY2FsbCIsImludm9rZSIsImNlbCIsImh0bWwiLCJwcm9jZXNzIiwiUHJvbWlzZSIsIm5ld1Byb21pc2VDYXBhYmlsaXR5IiwiU1BFQ0lFUyIsIkRFU0NSSVBUT1JTIiwiVHlwZUVycm9yIiwiaXNOb2RlIiwibmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUiLCJ1c2VyQWdlbnQiLCJwZXJmb3JtIiwiYW5JbnN0YW5jZSIsInJlcXVpcmUkJDMiLCJzcGVjaWVzQ29uc3RydWN0b3IiLCJyZXF1aXJlJCQ0IiwicmVxdWlyZSQkNSIsInJlcXVpcmUkJDYiLCJwcm9taXNlUmVzb2x2ZSIsInJlcXVpcmUkJDciLCJmb3JPZiIsIl9Qcm9taXNlIiwicElFIiwiZmFpbHMiLCJ3a3NFeHQiLCJnT1BTIiwidG9TdHJpbmciLCJnT1BEIiwiJEdPUEQiLCIkRFAiLCJnT1BOIiwiZ09QTkV4dCIsIndrcyIsInNoYXJlZCIsIk9iamVjdFByb3RvIiwiVVNFX05BVElWRSIsIiRmYWlscyIsIl9jcmVhdGUiLCJlbnVtS2V5cyIsIiRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJ3a3NEZWZpbmUiLCJpc0FycmF5IiwiJE9iamVjdCIsIl9PYmplY3QkZGVmaW5lUHJvcGVydHkiLCJfT2JqZWN0JGtleXMiLCJfT2JqZWN0JGdldE93blByb3BlcnR5U3ltYm9scyIsIl9PYmplY3QkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZGVmaW5lUHJvcGVydHkiLCJfT2JqZWN0JHNldFByb3RvdHlwZU9mIiwic2V0UHJvdG90eXBlT2YiLCJfU3ltYm9sIiwiX1N5bWJvbCRpdGVyYXRvciIsIl90eXBlb2YiLCIkZ2V0UHJvdG90eXBlT2YiLCJfT2JqZWN0JGdldFByb3RvdHlwZU9mIiwiZXh0ZW5kIiwib2JqZWN0IiwiZXh0ZW5zaW9ucyIsImV4dGVuc2lvbiIsIk9iamVjdCIsImdldE93blByb3BlcnR5TmFtZXMiLCJwcm9wIiwidW5kZWZpbmVkIiwiY29uc3RydWN0b3IiLCJBcnJheSIsInNsaWNlIiwiaW5zdHJ1Y3QiLCJhcnJheSIsImluc3RBcnJheSIsInRlbXBPYmplY3QiLCJpIiwibWF4IiwibGVuZ3RoIiwiZ3VpZGUiLCJ0cmFuc2Zvcm1EYXRhIiwiaW5zdHJ1Y3Rpb25zIiwia2V5IiwidG9BcnJheSIsImluc3RydWN0aW9uIiwidGVtcEFycmF5IiwicHgiLCJyZWRlZmluZUFsbCIsInZhbGlkYXRlIiwiJGl0ZXJEZWZpbmUiLCJzZXRTcGVjaWVzIiwiYXNjIiwibWV0YSIsInN0cm9uZyIsImZyb20iLCJiaW5kIiwiX1JlZmxlY3QkY29uc3RydWN0IiwiX01hcCIsIl9PYmplY3QkY3JlYXRlIiwiY29uc3RydWN0IiwiQ29tcG9zaXRpb25FcnJvciIsImNsYXNzSW5zdGFuY2UiLCJtZXNzYWdlIiwiY29tcG9uZW50Iiwic3RhY2tBcnJheSIsInN0YWNrIiwic3BsaXQiLCJzcGxpY2UiLCJqb2luIiwiY29uc29sZSIsImVycm9yIiwibmFtZSIsIkVycm9yIiwiRGVwZW5kZW5jeUVycm9yIiwiYWN0aXZlTW9kdWxlIiwiZGVwZW5kZW5jeU1vZHVsZSIsIk1hbmFnZXJFcnJvciIsIndhcm5EZXBzIiwiUkVWSVNJT04iLCJlcnIiLCJNb2R1bGVTeXN0ZW0iLCJzb3VyY2UiLCJtb2R1bGVzIiwiYXBwbHlNb2R1bGUiLCJhcHBseUJyaWRnZSIsIm9uQ29weSIsImJyaWRnZU1hcCIsIm1vZHVsZSIsImJyaWRnZSIsImFwcGx5IiwiY2IiLCJmdW5jIiwibW9kdWxlU2NvcGUiLCJwdXNoIiwibWFuYWdlciIsImFjdGl2ZSIsImludGVncmF0ZSIsImRpc3Bvc2VNb2R1bGUiLCJpbmRleE9mIiwiZGlzcG9zZSIsIkV2ZW50cyIsImdldCIsIl9nZXRJdGVyYXRvciIsInBvbnlmaWxsIiwiJCRvYnNlcnZhYmxlIiwiTW9kdWxlTWFuYWdlciIsImhhbmRsZXIiLCJjdXJyZW50TW9kdWxlIiwic3RvcmUiLCJjcmVhdGVTdG9yZSIsInN0YXRlIiwiYWN0aW9uIiwiZGF0YSIsImRpc3BhdGNoIiwidHlwZSIsImdldFN0YXRlIiwiQm9vbGVhbiIsImRlcHNNYXAiLCJzdWJzY3JpYmUiLCJjaGFuZ2VkS2V5IiwiY2FsbGJhY2siLCJ3YXJuIiwic2V0IiwibW9kdWxlRXhlY3V0b3IiLCJ1c2UiLCJDb21wb25lbnQiLCJwYXJhbXMiLCJkZWZhdWx0cyIsImludGVncmF0ZU1vZHVsZXMiLCJwcm9taXNlIiwiX3dhaXQiLCJhbGwiLCJpc0RlZmZlcmVkIiwid2FpdCIsInRoZW4iLCJjb3B5IiwiY3VzdG9taXplIiwibmF0aXZlIiwiY2xvbmUiLCJwYXJlbnQiLCJyZW1vdmUiLCJvbkFkZCIsImFkZCIsImNoaWxkcmVuIiwiX21hbmFnZXIiLCJfbmF0aXZlIiwibWVzaCIsIl9SZWZsZWN0JGdldCIsImF0dHJpYnV0ZXMiLCJtYXBwZXJzIiwidGFyZ2V0IiwibWFwcGVyIiwiayIsIm1hcCIsImF0dHJpYnV0ZSIsInByb3RvdHlwZSIsImdldHRlciIsInNldHRlciIsImNvbmZpZ3VyYWJsZSIsImVudW1lcmFibGUiLCJ2YWx1ZSIsIm1pcnJvciIsIk1lc2hDb21wb25lbnQiLCJnZW9tIiwiTWVzaCIsImdlb21ldHJ5IiwibWF0ZXJpYWwiLCJjdXN0b20iLCJidWlsZCIsIndyYXAiLCJyZXNvbHZlIiwiYXBwbHlDb21tYW5kIiwicG9zaXRpb24iLCJyb3RhdGlvbiIsInNjYWxlIiwic2hhZG93IiwieCIsInkiLCJ6IiwiY2FzdFNoYWRvdyIsImNhc3QiLCJyZWNlaXZlU2hhZG93IiwicmVjZWl2ZSIsIm9uV3JhcCIsInF1YXRlcm5pb24iLCJkZXN0IiwiTGlnaHRDb21wb25lbnQiLCJsaWdodCIsIndyYXBTaGFkb3ciLCJkZWZlciIsIm1hcFNpemUiLCJ3aWR0aCIsImhlaWdodCIsImJpYXMiLCJyYWRpdXMiLCJzaGFkb3dDYW1lcmEiLCJjYW1lcmEiLCJuZWFyIiwiZmFyIiwiZm92IiwibGVmdCIsInJpZ2h0IiwidG9wIiwiYm90dG9tIiwiQ2FtZXJhQ29tcG9uZW50Iiwic3lzdGVtIiwid2luZG93IiwiQXBwIiwibG9nIiwidmVyc2lvbiIsInJlcXVlc3RBbmltRnJhbWUiLCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJ3ZWJraXRSZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJtb3pSZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJzZXRUaW1lb3V0IiwicmVxdWVzdCIsImVuYWJsZWQiLCJsbCIsImxvb3BzIiwiZSIsImV4ZWN1dGUiLCJjbG9jayIsImxvb3AiLCJpbmRleCIsIkxvb3AiLCJ1c2VDbG9jayIsIkNsb2NrIiwid29ybGQiLCJhZGRMb29wIiwic3RhcnQiLCJzdG9wIiwicmVtb3ZlTG9vcCIsIkFtYmllbnRMaWdodCIsIkFtYmllbnRMaWdodE5hdGl2ZSIsImNvbG9yIiwiaW50ZW5zaXR5IiwiRGlyZWN0aW9uYWxMaWdodCIsIkRpcmVjdGlvbmFsTGlnaHROYXRpdmUiLCJIZW1pc3BoZXJlTGlnaHQiLCJIZW1pc3BoZXJlTGlnaHROYXRpdmUiLCJza3lDb2xvciIsImdyb3VuZENvbG9yIiwiUG9pbnRMaWdodCIsIlBvaW50TGlnaHROYXRpdmUiLCJkaXN0YW5jZSIsImRlY2F5IiwiU3BvdExpZ2h0IiwiU3BvdExpZ2h0TmF0aXZlIiwiYW5nbGUiLCJleHBvbmVudCIsIk1hdGgiLCJQSSIsIkFyZWFMaWdodCIsIlJlY3RBcmVhTGlnaHROYXRpdmUiLCJDdWJlQ2FtZXJhIiwiQ3ViZUNhbWVyYU5hdGl2ZSIsImN1YmVSZXNvbHV0aW9uIiwiT3J0aG9ncmFwaGljQ2FtZXJhIiwiT3J0aG9ncmFwaGljQ2FtZXJhTmF0aXZlIiwiaW5uZXJXaWR0aCIsImlubmVySGVpZ2h0IiwiUGVyc3BlY3RpdmVDYW1lcmEiLCJQZXJzcGVjdGl2ZUNhbWVyYU5hdGl2ZSIsImFzcGVjdCIsIkJveCIsImJ1aWxkR2VvbWV0cnkiLCJidWZmZXIiLCJCb3hCdWZmZXJHZW9tZXRyeSIsIkJveEdlb21ldHJ5IiwiZGVwdGgiLCJ3aWR0aFNlZ21lbnRzIiwiaGVpZ2h0U2VnbWVudHMiLCJkZXB0aFNlZ21lbnRzIiwiQ2lyY2xlIiwiQ2lyY2xlQnVmZmVyR2VvbWV0cnkiLCJDaXJjbGVHZW9tZXRyeSIsInNlZ21lbnRzIiwidGhldGFTdGFydCIsInRoZXRhTGVuZ3RoIiwiQ29uZSIsIkNvbmVCdWZmZXJHZW9tZXRyeSIsIkNvbmVHZW9tZXRyeSIsInJhZGl1c1NlZ21lbnRzIiwib3BlbkVuZGVkIiwiQ3lsaW5kZXIiLCJDeWxpbmRlckJ1ZmZlckdlb21ldHJ5IiwiQ3lsaW5kZXJHZW9tZXRyeSIsInJhZGl1c1RvcCIsInJhZGl1c0JvdHRvbSIsIkRvZGVjYWhlZHJvbiIsIkRvZGVjYWhlZHJvbkJ1ZmZlckdlb21ldHJ5IiwiRG9kZWNhaGVkcm9uR2VvbWV0cnkiLCJkZXRhaWwiLCJFeHRydWRlIiwiRXh0cnVkZUdlb21ldHJ5Iiwic2hhcGVzIiwib3B0aW9ucyIsIkJ1ZmZlckdlb21ldHJ5IiwiZnJvbUdlb21ldHJ5IiwiSWNvc2FoZWRyb24iLCJJY29zYWhlZHJvbkJ1ZmZlckdlb21ldHJ5IiwiSWNvc2FoZWRyb25HZW9tZXRyeSIsIkxhdGhlIiwiTGF0aGVCdWZmZXJHZW9tZXRyeSIsIkxhdGhlR2VvbWV0cnkiLCJwb2ludHMiLCJMaW5lIiwiTGluZU5hdGl2ZSIsIkdlb21ldHJ5IiwicHAiLCJjdXJ2ZSIsImdldFBvaW50cyIsInZlcnRzIiwiRmxvYXQzMkFycmF5IiwiaTMiLCJhZGRBdHRyaWJ1dGUiLCJCdWZmZXJBdHRyaWJ1dGUiLCJ2ZXJ0aWNlcyIsIkltcG9ydGVyIiwiZmlsdGVyIiwicHJvY2Vzc0ZpbHRlciIsImZvckVhY2giLCJlbCIsInRleHR1cmVQYXRoIiwibG9hZGVyIiwic2V0VGV4dHVyZVBhdGgiLCJsb2FkIiwidXJsIiwib25Mb2FkIiwicGFyc2VyIiwib25Qcm9ncmVzcyIsIm9uRXJyb3IiLCJKU09OTG9hZGVyIiwidXNlQ3VzdG9tTWF0ZXJpYWwiLCJtYXQiLCJib25lcyIsIlNraW5uZWRNZXNoIiwiT2N0YWhlZHJvbiIsIk9jdGFoZWRyb25CdWZmZXJHZW9tZXRyeSIsIk9jdGFoZWRyb25HZW9tZXRyeSIsIlBhcmFtZXRyaWMiLCJQYXJhbWV0cmljQnVmZmVyR2VvbWV0cnkiLCJQYXJhbWV0cmljR2VvbWV0cnkiLCJzbGljZXMiLCJzdGFja3MiLCJ1IiwidiIsIlZlY3RvcjMiLCJQbGFuZSIsIlBsYW5lQnVmZmVyR2VvbWV0cnkiLCJQbGFuZUdlb21ldHJ5Iiwid1NlZ21lbnRzIiwiaFNlZ21lbnRzIiwidmVydGljZXNPZkN1YmUiLCJpbmRpY2VzT2ZGYWNlcyIsIlBvbHloZWRyb24iLCJQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnkiLCJQb2x5aGVkcm9uR2VvbWV0cnkiLCJSaW5nIiwiUmluZ0J1ZmZlckdlb21ldHJ5IiwiUmluZ0dlb21ldHJ5IiwiaW5uZXJSYWRpdXMiLCJvdXRlclJhZGl1cyIsInRoZXRhU2VnbWVudHMiLCJwaGlTZWdtZW50cyIsIlNoYXBlIiwiU2hhcGVCdWZmZXJHZW9tZXRyeSIsIlNoYXBlR2VvbWV0cnkiLCJTcGhlcmUiLCJTcGhlcmVCdWZmZXJHZW9tZXRyeSIsIlNwaGVyZUdlb21ldHJ5IiwiVGV0cmFoZWRyb24iLCJUZXRyYWhlZHJvbkJ1ZmZlckdlb21ldHJ5IiwiVGV0cmFoZWRyb25HZW9tZXRyeSIsIlRleHQiLCJwYXRoIiwiZm9udCIsIlRleHRHZW9tZXRyeSIsInRleHQiLCJhc3NpZ24iLCJzaXplIiwiY3VydmVTZWdtZW50cyIsIkZvbnQiLCJiZXZlbEVuYWJsZWQiLCJiZXZlbFRoaWNrbmVzcyIsImJldmVsU2l6ZSIsIkZvbnRMb2FkZXIiLCJUb3J1cyIsIlRvcnVzR2VvbWV0cnkiLCJ0dWJlIiwicmFkaWFsU2VnbWVudHMiLCJ0dWJ1bGFyU2VnbWVudHMiLCJhcmMiLCJUb3J1c2tub3QiLCJHQ29uc3RydWN0IiwiVG9ydXNLbm90QnVmZmVyR2VvbWV0cnkiLCJUb3J1c0tub3RHZW9tZXRyeSIsInAiLCJxIiwiVHViZSIsIlR1YmVCdWZmZXJHZW9tZXRyeSIsIlR1YmVHZW9tZXRyeSIsImNsb3NlZCIsIkxpbmVDdXJ2ZTMiLCJHcm91cCIsIm9iaiIsImFkZFRvIiwiT2JqZWN0M0QiLCJFbGVtZW50TW9kdWxlIiwiY29udGFpbmVyIiwiYm9keSIsImNyZWF0ZUVsZW1lbnQiLCJlbGVtZW50IiwiY2xhc3NOYW1lIiwic3R5bGUiLCJzZWxmIiwiYXBwZW5kQ2hpbGQiLCJSZW5kZXJpbmdNb2R1bGUiLCJhZGRpdGlvbmFsIiwicmVzb2x1dGlvbiIsIlZlY3RvcjIiLCJwaXhlbFJhdGlvIiwiZGV2aWNlUGl4ZWxSYXRpbyIsImJnQ29sb3IiLCJiZ09wYWNpdHkiLCJyZW5kZXJlciIsImZpeCIsIldlYkdMUmVuZGVyZXIiLCJlZmZlY3RzIiwic2V0Q2xlYXJDb2xvciIsInNldFBpeGVsUmF0aW8iLCJzZXRTaXplIiwiTnVtYmVyIiwidG9GaXhlZCIsImFwcGx5QWRkaXRpb25hbCIsInNjZW5lIiwiYXR0YWNoVG9DYW52YXMiLCJyZW5kZXIiLCJlZmZlY3QiLCJlZmZlY3RMb29wIiwicmVuZGVyTG9vcCIsImdldFNpemUiLCJhcHAiLCJjYW52YXMiLCJkb21FbGVtZW50IiwiZGVmaW5lIiwiaW50ZWdyYXRlUmVuZGVyZXIiLCJ1cGRhdGUiLCJmb3JjZUNvbnRleHRMb3NzIiwic2hhZG93TWFwIiwiU1lNQk9MX0NISUxEUkVOX0ZPUl9TQ0VORSIsIlN5bWJvbCIsIlNjZW5lTW9kdWxlIiwid2lsbFNjZW5lQmVSZXBsYWNlZCIsIlNjZW5lIiwib25SZW1vdmUiLCJfc2V0U2NlbmUiLCJzZXRTY2VuZSIsImdldFNjZW5lIiwiUmVzaXplTW9kdWxlIiwiYXV0byIsImNhbGxiYWNrcyIsInVwZGF0ZVByb2plY3Rpb25NYXRyaXgiLCJyZW5kZXJpbmciLCJvZmZzZXRXaWR0aCIsIm9mZnNldEhlaWdodCIsImdldENvbnRhaW5lciIsImdldFJlc29sdXRpb24iLCJhZGRFdmVudExpc3RlbmVyIiwidHJpZ2dlciIsImFkZEF1dG9yZXNpemUiLCJmcmFnbWVudCIsInZlcnRleCIsIkFkYXB0aXZlTHVtaW5vc2l0eU1hdGVyaWFsIiwiZGVmaW5lcyIsIk1JUF9MRVZFTF8xWDEiLCJ1bmlmb3JtcyIsInRQcmV2aW91c0x1bSIsIlVuaWZvcm0iLCJ0Q3VycmVudEx1bSIsIm1pbkx1bWluYW5jZSIsImRlbHRhIiwidGF1IiwiZnJhZ21lbnRTaGFkZXIiLCJ2ZXJ0ZXhTaGFkZXIiLCJkZXB0aFdyaXRlIiwiZGVwdGhUZXN0IiwiU2hhZGVyTWF0ZXJpYWwiLCJCb2tlaE1hdGVyaWFsIiwic2V0dGluZ3MiLCJmb2N1cyIsImRvZiIsImFwZXJ0dXJlIiwibWF4Qmx1ciIsImNhbWVyYU5lYXIiLCJjYW1lcmFGYXIiLCJ0RGlmZnVzZSIsInREZXB0aCIsImFkb3B0Q2FtZXJhU2V0dGluZ3MiLCJDb2xvckVkZ2VzTWF0ZXJpYWwiLCJ0ZXhlbFNpemUiLCJFREdFX1RIUkVTSE9MRCIsInRocmVzaG9sZCIsIm5lZWRzVXBkYXRlIiwiQ29tYmluZU1hdGVyaWFsIiwic2NyZWVuTW9kZSIsInRleHR1cmUxIiwidGV4dHVyZTIiLCJvcGFjaXR5MSIsIm9wYWNpdHkyIiwic2V0U2NyZWVuTW9kZUVuYWJsZWQiLCJTQ1JFRU5fTU9ERSIsIkNvbnZvbHV0aW9uTWF0ZXJpYWwiLCJoYWxmVGV4ZWxTaXplIiwia2VybmVsIiwic2V0VGV4ZWxTaXplIiwia2VybmVsU2l6ZSIsIktlcm5lbFNpemUiLCJMQVJHRSIsImtlcm5lbFByZXNldHMiLCJtdWx0aXBseVNjYWxhciIsIlZFUllfU01BTEwiLCJTTUFMTCIsIk1FRElVTSIsIlZFUllfTEFSR0UiLCJIVUdFIiwiQ29weU1hdGVyaWFsIiwib3BhY2l0eSIsIkRlcHRoQ29tcGFyaXNvbk1hdGVyaWFsIiwiZGVwdGhUZXh0dXJlIiwibW9ycGhUYXJnZXRzIiwic2tpbm5pbmciLCJQRVJTUEVDVElWRV9DQU1FUkEiLCJEb3RTY3JlZW5NYXRlcmlhbCIsImF2ZXJhZ2UiLCJvZmZzZXRSZXBlYXQiLCJWZWN0b3I0Iiwic2V0QXZlcmFnZUVuYWJsZWQiLCJBVkVSQUdFIiwiRmlsbU1hdGVyaWFsIiwibm9pc2UiLCJzY2FubGluZXMiLCJncmlkIiwiZ3JleXNjYWxlIiwic2VwaWEiLCJ2aWduZXR0ZSIsImVza2lsIiwibm9pc2VJbnRlbnNpdHkiLCJzY2FubGluZUludGVuc2l0eSIsImdyaWRJbnRlbnNpdHkiLCJncmV5c2NhbGVJbnRlbnNpdHkiLCJzZXBpYUludGVuc2l0eSIsInZpZ25ldHRlT2Zmc2V0IiwidmlnbmV0dGVEYXJrbmVzcyIsInRpbWUiLCJzY2FubGluZUNvdW50IiwiZ3JpZFNjYWxlIiwiZ3JpZExpbmVXaWR0aCIsInNldE5vaXNlRW5hYmxlZCIsInNldFNjYW5saW5lc0VuYWJsZWQiLCJzZXRHcmlkRW5hYmxlZCIsInNldEdyZXlzY2FsZUVuYWJsZWQiLCJzZXRTZXBpYUVuYWJsZWQiLCJzZXRWaWduZXR0ZUVuYWJsZWQiLCJzZXRFc2tpbEVuYWJsZWQiLCJOT0lTRSIsIlNDQU5MSU5FUyIsIkdSSUQiLCJHUkVZU0NBTEUiLCJTRVBJQSIsIlZJR05FVFRFIiwiRVNLSUwiLCJHbGl0Y2hNYXRlcmlhbCIsInRQZXJ0dXJiIiwiYW1vdW50Iiwic2VlZCIsInNlZWRYIiwic2VlZFkiLCJkaXN0b3J0aW9uWCIsImRpc3RvcnRpb25ZIiwiY29sUyIsIkdvZFJheXNNYXRlcmlhbCIsImV4cG9zdXJlIiwiZGVuc2l0eSIsIndlaWdodCIsImNsYW1wTWF4IiwiTlVNX1NBTVBMRVNfRkxPQVQiLCJOVU1fU0FNUExFU19JTlQiLCJsaWdodFBvc2l0aW9uIiwiTHVtaW5vc2l0eU1hdGVyaWFsIiwiY29sb3JPdXRwdXQiLCJsdW1pbmFuY2VSYW5nZSIsIm1hc2tMdW1pbmFuY2UiLCJkaXN0aW5jdGlvbiIsInJhbmdlIiwic2V0Q29sb3JPdXRwdXRFbmFibGVkIiwic2V0THVtaW5hbmNlUmFuZ2VFbmFibGVkIiwiQ09MT1IiLCJSQU5HRSIsIk91dGxpbmVCbGVuZE1hdGVyaWFsIiwiZWRnZVN0cmVuZ3RoIiwicGF0dGVyblNjYWxlIiwidmlzaWJsZUVkZ2VDb2xvciIsImhpZGRlbkVkZ2VDb2xvciIsImFscGhhQmxlbmRpbmciLCJ4UmF5IiwicHVsc2UiLCJ0TWFzayIsInRFZGdlcyIsInRQYXR0ZXJuIiwiQ29sb3IiLCJzZXRBbHBoYUJsZW5kaW5nRW5hYmxlZCIsInNldFhSYXlFbmFibGVkIiwiQUxQSEFfQkxFTkRJTkciLCJYX1JBWSIsInRleHR1cmUiLCJVU0VfUEFUVEVSTiIsIk91dGxpbmVFZGdlc01hdGVyaWFsIiwiUGl4ZWxhdGlvbk1hdGVyaWFsIiwiZ3JhbnVsYXJpdHkiLCJkeCIsImR5IiwiUmVhbGlzdGljQm9rZWhNYXRlcmlhbCIsInJpbmdzIiwic2FtcGxlcyIsInNob3dGb2N1cyIsIm1hbnVhbERvRiIsInBlbnRhZ29uIiwic2hhZGVyRm9jdXMiLCJsdW1pbmFuY2VUaHJlc2hvbGQiLCJsdW1pbmFuY2VHYWluIiwiZnJpbmdlIiwiZGl0aGVyU3RyZW5ndGgiLCJSSU5HU19JTlQiLCJSSU5HU19GTE9BVCIsIlNBTVBMRVNfSU5UIiwiU0FNUExFU19GTE9BVCIsImZvY2FsTGVuZ3RoIiwiZm9jYWxTdG9wIiwiZm9jdXNDb29yZHMiLCJmb2NhbERlcHRoIiwic2V0U2hvd0ZvY3VzRW5hYmxlZCIsInNldE1hbnVhbERlcHRoT2ZGaWVsZEVuYWJsZWQiLCJzZXRQZW50YWdvbkVuYWJsZWQiLCJzZXRTaGFkZXJGb2N1c0VuYWJsZWQiLCJTSE9XX0ZPQ1VTIiwiTUFOVUFMX0RPRiIsIlBFTlRBR09OIiwiU0hBREVSX0ZPQ1VTIiwiZ2V0Rm9jYWxMZW5ndGgiLCJTaG9ja1dhdmVNYXRlcmlhbCIsIm1heFJhZGl1cyIsIndhdmVTaXplIiwiYW1wbGl0dWRlIiwiY2VudGVyIiwiY2FtZXJhRGlzdGFuY2UiLCJTTUFBQmxlbmRNYXRlcmlhbCIsInRXZWlnaHRzIiwiU01BQVdlaWdodHNNYXRlcmlhbCIsIk1BWF9TRUFSQ0hfU1RFUFNfSU5UIiwiTUFYX1NFQVJDSF9TVEVQU19GTE9BVCIsIkFSRUFURVhfTUFYX0RJU1RBTkNFIiwiQVJFQVRFWF9QSVhFTF9TSVpFIiwiQVJFQVRFWF9TVUJURVhfU0laRSIsIlNFQVJDSFRFWF9TSVpFIiwiU0VBUkNIVEVYX1BBQ0tFRF9TSVpFIiwidEFyZWEiLCJ0U2VhcmNoIiwic3RlcHMiLCJUb25lTWFwcGluZ01hdGVyaWFsIiwibHVtaW5hbmNlTWFwIiwiYXZlcmFnZUx1bWluYW5jZSIsIm1heEx1bWluYW5jZSIsIm1pZGRsZUdyZXkiLCJQYXNzIiwicXVhZCIsImZydXN0dW1DdWxsZWQiLCJyZW5kZXJUb1NjcmVlbiIsIm5lZWRzU3dhcCIsImlucHV0QnVmZmVyIiwib3V0cHV0QnVmZmVyIiwic3RlbmNpbFRlc3QiLCJhbHBoYSIsImtleXMiLCJCbHVyUGFzcyIsInJlbmRlclRhcmdldFgiLCJXZWJHTFJlbmRlclRhcmdldCIsIm1pbkZpbHRlciIsIkxpbmVhckZpbHRlciIsIm1hZ0ZpbHRlciIsInN0ZW5jaWxCdWZmZXIiLCJkZXB0aEJ1ZmZlciIsImdlbmVyYXRlTWlwbWFwcyIsInJlbmRlclRhcmdldFkiLCJyZXNvbHV0aW9uU2NhbGUiLCJjb252b2x1dGlvbk1hdGVyaWFsIiwiZGl0aGVyZWRDb252b2x1dGlvbk1hdGVyaWFsIiwiZGl0aGVyaW5nIiwiZ2V0S2VybmVsIiwibGFzdFJUIiwiZGVzdFJUIiwibCIsImZsb29yIiwiZm9ybWF0IiwiUkdCRm9ybWF0IiwiQmxvb21QYXNzIiwicmVuZGVyVGFyZ2V0IiwiYmx1clBhc3MiLCJjb21iaW5lTWF0ZXJpYWwiLCJsdW1pbm9zaXR5TWF0ZXJpYWwiLCJibGVuZCIsImluaXRpYWxpemUiLCJCb2tlaFBhc3MiLCJDbGVhck1hc2tQYXNzIiwiYnVmZmVycyIsInN0ZW5jaWwiLCJzZXRUZXN0IiwiQ2xlYXJQYXNzIiwiY2xlYXJDb2xvciIsImNsZWFyQWxwaGEiLCJnZXRDbGVhckNvbG9yIiwiZ2V0Q2xlYXJBbHBoYSIsInNldFJlbmRlclRhcmdldCIsImNsZWFyIiwiRG90U2NyZWVuUGFzcyIsInciLCJGaWxtUGFzcyIsInNjYW5saW5lRGVuc2l0eSIsInJvdW5kIiwicmFuZG9tSW50IiwibG93IiwiaGlnaCIsInJhbmRvbSIsInJhbmRvbUZsb2F0IiwiR2xpdGNoUGFzcyIsInBlcnR1cmJNYXAiLCJnZW5lcmF0ZVBlcnR1cmJNYXAiLCJkdFNpemUiLCJtb2RlIiwiR2xpdGNoTW9kZSIsIlNQT1JBRElDIiwiY291bnRlciIsImJyZWFrUG9pbnQiLCJwaXhlbHMiLCJkdCIsIkRhdGFUZXh0dXJlIiwiRmxvYXRUeXBlIiwiQ09OU1RBTlRfV0lMRCIsIkNPTlNUQU5UX01JTEQiLCJSZW5kZXJQYXNzIiwiY2xlYXJQYXNzIiwib3ZlcnJpZGVNYXRlcmlhbCIsImNsZWFyRGVwdGgiLCJjbGFtcCIsIkdvZFJheXNQYXNzIiwibGlnaHRTb3VyY2UiLCJsaWdodFNjZW5lIiwibWFpblNjZW5lIiwibWFpbkNhbWVyYSIsInJlbmRlclRhcmdldE1hc2siLCJyZW5kZXJQYXNzTGlnaHQiLCJyZW5kZXJQYXNzTWFzayIsIk1lc2hCYXNpY01hdGVyaWFsIiwic2NyZWVuUG9zaXRpb24iLCJnb2RSYXlzTWF0ZXJpYWwiLCJiYWNrZ3JvdW5kIiwicHJvamVjdCIsInBhcnNlSW50IiwiTWFza1Bhc3MiLCJpbnZlcnNlIiwiY2xlYXJTdGVuY2lsIiwiY29udGV4dCIsIndyaXRlVmFsdWUiLCJjbGVhclZhbHVlIiwic2V0TWFzayIsInNldExvY2tlZCIsInNldE9wIiwiUkVQTEFDRSIsInNldEZ1bmMiLCJBTFdBWVMiLCJzZXRDbGVhciIsIkVRVUFMIiwiS0VFUCIsIlNoYWRlclBhc3MiLCJ0ZXh0dXJlSUQiLCJPdXRsaW5lUGFzcyIsInJlbmRlclRhcmdldERlcHRoIiwicmVuZGVyVGFyZ2V0RWRnZXMiLCJyZW5kZXJUYXJnZXRCbHVycmVkRWRnZXMiLCJyZW5kZXJQYXNzRGVwdGgiLCJNZXNoRGVwdGhNYXRlcmlhbCIsImRlcHRoUGFja2luZyIsIlJHQkFEZXB0aFBhY2tpbmciLCJjb3B5UGFzcyIsIm91dGxpbmVFZGdlc01hdGVyaWFsIiwib3V0bGluZUJsZW5kTWF0ZXJpYWwiLCJibHVyIiwic2VsZWN0aW9uIiwicHVsc2VTcGVlZCIsInNlbGVjdGlvbkxheWVyIiwic2V0UGF0dGVyblRleHR1cmUiLCJvYmplY3RzIiwiY2xlYXJTZWxlY3Rpb24iLCJsYXllcnMiLCJlbmFibGUiLCJkaXNhYmxlIiwidmlzaWJsZSIsIm1hc2siLCJjb3MiLCJzZXRTZWxlY3Rpb25WaXNpYmxlIiwiUGl4ZWxhdGlvblBhc3MiLCJzZXRSZXNvbHV0aW9uIiwiUmVhbGlzdGljQm9rZWhQYXNzIiwiU2F2ZVBhc3MiLCJyZXNpemUiLCJIQUxGX1BJIiwiYWIiLCJTaG9ja1dhdmVQYXNzIiwiZXBpY2VudGVyIiwic3BlZWQiLCJzaG9ja1dhdmVNYXRlcmlhbCIsImNvcHlNYXRlcmlhbCIsImdldFdvcmxkRGlyZWN0aW9uIiwic3ViIiwiYW5nbGVUbyIsImRpc3RhbmNlVG8iLCJTTUFBUGFzcyIsInNlYXJjaEltYWdlIiwiYXJlYUltYWdlIiwicmVuZGVyVGFyZ2V0Q29sb3JFZGdlcyIsInJlbmRlclRhcmdldFdlaWdodHMiLCJSR0JBRm9ybWF0IiwiY29sb3JFZGdlc01hdGVyaWFsIiwid2VpZ2h0c01hdGVyaWFsIiwic2VhcmNoVGV4dHVyZSIsIlRleHR1cmUiLCJOZWFyZXN0RmlsdGVyIiwiZmxpcFkiLCJhcmVhVGV4dHVyZSIsImJsZW5kTWF0ZXJpYWwiLCJzZWFyY2hJbWFnZURhdGFVUkwiLCJhcmVhSW1hZ2VEYXRhVVJMIiwiVGV4dHVyZVBhc3MiLCJvcGFjaXR5U291cmNlIiwiVG9uZU1hcHBpbmdQYXNzIiwicmVuZGVyVGFyZ2V0THVtaW5vc2l0eSIsIkxpbmVhck1pcE1hcExpbmVhckZpbHRlciIsInJlbmRlclRhcmdldEFkYXB0ZWQiLCJyZW5kZXJUYXJnZXRQcmV2aW91cyIsImFkYXB0aXZlTHVtaW5vc2l0eU1hdGVyaWFsIiwidG9uZU1hcHBpbmdNYXRlcmlhbCIsImFkYXB0aXZlIiwiY2VpbCIsImxvZzIiLCJwb3ciLCJBREFQVEVEX0xVTUlOQU5DRSIsIkVmZmVjdENvbXBvc2VyIiwiYXV0b0NsZWFyIiwiY3JlYXRlQnVmZmVyIiwicGFzc2VzIiwib2xkUmVuZGVyZXIiLCJvbGRTaXplIiwibmV3U2l6ZSIsInBhcmVudE5vZGUiLCJyZW1vdmVDaGlsZCIsImRyYXdpbmdCdWZmZXJTaXplIiwiZ2V0RHJhd2luZ0J1ZmZlclNpemUiLCJnZXRDb250ZXh0QXR0cmlidXRlcyIsIkRlcHRoVGV4dHVyZSIsIkRlcHRoU3RlbmNpbEZvcm1hdCIsIlVuc2lnbmVkSW50MjQ4VHlwZSIsInBhc3MiLCJOT1RFUVVBTCIsInBvbHlmaWxsIiwibWV0aG9kIiwic2hvd1dhcm4iLCJQb3N0UHJvY2Vzc29yTW9kdWxlIiwiZGVidWciLCJjb21wb3NlciIsImdldERlbHRhIiwicmVwbGFjZVJlbmRlcmVyIiwiYWRkUGFzcyIsImN1cnJlbnRQYXNzIiwiYm9vbCIsIkV2ZW50c1BhdGNoTW9kdWxlIiwib3JpZ2luT2JqZWN0IiwiZGVzdE9iamVjdCIsImV2ZW50cyIsImV2ZW50IiwiZW1pdCIsInBhdGNoRXZlbnRzIiwiVmlydHVhbE1vdXNlTW9kdWxlIiwiZ2xvYmFsTW92ZW1lbnQiLCJSYXljYXN0ZXIiLCJjdXN0b21YIiwiY3VzdG9tWSIsInJlY3QiLCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCJjbGllbnRYIiwiY2xpZW50WSIsIm1vdXNlIiwicHJvamVjdGlvblBsYW5lIiwibm9ybWFsIiwicmF5Y2FzdGVyIiwic2V0RnJvbUNhbWVyYSIsInJlcXVpcmUiLCJvbiIsImV2IiwiZ2xvYmFsWCIsImdsb2JhbFkiLCJwb2ludGVyTG9ja0VsZW1lbnQiLCJtb3ZlbWVudFgiLCJtb3ZlbWVudFkiLCJuZXN0ZWQiLCJpc0hvdmVyZWQiLCJob3ZlcnMiLCJ0cmF2ZXJzZSIsImNoaWxkIiwiaW50ZXJzZWN0T2JqZWN0cyIsImludGVyc2VjdE9iamVjdCIsInBsYW5lIiwicmF5IiwiaW50ZXJzZWN0UGxhbmUiLCJpbnRlcnNlY3Rpb24iLCJDb250cm9sc01vZHVsZSIsImNvbnRyb2xzIiwiYyIsInVwZGF0ZUxvb3AiLCJGb2dNb2R1bGUiLCJmb2ciLCJGb2dFeHAyIiwiRm9nIiwiaXNFcXVhbERlZmF1bHQiLCJhIiwiYiIsImVxdWFscyIsIlN0YXRlTW9kdWxlIiwiaXNFcXVhbCIsImVxdWFsQ2hlY2siLCJhY3Rpb25HZW5lcmF0ZSIsImNvbmZpZ3VyYXRpb24iLCJjdXJyZW50Q29uZmlnIiwicHJldkNvbmZpZyIsImNvbmZpZyIsImRlZmF1bHQiLCJyZXBsYWNlUmVkdWNlciIsImNvbmZpZ3MiLCJ1cGRhdGVzIiwiY29uZmlnTmFtZSIsInRydWVWYWwiLCJmYWxzZVZhbCIsIlRocmVlT3JiaXRDb250cm9scyIsImV2ZW50SGFuZGxlciIsIm1pbkRpc3RhbmNlIiwibWF4RGlzdGFuY2UiLCJJbmZpbml0eSIsIm1pblpvb20iLCJtYXhab29tIiwibWluUG9sYXJBbmdsZSIsIm1heFBvbGFyQW5nbGUiLCJtaW5BemltdXRoQW5nbGUiLCJtYXhBemltdXRoQW5nbGUiLCJlbmFibGVEYW1waW5nIiwiZGFtcGluZ0ZhY3RvciIsImVuYWJsZVpvb20iLCJ6b29tU3BlZWQiLCJlbmFibGVSb3RhdGUiLCJyb3RhdGVTcGVlZCIsImVuYWJsZVBhbiIsImtleVBhblNwZWVkIiwiYXV0b1JvdGF0ZSIsImF1dG9Sb3RhdGVTcGVlZCIsImVuYWJsZUtleXMiLCJMRUZUIiwiVVAiLCJSSUdIVCIsIkJPVFRPTSIsIm1vdXNlQnV0dG9ucyIsIk9SQklUIiwiTU9VU0UiLCJaT09NIiwiTUlERExFIiwiUEFOIiwidGFyZ2V0MCIsInBvc2l0aW9uMCIsInpvb20wIiwiem9vbSIsImdldFBvbGFyQW5nbGUiLCJzcGhlcmljYWwiLCJwaGkiLCJnZXRBemltdXRoYWxBbmdsZSIsInRoZXRhIiwicmVzZXQiLCJkaXNwYXRjaEV2ZW50IiwiY2hhbmdlRXZlbnQiLCJTVEFURSIsIk5PTkUiLCJvZmZzZXQiLCJxdWF0IiwiUXVhdGVybmlvbiIsInNldEZyb21Vbml0VmVjdG9ycyIsInVwIiwicXVhdEludmVyc2UiLCJsYXN0UG9zaXRpb24iLCJsYXN0UXVhdGVybmlvbiIsImFwcGx5UXVhdGVybmlvbiIsInNldEZyb21WZWN0b3IzIiwicm90YXRlTGVmdCIsImdldEF1dG9Sb3RhdGlvbkFuZ2xlIiwic3BoZXJpY2FsRGVsdGEiLCJtYWtlU2FmZSIsInBhbk9mZnNldCIsInNldEZyb21TcGhlcmljYWwiLCJsb29rQXQiLCJ6b29tQ2hhbmdlZCIsImRpc3RhbmNlVG9TcXVhcmVkIiwiRVBTIiwiZG90IiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsIm9uQ29udGV4dE1lbnUiLCJvbk1vdXNlRG93biIsIm9uTW91c2VXaGVlbCIsIm9uVG91Y2hTdGFydCIsIm9uVG91Y2hFbmQiLCJvblRvdWNoTW92ZSIsIm9uTW91c2VNb3ZlIiwib25Nb3VzZVVwIiwib25LZXlEb3duIiwic3RhcnRFdmVudCIsImVuZEV2ZW50IiwiUk9UQVRFIiwiRE9MTFkiLCJUT1VDSF9ST1RBVEUiLCJUT1VDSF9ET0xMWSIsIlRPVUNIX1BBTiIsIlNwaGVyaWNhbCIsInJvdGF0ZVN0YXJ0Iiwicm90YXRlRW5kIiwicm90YXRlRGVsdGEiLCJwYW5TdGFydCIsInBhbkVuZCIsInBhbkRlbHRhIiwiZG9sbHlTdGFydCIsImRvbGx5RW5kIiwiZG9sbHlEZWx0YSIsImdldFpvb21TY2FsZSIsInJvdGF0ZVVwIiwicGFuTGVmdCIsIm9iamVjdE1hdHJpeCIsInNldEZyb21NYXRyaXhDb2x1bW4iLCJwYW5VcCIsInBhbiIsImRlbHRhWCIsImRlbHRhWSIsInRhcmdldERpc3RhbmNlIiwidGFuIiwiY2xpZW50SGVpZ2h0IiwibWF0cml4IiwiY2xpZW50V2lkdGgiLCJkb2xseUluIiwiZG9sbHlTY2FsZSIsImRvbGx5T3V0IiwiaGFuZGxlTW91c2VEb3duUm90YXRlIiwiaGFuZGxlTW91c2VEb3duRG9sbHkiLCJoYW5kbGVNb3VzZURvd25QYW4iLCJoYW5kbGVNb3VzZU1vdmVSb3RhdGUiLCJzdWJWZWN0b3JzIiwiaGFuZGxlTW91c2VNb3ZlRG9sbHkiLCJoYW5kbGVNb3VzZU1vdmVQYW4iLCJoYW5kbGVNb3VzZVdoZWVsIiwiaGFuZGxlS2V5RG93biIsImtleUNvZGUiLCJoYW5kbGVUb3VjaFN0YXJ0Um90YXRlIiwidG91Y2hlcyIsInBhZ2VYIiwicGFnZVkiLCJoYW5kbGVUb3VjaFN0YXJ0RG9sbHkiLCJzcXJ0IiwiaGFuZGxlVG91Y2hTdGFydFBhbiIsImhhbmRsZVRvdWNoTW92ZVJvdGF0ZSIsImhhbmRsZVRvdWNoTW92ZURvbGx5IiwiaGFuZGxlVG91Y2hNb3ZlUGFuIiwicHJldmVudERlZmF1bHQiLCJidXR0b24iLCJoYW5kbGVNb3VzZVVwIiwic3RvcFByb3BhZ2F0aW9uIiwiaGFuZGxlVG91Y2hFbmQiLCJFdmVudERpc3BhdGNoZXIiLCJPcmJpdENvbnRyb2xzTW9kdWxlIiwiZm9sbG93IiwidXBkYXRlUHJvY2Vzc29yIiwic2V0Q29udHJvbHMiLCJzZXRVcGRhdGUiLCJEeW5hbWljR2VvbWV0cnlNb2R1bGUiLCJnXyIsInVwZGF0ZVBhcmFtcyIsInBhcmFtZXRlcnMiLCJUZXh0dXJlTG9hZGVyIiwiVGV4dHVyZU1vZHVsZSIsInRleHR1cmVzIiwicmVwZWF0IiwiUmVwZWF0V3JhcHBpbmciLCJtYXBwaW5nIiwiVVZNYXBwaW5nIiwidGV4Iiwid3JhcFMiLCJ3cmFwVCIsIkFuaW1hdGlvbk1vZHVsZSIsImlzRGVmZXJyZWQiLCJza2VsZXRvbiIsIm1peGVyIiwiQW5pbWF0aW9uTWl4ZXIiLCJjbGlwcyIsImFuaW1hdGlvbnMiLCJjbGlwTmFtZSIsImNsaXAiLCJBbmltYXRpb25DbGlwIiwiZmluZEJ5TmFtZSIsImNsaXBBY3Rpb24iLCJwbGF5IiwiRGVmaW5lTW9kdWxlIiwiTW9kZWwiLCJDYW1lcmFNb2R1bGUiXSwibWFwcGluZ3MiOiI7Ozs7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QUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0tBQ2xDLEtBQUssQ0FBQyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7eUJBQ1gsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDM0MsS0FBSyxDQUFDLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7eUJBQ3BCLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUNwRCxLQUFLLENBQUMsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7eUJBQzdCLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDN0QsS0FBSyxDQUFDLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQzt5QkFDdEMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdkUsQ0FBQyxPQUFP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QUFFOztDQUV2QixDQUFDLFlBQVksRUFBRSxFQUFFLFlBQVk7O0NBRTdCOztDQUVBLEVBQUUsSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDOztDQUVmLEVBQUUsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRzs7Q0FFbkMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDLEdBQUcsUUFBUSxFQUFFLEVBQUUsRUFBRSxDQUFDOztDQUUzRCxHQUFHOztDQUVILEVBQUUsT0FBTyxTQUFTLFlBQVksR0FBRzs7Q0FFakMsR0FBRyxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsVUFBVSxHQUFHLENBQUMsQ0FBQztDQUMzQyxHQUFHLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxVQUFVLEdBQUcsQ0FBQyxDQUFDO0NBQzNDLEdBQUcsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLFVBQVUsR0FBRyxDQUFDLENBQUM7Q0FDM0MsR0FBRyxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsVUFBVSxHQUFHLENBQUMsQ0FBQztDQUMzQyxHQUFHLElBQUksSUFBSSxHQUFHLEdBQUcsRUFBRSxFQUFFLEdBQUcsSUFBSSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxFQUFFLEdBQUcsR0FBRztDQUM5RyxJQUFJLEdBQUcsRUFBRSxFQUFFLEdBQUcsSUFBSSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxFQUFFLElBQUksRUFBRSxHQUFHLElBQUksR0FBRyxJQUFJLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLEVBQUUsR0FBRyxHQUFHO0NBQ2pILElBQUksR0FBRyxFQUFFLEVBQUUsR0FBRyxJQUFJLEdBQUcsSUFBSSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxFQUFFLElBQUksRUFBRSxHQUFHLElBQUksRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLElBQUksRUFBRSxHQUFHLElBQUksRUFBRTtDQUMzRyxJQUFJLEdBQUcsRUFBRSxFQUFFLEdBQUcsSUFBSSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxFQUFFLENBQUM7O0NBRS9GO0NBQ0EsR0FBRyxPQUFPLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQzs7Q0FFN0IsR0FBRyxDQUFDOztDQUVKLEVBQUUsSUFBSTs7Q0FFTixDQUFDLEtBQUssRUFBRSxXQUFXLEtBQUssRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHOztDQUVyQyxFQUFFLE9BQU8sSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQzs7Q0FFakQsRUFBRTs7Q0FFRjtDQUNBOztDQUVBLENBQUMsZUFBZSxFQUFFLFdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRzs7Q0FFcEMsRUFBRSxPQUFPLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7O0NBRS9CLEVBQUU7O0NBRUY7O0NBRUEsQ0FBQyxTQUFTLEVBQUUsV0FBVyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHOztDQUUzQyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDOztDQUVyRCxFQUFFOztDQUVGOztDQUVBLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUc7O0NBRTVCLEVBQUUsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7O0NBRS9CLEVBQUU7O0NBRUY7O0NBRUEsQ0FBQyxVQUFVLEVBQUUsV0FBVyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRzs7Q0FFdEMsRUFBRSxLQUFLLENBQUMsSUFBSSxHQUFHLEdBQUcsT0FBTyxDQUFDLENBQUM7Q0FDM0IsRUFBRSxLQUFLLENBQUMsSUFBSSxHQUFHLEdBQUcsT0FBTyxDQUFDLENBQUM7O0NBRTNCLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsT0FBTyxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUM7O0NBRWxDLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7O0NBRS9CLEVBQUU7O0NBRUYsQ0FBQyxZQUFZLEVBQUUsV0FBVyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRzs7Q0FFeEMsRUFBRSxLQUFLLENBQUMsSUFBSSxHQUFHLEdBQUcsT0FBTyxDQUFDLENBQUM7Q0FDM0IsRUFBRSxLQUFLLENBQUMsSUFBSSxHQUFHLEdBQUcsT0FBTyxDQUFDLENBQUM7O0NBRTNCLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsT0FBTyxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUM7O0NBRWxDLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFH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LEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNaLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNaLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNaLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFWixFQUFFLENBQUM7O0NBRUgsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxHQUFHOztDQUU3QixFQUFFLE9BQU8sQ0FBQyxLQUFLLEVBQUUsK0VBQStFLEVBQUUsQ0FBQzs7Q0FFbkcsRUFBRTs7Q0FFRixDQUFDOztDQUVELE1BQU0sQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLFNBQVMsRUFBRTs7Q0FFbEMsQ0FBQyxTQUFTLEVBQUUsSUFBSTs7Q0FFaEIsQ0FBQyxHQUFHLEVBQUUsV0FBVyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUc7O0NBRWxHLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQzs7Q0FFekIsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDO0NBQzlELEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQztDQUM5RCxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUM7Q0FDL0QsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDOztDQUUvRCxFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxRQUFRLEVBQUUsWUFBWTs7Q0FFdkIsRUFBRSxJQUFJLENBQUMsR0FBRzs7Q0FFVixHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDYixHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDYixHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDYixHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRWIsR0FBRyxDQUFDOztDQUVKLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLEtBQUssRUFBRSxZQUFZOztDQUVwQixFQUFFLE9BQU8sSUFBSSxPQUFPLEVBQUUsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDOztDQUVsRCxFQUFFOztDQUVGLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxHQUFHOztDQUV0QixFQUFFLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7Q0FDekIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDOztDQUV0QixFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDN0UsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQzdFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQztDQUNqRixFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFD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QUUsR0FBRyxNQUFNLENBQUM7O0NBRTlCLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxNQUFNLENBQUM7Q0FDOUIsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLE1BQU0sQ0FBQztDQUM5QixHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsTUFBTSxDQUFDOztDQUU5QixHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsTUFBTSxDQUFDO0NBQzlCLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxNQUFNLENBQUM7Q0FDOUIsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLE1BQU0sQ0FBQzs7Q0FFaEMsR0FBRyxPQUFPLElBQUksQ0FBQzs7Q0FFZixHQUFHLENBQUM7O0NBRUosRUFBRSxFQUFFOztDQUVKLENBQUMscUJBQXFCLEVBQUUsV0FBVyxLQUFLLEdBQUc7O0NBRTNDLEVBQUUsS0FBSyxJQUFJLEtBQUssSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLEdBQUc7O0NBRXRDLEdBQUcsT0FBTyxDQUFDLEtBQUssRUFBRSx1R0FBdUcsRUFBRSxDQUFDOztDQUU1SCxHQUFHOztDQUVILEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQzs7Q0FFekIsRUFBRSxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO0NBQzVDLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUMzQyxFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDM0MsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUUzQyxFQUFFLEtBQUssS0FBSyxDQUFDLEtBQUssS0FBSyxLQUFLLEdBQUc7O0NBRS9CLEdBQUcsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzs7Q0FFdEQsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztDQUNuQixHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7Q0FDckIsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDOztDQUVmLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0NBQ3pCLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0NBQ3pCLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQzs7Q0FFckIsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7Q0FDekIsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7Q0FDekIsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzs7Q0FFcEIsR0FBRyxNQUFNLEtBQUssS0FBSyxDQUFDLEtBQUssS0FBSyxLQUFLLEdBQUc7O0NBRXRDLEdBQUcsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzs7Q0FFdEQsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7Q0FDekIsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7Q0FDekIsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzs7Q0FFbkIsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztDQUNuQixHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0NBQ25CLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDOztDQUVqQixHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztDQUN6QixHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztDQUN6QixHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDOztDQUVwQixHQUFHLE1BQU0sS0FBSyxLQUFLLENBQUMsS0FBSyxLQUFLLEtBQUssR0FBRzs7Q0FFdEMsR0FBRyxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDOztDQUV0RCxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztDQUN6QixHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7Q0FDckIsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7O0NBRXpCLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0NBQ3pCLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7Q0FDbkIsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7O0NBRXpCLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztDQUNyQixHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7Q0FDZixHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDOztDQUVwQixHQUFHLE1BQU0sS0FBSyxLQUFLLENBQUMsS0FBSyxLQUFLLEtBQUssR0FBRzs7Q0FFdEMsR0FBRyxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDOztDQUV0RCxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0NBQ25CLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0NBQ3pCLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDOztDQUV6QixHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0NBQ25CLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0NBQ3pCLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDOztDQUV6QixHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztDQUNqQixHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0NBQ25CLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7O0NBRXBCLEdBQUcsTUFBTSxLQUFLLEtBQUssQ0FBQyxLQUFLLEtBQUssS0FBSyxHQUFHOztDQUV0QyxHQUFHLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7O0NBRXRELEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7Q0FDbkIsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7Q0FDekIsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7O0NBRXpCLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztDQUNmLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7Q0FDbkIsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDOztDQUVyQixHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7Q0FDckIsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7Q0FDekIsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7O0NBRTFCLEdBQUcsTUFBTSxLQUFLLEtBQUssQ0FBQyxLQUFLLEtBQUssS0FBSyxHQUFHOztDQUV0QyxHQUFHLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7O0NBRXRELEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7Q0FDbkIsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7Q0FDakIsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzs7Q0FFbkIsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7Q0FDekIsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztDQUNuQixHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQzs7Q0FFekIsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7Q0FDekIsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztDQUNuQixHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQzs7Q0FFMUIsR0FBRzs7Q0FFSDtDQUNBLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztDQUNkLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztDQUNkLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQzs7Q0FFZjtDQUNBLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztDQUNmLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztDQUNmLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztDQUNmLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQzs7Q0FFZixFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQywwQkFBMEIsRUFBRSxXQUFXLENBQUMsR0FBRzs7Q0FFNUMsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDOztDQUV6QixFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7Q0FDN0MsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0NBQ3pDLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztDQUM1QyxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7Q0FDNUMsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDOztDQUU1QyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDO0NBQzVCLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7Q0FDcEIsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQzs7Q0FFcEIsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztDQUNwQixFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDO0NBQzVCLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7O0NBRXBCLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7Q0FDcEIsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztDQUNwQixFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDOztDQUU3QjtDQUNBLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztDQUNkLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztDQUNk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QUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7Q0FDbkUsRUFBRSxJQUFJLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7O0NBRW5FLEVBQUUsSUFBSSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO0NBQ2xFLEVBQUUsSUFBSSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO0NBQ2xFLEVBQUUsSUFBSSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO0NBQ25FLEVBQUUsSUFBSSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDOztDQUVuRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0NBQzFELEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7Q0FDMUQsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztDQUMxRCxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDOztDQUUzRCxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0NBQzFELEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7Q0FDMUQsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztDQUMxRCxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDOztDQUUzRCxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0NBQzFELEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7Q0FDMUQsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztDQUMzRCxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDOztDQUUzRCxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0NBQzFELEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7Q0FDMUQsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztDQUMzRCxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDOztDQUUzRCxFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxjQUFjLEVBQUUsV0FBVyxDQUFDLEdBQUc7O0NBRWhDLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQzs7Q0FFekIsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO0NBQzFELEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztDQUMxRCxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7Q0FDM0QsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDOztDQUUzRCxFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxzQkFBc0IsRUFBRSxZQUFZOztDQUVyQyxFQUFFLElBQUksRUFBRSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7O0NBRXpCLEVBQUUsT0FBTyxTQUFTLHNCQUFzQixFQUFFLFNBQVMsR0FBRzs7Q0FFdEQsR0FBRyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUV2RCxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUMvQixJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUMvQixJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFL0IsSUFBSSxFQUFFLENBQUMsWUFBWSxFQUFFLElBQUksRUFBRSxDQUFDOztDQUU1QixJQUFJLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7O0NBRTVDLElBQUk7O0NBRUosR0FBRyxPQUFPLFNBQVMsQ0FBQzs7Q0FFcEIsR0FBRyxDQUFDOztDQUVKLEVBQUUsRUFBRTs7Q0FFSixDQUFDLFdBQVcsRUFBRSxZQUFZOztDQUUxQixFQUFFLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7O0NBRXpCLEVBQUUsSUFBSSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO0NBQ2xFLEVBQUUsSUFBSSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO0NBQ2xFLEVBQUUsSUFBSSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO0NBQ25FLEVBQUUsSUFBSSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDOztDQUVuRTtDQUNBOztDQUVBLEVBQUU7Q0FDRixHQUFHLEdBQUc7Q0FDTixJQUFJLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3JCLE9BQU8sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3RCLE9BQU8sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3RCLE9BQU8sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3RCLE9BQU8sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3RCLE9BQU8sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3RCLElBQUk7Q0FDSixHQUFHLEdBQUc7Q0FDTixJQUFJLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3JCLE9BQU8sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3RCLE9BQU8sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3RCLE9BQU8sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3RCLE9BQU8sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3RCLE9BQU8sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3RCLElBQUk7Q0FDSixHQUFHLEdBQUc7Q0FDTixJQUFJLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3JCLE9BQU8sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3RCLE9BQU8sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3RCLE9BQU8sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3RCLE9BQU8sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3RCLE9BQU8sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3RCLElBQUk7Q0FDSixHQUFHLEdBQUc7Q0FDTixJQUFJLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3JCLE9BQU8sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3RCLE9BQU8sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3RCLE9BQU8sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3RCLE9BQU8sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3RCLE9BQU8sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ3RCLElBQUk7O0NBRUosSUFBSTs7Q0FFSixFQUFFOztDQUVGLENBQUMsU0FBUyxFQUFFLFlBQVk7O0NBRXhCLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztDQUN6QixFQUFFLElBQUksR0FBRyxDQUFDOztDQUVWLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDO0NBQ2xELEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDO0NBQ2xELEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDOztDQUVsRCxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQztDQUNwRCxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQztDQUNwRCxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQzs7Q0FFdEQsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQyxHQUFHOztDQUU3QixFQUFFLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7O0NBRXpCLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7Q0FDakIsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztDQUNqQixFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDOztDQUVqQixFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxVQUFVLEVBQUUsV0FBVyxDQUFDLEVBQUUsaUJBQWlCLEdBQUc7O0NBRS9DO0NBQ0EsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUTtDQUN4QixHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUTs7Q0FFbEIsR0FBRyxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRTtDQUM3RCxHQUFHLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFO0NBQzdELEdBQUcsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUU7Q0FDL0QsR0FBRyxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRTs7Q0FFakUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0NBQ2xILEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRztDQUNsSCxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7Q0FDbEgsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7O0NBRW5ILEVBQUUsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQzs7Q0FFMUQsRUFBRSxLQUFLLEdBQUcsS0FBSyxDQUFDLEdBQUc7O0NBRW5CLEdBQUcsSUFBSSxHQUFHLEdBQUcsb0VBQW9FLENBQUM7O0NBRWxGLEdBQUcsS0FBSyxpQkFBaUIsS0FBSyxJQUFJLEdBQUc7O0NBRXJDLElBQUksTUFBTSxJQUFJLEtBQUssRUFBRSxHQUFHLEVBQUUsQ0FBQzs7Q0FFM0IsSUFBSSxNQUFNOztDQUVWLElBQUksT0FBTyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQzs7Q0FFeEIsSUFBSTs7Q0FFSixHQUFHLE9BQU8sSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDOztDQUUxQixHQUFHOztDQUVILEVBQUUsSUFBSSxNQUFNLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQzs7Q0FFdkIsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLE1BQU0sQ0FBQztDQUN6QixFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxLQUFLLE1BQU0sQ0FBQztDQUNuSSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxLQUFLLE1BQU0sQ0FBQztDQUNuSSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxLQUFLLE1BQU0sQ0FBQzs7Q0FFbkksRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLE1BQU0sQ0FBQztDQUN6QixFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxLQUFLLE1BQU0sQ0FBQztDQUNuSSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxLQUFLLE1BQU0sQ0FBQztDQUNuSSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxLQUFLLE1BQU0sQ0FBQzs7Q0FFbkksRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLE1BQU0sQ0FBQztDQUN6QixFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxLQUFLLE1BQU0sQ0FBQztDQUNuSSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxLQUFLLE1BQU0sQ0FBQztDQUNwSSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxLQUFLLE1BQU0sQ0FBQzs7Q0FFcEksRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxHQUFHLE1BQU0sQ0FBQztDQUMxQixFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxLQUFLLE1BQU0sQ0FBQztDQUNwSSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxLQUFLLE1BQU0sQ0FBQztDQUNwSSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxLQUFLLE1BQU0sQ0FBQzs7Q0FFcEksRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxHQUFHOztDQUV2QixFQUFFLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7Q0FDekIsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDOztDQUVoQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztDQUMzQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztDQUMzQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztDQUM1QyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQzs7Q0FFNUMsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsaUJBQWlCLEVBQUUsWUFBWTs7Q0FFaEMsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDOztDQUV6QixFQUFFLElBQUksUUFBUSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQzNFLEVBQUUsSUFBSSxRQUFRLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDM0UsRUFBRSxJQUFJLFFBQVEsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdB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QU8sRUFBRSxDQUFDOztDQUU3QixFQUFFLE9BQU8sU0FBUyxTQUFTLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxLQUFLLEdBQUc7O0NBRTNELEdBQUcsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQzs7Q0FFMUIsR0FBRyxJQUFJLEVBQUUsR0FBRyxNQUFNLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUM7Q0FDN0QsR0FBRyxJQUFJLEVBQUUsR0FBRyxNQUFNLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUM7Q0FDN0QsR0FBRyxJQUFJLEVBQUUsR0FBRyxNQUFNLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUM7O0NBRTlEO0NBQ0EsR0FBRyxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7Q0FDaEMsR0FBRyxLQUFLLEdBQUcsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDOztDQUU1QixHQUFHLFFBQVEsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO0NBQ3pCLEdBQUcsUUFBUSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7Q0FDekIsR0FBRyxRQUFRLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQzs7Q0FFekI7Q0FDQSxHQUFHLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7O0NBRXZCLEdBQUcsSUFBSSxLQUFLLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztDQUN0QixHQUFHLElBQUksS0FBSyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7Q0FDdEIsR0FBRyxJQUFJLEtBQUssR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDOztDQUV0QixHQUFHLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFLElBQUksS0FBSyxDQUFDO0NBQ2pDLEdBQUcsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUUsSUFBSSxLQUFLLENBQUM7Q0FDakMsR0FBRyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxJQUFJLEtBQUssQ0FBQzs7Q0FFakMsR0FBRyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxJQUFJLEtBQUssQ0FBQztDQUNqQyxHQUFHLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFLElBQUksS0FBSyxDQUFDO0NBQ2pDLEdBQUcsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUUsSUFBSSxLQUFLLENBQUM7O0NBRWpDLEdBQUcsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUUsSUFBSSxLQUFLLENBQUM7Q0FDakMsR0FBRyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxJQUFJLEtBQUssQ0FBQztDQUNqQyxHQUFHLE1BQU0sQ0FBQyxRQUFRLEVBQUUsRUFBRSxFQUFFLElBQUksS0FBSyxDQUFDOztDQUVsQyxHQUFHLFVBQVUsQ0FBQyxxQkFBcUIsRUFBRSxNQUFNLEVBQUUsQ0FBQzs7Q0FFOUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztDQUNoQixHQUFHLEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0NBQ2hCLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7O0NBRWhCLEdBQUcsT0FBTyxJQUFJLENBQUM7O0NBRWYsR0FBRyxDQUFDOztDQUVKLEVBQUUsRUFBRTs7Q0FFSixDQUFDLGVBQWUsRUFBRSxXQUFXLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxHQUFHOztDQUVuRSxFQUFFLEtBQUssR0FBRyxLQUFLLFNBQVMsR0FBRzs7Q0FFM0IsR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLHNHQUFzRyxFQUFFLENBQUM7O0NBRTFILEdBQUc7O0NBRUgsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO0NBQ3pCLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksS0FBSyxLQUFLLEdBQUcsSUFBSSxFQUFFLENBQUM7Q0FDdEMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxLQUFLLEdBQUcsR0FBRyxNQUFNLEVBQUUsQ0FBQzs7Q0FFdEMsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssR0FBRyxJQUFJLE9BQU8sS0FBSyxHQUFHLElBQUksRUFBRSxDQUFDO0NBQzlDLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsTUFBTSxPQUFPLEdBQUcsR0FBRyxNQUFNLEVBQUUsQ0FBQztDQUM5QyxFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksR0FBRyxHQUFHLElBQUksRUFBRSxLQUFLLEdBQUcsR0FBRyxJQUFJLEVBQUUsQ0FBQztDQUM1QyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsR0FBRyxJQUFJLEtBQUssR0FBRyxHQUFHLElBQUksRUFBRSxDQUFDOztDQUU1QyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7Q0FDdEQsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0NBQ3RELEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztDQUN2RCxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQzs7Q0FFekQsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsZ0JBQWdCLEVBQUUsV0FBVyxJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsR0FBRzs7Q0FFcEUsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO0NBQ3pCLEVBQUUsSUFBSSxDQUFDLEdBQUcsR0FBRyxLQUFLLEtBQUssR0FBRyxJQUFJLEVBQUUsQ0FBQztDQUNqQyxFQUFFLElBQUksQ0FBQyxHQUFHLEdBQUcsS0FBSyxHQUFHLEdBQUcsTUFBTSxFQUFFLENBQUM7Q0FDakMsRUFBRSxJQUFJLENBQUMsR0FBRyxHQUFHLEtBQUssR0FBRyxHQUFHLElBQUksRUFBRSxDQUFDOztDQUUvQixFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsS0FBSyxHQUFHLElBQUksS0FBSyxDQUFDLENBQUM7Q0FDL0IsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxNQUFNLEtBQUssQ0FBQyxDQUFDO0NBQy9CLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsSUFBSSxLQUFLLENBQUMsQ0FBQzs7Q0FFN0IsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0NBQzVELEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztDQUM1RCxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztDQUMvRCxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7O0NBRXZELEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLE1BQU0sRUFBRSxXQUFXLE1BQU0sR0FBRzs7Q0FFN0IsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO0NBQ3pCLEVBQUUsSUFBSSxFQUFFLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQzs7Q0FFM0IsRUFBRSxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUVsQyxHQUFHLEtBQUssRUFBRSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxPQUFPLEtBQUssQ0FBQzs7Q0FFM0MsR0FBRzs7Q0FFSCxFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxTQUFTLEVBQUUsV0FBVyxLQUFLLEVBQUUsTUFBTSxHQUFHOztDQUV2QyxFQUFFLEtBQUssTUFBTSxLQUFLLFNBQVMsR0FBRyxNQUFNLEdBQUcsQ0FBQyxDQUFDOztDQUV6QyxFQUFFLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0NBRWxDLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUUsR0FBRyxLQUFLLEVBQUUsQ0FBQyxHQUFHLE1BQU0sRUFBRSxDQUFDOztDQUU1QyxHQUFHOztDQUVILEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLE9BQU8sRUFBRSxXQUFXLEtBQUssRUFBRSxNQUFNLEdBQUc7O0NBRXJDLEVBQUUsS0FBSyxLQUFLLEtBQUssU0FBUyxHQUFHLEtBQUssR0FBRyxFQUFFLENBQUM7Q0FDeEMsRUFBRSxLQUFLLE1BQU0sS0FBSyxTQUFTLEdBQUcsTUFBTSxHQUFHLENBQUMsQ0FBQzs7Q0FFekMsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDOztDQUV6QixFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDNUIsRUFBRSxLQUFLLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNoQyxFQUFFLEtBQUssRUFBRSxNQUFNLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQ2hDLEVBQUUsS0FBSyxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRWhDLEVBQUUsS0FBSyxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDaEMsRUFBRSxLQUFLLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNoQyxFQUFFLEtBQUssRUFBRSxNQUFNLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQ2hDLEVBQUUsS0FBSyxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRWhDLEVBQUUsS0FBSyxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDaEMsRUFBRSxLQUFLLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNoQyxFQUFFLEtBQUssRUFBRSxNQUFNLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO0NBQ2xDLEVBQUUsS0FBSyxFQUFFLE1BQU0sR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7O0NBRWxDLEVBQUUsS0FBSyxFQUFFLE1BQU0sR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7Q0FDbEMsRUFBRSxLQUFLLEVBQUUsTUFBTSxHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQztDQUNsQyxFQUFFLEtBQUssRUFBRSxNQUFNLEdBQUcsRUFBRSxFQUFF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Q0FBQyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQztDQUNsQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUM7O0NBRWxDLElBQUk7O0NBRUosR0FBRyxJQUFJLElBQUksR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDOztDQUV0QixHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7Q0FDM0IsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0NBQzNCLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztDQUMzQixHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7O0NBRTNCO0NBQ0EsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHOztDQUV0QixJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQzs7Q0FFbkUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0NBQ1osSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0NBQ1osSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0NBQ1osSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDOztDQUVaLElBQUk7O0NBRUosR0FBRzs7Q0FFSCxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLENBQUM7Q0FDeEIsRUFBRSxHQUFHLEVBQUUsU0FBUyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztDQUM1QixFQUFFLEdBQUcsRUFBRSxTQUFTLEdBQUcsQ0FBQyxFQUFFLEdBQUcs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R0FBRyxDQUFDLEVBQUUsQ0FBQzs7Q0FFeEIsRUFBRSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7O0NBRXpCLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztDQUN6QyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7Q0FDekMsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0NBQ3pDLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQzs7Q0FFekMsR0FBRyxNQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRzs7Q0FFaEMsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0NBQ3pDLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztDQUN6QyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7Q0FDekMsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDOztDQUV6QyxHQUFHLE1BQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHOztDQUVoQyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7Q0FDekMsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0NBQ3pDLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztDQUN6QyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7O0NBRXpDLEdBQUcsTUFBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7O0NBRWhDLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztDQUN6QyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7Q0FDekMsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0NBQ3pDLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQzs7Q0FFekMsR0FBRyxNQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRzs7Q0FFaEMsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0NBQ3pDLEdBQUcsSUFBSSxDQUFDLEVB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LEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssR0FBRyxHQUFHLEVBQUUsQ0FBQzs7Q0FFdEMsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksR0FBRyxDQUFDLENBQUM7Q0FDdEIsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUM7Q0FDL0IsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUM7Q0FDL0IsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUM7O0NBRS9CLEdBQUcsTUFBTSxLQUFLLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRzs7Q0FFdkMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUM7O0NBRWhELEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDO0NBQy9CLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0NBQ3RCLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDO0NBQy9CLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDOztDQUUvQixHQUFHLE1BQU0sS0FBSyxHQUFHLEdBQUcsR0FBRyxHQUFHOztDQUUxQixHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQzs7Q0FFaEQsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFH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LEdBQUc7O0NBRUgsRUFBRSxPQUFPLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRTdDLEVBQUU7O0NBRUYsQ0FBQyxXQUFXLEVBQUUsV0FBVyxDQUFDLEdBQUc7O0NBRTdCLEVBQUUsT0FBTyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDOztDQUU3QyxFQUFFOztDQUVGLENBQUMsbUJBQW1CLEVBQUUsV0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHOztDQUV4Qzs7Q0FFQSxFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7Q0FDckQsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDOztDQUVyRCxFQUFFLElBQUksQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztDQUMxRCxFQUFFLElBQUksQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztDQUMxRCxFQUFFLElBQUksQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztDQUMxRCxFQUFFLElBQUksQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQzs7Q0FFMUQsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQzs7Q0FFMUIsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRSxFQUFFLENBQUMsR0FBRzs7Q0FFM0IsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsT0FBTyxJQUFJLENBQUM7Q0FDN0IsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsT0FBTyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxDQUFDOztDQUV4QyxFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUM7O0NBRXpEOztDQUVBLEVBQUUsSUFBSSxZQUFZLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRW5FLEVBQUUsS0FBSyxZQUFZLEdBQUcsQ0FBQyxHQUFHOztDQUUxQixHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQ3JCLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDckIsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNyQixHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUVyQixHQUFHLFlBQVksR0FBRyxFQUFFLFlBQVks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QUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDOztDQUVoRCxFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxZQUFZLEVBQUUsV0FBVyxDQUFDLEdBQUc7O0NBRTlCLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztDQUN6QyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUM7O0NBRXJCLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDOztDQUVsRSxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO0NBQ2xFLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7Q0FDbEUsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQzs7Q0FFbkUsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsZUFBZSxFQUFFLFdBQVcsQ0FBQyxHQUFHOztDQUVqQyxFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7Q0FDekMsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDOztDQUU3Qzs7Q0FFQSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0NBQ3BDLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7Q0FDcEMsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztDQUNwQyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7O0NBRXRDOztDQUVBLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDO0NBQ3ZELEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEdB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QUUsT0FBTyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsR0FBRyxNQUFNLEVBQUUsQ0FBQzs7Q0FFM0MsRUFBRTs7Q0FFRixDQUFDLEdBQUcsRUFBRSxXQUFXLENBQUMsR0FBRzs7Q0FFckIsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Q0FDbkMsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Q0FDbkMsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7O0NBRW5DLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLEdBQUcsRUFBRSxXQUFXLENBQUMsR0FBRzs7Q0FFckIsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Q0FDbkMsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Q0FDbkMsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7O0NBRW5DLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLEtBQUssRUFBRSxXQUFXLEdBQUcsRUFBRSxHQUFHLEdBQUc7O0NBRTlCOztDQUVBLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcs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QUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDVixHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNWLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUVWLEdBQUcsQ0FBQzs7Q0FFSixFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxLQUFLLEVBQUUsWUFBWTs7Q0FFcEIsRUFBRSxPQUFPLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7O0NBRTNELEVBQUU7O0NBRUYsQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLEdBQUc7O0NBRXRCLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztDQUN6QixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUM7O0NBRXRCLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQzFELEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQzFELEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMs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RUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFbEQsRUFBRSxJQUFJLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQ2xELEVBQUUsSUFBSSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNsRCxFQUFFLElBQUksR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRWxELEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0NBQzlDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0NBQzlDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDOztDQUU5QyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztDQUM5QyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztDQUM5QyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQzs7Q0FFOUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7Q0FDOUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7Q0FDOUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7O0NBRTlDLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLGNBQWMsRUFBRSxXQUFXLENBQUMsR0FBRzs7Q0FFaEMsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDOztDQUV6QixFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztDQUMzQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztDQUMzQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJ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QUNsQixFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDbEIsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQ2xCLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNsQixFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDbEIsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUVsQixFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxjQUFjLEVBQUUsV0FBVyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUc7O0NBRS9ELEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxRQUFRLEVBQUUsQ0FBQztDQUMvQixFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsUUFBUSxFQUFFLENBQUM7O0NBRS9CLEVBQUUsSUFBSSxDQUFDLEdBQUc7Q0FDVixHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRTtDQUN2RCxHQUFHLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUU7Q0FDM0QsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDVixHQUFHLENBQUM7O0NBRUosRUFBRTs7Q0FFRixDQUFDLEtBQUssRUFBRSxXQUFXLEVBQUUsRUFBRSxFQUFFLEdBQUc7O0NBRTVCLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQzs7Q0FFekIsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUM7Q0FDOUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUM7O0NBRTlDLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLE1BQU0sRUFBRSxXQUFXLEtBQUssR0FBRzs7Q0FFNUIsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDO0NBQzVCLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQzs7Q0FFNUIsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDOztDQUV6QixFQUFFLElBQUksR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDbEQsRUFBRSxJQUFJLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUVsRCxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7Q0FDOUIsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO0NBQzlCLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQzs7Q0FFOUIsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7Q0FDaEMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7Q0FDaEMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7O0NBRWhDLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLFNBQVMsRUFBRSxXQUFXLEVBQUUsRUFBRSxFQUFFLEdBQUc7O0NBRWhDLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQzs7Q0FFekIsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDNUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFF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LENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQzs7Q0FFbkIsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsWUFBWSxFQUFFLFdBQVcsQ0FBQyxHQUFHOztDQUU5QixFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7Q0FDckQsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDOztDQUVyQixFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztDQUM5RCxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztDQUM5RCxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztDQUMvRCxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQzs7Q0FFL0QsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsWUFBWSxFQUFFLFdBQVcsTUFBTSxHQUFHOztDQUVuQyxFQUFFLE9BQU8sSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLEdBQUcsTUFBTSxFQUFFLENBQUM7O0NBRTNDLEVBQUU7O0NBRUYsQ0FBQywwQkFBMEIsRUFBRSxXQUFXLENBQUMsR0FBRzs7Q0FFNUM7O0NBRUE7O0NBRUEsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7Q0FFaEMsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7Q0FFckMsRUFBRSxLQUFLLENBQUMsR0FBRyxNQUFNLEdBQUc7O0NBRXBCLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7Q0FDZCxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0NBQ2QsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQzs7Q0FFZCxHQUFHLE1BQU07O0NBRVQsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0NBQ3BCLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztDQUNwQixHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7O0NBRXBCLEdBQUc7O0NBRUgsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsOEJBQThCLEVBQUUsV0FBVyxDQUFDLEdBQUc7O0NBRWhEOztDQUVBOztDQUVBLEVBQUUsSUFBSSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQ3BCLEdBQUcsT0FBTyxHQUFHLElBQUk7Q0FDakIsR0FBRyxRQUFRLEdBQUcsR0FBRzs7Q0FFakIsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVE7O0NBRWxCLEdBQUcsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFO0NBQzlDLEdBQUcsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFO0NBQzlDLEdBQUcsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7O0NBRWhELEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLE9BQU87Q0FDeEMsU0FBUyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxPQUFPLEVBQUU7Q0FDMUMsU0FBUyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxPQUFPLEVBQUUsR0FBRzs7Q0FFN0M7Q0FDQTtDQUNBOztDQUVBLEdBQUcsS0FBSyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLFFBQVE7Q0FDMUMsVUFBVSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxRQUFRLEVBQUU7Q0FDNUMsVUFBVSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFH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R0FBRzs7Q0FFSDs7Q0FFQSxFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxHQUFHLEdBQUcsR0FBRyxPQUFPLEdBQUcsR0FBRyxHQUFHLEVBQUU7Q0FDbEQscUJBQXFCLEVBQUUsR0FBRyxHQUFHLEdBQUcsT0FBTyxHQUFHLEdBQUcsR0FBRyxFQUFFO0NBQ2xELHFCQUFxQixFQUFFLEdBQUcsR0FBRyxHQUFHLE9BQU8sR0FBRyxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUM7O0NBRXJELEVBQUUsS0FBSyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEtBQUssR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDOztDQUVyQztDQUNBOztDQUVBLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDO0NBQzdCLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDO0NBQzdCLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDO0NBQzdCLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDOztDQUVwRCxFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxHQUFHLEVBQUUsV0FBVyxDQUFDLEdBQUc7O0NBRXJCLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0NBQ25DLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0NBQ25DLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0NBQ25DLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDOztDQUVuQyxFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxHQUFHLEVBQUUsV0FBVyxDQUFDLEdBQUc7O0NBRXJCLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0NBQ25DLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0NBQ25DLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0NBQ25DLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDOztDQUVuQyxFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxLQUFLLEVBQUUsV0FBVyxHQUFHLEVBQUUsR0FBRyxHQUFHOztDQUU5Qjs7Q0FFQSxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQztDQUN4RCxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQztDQUN4RCxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQztDQUN4RCxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQzs7Q0FFeEQsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsV0FBVyxFQUFFLFlBQVk7O0NBRTFCLEVBQUUsSUFBSSxHQUFHLEVBQUUsR0FBRyxDQUFDOztDQUVmLEVBQUUsT0FBTyxTQUFTLFdBQVcsRUFBRSxNQUFNLEVBQUUsTUFBTSxHQUFHOztDQUVoRCxHQUFHLEtBQUssR0FBRyxLQUFLLFNBQVMsR0FBRzs7Q0FFNUIsSUFBSSxHQUFHLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztDQUN4QixJQUFJLEdBQUcsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDOztDQUV4QixJQUFJOztDQUVKLEdBQUcsR0FBRyxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsQ0FBQztDQUM3QyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUM7O0NBRTdDLEdBQUcsT0FBTyxJQUFJLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQzs7Q0FFakMsR0FBRyxDQUFDOztDQUVKLEVBQUUsRUFBRTs7Q0FFSixDQUFDLFdBQVcsRUFBRSxXQUFXLEdBQUcsRUFBRSxHQUFHLEdBQUc7O0NBRXBDLEVBQUUsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDOztDQUU3QixFQUFFLE9BQU8sSUFBSSxDQUFDLFlBQVksRUFBRSxNQUFNLElBQUksQ0FBQyxFQUFFLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsQ0FBQzs7Q0FFckcsRUFBRTs7Q0FFRixDQUFDLEtBQUssRUFBRSxZQUFZOztDQUVwQixFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUM7Q0FDaEMsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDO0NBQ2hDLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQztDQUNoQyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUM7O0NBRWhDLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLElBQUksRUFBRSxZQUFZOztDQUVuQixFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUM7Q0FDL0IsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDO0NBQy9CLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQztDQUMvQixFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUM7O0NBRS9CLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLEtBQUssRUFBRSxZQUFZOztDQUVwQixFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUM7Q0FDaEMsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDO0NBQ2hDLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQztDQUNoQyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUM7O0NBRWhDLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLFdBQVcsRUFBRSxZQUFZOztDQUUxQixFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQztDQUN2RSxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQztDQUN2RSxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxH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Q0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0NBQ3JDLEdBQUcsR0FBRyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDOztDQUVyQyxHQUFHLE1BQU07O0NBRVQsR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7Q0FDckMsR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7O0NBRXJDLEdBQUc7O0NBRUgsRUFBRSxLQUFLLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRzs7Q0FFNUIsR0FBRyxHQUFHLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7Q0FDdEMsR0FBRyxHQUFHLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7O0NBRXRDLEdBQUcsTUFBTTs7Q0FFVCxHQUFHLEdBQUcsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztDQUN0QyxHQUFHLEdBQUcsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQzs7Q0FFdEMsR0FBRzs7Q0FFSCxFQUFFLEtBQUssS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHOztDQUU1QixHQUFHLEdBQUcsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztDQUN0QyxHQUFHLEdBQUcsSUFBSSxLQUFL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RUFBRSxRQUFRLEdBQUc7O0NBRWpELEdBQUcsS0FBSyxJQUFJLENBQUMsT0FBTyxFQUFFLEdBQUc7O0NBRXpCLElBQUksT0FBTyxLQUFLLENBQUM7O0NBRWpCLElBQUk7O0NBRUo7Q0FDQSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLENBQUM7Q0FDNUIsR0FBRyxPQUFPLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUM7O0NBRTFDO0NBQ0EsR0FBRyxFQUFFLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUM7Q0FDdkMsR0FBRyxFQUFFLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUM7Q0FDdkMsR0FBRyxFQUFFLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUM7O0NBRXZDO0NBQ0EsR0FBRyxFQUFFLENBQUMsVUFBVSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQztDQUMzQixHQUFHLEVBQUUsQ0FBQyxVQUFVLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO0NBQzNCLEdBQUcsRUFBRSxDQUFDLFVBQVUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7O0NBRTNCO0NBQ0E7Q0FDQTtDQUNBLEdBQUcsSUFBSSxJQUFJLEdBQUc7Q0FDZCxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztDQUNyRCxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztDQUNyRCxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztDQUNyRCxJQUFJLENBQUM7Q0FDTCxHQUFHLEtBQUssRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLEdBQUc7O0NBRS9CLElBQUksT0FBTyxLQUFLLENBQUM7O0NBRWpCLElBQUk7O0NBRUo7Q0FDQSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDeEMsR0FBRyxLQUFLLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxHQUFHOztDQUUvQixJQUFJLE9BQU8sS0FBSyxDQUFDOztDQUVqQixJQUFJOztDQUVKO0NBQ0E7Q0FDQSxHQUFHLGNBQWMsQ0FBQyxZQUFZLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO0NBQ3pDLEdBQUcsSUFBSSxHQUFHLEVBQUUsY0FBYyxDQUFDLENBQUMsRUFBRSxjQUFjLENBQUMsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztDQUNuRSxHQUFHLE9BQU8sVUFBVSxFQUFFLElBQUksRUFBRSxDQUFDOztDQUU3QixHQUFHLENBQUM7O0NBRUosRUFBRSxJQUFJOztDQUVOLENBQUMsVUFBVSxFQUFFLFdBQVcsS0FBSyxFQUFFLE1BQU0sR0FBRzs7Q0FFeEMsRUFBRSxLQUFLLE1BQU0sS0FBSyxTQUFTLEdBQUc7O0NBRTlCLEdBQUcsT0FBTyxDQUFDLElBQUksRUFBRSxrREFBa0QsRUFBRSxDQUFDO0NBQ3RFLEdBQUcsTUFBTSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7O0NBRTFCLEdBQUc7O0NBRUgsRUFBRSxPQUFPLE1BQU0sQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDOztDQUUxRCxFQUFFOztDQUVGLENBQUMsZUFBZSxFQUFFLFlBQVk7O0NBRTlCLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQzs7Q0FFekIsRUFBRSxPQUFPLFNBQVMsZUFBZSxFQUFFLEtBQUssR0FBRzs7Q0FFM0MsR0FBRyxJQUFJLFlBQVksR0FBRyxFQUFFLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztDQUNuRSxHQUFHLE9BQU8sWUFBWSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQzs7Q0FFN0MsR0FBRyxDQUFDOztDQUVKLEVBQUUsRUFBRTs7Q0FFSixDQUFDLGlCQUFpQixFQUFFLFlBQVk7O0NBRWhDLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQzs7Q0FFekIsRUFBRSxPQUFPLFNBQVMsaUJBQWlCLEVBQUUsTUFBTSxHQUFHOztDQUU5QyxHQUFHLEtBQUssTUFBTSxLQUFLLFNBQVMsR0FBRzs7Q0FFL0IsSUFBSSxPQUFPLENBQUMsSUFBSSxFQUFFLHlEQUF5RCxFQUFFLENBQUM7Q0FDOUUsSUFBSSxNQUFNLEdBQUcsSUFBSSxNQUFNLEVBQUUsQ0FBQzs7Q0FFMUIsSUFBSTs7Q0FFSixHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDOztDQUVuQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLEVBQUUsQ0FBQyxNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUM7O0NBRXJELEdBQUcsT0FBTyxNQUFNLENBQUM7O0NBRWpCLEdBQUcsQ0FBQzs7Q0FFSixFQUFFLEVBQUU7O0NBRUosQ0FBQyxTQUFTLEVBQUUsV0FBVyxHQUFHLEdBQUc7O0NBRTdCLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0NBQzFCLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDOztDQUUxQjtDQUNBLEVBQUUsS0FBSyxJQUFJLENBQUMsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDOztDQUV6QyxFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxLQUFLLEVBQUUsV0FBVyxHQUFHLEdBQUc7O0NBRXpCLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0NBQzFCLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDOztDQUUxQixFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxZQUFZLEVBQUUsWUFBWTs7Q0FFM0IsRUFBRSxJQUFJLE1BQU0sR0FBRztDQUNmLEdBQUcsSUFBSSxPQUFPLEVBQUU7Q0FDaEIsR0FBRyxJQUFJLE9BQU8sRUFBRTtDQUNoQixHQUFHLElBQUksT0FBTyxFQUFFO0NBQ2hCLEdBQUcsSUFBSSxPQUFPLEVBQUU7Q0FDaEIsR0FBRyxJQUFJLE9BQU8sRUFBRTtDQUNoQixHQUFHLElBQUksT0FBTyxFQUFFO0NBQ2hCLEdBQUcsSUFBSSxPQUFPLEVBQUU7Q0FDaEIsR0FBRyxJQUFJLE9BQU8sRUFBRTtDQUNoQixHQUFHLENBQUM7O0NBRUosRUFBRSxPQUFPLFNBQVMsWUFBWSxFQUFFLE1BQU0sR0FBRzs7Q0FFekM7Q0FDQSxHQUFHLEtBQUssSUFBSSxDQUFDLE9BQU8sRUFBRSxHQUFHLE9BQU8sSUFBSSxDQUFDOztDQUVyQztDQUNBLEdBQUcsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLFlBQVksRUFBRSxNQUFNLEVBQUUsQ0FBQztDQUNoRixHQUFHLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxZQUFZLEVBQUUsTUFBTSxFQUFFLENBQUM7Q0FDaEYsR0FBRyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsWUFBWSxFQUFFLE1BQU0sRUFBRSxDQUFDO0NBQ2hGLEdBQUcsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLFlBQVksRUFBRSxNQUFNLEVBQUUsQ0FBQztDQUNoRixHQUFHLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxZQUFZLEVBQUUsTUFBTSxFQUFFLENBQUM7Q0FDaEYsR0FBRyxN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Rzs7Q0FFMUIsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7Q0FDbkIsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7Q0FDbkIsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7O0NBRW5CLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLGlCQUFpQixFQUFFLFdBQVcsS0FBSyxFQUFFLFdBQVcsR0FBRzs7Q0FFcEQsRUFBRSxLQUFLLFdBQVcsS0FBSyxTQUFTLEdBQUcsV0FBVyxHQUFHLEdBQUcsQ0FBQzs7Q0FFckQsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQztDQUM1QyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDO0NBQzVDLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUM7O0NBRTVDLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLGlCQUFpQixFQUFFLFdBQVcsS0FBSyxFQUFFLFdBQVcsR0FBRzs7Q0FFcEQsRUFBRSxLQUFLLFdBQVcsS0FBSyxTQUFTLEdBQUcsV0FBVyxHQUFHLEdBQUcsQ0FBQzs7Q0FFckQsRUFBRSxJQUFJLFdBQVcsR0FBRyxFQUFFLFdBQVcsR0FBRyxDQUFDLE9BQU8sR0FBRyxHQUFHLFdBQVcsS0FBSyxHQUFHLENBQUM7O0NBRXRFLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUM7Q0FDNUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFH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LElBQUksQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDO0NBQy9CLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUM7O0NBRS9CLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLFNBQVMsRUFBRSxXQUFXLENBQUMsR0FBRzs7Q0FFM0IsRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztDQUNkLEVBQUUsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7Q0FDZCxFQUFFLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDOztDQUVkLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLEdBQUcsRUFBRSxXQUFXLEtBQUssR0FBRzs7Q0FFekIsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO0NBQzNDLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztDQUMzQyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7O0NBRTNDLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLFFBQVEsRUFBRSxXQUFXLEtBQUssR0FBRzs7Q0FFOUIsRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUM7Q0FDcEIsRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUM7Q0FD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LENBQUM7O0NBRTFCOztDQUVBLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQztDQUN0QixFQUFFLElBQUksR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDbEQsRUFBRSxJQUFJLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQ2xELEVBQUUsSUFBSSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQzs7Q0FFbkQsRUFBRSxLQUFLLEdBQUcsS0FBSyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUM7O0NBRS9CLEVBQUUsS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHOztDQUV6QixHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7O0NBRS9DLEdBQUcsS0FBSyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLE9BQU8sR0FBRzs7Q0FFcEMsSUFBSSxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7Q0FDdkMsSUFBSSxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7O0NBRXZDLElBQUksTUFBTTs7Q0FFVixJQUFJLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7Q0FDckMsSUFBSSxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQzs7Q0FFaEIsSUFBSTs7Q0FFSixHQUFHLE1BQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHOztDQUVoQyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQzs7Q0FFakQsR0FBRyxLQUFLLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsT0FBTyxHQUFHOztDQUVwQyxJQUFJLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7Q0FDckMsSUFBSSxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDOztDQUVyQyxJQUFJLE1BQU07O0NBRVYsSUFBSSxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7Q0FDdkMsSUFBSSxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQzs7Q0FFaEIsSUFBSTs7Q0FFSixHQUFHLE1BQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHOztDQUVoQyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7O0NBRS9DLEdBQUcsS0FBSyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLE9BQU8sR0FBRzs7Q0FFcEMsSUFBSSxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7Q0FDdkMsSUFBSSxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7O0NBRXZDLElBQUksTUFBTTs7Q0FFVixJQUFJLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0NBQ2hCLElBQUksSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQzs7Q0FFckMsSUFBSTs7Q0FFSixHQUFHLE1BQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHOztDQUVoQyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQzs7Q0FFakQsR0FBRyxLQUFLLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsT0FBTyxHQUFHOztDQUVwQyxJQUFJLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7Q0FDckMsSUFBSSxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDOztDQUVyQyxJQUFJLE1BQU07O0NBRVYsSUFBSSxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztDQUNoQixJQUFJLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQzs7Q0FFdkMsSUFBSTs7Q0FFSixHQUFHLE1BQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHOztDQUVoQyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7O0NBRS9D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QUUsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUM7O0NBRXBGLElBQUk7O0NBRUosR0FBRyxLQUFLLEdBQUcsS0FBSyxTQUFTLEdBQUc7O0NBRTVCLElBQUksT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUM7O0NBRTFELElBQUk7O0NBRUosR0FBRyxLQUFLLElBQUksS0FBSyxTQUFTLEdBQUc7O0NBRTdCLElBQUksUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUM7O0NBRTdELElBQUk7O0NBRUosR0FBRzs7Q0FFSCxFQUFFLFNBQVMsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLGFBQWEsR0FBRzs7Q0FFN0MsR0FBRyxJQUFJLGFBQWEsR0FBRyxPQUFPLEtBQUssU0FBUyxHQUFHLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLFdBQVcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxXQUFXLEVBQUUsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUM7Q0FDckksR0FBRyxJQUFJLFlBQVksR0FBRyxNQUFNLEtBQUssU0FBUyxHQUFHLEVBQUUsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUM7O0NBRXRJLEdBQUcsSUFBSSxJQUFJLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUsQ0FBQzs7Q0FFL0UsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQzs7Q0FFNUIsR0FBRyxLQUFLLEdBQUcsS0FBSyxTQUFTLEdBQUc7O0NBRTVCLElBQUksS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUM7O0NBRTFHLElBQUk7O0NBRUosR0FBRyxLQUFLLElBQUksS0FBSyxTQUFTLEdBQUc7O0NBRTdCLElBQUksS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUM7O0NBRTdHLElBQUk7O0NBRUosR0FBRzs7Q0FFSCxFQUFFLElBQUksTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7O0NBRS9CLEVBQUUsS0FBSyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRzs7Q0FFM0IsR0FBRyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsR0FBRzs7Q0FFOUMsSUFBSSxJQUFJLEtBQUssR0FBRyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRTVCLElBQUksSUFBSSxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztDQUM1QixJQUFJLElBQUksS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7O0NBRTVCLElBQUksTUFBTSxJQUFJLENBQUMsR0FBRyxLQUFLLEVBQUUsRUFBRSxHQUFHLEtBQUssR0FBRyxLQUFLLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHOztDQUU5RCxLQUFLLEtBQUssT0FBTyxLQUFLLFNBQVMsR0FBRzs7Q0FFbEMsTUFBTSxPQUFPLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxFQUFFLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsYUFBYSxFQUFFLENBQUM7O0NBRXZGLE1BQU0sTUFBTTs7Q0FFWixNQUFNLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQzs7Q0FFdEQsTUFBTTs7Q0FFTixLQUFLOztDQUVMLElBQUk7O0NBRUosR0FBRyxNQUFNOztDQUVULEdBQUcsS0FBSyxPQUFPLEtBQUssU0FBUyxHQUFHOztDQUVoQyxJQUFJLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUc7O0NBRWxELEtBQUssT0FBTyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQzs7Q0FFakUsS0FBSzs7Q0FFTCxJQUFJLE1BQU07O0NBRVYsSUFBSSxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRzs7Q0FFeEQsS0FBSyxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDOztDQUVoQyxLQUFLOztDQUVMLElBQUk7O0NBRUosR0FBRzs7Q0FFSCxFQUFFLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDOztDQUU1QixFQUFFLEtBQUssUUFBUSxDQUFDLFdBQVcsS0FBSyxJQUFJLEdBQUc7O0NBRXZDLEdBQUcsSUFBSSxDQUFDLFdBQVcsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFDOztDQUVuRCxHQUFHOztDQUVILEVBQUUsS0FBSyxRQUFRLENBQUMsY0FBYyxLQUFLLElBQUksR0FBRzs7Q0FFMUMsR0FBRyxJQUFJLENBQUMsY0FBYyxHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLENBQUM7O0NBRXpELEdBQUc7O0NBRUgsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsTUFBTSxFQUFFLFlBQVk7O0NBRXJCLEVBQUUsSUFBSSxNQUFNLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQzs7Q0FFN0IsRUFBRSxPQUFPLFNBQVMsTUFBTSxHQUFHOztDQUUzQixHQUFHLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDOztDQUU3QixHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDOztDQUVqRCxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7Q0FFbEQsR0FBRyxPQUFPLElBQUksQ0FBQzs7Q0FFZixHQUFHLENBQUM7O0NBRUosRUFBRSxFQUFFOztDQUVKLENBQUMsU0FBUyxFQUFFLFlBQVk7O0NBRXhCLEVBQUUsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7O0NBRS9CLEVBQUUsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUM7Q0FDMUMsRUFBRSxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQzs7Q0FFMUMsRUFBRSxJQUFJLENBQUMsR0FBRyxNQUFNLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsTUFBTSxDQUFDOztDQUUxQyxFQUFFLElBQUksTUFBTSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7Q0FDN0IsRUFBRSxNQUFNLENBQUMsR0FBRztDQUNaLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUM7Q0FDMUIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQztDQUMxQixHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDO0NBQzFCLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNiLEdBQUcsQ0FBQzs7Q0FFSixFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsTUFBTSxFQUFFLENBQUM7O0NBRTdCLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLGtCQUFrQixFQUFFLFlBQVk7O0NBRWpDLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxPQUFPLEVBQUUsRUFBRSxFQUFFLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQzs7Q0FFN0MsRUFBRSxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRzs7Q0FFMUQsR0FBRyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUU5QixHQUFHLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDO0NBQ3BDLEdBQUcsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUM7Q0FDcEMsR0FBRyxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7Q0FFcEMsR0FBRyxFQUFFLENBQUMsVUFBVSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQztDQUMzQixHQUFHLEVBQUUsQ0FBQyxVQUFVLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO0NBQzNCLEdBQUcsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQzs7Q0FFbEIsR0FBRyxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUM7O0NBRWxCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLENBQUM7O0NBRTFCLEdBQUc7O0NBRUgsRUFBRTs7Q0FFRixDQUFDLG9CQUFvQixFQUFFLFdBQVcsWUFBWSxHQUFHOztDQUVqRCxFQUFFLEtBQUssWUFBWSxLQUFLLFNBQVMsR0FBRyxZQUFZLEdBQUcsSUFBSSxDQUFDOztDQUV4RCxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLENBQUM7O0NBRW5DLEVBQUUsUUFBUSxHQUFHLElBQUksS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUM7O0NBRS9DLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUV6RCxHQUFHLFFBQVEsRUFBRSxDQUFDLEVBQUUsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDOztDQUVqQyxHQUFHOztDQUVILEVBQUUsS0FBSyxZQUFZLEdBQUc7O0NBRXRCO0NBQ0E7O0NBRUEsR0FBRyxJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO0NBQ2xCLEdBQUcsSUFBSSxFQUFFLEdBQUcsSUFBSSxPQUFPLEVBQUUsRUFBRSxFQUFFLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQzs7Q0FFOUMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0NBRXZELElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRTNCLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDO0NBQ2pDLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDO0NBQ2pDLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDOztDQUVqQyxJQUFJLEVBQUUsQ0FBQyxVQUFVLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO0NBQzVCLElBQUksRUFBRSxDQUFDLFVBQVUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7Q0FDNUIsSUFBSSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxDQUFDOztDQUVuQixJQUFJLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDO0NBQ2pDLElBQUksUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUM7Q0FDakMsSUFBSSxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQzs7Q0FFakMsSUFBSTs7Q0FFSixHQUFHLE1BQU07O0NBRVQsR0FBRyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQzs7Q0FFN0IsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0NBRXZELElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRTNCLElBQUksUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO0NBQzFDLElBQUksUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO0NBQzFDLElBQUksUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDOztDQUUxQyxJQUFJOztDQUVKLEdBQUc7O0NBRUgsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0NBRXpELEdBQUcsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDOztDQUU3QixHQUFHOztDQUVILEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUV0RCxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUUxQixHQUFHLElBQUks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QyxHQUFHOztDQUVIOztDQUVBLEVBQUUsSUFBSSxXQUFXLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQzs7Q0FFdkMsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRzs7Q0FFdkQsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxXQUFXLEVBQUUsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQzs7Q0FFckQsR0FBRzs7Q0FFSDs7Q0FFQSxFQUFFLElBQUksV0FBVyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUM7O0NBRXZDLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0NBRXZELEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUM7O0NBRXJELEdBQUc7O0NBRUg7O0NBRUEsRUFBRSxJQUFJLGFBQWEsR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDOztDQUUzQyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsYUFBYSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUV6RCxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLGFBQWEsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDOztDQUVqRCxHQUFHOztDQUVIOztDQUVBLEVBQUUsSUFBSSxXQUFXLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQzs7Q0FFdkMsRUFBRSxLQUFLLFdBQVcsS0FBSyxJQUFJLEdBQUc7O0NBRTlCLEdBQUcsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUMsS0FBSyxFQUFFLENBQUM7O0NB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O0NBQ3BDLE1BQU0sRUFBRSxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLENBQUM7Q0FDcEMsTUFBTSxFQUFFLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsQ0FBQzs7Q0FFcEMsTUFBTSxFQUFFLENBQUMsVUFBVSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQztDQUM5QixNQUFNLEVBQUUsQ0FBQyxVQUFVLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO0NBQzlCLE1BQU0sRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQzs7Q0FFckIsTUFBTSxPQUFPLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztDQUM1QixNQUFNLE9BQU8sRUFBRSxFQUFFLEdBQUcsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztDQUNoQyxNQUFNLE9BQU8sRUFBRSxFQUFFLEdBQUcsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQzs7Q0FFaEMsTUFBTSxPQUFPLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztDQUM1QixNQUFNLE9BQU8sRUFBRSxFQUFFLEdBQUcsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztDQUNoQyxNQUFNLE9BQU8sRUFBRSxFQUFFLEdBQUcsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQzs7Q0FFaEMsTUFBTSxPQUFPLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztDQUM1QixNQUFNLE9BQU8sRUFBRSxFQUFFLEdBQUcsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztDQUNoQyxNQUFNLE9BQU8sRUFBRSxFQUFFLEdBQUcsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQzs7Q0FFaEMsTUFBTTs7Q0FFTixLQUFLOztDQUVMLElBQUksTUFBTTs7Q0FFVjs7Q0FFQSxJQUFJLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRzs7Q0FFN0QsS0FBSyxFQUFFLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNsQyxLQUFLLEVBQUUsQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztDQUN0QyxLQUFLLEVBQUUsQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQzs7Q0FFdEMsS0FBSyxFQUFFLENBQUMsVUFBVSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQztDQUM3QixLQUFLLEVBQUUsQ0FBQyxVQUFVLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO0NBQzdCLEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQzs7Q0FFcEIsS0FBSyxPQUFPLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztDQUN6QixLQUFLLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztDQUM3QixLQUFLLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQzs7Q0FFN0IsS0FBSyxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7Q0FDN0IsS0FBSyxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7Q0FDN0IsS0FBSyxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7O0NBRTdCLEtBQUssT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO0NB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QUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7Q0FDdkQsRUFBRSxLQUFLLElBQUksQ0FBQyxZQUFZLEtBQUssUUFBUSxHQUFHLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQzs7Q0FFOUUsRUFBRSxLQUFLLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztDQUN0RCxFQUFFLEtBQUssSUFBSSxDQUFDLFdBQVcsS0FBSyxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDOztDQUV2RSxFQUFFLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztDQUNsQyxFQUFFLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztDQUNsQyxFQUFFLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQzs7Q0FFcEM7Q0FDQSxFQUFFLEtBQUssSUFBSSxDQUFDLFFBQVEsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDOztDQUUzRCxFQUFFLEtBQUssSUFBSSxDQUFDLFNBQVMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO0NBQzlELEVBQUUsS0FBSyxJQUFJLENBQUMsUUFBUSxLQUFLLFNBQVMsR0FBRyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7Q0FDbkUsRUFBRSxLQUFLLElBQUksQ0FBQyxPQUFPLEtBQUssU0FBUyxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztDQUNoRSxFQUFFLEtBQUssSUFBSSxDQUFDLEtBQUssS0FBSyxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDOztDQUUxRCxFQUFFLEtBQUss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QUcsR0FBRyxTQUFTLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQztDQUN2RCxNQUFNLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxDQUFDLEtBQUssRUFBRSxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLENBQUM7Q0FDM0YsTUFBTSxPQUFPLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQzs7Q0FFckQsTUFBTSxNQUFNLEtBQUssRUFBRSxJQUFJLE1BQU0sR0FBRzs7Q0FFaEM7O0NBRUEsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0NBQ2IsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLENBQUM7Q0FDaEUsTUFBTSxPQUFPLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDOztDQUV6QyxNQUFNLE1BQU07O0NBRVo7O0NBRUEsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsSUFBSSxHQUFHLEdBQUcsU0FBUyxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUM7Q0FDckQsTUFBTSxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsQ0FBQyxLQUFLLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsQ0FBQztDQUN6RixNQUFNLE9BQU8sR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFB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QUFJLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxLQUFLLE9BQU8sQ0FBQzs7Q0FFN0MsR0FBRzs7Q0FFSCxFQUFFLEtBQUssT0FBTyxJQUFJLENBQUMsR0FBRzs7Q0FFdEIsR0FBRyxLQUFLLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxLQUFLLE9BQU8sQ0FBQztDQUM5QyxHQUFHLEtBQUssR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLEtBQUssT0FBTyxDQUFDOztDQUU5QyxHQUFHLE1BQU07O0NBRVQsR0FBRyxLQUFLLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxLQUFLLE9BQU8sQ0FBQztDQUM5QyxHQUFHLEtBQUssR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLEtBQUssT0FBTyxDQUFDOztDQUU5QyxHQUFHOztDQUVILEVBQUUsS0FBSyxFQUFFLElBQUksR0FBRyxLQUFLLFFBQVEsS0FBSyxHQUFHLElBQUksRUFBRSxHQUFHLE9BQU8sSUFBSSxDQUFDOztDQUUxRDtDQUNBOztDQUVBLEVBQUUsS0FBSyxLQUFLLEdBQUcsSUFBSSxJQUFJLElBQUksS0FBSyxJQUFJLEdBQUcsSUFBSSxHQUFHLEtBQUssQ0FBQzs7Q0FFcEQsRUFBRSxLQUFLLEtBQUssR0FBRyxJQUFJLElBQUksSUFBSSxLQUFLLElBQUksR0FBRyxJQUFJLEdBQUcsS0FBSyxDQUFDOztDQUVwRCxFQUFFLEtBQUssT0FBTyxJQUFJLENBQUMsR0FBRzs7Q0FFdEIsR0FBRyxLQUFLLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxLQUFLLE9BQU8sQ0FBQztDQUM5QyxHQUFHLEtBQUssR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLEtBQUssT0FBTyxDQUFDOztDQUU5QyxHQUFHLE1BQU07O0NBRVQsR0FBRyxLQUFLLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxLQUFLLE9BQU8sQ0FBQztDQUM5QyxHQUFHLEtBQUssR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLEtBQUssT0FBTyxDQUFDOztDQUU5QyxHQUFHOztDQUVILEVBQUUsS0FBSyxFQUFFLElBQUksR0FBRyxLQUFLLFFBQVEsS0FBSyxHQUFHLElBQUksRUFBRSxHQUFHLE9BQU8sSUFBSSxDQUFDOztDQUUxRCxFQUFFLEtBQUssS0FBSyxHQUFHLElBQUksSUFBSSxJQUFJLEtBQUssSUFBSSxHQUFHLElBQUksR0FBRyxLQUFLLENBQUM7O0NBRXBELEVBQUUsS0FBSyxLQUFLLEdBQUcsSUFBSSxJQUFJLElBQUksS0FBSyxJQUFJLEdBQUcsSUFBSSxHQUFHLEtBQUssQ0FBQzs7Q0FFcEQ7O0NBRUEsRUFBRSxLQUFLLElBQUksR0FBRyxDQUFDLEdBQUcsT0FBTyxJQUFJLENBQUM7O0NBRTlCLEVBQUUsT0FBTyxJQUFJLENBQUMsRUFBRSxFQUFFLElBQUksSUFBSSxDQUFDLEdBQUcsSUFBSSxHQUFHLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQzs7Q0FFcEQsRUFBRTs7Q0FFRixDQUFDLGFBQWEsRUFBRSxFQUFFLFlBQVk7O0NBRTlCLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQzs7Q0FFeEIsRUFBRSxPQUFPLFNBQVMsYUFBYSxFQUFFLEdBQUcsR0FBRzs7Q0FFdkMsR0FBRyxPQUFPLElBQUksQ0FBQyxZQUFZLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxLQUFLLElBQUksQ0FBQzs7Q0FFL0MsR0FBRyxDQUFDOztDQUVKLEVBQUUsSUFBSTs7Q0FFTixDQUFDLGlCQUFpQixFQUFFLFlBQVk7O0NBRWhDO0NBQ0EsRUFBRSxJQUFJLElBQUksR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO0NBQzNCLEVBQUUsSUFBSSxLQUFLLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztDQUM1QixFQUFFLElBQUksS0FBSyxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7Q0FDNUIsRUFBRSxJQUFJLE1BQU0sR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDOztDQUU3QixFQUFFLE9BQU8sU0FBUyxpQkFBaUIsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxlQUFlLEVBQUUsTUFBTSxHQUFHOztDQUV4RTs7Q0FFQSxHQUFHLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQzVCLEdBQUcsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDNUIsR0FBRyxNQUFNLENBQUMsWUFBWSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQzs7Q0FFdkM7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBLEdBQUcsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUM7Q0FDMUMsR0FBRyxJQUFJLElBQUksQ0FBQzs7Q0FFWixHQUFHLEtBQUssR0FBRyxHQUFHLENBQUMsR0FBRzs7Q0FFbEIsSUFBSSxLQUFLLGVBQWUsR0FBRyxPQUFPLElBQUksQ0FBQztDQUN2QyxJQUFJLElBQUksR0FBRyxDQUFDLENBQUM7O0NBRWIsSUFBSSxNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsR0FBRzs7Q0FFekIsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUM7Q0FDZixJQUFJLEdBQUcsR0FBRyxFQUFFLEdBQUcsQ0FBQzs7Q0FFaEIsSUFBSSxNQUFNOztDQUVWLElBQUksT0FBTyxJQUFJLENBQUM7O0NBRWhCLElBQUk7O0NBRUosR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDckMsR0FBRyxJQUFJLE1BQU0sR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLFlBQVksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQzs7Q0FFL0U7Q0FDQSxHQUFHLEtBQUssTUFBTSxHQUFHLENBQUMsR0FBRzs7Q0FFckIsSUFBSSxPQUFPLElBQUksQ0FBQzs7Q0FFaEIsSUFBSTs7Q0FFSixHQUFHLElBQUksTUFBTSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUM7O0NBRWpFO0NBQ0EsR0FBRyxLQUFLLE1BQU0sR0FBRyxDQUFDLEdBQUc7O0NBRXJCLElBQUksT0FBTyxJQUFJLENBQUM7O0NBRWhCLElBQUk7O0NBRUo7Q0FDQSxHQUFHLEtBQUssTUFBTSxHQUFHLE1BQU0sR0FBRyxHQUFHLEdBQUc7O0NBRWhDLElBQUksT0FBTyxJQUFJLENBQUM7O0NBRWhCLElBQUk7O0NBRUo7Q0FDQSxHQUFHLElBQUksR0FBRyxHQUFHLEVBQUUsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUM7O0NBRXpDO0NBQ0EsR0FBRyxLQUFLLEdBQUcsR0FBRyxDQUFDLEdBQUc7O0NBRWxCLElBQUksT0FBTyxJQUFJLENBQUM7O0NBRWhCLElBQUk7O0NBRUo7Q0FDQSxHQUFHLE9BQU8sSUFBSSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLE1BQU0sRUFBRSxDQUFDOztDQUV2QyxHQUFHLENBQUM7O0NBRUosRUFBRSxFQUFFOztDQUVKLENBQUMsWUFBWSxFQUFFLFdBQVcsT0FBTyxHQUFHOztDQUVwQyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLE9BQU8sRUFBRSxDQUFDO0NBQ3RDLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsRUFBRSxPQUFPLEVBQUUsQ0FBQzs7Q0FFL0MsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsTUFBTSxFQUFFLFdBQVcsR0FBRyxHQUFHOztDQUUxQixFQUFFLE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLEdBQUcsQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQzs7Q0FFcEYsRUFBRTs7Q0FFRixDQUFDLEVBQUUsQ0FBQzs7Q0FFSjtDQUNBO0NBQ0E7O0NBRUEsU0FBUyxLQUFLLEVBQUUsS0FBSyxFQUFFLEdBQUcsR0FBRzs7Q0FFN0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsS0FBSyxLQUFLLFNBQVMsS0FBSyxLQUFLLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztDQUM5RCxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsRUFBRSxHQUFHLEtBQUssU0FBUyxLQUFLLEdBQUcsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDOztDQUV4RCxDQUFDOztDQUVELE1BQU0sQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLFNBQVMsRUFBRTs7Q0FFaEMsQ0FBQyxHQUFHLEVBQUUsV0FBVyxLQUFLLEVBQUUsR0FBRyxHQUFHOztDQUU5QixFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDO0NBQzNCLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUM7O0NBRXZCLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLEtBQUssRUFBRSxZQUFZOztDQUVwQixFQUFFLE9BQU8sSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDOztDQUU3QyxFQUFFOztDQUVGLENBQUMsSUFBSSxFQUFFLFdBQVcsSUFBSSxHQUFHOztDQUV6QixFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztDQUNoQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQzs7Q0FFNUIsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsU0FBUyxFQUFFLFdBQVcsTUFBTSxHQUFHOztDQUVoQyxFQUFFLEtBQUssTUFBTSxLQUFLLFNBQVMsR0FBRzs7Q0FFOUIsR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLGtEQUFrRCxFQUFFLENBQUM7Q0FDdEUsR0FBRyxNQUFNLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQzs7Q0FFMUIsR0FBRzs7Q0FFSCxFQUFFLE9BQU8sTUFBTSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxjQUFjLEVBQUUsR0FBRyxFQUFFLENBQUM7O0NBRXpFLEVBQUU7O0NBRUYsQ0FBQyxLQUFLLEVBQUUsV0FBVyxNQUFNLEdBQUc7O0NBRTVCLEVBQUUsS0FBSyxNQUFNLEtBQUssU0FBUyxHQUFHOztDQUU5QixHQUFHLE9BQU8sQ0FBQyxJQUFJLEVBQUUsOENBQThDLEVBQUUsQ0FBQztDQUNsRSxHQUFHLE1BQU0sR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDOztDQUUxQixHQUFHOztDQUVILEVBQUUsT0FBTyxNQUFNLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDOztDQUVuRCxFQUFFOztDQUVGLENBQUMsVUFBVSxFQUFFLFlBQVk7O0NBRXpCLEVBQUUsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQzs7Q0FFbEQsRUFBRTs7Q0FFRixDQUFDLFFBQVEsRUFBRSxZQUFZOztDQUV2QixFQUFFLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDOztDQUUzQyxFQUFFOztDQUVGLENBQUMsRUFBRSxFQUFFLFdBQVcsQ0FBQyxFQUFFLE1BQU0sR0FBRzs7Q0FFNUIsRUFBRSxLQUFLLE1BQU0sS0FBSyxTQUFTLEdBQUc7O0NBRTlCLEdBQUcsT0FBTyxDQUFDLElBQUksRUFBRSwyQ0FBMkMsRUFBRSxDQUFDO0NBQy9ELEdBQUcsTUFBTSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7O0NBRTFCLEdBQUc7O0NBRUgsRUFBRSxPQUFPLElBQUksQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUMsY0FBYyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7O0NBRXBFLEVBQUU7O0NBRUYsQ0FBQyw0QkFBNEIsRUFBRSxZQUFZOztDQUUzQyxFQUFFLElBQUksTUFBTSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7Q0FDN0IsRUFBRSxJQUFJLFFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDOztDQUUvQixFQUFFLE9BQU8sU0FBUyw0QkFBNEIsRUFBRSxLQUFLLEVBQUUsV0FBVyxHQUFHOztDQUVyRSxHQUFHLE1BQU0sQ0FBQyxVQUFVLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztDQUMxQyxHQUFHLFFBQVEsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7O0NBRS9DLEdBQUcsSUFBSSxTQUFTLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxRQUFRLEVBQUUsQ0FBQztDQUM1QyxHQUFHLElBQUksZUFBZSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUM7O0NBRWhELEdBQUcsSUFBSSxDQUFDLEdBQUcsZUFBZSxHQUFHLFNBQVMsQ0FBQzs7Q0FFdkMsR0FBRyxLQUFLLFdBQVcsR0FBRzs7Q0FFdEIsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUUvQixJQUFJOztDQUVKLEdBQUcsT0FBTyxDQUFDLENBQUM7O0NBRVosR0FBRyxDQUFDOztDQUVKLEVBQUUsRUFBRTs7Q0FFSixDQUFDLG1CQUFtQixFQUFFLFdBQVcsS0FBSyxFQUFFLFdBQVcsRUFBRSxNQUFNLEdBQUc7O0NBRTlELEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLDRCQUE0QixFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsQ0FBQzs7Q0FFbEUsRUFBRSxLQUFLLE1BQU0sS0FBSyxTQUFTLEdBQUc7O0NBRTlCLEdBQUcsT0FBTyxDQUFDLElBQUksRUFBRSw0REFBNEQsRUFBRSxDQUFDO0NBQ2hGLEdBQUcsTUFBTSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7O0NBRTFCLEdBQUc7O0NBRUgsRUFBRSxPQUFPLElBQUksQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUMsY0FBYyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7O0NBRXBFLEVBQUU7O0NBRUYsQ0FBQyxZQUFZLEVBQUUsV0FBVyxNQUFNLEdBQUc7O0NBRW5DLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUUsTUFBTSxFQUFFLENBQUM7Q0FDcEMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxNQUFNLEVBQUUsQ0FBQzs7Q0FFbEMsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsTUFBTSxFQUFFLFdBQVcsSUFBSSxHQUFHOztDQUUzQixFQUFFLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQzs7Q0FFeEUsRUFBRTs7Q0FFRixDQUFDLEVBQUUsQ0FBQzs7Q0FFSjtDQUNBO0NBQ0E7Q0FDQTs7Q0FFQSxTQUFTLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRzs7Q0FFN0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLFNBQVMsS0FBSyxDQUFDLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztDQUNsRCxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssU0FBUyxLQUFLLENBQUMsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO0NBQ2xELENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxTQUFTLEtBQUssQ0FBQyxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7O0NBRWxELENBQUM7O0NBRUQsTUFBTSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUU7O0NBRXpCLENBQUMsU0FBUyxFQUFFLFlBQVk7O0NBRXhCLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQzs7Q0FFekIsRUFBRSxPQUFPLFNBQVMsU0FBUyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLE1BQU0sR0FBRzs7Q0FFL0MsR0FBRyxLQUFLLE1BQU0sS0FBSyxTQUFTLEdBQUc7O0NBRS9CLElBQUksT0FBTyxDQUFDLElBQUksRUFBRSxxREFBcUQsRUFBRSxDQUFDO0NBQzFFLElBQUksTUFBTSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7O0NBRTNCLElBQUk7O0NBRUosR0FBRyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUM3QixHQUFHLEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQ3pCLEdBQUcsTUFBTSxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQzs7Q0FFdEIsR0FBRyxJQUFJLGNBQWMsR0FBRyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7Q0FDMUMsR0FBRyxLQUFLLGNBQWMsR0FBRyxDQUFDLEdBQUc7O0NBRTdCLElBQUksT0FBTyxNQUFNLENBQUMsY0FBYyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLGNBQWMsRUFBRSxFQUFFLENBQUM7O0NBRXBFLElBQUk7O0NBRUosR0FBRyxPQUFPLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFaEMsR0FBRyxDQUFDOztDQUVKLEVBQUUsRUFBRTs7Q0FFSjtDQUNBO0NBQ0EsQ0FBQyxZQUFZLEVBQUUsWUFBWTs7Q0FFM0IsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO0NBQ3pCLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztDQUN6QixFQUFFLElBQUksRUFBRSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7O0NBRXpCLEVBQUUsT0FBTyxTQUFTLFlBQVksRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsTUFBTSxHQUFHOztDQUV6RCxHQUFHLEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQ3pCLEdBQUcsRUFBRSxDQUFDLFVBQVUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDekIsR0FBRyxFQUFFLENBQUMsVUFBVSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFN0IsR0FBRyxJQUFJLEtBQUssR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDO0NBQzVCLEdBQUcsSUFBSSxLQUFLLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQztDQUM1QixHQUFHLElBQUksS0FBSyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUM7Q0FDNUIsR0FBRyxJQUFJLEtBQUssR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDO0NBQzVCLEdBQUcsSUFBSSxLQUFLLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQzs7Q0FFNUIsR0FBRyxJQUFJLEtBQUssS0FBSyxLQUFLLEdBQUcsS0FBSyxHQUFHLEtBQUssR0FBRyxLQUFLLEVBQUUsQ0FBQzs7Q0FFakQsR0FBRyxLQUFLLE1BQU0sS0FBSyxTQUFTLEdBQUc7O0NBRS9CLElBQUksT0FBTyxDQUFDLElBQUksRUFBRSx3REFBd0QsRUFBRSxDQUFDO0NBQzdFLElBQUksTUFBTSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7O0NBRTNCLElBQUk7O0NBRUo7Q0FDQSxHQUFHLEtBQUssS0FBSyxLQUFLLENBQUMsR0FBRzs7Q0FFdEI7Q0FDQTtDQUNBLElBQUksT0FBTyxNQUFNLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRXZDLElBQUk7O0NBRUosR0FBRyxJQUFJLFFBQVEsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDO0NBQzVCLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLLEdBQUcsS0FBSyxHQUFHLEtBQUssR0FBRyxLQUFLLEtBQUssUUFBUSxDQUFDO0NBQ3hELEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLLEdBQUcsS0FBSyxHQUFHLEtBQUssR0FBRyxLQUFLLEtBQUssUUFBUSxDQUFDOztDQUV4RDtDQUNBLEdBQUcsT0FBTyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFeEMsR0FBRyxDQUFDOztDQUVKLEVBQUUsRUFBRTs7Q0FFSixDQUFDLGFBQWEsRUFBRSxZQUFZOztDQUU1QixFQUFFLElBQUksRUFBRSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7O0NBRXpCLEVBQUUsT0FBTyxTQUFTLGFBQWEsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUc7O0NBRWxELEdBQUcsUUFBUSxDQUFDLFlBQVksRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUM7O0NBRS9DLEdBQUcsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7O0NBRXJFLEdBQUcsQ0FBQzs7Q0FFSixFQUFFLEVBQUU7O0NBRUosQ0FBQyxFQUFFLENBQUM7O0NBRUosTUFBTSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsU0FBUyxFQUFFOztDQUVuQyxDQUFDLEdBQUcsRUFBRSxXQUFXLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHOztDQUUzQixFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQ25CLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDbkIsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFbkIsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsdUJBQXVCLEVBQUUsV0FBVyxNQUFNLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUc7O0NBRTFELEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7Q0FDOUIsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQztDQUM5QixFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDOztDQUU5QixFQUFFLE9BQU8sSUFBSSxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxLQUFLLEVBQUUsWUFBWTs7Q0FFcEIsRUFBRSxPQUFPLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQzs7Q0FFN0MsRUFBRTs7Q0FFRixDQUFDLElBQUksRUFBRSxXQUFXLFFBQVEsR0FBRzs7Q0FFN0IsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUM7Q0FDNUIsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUM7Q0FDNUIsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUM7O0NBRTVCLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLE9BQU8sRUFBRSxZQUFZOztDQUV0QixFQUFFLElBQUksRUFBRSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7Q0FDekIsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDOztDQUV6QixFQUFFLE9BQU8sU0FBUyxPQUFPLEdBQUc7O0NBRTVCLEdBQUcsRUFBRSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQztDQUNuQyxHQUFHLEVBQUUsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUM7O0NBRW5DLEdBQUcsT0FBTyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxDQUFDLE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQzs7Q0FFeEMsR0FBRyxDQUFDOztDQUVKLEVBQUUsRUFBRTs7Q0FFSixDQUFDLFdBQVcsRUFBRSxXQUFXLE1BQU0sR0FBRzs7Q0FFbEMsRUFBRSxLQUFLLE1BQU0sS0FBSyxTQUFTLEdBQUc7O0NBRTlCLEdBQUcsT0FBTyxDQUFDLElBQUksRUFBRSx1REFBdUQsRUFBRSxDQUFDO0NBQzNFLEdBQUcsTUFBTSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7O0NBRTFCLEdBQUc7O0NBRUgsRUFBRSxPQUFPLE1BQU0sQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDOztDQUVuRixFQUFFOztDQUVGLENBQUMsU0FBUyxFQUFFLFdBQVcsTUFBTSxHQUFHOztDQUVoQyxFQUFFLE9BQU8sUUFBUSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQzs7Q0FFOUQsRUFBRTs7Q0FFRixDQUFDLFFBQVEsRUFBRSxXQUFXLE1BQU0sR0FBRzs7Q0FFL0IsRUFBRSxLQUFLLE1BQU0sS0FBSyxTQUFTLEdBQUc7O0NBRTlCLEdBQUcsT0FBTyxDQUFDLElBQUksRUFBRSxvREFBb0QsRUFBRSxDQUFDO0NBQ3hFLEdBQUcsTUFBTSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7O0NBRTFCLEdBQUc7O0NBRUgsRUFBRSxPQUFPLE1BQU0sQ0FBQyxxQkFBcUIsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDOztDQUVoRSxFQUFFOztDQUVGLENBQUMsWUFBWSxFQUFFLFdBQVcsS0FBSyxFQUFFLE1BQU0sR0FBRzs7Q0FFMUMsRUFBRSxPQUFPLFFBQVEsQ0FBQyxZQUFZLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDOztDQUV4RSxFQUFFOztDQUVGLENBQUMsYUFBYSxFQUFFLFdBQVcsS0FBSyxHQUFHOztDQUVuQyxFQUFFLE9BQU8sUUFBUSxDQUFDLGFBQWEsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7Q0FFakUsRUFBRTs7Q0FFRixDQUFDLGFBQWEsRUFBRSxXQUFXLEdBQUcsR0FBRzs7Q0FFakMsRUFBRSxPQUFPLEdBQUcsQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7Q0FFeEMsRUFBRTs7Q0FFRixDQUFDLG1CQUFtQixFQUFFLFlBQVk7O0NBRWxDLEVBQUUsSUFBSSxLQUFLLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztDQUMxQixFQUFFLElBQUksUUFBUSxHQUFHLEVBQUUsSUFBSSxLQUFLLEVBQUUsRUFBRSxJQUFJLEtBQUssRUFBRSxFQUFFLElBQUksS0FBSyxFQUFFLEVBQUUsQ0FBQztDQUMzRCxFQUFFLElBQUksY0FBYyxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7Q0FDckMsRUFBRSxJQUFJLFlBQVksR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDOztDQUVuQyxFQUFFLE9BQU8sU0FBUyxtQkFBbUIsRUFBRSxLQUFLLEVBQUUsTUFBTSxHQUFHOztDQUV2RCxHQUFHLEtBQUssTUFBTSxLQUFLLFNBQVMsR0FBRzs7Q0FFL0IsSUFBSSxPQUFPLENBQUMsSUFBSSxFQUFFLCtEQUErRCxFQUFFLENBQUM7Q0FDcEYsSUFBSSxNQUFNLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQzs7Q0FFM0IsSUFBSTs7Q0FFSixHQUFHLElBQUksV0FBVyxHQUFHLFFBQVEsQ0FBQzs7Q0FFOUI7O0NBRUEsR0FBRyxLQUFLLENBQUMscUJBQXFCLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQztDQUN6RCxHQUFHLEtBQUssQ0FBQyxZQUFZLEVBQUUsS0FBSyxFQUFFLGNBQWMsRUFBRSxDQUFDOztDQUUvQzs7Q0FFQSxHQUFHLEtBQUssSUFBSSxDQUFDLGFBQWEsRUFBRSxjQUFjLEVBQUUsS0FBSyxJQUFJLEdBQUc7O0NBRXhEOztDQUVBLElBQUksTUFBTSxDQUFDLElBQUksRUFBRSxjQUFjLEVBQUUsQ0FBQzs7Q0FFbEMsSUFBSSxNQUFNOztDQUVWOztDQUVBLElBQUksUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQztDQUN4QyxJQUFJLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUM7Q0FDeEMsSUFBSSxRQUFRLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDOztDQUV4QyxJQUFJLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUVqRCxLQUFLLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxtQkFBbUIsRUFBRSxjQUFjLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDOztDQUU3RSxLQUFLLElBQUksUUFBUSxHQUFHLGNBQWMsQ0FBQyxpQkFBaUIsRUFBRSxZQUFZLEVBQUUsQ0FBQzs7Q0FFckUsS0FBSyxLQUFLLFFBQVEsR0FBRyxXQUFXLEdBQUc7O0NBRW5DLE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQzs7Q0FFN0IsTUFBTSxNQUFNLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDOztDQUVsQyxNQUFNOztDQUVOLEtBQUs7O0NBRUwsSUFBSTs7Q0FFSixHQUFHLE9BQU8sTUFBTSxDQUFDOztDQUVqQixHQUFHLENBQUM7O0NBRUosRUFBRSxFQUFFOztDQUVKLENBQUMsTUFBTSxFQUFFLFdBQVcsUUFBUSxHQUFHOztDQUUvQixFQUFFLE9BQU8sUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUM7O0NBRW5HLEVBQUU7O0NBRUYsQ0FBQyxFQUFFLENBQUM7O0NBRUo7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBOztDQUVBLFNBQVMsSUFBSSxFQUFFLFFBQVEsRUFBRSxRQUFRLEdBQUc7O0NBRXBDLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQzs7Q0FFdkIsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQzs7Q0FFcEIsQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsS0FBSyxTQUFTLEdBQUcsUUFBUSxHQUFHLElBQUksY0FBYyxFQUFFLENBQUM7Q0FDMUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsS0FBSyxTQUFTLEdBQUcsUUFBUSxHQUFHLElBQUksaUJBQWlCLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLFFBQVEsRUFBRSxFQUFFLENBQUM7O0NBRWxILENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxpQkFBaUIsQ0FBQzs7Q0FFbkMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQzs7Q0FFM0IsQ0FBQzs7Q0FFRCxJQUFJLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsU0FBUyxFQUFFLEVBQUU7O0NBRXJFLENBQUMsV0FBVyxFQUFFLElBQUk7O0NBRWxCLENBQUMsTUFBTSxFQUFFLElBQUk7O0NBRWIsQ0FBQyxXQUFXLEVBQUUsV0FBVyxLQUFLLEdBQUc7O0NBRWpDLEVBQUUsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7O0NBRXhCLEVBQUU7O0NBRUYsQ0FB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LEVBQUUsQ0FBQzs7Q0FFMUQsTUFBTTs7Q0FFTixLQUFLOztDQUVMLElBQUksTUFBTSxLQUFLLFFBQVEsQ0FBQyxVQUFVLEdBQUc7O0NBRXJDLElBQUksSUFBSSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQztDQUN0QixJQUFJLElBQUksZUFBZSxHQUFHLEtBQUssQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLENBQUM7O0NBRXBELElBQUksSUFBSSxRQUFRLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQztDQUNyQyxJQUFJLElBQUksS0FBSyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUM7Q0FDL0IsSUFBSSxJQUFJLEdBQUcsQ0FBQzs7Q0FFWixJQUFJLElBQUksYUFBYSxHQUFHLFFBQVEsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDcEQsSUFBSSxLQUFLLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxhQUFhLENBQUM7O0NBRXhELElBQUksTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRzs7Q0FFdkQsS0FBSyxJQUFJLElBQUksR0FBRyxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDM0IsS0FBSyxJQUFJLFlBQVksR0FBRyxlQUFlLEdBQUcsUUFBUSxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsR0FBRyxRQUFRLENBQUM7O0NBRXBGLEtBQUssS0FBSyxZQUFZLEtBQUssU0FBUyxHQUFHLFNBQVM7O0NBRWhELEtBQUssR0FBRyxHQUFHLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUM7Q0FDOUIsS0FBSyxHQUFHLEdBQUcsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQztDQUM5QixLQUFLLEdBQUcsR0FBRyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDOztDQUU5QixLQUFLLEtBQUssWUFB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SUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFOUIsQ0FBQzs7Q0FFRDs7Q0FFQSxTQUFTLFdBQVcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHOztDQUU5QixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLEdBQUc7O0NBRTFCLEVBQUUsRUFBRSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUVoQyxFQUFFLE1BQU07O0NBRVIsRUFBRSxFQUFFLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7O0NBRXRDLEVBQUU7O0NBRUYsQ0FBQzs7Q0FFRCxTQUFTLFdBQVcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHOztDQUU5QixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLEdBQUc7O0NBRTFCLEVBQUUsRUFBRSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7O0NBRTNDLEVBQUUsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxHQUFHOztDQUVqQyxFQUFFLEVBQUUsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDOztDQUUzQyxFQUFFLE1BQU07O0NBRVIsRUFBRSxFQUFFLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRWhDLEVBQUU7O0NBRUYsQ0FBQzs7Q0FFRCxTQUFTLFdBQVcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHOztDQUU5QixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLEdBQUc7O0NBRTFCLEVBQUUsRUFBRSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUVoQyxFQUFFLE1BQU07O0NBRVIsR0FBRyxFQUFFLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDOztDQUVqRCxFQUFFOztDQUVGLENBQUM7O0NBRUQ7O0NBRUEsU0FBUyxXQUFXLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBRzs7Q0FFOUIsQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLFFBQVEsSUFBSSxDQUFDLEVBQUUsQ0FBQzs7Q0FFMUQsQ0FBQzs7Q0FFRCxTQUFTLFdBQVcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHOztDQUU5QixDQUFDLEtBQUssQ0FBQyxDQUFDLFFBQVEsS0FBSyxTQUFTLEdBQUc7O0NBRWpDLEVBQUUsRUFBRSxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUU3QyxFQUFFLE1BQU07O0NBRVIsRUFBRSxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztDQUM5QixFQUFFLEVBQUUsQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsQ0FBQzs7Q0FFckQsRUFBRTs7Q0FFRixDQUFDOztDQUVELFNBQVMsV0FBVyxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUc7O0NBRTlCLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxLQUFLLFNBQVMsR0FBRzs7Q0FFakMsRUFBRSxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRTdDLEVBQUUsTUFBTTs7Q0FFUixFQUFFLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO0NBQzlCLEVBQUUsRUFBRSxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxDQUFDOztDQUVyRCxFQUFFOztDQUVGLENBQUM7O0NBRUQ7O0NBRUEsU0FBUyxVQUFVLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxRQUFRLEdBQUc7O0NBRXZDLENBQUMsSUFBSSxJQUFJLEdBQUcsUUFBUSxDQUFDLGdCQUFnQixFQUFFLENBQUM7Q0FDeEMsQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7Q0FDakMsQ0FBQyxRQUFRLENBQUMsWUFBWSxFQUFFLENBQUMsSUFBSSxZQUFZLEVBQUUsSUFBSSxFQUFFLENBQUM7O0NBRWxELENBQUM7O0NBRUQsU0FBUyxVQUFVLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxRQUFRLEdBQUc7O0NBRXZDLENBQUMsSUFBSSxJQUFJLEdBQUcsUUFBUSxDQUFDLGdCQUFnQixFQUFFLENBQUM7Q0FDeEMsQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7Q0FDakMsQ0FBQyxRQUFRLENBQUMsY0FBYyxFQUFFLENBQUMsSUFBSSxnQkFBZ0IsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7Q0FFeEQsQ0FBQzs7Q0FFRDs7Q0FFQSxTQUFTLFdBQVcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHOztDQUU5QixDQUFDLEVBQUUsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFL0IsQ0FBQzs7Q0FFRCxTQUFTLFdBQVcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHOztDQUU5QixDQUFDLEVBQUUsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFL0IsQ0FBQzs7Q0FFRCxTQUFTLFdBQVcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHOztDQUU5QixDQUFDLEVBQUUsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFL0IsQ0FBQzs7Q0FFRDs7Q0FFQSxTQUFTLGlCQUFpQixFQUFFLElBQUksR0FBRzs7Q0FFbkMsQ0FBQyxTQUFTLElBQUk7O0NBRWQsRUFBRSxLQUFLLE1BQU0sRUFBRSxPQUFPLFVBQVUsQ0FBQztDQUNqQyxFQUFFLEtBQUssTUFBTSxFQUFFLE9BQU8sV0FBVyxDQUFDO0NBQ2xDLEVBQUUsS0FBSyxNQUFNLEVBQUUsT0FBTyxXQUFXLENBQUM7Q0FDbEMsRUFBRSxLQUFLLE1BQU0sRUFBRSxPQUFPLFdBQVcsQ0FBQzs7Q0FFbEMsRUFBRSxLQUFLLE1BQU0sRUFBRSxPQUFPLFdBQVcsQ0FBQztDQUNsQyxFQUFFLEtBQUssTUFBTSxFQUFFLE9BQU8sV0FBVyxDQUFDO0NBQ2xDLEVBQUUsS0FBSyxNQUFNLEVBQUUsT0FBTyxXQUFXLENBQUM7O0NBRWxDLEVBQUUsS0FBSyxNQUFNLENBQUMsQ0FBQyxLQUFLLE1BQU0sRUFBRSxPQUFPLFVBQVUsQ0FBQztDQUM5QyxFQUFFLEtBQUssTUFBTSxFQUFFLE9BQU8sVUFBVSxDQUFDOztDQUVqQyxFQUFFLEtBQUssTUFBTSxDQUFDLENBQUMsS0FBSyxNQUFNLEVBQUUsT0FBTyxVQUFVLENBQUM7Q0FDOUMsRUFBRSxLQUFLLE1BQU0sQ0FBQyxDQUFDLEtBQUssTUFBTSxFQUFFLE9BQU8sV0FBVyxDQUFDO0NBQy9DLEVBQUUsS0FBSyxNQUFNLENBQUMsQ0FBQyxLQUFLLE1BQU0sRUFBRSxPQUFPLFdBQVcsQ0FBQztDQUMvQyxFQUFFLEtBQUssTUFBTSxDQUFDLENBQUMsS0FBSyxNQUFNLEVBQUUsT0FBTyxXQUFXLENBQUM7O0NBRS9DLEVBQUU7O0NBRUYsQ0FBQzs7Q0FFRDs7Q0FFQSxTQUFTLFdBQVcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHOztDQUU5QixDQUFDLEVBQUUsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFL0IsQ0FBQztDQUNELFNBQVMsV0FBVyxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUc7O0NBRTlCLENBQUMsRUFBRSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUUvQixDQUFDOztDQUVEOztDQUVBLFNBQVMsV0FBVyxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUc7O0NBRTlCLENBQUMsRUFBRSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDOztDQUV4RCxDQUFDOztDQUVELFNBQVMsV0FBVyxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUc7O0NBRTlCLENBQUMsRUFBRSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDOztDQUV4RCxDQUFDOztDQUVELFNBQVMsV0FBVyxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUc7O0NBRTlCLENBQUMsRUFBRSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDOztDQUV4RCxDQUFDOztDQUVEOztDQUVBLFNBQVMsV0FBVyxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUc7O0NBRTlCLENBQUMsRUFBRSxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDOztDQUVyRSxDQUFDOztDQUVELFNBQVMsV0FBVyxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUc7O0NBRTlCLENBQUMsRUFBRSxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDOztDQUVyRSxDQUFDOztDQUVELFNBQVMsV0FBVyxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUc7O0NBRTlCLENBQUMsRUFBRSxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDOztDQUV0RSxDQUFDOztDQUVEOztDQUVBLFNBQVMsV0FBVyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsUUFBUSxHQUFHOztDQUV4QyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNO0NBQ2pCLEVBQUUsS0FBSyxHQUFHLGFBQWEsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRXZDLENBQUMsRUFBRSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDOztDQUVuQyxDQUFDLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUc7O0NBRWxDLEVBQUUsUUFBUSxDQUFDLFlBQVksRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksWUFBWSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDOztDQUU5RCxFQUFFOztDQUVGLENBQUM7O0NBRUQsU0FBUyxXQUFXLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxRQUFRLEdBQUc7O0NBRXhDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU07Q0FDakIsRUFBRSxLQUFLLEdBQUcsYUFBYSxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFdkMsQ0FBQyxFQUFFLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUM7O0NBRW5DLENBQUMsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRzs7Q0FFbEMsRUFBRSxRQUFRLENBQUMsY0FBYyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxnQkFBZ0IsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQzs7Q0FFcEUsRUFBRTs7Q0FFRixDQUFDOztDQUVEOztDQUVBLFNBQVMsa0JBQWtCLEVBQUUsSUFBSSxHQUFHOztDQUVwQyxDQUFDLFNBQVMsSUFBSTs7Q0FFZCxFQUFFLEtBQUssTUFBTSxFQUFFLE9BQU8sV0FBVyxDQUFDO0NBQ2xDLEVBQUUsS0FBSyxNQUFNLEVBQUUsT0FBTyxXQUFXLENBQUM7Q0FDbEMsRUFBRSxLQUFLLE1BQU0sRUFBRSxPQUFPLFdBQVcsQ0FBQztDQUNsQyxFQUFFLEtBQUssTUFBTSxFQUFFLE9BQU8sV0FBVyxDQUFDOztDQUVsQyxFQUFFLEtBQUssTUFBTSxFQUFFLE9BQU8sV0FBVyxDQUFDO0NBQ2xDLEVBQUUsS0FBSyxNQUFNLEVBQUUsT0FBTyxXQUFXLENBQUM7Q0FDbEMsRUFBRSxLQUFLLE1BQU0sRUFBRSxPQUFPLFdBQVcsQ0FBQzs7Q0FFbEMsRUFBRSxLQUFLLE1BQU0sRUFBRSxPQUFPLFdBQVcsQ0FBQztDQUNsQyxFQUFFLEtBQUssTUFBTSxFQUFFLE9BQU8sV0FBVyxDQUFDOztDQUVsQyxFQUFFLEtBQUssTUFBTSxDQUFDLENBQUMsS0FBSyxNQUFNLEVBQUUsT0FBTyxXQUFXLENBQUM7Q0FDL0MsRUFBRSxLQUFLLE1BQU0sQ0FBQyxDQUFDLEtBQUssTUFBTSxFQUFFLE9BQU8sV0FBVyxDQUFDO0NBQy9DLEVBQUUsS0FBSyxNQUFNLENBQUMsQ0FBQyxLQUFLLE1BQU0sRUFBRSxPQUFPLFdBQVcsQ0FBQztDQUMvQyxFQUFFLEtBQUssTUFBTSxDQUFDLENBQUMsS0FBSyxNQUFNLEVBQUUsT0FBTyxXQUFXLENBQUM7O0NBRS9DLEVBQUU7O0NBRUYsQ0FBQzs7Q0FFRDs7Q0FFQSxTQUFTLGFBQWEsRUFBRSxFQUFFLEVBQUUsVUFBVSxFQUFFLElBQUksR0FBRzs7Q0FFL0MsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztDQUNkLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7Q0FDbEIsQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLGlCQUFpQixFQUFFLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQzs7Q0FFdEQ7O0NBRUEsQ0FBQzs7Q0FFRCxTQUFTLGdCQUFnQixFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUUsSUFBSSxHQUFHOztDQUVsRCxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDO0NBQ2QsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztDQUNsQixDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQztDQUM3QixDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsa0JBQWtCLEVBQUUsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDOztDQUV2RDs7Q0FFQSxDQUFDOztDQUVELFNBQVMsaUJBQWlCLEVBQUUsRUFBRSxHQUFHOztDQUVqQyxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDOztDQUVkLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDOztDQUUvQixDQUFDOztDQUVELGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxRQUFRLEdBQUcsV0FBVyxFQUFFLEVBQUUsS0FBSyxHQUFHOztDQUU5RDtDQUNBOztDQUVBLENBQUMsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQzs7Q0FFcEIsQ0FBQyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHOztDQUVsRCxFQUFFLElBQUksQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNuQixFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQzs7Q0FFbEMsRUFBRTs7Q0FFRixDQUFDLENBQUM7O0NBRUY7O0NBRUE7O0NBRUEsSUFBSSxVQUFVLEdBQUcsMEJBQTBCLENBQUM7O0NBRTVDO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7O0NBRUEsU0FBUyxVQUFVLEVBQUUsU0FBUyxFQUFFLGFBQWEsR0FBRzs7Q0FFaEQsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxhQUFhLEVBQUUsQ0FBQztDQUNyQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsYUFBYSxDQUFDLEVBQUUsRUFBRSxHQUFHLGFBQWEsQ0FBQzs7Q0FFbkQsQ0FBQzs7Q0FFRCxTQUFTLFlBQVksRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLFNBQVMsR0FBRzs7Q0FFckQsQ0FBQyxJQUFJLElBQUksR0FBRyxVQUFVLENBQUMsSUFBSTtDQUMzQixFQUFFLFVBQVUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDOztDQUUzQjtDQUNBLENBQUMsVUFBVSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUM7O0NBRTFCLENBQUMsWUFBWTs7Q0FFYixFQUFFLElBQUksS0FBSyxHQUFHLFVBQVUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFO0NBQ3JDLEdBQUcsUUFBUSxHQUFHLFVBQVUsQ0FBQyxTQUFTOztDQUVsQyxHQUFHLEVBQUUsR0FBRyxLQUFLLEVBQUUsQ0FBQyxFQUFFO0NBQ2xCLEdBQUcsU0FBUyxHQUFHLEtBQUssRUFBRSxDQUFDLEVBQUUsS0FBSyxHQUFHO0NBQ2pDLEdBQUcsU0FBUyxHQUFHLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFMUIsRUFBRSxLQUFLLFNBQVMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQzs7Q0FFL0IsRUFBRSxLQUFLLFNBQVMsS0FBSyxTQUFTLElBQUksU0FBUyxLQUFLLEdBQUcsSUFBSSxRQUFRLEdBQUcsQ0FBQyxLQUFLLFVBQVUsR0FBRzs7Q0FFckY7O0NBRUEsR0FBRyxVQUFVLEVBQUUsU0FBUyxFQUFFLFNBQVMsS0FBSyxTQUFTO0NBQ2pELElBQUksSUFBSSxhQUFhLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUU7Q0FDN0MsSUFBSSxJQUFJLGdCQUFnQixFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQzs7Q0FFbkQsR0FBRyxNQUFNOztDQUVULEdBQUcsTUFBTTs7Q0FFVDs7Q0FFQSxHQUFHLElBQUksR0FBRyxHQUFHLFNBQVMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQzs7Q0FFN0MsR0FBRyxLQUFLLElBQUksS0FBSyxTQUFTLEdBQUc7O0NBRTdCLElBQUksSUFBSSxHQUFHLElBQUksaUJBQWlCLEVBQUUsRUFBRSxFQUFFLENBQUM7Q0FDdkMsSUFBSSxVQUFVLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDOztDQUVsQyxJQUFJOztDQUVKLEdBQUcsU0FBUyxHQUFHLElBQUksQ0FBQzs7Q0FFcEIsR0FBRzs7Q0FFSCxFQUFFOztDQUVGLENBQUM7O0NBRUQ7O0NBRUEsU0FBUyxhQUFhLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxRQUFRLEdBQUc7O0NBRWhELENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDOztDQUUvQixDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDOztDQUUxQixDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxtQkFBbUIsRUFBRSxPQUFPLEVBQUUsRUFBRSxDQUFDLGVBQWUsRUFBRSxDQUFDOztDQUUvRCxDQUFDLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUc7O0NBRWhDLEVBQUUsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDLGdCQUFnQixFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUU7Q0FDOUMsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDLGtCQUFrQixFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7O0NBRXRELEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7O0NBRW5DLEVBQUU7O0NBRUYsQ0FBQzs7Q0FFRCxhQUFhLENBQUMsU0FBUyxDQUFDLFFBQVEsR0FBRyxXQUFXLEVBQUUsRUFBRSxJQUFJLEVBQUUsS0FBSyxHQUFHOztDQUVoRSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUM7O0NBRTFCLENBQUMsS0FBSyxDQUFDLEtBQUssU0FBUyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7O0NBRS9ELENBQUMsQ0FBQzs7Q0FFRixhQUFhLENBQUMsU0FBUyxDQUFDLFdBQVcsR0FBRyxXQUFXLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxHQUFHOztDQUVwRSxDQUFDLElBQUksQ0FBQyxHQUFHLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQzs7Q0FFeEIsQ0FBQyxLQUFLLENBQUMsS0FBSyxTQUFTLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUVyRCxDQUFDLENBQUM7OztDQUdGOztDQUVBLGFBQWEsQ0FBQyxNQUFNLEdBQUcsV0FBVyxFQUFFLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxRQUFRLEdBQUc7O0NBRTlELENBQUMsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRzs7Q0FFbEQsRUFBRSxJQUFJLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0NBQ2xCLEdBQUcsQ0FBQyxHQUFHLE1BQU0sRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7O0NBRXRCLEVBQUUsS0FBSyxDQUFDLENBQUMsV0FBVyxLQUFLLEtBQUssR0FBRzs7Q0FFakM7Q0FDQSxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLENBQUM7O0NBRXZDLEdBQUc7O0NBRUgsRUFBRTs7Q0FFRixDQUFDLENBQUM7O0NBRUYsYUFBYSxDQUFDLFlBQVksR0FBRyxXQUFXLEdBQUcsRUFBRSxNQUFNLEdBQUc7O0NBRXRELENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDOztDQUVaLENBQUMsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRzs7Q0FFbEQsRUFBRSxJQUFJLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDbkIsRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRXBDLEVBQUU7O0NBRUYsQ0FBQyxPQUFPLENBQUMsQ0FBQzs7Q0FFVixDQUFDLENBQUM7O0NBRUY7Q0FDQTtDQUNBOztDQUVBLFNBQVMsY0FBYyxFQUFFLE1BQU0sR0FBRzs7Q0FFbEMsQ0FBQyxJQUFJLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDOztDQUVsQyxDQUFDLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMs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LEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0NBQ3ZFLEtBQUssSUFBSSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7O0NBRXZFLEtBQUssS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7Q0FDekIsS0FBSyxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztDQUN6QixLQUFLLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDOztDQUV6QixLQUFLLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDO0NBQ3pCLEtBQUssS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7Q0FDekIsS0FBSyxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQzs7Q0FFekIsS0FBSyxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztDQUN6QixLQUFLLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDO0NBQ3pCLEtBQUssS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7O0NBRXpCLEtBQUs7O0NBRUwsSUFBSTs7Q0FFSixHQUFHLEdBQUcsQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDLFlBQVksRUFBRSxNQUFNLENBQUMsV0FBVyxFQUFFLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQzs7Q0FFNUUsR0FBRyxLQUFLLENBQUMsZUFBZSxFQUFFLGlCQUFpQixDQUFDLE1BQU0sRUFB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LEtBQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7O0NBRXZCOztDQUVBLElBQUksSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDO0NBQzNCLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDO0NBQ3pDLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO0NBQzVDLElBQUksS0FBSyxLQUFLLENBQUMsR0FBRyxLQUFLLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUM7O0NBRXJFLElBQUk7O0NBRUo7O0NBRUEsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUVoRSxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFckMsSUFBSSxLQUFLLEVBQUUsS0FBSyxDQUFDLE1BQU0sS0FBSyxFQUFFLENBQUMsUUFBUSxLQUFLLENBQUMsTUFBTSxLQUFLLElBQUksRUFBRSxNQUFNLEtBQUssRUFBRSxLQUFLLENBQUMsTUFBTSxFQUFFLEtBQUssU0FBUyxFQUFFLEdBQUc7O0NBRTVHOztDQUVBLEtBQUssS0FBSyxFQUFFLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7O0NBRTdDLEtBQUssTUFBTTs7Q0FFWDs7Q0FFQSxLQUFLLElBQUksQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7O0NBRTVCLEtBQUs7O0NBRUwsSUFBSTs7Q0FFSixHQUFHOztDQUVIO0NBQ0E7O0NBRUEsRUFBRSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxFQUFFLENBQUM7O0NBRWpDLEVBQUUsT0FBTyxLQUFLLENBQUM7O0NBRWYsRUFBRTs7Q0FFRixDQUFDLElBQUksRUFBRSxXQUFXLFFBQVEsRUFBRSxVQUFVLEdBQUc7O0NBRXpDLEVBQUUsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7O0NBRTNCLEVBQUUsS0FBSyxVQUFVLEtBQUssU0FBUyxHQUFHOztDQUVsQyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7Q0FFbEMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGlCQUFpQixFQUFFLENBQUM7O0NBRXJDLEdBQUcsVUFBVSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7O0NBRWpDLEdBQUc7O0NBRUgsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUUsQ0FBQztDQUNyQyxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLEVBQUUsVUFBVSxFQUFFLENBQUM7O0NBRWxELEVBQUU7O0NBRUYsQ0FBQyxJQUFJLEVBQUUsWUFBWTs7Q0FFbkIsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDOztDQUV2QixFQUFFOztDQUVGLENBQUMsb0JBQW9CLEVBQUUsWUFBWTs7Q0FFbkMsRUFBRSxJQUFJLEtBQUssRUFBRSxDQUFDLENBQUM7O0NBRWYsRUFBRSxLQUFLLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEdBQUc7O0NBRW5ELEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0NBRTdELElBQUksSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRTVDLElBQUksS0FBSyxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUMsZUFBZSxFQUFFLENBQUM7O0NBRXZDLElBQUksS0FBSyxLQUFLLEtBQUssUUFBUSxHQUFHOztDQUU5QixLQUFLLEVBQUUsQ0FBQyxjQUFjLEVBQUUsS0FBSyxFQUFFLENBQUM7O0NBRWhDLEtBQUssTUFBTTs7Q0FFWCxLQUFLLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRTFCLEtBQUs7O0NBRUwsSUFBSTs7Q0FFSixHQUFHLE1BQU0sS0FBSyxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLEdBQUc7O0NBRWhFLEdBQUcsSUFBSSxHQUFHLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQzs7Q0FFM0IsR0FBRyxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUM7O0NBRXhELEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUU3QyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNqQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNqQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNqQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFakMsSUFBSSxLQUFLLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxlQUFlLEVBQUUsQ0FBQzs7Q0FFeEMsSUFBSSxLQUFLLEtBQUssS0FBSyxRQUFRLEdBQUc7O0NBRTlCLEtBQUssR0FBRyxDQUFDLGNBQWMsRUFBRSxLQUFLLEVBQUUsQ0FBQzs7Q0FFakMsS0FBSyxNQUFNOztDQUVYLEtBQUssR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFM0IsS0FBSzs7Q0FFTCxJQUFJLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7Q0FFeEQsSUFBSTs7Q0FFSixHQUFHOztDQUVILEVBQUU7O0NBRUYsQ0FBQyxpQkFBaUIsRUFBRSxXQUFXLEtBQUssR0FBRzs7Q0FFdkMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUM7O0NBRXZELEVBQUUsS0FBSyxJQUFJLENBQUMsUUFBUSxLQUFLLFVBQVUsR0FBRzs7Q0FFdEMsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQzs7Q0FFekQsR0FBRyxNQUFNLEtBQUssSUFBSSxDQUFDLFFBQVEsS0FBSyxVQUFVLEdBQUc7O0NBRTdDLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7O0NBRXhELEdBQUcsTUFBTTs7Q0FFVCxHQUFHLE9BQU8sQ0FBQyxJQUFJLEVBQUUsNENBQTRDLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDOztDQUVoRixHQUFHOztDQUVILEVBQUU7O0NBRUYsQ0FBQyxLQUFLLEVBQUUsWUFBWTs7Q0FFcEIsRUFBRSxPQUFPLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7O0NBRTNFLEVBQUU7O0NBRUYsQ0FBQyxFQUFFLENBQUM7O0NBRUo7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7O0NBRUEsU0FBUyxpQkFBaUIsRUFBRSxVQUFVLEdBQUc7O0NBRXpDLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQzs7Q0FFdkIsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLG1CQUFtQixDQUFDOztDQUVqQyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxLQUFLLEVBQUUsUUFBUSxFQUFFLENBQUM7O0NBRXBDLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUM7Q0FDcEIsQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztDQUN4QixDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDOztDQUV6QixDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDOztDQUVyQixDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsVUFBVSxFQUFFLENBQUM7O0NBRTlCLENBQUM7O0NBRUQsaUJBQWlCLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDO0NBQ2xFLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxXQUFXLEdBQUcsaUJBQWlCLENBQUM7O0NBRTVELGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUM7O0NBRXZELGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxJQUFJLEdBQUcsV0FBVyxNQUFNLEdBQUc7O0NBRXZELENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQzs7Q0FFOUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7O0NBRWpDLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDO0NBQ25DLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDO0NBQy9CLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDOztDQUVqQyxDQUFDLE9BQU8sSUFBSSxDQUFDOztDQUViLENBQUMsQ0FBQzs7Q0FFRjtDQUNBO0NBQ0E7O0NBRUEsU0FBUyxJQUFJLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxJQUFJLEdBQUc7O0NBRTFDLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxHQUFHOztDQUVuQixFQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsaUdBQWlHLEVBQUUsQ0FBQztDQUNwSCxFQUFFLE9BQU8sSUFBSSxZQUFZLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxDQUFDOztDQUVoRCxFQUFFOztDQUVGLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQzs7Q0FFdkIsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQzs7Q0FFcEIsQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsS0FBSyxTQUFTLEdBQUcsUUFBUSxHQUFHLElBQUksY0FBYyxFQUFFLENBQUM7Q0FDMUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsS0FBSyxTQUFTLEdBQUcsUUFBUSxHQUFHLElBQUksaUJBQWlCLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLFFBQVEsRUFBRSxFQUFFLENBQUM7O0NBRWxILENBQUM7O0NBRUQsSUFBSSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLFNBQVMsRUFBRSxFQUFFOztDQUVyRSxDQUFDLFdBQVcsRUFBRSxJQUFJOztDQUVsQixDQUFDLE1BQU0sRUFBRSxJQUFJOztDQUViLENBQUMsb0JBQW9CLElBQUksWUFBWTs7Q0FFckMsRUFBRSxJQUFJLEtBQUssR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO0NBQzVCLEVBQUUsSUFBSSxHQUFHLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQzs7Q0FFMUIsRUFBRSxPQUFPLFNBQVMsb0JBQW9CLEdBQUc7O0NBRXpDLEdBQUcsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQzs7Q0FFaEMsR0FBRyxLQUFLLFFBQVEsQ0FBQyxnQkFBZ0IsR0FBRzs7Q0FFcEM7O0NBRUEsSUFBSSxLQUFLLFFBQVEsQ0FBQyxLQUFLLEtBQUssSUFBSSxHQUFHOztDQUVuQyxLQUFLLElBQUksaUJBQWlCLEdBQUcsUUFBUSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUM7Q0FDMUQsS0FBSyxJQUFJLGFBQWEsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUUvQixLQUFLLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRzs7Q0FFakUsTUFBTSxLQUFLLENBQUMsbUJBQW1CLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO0NBQzVELE1BQU0sR0FBRyxDQUFDLG1CQUFtQixFQUFFLGlCQUFpQixFQUFFLENBQUMsRUFBRSxDQUFDOztDQUV0RCxNQUFNLGFBQWEsRUFBRSxDQUFDLEVBQUUsR0FBRyxhQUFhLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO0NBQ2xELE1BQU0sYUFBYSxFQUFFLENBQUMsRUFBRSxJQUFJLEtBQUssQ0FBQyxVQUFVLEVBQUUsR0FBRyxFQUFFLENBQUM7O0NBRXBELE1BQU07O0NBRU4sS0FBSyxRQUFRLENBQUMsWUFBWSxFQUFFLGNBQWMsRUFBRSxJQUFJLHNCQUFzQixFQUFFLGFBQWEsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDOztDQUU3RixLQUFLLE1BQU07O0NBRVgsS0FBSyxPQUFPLENBQUMsSUFBSSxFQUFFLCtGQUErRixFQUFFLENBQUM7O0NBRXJILEtBQUs7O0NBRUwsSUFBSSxNQUFNLEtBQUssUUFBUSxDQUFDLFVBQVUsR0FBRzs7Q0FFckMsSUFBSSxJQUFJLFFBQVEsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDO0NBQ3JDLElBQUksSUFBSSxhQUFhLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQzs7Q0FFL0MsSUFBSSxhQUFhLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDOztDQUUzQixJQUFJLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0NBRXhELEtBQUssYUFBYSxFQUFFLENBQUMsRUFBRSxHQUFHLGFBQWEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Q0FDakQsS0FBSyxhQUFhLEVBQUUsQ0FBQyxFQUFFLElBQUksUUFBUSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxVQUFVLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7O0NBRXpFLEtBQUs7O0NBRUwsSUFBSTs7Q0FFSixHQUFHLE9BQU8sSUFBSSxDQUFDOztDQUVmLEdBQUcsQ0FBQzs7Q0FFSixFQUFFLEVBQUUsRUFBRTs7Q0FFTixDQUFDLE9BQU8sSUFBSSxZQUFZOztDQUV4QixFQUFFLElBQUksYUFBYSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7Q0FDcEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO0NBQ3RCLEVBQUUsSUFBSSxNQUFNLEdBQUcsSUFBSSxNQUFNLEVBQUUsQ0FBQzs7Q0FFNUIsRUFBRSxPQUFPLFNBQVMsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEdBQUc7O0NBRW5ELEdBQUcsSUFBSSxTQUFTLEdBQUcsU0FBUyxDQUFDLGFBQWEsQ0FBQztDQUMzQyxHQUFHLElBQUksV0FBVyxHQUFHLFNBQVMsR0FBRyxTQUFTLENBQUM7O0NBRTNDLEdBQUcsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztDQUNoQyxHQUFHLElBQUksV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7O0NBRXRDOztDQUVBLEdBQUcsS0FBSyxRQUFRLENBQUMsY0FBYyxLQUFLLElBQUksR0FBRyxRQUFRLENBQUMscUJBQXFCLEVBQUUsQ0FBQzs7Q0FFNUUsR0FBRyxNQUFNLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxjQUFjLEVBQUUsQ0FBQztDQUMxQyxHQUFHLE1BQU0sQ0FBQyxZQUFZLEVBQUUsV0FBVyxFQUFFLENBQUM7O0NBRXRDLEdBQUcsS0FBSyxTQUFTLENBQUMsR0FBRyxDQUFDLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxLQUFLLEtBQUssR0FBRyxPQUFPOztDQUVwRTs7Q0FFQSxHQUFHLGFBQWEsQ0FBQyxVQUFVLEVBQUUsV0FBVyxFQUFFLENBQUM7Q0FDM0MsR0FBRyxHQUFHLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxZQUFZLEVBQUUsYUFBYSxFQUFFLENBQUM7O0NBRTNELEdBQUcsSUFBSSxNQUFNLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztDQUM5QixHQUFHLElBQUksSUFBSSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7Q0FDNUIsR0FBRyxJQUFJLFlBQVksR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO0NBQ3BDLEdBQUcsSUFBSSxRQUFRLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztDQUNoQyxHQUFHLElBQUksSUFBSSxHQUFHLEVBQUUsSUFBSSxJQUFJLElBQUksQ0FBQyxjQUFjLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQzs7Q0FFdEQsR0FBRyxLQUFLLFFBQVEsQ0FBQyxnQkFBZ0IsR0FBRzs7Q0FFcEMsSUFBSSxJQUFJLEtBQUssR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDO0NBQy9CLElBQUksSUFBSSxVQUFVLEdBQUcsUUFBUSxDQUFDLFVBQVUsQ0FBQztDQUN6QyxJQUFJLElBQUksU0FBUyxHQUFHLFVBQVUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDOztDQUU5QyxJQUFJLEtBQUssS0FBSyxLQUFLLElBQUksR0FBRzs7Q0FFMUIsS0FBSyxJQUFJLE9BQU8sR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDOztDQUUvQixLQUFLLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLEdBQUc7O0NBRWpFLE1BQU0sSUFBSSxDQUFDLEdBQUcsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQzNCLE1BQU0sSUFBSSxDQUFDLEdBQUcsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQzs7Q0FFL0IsTUFBTSxNQUFNLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Q0FDM0MsTUFBTSxJQUFJLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7O0NBRXpDLE1BQU0sSUFBSSxNQUFNLEdBQUcsR0FBRyxDQUFDLG1CQUFtQixFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxDQUFDOztDQUVuRixNQUFNLEtBQUssTUFBTSxHQUFHLFdBQVcsR0FBRyxTQUFTOztDQUUzQyxNQUFNLFFBQVEsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDOztDQUVoRCxNQUFNLElBQUksUUFBUSxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxRQUFRLEVBQUUsQ0FBQzs7Q0FFakUsTUFBTSxLQUFLLFFBQVEsR0FBRyxTQUFTLENBQUMsSUFBSSxJQUFJLFFBQVEsR0FBRyxTQUFTLENBQUMsR0FBRyxHQUFHLFNBQVM7O0NBRTVFLE1BQU0sVUFBVSxDQUFDLElBQUksRUFBRTs7Q0FFdkIsT0FBTyxRQUFRLEVBQUUsUUFBUTtDQUN6QjtDQUNBO0NBQ0EsT0FBTyxLQUFLLEVBQUUsWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFO0NBQ25FLE9BQU8sS0FBSyxFQUFFLENBQUM7Q0FDZixPQUFPLElBQUksRUFBRSxJQUFJO0NBQ2pCLE9BQU8sU0FBUyxFQUFFLElBQUk7Q0FDdEIsT0FBTyxNQUFNLEVBQUUsSUFBSTs7Q0FFbkIsT0FBTyxFQUFFLENBQUM7O0NBRVYsTUFBTTs7Q0FFTixLQUFLLE1BQU07O0NBRVgsS0FBSyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksR0FBRzs7Q0FFdkUsTUFBTSxNQUFNLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Q0FDM0MsTUFBTSxJQUFJLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDOztDQUU3QyxNQUFNLElBQUksTUFBTSxHQUFHLEdBQUcsQ0FBQyxtQkFBbUIsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsQ0FBQzs7Q0FFbkYsTUFBTSxLQUFLLE1BQU0sR0FBRyxXQUFXLEdBQUcsU0FBUzs7Q0FFM0MsTUFBTSxRQUFRLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQzs7Q0FFaEQsTUFBTSxJQUFJLFFBQVEsR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsUUFBUSxFQUFFLENBQUM7O0NBRWpFLE1BQU0sS0FBSyxRQUFRLEdBQUcsU0FBUyxDQUFDLElBQUksSUFBSSxRQUFRLEdBQUcsU0FBUyxDQUFDLEdBQUcsR0FBRyxTQUFTOztDQUU1RSxNQUFNLFVBQVUsQ0FBQyxJQUFJLEVBQUU7O0NBRXZCLE9BQU8sUUFBUSxFQUFFLFFBQVE7Q0FDekI7Q0FDQTtDQUNBLE9BQU8sS0FBSyxFQUFFLFlBQVksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRTtDQUNuRSxPQUFPLEtBQUssRUFBRSxDQUFDO0NBQ2YsT0FBTyxJQUFJLEVBQUUsSUFBSTtDQUNqQixPQUFPLFNBQVMsRUFBRSxJQUFJO0NBQ3RCLE9BQU8sTUFBTSxFQUFFLElBQUk7O0NBRW5CLE9BQU8sRUFBRSxDQUFDOztDQUVWLE1BQU07O0NBRU4sS0FBSzs7Q0FFTCxJQUFJLE1BQU0sS0FBSyxRQUFRLENBQUMsVUFBVSxHQUFHOztDQUVyQyxJQUFJLElBQUksUUFBUSxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUM7Q0FDckMsSUFBSSxJQUFJLFVBQVUsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDOztDQUVyQyxJQUFJLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxVQUFVLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLEdBQUc7O0NBRXJELEtBQUssSUFBSSxNQUFNLEdBQUcsR0FBRyxDQUFDLG1CQUFtQixFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsQ0FBQzs7Q0FFdEcsS0FBSyxLQUFLLE1BQU0sR0FBRyxXQUFXLEdBQUcsU0FBUzs7Q0FFMUMsS0FBSyxRQUFRLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQzs7Q0FFL0MsS0FBSyxJQUFJLFFBQVEsR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsUUFBUSxFQUFFLENBQUM7O0NBRWhFLEtBQUssS0FBSyxRQUFRLEdBQUcsU0FBUyxDQUFDLElBQUksSUFBSSxRQUFRLEdBQUcsU0FBUyxDQUFDLEdBQUcsR0FBRyxTQUFTOztDQUUzRSxLQUFLLFVBQVUsQ0FBQyxJQUFJLEVBQUU7O0NBRXRCLE1BQU0sUUFBUSxFQUFFLFFBQVE7Q0FDeEI7Q0FDQTtDQUNBLE1BQU0sS0FBSyxFQUFFLFlBQVksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRTtDQUNsRSxNQUFNLEtBQUssRUFBRSxDQUFDO0NBQ2QsTUFBTSxJQUFJLEVBQUUsSUFBSTtDQUNoQixNQUFNLFNBQVMsRUFBRSxJQUFJO0NBQ3JCLE1BQU0sTUFBTSxFQUFFLElBQUk7O0NBRWxCLE1BQU0sRUFBRSxDQUFDOztDQUVULEtBQUs7O0NBRUwsSUFBSTs7Q0FFSixHQUFHLENBQUM7O0NBRUosRUFBRSxFQUFFLEVBQUU7O0NBRU4sQ0FBQyxLQUFLLEVBQUUsWUFBWTs7Q0FFcEIsRUFBRSxPQUFPLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7O0NBRTNFLEVBQUU7O0NBRUYsQ0FBQyxFQUFFLENBQUM7O0NBRUo7Q0FDQTtDQUNBOztDQUVBLFNBQVMsWUFBWSxFQUFFLFFBQVEsRUFBRSxRQUFRLEdBQUc7O0NBRTVDLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxDQUFDOztDQUV2QyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsY0FBYyxDQUFDOztDQUU1QixDQUFDOztDQUVELFlBQVksQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRTs7Q0FFekUsQ0FBQyxXQUFXLEVBQUUsWUFBWTs7Q0FFMUIsQ0FBQyxjQUFjLEVBQUUsSUFBSTs7Q0FFckIsQ0FBQyxvQkFBb0IsSUFBSSxZQUFZOztDQUVyQyxFQUFFLElBQUksS0FBSyxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7Q0FDNUIsRUFBRSxJQUFJLEdBQUcsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDOztDQUUxQixFQUFFLE9BQU8sU0FBUyxvQkFBb0IsR0FBRzs7Q0FFekMsR0FBRyxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDOztDQUVoQyxHQUFHLEtBQUssUUFBUSxDQUFDLGdCQUFnQixHQUFHOztDQUVwQzs7Q0FFQSxJQUFJLEtBQUssUUFBUSxDQUFDLEtBQUssS0FBSyxJQUFJLEdBQUc7O0NBRW5DLEtBQUssSUFBSSxpQkFBaUIsR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQztDQUMxRCxLQUFLLElBQUksYUFBYSxHQUFHLEVBQUUsQ0FBQzs7Q0FFNUIsS0FBSyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsaUJBQWlCLENBQUMsS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRzs7Q0FFbkUsTUFBTSxLQUFLLENBQUMsbUJBQW1CLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDeEQsTUFBTSxHQUFHLENBQUMsbUJBQW1CLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDOztDQUUxRCxNQUFNLGFBQWEsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLGFBQWEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Q0FDcEUsTUFBTSxhQUFhLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLGFBQWEsRUFBRSxDQUFDLEVBQUUsR0FBRyxLQUFLLENBQUMsVUFBVSxFQUFFLEdBQUcsRUFBRSxDQUFDOztDQUU1RSxNQUFNOztDQUVOLEtBQUssUUFBUSxDQUFDLFlBQVksRUFBRSxjQUFjLEVBQUUsSUFBSSxzQkFBc0IsRUFBRSxhQUFhLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQzs7Q0FFN0YsS0FBSyxNQUFNOztDQUVYLEtBQUssT0FBTyxDQUFDLElBQUksRUFBRSx1R0FBdUcsRUFBRSxDQUFDOztDQUU3SCxLQUFLOztDQUVMLElBQUksTUFBTSxLQUFLLFFBQVEsQ0FBQyxVQUFVLEdBQUc7O0NBRXJDLElBQUksSUFBSSxRQUFRLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQztDQUNyQyxJQUFJLElBQUksYUFBYSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUM7O0NBRS9DLElBQUksTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHOztDQUUxRCxLQUFLLEtBQUssQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Q0FDakMsS0FBSyxHQUFHLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQzs7Q0FFbkMsS0FBSyxhQUFhLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxhQUFhLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO0NBQ25FLEtBQUssYUFBYSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxhQUFhLEVBQUUsQ0FBQyxFQUFFLEdBQUcsS0FBSyxDQUFDLFVBQVUsRUFBRSxHQUFHLEVBQUUsQ0FBQzs7Q0FFM0UsS0FBSzs7Q0FFTCxJQUFJOztDQUVKLEdBQUcsT0FBTyxJQUFJLENBQUM7O0NBRWYsR0FBRyxDQUFDOztDQUVKLEVBQUUsRUFBRSxFQUFFOztDQUVOLENBQUMsRUFBRSxDQUFDOztDQUVKO0NBQ0E7Q0FDQTs7Q0FFQSxTQUFTLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxHQUFHOztDQUV4QyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsQ0FBQzs7Q0FFdkMsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLFVBQVUsQ0FBQzs7Q0FFeEIsQ0FBQzs7Q0FFRCxRQUFRLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUU7O0NBRXJFLENBQUMsV0FBVyxFQUFFLFFBQVE7O0NBRXRCLENBQUMsVUFBVSxFQUFFLElBQUk7O0NBRWpCLENBQUMsRUFBRSxDQUFDOztDQUVKO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBOztDQUVBLFNBQVMsY0FBYyxFQUFFLFVBQVUsR0FBRzs7Q0FFdEMsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDOztDQUV2QixDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsZ0JBQWdCLENBQUM7O0NBRTlCLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLEtBQUssRUFBRSxRQUFRLEVBQUUsQ0FBQzs7Q0FFcEMsQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQzs7Q0FFakIsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztDQUNmLENBQUMsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7O0NBRTdCLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7O0NBRXJCLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxVQUFVLEVBQUUsQ0FBQzs7Q0FFOUIsQ0FBQzs7Q0FFRCxjQUFjLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDO0NBQy9ELGNBQWMsQ0FBQyxTQUFTLENBQUMsV0FBVyxHQUFHLGNBQWMsQ0FBQzs7Q0FFdEQsY0FBYyxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7O0NBRWpELGNBQWMsQ0FBQyxTQUFTLENBQUMsSUFBSSxHQUFHLFdBQVcsTUFBTSxHQUFHOztDQUVwRCxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7O0NBRTlDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDOztDQUVqQyxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQzs7Q0FFdkIsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7Q0FDekIsQ0FBQyxJQUFJLENBQUMsZUFBZSxHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUM7O0NBRS9DLENBQUMsT0FBTyxJQUFJLENBQUM7O0NBRWIsQ0FBQyxDQUFDOztDQUVGO0NBQ0E7Q0FDQTs7Q0FFQSxTQUFTLE1BQU0sRUFBRSxRQUFRLEVBQUUsUUFBUSxHQUFHOztDQUV0QyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7O0NBRXZCLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxRQUFRLENBQUM7O0NBRXRCLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLEtBQUssU0FBUyxHQUFHLFFBQVEsR0FBRyxJQUFJLGNBQWMsRUFBRSxDQUFDO0NBQzFFLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLEtBQUssU0FBUyxHQUFHLFFBQVEsR0FBRyxJQUFJLGNBQWMsRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsUUFBUSxFQUFFLEVBQUUsQ0FBQzs7Q0FFL0csQ0FBQzs7Q0FFRCxNQUFNLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsU0FBUyxFQUFFLEVBQUU7O0NBRXZFLENBQUMsV0FBVyxFQUFFLE1BQU07O0NBRXBCLENBQUMsUUFBUSxFQUFFLElBQUk7O0NBRWYsQ0FBQyxPQUFPLElBQUksWUFBWTs7Q0FFeEIsRUFBRSxJQUFJLGFBQWEsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO0NBQ3BDLEVBQUUsSUFBSSxHQUFHLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztDQUN0QixFQUFFLElBQUksTUFBTSxHQUFHLElBQUksTUFBTSxFQUFFLENBQUM7O0NBRTVCLEVBQUUsT0FBTyxTQUFTLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxHQUFHOztDQUVuRCxHQUFHLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQztDQUNyQixHQUFHLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7Q0FDaEMsR0FBRyxJQUFJLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO0NBQ3RDLEdBQUcsSUFBSSxTQUFTLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDOztDQUVyRDs7Q0FFQSxHQUFHLEtBQUssUUFBUSxDQUFDLGNBQWMsS0FBSyxJQUFJLEdBQUcsUUFBUSxDQUFDLHFCQUFxQixFQUFFLENBQUM7O0NBRTVFLEdBQUcsTUFBTSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsY0FBYyxFQUFFLENBQUM7Q0FDMUMsR0FBRyxNQUFNLENBQUMsWUFBWSxFQUFFLFdBQVcsRUFBRSxDQUFDO0NBQ3RDLEdBQUcsTUFBTSxDQUFDLE1BQU0sSUFBSSxTQUFTLENBQUM7O0NBRTlCLEdBQUcsS0FBSyxTQUFTLENBQUMsR0FBRyxDQUFDLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxLQUFLLEtBQUssR0FBRyxPQUFPOztDQUVwRTs7Q0FFQSxHQUFHLGFBQWEsQ0FBQyxVQUFVLEVBQUUsV0FBVyxFQUFFLENBQUM7Q0FDM0MsR0FBRyxHQUFHLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxZQUFZLEVBQUUsYUFBYSxFQUFFLENBQUM7O0NBRTNELEdBQUcsSUFBSSxjQUFjLEdBQUcsU0FBUyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7Q0FDM0YsR0FBRyxJQUFJLGdCQUFnQixHQUFHLGNBQWMsR0FBRyxjQUFjLENBQUM7Q0FDMUQsR0FBRyxJQUFJLFFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO0NBQ2hDLEdBQUcsSUFBSSxjQUFjLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQzs7Q0FFdEMsR0FBRyxTQUFTLFNBQVMsRUFBRSxLQUFLLEVBQUUsS0FBSyxHQUFHOztDQUV0QyxJQUFJLElBQUksa0JBQWtCLEdBQUcsR0FBRyxDQUFDLGlCQUFpQixFQUFFLEtBQUssRUFBRSxDQUFDOztDQUU1RCxJQUFJLEtBQUssa0JBQWtCLEdBQUcsZ0JBQWdCLEdBQUc7O0NBRWpELEtBQUssR0FBRyxDQUFDLG1CQUFtQixFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUUsQ0FBQztDQUN0RCxLQUFLLGNBQWMsQ0FBQyxZQUFZLEVBQUUsV0FBVyxFQUFFLENBQUM7O0NBRWhELEtBQUssSUFBSSxRQUFRLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLGNBQWMsRUFBRSxDQUFDOztDQUV0RSxLQUFLLEtBQUssUUFBUSxHQUFHLFNBQVMsQ0FBQyxJQUFJLElBQUksUUFBUSxHQUFHLFNBQVMsQ0FBQyxHQUFHLEdBQUcsT0FBTzs7Q0FFekUsS0FBSyxVQUFVLENBQUMsSUFBSSxFQUFFOztDQUV0QixNQUFNLFFBQVEsRUFBRSxRQUFRO0NBQ3hCLE1BQU0sYUFBYSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsa0JBQWtCLEVBQUU7Q0FDcEQsTUFBTSxLQUFLLEVBQUUsY0FBYyxDQUFDLEtBQUssRUFBRTtDQUNuQyxNQUFNLEtBQUssRUFBRSxLQUFLO0NBQ2xCLE1BQU0sSUFBSSxFQUFFLElBQUk7Q0FDaEIsTUFBTSxNQUFNLEVBQUUsTUFBTTs7Q0FFcEIsTUFBTSxFQUFFLENBQUM7O0NBRVQsS0FBSzs7Q0FFTCxJQUFJOztDQUVKLEdBQUcsS0FBSyxRQUFRLENBQUMsZ0JBQWdCLEdBQUc7O0NBRXBDLElBQUksSUFBSSxLQUFLLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQztDQUMvQixJQUFJLElBQUksVUFBVSxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUM7Q0FDekMsSUFBSSxJQUFJLFNBQVMsR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQzs7Q0FFOUMsSUFBSSxLQUFLLEtBQUssS0FBSyxJQUFJLEdBQUc7O0NBRTFCLEtBQUssSUFBSSxPQUFPLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQzs7Q0FFL0IsS0FBSyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUUxRCxNQUFNLElBQUksQ0FBQyxHQUFHLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFM0IsTUFBTSxRQUFRLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7O0NBRTdDLE1BQU0sU0FBUyxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFL0IsTUFBTTs7Q0FFTixLQUFLLE1BQU07O0NBRVgsS0FBSyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRzs7Q0FFOUQsTUFBTSxRQUFRLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7O0NBRTdDLE1BQU0sU0FBUyxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFL0IsTUFBTTs7Q0FFTixLQUFLOztDQUVMLElBQUksTUFBTTs7Q0FFVixJQUFJLElBQUksUUFBUSxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUM7O0NBRXJDLElBQUksTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRzs7Q0FFeEQsS0FBSyxTQUFTLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUVuQyxLQUFLOztDQUVMLElBQUk7O0NBRUosR0FBRyxDQUFDOztDQUVKLEVBQUUsRUFBRSxFQUFFOztDQUVOLENBQUMsS0FBSyxFQUFFLFlBQVk7O0NBRXBCLEVBQUUsT0FBTyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDOztDQUUzRSxFQUFFOztDQUVGLENBQUMsRUFBRSxDQUFDOztDQUVKO0NBQ0E7Q0FDQTs7Q0FFQSxTQUFTLEtBQUssR0FBRzs7Q0FFakIsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDOztDQUV2QixDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDOztDQUVyQixDQUFDOztDQUVELEtBQUssQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxTQUFTLEVBQUUsRUFBRTs7Q0FFdEUsQ0FBQyxXQUFXLEVBQUUsS0FBSzs7Q0FFbkIsQ0FBQyxPQUFPLEVBQUUsSUFBSTs7Q0FFZCxDQUFDLEVBQUUsQ0FBQzs7Q0FFSjtDQUNBO0NBQ0E7O0NBRUEsU0FBUyxZQUFZLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxVQUFVLEdBQUc7O0NBRXRHLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsQ0FBQzs7Q0FFcEcsQ0FBQyxJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQzs7Q0FFOUIsQ0FBQzs7Q0FFRCxZQUFZLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsU0FBUyxFQUFFLEVBQUU7O0NBRTVFLENBQUMsV0FBVyxFQUFFLFlBQVk7O0NBRTFCLENBQUMsY0FBYyxFQUFFLElBQUk7O0NBRXJCLENBQUMsTUFBTSxFQUFFLFlBQVk7O0NBRXJCLEVBQUUsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQzs7Q0FFekIsRUFBRSxLQUFLLEtBQUssQ0FBQyxVQUFVLElBQUksS0FBSyxDQUFDLGlCQUFpQixHQUFHOztDQUVyRCxHQUFHLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDOztDQUUzQixHQUFHOztDQUVILEVBQUU7O0NBRUYsQ0FBQyxFQUFFLENBQUM7O0NBRUo7Q0FDQTtDQUNBOztDQUVBLFNBQVMsaUJBQWlCLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxRQUFRLEdBQUc7O0NBRXRJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLENBQUM7O0NBRTdHLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDO0NBQy9DLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7O0NBRXhCO0NBQ0E7O0NBRUEsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQzs7Q0FFcEI7Q0FDQTs7Q0FFQSxDQUFDLElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDOztDQUU5QixDQUFDOztDQUVELGlCQUFpQixDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQztDQUNqRSxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsV0FBVyxHQUFHLGlCQUFpQixDQUFDOztDQUU1RCxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDOztDQUV2RDtDQUNBO0NBQ0E7Q0FDQTs7Q0FFQSxTQUFTLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLEdBQUc7O0NBRTlHLENBQUMsTUFBTSxHQUFHLE1BQU0sS0FBSyxTQUFTLEdBQUcsTUFBTSxHQUFHLFdBQVcsQ0FBQzs7Q0FFdEQsQ0FBQyxLQUFLLE1BQU0sS0FBSyxXQUFXLElBQUksTUFBTSxLQUFLLGtCQUFrQixHQUFHOztDQUVoRSxFQUFFLE1BQU0sSUFBSSxLQUFLLEVBQUUsa0ZBQWtGLEVBQUUsQ0FBQzs7Q0FFeEcsRUFBRTs7Q0FFRixDQUFDLEtBQUssSUFBSSxLQUFLLFNBQVMsSUFBSSxNQUFNLEtBQUssV0FBVyxHQUFHLElBQUksR0FBRyxpQkFBaUIsQ0FBQztDQUM5RSxDQUFDLEtBQUssSUFBSSxLQUFLLFNBQVMsSUFBSSxNQUFNLEtBQUssa0JBQWtCLEdBQUcsSUFBSSxHQUFHLGtCQUFrQixDQUFDOztDQUV0RixDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLENBQUM7O0NBRW5HLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDOztDQUUvQyxDQUFDLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxLQUFLLFNBQVMsR0FBRyxTQUFTLEdBQUcsYUFBYSxDQUFDO0NBQ3RFLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLEtBQUssU0FBUyxHQUFHLFNBQVMsR0FBRyxhQUFhLENBQUM7O0NBRXRFLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7Q0FDcEIsQ0FBQyxJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQzs7Q0FFOUIsQ0FBQzs7Q0FFRCxZQUFZLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLFNBQVMsRUFBRSxDQUFDO0NBQzVELFlBQVksQ0FBQyxTQUFTLENBQUMsV0FBVyxHQUFHLFlBQVksQ0FBQztDQUNsRCxZQUFZLENBQUMsU0FBUyxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7O0NBRTdDO0NBQ0E7Q0FDQTtDQUNBOztDQUVBLFNBQVMsaUJBQWlCLEVBQUUsUUFBUSxHQUFHOztDQUV2QyxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7O0NBRTdCLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxtQkFBbUIsQ0FBQzs7Q0FFakM7O0NBRUEsQ0FBQyxJQUFJLFFBQVEsR0FBRyxFQUFFLENBQUM7O0NBRW5COztDQUVBLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO0NBQ3BCLENBQUMsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsS0FBSyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQztDQUNsRCxDQUFDLElBQUksR0FBRyxFQUFFLElBQUksR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7Q0FDbkMsQ0FBQyxJQUFJLE1BQU0sQ0FBQzs7Q0FFWjs7Q0FFQSxDQUFDLEtBQUssUUFBUSxJQUFJLFFBQVEsQ0FBQyxVQUFVLEdBQUc7O0NBRXhDOztDQUVBLEVBQUUsSUFBSSxLQUFLLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQzs7Q0FFN0IsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRzs7Q0FFL0MsR0FBRyxJQUFJLElBQUksR0FBRyxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRXpCLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0NBRTlCLElBQUksS0FBSyxHQUFHLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztDQUM5QixJQUFJLEtBQUssR0FBRyxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDO0NBQzFDLElBQUksSUFBSSxFQUFFLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDO0NBQ3pDLElBQUksSUFBSSxFQUFFLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDOztDQUV6QyxJQUFJLEdBQUcsR0FBRyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFdEMsSUFBSSxLQUFLLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxTQUFTLEdBQUc7O0NBRXRDLEtBQUssS0FBSyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7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LEdBQUcsSUFBSSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRXhDLE1BQU0sS0FBSyxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssU0FBUyxHQUFHOztDQUV4QyxPQUFPLEtBQUssRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDOztDQUUvRCxPQUFPOztDQUVQLE1BQU07O0NBRU4sS0FBSzs7Q0FFTCxJQUFJOztDQUVKOztDQUVBLEdBQUcsTUFBTSxHQUFHLElBQUksS0FBSyxHQUFHOztDQUV4QixJQUFJLENBQUMsR0FBRyxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUM7O0NBRXJCLElBQUksTUFBTSxDQUFDLG1CQUFtQixFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7Q0FDckQsSUFBSSxRQUFRLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUM7O0NBRWxELElBQUksTUFBTSxDQUFDLG1CQUFtQixFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7Q0FDckQsSUFBSSxRQUFRLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUM7O0NBRWxELElBQUk7O0NBRUosR0FBRyxNQUFNOztDQUVUOztDQUVBLEdBQUcsUUFBUSxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDOztDQUUzQyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEtBQUssUUFBUSxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFH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Q0FFZCxDQUFDLElBQUksR0FBRyxHQUFHLE9BQU8sQ0FBQzs7Q0FFbkIsQ0FBQyxJQUFJLE1BQU0sR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDOztDQUU1QixDQUFDLElBQUksRUFBRSxHQUFHLElBQUksT0FBTyxFQUFFLEVBQUUsRUFBRSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7Q0FDNUMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxJQUFJLE9BQU8sRUFBRSxFQUFFLEVBQUUsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDOztDQUU1QyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQzs7Q0FFVjs7Q0FFQSxDQUFDLElBQUksVUFBVSxHQUFHLE1BQU0sR0FBRyxDQUFDLENBQUM7O0NBRTdCLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxNQUFNLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0NBRWxDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQzs7Q0FFckIsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLE1BQU0sRUFBRSxDQUFDLEdBQUcsR0FBRzs7Q0FFbkMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDOztDQUV0Qjs7Q0FFQSxHQUFHLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDO0NBQ3BCLEdBQUcsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDOztDQUVyQzs7Q0FFQTs7Q0FFQSxHQUFHLEtBQUssQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUc7O0NBRXZCLElBQUksSUFBSSxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDO0NBQzNCLElBQUksRUFBRSxDQUFDLFVBQVUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENB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QUFFLENBQUM7Q0FDaEYsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxZQUFZLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUM7Q0FDaEYsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxZQUFZLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUM7O0NBRWhGLEdBQUcsR0FBRyxDQUFDLEdBQUcsRUFBRSxRQUFRLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLFFBQVEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQztDQUNuRCxHQUFHLEdBQUcsQ0FBQyxHQUFHLEVBQUUsUUFBUSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUM7Q0FDbkQsR0FBRyxHQUFHLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsUUFBUSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDOztDQUVuRCxHQUFHLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRTFELEdBQUcsSUFBSSxHQUFHLEdBQUcsT0FBTyxFQUFFLFFBQVEsRUFBRSxDQUFDOztDQUVqQyxHQUFHLFNBQVMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7Q0FDbkMsR0FBRyxTQUFTLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FB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Q0FBQyxJQUFJLFFBQVEsR0FBRztDQUNoQixFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQy9DLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Q0FDL0MsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNoRCxFQUFFLENBQUM7O0NBRUgsQ0FBQyxJQUFJLE9BQU8sR0FBRztDQUNmLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFO0NBQ3RELEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQ25ELEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFB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RSxDQUFDLEVBQUUsQ0FBQzs7Q0FFckI7Q0FDQSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUN4QixHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUVyQjtDQUNBLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO0NBQ3hCLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDcEIsRUFBRSxDQUFDOztDQUVILENBQUMsSUFBSSxPQUFPLEdBQUc7Q0FDZixFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRTtDQUNqQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtDQUNqQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQztDQUNsQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtDQUNoQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRTtDQUNqQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMs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R0FBRyxDQUFDLEdBQUc7O0NBRTNDO0NBQ0E7O0NBRUEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsY0FBYyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0NBQzVDLEdBQUcsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNuQyxHQUFHLElBQUksRUFBRSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUVqQztDQUNBOztDQUVBLEdBQUcsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Q0FDN0MsR0FBRyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztDQUM3QyxHQUFHLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDOztDQUU3QyxHQUFHLFFBQVEsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7Q0FFakQ7O0NBRUEsR0FBRyxNQUFNLENBQUMsVUFBVSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQzs7Q0FFL0MsR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUM7O0NBRWhEOztDQUVBLEdBQUcsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLEdBQUcsZUFBZSxFQUFFLENBQUM7Q0FDbkMsR0FBRyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxjQUFjLEVBQUUsQ0FBQzs7Q0FFbEMsR0FBRzs7Q0FFSCxFQUFFOztDQUVGOztDQUVBLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxlQUFlLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0NBRTNDLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxjQUFjLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0NBRTNDOztDQUVBLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxjQUFjLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Q0FDMUQsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLGNBQWMsR0FBRyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztDQUNsRCxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsY0FBYyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0NBQzFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxjQUFjLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7O0NBRWxEOztDQUVBLEdBQUcsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQzNCLEdBQUcsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUUzQixHQUFHOztDQUVILEVBQUU7O0NBRUY7O0NBRUEsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxDQUFDO0NBQzFCLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxVQUFVLEVBQUUsSUFBSSxzQkFBc0IsRUFBRSxRQUFR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LEdBQUcsQ0FBQyxHQUFHLGVBQWUsR0FBRyxHQUFHLENBQUM7Q0FDckMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsY0FBYyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDOztDQUU1Qzs7Q0FFQSxHQUFHLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxNQUFNLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNoRSxHQUFHLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxNQUFNLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNoRSxHQUFHLE1BQU0sQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRW5DLEdBQUcsUUFBUSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDOztDQUVqRDs7Q0FFQSxHQUFHLE1BQU0sQ0FBQyxDQUFDLEdBQUcsTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDckMsR0FBRyxNQUFNLENBQUMsQ0FBQyxHQUFHLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQ3JDLEdBQUcsTUFBTSxDQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUM7O0NBRW5ELEdBQUcsT0FBTyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDOztDQUVoRDs7Q0FFQSxHQUFHLEdBQUcsQ0FBQyxJ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LENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFO0NBQzNFLEVBQUUsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUU7Q0FDM0UsRUFBRSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDOztDQUU1RTs7Q0FFQSxDQUFDLElBQUksSUFBSSxHQUFHLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFO0NBQ3ZELEVBQUUsSUFBSSxHQUFHLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUM7O0NBRXJEOztDQUVBLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQzs7Q0FFbkIsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksR0FBRzs7Q0FFNUIsRUFBRSxLQUFLLENBQUMsS0FBSyxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsSUFBSTtDQUN2QyxJQUFJLGVBQWUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUU7Q0FDN0QsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsR0FBRyxPQUFPLEtBQUssQ0FBQztDQUNsRCxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDOztDQUVkLEVBQUU7O0NBRUY7O0NBRUEsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQzs7Q0FFZixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxHQUFHOztDQUU1QixFQUFFLEtBQUssQ0FBQyxLQUFLLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxJQUFJO0NBQ3ZDLElBQUksZUFBZSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRTtDQUM3RCxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxHQUFHLE9BQU8sS0FBSyxDQUFDOztDQUVsRCxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDOztDQUVkLEVBQUU7O0NBRUYsQ0FBQyxPQUFPLElBQUksQ0FBQzs7Q0FFYixDQUFDOztDQUVEOztDQUVBLFNBQVMsc0JBQXNCLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxH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SUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO0NBQzNDLE1BQU0sZUFBZSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHOztDQUUxRixHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7Q0FFN0MsR0FBRyxLQUFLLEVBQUUsR0FBRyxHQUFHLE1BQU0sTUFBTSxHQUFHLEtBQUssTUFBTSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLGFBQWEsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEdBQUc7O0NBRTFGLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztDQUNWLElBQUksTUFBTSxHQUFHLEdBQUcsQ0FBQzs7Q0FFakIsSUFBSTs7Q0FFSixHQUFHOztDQUVILEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7O0NBRWIsRUFBRTs7Q0FFRixDQUFDLE9BQU8sQ0FBQyxDQUFDOztDQUVWLENBQUM7O0NBRUQ7O0NBRUEsU0FBUyxVQUFVLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxHQUFHOztDQUVsRCxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQzs7Q0FFZixDQUFDLEdBQUc7O0NBRUosRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUs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LElBQUksRUFBRSxPQUFPLEdBQUc7O0NBRTdDOztDQUVBLENBQUMsQ0FBQyxHQUFHLEtBQUssS0FBSyxDQUFDLEdBQUcsSUFBSSxFQUFFLEdBQUcsT0FBTyxDQUFDO0NBQ3BDLENBQUMsQ0FBQyxHQUFHLEtBQUssS0FBSyxDQUFDLEdBQUcsSUFBSSxFQUFFLEdBQUcsT0FBTyxDQUFDOztDQUVwQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssVUFBVSxDQUFDO0NBQ3JDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxVQUFVLENBQUM7Q0FDckMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLFVBQVUsQ0FBQztDQUNyQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssVUFBVSxDQUFDOztDQUVyQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssVUFBVSxDQUFDO0NBQ3JDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxVQUFVLENBQUM7Q0FDckMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLFVBQVUsQ0FBQztDQUNyQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssVUFBVSxDQUFDOztDQUVyQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQzs7Q0FFdkIsQ0FBQzs7Q0FFRDs7Q0FFQSxTQUFTLFdBQVcsRUFBRSxLQUFLLEdBQUc7O0NBRTlCLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxFQUFFLFFBQVEsR0FBRyxLQUFLLENBQUM7O0NBRWpDLENBQUMsR0FBRzs7Q0FFSixFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQyxHQUFHLFFBQVEsR0FBRyxDQUFDLENBQUM7Q0FDdkMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQzs7Q0FFYixFQUFFLFNBQVMsQ0FBQyxLQUFLLEtBQUssR0FBRzs7Q0FFekIsQ0FBQyxPQUFPLFFBQVEsQ0FBQzs7Q0FFakIsQ0FBQzs7Q0FFRDs7Q0FFQSxTQUFTLGVBQWUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHOztDQUUzRCxDQUFDLE9BQU8sRUFBRSxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsRUFBRSxJQUFJLENBQUM7Q0FDbEUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxFQUFFLElBQUksQ0FBQztDQUM1RCxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7O0NBRTdELENBQUM7O0NBRUQ7O0NBRUEsU0FBUyxlQUFlLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRzs7Q0FFakMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLGlCQUFpQixFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7Q0FDM0UsRUFBRSxhQUFhLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLGFBQWEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksWUFBWSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFekUsQ0FBQzs7Q0FFRDs7Q0FFQSxTQUFTLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRzs7Q0FFekIsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDOztDQUV0RSxDQUFDOztDQUVEOztDQUVBLFNBQVMsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUc7O0NBRTFCLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDOztDQUV2QyxDQUFDOztDQUVEOztDQUVBLFNBQVMsVUFBVSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRzs7Q0FFdEMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxNQUFNLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtDQUM1QyxLQUFLLE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLE9BQU8sSUFBSSxDQUFDOztDQUUxRCxDQUFDLE9BQU8sSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxLQUFLLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUM7Q0FDekQsS0FBSyxJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLEtBQUssSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDOztDQUV2RCxDQUFDOztDQUVEOztDQUVBLFNBQVMsaUJBQWlCLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRzs7Q0FFbkMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7O0NBRVgsQ0FBQyxHQUFHOztDQUVKLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7Q0FDekUsTUFBTSxVQUFVLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHOztDQUV0QyxHQUFHLE9BQU8sSUFBSSxDQUFDOztDQUVmLEdBQUc7O0NBRUgsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQzs7Q0FFYixFQUFFLFNBQVMsQ0FBQyxLQUFLLENBQUMsR0FBRzs7Q0FFckIsQ0FBQyxPQUFPLEtBQUssQ0FBQzs7Q0FFZCxDQUFDOztDQUVEOztDQUVBLFNBQVMsYUFBYSxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUc7O0NBRS9CLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUM7Q0FDckMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDO0NBQ3hELEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDOztDQUV2RCxDQUFDOztDQUVEOztDQUVBLFNBQVMsWUFBWSxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUc7O0NBRTlCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztDQUNWLEVBQUUsTUFBTSxHQUFHLEtBQUs7Q0FDaEIsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztDQUN4QixFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7O0NBRXpCLENBQUMsR0FBRzs7Q0FFSixFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0NBQ2pFLFFBQVEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUc7O0NBRTlFLEdBQUcsTUFBTSxHQUFHLEVBQUUsTUFBTSxDQUFDOztDQUVyQixHQUFHOztDQUVILEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7O0NBRWIsRUFBRSxTQUFTLENBQUMsS0FBSyxDQUFDLEdBQUc7O0NBRXJCLENBQUMsT0FBTyxNQUFNLENBQUM7O0NBRWYsQ0FBQzs7Q0FFRDtDQUNBOztDQUVBLFNBQVMsWUFBWSxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUc7O0NBRTlCLENBQUMsSUFBSSxFQUFFLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUU7Q0FDbkMsRUFBRSxFQUFFLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUU7Q0FDaEMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLElBQUk7Q0FDYixFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDOztDQUVkLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7Q0FDWixDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDOztDQUVaLENBQUMsRUFBRSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUM7Q0FDZCxDQUFDLEVBQUUsQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDOztDQUVkLENBQUMsRUFBRSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUM7Q0FDZCxDQUFDLEVBQUUsQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDOztDQUVkLENBQUMsRUFBRSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUM7Q0FDZCxDQUFDLEVBQUUsQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDOztDQUVkLENBQUMsT0FBTyxFQUFFLENBQUM7O0NBRVgsQ0FBQzs7Q0FFRDs7Q0FFQSxTQUFTLFVBQVUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLEdBQUc7O0NBRXJDLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFN0IsQ0FBQyxLQUFLLEVB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RSxDQUFDOztDQUVsQjs7Q0FFQSxFQUFFLGNBQWMsRUFBRSxDQUFDOzs7Q0FHbkI7O0NBRUEsRUFBRSxTQUFTLGFBQWEsR0FBRzs7Q0FFM0IsR0FBRyxJQUFJLEtBQUssR0FBRyxhQUFhLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQzs7Q0FFeEMsR0FBRyxLQUFLLFlBQVksR0FBRzs7Q0FFdkIsSUFBSSxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7Q0FDbEIsSUFBSSxJQUFJLE1BQU0sR0FBRyxJQUFJLEdBQUcsS0FBSyxDQUFDOztDQUU5Qjs7Q0FFQSxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUVsQyxLQUFLLElBQUksR0FBRyxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDdkIsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxHQUFHLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEdBQUcsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsR0FBRyxNQUFNLEVBQUUsQ0FBQzs7Q0FFdEUsS0FBSzs7Q0FFTCxJQUFJLEtBQUssR0FBRyxLQUFLLEdBQUcsYUFBYSxHQUFHLENBQUMsQ0FBQztDQUN0QyxJQUFJLE1BQU0sR0FBRyxJQUFJLEdBQUcsS0FBSyxDQUFDOztDQUUxQjs7Q0FFQSxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUVsQyxLQUFLLElBQUksR0FBRyxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDdkIsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxHQUFHLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEdBQUcsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsR0FBRyxNQUFNLEVBQUUsQ0FBQzs7Q0FFdEUsS0FBSzs7Q0FFTCxJQUFJLE1BQU07O0NBRVY7O0NBRUEsSUFB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QUM7Q0FDckIsR0FBRyxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Q0FDckIsR0FBRyxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7O0NBRXJCLEdBQUc7O0NBRUgsRUFBRSxTQUFTLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUc7O0NBRTVCLEdBQUcsU0FBUyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQ2xCLEdBQUcsU0FBUyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQ2xCLEdBQUcsU0FBUyxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUVsQixHQUFHLFNBQVMsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNsQixHQUFHLFNBQVMsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNsQixHQUFHLFNBQVMsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7O0NBR2xCLEdBQUcsSUFBSSxTQUFTLEdBQUcsYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7Q0FDNUMsR0FBRyxJQUFJLEdBQUcsR0FBRyxLQUFLLENBQUMsa0JBQWtCLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxTQUFTLEdBQUcsQ0FBQyxFQUFFLFNBQVMsR0FBRyxDQUFDLEVBQUUsU0FBUyxHQUFHLENBQUMsRUFBRSxTQUFTLEdBQUcsQ0FBQyxFQUFFLENBQUM7O0NBRTFILEdBQUcsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO0NBQ3JCLEdBQUcsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO0NBQ3JCLEdBQUcsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDOztDQUVyQixHQUFHLEtBQUssRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztDQUNyQixHQUFHLEtBQUssRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztDQUNyQixHQUFHLEtBQUssRUFBRSxHQUFHLEVBQUUs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QUksR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7O0NBRTVCLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsTUFBTSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUVsRDs7Q0FFQSxHQUFHLE1BQU0sQ0FBQyxDQUFDLEdBQUcsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7Q0FDbEMsR0FBRyxNQUFNLENBQUMsQ0FBQyxHQUFHLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Q0FDNUIsR0FBRyxNQUFNLENBQUMsQ0FBQyxHQUFHLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDOztDQUVsQyxHQUFHLFFBQVEsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7Q0FFakQ7O0NBRUEsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUM7Q0FDdkIsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDOztDQUVwQyxHQUFHLEdBQUcsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7OztDQUcxQixHQUFHOztDQUVILEVBQUU7O0NBRUY7O0NBRUEsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsRUFBRSxDQUFDLEdBQUcsR0FBRzs7Q0FFbkMsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxLQUFLLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0NBRWpELEdBQUcsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQzs7Q0FFaEMsR0FBRyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUM7Q0FDaEIsR0FBRyxJQUFJLENBQUMsR0FBRyxJQUFJLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztDQUNoQyxHQUFHLElBQUksQ0FBQyxHQUFHLElBQUksR0FBRyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztDQUNwQyxHQUFHLElBQUksQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUM7O0NBRXBCOztDQUVBLEdBQUcsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQzNCLEdBQUcsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUUzQixHQUFHOztDQUVILEVBQUU7O0NBRUY7O0NBRUEsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxDQUFDO0NBQzFCLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxVQUFVLEVBQUUsSUFBSSxzQkFBc0IsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztDQUM1RSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsSUFBSSxFQUFFLElBQUksc0JBQXNCLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7O0NBRWpFOztDQUVBLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7O0NBRTdCO0NBQ0E7O0NBRUEsQ0FBQyxLQUFLLFNBQVMsS0FBSyxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRzs7Q0FFbEMsRUFBRSxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7Q0FDN0MsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO0NBQ3pCLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztDQUN6QixFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7O0NBRXhCOztDQUVBLEVBQUUsSUFBSSxHQUFHLFFBQVEsR0FBRyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQzs7Q0FFdEMsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHOztDQUV4RDs7Q0FFQSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztDQUMzQixHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztDQUMzQixHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQzs7Q0FFM0I7O0NBRUEsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLE9BQU8sRUFBRSxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO0NBQ2xDLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxPQUFPLEVBQUUsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztDQUNsQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsT0FBTyxFQUFFLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7O0NBRWxDOztDQUVBLEdBQUcsQ0FBQyxDQUFDLFVBQVUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUM7O0NBRXRDOztDQUVBLEdBQUcsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxPQUFPLEVBQUUsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0NBQ3BELEdBQUcsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxPQUFPLEVBQUUsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0NBQ3BELEdBQUcsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxPQUFPLEVBQUUsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDOztDQUVwRCxHQUFHOztDQUVILEVBQUU7O0NBRUYsQ0FBQzs7Q0FFRCxtQkFBbUIsQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxjQUFjLENBQUMsU0FBUyxFQUFFLENBQUM7Q0FDMUUsbUJBQW1CLENBQUMsU0FBUyxDQUFDLFdBQVcsR0FBRyxtQkFBbUIsQ0FBQzs7Q0FFaEU7Q0FDQTtDQUNBO0NBQ0E7O0NBRUE7O0NBRUEsU0FBUyxhQUFhLEVBQUUsTUFBTSxFQUFFLGFBQWEsR0FBRzs7Q0FFaEQsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDOztDQUV2QixDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsZUFBZSxDQUFDOztDQUU3QixDQUFDLEtBQUssT0FBTyxhQUFhLEtBQUssUUFBUSxHQUFHOztDQUUxQyxFQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsMERBQTBELEVBQUUsQ0FBQzs7Q0FFN0UsRUFBRSxhQUFhLEdBQUcsYUFBYSxDQUFDLGFBQWEsQ0FBQzs7Q0FFOUMsRUFBRTs7Q0FFRixDQUFDLElBQUksQ0FBQyxVQUFVLEdBQUc7Q0FDbkIsRUFBRSxNQUFNLEVBQUUsTUFBTTtDQUNoQixFQUFFLGFBQWEsRUFBRSxhQUFhO0NBQzlCLEVBQUUsQ0FBQzs7Q0FFSCxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLG1CQUFtQixFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsRUFBRSxDQUFDO0NBQzdFLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDOztDQUV0QixDQUFDOztDQUVELGFBQWEsQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUM7Q0FDOUQsYUFBYSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEdBQUcsYUFBYSxDQUFDOztDQUVwRCxhQUFhLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxZQUFZOztDQUU3QyxDQUFDLElBQUksSUFBSSxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQzs7Q0FFbkQsQ0FBQyxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQzs7Q0FFckMsQ0FBQyxPQUFPLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUM7O0NBRS9CLENBQUMsQ0FBQzs7Q0FFRjs7Q0FFQSxTQUFTLG1CQUFtQixFQUFFLE1BQU0sRUFBRSxhQUFhLEdBQUc7O0NBRXRELENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQzs7Q0FFN0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLHFCQUFxQixDQUFDOztDQUVuQyxDQUFDLElBQUksQ0FBQyxVQUFVLEdBQUc7Q0FDbkIsRUFBRSxNQUFNLEVBQUUsTUFBTTtDQUNoQixFQUFFLGFBQWEsRUFBRSxhQUFhO0NBQzlCLEVBQUUsQ0FBQzs7Q0FFSCxDQUFDLGFBQWEsR0FBRyxhQUFhLElBQUksRUFBRSxDQUFDOztDQUVyQzs7Q0FFQSxDQUFDLElBQUksT0FBTyxHQUFHLEVBQUUsQ0FBQztDQUNsQixDQUFDLElBQUksUUFBUSxHQUFHLEVBQUUsQ0FBQztDQUNuQixDQUFDLElBQUksT0FBTyxHQUFHLEVBQUUsQ0FBQztDQUNsQixDQUFDLElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQzs7Q0FFZDs7Q0FFQSxDQUFDLElBQUksVUFBVSxHQUFHLENBQUMsQ0FBQztDQUNwQixDQUFDLElBQUksVUFBVSxHQUFHLENBQUMsQ0FBQzs7Q0FFcEI7O0NBRUEsQ0FBQyxLQUFLLEtBQUssQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEtBQUssS0FBSyxHQUFHOztDQUUxQyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsQ0FBQzs7Q0FFckIsRUFBRSxNQUFNOztDQUVSLEVBQUUsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0NBRTdDLEdBQUcsUUFBUSxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDOztDQUUzQixHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFOUMsR0FBRyxVQUFVLElBQUksVUFBVSxDQUFDO0NBQzVCLEdBQUcsVUFBVSxHQUFHLENBQUMsQ0FBQzs7Q0FFbEIsR0FBRzs7Q0FFSCxFQUFFOztDQUVGOztDQUVBLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsQ0FBQztDQUMxQixDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsVUFBVSxFQUFFLElBQUksc0JBQXNCLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Q0FDNUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLFFBQVEsRUFBRSxJQUFJLHNCQUFzQixFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO0NBQ3pFLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLEVBQUUsSUFBSSxzQkFBc0IsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQzs7O0NBR2pFOztDQUVBLENBQUMsU0FBUyxRQUFRLEVBQUUsS0FBSyxHQUFHOztDQUU1QixFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxTQUFTLENBQUM7O0NBRXRCLEVBQUUsSUFBSSxXQUFXLEdBQUcsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7Q0FDeEMsRUFBRSxJQUFJLE1BQU0sR0FBRyxLQUFLLENBQUMsYUFBYSxFQUFFLGFBQWEsRUFBRSxDQUFDOztDQUVwRCxFQUFFLElBQUksYUFBYSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUM7Q0FDbkMsRUFBRSxJQUFJLFVBQVUsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDOztDQUVoQzs7Q0FFQSxFQUFFLEtBQUssVUFBVSxDQUFDLFdBQVcsRUFBRSxhQUFhLEVBQUUsS0FBSyxLQUFLLEdBQUc7O0NBRTNELEdBQUcsYUFBYSxHQUFHLGFBQWEsQ0FBQyxPQUFPLEVBQUUsQ0FBQzs7Q0FFM0M7O0NBRUEsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRzs7Q0FFckQsSUFBSSxTQUFTLEdBQUcsVUFBVSxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUVoQyxJQUFJLEtBQUssVUFBVSxDQUFDLFdBQVcsRUFBRSxTQUFTLEVBQUUsS0FBSyxJQUFJLEdBQUc7O0NBRXhELEtBQUssVUFBVSxFQUFFLENBQUMsRUFBRSxHQUFHLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQzs7Q0FFM0MsS0FBSzs7Q0FFTCxJQUFJOztDQUVKLEdBQUc7O0NBRUgsRUFBRSxJQUFJLEtBQUssR0FBRyxVQUFVLENBQUMsZ0JBQWdCLEVBQUUsYUFBYSxFQUFFLFVBQVUsRUFBRSxDQUFDOztDQUV2RTs7Q0FFQSxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUVwRCxHQUFHLFNBQVMsR0FBRyxVQUFVLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDL0IsR0FBRyxhQUFhLEdBQUcsYUFBYSxDQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsQ0FBQzs7Q0FFckQsR0FBRzs7Q0FFSDs7Q0FFQSxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsYUFBYSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUV2RCxHQUFHLElBQUksTUFBTSxHQUFHLGFBQWEsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFbkMsR0FBRyxRQUFRLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUMxQyxHQUFHLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUMzQixHQUFHLEdBQUcsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUM7O0NBRWxDLEdBQUc7O0NBRUg7O0NBRUEsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRzs7Q0FFL0MsR0FBRyxJQUFJLElBQUksR0FBRyxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRXpCLEdBQUcsSUFBSSxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsRUFBRSxHQUFHLFdBQVcsQ0FBQztDQUNuQyxHQUFHLElBQUksQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLEVBQUUsR0FBRyxXQUFXLENBQUM7Q0FDbkMsR0FBRyxJQUFJLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEdBQUcsV0FBVyxDQUFDOztDQUVuQyxHQUFHLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUMzQixHQUFHLFVBQVUsSUFBSSxDQUFDLENBQUM7O0NBRW5CLEdBQUc7O0NBRUgsRUFBRTs7Q0FFRixDQUFDOztDQUVELG1CQUFtQixDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLGNBQWMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztDQUMxRSxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsV0FBVyxHQUFHLG1CQUFtQixDQUFDOztDQUVoRSxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLFlBQVk7O0NBRW5ELENBQUMsSUFBSSxJQUFJLEdBQUcsY0FBYyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDOztDQUV6RCxDQUFDLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDOztDQUVyQyxDQUFDLE9BQU8sTUFBTSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQzs7Q0FFL0IsQ0FBQyxDQUFDOztDQUVGOztDQUVBLFNBQVMsTUFBTSxFQUFFLE1BQU0sRUFBRSxJQUFJLEdBQUc7O0NBRWhDLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7O0NBRWxCLENBQUMsS0FBSyxLQUFLLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxHQUFHOztDQUVoQyxFQUFFLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0NBRXBELEdBQUcsSUFBSSxLQUFLLEdBQUcsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUUzQixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQzs7Q0FFbEMsR0FBRzs7Q0FFSCxFQUFFLE1BQU07O0NBRVIsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7O0NBRWxDLEVBQUU7O0NBRUYsQ0FBQyxPQUFPLElBQUksQ0FBQzs7Q0FFYixDQUFDOztDQUVEO0NBQ0E7Q0FDQTtDQUNBOztDQUVBLFNBQVMsYUFBYSxFQUFFLFFBQVEsRUFBRSxjQUFjLEdBQUc7O0NBRW5ELENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQzs7Q0FFN0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLGVBQWUsQ0FBQzs7Q0FFN0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxHQUFHO0NBQ25CLEVBQUUsY0FBYyxFQUFFLGNBQWM7Q0FDaEMsRUFBRSxDQUFDOztDQUVILENBQUMsY0FBYyxHQUFHLEVBQUUsY0FBYyxLQUFLLFNBQVMsS0FBSyxjQUFjLEdBQUcsQ0FBQyxDQUFDOztDQUV4RTs7Q0FFQSxDQUFDLElBQUksUUFBUSxHQUFHLEVBQUUsQ0FBQzs7Q0FFbkI7O0NBRUEsQ0FBQyxJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxPQUFPLEdBQUcsY0FBYyxFQUFFLENBQUM7Q0FDL0QsQ0FBQyxJQUFJLElBQUksR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxLQUFLLEdBQUcsRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUM7Q0FDL0MsQ0FBQyxJQUFJLEdBQUcsRUFBRSxJQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDOztDQUVuQzs7Q0FFQSxDQUFDLElBQUksU0FBUyxDQUFDOztDQUVmLENBQUMsS0FBSyxRQUFRLENBQUMsZ0JBQWdCLEdBQUc7O0NBRWxDLEVBQUUsU0FBUyxHQUFHLElBQUksUUFBUSxFQUFFLENBQUM7Q0FDN0IsRUFBRSxTQUFTLENBQUMsa0JBQWtCLEVBQUUsUUFBUSxFQUFFLENBQUM7O0NBRTNDLEVBQUUsTUFBTTs7Q0FFUixFQUFFLFNBQVMsR0FBRyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7O0NBRS9CLEVBQUU7O0NBRUYsQ0FBQyxTQUFTLENBQUMsYUFBYSxFQUFFLENBQUM7Q0FDM0IsQ0FBQyxTQUFTLENBQUMsa0JBQWtCLEVBQUUsQ0FBQzs7Q0FFaEMsQ0FBQyxJQUFJLGNBQWMsR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDO0NBQ3pDLENBQUMsSUFBSSxLQUFLLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQzs7Q0FFN0I7O0NBRUEsQ0FBQyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUVsRCxFQUFFLElBQUksSUFBSSxHQUFHLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFeEIsRUFBRSxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUVqQyxHQUFHLEtBQUssR0FBRyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Q0FDN0IsR0FBRyxLQUFLLEdBQUcsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQztDQUN6QyxHQUFHLElBQUksRUFBRSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQztDQUN4QyxHQUFHLElBQUksRUFBRSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQzs7Q0FFeEMsR0FBRyxHQUFHLEdBQUcsSUFBSSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRXJDLEdBQUcsS0FBSyxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssU0FBUyxHQUFHOztDQUVyQyxJQUFJLEtBQUssRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsQ0FBQzs7Q0FFeEYsSUFBSSxNQUFNOztDQUVWLElBQUksS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7O0NBRTNCLElB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QU8sRUFBRSxDQUFDOztDQUU3QixFQUFFLElBQUksVUFBVSxHQUFHLENBQUMsQ0FBQzs7Q0FFckI7Q0FDQSxFQUFFLElBQUksS0FBSyxHQUFHLEVBQUUsWUFBWSxHQUFHLFNBQVMsS0FBSyxNQUFNLENBQUM7O0NBRXBEOztDQUVBLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxjQUFjLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0NBRTNDLEdBQUcsSUFBSSxRQUFRLEdBQUcsRUFBRSxDQUFDOztDQUVyQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxjQUFjLENBQUM7O0NBRTlCOztDQUVBLEdBQUcsSUFBSSxNQUFNLEdBQUcsQ0FBQyxLQUFLLFlBQVksR0FBRyxTQUFTLEVBQUUsR0FBRyxTQUFTLENBQUM7O0NBRTdELEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxjQUFjLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0NBRTVDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLGNBQWMsQ0FBQzs7Q0FFL0IsSUFBSSxJQUFJLEtBQUssR0FBRyxDQUFDLEdBQUcsV0FBVyxHQUFHLFVBQVUsQ0FBQzs7Q0FFN0MsSUFBSSxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDO0NBQ3JDLElBQUksSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQzs7Q0FFckM7O0NBRUEsSUFBSSxNQUFNLENBQUMsQ0FBQyxHQUFHLE1BQU0sR0FBRyxRQUFRLENBQUM7Q0FDakMsSUFBSSxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLE1BQU0sR0FBRyxVQUFVLENBQUM7Q0FDekMsSUFBSSxNQUFNLENBQUMsQ0FBQyxHQUFHLE1BQU0sR0FBRyxRQUFRLENBQUM7Q0FDakMsSUFBSSxRQUFRLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFB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TyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQzs7Q0FFakQsSUFBSSxLQUFLLFFBQVEsQ0FBQyxTQUFTLEdBQUc7O0NBRTlCLEtBQUssSUFBSSxLQUFLLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQzs7Q0FFaEUsS0FBSyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUV4QyxNQUFNLE1BQU0sRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsQ0FBQzs7Q0FFcEMsTUFBTSxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDLEdBQUcsR0FBRzs7Q0FFeEQsT0FBTyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsV0FBVyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUM7Q0FDcEYsT0FBTyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7Q0FDNUMsT0FBTyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUM7Q0FDMUMsT0FBTyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7O0NBRTVDLE9BQU87O0NBRVAsTUFBTTs7Q0FFTixLQUFLLE1BQU07O0NBRVgsS0FBSyxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDO0NBQzFDLEtBQUssT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztDQUM1QyxLQUFLLE9BQU8sQ0FBQyxPQUFPLEdBQUcsUUFBUSxD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OztDQUVBO0NBQ0E7Q0FDQTtDQUNBOztDQUVBLFNBQVMsU0FBUyxHQUFHOztDQUVyQixDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQzs7Q0FFcEM7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBLENBQUMsU0FBUyxJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHOztDQUVqQyxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUM7Q0FDVixFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUM7Q0FDVixFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztDQUN2QyxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQzs7Q0FFakMsRUFBRTs7Q0FFRixDQUFDLE9BQU87O0NBRVIsRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsT0FBTyxHQUFHOztDQUV2RCxHQUFHLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLE9BQU8sS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsT0FBTyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDOztDQUVoRSxHQUFHOztDQUVILEVBQUUsd0JBQXdCLEVBQUUsV0FBVyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUc7O0NBRXZFO0NBQ0EsR0FBRyxJQUFJLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLEtBQUssR0FBRyxHQUFHLEVBQUUsRUFBRSxHQUFHLEVB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USxJQUFJLFFBQVEsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7O0NBRXBGLEVBQUUsTUFBTSxLQUFLLE1BQU0sS0FBSyxDQUFDLElBQUksUUFBUSxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUc7O0NBRWxELEVBQUUsUUFBUSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7Q0FDbkIsRUFBRSxNQUFNLEdBQUcsQ0FBQyxDQUFDOztDQUViLEVBQUU7O0NBRUYsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQzs7Q0FFcEIsQ0FBQyxLQUFLLElBQUksQ0FBQyxNQUFNLElBQUksUUFBUSxHQUFHLENBQUMsR0FBRzs7Q0FFcEMsRUFBRSxFQUFFLEdBQUcsTUFBTSxFQUFFLEVBQUUsUUFBUSxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQzs7Q0FFdEMsRUFBRSxNQUFNOztDQUVSO0NBQ0EsRUFBRSxHQUFHLENBQUMsVUFBVSxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Q0FDaEUsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDOztDQUVYLEVBQUU7O0NBRUYsQ0FBQyxFQUFFLEdBQUcsTUFBTSxFQUFFLFFBQVEsR0FBRyxDQUFDLEVBQUUsQ0FBQztDQUM3QixDQUFDLEVBQUUsR0FBRyxNQUFNLEVBQUUsRUFBRSxRQUFRLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDOztDQUVyQyxDQUFDLEtBQUssSUFBSSxDQUFDLE1BQU0sSUFBSSxRQUFRLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRzs7Q0FFeEMsRUFBRSxFQUFFLEdBQUcsTUFBTSxFQUFFLEVBQUUsUUFBUSxH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QUksT0FBTyxFQUFFLENBQUM7O0NBRTdDLENBQUMsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQzs7Q0FFNUQsQ0FBQyxLQUFLLENBQUMsR0FBRztDQUNWLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFO0NBQzFDLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFO0NBQzFDLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFO0NBQzFDLEVBQUUsQ0FBQzs7Q0FFSCxDQUFDLE9BQU8sS0FBSyxDQUFDOztDQUVkLENBQUMsQ0FBQzs7Q0FFRixpQkFBaUIsQ0FBQyxTQUFTLENBQUMsSUFBSSxHQUFHLFdBQVcsTUFBTSxHQUFHOztDQUV2RCxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7O0NBRTNDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLEVBQUUsRUFBRSxDQUFDO0NBQzNCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLEVBQUUsRUFBRSxDQUFDO0NBQzNCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLEVBQUUsRUFBRSxDQUFD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O0NBQzFCLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7O0NBRW5DLENBQUMsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNoQyxDQUFDLElBQUksTUFBTSxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUM7O0NBRTNCLENBQUMsSUFBSSxFQUFFLEdBQUcsTUFBTSxFQUFFLFFBQVEsS0FBSyxDQUFDLEdBQUcsUUFBUSxHQUFHLFFBQVEsR0FBRyxDQUFDLEVBQUUsQ0FBQztDQUM3RCxDQUFDLElBQUksRUFBRSxHQUFHLE1BQU0sRUFBRSxRQUFRLEVBQUUsQ0FBQztDQUM3QixDQUFDLElBQUksRUFBRSxHQUFHLE1BQU0sRUFBRSxRQUFRLEdBQUcsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEdBQUcsUUFBUSxHQUFHLENBQUMsRUFBRSxDQUFDO0NBQ3BGLENBQUMsSUFBSSxFQUFFLEdBQUcsTUFBTSxFQUFFLFFBQVEsR0FBRyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRyxRQUFRLEdBQUcsQ0FBQyxFQUFFLENBQUM7O0NBRXBGLENBQUMsS0FBSyxDQUFDLEdBQUc7Q0FDVixFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRTtDQUM5QyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRTtDQUM5QyxFQUFFLENBQUM7O0NBRUgsQ0FBQyxPQUFPLEtBQUssQ0FBQzs7Q0FFZCxDQUFDLENBQUM7O0NBRUYsV0FBVyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEdBQUcsV0FBVyxNQUFNLEdBQUc7O0NBRWpELENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQzs7Q0FFM0MsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQzs7Q0FFbEIsQ0FBQyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRzs7Q0FFMUQsRUFBRSxJQUFJLEtBQUssR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUVqQyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDOztDQUVwQyxFQUFFOztDQUVGLENBQUMsT0FBTyxJQUFJLENBQUM7O0NBRWIsQ0FBQyxDQUFDOztDQUVGLFdBQVcsQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLFlBQVk7O0NBRTNDLENBQUMsSUFBSSxJQUFJLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDOztDQUVoRCxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDOztDQUVsQixDQUFDLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUV4RCxFQUFFLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDL0IsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQzs7Q0FFdEMsRUFBRTs7Q0FFRixD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LEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQzs7Q0FFcEMsRUFBRSxPQUFPLElBQUksQ0FBQzs7Q0FFZCxFQUFFOztDQUVGLENBQUMsTUFBTSxFQUFFLFdBQVcsSUFBSSxHQUFHOztDQUUzQixFQUFFLElBQUksSUFBSSxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7O0NBRTFELEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztDQUMxQyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7O0NBRXpDLEVBQUUsS0FBSyxJQUFJLENBQUMsV0FBVyxLQUFLLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDOztDQUU1RixFQUFFLEtBQUssSUFBSSxDQUFDLFFBQVEsS0FBSyxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztDQUMxRSxFQUFFLEtBQUssSUFBSSxDQUFDLEtBQUssS0FBSyxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztDQUNqRSxFQUFFLEtBQUssSUFBSSxDQUFDLEtBQUssS0FBSyxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztDQUNqRSxFQUFFLEtBQUssSUFBSSxDQUFDLFFBQVEsS0FBSyxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQzs7Q0FFMUUsRUFBRSxLQUFLLElBQUksQ0FBQyxNQUFNLEtBQUssU0FBUyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxH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QyxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQzs7Q0FFdEMsRUFBRSxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7O0NBRXRDLEVBQUUsT0FBTyxJQUFJLENBQUM7O0NBRWQsRUFBRTs7Q0FFRixDQUFDLEVBQUUsQ0FBQzs7Q0FFSjtDQUNBO0NBQ0E7O0NBRUEsU0FBUyxZQUFZLEVBQUUsS0FBSyxFQUFFLFNBQVMsR0FBRzs7Q0FFMUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLENBQUM7O0NBRXRDLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxjQUFjLENBQUM7O0NBRTVCLENBQUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUM7O0NBRTdCLENBQUM7O0NBRUQsWUFBWSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLFNBQVMsRUFBRSxFQUFFOztDQUUxRSxDQUFDLFdBQVcsRUFBRSxZQUFZOztDQUUxQixDQUFDLGNBQWMsRUFBRSxJQUFJOztDQUVyQixDQUFDLEVBQUUsQ0FBQzs7Q0FFSjtDQUNBO0NBQ0E7O0NBRUEsU0FBUyxhQUFhLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxHQUFHOztDQUUxRCxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsQ0FBQzs7Q0FFdEMsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLGVBQWUsQ0FBQzs7Q0FFN0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsS0FBSyxLQUFLLFNBQVMsS0FBSyxLQUFLLEdBQUcsRUFBRSxDQUFDO0NBQ25ELENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLE1BQU0sS0FBSyxTQUFTLEtBQUssTUFBTSxHQUFHLEVBQUUsQ0FBQzs7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LEVBQUUsQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxFQUFFO0NBQy9CLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDO0NBQ2IsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQzs7Q0FFaEI7O0NBRUEsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztDQUM3QyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsS0FBSyxHQUFHLEdBQUcsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0NBQy9FLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLEtBQUssR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztDQUM1RCxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQzs7Q0FFOUI7O0NBRUEsRUFBRSxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEtBQUssTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFHOztDQUV4QyxHQUFHLE1BQU0sRUFBRSxDQUFDLEVBQUU7Q0FDZCxLQUFLLEVBQUUsR0FBRyxNQUFNLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBRTtDQUMxQixLQUFLLEVBQUUsR0FBRyxNQUFNLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBRTtDQUMxQixLQUFLLEVBQUUsR0FBRyxNQUFNLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBRTtDQUMxQixLQUFLLEVBQUUsR0FBRyxNQUFNLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFD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LEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztDQUNuRixFQUFFLEtBQUssSUFBSSxDQUFDLEdBQUcsS0FBSyxTQUFTLEdBQUcsUUFBUSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDO0NBQ3hELEVBQUUsS0FBSyxJQUFJLENBQUMsV0FBVyxLQUFLLFNBQVMsR0FBRyxRQUFRLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7Q0FDaEYsRUFBRSxLQUFLLElBQUksQ0FBQyxRQUFRLEtBQUssU0FBUyxHQUFHLFFBQVEsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztDQUN2RSxFQUFFLEtBQUssSUFBSSxDQUFDLElBQUksS0FBSyxTQUFTLEdBQUcsUUFBUSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO0NBQzNELEVBQUUsS0FBSyxJQUFJLENBQUMsT0FBTyxLQUFLLFNBQVMsR0FBRyxRQUFRLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7Q0FDcEUsRUFBRSxLQUFLLElBQUksQ0FBQyxXQUFXLEtBQUssU0FBUyxHQUFHLFFBQVEsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztDQUNoRixFQUFFLEtBQUssSUFBSSxDQUFDLFNBQVMsS0FBSyxTQUFTLEdBQUcsUUFBUSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO0NBQzFFLEVBQUUsS0FBSyxJQUFJLENBQUMsU0FBUyxLQUFLLFNBQVMsR0FBRyxRQUFRLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7Q0FDMUUsRUFBRSxLQUFLLElBQUksQ0FBQyxVQUFVLEtBQUssU0FBUyxHQUFHLFFBQVEsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztDQUM3RSxFQUFFLEtBQUssSUFBSSxDQUFDLFVBQVUsS0FBSyxTQUFTLEdBQUcsUUFBUSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO0NBQzdFLEVBQUUsS0FB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QUMsT0FBTyxFQUFFLENBQUM7Q0FDL0MsRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxXQUFXLElBQUksR0FBRzs7Q0FFdEMsR0FBRyxNQUFNLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQzs7Q0FFL0MsR0FBRyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsQ0FBQzs7Q0FFM0IsRUFBRTs7Q0FFRixDQUFDLEtBQUssRUFBRSxXQUFXLElBQUksR0FBRzs7Q0FFMUIsRUFBRSxJQUFJLFFBQVEsR0FBRyxJQUFJLGNBQWMsRUFBRSxDQUFDOztDQUV0QyxFQUFFLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDOztDQUU5QixFQUFFLEtBQUssS0FBSyxLQUFLLFNBQVMsR0FBRzs7Q0FFN0IsR0FBRyxJQUFJLFVBQVUsR0FBRyxJQUFJLFlBQVksRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO0NBQ2xFLEdBQUcsUUFBUSxDQUFDLFFBQVEsRUFBRSxJQUFJLGVBQWUsRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQzs7Q0FFN0QsR0FBRzs7Q0FFSCxFQUFFLElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDOztDQUV4QyxFQUFFLE1BQU0sSUFBSSxHQUFHLElBQUksVUFBVSxHQUFHOztDQUVoQyxHQUFHLElBQUksU0FBUyxHQUFHLFVBQVUsRUFBRSxHQUFHLEVBQUUsQ0FBQztDQUNyQyxHQUFHLElBQUksVUFBVSxHQUFHLElBQUksWUFBWSxFQUFFLFNBQVMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUM7O0NBRTFFLEdBQUcsUUFBUSxDQUFDLFlBQVksRUFBRSxHQUFHLEVBQUUsSUFBSSxlQUFlLEVBQUUsVUFBVSxFQUFFLFNBQVMsQ0FBQyxRQUFRLEVBQUUs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QUMsV0FBVyxHQUFHOztDQUUzQixJQUFJLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxtQkFBbUIsR0FBRzs7Q0FFcEYsS0FBSyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQ25DLEtBQUssSUFBSSxDQUFDLEdBQUcsRUFBRSxtQkFBbUIsR0FBRyxDQUFDLEtBQUssSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0NBQ3pFLEtBQUssSUFBSSxDQUFDLEdBQUcsRUFBRSxtQkFBbUIsR0FBRyxDQUFDLEtBQUssSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0NBQ3pFLEtBQUssSUFBSSxDQUFDLEdBQUcsRUFBRSxtQkFBbUIsR0FBRyxDQUFDLEtBQUssSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDOztDQUV6RSxLQUFLLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLElBQUksT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7O0NBRTVELEtBQUs7O0NBRUwsSUFBSTs7Q0FFSixHQUFHLFFBQVEsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQzs7Q0FFL0IsR0FBRyxLQUFLLFFBQVEsQ0FBQyxLQUFLLElBQUksUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxNQUFNLFFBQVEsQ0FBQyxXQUFXLENBQUMsTUFBTSxLQUFLLFFBQVEsQ0FBQyxXQUFXLENBQUMsTUFBTSxJQUFJLFFBQVEsQ0FBQyxXQUFXLENBQUMsTUFBTSxLQUFLLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFF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QUFFLENBQUM7Q0FDNUIsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLElBQUksT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztDQUMzQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsUUFBUSxFQUFFLENBQUM7O0NBRXRCLENBQUMsSUFBSSxRQUFRLEdBQUcsSUFBSSxpQkFBaUIsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQztDQUNoRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUM5QixDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxPQUFPLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Q0FDN0MsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxDQUFDOztDQUV0QixDQUFDLElBQUksUUFBUSxHQUFHLElBQUksaUJBQWlCLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUM7Q0FDaEUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDOUIsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLElBQUksT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztDQUMzQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsUUFBUSxFQUFFLENBQUM7O0NBRXRCLENBQUMsSUFBSSxRQUFRLEdBQUcsSUFBSSxpQkFBaUIsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQztDQUNoRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMs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QyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7Q0FDOUUsSUFBSSxRQUFRLENBQUMsU0FBUyxDQUFDLGNBQWMsRUFBRSxRQUFRLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7Q0FDOUUsSUFBSSxRQUFRLENBQUMsU0FBUyxDQUFDLGNBQWMsRUFBRSxRQUFRLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7Q0FDOUUsSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLGNBQWMsRUFBRSxXQUFXLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7Q0FDaEYsSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLGNBQWMsRUFBRSxXQUFXLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7Q0FDaEYsSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLGNBQWMsRUFBRSxXQUFXLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7Q0FDaEYsSUFBSSxRQUFRLENBQUMsR0FBRyxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7Q0FDbEUsSUFBSSxRQUFRLENBQUMsR0FBRyxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7Q0FDbEUsSUFBSSxRQUFRLENBQUMsR0FBRyxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7O0NBRWxFLElBQUksTUFBTTs7Q0FFVixJQUFJLFFBQVEsQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxFQUFFLFFB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QUFlLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQzs7Q0FFMUQsRUFBRSxJQUFJLFdBQVcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQzs7Q0FFNUMsRUFBRSxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUM7O0NBRW5EOztDQUVBLEVBQUUsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUM7O0NBRXpDLEVBQUUsS0FBSyxXQUFXLElBQUksV0FBVyxDQUFDLFVBQVUsR0FBRzs7Q0FFL0MsR0FBRyxJQUFJLFFBQVEsR0FBRyxXQUFXLENBQUMsUUFBUSxDQUFDOztDQUV2QyxHQUFHLElBQUksS0FBSyxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUM7O0NBRWpDLEdBQUcsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDOztDQUVmLEdBQUcsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRzs7Q0FFcEQsSUFBSSxJQUFJLElBQUksR0FBRyxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRTFCLElBQUksTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0NBRXBFLEtBQUssSUFBSSxNQUFNLEdBQUcsUUFBUSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDOztDQUVoRCxLQUFLLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRTFDLEtBQUssRUFBRSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQyxZQUFZLEVBQUUsV0FBVyxFQUFFLENBQUM7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SyxDQUFDLGlCQUFpQixFQUFFLENBQUM7O0NBRWhDLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsV0FBVyxDQUFDO0NBQ2pDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQzs7Q0FFL0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQzs7Q0FFcEIsQ0FBQyxJQUFJLFFBQVEsR0FBRyxJQUFJLGNBQWMsRUFBRSxDQUFDOztDQUVyQyxDQUFDLElBQUksU0FBUyxHQUFHO0NBQ2pCLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQ25CLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQ25CLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDcEIsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDbkIsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNyQixFQUFFLENBQUM7O0NBRUgsQ0FBQyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRzs7Q0FFckQsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7Q0FDbkMsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7O0NBRW5DLEVBQUUsU0FB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LEtBQUssRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7Q0FDcEQsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7Q0FDbEQsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztDQUNwRCxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7Q0FDeEQsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQzs7Q0FFdkQsQ0FBQyxRQUFRLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQzs7Q0FFN0IsQ0FBQyxLQUFLLElBQUksQ0FBQyxLQUFLLEtBQUssU0FBUyxHQUFHOztDQUVqQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDOztDQUU3QyxFQUFFLE1BQU07O0NBRVIsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7O0NBRXBELEVBQUU7O0NBRUYsQ0FBQyxDQUFDOztDQUVGO0NBQ0E7Q0FDQTtDQUNBO0NB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RSxDQUFDO0NBQ2hFLENBQUMsTUFBTSxHQUFHLElBQUksS0FBSyxFQUFFLE1BQU0sS0FBSyxTQUFTLEdBQUcsTUFBTSxHQUFHLFFBQVEsRUFBRSxDQUFDOztDQUVoRSxDQUFDLElBQUksTUFBTSxHQUFHLFNBQVMsR0FBRyxDQUFDLENBQUM7Q0FDNUIsQ0FBQyxJQUFJLElBQUksR0FBRyxJQUFJLEdBQUcsU0FBUyxDQUFDO0NBQzdCLENBQUMsSUFBSSxRQUFRLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQzs7Q0FFekIsQ0FBQyxJQUFJLFFBQVEsR0FBRyxFQUFFLEVBQUUsTUFBTSxHQUFHLEVBQUUsQ0FBQzs7Q0FFaEMsQ0FBQyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxDQUFDLElBQUksU0FBUyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxJQUFJLEdBQUc7O0NBRTNFLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDcEQsRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQzs7Q0FFcEQsRUFBRSxJQUFJLEtBQUssR0FBRyxDQUFDLEtBQUssTUFBTSxHQUFHLE1BQU0sR0FBRyxNQUFNLENBQUM7O0NBRTdDLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0NBQ3JDLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0NBQ3JDLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0NBQ3JDLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDOztDQUVyQyxFQUFFOztDQUVGLENBQUMsSUFBSSxRQUFRLEdBQUcsSUFBSSxjQUFjLEVBQUUsQ0FBQztDQUNyQyxDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsVUFBVSxFQUFFLElBQUksc0JBQXNCLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Q0FDaEYsQ0FBQyxRQUFRLENBQUMsWUFBWSxFQUFFLE9BQU8sRUFBRSxJQUFJLHNCQUFzQixFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDOztDQUUzRSxDQUFDLElBQUksUUFBUSxHQUFHLElBQUksaUJBQWlCLEVBQUUsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLEVBQUUsQ0FBQzs7Q0FFeEUsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLENBQUM7O0NBRS9DLENBQUM7O0NBRUQsVUFBVSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLFlBQVksQ0FBQyxTQUFTLEVBQUUsQ0FBQztDQUMvRCxVQUFVLENBQUMsU0FBUyxDQUFDLFdBQVcsR0FBRyxVQUFVLENBQUM7O0NBRTlDO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7O0NBRUEsU0FBUyxlQUFlLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLEdBQUc7O0NBRWhGLENBQUMsTUFBTSxHQUFHLE1BQU0sSUFBSSxFQUFFLENBQUM7Q0FDdkIsQ0FBQyxPQUFPLEdBQUcsT0FBTyxJQUFJLEVBQUUsQ0FBQztDQUN6QixDQUFDLE9BQU8sR0FBRyxPQUFPLElBQUksQ0FBQyxDQUFDO0NBQ3hCLENBQUMsU0FBUyxHQUFHLFNBQVMsSUFBSSxFQUFFLENBQUM7Q0FDN0IsQ0FBQyxNQUFNLEdBQUcsSUFBSSxLQUFLLEVBQUUsTUFBTSxLQUFLLFNBQVMsR0FBRyxNQUFNLEdBQUcsUUFBUSxFQUFFLENBQUM7Q0FDaEUsQ0FBQyxNQUFNLEdBQUcsSUFBSSxLQUFLLEVBQUUsTUFBTSxLQUFLLFNBQVMsR0FBRyxNQUFNLEdBQUcsUUFBUSxFQUFFLENBQUM7O0NBRWhFLENBQUMsSUFBSSxRQUFRLEdBQUcsRUFBRSxDQUFDO0NBQ25CLENBQUMsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDOztDQUVqQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztDQUNWLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDOztDQUV2Qjs7Q0FFQSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksT0FBTyxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUVuQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxPQUFPLE9BQU8sSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQzs7Q0FFeEMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxNQUFNLENBQUM7Q0FDN0IsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxNQUFNLENBQUM7O0NBRTdCLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQzNCLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUUzQixFQUFFLEtBQUssR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssTUFBTSxHQUFHLE1BQU0sQ0FBQzs7Q0FFdEMsRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7Q0FDM0MsRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7O0NBRTNDLEVBQUU7O0NBRUY7O0NBRUEsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLE9BQU8sRUFBRSxDQUFDLEdBQUcsR0FBRzs7Q0FFbkMsRUFBRSxLQUFLLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLE1BQU0sR0FBRyxNQUFNLENBQUM7O0NBRXRDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sS0FBSyxNQUFNLEdBQUcsT0FBTyxHQUFHLENBQUMsRUFBRSxDQUFDOztDQUV4QyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUVyQzs7Q0FFQSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxTQUFTLE9BQU8sSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQzs7Q0FFM0MsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7Q0FDekIsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7O0NBRXpCLEdBQUcsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQzVCLEdBQUcsTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDOztDQUU1Qzs7Q0FFQSxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxTQUFTLE9BQU8sSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLEVB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LEVBQUUsQ0FBQztDQUNyQyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDO0NBQ3JDLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7O0NBRXJDOztDQUVBLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7Q0FDckMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQztDQUNyQyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDO0NBQ3JDLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7O0NBRXJDOztDQUVBLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7Q0FDckMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQztDQUNyQyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDO0NBQ3JDLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7O0NBRXJDOztDQUVBLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUM7Q0FDakMsQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQztDQUNqQyxDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDO0NBQ2pDLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUM7O0NBRWpDOztDQUVBLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUM7Q0FDaEMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQztDQUNoQyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxDQUFDOztDQUVoQzs7Q0FFQSxDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxDQUFDO0NBQ2xDLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLENBQUM7O0NBRWpDOztDQUVBLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLENBQUM7Q0FDckMsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsQ0FBQzs7Q0FFckMsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsQ0FBQztDQUNyQyxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxDQUFDOztDQUVyQyxDQUFDLFNBQVMsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxHQUFHOztDQUVqQyxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUM7Q0FDdkIsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDOztDQUV2QixFQUFFOztDQUVGLENBQUMsU0FBUyxRQUFRLEVBQUUsRUFBRSxFQUFFLEtBQUssR0FBRzs7Q0FFaEMsRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDM0IsRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7O0NBRTNDLEVBQUUsS0FBSyxRQUFRLEVBQUUsRUFBRSxFQUFFLEtBQUssU0FBUyxHQUFHOztDQUV0QyxHQUFHLFFBQVEsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUM7O0NBRXZCLEdBQUc7O0NBRUgsRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7O0NBRXJELEVBQUU7O0NBRUYsQ0FBQyxRQUFRLENBQUMsWUFBWSxFQUFFLFVBQVUsRUFBRSxJQUFJLHNCQUFzQixFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO0NBQ2hGLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxPQUFPLEVBQUUsSUFBSSxzQkFBc0IsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQzs7Q0FFM0UsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLENBQUM7O0NBRS9DLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7Q0FDdEIsQ0FBQyxLQUFLLElBQUksQ0FBQyxNQUFNLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxzQkFBc0IsRUFBRSxDQUFDOztDQUVoRixDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQztDQUNsQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7O0NBRS9CLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7O0NBRTFCLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDOztDQUVmLENBQUM7O0NBRUQsWUFBWSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLFlBQVksQ0FBQyxTQUFTLEVBQUUsQ0FBQztDQUNqRSxZQUFZLENBQUMsU0FBUyxDQUFDLFdBQVcsR0FBRyxZQUFZLENBQUM7O0NBRWxELFlBQVksQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLFlBQVk7O0NBRTVDLENBQUMsSUFBSSxRQUFRLEVBQUUsUUFBUSxDQUFDOztDQUV4QixDQUFDLElBQUksTUFBTSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7Q0FDNUIsQ0FBQyxJQUFJLE1BQU0sR0FBRyxJQUFJLE1BQU0sRUFBRSxDQUFDOztDQUUzQixDQUFDLFNBQVMsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRzs7Q0FFckMsRUFBRSxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxDQUFDOztDQUU1QyxFQUFFLElBQUksTUFBTSxHQUFHLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQzs7Q0FFakMsRUFBRSxLQUFLLE1BQU0sS0FBSyxTQUFTLEdBQUc7O0NBRTlCLEdBQUcsSUFBSSxRQUFRLEdBQUcsUUFBUSxDQUFDLFlBQVksRUFBRSxVQUFVLEVBQUUsQ0FBQzs7Q0FFdEQsR0FBRyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHOztDQUVyRCxJQUFJLFFBQVEsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUM7O0NBRWpFLElBQUk7O0NBRUosR0FBRzs7Q0FFSCxFQUFFOztDQUVGLENBQUMsT0FBTyxTQUFTLE1BQU0sR0FBRzs7Q0FFMUIsRUFBRSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztDQUMzQixFQUFFLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDOztDQUUzQixFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDOztDQUVuQjtDQUNBOztDQUVBLEVBQUUsTUFBTSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixFQUFFLENBQUM7O0NBRS9EOztDQUVBLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDN0IsRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRTNCOztDQUVBLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQ2xDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNoQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDaEMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFOUI7O0NBRUEsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQ2hDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDOUIsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUM5QixFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7Q0FFNUI7O0NBRUEsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQzFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQzVDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUVsQzs7Q0FFQSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQy9CLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQzdCLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDL0IsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0NBRTdCLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNqQyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQy9CLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztDQUNqQyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDOztDQUUvQixFQUFFLFFBQVEsQ0FBQyxZQUFZLEVBQUUsVUFBVSxFQUFFLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQzs7Q0FFekQsRUFBRSxDQUFDOztDQUVILENBQUMsRUFBRSxDQUFDOztDQUVKO0NBQ0E7Q0FDQTtDQUNBOztDQUVBLFNBQVMsU0FBUyxFQUFFLE1BQU0sRUFBRSxLQUFLLEdBQUc7O0NBRXBDLENBQUMsSUFBSSxDQUFDLE1B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LEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0NBQzdELEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0NBQzdELEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0NBQy9ELEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0NBQ2hFLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0NBQ2hFLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFF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